CAPL—on signal到底该怎么玩?
总结:一个前提,两种形式,一个注意,外加一个很不常用的知识点
1:一个前提:必须是DBC或其他数据库文件中定义的信号,且这个数据库已经添加到工程中去了。
2:使用格式 on signal+(用户添加的signal名),注意on signal全部为小写,中间至少一个空格
用户添加的signal,也有两种命名格式,一种是直接“空格”+信号名,一种是“空格”+signal所在的message名::信号名
3:两种形式:
on signal 和 on signal_update
这里就需要提到一种学习惯性的问题,结合我们之前学到的 on message ,我们知道 只要总线上出现一次,就触发一次,并执行 on message 中大括号{}中包含的代码。又因为signal又是组成message的最小个体,包括我自己,一开始都是认为 on signal 也是和 on message一样的使用
看段代码,RRV_PC_Life假如是存在message0x110上的,我们本意是想每次接收到0x110,就触发一次write函数,输出一次。结果实际测试中并不能实现。你们可以自己试一下,只有RRV_PC_Life的值产生变化时,才会触发大括号内的write函数。
那么我们如何才能每次接收到一帧包含RRV_PC_Life信号的0x110,报文时,就触发一次大括号内的函数?
回答:可以使用 on signal_update,修改上述代码,大家可以自己试一试。
小结:on signal XXX 当 “XXX”的值发生变化时,才会触发大括号内的代码执行
on signal_update XXX 当“XXX”所在的Message每次出现在总线上时,都会执行大括号内的代码
4:一个注意:注意数据类型的匹配
无论是on signal 还是 on signal_update。我们经常需要使用this指针,将Signal赋值给其他变量(其他包括不限于:1、CAPL中定义的各种全局变量,局部变量 。2、系统变量 3、其他信号)
这时非常需要注意的一个问题就是:“数据类型的匹配”
如下面一个简单的例子
int是signal类型,但是RRV_PC_Life是unsignal类型,这种情况就会产生错误,此外数据长度匹配也很重要。如RRC_PC_Life非常大5个Byte,int只有4个Byte,这样也是会出错的。故需要注意。
5:一个不常用的知识点“this.”
注意this后的“.”,在on message中常用,可以直接调用Message中的很多属性,on signal中有且只有一种
this.name
查看上图,运行一下,结果如下图
打印了,信号的全称 message名称::信号名称