在汽车电子控制单元(ECU)的诊断系统中,UDS(Unified Diagnostic Services)协议ISO 14229定义的$19服务是DTC(Diagnostic Trouble Code)诊断功能的核心。这个服务就好比是汽车ECU的"故障档案管理员",它提供了完整的接口来查询和管理ECU中存储的所有故障信息。
$19服务包含5个子功能,构成了一个完整的DTC信息查询体系:
提示:任何支持DTC功能的ECU都必须实现$19服务,这是UDS协议的基本要求。在开发诊断功能时,$19服务通常是第一个需要完整实现的核心服务。
1901子功能就像是一个故障计数器,它根据诊断仪发送的状态掩码(DTCStatusMask),统计ECU中匹配该状态的DTC数量。这个功能通常用于快速判断ECU是否存在特定类型的故障。
请求报文格式:
code复制19 01 <DTCStatusMask>
其中DTCStatusMask是一个字节,每位代表不同的DTC状态条件。
正响应报文结构:
code复制59 01
<DTCStatusAvailabilityMask>
<DTCFormatIdentifier>
<DTCCountHigh>
<DTCCountLow>
关键字段说明:
在实际过滤时,ECU会进行如下计算:
code复制EffectiveMask = DTCStatusMask & DTCStatusAvailabilityMask
Match = (DTC.status & EffectiveMask) != 0
这个机制确保了:
1902子功能在1901的基础上更进一步,它不仅统计数量,还会返回所有匹配DTC的详细信息,包括:
请求格式:
code复制19 02 <DTCStatusMask>
正响应报文:
code复制59 02
<DTCStatusAvailabilityMask>
[DTC High][DTC Mid][DTC Low][StatusByte] * n
StatusByte的位定义如下:
1904子功能获取的是故障发生瞬间的"环境快照"(Snapshot),就像事故现场的监控录像。这些数据包括:
请求格式:
code复制19 04 <DTCH><DTCM><DTCL> <SnapshotRecordNumber>
其中RecordNumber为FF时返回所有快照。
正响应报文:
code复制59 04
DTC
Status
RecordNumber
NumberOfIdentifiers
DID1 + Data1
DID2 + Data2
...
快照数据必须采用DID(Data Identifier)+Data的结构,这是因为:
重要提示:开发时必须确保每个快照数据项都有对应的DID,否则诊断仪将无法解析数据内容。
1906子功能获取的是DTC的扩展数据,这些数据通常是:
与1904不同,1906的数据采用固定结构体格式,由RecordNumber决定数据结构。
请求:
code复制19 06 <DTCH><DTCM><DTCL> <ExtendedDataRecordNumber>
正响应:
code复制59 06
DTC
Status
RecordNumber #1
RecordData #1
RecordNumber #2
RecordData #2
...
常见的RecordNumber范围定义:
190A子功能返回ECU支持的所有DTC列表,包括:
这个功能主要用于:
请求非常简单:
code复制19 0A
正响应:
code复制59 0A
<DTCStatusAvailabilityMask>
[DTC + Status] * all
在实际开发中,状态掩码的处理有几个关键点:
对于快照数据的实现:
扩展数据的设计建议:
$19服务可能涉及大量数据处理:
在实际项目中,我发现$19服务的实现质量直接影响整个诊断系统的可靠性。特别是在处理快照数据和扩展数据时,清晰的数据定义和严格的格式检查可以避免后期大量的兼容性问题。另外,对于状态掩码的处理要特别注意边界条件,这是很多初期实现容易出错的地方。