1.1 创建系统变量最基本的函数
CAPL内部定义系统变量,需要通过调用CAPL封装好的函数,函数一共4个,其中2个函数比较重要,一个是用来创建namespace,一个是在已经定义的namespace中定义具体的系统变量。
解析以下代码
void MainTest()
{
sysDefineNamespace("Testp"); //定义命名空间“Testp”
sysDefineVariableInt("Testp","test1",0); //命名空间“Testp,创建int类型的系统变量
}
注意点1:sysDefineNamespace(),和sysDefineVariableInt(),顺序一定不能错
注意点2:sysDefineNamespace(),函数内的形参,可以是直接指定的常量,如代码中的"Testp"。
也可以是定义的char类型字符串。如 :
char NameSpace[]="Testp";
sysDefineNamespace(NameSpace); //注意不要有"",也不要有NameSpace[]这种形参格式
注意点3: sysDefineVariableInt(),函数中存在3个形参变量,本例中调用时"Testp","test1",0
使用这3个实参对应,第一个变量是namespace,第二个变量是创建系统变量的名称,第三个是初始值。
注意点4:sysDefineVariablefloat,sysDefineVariablelong,sysDefineVariablearray,等等,具体如下图:
1.2 修饰系统变量的函数
sysSetVariableDescriptionForValue("testp", "test1", 0, "off"); sysSetVariableDescriptionForValue("testp", "test1", 1, "on");
四个参数,相当于给已经创建好的函数赋ValueTable,前两个函数依次是namespace、变量名称。最后两个是指定数值,和数值对应的“解释”。
这两个函数并不是必要的函数,可以不调用,并不影响函数的调用。
1.3 代码运行后,系统变量被创建
完整代码如下
void MainTest() {long result;// 定义命名空间result = sysDefineNamespace("Testp");if (result != 0){write("命名空间 Testp 定义失败,错误码: %d", result);return;}// 定义整数类型的变量result = sysDefineVariableInt("Testp", "test1", 0);if (result != 0){write("变量 test1 定义失败,错误码: %d", result);return;}// 为变量的取值设置描述信息result = sysSetVariableDescriptionForValue("Testp", "test1", 0, "off");if (result != 0){write("为变量 test1 的值 0 设置描述信息失败,错误码: %d", result);return;}result = sysSetVariableDescriptionForValue("Testp", "test1", 1, "on");if (result != 0){write("为变量 test1 的值 1 设置描述信息失败,错误码: %d", result);return;} }
目前所有的创建系统变量的函数,返回值=0代表函数调用失败。
运行comple之后,点击运行,等到运行结束,如下图观察
2、CAPL内部定义系统变量注意点
手动定义系统变量
和手动在CANoe的SystemVariable中定义系统变量不同,手动定义的系统变量有如下特点
(手动定义特点1):先定义后使用。
(手动定义特点2):定义后,在CAPL中任意地方都可以使用。
2.1 CAPL内部通过函数定义的系统变量的特别之处
(特别点1)、函数中必须,先创建后才能被使用
CAPL内部通过函数定义的系统变量,有一些特别点需要注意
(注意1:) 创建函数后,不能立即使用这个系统变量,如如下代码,
void MainTest()
{
sysDefineNamespace("Testp");
sysDefineVariableInt("Testp","test1",0);
write("打印test1的值=%d",@Testp::test1); //该语句编译时直接会报错,报错原因是找不到这个系统变量, 或找不到这个namespace
}
也很好理解,因为只有前2条语句执行后,才能创建系统变量,而编译时,系统变量还没有被创建。
(特别点2)工程停止后,CAPL定义的系统变量依然存在,再次开启,系统变量失效
我们再home界面停止工程运行,
再查看系统变量,发现还存在


3、CAPL脚本内,删除先前定义的系统变量和namespace
sysUndefineNamespace();
sysUndefineVariable();
两个函数直接执行,注意这两个函数不仅仅可以删除CAPL定义的,还可以删除手动定义的系统变量。