- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
📘前言
🍅 学习CANoe,官方的实例工程就是最好的学习模板,对于初学者,存在看不懂,不知如何学习的问题,本节带大家学习下图的官方诊断工程。
🍅 这个工程是可以用适用于CANoe Demo版本的。
🍅 你可以从CANoe的 Sample Configruration 界面打开,也可以从下面的路径中打开。
- C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 15.5.23\CAN\Diagnostics\UDSBasic
目录
- 📘前言
- 📙 诊断工程
- 诊断数据库cdd文件
- 网络节点
- 仿真节点的代码解读
- 诊断定义
- 诊断事件
- 诊断CAPL函数
- 发送诊断
- 接收诊断,并发送响应
- 响应事件
- 测试节点的代码解读
- 测试步骤自增控制
- 诊断测试用例
- 🌎总结
📙 诊断工程
诊断数据库cdd文件
- 这个工程加载了一个cdd文件,如下图,因为是仿真ECU,需要注意的是下面选择的
Simulation By
网络节点
SimDiagECU
:这个工程仿真了一个ECU,SimDiagECU
,模仿ECU对诊断指令的响应。Tester
: 是个仿真的测试节点,和SimDiagECU
节点交互TestMoudle
: 测试用例模块,了解常用的诊断CAPL函数。
仿真节点的代码解读
- 运行CANoe之后,Write窗口会打印如下信息,这是因为在Tester.can文件中,On satrt 会调用 show_menu();打印出来的。
诊断定义
- 在CAPL脚本中定义,注意Door.xxx这个Door 是cdd文件中定义的ECU名字
- 定义时也不可以不用指定ECU的名字,在仿真节点中是Ok的(比如上图的Tester节点),但是在测试节点(比如上图的Test Module节点)中就不行,如果定义时,没有指定ECU的名字,
必须要先用diagSetTarget(“Doors”)指定诊断对象
,才可以使用诊断变量。 - 特别注意
diagRequest * req
,这样子定义表示这个诊断变量为空,不指向任何诊断服务,但是可以通过相关capl函数赋值后,变成任意的诊断服务
diagRequest Door.defaultSessionStart req;
diagRequest defaultSessionStart req;
diagRequest * req;
- 同理还有Response 的定义
diagResponse Door.defaultSessionStart resp;
diagResponse this resp;
diagResponse defaultSessionStart resp;
诊断事件
- 当发送诊断服务,不管是从诊断控制台手动发送,还是通过CAPL函数 diagSendRequest()发送,如果定义了诊断事件,则会触发该事件。
- 诊断事件,定义也是很灵活的,可以直接指向某一具体服务,如下图1,也可以指向某一组服务,如
on diagRequest Ecu_Reset::*
,当然也可以on diagRequest *
,指向所有诊断服务。
诊断CAPL函数
发送诊断
- 看下 on key ‘1’ 中的代码,
req.SetParameter
函数,也就是diagSetParameter
,是对诊断服务的参数设置值,设置好诊断参数值后,调用req.SendRequest()
;就可以把诊断服务发送出去了。 - PS:capl中很多函数,都有两种方式,一种是通过 类.方法的方式
(req.SetParameter)
,另一种就是可以直接调用的(diagSetParameter)
接收诊断,并发送响应
-
上面发送诊断后,触发 on diagRequest Door.Variant_Coding_Writes事件,判断收到的诊断参数后,判断是返回正响应还是负响应。
-
注意的是,这里是仿真的ECU,模拟ECU收到诊断报文后,模拟ECU的响应,也就是说如果ECU是真实的,那么我们在上一步诊断发出去后,就应该能接收到响应了。
-
SendPositiveResponse和SendPositiveResponse 只能在仿真函数中使用
响应事件
仿真节点和测试节点的CAPL脚本还是有很大差别的,而且有些函数是不通用的。
测试步骤自增控制
- 一个好的测试用例,应该步骤清晰,这里虽然是个简单的Demo工程,但是代码结构还是很完善的,如下图2测试报告中的测试步骤。
诊断测试用例
-
这个Demo就这一个测试用例,功能是:写入
Variant_Coding
,然后再读取Variant_Coding
。
-
重要的是,这个函数
SendRequestAndWaitForResponse
,实现了诊断发送,响应判断,是个很通用的函数,可以移植到自己的脚本下使用。
🌎总结
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。