CAPL脚本中的系统变量和环境变量有什么区别?
2 回答
环境变量必须用作节点的输入/输出,它们大多属于指定的 ECU。它们由以下系统参数定义:
- 指定 ECU 的访问权限(r、w、rw、无限制 => 每个 ECU 都可以访问)
- 数据类型:int (32bit), string (ascii), float, data + data length
- 单位/尺寸
- 初始值、最小值、最大值
- 可以定义值表(可能仅适用于 int 数据类型?)
您可以使用@直接访问环境变量:
@EnvLightState
但你不能只为 int 或 float 这样做。使用这两个简单的函数可以访问任何数据类型:
CAPL 函数概述 » 通用 » getValue
CAPL 函数概述 » 通用 » putValue
系统变量被 CANoe 组件广泛使用,其中许多是自动生成的,无法编辑。它们属于定义的命名空间。sysvars 的值仅在测量运行时可用,因此您不想将它们用于 UI 面板等。
- 数据类型:int (32, 64)、double、string、data、int 数组、double 数组、预定义结构(不允许用户定义)
- 可以定义初始值
- 可以为 int 数据类型定义值表
您可以使用“直接”访问 sysvar
@Namespace1::ParameterArray[2];
@Namespace1::Parameter2;
但是,这种方式不可能访问整个数组或字符串(帮助中没有提到数据,但可能是同一件事)。您也无法使用 @ 访问 XML-Test 模块中定义的任何 sysvar,请参阅帮助:
从系统变量中直接访问值
为系统变量(SysGet...、SysSet...、SysDefine...、SysUndefine... 和其他一些)定义了 CAPL 函数,请查看帮助:
CAPL 函数概述 » 系统变量 CAPL 函数
这里有一个来自 XML 测试函数的例子Set where both are used,你可以在 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”。