CAPL事件类型概述
CAPL是基于事件建模的语言,关于CAPL的运用主要就是在于熟悉其事件的使用;其常用的事件如下:
CAPL事件类型
系统事件
在CAPL的系统事件中,有preStart、start、preStop、stopMeasurement
这4种。我们可以根据需要在相应的系统事件函数接口中定义想要进行的操作;当工程运行时,下述系统事件的发生顺序依次是
preStart-->start-->preStop-->stopMeasurement
关于系统事件的定义格式如下:
on preStart /*系统事件,初始化时执行*/
{
resetCan(); /*CAPL接口函数,用于复位CAN控制器*/
}
on start /*系统事件,工程开始时执行*/
{
write(“Just A Try”); /*write()函数将字符串信息在”write”窗口输出*/
}
on preStop /*系统事件,工程预备停止时执行;发生在stopMeasurement事件前面*/
{
write("The Project Will Stop!”);
}
on stopMeasurement /*系统事件,工程停止时执行*/
{
write("The End!\n");
}
CAN控制器事件 on busOff
当硬件对CAN控制器检测到相应动作发生时执行;以BusOff
事件为例,格式如下:
on busOff /*CAN控制器事件:硬件检测到BusOff时执行*/
{
write("BusOff Error!");
}
CAN消息事件 on message
通过on message
定义消息事件,收到有效的CAN消息后,将调用消息上的事件程序。关于消息事件的定义格式示例如下:
on message 123 /*接收到123(10进制)这个ID的报文时执行*/
on message 0x441 /*接收到0x441(16进制)这个ID的报文时执行*/
on message BCM /*接收到BCM(工程dbc文件中的报文名)这个报文时执行*/
on message* /*接收到任意报文时都执行(注意*与message之间没有空格)*/
on message CAN1.0x124 /*接收CAN1上ID为0x124的报文*/
on message CAN1.ABS /*接收CAN1上名称为ABS的报文*/
on message CAN1.* /*接收CAN1上任意报文*/
on message 0x300-0x444 /*接收到这个范围内的ID报文时执行*/
{
write(“Received %x”,this.id); /*打印接收到的报文id*/
write(“Received Message %d in total!”,count);
}
关键字this在消息处理过程中可用,用于访问刚刚收到的消息的数据。
this.byte(x);x可以是0-7
this.Word(x);x可以是0-6
this.DWord(x);x可以是0-4
this.QWord(x);x只能是0
this.id;报文ID
this.DLC;报文长度
this.can;报文所在通道
this.dir;报文方向是 接收还是发送
this.time;报文时间戳(单位10us)
this.simulated;报文是否由仿真节点发送,0:不是,1:是
this.FDF;FD报文格式标志位,0:CAN,1:CANFD
信号事件
信号变化时触发
on signal sig
{
write("signal change");
}
信号更新时触发
on signal sig update
{
write("signal update");
}
on signal
事件是只要信号值发生改变时都会触发包括信号从无到有的那一次,也即只第一次发送也会触发,因为这种情况下相当天信号从0变为1。on signal_update
则可以理解为,只要总线监测到有这个信号就会触发,不论这个信号的值是否改变。
键盘事件
通过”on key”定义键盘事件,该事件会在我们按下指定按键时执行;关于键盘事件的定义格式示例如下:
on key ‘a’ /*在小写输入法下,按下键盘的’A’键时执行*/
on key ‘A’ /*在大写输入法下,按下键盘的’A’键时执行*/
on key ‘ ’ /*按下键盘的空格键时执行,注意单引号中间是有空格的*/
on key 0x20 /*按下键盘的空格键时执行*/
on key F2 /*按下键盘的’F2’键时执行*/
on key CtrlF3 /*同时按下键盘的’Ctrl’键和’F3’键时执行*/
on key* /*按下键盘的任意键时都会执行(注意*与key之间没有空格) */
{
write(“The Key Is Press”);
}
时间事件
通过”on timer”定义时间事件;该事件会在设定的时间到达时执行。关于时间事件的定义格式及使用示例如下:
variables
{
msTimer Timer1; /*在variables中声明一个以ms为单位的定时器变量Timer1*/
timer Timer2; /*在variables中声明一个以s为单位的定时器变量Timer2*/
}
on start
{
setTimer(Timer1,100); /*将Timer1的定时时间设定为100ms,单次启动,并启动它*/
setTimerCyclic(Timer2,10);/*将Timer2的定时时间设定为10s,周期性启动,并启动它*/
}
on timer Timer1 /*定义的Timer1时间事件,每100ms执行一次*/
{
setTimer(Timer1,100); /*启动下一个周期循环*/
}
on timer Timer2 /*定义的Timer2时间事件,每10s执行一次,不需要重新启动*/
{
}
on key ‘a‘ /*键盘事件,按下键盘’A’键时执行*/
{
cancelTimer(Timer1); /*停止Timer1定时器*/
cancelTimer(Timer2); /*停止Timer2定时器*/
}
错误帧事件
通过”on errorFrame ”定义错误帧事件;该事件会在硬件检测到错误帧时执行。关于错误帧事件的定义格式示例如下:
on errorFrame /*错误帧事件:硬件检测到错误帧时执行*/
{
write("The error has occur");
}
环境变量事件
通过on envVar
定义环境变量事件;该事件会在指定的环境变量值有新的输入时执行(环境变量常常用于关联上一个面板控件,当我们对控件进行操作时,对应改变关联上的环境变量值;而此时我们在CAPL中关于该环境变量的事件就会被调用;以此完成交互操作)。关于环境变量事件的定义格式示例如下:
on envVar BCM_HightBeamAlarm /*环境变量事件:指定的环境变量值有输入时执行*/
{
byte num=0;
num = getValue(this); /*可以使用getValue(环境变量名/this关键字)获取指定的环境变量的值*/
if(num == 1)
{
write("The envVar is %d",@BCM_HightBeamAlarm);
}
else
{
putValue(this,1);/*使用putValue(环境变量名/this关键字,设定的值)改变指定的环境变量的值;直接赋值的话,格式是@BCM_HightBeamAlarm = 1; */
write("Change envVar to %d",@BCM_HightBeamAlarm);
}
}
系统变量事件
通过on sysvar
定义系统变量事件;该事件会在指定的系统变量值有新的输入时执行,其格式及使用方法与前一小节的环境变量基本一致;差别只在于环境变量是在dbc文件中定义的;而系统变量的定义如下:
点击工具栏的Environment
下的System Variables
;此时界面如下,右键空白处,选择New
进行新建;在弹出的窗口对新建的系统变量进行参数设置。
一般来说,前面带@的就是系统变量。
关于系统变量事件的定义格式示例如下:
on sysvar SysVar1 /*系统变量事件:指定的系统变量值有新的输入时执行*/
{
write("The SysVar1 is %d",@SysVar1);
}
环境变量值变化时触发
on sysVar_change SysVar1
{
write("The SysVar1 is %d",@SysVar1);
}
环境变量值更新时触发
on sysVar_update SysVar1
{
write("The SysVar1 is %d",@SysVar1);
}