部分转自//https://zhuanlan.zhihu.com/p/35371763##
一、UDS的DTC分类说明
PCBU:Powertrain(动力系统)、chassis(地盘)、body(车身)、network(通信系统)
5位标准故障码,第1位是字母,后面4位是数字,如P0101。
第一位字母表示故障所属系统,我们把汽车系统分为四大类。分别是动力,底盘,车身,网络通信,分别用PCBU表示
第二位数字是0、1、2或3表示故障类型,意义如下:“0”代表SAE(美国汽车工程师协会)定义的通用故障码;“1”代表汽车厂家定义的扩展故障码;“2”或“3”表示预留故障码
第三位数字表示故障所属的子系统。例如,对于动力系统部分:该位“0”表示燃油和空气计量辅助排放控制整个系统, “1”表示燃油和空气计量系统;“2”表示燃油和空气计量系统(喷油器);“3”表示点火系统;“4”表示废气控制系统;“5”表示巡航、怠速控制系统;“6”表示与控制单元相关;“7”“8”表示变速箱系统等
最后两位数字指出了系统中出现故障的部件或部位
二、DTC状态位介绍
从汽车ECU中读取储存的DTC(故障码)时,除了故障码本身,还可以读出很多其他的信息,包括优先级、发生次数计数器、发生时的里程和时间,以及本文中所讲的状态位(DTC status )。
这个状态位包含1个byte,这里面的8个bit都有各自的含义,但是这8个 bit不一定都要使用,各个主机厂可以根据自己的需求使用其中的几个,当然也可以全部使用。下图是UDS对DTC status这8个bit的定义。
先弄清以下几个概念:
Test:是一种车载诊断软件算法,根据不同的测试周期,得出最后的测试结果:Pass or Failed;
Completed:“完成”表示测试能够确定当前操作周期是否存在故障(“完成”并不表示发生故障);
Operation Cycle:一个操作周期指监视器运行的开始和结束条件,在一个操作周期内,可能已完成若干个监视周期(无论其测试结果如何)。ECU可以支持多个操作周期,一个操作周期可以是ECU通电和断电之间或者点火打开和点火关闭之间的时间,也可以是ECU从网络唤醒到网络休眠的时间。
Pending:根据UDS规范解释,如果在当前或者上一个operation cycle中出现过具体某个DTC,pendingDTC=1。此时状态可以理解为一种中间状态(testerFailed和ConfirmedDTC之间)。
DTC status中8个状态bit的定义
bit 0 : testFailed
运行中的ECU,其内部检测DTC代码以OEM定义的周期循环执行,当达到相应的DTC触发条件,testFailed位被置1(e.g.在检测周期采样电压大于18 V)。
指示最近执行test的结果,test失败置1,但是它不一定被ECU存储到EEprom中,只有当bit2或bit3被置1时DTC才会被存储。test通过则置0,如果调用了14服务清除DTC的话,也需要重新置0。
bit 1 :testFailedThisOperationCycle
表示当前的operation cycle中出现过testFailed=1的状况,在前面说过operationcycle可以含有多个检测周期,只要有一个检测周期出现testFailed=1的情况,此bit置1。
这个bit用于标识某个DTC在当前的operation cycle中是否出现过testFailed置1的情况,即是否出现过错误。operation cycle的起始点是ECU通过网络管理唤醒到ECU通过网络管理进入睡眠,对于没有网络管理的ECU,这个起始点就是KL15通断。通过bit 0我们无法判断某个DTC是否出现过,比如,当前testFailed = 0, 说明当前这个DTC没有出错,如果testFailedThisOperationCycle = 1的话,就说明这个DTC在当前这个operation cycle中出过错,但是当前错误又消失了。
bit 2 : pendingDTC
如果在当前或者上一个operation cycle中出现过具体某个DTC,pendingDTC=1,在接下来的检测周期中如果故障不存在,pendingDTC重新置0。若接下来检测周期可以检测出此故障,那么confirmedDTC要被置1
根据规范的解释,pendingDTC = 1表示某个DTC在当前或者上一个operation cycle中是否出现过。pendingDTC位其实是位于testFailed和confirmedDTC之间的一个状态,有的DTC被确认的判定条件比较严苛,需要在多个operation cycle中出现才可以被判定为confirmed的状态,此时就需要借助于pendingDTC位了。pendingDTC = 1的时候,DTC就要被存储下来了,如果接下来的两个operation cycle中这个DTC都还存在,那么confirmedDTC就要置1了。如果当前operation cycle中,故障发生,pendingDTC = 1,但是在下一个operation cycle中,故障没有了,pendingDTC 仍然为 1,再下一个operation cycle中,故障仍然不存在,那么pendingDTC 就可以置0了。
bit 3 : confirmedDTC
当bit3置1时,说明故障已经发生了一段时间,也就是bit2至少有一次被置1了。需要注意的是,bit3置1的时候,DTC被存储在EEprom中,但并不代表现在故障还存在,所以可以理解为历史故障。在调用14服务清除DTC后需要置0
当confirmedDTC = 1时,则说明某个DTC已经被存储到ECU的non-volatile memory(掉电非易失内存)中,说明这个DTC曾经满足了被confirmed的条件。但是请注意,confirmedDTC = 1时,并不意味着当前这个DTC仍然出错,如果confirmedDTC = 1,但testFailed = 0,则说明这个DTC表示的故障目前已经消失了。将confirmedDTC 重新置0的方法只有删除DTC,UDS用0x14服务,OBD用0x04服务。
bit 4 : testNotCompletedSinceLastClear
bit位表示上次清除DTC服务后是否完整的执行了对某个具体DTC的测试
这个bit用于标识,自从上次调用了清理DTC的服务(UDS用0x14服务,OBD用0x04服务)之后,是否成功地执行了对某个DTC的测试(不管测试结果是什么,只关心是否测了)。因为很多DTC的测试也是需要满足某些边界条件的,并不是ECU上电就一定会对DTC进行检测。
testNotCompletedSinceLastClear = 1 : 自从清理DTC之后还没有完成过针对该DTC的测试。
testNotCompletedSinceLastClear = 0 : 自从清理DTC之后已经完成过针对该DTC的测试。
bit 5 : testFailedSinceLastClear
此bit位表示上次执行清除DTC后,对应DTC是否又出现过
该位表示在上次调用14服务清除后DTC后,若test DTC未进行测试或者测试了但结果是pass时置0,如果test运行完成并且返回结果为fails,那么该位置1。在调用14服务清除DTC后需要置0。bit4和bit5通常一起使用
这个位与bit 1 :testFailedThisOperationCycle有些类似,后者标识某个DTC在当前的operation cycle中是否出现过testFailed置1的情况,而testFailedSinceLastClear标识的是在上次执行过清理DTC之后某个DTC是否出过错。
testFailedSinceLastClear = 0 , 自从清理DTC之后该DTC没有出过错。
testFailedSinceLastClear = 1, 自从清理DTC之后该DTC出过至少一次错。
bit 6 : testNotCompletedThisOperationCycle
此bit位标识在当前operationCycle是否成功的执行了对应DTC的测试
该位表示在当前检测循环周期过程中DTC test是否完成,若完成了置0,未完成置1。在调用ClearDiagnosticDTC后需要置1
这个位与bit 4 : testNotCompletedSinceLastClear类似,后者标识自从上次调用了清理DTC的服务之后,是否成功地执行了对某个DTC的测试。而testNotCompletedThisOperationCycle则标识在当前operation cycle中是否成功地执行了对某个DTC的测试。
testNotCompletedThisOperationCycle = 1 : 在当前operation cycle中还没在完成过针对该DTC的测试。
testNotCompletedThisOperationCycle = 0 : 在当前operation cycle中已经完成过针对该DTC的测试。
bit 7 : warningIndicatorRequested
此bit位置1,表示当车辆发生了比较严重的DTC,会有相应的警告提示给驾驶员。警告指示可以是蜂鸣声、车载娱乐系统文字提示或者指示灯
该位报告警告指示,比如说仪表盘上的警示灯等。但不是所有的DTC都会有警告指示,如果没有和DTC相关的警告存在,该位应置0;如果该DTC有相关警告指示,bit3置1的时候,bit7也要置1。在调用14服务清除DTC后需要置0
某些比较严重的DTC会与用户可见的警告指示相关联,比如仪表上的报警灯,或者是文字,或者是声音。这个warningIndicatorRequested就用于此类DTC。
warningIndicatorRequested = 1 : ECU请求激活警告指示。
warningIndicatorRequested = 0: ECU不请求激活警告指示。
注意,如果这个DTC不支持警告指示,则这个位永远置0。
UDS协议对于以上全过程的示意图: