1. 前言
从单片机STM32开始转到汽车电子已经有一年时间了,到如今为止,很少写文章了,原因很简单,肚子里面没有墨水,就不给大家献丑了。而现在写在这篇文章,属实也是有了一定的了解。所以还不是很了解这个方面的小伙伴可以参考下本文。我尽量以大白话的方式讲明白。
2. 什么是DTC呢?
DTC的全称是Diagnostic Trouble Code,即诊断故障码。就是当汽车里出现了故障,ECU会发出一串数字,它可以帮我们找到故障的原因,可以更快速的定位解决问题。
借用网上经常看到的例子:欠电压故障
假设汽车正常的工作电压是10-18V,当此时的电压是8V,是不是就会出现打不着火,汽车不工作的故障呀?我们肉眼看不出来为什么汽车不工作,但是我们可以通过读取DTC码来找到原因。当欠压时,汽车会发出0X123456 这一串数字,而这串数字,每个厂商都有规定的,我们就相当于去看说明书,就能找到这串数字代表的意思了。
3.故障内码与标准故障码
其中,DTCHighByte、DTCMiddleByte这两个字节表示故障内码,对应5位标准故障码(第一位是字母,后面四位是数字),如"B100016"这个故障码中的"B1000";最后面的"16"则是DTCLowByte的内容。故障内码与5位标准故障码的位置对应关系如下:
第一位是字母,表示故障所属系统;有如下的四种情况:
第二位是数字,表示故障类型;有如下的四种情况:
第三位是数字,表示故障所属的子系统;以对动力系统为例(P开头的故障码),有以下的情况:
0:表示燃油和空气计量辅助排放控制整个系统;
1:表示燃油和空气计量系统;
2:表示燃油和空气计量系统(喷油器);
3:表示点火系统;
4:表示废气控制系统;
5:表示巡航、怠速控制系统;
6:车载电脑和输出信号;
7:传动系统控制;
8:传动系统控制;
DTCLowByte则是描述故障种类和子类型,该部分内容遵循ISO 15031-6;对于不需要该字节信息的DTC,可填充为0x00。
故障码的16进制表示(在程序里的写法):
一般我们都会拿到DTC的需求文档,一般情况下,系统工程师会把故障码转化成16进制,这样方便软件工程师去配置到程序里。
对照着上面的图:
举例:
U007304
U:11
0:00
0:0000
7:0111
3:0011
所以16进制是:1100 0000 0111 0011 (前面16位变成高字节和中字节)
再加上低字节04 所以16进制的写法就是:0XC07304
B100016,其故障内码为:1001 0000 0000 0000,换算成16进制则为9000;补充上DTCLowByte(16),则其完整的16进制表示为0x900016;
原文是这个博主的
4.DTC的8位bit代表的含义
5.DTC老化(东信)
DTC的老化是一个过程,这个过程是以循环周期作为单位。有几种周期被采用:
上下电作为一个循环周期;
warm-up作为一个循环周期。
在诊断自恢复过程中,往往我们会定义30个或40个循环周期作为自恢复的条件。原因是,在一个相对较长的过程中,如果车辆没有发生这个故障,我们可以认为这个故障是一个偶发的现象,也可以认为现在的车辆处于一个相对稳定的状态。因而,可以将这个故障码清除
科普小知识提示:在解释协议定义的老化过程前,我们先来解释一下上图中各位的含义。
- DTCAging计数器在完成测试未失败的操作周期后递增,DTCAging计数器开始计数的条件是:testFailed=0,PendingDTC= 0,ComfiredDTC=1。
- pendingDTC=0的条件是在一个操作周期后测试完成且未失败(testNotCompleted-ThisOperationCycle = 0,tesetFailed = 0,tesetFailed-ThisOperationCycle=0)。如果ECU不支持掉电顺序(即在关闭点火开关时立即关闭),则将无法检测到操作周期的结束。因此,在下一个操作周期开始时将pendingDTC设置为零也是有效的。
- DTCAging计数器在完成测试未失败的操作周期后递增。ttestNotCompleted-ThisOperationCycle = 0,tesetFailed = 0。
- DTCAging计数器继续递增,因为测试在这些操作周期中没有失败。tesetFailed = 0。
- 当完全满足老化标准时(例如,DTCAging计数器达到特定值),confirmedDTC 设置为零,DTC会从内存中清除掉。
- DTCAging计数器达到最大值(例如,40),此时confirmedDTC 被清除。
车辆制造商有责任指定testFailedSinceLastClear位是否通过老化标准或由于故障存储器溢出而重置。
6.工程师角度如何下手
应用层:
应用层做的事其实就相当于做一个判断,拿到需求,要知道这个故障在什么状况下才能报出来,什么时候故障消失。把这个逻辑实现出来就可以了。
if(10<voltage<18)
{
setevent(pass);
}
else
{
setevent(fail);
}
RTE层:
这一层主要就是做一个接口,设置DTC事件的接口,就是当应用层发生了故障,就会调用这个接口,这个接口连接着DEM模块,直接设置上这个DTC,其中DEM模块里就是DTC16进制的集合地。
底层:
这一层就是需要配置CDD文件,以及用达芬奇软件配置这个DTC的一些相关内容,其中包括什么时候才能确认这个DTC,什么时候才能老化这个DTC等等。
总结
仅供学习参考使用