1. 介绍
UDS协议即ISO14229,全称Unified Diagnostic Services,统一诊断服务;
UDS诊断服务的主要应用包括诊断/通讯管理、数据处理、故障信息读取、在线编程及功能/元件测试等。
UDS采用的是Client/Server的模式,基本是Client发送一个请求报文,Server会根据请求报文做出相应的响应。Client一般情况下是指测试仪(Tester),发送诊断请求;Server一般是指电控单元(诊断响应的提供者),发送诊断响应。
UDS不属于AUTOSAR,他们之间的关系,只是AUTOSAR提供了一些接口,可以与UDS进行集成;
在AUTOSAR架构中,应用层(Application Layer)提供了一些标准的应用程序接口(API),可以与诊断协议进行集成,这些诊断协议之中就包括UDS协议。而这些接口中也包含了DCM与DEM,虽然这两个名字与UDS中的类似,但是它们的实现方式与作用,有一些不同:
UDS协议中的DCM和DEM是用于实现通信管理和故障管理的两个服务。
AUTOSAR架构中的DCM和DEM是两个具体的模块,分别用于实现车辆诊断系统中的通信管理和故障管理功能,DCM和DEM还可以与其他模块和服务进行集成,例如CanTp、PduR等,实现更加复杂的车辆诊断和通信功能。
DCM和DEM是UDS协议栈的两个组成部分,属于应用层;应用层是整个协议栈的核心部分,它定义了大部分的诊断服务和数据标识符,包括DEM和DCM服务;
2. 服务种类
诊断单元 | 服务种类 | 服务说明 | 服务Id |
---|---|---|---|
诊断和通信管理功能单元 | DiagnosticSessionControl | 客户端请求控制和服务器的诊断会话 | 0x10 |
ECUReset | 客户端请求服务器执行重置 | 0x11 | |
SecurityAccess | 客户端请求解锁受保护的服务器 | 0x27 | |
CommunicationControl | 客户端控制服务器通信参数的设置 | 0x28 | |
Authentication | 验证客户端身份合法性 | 0x29 | |
TesterPresent | 客户端向服务器指示他仍然存在 | 0x3E | |
SecuredDataTransmission | 客户端使用该服务在扩展数据链路安全性的情况下执行数据传输 | 0x84 | |
ControlDTCSetting | 客户端控制服务器中DTC的设置 | 0x85 | |
ResponseOnEvent | 客户端请求设置和控制服务器中的事件机制 | 0x86 | |
LinkControl | 客户端请求控制通信波特率 | 0x87 | |
数据传输功能单元 | ReadDataByIdentifier | 客户端请求读取由提供的DataIdentifier标识DID记录的当前值 | 0x22 |
ReadMemoryByAddress | 客户端请求读取所提供内存范围的当前值 | 0x23 | |
ReadScalingDataByIdentifier | 客户端请求读取由提供的DataIdentifier标识的DID记录的伸缩信息 | 0x24 | |
ReadDataByPeriodicIdentifier | 客户端请求调度服务器中的数据进行周期性传输 | 0x2A | |
DynamicallyDefineDataIdentifier | 客户端请求动态定义的数据标识符,这些标识符由0x22服务读取 | 0x2C | |
WriteDataByIdentifier | 客户端请求写入由提供的DataIdentifier标识DID指定的记录 | 0x2E | |
WriteMemoryByAddress | 客户端请求覆盖提供的内存范围 | 0x3D | |
已存储数据传输功能单元 | ClearDiagnosticInformation | 允许客户端清除服务器上的诊断信息 | 0x14 |
ReadDTCInformation | 允许客户端向服务器请求诊断信息 | 0x19 | |
输入输出控制功能单元 | InputOutputControlByIdentifier | 客户端请求控制特定服务器的输入、输出 | 0x2F |
例程控制功能单元 | RoutineControl | 客户端请求启动、停止服务器中的例程或请求例程结果 | 0x31 |
上传和下载功能单元 | RequestDownload | 客户端请求从客户端到服务器传输数据的协商 | 0x34 |
RequestUpload | 客户端请求从服务器到客户端传输数据的协商 | 0x35 | |
TransferData | 客户端将数据传输到服务器或者服务器将数据传输到客户端 | 0x36 | |
RequestTransferExit | 客户端请求中止传输数据 | 0x37 | |
RequestFileTransfer | 客户端请求服务端和客户端之间的文件传输协议 | 0x38 |
3. 通信方式
UDS诊断是基于问答形式实现,"请求"由client端发送给server
3.1 request
-
[SID] + [Sub-Function]
-
[SID] + [DID]
-
[SID] + [Sub-Function] + [DID]
3.2 positive response
-
[SID + 40] + [Sub-Function]
-
[SID + 40] + [DID]
-
[SID + 40] + [Sub-Function] + [DID]
3.3 negative response:
-
[0x7F] + [SID] +[NRC]
3.4 NRC:Negative Response Code(否定响应码)
否定响应码 | 说明 | Description |
---|---|---|
0x10 | 该否定响应不是协议里已定义的 | General Reject |
0x11 | 请求的服务不支持 | Service Not Support |
0x12 | ECU不支持当前请求的子功能 | Sub-function Not Support |
0x13 | 请求报文的长度和格式不正确 | Incorrect Message Length Or Invalid Format |
0x22 | 先决条件不满足 | Conditions Not Correct |
0x24 | 请求报文的顺序不正确 | Request Sequence Error |
0x31 | 参数超出范围/数据ID不支持 | Request Out Of Range |
0x33 | 不满足安全策略,请先解锁 | Security Access Denied |
0x35 | 密钥不匹配(27服务) | Invalid Key |
0x36 | 尝试解锁次数已达上限 | Exceed Number Of Attempts |
0x37 | 超时时间未到 | Required Time Delay Not Expired |
0x70 | 不允许上传/下载 | Upload/Download Not Accepted |
0x71 | 数据传输中止 | Transfer Data Suspended |
0x72 | 擦除或烧写内存时错误 | General Programming Failure |
0x73 | 块序列计数错误 | Wrong Block Sequence Counter |
0x78 | 已收到请求,但会晚些响应 | Request Correctly Received - Response Pending |
0x7E | 当前会话下,该子功能不支持 | Sub-function Not Supported In Active Session |
0x7F | 当前会话下,该服务不支持 | Service Not Supported In Active Session |
0x92 | 电压过高 | Voltage Too High |
0x93 | 电压过低 | Voltage Too Low |
-
优先级:0x11 > 0x7F > 0x13 > 0x12 > 0x7E > 0x33 > 0x24 > 0x31 > 0x22 > 0x78
-
区别:
-
0x11和0x7F的区别:都是服务不支持,但0x11是整个服务不支持;而0x7F是在某个会话不支持,在其他服务下是支持的。
-
0x11和0x12的区别:0x11是服务不支持,0x12是子功能不支持。例子:19服务有很多子功能,假设客户不支持0A子功能,那执行19 0A就会回复0x12;假设客户需求不支持23服务,那执行23服务就回复0x11,而且不管你后面传的子功能参数对不对,长度对不对,都是回复0x11
-
0x12和0x7E的区别:0x12是整个子功能不支持,而0x7E是在当前会话不支持。例子: 19服务有很多子功能,假设客户需求不支持0A子功能,那执行19 0A就会回复0x12;假设10 02服务只在扩展会话下支持,但在默认会话下执行了,就会回复0x7E。
-
0x7F和0x7E的区别: 0x7F是当前会话下服务不支持,0x7E是当前会话下子功能不支持。
-
4. 常用服务介绍
操作 | Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 | 实体 |
---|---|---|---|---|---|---|---|---|---|
跳转到默认会话 | 02 | 10 | 01 | 55 | 55 | 55 | 55 | 55 | Tester |
跳转到编程会话 | 02 | 10 | 02 | 55 | 55 | 55 | 55 | 55 | Tester |
跳转到扩展会话 | 02 | 10 | 03 | 55 | 55 | 55 | 55 | 55 | Tester |
10服务正响应 | 06 | 50 | 03 | 00 | 32 | 00 | C8 | AA | ECU |
10服务子功能不支持 | 03 | 7F | 10 | 12 | AA | AA | AA | AA | ECU |
硬件复位 | 02 | 11 | 01 | 55 | 55 | 55 | 55 | 55 | Tester |
软件复位 | 02 | 11 | 03 | 55 | 55 | 55 | 55 | 55 | Tester |
请求种子 | 02 | 27 | 01 | 55 | 55 | 55 | 55 | 55 | Tester |
回复种子 | 06 | 67 | 01 | B1 | B2 | B3 | B4 | ECU | |
发送密钥 | 06 | 27 | 02 | C1 | C2 | C3 | C4 | 55 | Tester |
密钥不正确 | 03 | 7F | 27 | 35 | AA | AA | AA | AA | ECU |
启用Rx和Tx应用报文 | 03 | 28 | 00 | 01 | 55 | 55 | 55 | 55 | Tester |
启用Rx且启用Tx网络报文 | 03 | 28 | 01 | 02 | 55 | 55 | 55 | 55 | Tester |
禁用Rx和Tx所有报文 | 03 | 28 | 03 | 03 | 55 | 55 | 55 | 55 | Tester |
保持非默认会话_勿回 | 02 | 3E | 80 | 55 | 55 | 55 | 55 | 55 | Tester |
开启DTC记录 | 02 | 85 | 01 | 55 | 55 | 55 | 55 | 55 | Tester |
关闭DTC记录 | 02 | 85 | 02 | 55 | 55 | 55 | 55 | 55 | Tester |
关闭DTC记录正响应 | 02 | C5 | 02 | AA | AA | AA | AA | AA | ECU |
读取当前诊断会话状态 | 03 | 22 | F1 | 86 | 55 | 55 | 55 | 55 | Tester |
报告当前诊断会话状态 | 04 | 62 | F1 | 86 | 03 | AA | AA | AA | ECU |
写入VIN码(17字节) | 10 | 14 | 2E | F1 | 90 | 01 | 02 | 03 | Tester |
21 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | Tester | |
22 | 0B | 0C | 0D | 0E | 0F | 10 | 11 | Tester | |
清除全部DTC | 04 | 14 | FF | FF | FF | 55 | 55 | 55 | Tester |
按状态掩码读取DTC数量 | 03 | 19 | 01 | 09 | 55 | 55 | 55 | 55 | Tester |
按状态掩码报告DTC | 03 | 19 | 02 | 09 | 55 | 55 | 55 | 55 | Tester |
按DTC号报告DTC快照信息 | 06 | 19 | 04 | C1 | 23 | 45 | 88 | 55 | Tester |
报告所有支持的DTC | 02 | 19 | 0A | 55 | 55 | 55 | 55 | 55 | Tester |
控制权交还ECU | 04 | 2F | D1 | D2 | 00 | 55 | 55 | 55 | Tester |
暂时取得控制权_开 | 05 | 2F | D1 | D2 | 03 | 01 | 55 | 55 | Tester |
暂时取得控制权_关 | 05 | 2F | D1 | D2 | 03 | 00 | 55 | 55 | Tester |
启动例程 | 04 | 31 | 01 | FF | 01 | 55 | 55 | 55 | Tester |
请求下载 | 10 | 0B | 34 | 00 | 44 | A1 | A2 | A3 | Tester |
21 | A4 | 00 | 00 | 00 | 2F | 55 | 55 | Tester | |
请求下载服务正响应 | 04 | 74 | 20 | FF | FF | AA | AA | AA | ECU |
传输数据 | 11 | 2B | 36 | 01 | D1 | D2 | D3 | D4 | Tester |
请求退出传输 | 01 | 37 | 55 | 55 | 55 | 55 | 55 | 55 | Tester |
5. 快照数据
-
组成
-
故障码(DTC): 指示与故障相关的特定代码。
-
故障数据记录数量: 表示与故障相关的数据记录数量。
-
故障数据记录: 每个故障数据记录可能包括以下内容:
-
数据记录标识: 表示每个数据记录的唯一标识。
-
数据记录长度: 表示数据记录的长度,即包含的数据字节数。
-
数据: 包含与故障相关的实际数据。这可能是传感器数据、状态信息、错误码等。
-
数据标识: 对数据的类型和含义进行标识,以便诊断设备和技术人员可以正确地解释和使用数据。
-
数据单位: 表示数据的单位,例如温度的单位可以是摄氏度或华氏度。
-
时间戳: 表示数据记录的时间戳,用于确定数据记录的时间。
-
数据状态: 表示数据的状态,例如数据的有效性、可靠性等。
-
-
5. DID
-
说明
代表着特定的数据标识符。DID用于标识和获取ECU中的特定参数数据,如传感器数据、状态信息等。通过使用DID,诊断工具可以准确地获取所需的数据,从而帮助诊断人员更好地了解车辆的状态和性能。
-
组成
-
标识符:标识符是一个唯一的数字或字母组合,用于标识特定的数据项。不同的车辆制造商和标准组织可能会定义自己的标识符格式和规范。
-
参数:参数是与标识符相关联的具体数据项。它可以是传感器数据、状态信息、故障码等。参数的具体含义和格式取决于标识符的定义和上下文。
-
-
应用
-
读取传感器数据:通过特定的DID,诊断工具可以读取车辆各个传感器的数据,如发动机冷却液温度、车速、油压等。这些传感器数据对于故障诊断和性能评估非常重要。
-
检查ECU状态:DID可以用于检查车辆的电子控制单元(ECU)的状态和健康状况。通过读取特定的DID,诊断工具可以获取ECU的工作状态、故障码和运行参数,以评估ECU的性能和健康程度。
-
读取故障码:DID可以用于读取车辆的故障码,这些故障码记录了车辆系统中的问题和故障。通过读取故障码,诊断工具可以了解车辆存在的问题,并进行相应的故障排查和修复。
-
清除故障码:诊断工具可以使用特定的DID来清除车辆的故障码。一旦故障得到修复,清除故障码可以重置车辆系统,并确认故障已被解决。
-
读取冻结帧数据:通过特定的DID,诊断工具可以读取车辆在特定事件发生时记录的冻结帧数据。这些数据可以帮助诊断人员了解事件发生时车辆各个系统的状态和参数,从而更好地了解故障的原因。
-
-
服务
-
读取数据服务(Read Data Service) - SID: 0x22
-
读取扩展数据服务(Read Extended Data Service) - SID: 0x23
-
读取数据标识符列表服务(Read Data Identifier List Service) - SID: 0x2C
-