CAPL 脚本中对信号,系统变量,环境变量的 事件响应
Posted 蚂蚁小兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAPL 脚本中对信号,系统变量,环境变量的 事件响应相关的知识,希望对你有一定的参考价值。
Value Objects
在 CAPL General Event Procedures (一) 中讲解了Ssytem下的几种事件,下面会讲解下 Value Objects下的几种事件:
信号(on signal)
- on signal signalname 每次信号值有变化的时候,会触发这个事件
- on signal_update signalname 只要总线上有这个周期信号就会一直触发
/*@!Encoding:ASCII*/
On key 'a'
setSignal(DeactiveTJPReq,1);
on signal DeactiveTJPReq
write("Value changed will be trigger, value: %f",this.raw);
on signal_update DeactiveTJPReq
write("Continuous trigger, value: %f",this.raw);
这里有一个信号 DeactiveTJPReq,周期5ms发送,初始值为0,因为一直触发事件:on signal_update DeactiveTJPReq,所以开始不断打印 0,后来按下按键 a, 因为 信号的值改变了,所以触发事件 on signal DeactiveTJPReq,后面即使再按按键 a,也不再会触发on signal DeactiveTJPReq,因为信号值没有变化
关于关键字:this
Within an event procedure for receiving a CAN object or an environment variable, the data structure of the object is designated by the key word this.
在接收CAN对象或环境变量的事件过程中,对象的数据结构由关键字this指定
- on signal ( signalname1 | signalname2 | …)
通过上面语法可以同时对多个信号进行监控
/*@!Encoding:ASCII*/
On key 'a'
write("Now pressed key a:");
setSignal(DeactiveTJPReq_UB, 0);
On key 'b'
write("Now pressed key b:");
setSignal(DeactiveTJPReq, 1);
on signal ( DeactiveTJPReq_UB |DeactiveTJPReq)
write("*********DeactiveTJPReq_UB**********: %f",getSignal(DeactiveTJPReq_UB));
write("*********DeactiveTJPReq*************: %f",getSignal(DeactiveTJPReq));
输出结果:
环境变量(on envVar)
on envVar X 响应环境变量事件
有两个多环境变量操作的API
- getValue() 读取变量值
- putValue() 设置变量值
首先,我们新建一个新的dbc文件,命名为test.dbc,然后创建三个环境变量,在canoe工程中加入这个dbc文件。
在Value Objects中创建on enVar 事件
/*@!Encoding:ASCII*/
On key 'a'
putValue(test_int,2);
putValue(test_float,2.5);
putValue(test_string,"good man");
on envVar test_int
write("test_int:%d",getValue(this));
on envVar test_float
write("test_float:%f",getValue(this));
on envVar test_string
char string[20];
getValue(this,string);
write("test_string:%s",string);
输出结果:
"on envVar (envVar1 | envVar2 | …)", 可以同时指定多个环境变量,但是只有这些环境变量的数据类型一样的时候,才可以使用“this”.
/*@!Encoding:ASCII*/
On key 'a'
putValue(test_int,2);
On key 'b'
putValue(test_float,2.5);
On key 'c'
putValue(test_string,"good man");
on envVar (test_int | test_float |test_string)
char string[20];
write("test_int:%d",getValue(test_int));
write("test_float:%f",getValue(test_float));
getValue(test_string,string);
write("test_string:%s",string);
依次按下a,b,c按键之后的输出结果:
系统变量(on sysVar )
- 系统定义的系统变量
在你的canoe工程中,调动了不同的dll或者加载了不同的模块,不同的总线结构中,canoe工程会自动适配出 系统的系统变量,如下图,只有statistics和canoe两个命名空间这是因为我这建立的是一个空项目,并没有加入其它模块。
- 用户定义的系统变量
这里新建了一个test_namespace 命名空间,并创建了三个系统变量
人;这里还可以通过 export 将你定义的系统变量导出到一个 .vsysvar 文件中,这样定义的系统变量就可以在其它工程中复用了。
- 语法: on sysVar X
- 读取或者设置系统变量的值,用 ‘@’ 或者 sysGetVariable。
- 系统变量要通过 域操作符"::" 在前面加上他的域空间才行
/*@!Encoding:ASCII*/
On key 'a'
//设置值
@test_namespace::sys_test_int =2;
@test_namespace::sys_test_float =3.5;
sysSetVariableString(sysVar::test_namespace::sys_test_string,"good man a");
on sysvar test_namespace::sys_test_int
write("sys_test_int:%d",@test_namespace::sys_test_int);
on sysvar test_namespace::sys_test_float
write("sys_test_float:%f",@test_namespace::sys_test_float);
on sysvar test_namespace::sys_test_string
char string[20]; sysGetVariableString(sysVar::test_namespace::sys_test_string,string,elCount(string));
write("sys_test_string:%s",string);
按下键盘 a,输出结果:
系统变量中 this 用法
On key 'a'
@test_namespace::sys_test_int =random(100);
on sysvar test_namespace::sys_test_int
write("sys_test_int:%d",@this);
write("sys_test_int:%s",this.name);
write("sys_test_int:%s",this.`namespace);
write("sys_test_int:%ld",this.time_ns);
输出:
- on sysvar 和 on sysvar_update的区别
on sysvar :值变化才会触发
on sysvar_update :只要对系统变量操作了,值不变化也会触发
On key 'a'
@test_namespace::sys_test_int = 2;
on sysvar test_namespace::sys_test_int
write("sysvar ---->>sys_test_int:%d",@this);
on sysvar_update test_namespace::sys_test_int
write("sysvar_update---->>sys_test_int:%d",@test_namespace::sys_test_int);
sys_test_int默认值是1,连续按了5次 键盘 a 键:
以上是关于CAPL 脚本中对信号,系统变量,环境变量的 事件响应的主要内容,如果未能解决你的问题,请参考以下文章