CANoe/CANalyzer基础教程 第五章(CAPL语言)

参考教程:01 新建工程及通道配置_哔哩哔哩_bilibili

1、简介

(1)CAPL是CANoe自带的一种类C编程语言,封装有丰富的函数库。

(2)CAPL脚本需要和软件中的节点关联在一起,当CANoe工程启动时,CAPL中的程序才能被使能。

(3)使用CANoe的仿真功能与测量功能时可以在两个地方添加与CAPL文件关联的节点:

①可以在Simulation Setup窗口中添加一个仿真的网络节点,或者选择网络中已有的节点与CAPL脚本关联。

1\]在Simulation Setup窗口中右键,选择"Insert Network Node"添加一个网络节点。 ![](https://i-blog.csdnimg.cn/direct/5ab38f7f63c8471ab8587d2aab5d2a4a.png) \[2\]右键一个网络节点(下图以新增节点为例),选择"Configuration..."。 ![](https://i-blog.csdnimg.cn/direct/9c1d953b9ad64665ac1cbcd214800206.png) \[3\]在下图红框所示的地方配置与该节点关联的CAPL文件(文件后缀为.can),点击"File..."可以关联已有的CAPL文件,也可以新建一个CAPL文件(不选择已有的CAPL文件,直接输入不存在的文件名打开即可)。 ![](https://i-blog.csdnimg.cn/direct/d75f091201c14ebeb6b72c59b5252609.png) ![](https://i-blog.csdnimg.cn/direct/a383921fa3514f55be170a590d5bbb20.png) ②在Measurement Setup窗口中有一些蓝色方块,这里将它们称作功能模块,可以在这里添加CAPL编程节点,这些节点一般用于实现过滤或者数据分析等功能。 \[1\]在Measurement Setup窗口中蓝色方块,选择"Insert Program Node"添加一个编程节点。 ![](https://i-blog.csdnimg.cn/direct/423e6051760a44c1b0ad107e8a4c125c.png) \[2\]在下图红框所示的地方配置与该节点关联的CAPL文件(文件后缀为.can),点击"Select..."可以关联已有的CAPL文件,也可以新建一个CAPL文件(不选择已有的CAPL文件,直接输入不存在的文件名打开即可)。 ![](https://i-blog.csdnimg.cn/direct/e0e13aba9d0e446bbfb103d2df4ee5c4.png) ![](https://i-blog.csdnimg.cn/direct/754551dac16e4179b050dce311a6f4a3.png) \[3\]编程节点添加完成。 ![](https://i-blog.csdnimg.cn/direct/98b2f5859cdb4af9b4512d9073967c67.png) (4)在使用CANoe的测试功能时也可以添加关联CAPL文件的测试节点,其关联方式与网络节点相同,这里不再赘述。 ![](https://i-blog.csdnimg.cn/direct/d4c6b52e55c545868141ffcf7942c686.png) (5)CAPL文件的访问和编辑: ①直接双击CAPL节点可以打开CAPL文件。 ②CANoe中CAPL的编译环境为CAPL Browser,其界面由以下几部分组成: \[1\]菜单区(下图红框所示):主要功能有Comment Out(注释选定的行)、Compile(程序编译)、Import Environment(环境导入)等。 \[2\]架构浏览树(下图黄框所示):显示CAPL文件中定义的所有函数以及相关事件。 \[3\]代码编辑区(下图蓝框所示):在这里可以进行CAPL脚本的编辑。 \[4\]输出窗口(下图绿框所示):显示CAPL程序的编译结果。 ![](https://i-blog.csdnimg.cn/direct/322dbf7c81ea4832bbab38e3fe3e40a9.png) \[5\]CAPL函数库访问区和符号访问区:CAPL函数库中有丰富的函数,可以直接进行调用;CAPL可以通过符号访问区直接访问CANoe中加载的环境,包括数据库中的报文、信号以及系统变量等。 ![](https://i-blog.csdnimg.cn/direct/1030637d8e2344069203813eed482c6a.png) ## 2、Event (1)CAPL的一些特点: ①CAPL是一种与C语言非常类似的面向过程语言,语法比C语言简单。 ②CAPL程序的执行由事件Event触发,在CANoe工程运行时发生某个事件(比如收到错误报文),就会调用这个事件对应的CAPL程序。 ![](https://i-blog.csdnimg.cn/direct/78199f966cda4b92b532432586b18aa7.png) (2)CAPL中常见的事件如下图所示,从上往下依次是CANoe工程启动、CANoe工程停止、接收特定ID报文(其代码句柄后紧跟报文ID或者报文名称)、计时器事件(也可认为是周期事件,其代码句柄后紧跟计时器名称)、按下外设按键(其代码句柄后紧跟按键名称,比如键盘上的'a'),其对应的代码句柄在其右侧,花括号内的语句是事件触发后需要执行的程序段,并不固定。 ![](https://i-blog.csdnimg.cn/direct/c6117310741e4cb48a08acb3d97c83e2.png) (3)以外设按键a触发为例: ①双击Simulation Setup窗口中已经关联CAPL文件的网络节点,打开其CAPL文件。 ![](https://i-blog.csdnimg.cn/direct/99b54c8f77584a098562c108dc2dcbe7.png) ②新增蓝框所示的代码块,编辑完成后点击"Compile"(编译),输出窗口中没有报错即为编译成功。 ![](https://i-blog.csdnimg.cn/direct/75e60b0ff7584af7be9d5ba07f284f09.png) ![](https://i-blog.csdnimg.cn/direct/69cb7d1c5f34489186f6d1f5a14f411f.png) ③启动CANoe工程,按下键盘上的按键a,Write窗口中将会输出"key a pressed"。 ![](https://i-blog.csdnimg.cn/direct/650b193d127c4f96b45b6a7bbdc1c606.png) ## 3、Send Message (1)使用CAPL脚本发送CAN报文(可以是自定义报文,也可以是数据库中已定义的报文)的步骤: ①定义一个报文message类型的变量,这个变量实际上是一个结构体变量。 \[1\]对于自定义报文,定义的语法为"message \<报文ID\> \<报文变量名称\>;"。 \[2\]对于数据库中已定义的报文,定义的语法为"message \<报文名\> \<报文变量名称\>;"。 ②对这个变量进行赋值操作,赋值方法和在C语言中访问结构体变量成员的语法相同。message类型的结构体变量有如下所示的成员,常用的有dlc------数据段长度、byte(n)------数据段的第n个字节(对于数据库中已定义的报文,可以直接通过信号名称访问数据段相应的位置)。 ![](https://i-blog.csdnimg.cn/direct/cfeecb9d1f4e455187c603b4fd9cb9e2.png) ③使用发送函数output(参数为报文变量名)将该报文发送。 (2)自定义报文的发送: ①打开与仿真节点关联的CAPL文件,定义一个按键事件,这里仍旧以按下按键a为例,然后在事件的程序块中定义报文变量msg1,其ID为0x1A,数据段长度为4,然后做发送操作。 ![](https://i-blog.csdnimg.cn/direct/a964b854ea044566aea99cbf38ba6df8.png) ②程序编译完成后,启动CANoe工程,然后在键盘上按下按键a,可以看到总线上有ID为0x1A的报文传输。 ![](https://i-blog.csdnimg.cn/direct/9de49071efe74efc8f17f342df92e880.png) (3)数据库中已定义报文的发送: ①打开与仿真节点关联的CAPL文件,定义一个按键事件,这里以按下按键b为例,然后在事件的程序块中定义报文变量msg2,其对应的报文的名字为EngineState,内含信号EngineSpeed和OnOff,给信号赋值后做发送操作。 ![](https://i-blog.csdnimg.cn/direct/2002ce080b4a4a329e5cc60f9ad0dee9.png) ②程序编译完成后,启动CANoe工程,然后在键盘上按下按键b,可以看到总线上有名称为EngineState的报文传输。 ![](https://i-blog.csdnimg.cn/direct/d8693ebe39d746db9ae13a61f8f0387c.png) ## 4、Access (1)信号的发送或者信号值的改变也可以作为CAPL程序的触发事件。 ①"on signal \<信号名\>"------信号值改变事件的句柄。 ②"on signal_update \<信号名\>"------信号发送到总线上事件的句柄。 ![](https://i-blog.csdnimg.cn/direct/f55cf9fc52c941bb890286f823a00861.png) (2)getSignal函数(参数为信号名)可以返回参数中信号的值,也可以使用"$\<信号名\>"直接访问信号的值。 ![](https://i-blog.csdnimg.cn/direct/4c07e1fa35cf4f1e9113c1f1da62cdd0.png) (3)setSignal函数(参数为信号名和数值)可以为参数中的信号赋值,也可以使用"$\<信号名\>"直接访问信号的值。 ![](https://i-blog.csdnimg.cn/direct/161e74b812924815a1fa8140dde7b23e.png) (3)系统变量被激活或者系统变量值的改变也可以作为CAPL程序的触发事件。 ①"on sysvar \<系统变量\>"------系统变量值改变事件的句柄。 ②"on sysvar_update \<系统变量\>"------系统变量被激活事件的句柄。 ![](https://i-blog.csdnimg.cn/direct/e3048dd702d64d199d68fae851a6ca44.png) (4)对于简单数据类型的系统变量,可以使用"@\<系统变量名\>"直接访问系统变量的值;使用函数对系统变量的访问需要考虑其数据类型,这里以int类型的系统变量为例: ①对int类型的系统变量赋值需要使用sysSetVariableInt函数,其参数依次为系统变量和需要赋上的数值。 ②读取int类型的系统变量的值需要使用sysGetVariableInt函数,其参数依次为系统变量和存储读取数值的变量。 ![](https://i-blog.csdnimg.cn/direct/0116dcea44ed4ac3abaa8a5c6d812bf5.png)

相关推荐
HiEV5 小时前
激光雷达成为新时代「安全气囊」,禾赛推动智能车安全再进化
自动驾驶·汽车
虹科Pico汽车示波器7 小时前
汽车免拆诊断案例 | 2013款大众辉腾车发动机抖动
汽车·汽车示波器·怠速抖动·发动机故障·汽修案例·喷油器·大众辉腾
一RTOS一11 小时前
鸿道操作系统Type 1虚拟化:破局AI机器人与智能汽车的“安全”与“算力”双刃剑
人工智能·机器人·汽车·鸿道intewell操作系统·工业os
博一波1 天前
【汽车ECU电控数据管理篇】S19文件格式解析篇章
汽车
九河云2 天前
垂直行业突围:工业软件在汽车、航空领域的 “破壁” 实践
人工智能·科技·重构·汽车·制造
安科瑞王可2 天前
新能源汽车充电桩运营模式的发展与优化路径探析
汽车·运营·新能源·能源管理·充电桩
天天爱吃肉82182 天前
新能源汽车零部件功率级测试方案搭建研究
单片机·嵌入式硬件·汽车·学习方法
虹科Pico汽车示波器2 天前
汽车免拆诊断案例 | 2019款大众途观L车鼓风机偶尔不工作
汽车·lin总线·汽修案例·汽修知识·大众途观·汽车偶发故障·串行译码
老猿讲编程3 天前
汽车故障诊断工作原理:从需求到AUTOSAR诊断模块协作的浅析
汽车