一文掌握DTC

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个循环周期作为自恢复的条件。原因是,在一个相对较长的过程中,如果车辆没有发生这个故障,我们可以认为这个故障是一个偶发的现象,也可以认为现在的车辆处于一个相对稳定的状态。因而,可以将这个故障码清除

在这里插入图片描述
科普小知识提示:在解释协议定义的老化过程前,我们先来解释一下上图中各位的含义。

  1. DTCAging计数器在完成测试未失败的操作周期后递增,DTCAging计数器开始计数的条件是:testFailed=0,PendingDTC= 0,ComfiredDTC=1。
  2. pendingDTC=0的条件是在一个操作周期后测试完成且未失败(testNotCompleted-ThisOperationCycle = 0,tesetFailed = 0,tesetFailed-ThisOperationCycle=0)。如果ECU不支持掉电顺序(即在关闭点火开关时立即关闭),则将无法检测到操作周期的结束。因此,在下一个操作周期开始时将pendingDTC设置为零也是有效的。
  3. DTCAging计数器在完成测试未失败的操作周期后递增。ttestNotCompleted-ThisOperationCycle = 0,tesetFailed = 0。
  4. DTCAging计数器继续递增,因为测试在这些操作周期中没有失败。tesetFailed = 0。
  5. 当完全满足老化标准时(例如,DTCAging计数器达到特定值),confirmedDTC 设置为零,DTC会从内存中清除掉。
  6. DTCAging计数器达到最大值(例如,40),此时confirmedDTC 被清除。

车辆制造商有责任指定testFailedSinceLastClear位是否通过老化标准或由于故障存储器溢出而重置。

6.工程师角度如何下手

应用层:
应用层做的事其实就相当于做一个判断,拿到需求,要知道这个故障在什么状况下才能报出来,什么时候故障消失。把这个逻辑实现出来就可以了。
if(10<voltage<18)
{
setevent(DEM_EVENT_STATUS_PASSED);
}
else
{
setevent(DEM_EVENT_STATUS_FAILED);
}

RTE层:
这一层主要就是做一个接口,设置DTC事件的接口,就是当应用层发生了故障,就会调用这个接口,这个接口连接着DEM模块,直接设置上这个DTC,其中DEM模块里就是DTC16进制的集合地。

底层:
这一层就是需要配置CDD文件,以及用达芬奇软件配置这个DTC的一些相关内容,其中包括什么时候才能确认这个DTC,什么时候才能老化这个DTC等等。

总结

仅供学习参考使用

  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值