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控制器*/
}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);}

CANoe之CAPL编程(CANoe系列其三)相关推荐

  1. CANoe 之 CAPL编程

    文章目录 CANoe 之 CAPL编程 CAPL 编程语言介绍及操作步骤 CAPL介绍 操作步骤 CAPL语法 CAPL程序的结构 数据结构 事件类型概述 常见函数 CANoe 之 CAPL编程 CA ...

  2. 【CANoe之CAPL基础学习_如何正常在总线上中发送CAN消息】

    前言 本文适合于新手使用CANoe进行基础CAPL编程.基于CANoe的VN1640在CAN网络上进行发送CAN报文,实现CAN总线报文的控制.本文主要通过使用CANoe模拟发送一条周期型报文.文章内 ...

  3. CANoe 入门 _CAPL编程

    转自:https://www.cnblogs.com/dongdonghuihui/archive/2012/09/26/2704619.html CANOE入门(二) CAPL就是Communica ...

  4. CANoe的使用--CANoe常用操作(CANoe系列其一)(转载)

    CANoe常用操作(CANoe系列其一) 转自:https://blog.csdn.net/weixin_44536482/article/details/89813538 摘要 CANoe是德国Ve ...

  5. CANoe常用操作(CANoe系列其一)

    CANoe常用操作(CANoe系列其一) 摘要 1.CANoe工程的新建 2.通过Trace工具查看交互的报文内容 3.通过Logging保存日志文件 4.创建IG发送报文 5.通过Graphics界 ...

  6. CANoe中用CAPL脚本按特定格式发送报文

    CANoe中用CAPL脚本按特定格式发送报文 需求 实验设备 实验环境 最近学习用CANoe软件测试CAN总线,纯新手,把最近的学习心得分享一下,欢迎大佬指正. 需求 1)仿真开始报文默认以100ms ...

  7. vspy如何在图形面板显示报文_Vspy工程之C Code Interface的使用(Vspy系列其三)

    Vspy工程之C Code Interface的使用(Vspy系列其三) Vspy工程之C Code Interface的使用(Vspy系列其三) Vspy工程之C Code Interface的使用 ...

  8. java lock 对象_Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

  9. 《WF编程》系列之3 - 漫游工作流:Visual Studio 2005 扩展

    <WF编程>系列之3 - 漫游工作流:Visual Studio 2005 扩展 1.2.2 Visual Studio 2005 扩展 Microsoft提供了一个Visual Stud ...

最新文章

  1. 使用datatables实现列宽设置、水平滚动条、显示某列部分内容
  2. 5.1 上网本安装安卓x86_生信工具 | antiSMASH 安装教程
  3. 魅力 .NET:从 Mono、.NET Core 说起
  4. ssr机场_史丹索普SSR草莓绑苗工作两周
  5. 学生网上评教系统php,学生评教系统设计与实现.doc
  6. PHP和mysql开发谷歌地图
  7. EditPlus批量转码
  8. 编译原理 实验1《词法分析程序设计与实现》
  9. autocad.net-图片打印合成
  10. statcounter统计的浏览器市场占有率
  11. php清除手机浏览器缓存,js清除浏览器缓存的几种方法
  12. ads1115的程序,不知道问题出在哪里,一直读出数据都是0。大佬们帮忙看看,感激不尽
  13. 例 6.5 有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
  14. nice、renice
  15. Transformer25
  16. Office自定义功能区各功能图标间隔太大,与之前排版不一样,如何减少间隔距离?
  17. Android各个版本的区别
  18. 微信小程序开发入门与实战 ②(小程序与前端开发的区别)
  19. 产品优化不再盲目!一次MMO手游性能诊断全纪录
  20. 软件测试专业职业访谈报告范文,第一部分:创业者访谈报告

热门文章

  1. 房贷流水不够怎么办及假流水办房贷通过了会有风险吗?这真不是危言耸听!
  2. web漏洞之sql注入
  3. 资源优化问题常见形式
  4. 大脑的默认模式网络DMN
  5. 分析型数据库产品的排头兵GBase 8a
  6. 上海电机学院计算机科学与技术专业怎么样,上海电机学院计算机科学与技术专业2016年在上海理科高考录取最低分数线...
  7. 字节LastDay,告别十个月的实习生活,流水账与一些思考
  8. 航天器/控制器飞行能够实现自主控制么?
  9. 智芯传感微差压气体压力传感器成功入围第三届“SIA感知领航优秀项目征集”年度杰出产品及技术成长型企业组
  10. 【10. 信号量和管程】