首先非常感谢大家对怿星科技公众号的持续关注,今天要分享的内容是CANoe中,基于UDS的Basic Demo解析。若谈及有关诊断的定义,就不得不提及这张神助攻的功能图。

图1 UDS诊断功能 (图片源于Vector)
上图简单概括了UDS诊断属于触发型诊断事件,由客户端(Client)发送请求指令给服务器(Server),而后服务器(Server)对接收到的诊断请求进行响应,实现故障检测及软件刷写等功能。UDS诊断共支持26种诊断服务,诊断事件依据诊断服务建立和存在。

表1 UDS诊断服务列表
如果想要对诊断服务和事件进行测试,CANoe的诊断功能窗口可以满足这个需求,CANoe中只需要添加数据库文件.cdd,并遵循UDS诊断协议,就可以模拟Tester和ECU之间的诊断请求和响应,如下图所示。
图2 CANoe诊断功能描述图(图片源于Vector)
文章标题中的浅谈可能无法很好的理解UDS诊断的实际应用,那就长话短说,让我们通过解析CANoe中Demo来更好的理解UDS诊断。
通过诊断工具链中的CANoe软件,按照路径File→Sample Configurations→CAN-Diagnostics选框下→UDS Diagnostics Basic Example打开Demo。

图3 Demo打开路径
打开Demo后,首先需要学会诊断数据库配置。在Diagnostics窗口,点击Diagnostic/ISO TP Configuration →CAN→Add Diagnostic Description,添加对应要求的诊断数据库文件.cdd。

图4 诊断数据库添加
完成cdd文件添加后,需要分别对ECU名称,传输层,诊断层等信息进行确认。
STEP 1:
查看ECU名称,Interface及Variant,也可以配置寻址方式,如物理寻址或功能寻址;并选择仿真节点SimDiagECU,来激活ECU仿真。

图5 数据库配置信息确认
STEP 2:
Transport Layer,查看地址(请求/响应ID)等信息。
STEP 3:
Diagnostic Layer,查看诊断应用层参数,如S3 Server,Tester Present服务是否打开,或添加安全算法.dll等文件。
以上操作配置完成后,连接配有软件License的插卡口并运行CANoe,Demo便可实现UDS诊断仿真。

图6 诊断控制面板
通过上图中的Diagnostic Console快捷窗口打开Demo的控制面板,双击诊断服务如“10 01”来实现Tester的指令发送,并等待SimDiagECU节点的诊断响应,数据流等细节信息可通过Trace窗口查看。

图7 诊断数据流
在Trace窗口中,SimDiagECU节点回复了肯定响应如“50 01”。为了方便查看,通过Trace窗口左侧的过滤器,可以筛选传输层和诊断应用层的信息。
如勾选“ECU Door”则显示应用层诊断服务的解析信息,如ECU名称为Door,0x10是SID-RQ(服务ID)等,若勾选“ISO TP observer”则对应显示传输层的信息,如数据帧特征位【02】,数据长度len等。
那么问题来了,Tester和SimDiagECU之间的诊断请求和响应交互在CANoe中是如何实现的?总感觉少不了编程这个强大推手。
的确,在CANoe 的仿真窗口中,首先需要通过Simulation Setup配置界面来新建仿真节点,Tester和SimDiagECU都是作为仿真节点存在的。如下图所示的拓扑图中共建立了3个节点。Tester节点用于发送诊断服务事件和接收诊断响应结果,SimDiagECU节点功能是接收诊断请求并发出诊断响应,TestModule节点功能是实现自动诊断功能。

图8 仿真节点拓扑图
其次,仿真节点功能的实现,在于节点配置中添加的.can文件。如SimDiagECU节点的.can文件,就是利用CAPL编程语言模拟了真实ECU,对诊断请求做出响应。

图9 SimDiagECU节点配置
因此,本文Demo可以实现诊断功能的本质在于应用CAPL编程描述了Tester与ECU之间基于UDS诊断的完整操作流程,而对于操作流程的复杂度主要体现在调用的API数量和多功能的需求。
Demo代码程序的简洁性在于API的调用,调用API只需定义部分功能函数,因此对于API的了解和学习,可以帮助各位更好更快速的理解整个Demo。如表格所示为CAPL诊断最基本的请求/响应API。
功能函数 |
功能描述 |
on diagRequest |
ECU接收到诊断请求时 |
on diagRequestSent |
Tester端已发送诊断请求时 |
on diagResponse |
Tester端接收到诊断响应时 |
表2 CAPL诊断常用API
CAPL编程常用的诊断请求API有2个:
(1)on diagRequest是当ECU接收到诊断请求时被调用;
(2)on diagRequestSent是当Tester端已发送诊断请求时被调用。
诊断响应API有1个:
on diagResponse是当Tester端接收到诊断响应时被调用。
莫要用错位置,好不啦!还不懂?往下看!以其中一个诊断事件为例。
Tester按键“1”中定义诊断请求,请求向ECU写入,并通过定义功能函数SendRequestAndCheckReturnvalue( )发送诊断请求。

图10 诊断请求
ECU对诊断请求进行响应。

图11 诊断响应
Tester接收响应,Write窗口显示信息。

图12 响应信息确认
然后,查看Trace窗口,验证诊断服务(Variant Coding Write)请求被成功发送,并获得肯定响应,如下图所示。

图13 2E诊断服务数据流
是不是有一种感觉,学习UDS诊断好像也不是很难?答案当然是NO !
上述Demo仅仅使用了一小部分API,更多API信息获取和学习,需要通过CANoe软件的Help文档来帮助查询,本文仅为各位提供精神层面的了解,餐前小点心请笑纳!
当然了,若对本文章内容有任何疑问或存在技术痛点的,欢迎在下方评论,也可发送support@e-planet.cn怿星技术支持邮箱来进行讨论。也请各位继续关注怿星科技公众号。
相关精彩推荐:

![]()
怿星一意,专注车载
引领汽车科技新高度


