Value Objects
- 信号(on signal)
- 环境变量(on envVar)
- 系统变量(on sysVar )
在 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 键: