UDS诊断系列之十 DTC控制(85)服务

DTC控制服务的主要作用是控制DTC的状态更新。

一、响应规则

DTC=diagnostic trouble code,DTC的状态是故障信息中的一个字节,用来表示故障当前的状态是正在发生还是仅仅发生过等信息,具体含义在后面19服务章节会详细说明。
当服务端(ECU)接收到85服务后,如果控制信息是off,则服务端应该立即停止DTC的状态更新。即从此刻起,DTC的状态信息保持不变,无论是发生了新的故障,还是已有的故障有了新的状态,服务端的DTC数量、状态信息都不会更新。如果控制信息是on,那么如果先前是off,就立即恢复到正常的状态,如果先前是on,保持状态不变。
无论是on还是off,服务端在正确处理请求之后都要给出肯定响应,如果无法正确处理,需要给出否定响应并明确响应失败的NRC。
注意本服务是要求在非默认会话下支持的服务,所以如果是默认会话下是无法执行请求的,只能回复否定响应NRC7F。
本服务控制的DTC状态的更新,并不影响通过ClearDTCInformation(14)服务请求清除故障信息。

二、应用数据格式

1.请求报文

DTC控制服务的请求报文格式非常简单,一般只会用到SID和子功能DTCSettingType两个字节,后面的DTCSettingControlOptionRecord参数并不常用,ISO里列举的例子指出它可以用来表示被禁用的DTC有哪些,具体目前未遇到实际应用。
在这里插入图片描述

2.响应报文

DTC控制服务的响应报文也很简单,仅有两个字节,一个是响应的SID,另一个字节是子功能DTCSettingType,注意这里响应的子功能和请求的是一致的。
在这里插入图片描述

3.子功能

DTC控制服务的子功能叫DTCSettingType,只有两个,其余的都是保留值或可自定义的值,下表列出了常用的两个子功能和描述。

DTCSettingType描述
01on
服务端收到请求后恢复DTC的状态更新
02off
服务端收到请求后停止DTC的状态更新

有关NRC和报文示例比较简单,可直接参照ISO标准。

UDS诊断系列文章

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
这里是一个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总线发送响应消息。请注意,这只是一个简单的示例,实际的代码可能要更加复杂和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChenglimK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值