CAPL脚本中的系统变量和环境变量之间的区别是什么?
答案 0 :(得分:5)
环境变量必须用作节点的输入/输出,大多数都属于指定的ECU。它们由以下系统参数定义:
您可以使用@:
直接访问环境变量@EnvLightState
但你不能只为int或float这样做。可以使用以下两个简单函数访问任何数据类型:
CAPL功能概述»常规»getValue
CAPL功能概述»常规»putValue
系统变量被CANoe组件广泛使用,其中许多是自动生成的,无法编辑。它们属于定义的命名空间。 sysvars的值仅在测量运行时可用,因此您不希望将它们用于例如UI-面板。
您可以使用
“直接”访问sysvar @Namespace1::ParameterArray[2];
@Namespace1::Parameter2;
然而,这种方式无法访问整个数组或字符串(数据未在帮助中提及,但可能是同样的事情)。您也无法使用@访问XML-Test模块中定义的任何sysvar,请在帮助中阅读:
从系统变量直接访问值
为系统变量定义了CAPL函数(SysGet ...,SysSet ...,SysDefine ...,SysUndefine ......以及其他一些),请查看帮助:
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" />
如果您知道/发现任何其他差异,请延长
答案 1 :(得分:0)
根据我自己创建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'代替。