CANoe自带的诊断工程分析

news/2024/12/29 12:53:59/
  • 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对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 只能在仿真函数中使用

在这里插入图片描述

在这里插入图片描述

响应事件

  • 在上一步骤,ECU端发送了诊断响应后,就会触发 on diagResponse Door.Variant_Coding_Write事件
    在这里插入图片描述

    测试节点的代码解读

仿真节点和测试节点的CAPL脚本还是有很大差别的,而且有些函数是不通用的。
在这里插入图片描述

测试步骤自增控制

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

在这里插入图片描述

在这里插入图片描述

诊断测试用例

  • 这个Demo就这一个测试用例,功能是:写入Variant_Coding,然后再读取Variant_Coding
    在这里插入图片描述

  • 重要的是,这个函数 SendRequestAndWaitForResponse,实现了诊断发送,响应判断,是个很通用的函数,可以移植到自己的脚本下使用。
    在这里插入图片描述

    在这里插入图片描述

🌎总结

23

7

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18

http://www.ppmy.cn/news/48516.html

相关文章

nodejs+vue 智能餐厅菜品厨位分配管理系统

系统功能主要介绍以下几点: 本智能餐厅管理系统主要包括三大功能模块,即用户功能模块和管理员功能模块、厨房功能模块。 (1)管理员模块:系统中的核心用户是管理员,管理员登录后,通过管理员功能来…

分布式锁-Redisson

分布式锁 1、分布式锁1.1 本地锁的局限性1.1.1 测试代码1.1.2 使用ab工具测试(单节点)1.1.3 本地锁问题演示(集群情况) 1.2 分布式锁实现的解决方案1.3 使用Redis实现分布式锁(了解即可)1.3.1 编写代码1.3.2 压测 1.4 使用Redisson解决分布式锁1.4.1 实现代码1.4.1 压测1.4.2 可…

【力扣-JZ22】链表中倒数第k个结点

🖊作者 : Djx_hmbb 📘专栏 : 数据结构 😆今日分享 : "把手插进米堆的原因 " : 因为米堆类似于高密度的流体,会给人的手带来较大的压强,这种压强促进静脉血回流,会让人感到生理上的舒服。 文章目…

android aidl

本文只是记录个人学习aidl的实现,如需学习请参考下面两篇教程 官方文档介绍Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers 本文参考文档Android进阶——AIDL详解_android aidl_Yawn__的博客-CSDN博客 AIDL定义:Android 接口…

简单的小型C++项目怎么用CMAKE进行管理

项目目录: 根目录下共有两个文件夹,分别为include、src,有两个文件,分别为CMakeLists.txt和main.cpp main函数 可以看出,include了func.h,且func.h的声明在include文件夹下,定义在src文件夹下的…

MathType7最新版本下载安装与使用,注册表文件分享,添加为Word公式插件

wx供重浩:创享日记 对话框发送:mathtype 免费获取MathType7安装包注册表文件 MathType是强大的数学公式编辑器,与常见的文字处理软件和演示程序配合使用,能够在各种文档中加入复杂的数学公式和符号,可用在编辑数学试卷…

TCP协议三次握手过程分析

TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结…

图片存储方案-七牛云存储

1.引语 在实际开发中,我们会有很多处理不同功能的服务器。例如: 应用服务器:负责部署我们的应用 数据库服务器:运行我们的数据库 文件服务器:负责存储用户上传文件的服务器 分服务器处理的目的是让服务器各司其职…