01
CAPL概述
与Vspy的"C Code Interface"一样;在CANoe的使用中,一样提供了我们进行二次编程开发的工具——”CAPL Browser”。通过CAPL的编程,我们可以在节点上完成更为复杂的功能需求。操作如下:在CANoe工程的”Simulation Setup”界面下的左侧的网络节点中,点击铅笔形状的图标,进入CAPL编辑界面(若当前节点还没有创建对应的CAPL程序,则此时会先提示输入CAPL程序名,并保存为.can后缀的文件)
Image
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的几种事件类型进行进一步的介绍
02
CAPL事件类型
2.1、系统事件
在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");
}
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个字节)*/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。