> 文章列表 > CANoe自带的诊断工程分析

CANoe自带的诊断工程分析

CANoe自带的诊断工程分析

  • 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
  • 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
  • 🍅 玩转CANoe,博客目录大全,点击跳转👉

📘前言

🍅 学习CANoe,官方的实例工程就是最好的学习模板,对于初学者,存在看不懂,不知如何学习的问题,本节带大家学习下图的官方诊断工程。
🍅 这个工程是可以用适用于CANoe Demo版本的。

🍅 你可以从CANoe的 Sample Configruration 界面打开,也可以从下面的路径中打开。

  • C:\\Users\\Public\\Documents\\Vector\\CANoe\\Sample Configurations 15.5.23\\CAN\\Diagnostics\\UDSBasic

CANoe自带的诊断工程分析

目录

  • 📘前言
  • 📙 诊断工程
    • 诊断数据库cdd文件
    • 网络节点
    • 仿真节点的代码解读
      • 诊断定义
      • 诊断事件
      • 诊断CAPL函数
      • 发送诊断
      • 接收诊断,并发送响应
      • 响应事件
    • 测试节点的代码解读
      • 测试步骤自增控制
      • 诊断测试用例
  • 🌎总结

CANoe自带的诊断工程分析


📙 诊断工程

诊断数据库cdd文件

  • 这个工程加载了一个cdd文件,如下图,因为是仿真ECU,需要注意的是下面选择的Simulation By

CANoe自带的诊断工程分析

网络节点

  • SimDiagECU :这个工程仿真了一个ECU,SimDiagECU,模仿ECU对诊断指令的响应。
  • Tester: 是个仿真的测试节点,和SimDiagECU节点交互
  • TestMoudle: 测试用例模块,了解常用的诊断CAPL函数。

CANoe自带的诊断工程分析

仿真节点的代码解读

  • 运行CANoe之后,Write窗口会打印如下信息,这是因为在Tester.can文件中,On satrt 会调用 show_menu();打印出来的。

CANoe自带的诊断工程分析

诊断定义

  • 在CAPL脚本中定义,注意Door.xxx这个Door 是cdd文件中定义的ECU名字
  • CANoe自带的诊断工程分析
  • 定义时也不可以不用指定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 * ,指向所有诊断服务。
    CANoe自带的诊断工程分析
    CANoe自带的诊断工程分析

诊断CAPL函数

发送诊断

  • 看下 on key ‘1’ 中的代码,req.SetParameter函数,也就是 diagSetParameter,是对诊断服务的参数设置值,设置好诊断参数值后,调用req.SendRequest();就可以把诊断服务发送出去了。
  • PS:capl中很多函数,都有两种方式,一种是通过 类.方法的方式(req.SetParameter),另一种就是可以直接调用的(diagSetParameter)
    CANoe自带的诊断工程分析

CANoe自带的诊断工程分析

接收诊断,并发送响应

  • 上面发送诊断后,触发 on diagRequest Door.Variant_Coding_Writes事件,判断收到的诊断参数后,判断是返回正响应还是负响应。

  • 注意的是,这里是仿真的ECU,模拟ECU收到诊断报文后,模拟ECU的响应,也就是说如果ECU是真实的,那么我们在上一步诊断发出去后,就应该能接收到响应了。

  • SendPositiveResponse和SendPositiveResponse 只能在仿真函数中使用

CANoe自带的诊断工程分析

CANoe自带的诊断工程分析

响应事件

  • 在上一步骤,ECU端发送了诊断响应后,就会触发 on diagResponse Door.Variant_Coding_Write事件
    CANoe自带的诊断工程分析

    测试节点的代码解读

仿真节点和测试节点的CAPL脚本还是有很大差别的,而且有些函数是不通用的。
CANoe自带的诊断工程分析

测试步骤自增控制

  • 一个好的测试用例,应该步骤清晰,这里虽然是个简单的Demo工程,但是代码结构还是很完善的,如下图2测试报告中的测试步骤。

CANoe自带的诊断工程分析

CANoe自带的诊断工程分析

诊断测试用例

  • 这个Demo就这一个测试用例,功能是:写入Variant_Coding,然后再读取Variant_Coding
    CANoe自带的诊断工程分析

  • 重要的是,这个函数 SendRequestAndWaitForResponse,实现了诊断发送,响应判断,是个很通用的函数,可以移植到自己的脚本下使用。
    CANoe自带的诊断工程分析

    在这里插入图片描述

🌎总结

CANoe自带的诊断工程分析

CANoe自带的诊断工程分析

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    CANoe自带的诊断工程分析