UDS(ISO14229 - 1)-0x19服务(DTC信息读取)

UDS(ISO14229 - 1)-0x19服务(DTC信息读取)

服务描述

19服务允许客户端从任何服务器或车辆内的服务器组,读取存储在服务器中的诊断故障代码 (Diagnostic Trouble Code,DTC) 信息的状态。除非特定子功能另有要求,否则服务器应返回所有DTC信息(例如,与排放相关和非排放相关)。

由于19服务的子服务太多了,所以在这里只讲几个我们常用的子服务:
先看一下服务的请求格式:
在这里插入图片描述

sub-function = 0x01,检索与客户端定义的 DTC 状态掩码匹配的 DTC 数量

如果你不知道DTC以及不清楚DTC的状态掩码是什么的话,建议先阅读我写的另一篇文章,汽车诊断中常说的DTC是什么?这里详细讲述了DTC以及DTC的状态掩码信息。客户端可以通过发送对此服务的请求,并将子服务设置为0x01,来检索与客户端定义的状态掩码匹配的 DTC 数的计数。

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
00000001

例如:我想请求与以上掩码一致的DTC的数量,即目前Test Failed的DTC有几个,则可以发送一条请求。
REQ:0x19 0x010x01 0x00 0x00 0x00 0x00
则可能会得到一条Positive的回应:
RESP:0x49 0x01 0x12 0x00 0x00 0x00 0x00

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
00001001

例如:我想请求与以上掩码一致的DTC的数量,即目前Test
Failed的DTC或者是(这里是或集)Confirmed的DTC有几个,则可以发送一条请求。
REQ:0x19 0x01 0x09 0x00 0x00 0x00 0x00
则可能会得到一条Positive的回应:
RESP:0x59 0x01 0x1 0x00 0x00 0x00 0x00

PS:如果你对服务的请求和回应格式不太清楚,可以参考这一篇文章UDS 之服务描述约定

sub-function = 0x02,检索与客户端定义的 DTC 状态掩码匹配的所有 DTC 的列表

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
00001001

例如:我想请求与以上掩码一致的DTC列表,即目前Test Failed的DTC有哪些,具体的是哪几个,则可以发送一条请求
REQ:0x19 0x02 0x09 0x00 0x00 0x00 0x00
则可能会得到一条Positive的回应:
RESP:0x59 0x02 0x16 0x03 0x11 0x16 0x03

回复后面跟着的 0x16 0x03 0x11则为具体的故障码编号,如果有对应的CDD文件做解析,则可以很方便的通过CAN工具来看到具体的故障信息,如下图所示:
在这里插入图片描述

sub-function = 0x04,检索与客户端定义的 DTC 关联的DTC Snapshot 数据(有时称为冻结帧,freeze frames)通过DTC。

DTC Snapshot是与 DTC 关联的特定数据记录,存储在服务器的内存中。DTC Snapshot的典型用途是在检测到系统故障时存储数据。DTC Snapshot将充当系统故障发生时的数据值快照,存储在DTC Snapshot中的数据参数应与DTC相关联。
在这里插入图片描述

例如:我想请求DTC 16a300第1次发生时的Snapshot 数据(DTCSnapshotRecordNumber = 0x01),则可以发送一条请求。
REQ:0x19 0x04 0x16 0xa3 0x00 0x01 0x00

在这里插入图片描述

则可能会得到多条Positive的回应(这里如果数据很多超过八个字节,则会有多帧的形式回复):
RESP:59 04 16 a3 00 AF 01 10 01 2C 03 FF
DTCAndStatusRecord:
1)DTC:16 a3 00
2)DTC Status :AF(八位:10101111)
DTCySnapshotRecordNumber:
1)DTCSnapshotRecordNumber :0x01
2)DTCSnapshotRecordNumberofID:0x10(记录的snapshot数量是16个)
3)DTCSnapshotRecordData:0x012C(snapshot编号是012c)
4)DTCSnapshotRecordValue:0x03FF (012csnapshot的值)
5)DTCSnapshotRecordData:…
6)DTCSnapshotRecordValue:…

sub-function = 0x06,reportDTCExtDataRecordByDTCNumber,检索与客户端定义的 DTC 关联的Extended 数据(即扩展数据,例如故障发生的次数等)通过DTC。

DTC Snapshot是与 DTC 关联的特定数据记录,存储在服务器的内存中。DTC Snapshot的典型用途是在检测到系统故障时存储数据。DTC Snapshot将充当系统故障发生时的数据值快照,存储在DTC Snapshot中的数据参数应与DTC相关联。
在这里插入图片描述

例如:我想请求DTC 16a300的Extended 数据,则可以发送一条请求。
REQ:0x19 0x06 0x16 0xa3 0x00 0x00 0x00

在这里插入图片描述

则可能会得到一条Positive的回应(这里如果数据很多超过八个字节,则会有多帧的形式回复):
RESP:59 06 16 a3 00 AF 01 01 00
DTCAndStatusRecord:
1)DTC:16 a3 00
2)DTC Status :AF(八位:10101111)
DTCExtDataRecordNumber: 01
DTCExtDataRecord:
1)OCC :0x01
2)aging Count: 0x00
3)…

sub-function = 0x0A,reportSupportedDTC,检索服务器支持的所有 DTC 的状态。

DTC Snapshot是与 DTC 关联的特定数据记录,存储在服务器的内存中。DTC Snapshot的典型用途是在检测到系统故障时存储数据。DTC Snapshot将充当系统故障发生时的数据值快照,存储在DTC Snapshot中的数据参数应与DTC相关联。
在这里插入图片描述

例如:我想请求DTC 16a300的Snapshot 数据,则可以发送一条请求。
REQ:0x19 0x0A 0x00 0x00 0x00 0x00 0x00

在这里插入图片描述

则可能会得到一条Positive的回应:
59 0A 7F 12 34 56 24 23 45 05 00 AB CD 01 2F
其中包含的DTC为:123456,234505,ABCD01它们对应的状态掩码为:24,00,2F

在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里是一个UDS诊断DTC服务的代码示例: ```c++ // 定义DTC结构体 typedef struct { uint16_t dtc_code; uint8_t dtc_status; uint8_t dtc_severity; uint8_t dtc_occurrence; } dtc_t; // DTC服务处理函数 void handle_dtc_service(uint8_t* data, uint16_t length) { // 读取DTC请求数据 uint8_t sub_function = data[1]; uint8_t dtc_status_mask = data[2]; uint8_t dtc_severity_mask = data[3]; uint8_t dtc_occurrence_mask = data[4]; // 模拟检测到的DTC列表 dtc_t dtc_list[] = { {0x1234, 0x01, 0x02, 0x01}, {0x5678, 0x01, 0x06, 0x01}, {0x9abc, 0x01, 0x04, 0x01} }; uint8_t num_dtcs = sizeof(dtc_list) / sizeof(dtc_t); // 构造DTC响应数据 uint8_t response_data[8 + num_dtcs * 4]; response_data[0] = 0x50; response_data[1] = sub_function; response_data[2] = num_dtcs; for (int i = 0; i < num_dtcs; i++) { dtc_t dtc = dtc_list[i]; if ((dtc_status_mask & dtc.dtc_status) && (dtc_severity_mask & dtc.dtc_severity) && (dtc_occurrence_mask & dtc.dtc_occurrence)) { response_data[3 + i * 4] = dtc.dtc_code >> 8; response_data[4 + i * 4] = dtc.dtc_code & 0xff; response_data[5 + i * 4] = dtc.dtc_status; response_data[6 + i * 4] = dtc.dtc_severity; response_data[7 + i * 4] = dtc.dtc_occurrence; } } // 发送DTC响应数据 send_can_message(0x7df, response_data, sizeof(response_data)); } ``` 这段代码演示了如何处理UDS诊断DTC服务请求。当收到该请求时,函数会模拟检测出几个DTC,并根据请求参数构造响应数据。最终,函数会通过CAN总线发送响应消息。请注意,这只是一个简单的示例,实际的代码可能要更加复杂和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值