CAPL脚本中的系统变量和环境变量之间有什么区别?
环境变量必须用作节点的输入/输出,大多数它们属于指定的ECU。它们由以下系统参数定义:
您可以使用@直接访问环境变量:
@EnvLightState
但你不能只为int或float这样做。可以使用以下两个简单函数访问任何数据类型:
CAPL功能概述»常规»getValue
CAPL功能概述»常规»putValue
系统变量被CANoe组件广泛使用,其中许多是自动生成的,无法编辑。它们属于定义的命名空间。 sysvars的值仅在测量运行时可用,因此您不希望将它们用于例如UI的面板。
你可以通过使用“直接”访问sysvar
@Namespace1::ParameterArray[2];
@Namespace1::Parameter2;
但是,这种方式不可能访问整个数组或字符串(数据在帮助中没有提到,但可能是同样的事情)。您也无法使用@访问XML-Test模块中定义的任何sysvar,请在帮助中阅读:
从系统变量直接访问值
为系统变量(SysGet ...,SysSet ...,SysDefine ...,SysUndefine ......和其他一些)定义了CAPL函数,请查看帮助:
CAPL功能概述»系统变量CAPL功能
这里是一个来自XML测试函数Set的例子,在这里使用了两者,你可以在CANoe帮助中找到这个例子
<!-- Context of this test function is e.g. a testcase, other contexts are possible -->
<set title="Set">
<cansignal name="CrashDetected"> 0 </cansignal>
<linsignal name="MotorControl"> 0 </linsignal>
<flexraysignal name="BreakLight"> 0 </flexraysignal>
<envvar name="EnvAccelerate"> 0 </envvar>
<sysvar name="SysFrontLight_Right" namespace="Lights">0</sysvar>
</set>
<wait time="200" title="Swing in time for system" />
如果您知道/发现任何其他差异,请延长
根据我自己创建CANoe模拟的经验,“On EnvVar”回调存在限制,即如果将相同的值应用于环境变量,则其中的代码将不会执行,例如,
variables
{
mstimer tLoop;
int i;
}
on start
{
i = 0;
setTimerCyclic(tLoop, 1000);
}
on envVar Env_Number
{
write("Env_Number is %d", @this);
}
on sysvar_update Sys_Number
{
write("Sys_Number is %d", @this);
}
on timer tLoop
{
write("%d", ++i);
@Env_Number = 0x1;
@sysvar::Sys_Number = 0x2;
}
在此示例中,环境变量的值写入一次,因为这是变量值更改的唯一时间。
CAPL / .NET 1
CAPL / .NET Env_Number is 1
CAPL / .NET Sys_Number is 2
CAPL / .NET 2
CAPL / .NET Sys_Number is 2
CAPL / .NET 3
CAPL / .NET Sys_Number is 2
CAPL / .NET 4
CAPL / .NET Sys_Number is 2
CAPL / .NET 5
CAPL / .NET Sys_Number is 2
CAPL / .NET 6
CAPL / .NET Sys_Number is 2
CAPL / .NET 7
CAPL / .NET Sys_Number is 2
CAPL / .NET 8
CAPL / .NET Sys_Number is 2
CAPL / .NET 9
CAPL / .NET Sys_Number is 2
CAPL / .NET 10
CAPL / .NET Sys_Number is 2
使用'on sysvar_update'即使应用了相同的值,也会写入变量值。如果您需要与'on envvar'相同的行为但使用系统变量,则使用'on sysvar'代替。