CAPL所说的“事件”是指用户进行键盘操作和消息的接收等。
如果发生“事件”,会调用事件处理程序。
是指检测发生的事件并执行某种处理的功能。
每个事件处理程序都是独立的,并通过变量和函数连接和编程。
CAPL的特征“发生某事时做某事”,“发生某事时”被称为事件处理程序。
CAPL根据事件处理程序发生的事件进行处理。
在CAPL的系统事件中,有preStart、start、preStop、stopMeasurement4种。
我们可以根据需要在相应的系统事件函数接口中定义想要进行的操作;当工程运行时,下述系统事件的发生顺序依次是
preStart–>start–>preStop–>stopMeasurement
事件名 | 程序执行条件 | 事件过程语法结构 |
---|---|---|
preStart | CANoe初始化时执行 | on preStart{…} |
Start | 工程测量开始时执行 | on Start{…} |
preStop | 工程预备停止时执行;发生在stopMeasurement事件前面 | on preStop{…} |
stopMeasurement | 工程停止时执行 | on stopMeasurement{…} |
当硬件对CAN控制器检测到相应动作发生时执行。比如下面的Busoff。
on busOff /*CAN控制器事件:硬件检测到BusOff时执行*/
{
write("BusOff Error!");
}
事件名 | 程序执行条件 | 事件过程语法结构 |
---|---|---|
BusOff | 硬件检测到BusOff时执行 | on BusOff{…} |
ErrorActive | 硬件检测到ErrorActive时执行 | on errorActive{…} |
ErrorPassive | 硬件检测到ErrorPassive时执行 | on errorPassive{…} |
WarmmingLimit | 硬件检测到WarmmingLimit时执行 | on warmmingLimit{…} |
通过on message定义消息事件,该事件会在指定的报文消息被接收时被调用。
关于消息事件的定义格式示例如下:
on message 234 /*接收到234(10进制)这个ID的报文时执行*/
on message 0x441 /*接收到0x441(16进制)这个ID的报文时执行*/
on message BCM /*接收到BCM(工程dbc文件中的报文名)这个报文时执行*/
on message* /*接收到任意报文时都执行(注意*与message之间没有空格)*/
on message 0x300-0x555 /*接收到这个范围内的ID报文时执行*/
{
write(“Received %x”,this.id); /*打印接收到的消息id*/
write(“Received Message %d in total!”,count);
}
通过”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”);
}
定时器变量用来创建一个定时事件
SetTimer函数用来设定时间间隔
定时器运行到达设定时间间隔触发定时事件 on timer {}
周期性触发需要每次触发结束后使用SetTimer复位
cancelTimer函数用来在定时器运行中需要取消计时
variables
{
msTimer Timer1; /*在variables中声明一个以ms为单位的定时器变量Timer1*/
}
on start
{
setTimer(Timer1,100); /*将Timer1的定时时间设定为100ms,并启动它*/
}
on timer Timer1 /*定义的Timer1时间事件,每100ms执行一次*/
{
setTimer(Timer1,100); /*启动下一个周期循环*/
}
on key ‘a‘ /*键盘事件,按下键盘’A’键时执行*/
{
cancelTimer(Timer1); /*停止Timer1这个100ms执行一次的定时器*/
}
总线上出现错误帧或者过载帧时,错误帧事件将被调用,以进行错误帧处理
通过on errorFrame定义错误帧事件;该事件会在硬件检测到错误帧时执行。
关于错误帧事件的定义格式示例如下:
on errorFrame /*错误帧事件:硬件检测到错误帧时执行*/
{
write("The error has occur");
}
我们通过关键字:on envVar来定义环境变量事件,该事件是对系统变量发生变化的响应。
该事件会在指定的环境变量值有新的输入时开始执行。
环境变量常常用于关联上一个面板控件,当我们对控件进行操作时,对应改变关联上的环境变量值;
而此时我们在CAPL中关于该环境变量的事件就会被调用;以此完成相关联的交互操作。
关于在CAPL中对环境变量的操作中,getValue()与putValue()是常用的接口函数。
关于环境变量事件的定义格式示例如下:
//以下语句定义了系统变量DI_O改变时,触发以下事件
on sysVar IO::DI_O
{
$Gateway::IOValue1 = @this;
}
//以下语句定义了系统变量DI_O更新时,触发以下事件
on sysvar_update IO::DI_O
{
$Gateway::IOValue2 = @this;
诊断事件是在诊断请求或诊断响应发生时产生
事件 | 事件进程 |
---|---|
当仿真的ECU收到某条诊断请求时 | on diagRequest |
当仿真仪发出某条诊断请求时 | on diagRequestSent |
当仿真仪收到某条诊断响应时 | on diagResponse |
我们通过关键字:on sysvar来定义系统变量事件;
该事件会在指定的系统变量值有新的输入时执行,其格式及使用方法与前一小节的环境变量基本一致;
差别只在于环境变量是在dbc文件中定义的;而系统变量是在工具栏的”Environment”下的”System Variables”下定义的。
右键空白处,选择”New”进行新建;在弹出的窗口对新建的系统变量进行参数设置。
关于系统变量事件的定义格式示例如下:
on sysvar SysVarA /*系统变量事件:指定的系统变量值有新的输入时执行*/
{
write("The SysVarA is %d",@SysVar1);
}