canoe发送数据_CANoe之CAPL编程(CANoe系列其三)CANoe之CAPL编程(CANoe系列其三)
1、CAPL概述
1.1、CAPL语⾔特性
1.2、CAPL的程序结构
1.3、CAPL的数据类型
1.4、CAPL事件类型概述
2、CAPL事件类型
2.1、系统事件
2.2、CAN控制器事件
2.3、CAN消息事件
2.4、键盘事件
2.5、时间事件
2.6、错误帧事件
2.7、环境变量事件
2.8、系统变量事件
1、CAPL概述
与Vspy的"C Code Interface"⼀样;在CANoe的使⽤中,⼀样提供了我们进⾏⼆次编程开发的⼯具——”CAPL Browser”。通过CAPL 的编程,我们可以在节点上完成更为复杂的功能需求。操作如下:在CANoe⼯程的”Simulation Setup”界⾯下的左侧的⽹络节点中,点击铅笔形状的图标,进⼊CAPL编辑界⾯(若当前节点还没有创建对应的CAPL程序,则此时会先提⽰输⼊CAPL程序名,并保存为.can后缀的⽂件)
1.1、CAPL语⾔特性
CAPL(Communication Access Programming Laguage)语⾔是类C语⾔,语法其实与C语⾔很相似,但同时⼜包含了⼀些C++的特性,如this指针、事件等;
应⽤于Vector CAN⼯具节点的编程,是基于事件建模的语⾔;
可以使⽤write()函数进⾏调试,⽤于将调试信息输出到CANoe的write窗⼝上;
通过output()函数进⾏指定报⽂的发送;
通常是通过环境变量事件与CANoe⾯板进⾏关联,实现交互;
提供调⽤dll⽂件的⽅法(操作见"关于CAPL中对dll的调⽤操作"⼀⽂);这样保证了对由其他语⾔封装好的程序模块的调⽤;
1.2、CAPL的程序结构
如下,⼀个完整的CAPL程序的结构包含了头⽂件、全局变量、事件函数、⾃定义函数;当然不是每个因素都要有,视具体程序功能确定。
1.3、CAPL的数据类型
1.4、CAPL事件类型概述
CAPL是基于事件建模的语⾔,从1.2⼩节对CAPL的程序结构的介绍也可以看出,关于CAPL的运⽤主要
就是在于熟悉其事件的使⽤;其常⽤的事件如下:
接下来,我们对CAPL的⼏种事件类型进⾏进⼀步的介绍
2、CAPL事件类型
2.1、系统事件
在CAPL的系统事件中,有preStart、start、preStop、stopMeasurement这4种。我们可以根据需要在相应的系统事件函数接⼝中定义想要进⾏的操作;当⼯程运⾏时,下述系统事件的发⽣顺序依次是
preStart-->start-->preStop-->stopMeasurement
关于系统事件的定义格式如下:
on preStart /*系统事件,初始化时执⾏*/
{
resetCan(); /*CAPL接⼝函数,⽤于复位CAN控制器*/
}
settimer头文件on start /*系统事件,⼯程开始时执⾏*/
{
write(“Just A Try”); /*write()函数将字符串信息在”write”窗⼝输出*/
}
on preStop /*系统事件,⼯程预备停⽌时执⾏;发⽣在stopMeasurement事件前⾯*/
{
write("The Project Will Stop!”);
}
on stopMeasurement /*系统事件,⼯程停⽌时执⾏*/
{
write("The End!\n");
}
2.2、CAN控制器事件
当硬件对CAN控制器检测到相应动作发⽣时执⾏;以BusOff事件为例,格式如下:
on busOff /*CAN控制器事件:硬件检测到BusOff时执⾏*/
{
write("BusOff Error!");
}
2.3、CAN消息事件
通过”on message”定义消息事件,该事件会在指定的报⽂消息被接收时被调⽤。关于消息事件的定义格式⽰例如下:
on message 123 /*接收到123(10进制)这个ID的报⽂时执⾏*/
on message 0x441 /*接收到0x441(16进制)这个ID的报⽂时执⾏*/
on message BCM /*接收到BCM(⼯程dbc⽂件中的报⽂名)这个报⽂时执⾏*/
on message* /*接收到任意报⽂时都执⾏(注意*与message之间没有空格)*/
on message 0x300-0x444 /*接收到这个范围内的ID报⽂时执⾏*/
{
write(“Received %x”,this.id); /*打印接收到的报⽂id*/
write(“Received Message %d in total!”,count);
}
以上是关于消息事件的定义格式,关于消息的索引及发送操作我们通过下例介绍:
假设VoiceStatus是我们⼯程dbc⽂件中定义的⼀个报⽂,该报⽂包括了VoiceType和VoiceOperation这两个信号;其中,VoiceType这个变量占据第1个字节;VoiceOperation占据第2、3个字节;则关于消息的索引,通过报⽂的信号(msg.VoiceType这样)去操作如下:
void TxMsg_VoiceStatus(void)
{
message VoiceStatus msg; /*将⼯程中dbc中定义的VoiceStatus这条报⽂取名为msg*/
msg.VoiceType = @VoiceType; /*对应赋值给到报⽂的信号,通过报⽂别名"msg."调出*/
msg.VoiceOperation = @VoiceOperation;
output(msg); /*通过output指令发送该报⽂*/
}
也可以直接通过后接数据类型(msg.byte(0)这样)去操作,此时操作如下:
void TxMsg_VoiceStatus(void)
{
message VoiceStatus msg; /*将⼯程中dbc中定义的VoiceStatus这条报⽂取名为msg*/
msg.byte(0) = @VoiceType; /*报⽂第1个数据字节*/
msg.word(1) = @VoiceOperation; ; /*报⽂从第1个字节开始的⼀个字(2个字节)*/
output(msg); /*通过output指令发送该报⽂*/
}
2.4、键盘事件
通过”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”);
}
2.5、时间事件
通过”on timer”定义时间事件;该事件会在设定的时间到达时执⾏。关于时间事件的定义格式及使⽤⽰例如下:
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执⾏⼀次的定时器*/
}
2.6、错误帧事件
通过”on errorFrame ”定义错误帧事件;该事件会在硬件检测到错误帧时执⾏。关于错误帧事件的定义格式⽰例如下:
on errorFrame /*错误帧事件:硬件检测到错误帧时执⾏*/
{
write("The error has occur");
}
2.7、环境变量事件
通过”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);
}
}
关于在CAPL中对环境变量的操作中,getValue()与putValue()是常⽤的接⼝函数。其函数格式如下,具体介绍及⽰例也可以通过神
键"F1"召唤帮助⽂档,在"CAPL"相关章节中进⾏学习。
Ps:关于环境变量的定义是在dbc⽂件中完成的;CANoe⼯程导⼊该dbc⽂件即可使⽤其定义的环境变量了。环境变量的创建如下:
2.8、系统变量事件
通过”on sysvar”定义系统变量事件;该事件会在指定的系统变量值有新的输⼊时执⾏,其格式及使⽤⽅法与前⼀⼩节的环境变量基本⼀致;差别只在于环境变量是在dbc⽂件中定义的;⽽系统变量的定义如下:
点击⼯具栏的”Environment”下的”System Variables”;此时界⾯如下,右键空⽩处,选择”New”进⾏新建;在弹出的窗⼝对新建的系统变量进⾏参数设置。
关于系统变量事件的定义格式⽰例如下:
on sysvar SysVar1 /*系统变量事件:指定的系统变量值有新的输⼊时执⾏*/
{
write("The SysVar1 is %d",@SysVar1);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论