简述
UDS是汽车诊断领域广泛采用的一种标准化协议,它定义了一系列的服务功能,用于实现对车辆电子控制单元的诊断、 编程和通信。本质上是一种定向通讯,是一种交互协议(Request/Respone)。本文参照ISO-14229整理,如有异议,请指正。
诊断服务
每种服务都有自己独立的SID(Service Identifier)。
SID处于应用层数据的第一个字节。
Tester数据发送格式:帧类型+SID+子功能(如有)+帧数据
Tester发给ECU的数据,都应该有响应。
- 正响应:首字节回复(请求SID+0x40),其他字节根据服务返回。例如,请求0x10,正响应为0x50
- 负响应:首字节回复0x7F,第二字节回复发送的SID,第三字节为NRC(否定响应码—即否定原因)
0x10 诊断会话控制
10服务称为“Session Control”,主要用于管理诊断会话的建议、维持和通信。
其他诊断服务都要基于会话上再进行操作。
SID | 子功能 | 功能说明 | 发送数据 | 响应数据 |
10 | 01 | 默认会话:适用于一般的读写数据、执行诊断测试等功能,不会保持状态信息,每次请求都是独立处理的。 | 10 01 | 正响应:50 01 ... 负响应:7F 10 NRC ... |
10 | 02 | 编程会话:适用于对ECU固件更新或参数刷写等操作。通常要求更高的数据完整性和一致性保障,可能包括数据块传输确认,错误检测与恢复机制等。 | 10 02 | 正响应:50 02 ... 负响应:7F 10 NRC ... |
10 | 03 | 扩展诊断会话:适用于更高级的诊断功能,如访问受保护的数据区域、执行安全相关的诊断操作等。 | 10 03 | 正响应:50 03 ... 负响应:7F 10 NRC ... |
10 | 04 | 安全访问会话:某些敏感数据操作(如访问加密数据、更改安全相关设置等)需要先通过安全访问会话获取必要权限。该模式下,诊断工具需按照特定算法或协议与ECU交换密钥或密码以获得访问权限。 | 10 04 | 正响应:50 04 ... 负响应:7F 10 NRC ... |
举栗子:如果我们想要测试基本诊断功能是否能用,我们可以发送1001,如回复:5001则可用,如回复7F则不可用。
0x11 ECU重置
通过诊断接口触发ECU进行不同类型的复位,以便在特定情况下恢复ECU至某种已知的初始状态。复位操作包括硬件重启、模拟电源键操作、软件级别的重置,或者针对特定供电模式的ECU执行快速下电休眠。
SID | 子功能 | 功能说明 | 发送数据 | 响应数据 |
11 | 01 | 硬件复位:相当于断开ECU电源再重新上电,实现最彻底的复位效果,常用于软件更新后的重启。 | 11 01 | 正响应:51 01 ... 负响应:7F 11 NRC码 ... |
11 | 02 | 钥匙复位:模拟要是从“关闭”状态切换到“开启”的过程,可能包括电源管理相关的初始化序列。 | 11 02 | 正响应:51 02 ... 负响应:7F 11 NRC码 .. |
11 | 03 | 软件复位:不涉及硬件层面的断电,而是通过软件命令重置部分或全部内部状态,可能保留部分数据不变,适用于不需要完全初始化的情况。 | 11 03 | 正响应:51 03 ... 负响应:7F 11 NRC码 .. |
11 | 04 | 启用快速断电:仅适用于特定ECU,用于快速进入休眠模式以节省能源。 | 11 04 | 正响应:51 04 ... 负响应:7F 11 NRC码 .. |
11 | 05 | 禁用快速断电: | 11 05 | 正响应:51 04 ... |
举例子:如果我们想让ECU硬件断电重启,我们应该先发送1004(假设11 01在安全会话中可用),再发送1101,如回复51 01 ...则表示执行成功,如回复7F 11 33...则表示重置失败,33是NRC码,失败原因是Server在发生复位前处于security lock状态.
0x14 清除DTC
用于清除ECU内部存储的诊断故障信息,这些信息通常包括:
- 故障诊断码:标识特定故障条件的独特代码,反映了车辆系统或组件的异常状态。
- 故障记录数据:故障发生时记录的系统状态数据,如传感器值,控制模块状态等,用于辅助故障分析;
- 其他诊断相关信息:可能还包括故障计数器、连续监控数据等与故障诊断相关的数据。
使用场景:
- 模拟故障注入(开路、断路、接地)之前,需要先清除历史DTC记录,在用19 02 读取当前存在的故障码;
- ECU进行程序刷写后,使用14清除故障码,然后读取DTC,确保程序功能能正常运行;
请求格式:
发送数据:14 XX XX XX
正响应:54 00 00 00
负响应:7F 14 NRC
/*
1.可以清除一组DTC,也可以清除某个单个的DTC
2.14 是SID,服务ID
3.XX XX XX 是三个字节的值,可以表示单个DTC或者一组DTC(比如动力总成、车身、底盘等)
*/
举例子:
- 清除所有DTC信息:14 FF FF FF
- 清除排放组相关的DTC(FF FF 33):14 FF FF 33
备注:
14服务通常需要诊断会话期间具有足够的访问权限才能执行,因为清除诊断信息可能影响故障诊断和维修过程。
0x19 读取DTC
主要用于从ECU中读取与故障诊断相关的数据,尤其是故障诊断码(Diagnostic Trouble Codes, DTCs)及其相关信息。
SID | 子功能 | 功能说明 | 发送数据 | 响应数据 |
19 | 01 | reportNumberOfDTCByStatusMask:根据DTC状态掩码查找匹配的DTC数量 | 19 01 状态掩码 | 正响应:19 01 状态掩码 数量 ... 负响应:7F 19 NRC ... |
19 | 02 | reportDTCByStatusMask:根据DTC状态掩码获取DTC状态 | 19 02 状态掩码 | |
19 | 04 | reportDTCSnapshotRecordByDTCNumber:根据提供的冻结帧记录号,获取DTC和DTC对应的冻结帧数据 | 19 04 DTCMaskRecord SnapshotRecordNumber | 正响应:19 04 DTCMaskRecord... 负响应:7F 19 NRC ... |
19 | 06 | reportDTCExtDataRecordByDTCNumber:根据DTC值和扩展数据记录号,获取DTC和DTC对应的扩展数据 | 19 06 DTCMaskRecord DTCExtDataRecordNumber | 正响应:19 06 DTCMaskRecord DTCExtDataRecordNumber ... 负响应:7F 19 NRC . |
19 | 0A | reportSupportedDTC:获取支持的所有DTC的状态 | 19 0A |
举例子:
需求转向灯故障,DTC为C1 40 41. 扩展数据中01为故障发生次数
- 读取转向灯故障发生时的快照信息: 请求报文应为 19 04 C1 40 41 FF ( FF代表读取所有快照数据);
- 查询转向灯故障发生次数: 请求报文应为 19 06 C1 40 41 01
DTC状态位定义:
-
Test Failed (TF) / Test Failed Bit (bit 0):
表示在最近一次测试循环中,相关故障检测路径的结果为失败。当检测到故障条件时,此位被置1,表示当前存在故障。 -
Test Failed This Operation Cycle (TFTOC) / Test Failed This Ignition Cycle (TFTIC) (bit 1):
表示故障在当前运行周期(如发动机起动后的运行周期或车辆行驶循环)首次被检测到。此位用于区分新出现的故障与已知的持续性故障。 -
Pending DTC (PDTC) (bit 2):
表示故障尚未满足故障确认条件,但已经发生了多次。通常,一个故障必须重复出现若干次(如连续几个运行周期)才会被认为是稳定的故障,并从“Pending”状态变为“Confirmed”。 -
Confirmed DTC (bit 3):
表示故障已经被确认为稳定存在的问题。这意味着故障检测条件在多个连续的测试周期内都被满足,达到了OEM设定的确认阈值。此位通常在故障被确认后立即设置,并在故障被清除或不再满足故障条件时清除。 -
Previously Active DTC (bit 4):
表示故障在过去曾处于激活状态(即Test Failed位为1),但现在已不再存在。此位用于记录故障的历史信息,有助于诊断已修复或暂时消失的故障。 -
Permanent / Continuous DTC (bit 5):
表示故障为永久性或持续存在,即使故障条件不再满足,故障码也不会自动清除,除非通过诊断工具手动清除。这种状态通常用于严重故障或需要维修人员特别注意的问题。 -
** MIL Requested On (bit 6)**:
表示故障严重到足以触发故障指示灯(Malfunction Indicator Lamp, MIL,即“检查引擎”灯)点亮。ECU会根据故障的严重性和/或OEM的策略决定是否请求点亮MIL。 -
** MIL Requested Off (bit 7)**:
表示故障已得到处理或不再满足故障条件,ECU请求关闭MIL。实际MIL是否熄灭还可能受其他因素影响,如是否有其他未解决的严重故障。
0x22 按标识符读数据
主要用于Client向ECU通过DID方式读取相关数据。这些数据可以是输入输出的数字信号、模拟信号、内部数据以及其他的系统状态信息。
使用场景:
- 读取ECU固件版本信息,如序列号、版本号、供应商信息等;
- 车辆参数:车辆识别号码VIN、车速、发送机转速、油压、电池电压等实时运行数据或静态配置数据;
- 标定成功后读取内部标定结果,用于调整控制系统的行为;
- 读取当前ECU所处在的Session、冻结帧数据、故障计数器、内部状态、Snapshot Data;
请求格式:
22 [DID1] [DID2] ... [DIDn] [Optional Length]
常见DID:
DID Number(HEX) | 说明 |
0100-A5FF,A800-ACFF,B000-B1FF,C000-C2FF,CF00-EFFF,F010-F0FF | 主机厂推荐使用的DID范围 |
F1 86 | 当前激活的Session |
F1 8C | ECU序列号 |
F1 90 | VIN码 |
F1 93 | 供应商硬件版本号 |
F1 95 | 供应商软件版本号 |
F1 9D | ECU安装日期 |
FD00-FEFF | 供应商推荐使用的DID范围 |
举例子:
0x23 按地址读取内存
0x24 按标识符读取换算数据
0x27 安全访问
核心目标是实施访问控制,防止未经授权的诊断操作对ECU及相关系统造成潜在风险。通过安全访问过程,诊断工具需证明其具有正确的权限,才能获得对特定安全等级资源的访问权。
工作原理:基于种子与密钥的关系实现安全访问。
工作流程:
- 请求种子;
- 计算密钥;
- 提交密钥;
- 响应与授权;
应用场景:
- 操控:输入输出控制,例程控制服务...
- 数据写入:烧录程序、数据上传/下载、产线数据刷写...
- 数据读取:某些敏感数据读取也需要通过安全访问...
SID | 子功能 | 功能说明 | 发送数据 | 响应数据 |
27 | 01 | 请求种子:请求随机种子用以计算密钥; | 27 01 | 正响应:67 01 ... 负响应:7F 27 NRC码 ... |
27 | 02 | 发送密钥:得到密钥后需要发送密钥以获得对应权限; | 27 02 | 正响应:67 02 ... 负响应:7F 27 NRC码 ... |
27 | 03、05、07~41 | 主机厂定义的不同安全等级的请求种子 | ||
27 | 04、06、08~42 | 主机厂定义的不同安全等级的发送密钥 |
0x28 通信控制
0x2A 按周期性标识符读取数据
0x2C 动态定义数据标识符
0x2E 按标识符写数据
0x2F 输入输出控制
0x3D 受保护的数据传输
0x31 例程控制
0x34 请求下载
0x35 请求上传
0x36 传输数据
0x37 请求传输终止
0x38 请求文件传输
0x3E 测试仪保活
主要用于保持诊断会话的活跃状态,确保诊断工具与被测ECU之间的通信连接不被ECU自动断开或返回到默认会话状态。
使用方法:
- 启动非默认会话:先发送1002/1003/1004启动所需的非默认会话;
- 启用3E服务:定时发送服务3E请求帧(【可选】请求中可以包含0x80抑制肯定响应用以减少通信负载);
- 执行诊断任务:保持3E服务的同时,执行所需的诊断擦偶哦,如读取数据、编程、监控等;
- 保持会话活跃:确保3E周期性持续发送,防止会话超时;
- 结束会话:当任务完成或切换回默认会话时,停止发送3E请求,并通过10服务关闭当前默认会话。
SID | 子功能 | 功能说明 | 发送数据 | 响应数据 |
3E | 00 | 会话保持 | 3E | 正响应:7E 00 ... 负响应:7F 3E ... |
3E | 80 | 会话保持(抑制正响应) | 3E 80 | 正响应:无回复(减少通信负载) 负响应:7F 3E ... |
0x83 访问计时参数
0x84 受保护的数据传输
0x85 控制DTC设置
主要用于管理ECU中故障诊断码的状态更新,在特定诊断或测试场景下能够暂时禁用或启动DTC的设置。对于避免诊断过程中产生不必要的DTC记录、验证故障检测逻辑或在特定测试条件下观察系统行为非常有用。
SID | 子功能 | 功能说明 | 发送数据 | 响应数据 |
85 | 01 | 开启DTC记录:服务端收到请求后恢复DTC状态的更新 | 85 01 | 正响应:C5 01 ... 负响应:7F 85 ... |
85 | 02 | 禁用DTC记录:服务端收到请求后停止DTC状态的更新(如触发新的DTC在该会话保持期间不会再进行记录,但不会影响历史DTC记录) | 85 02 | 正响应:C5 02 ... 负响应:7F 85 ... |
0x86 基于事件响应
0x87 链路控制
常用否定响应码NRC
NRC | Description | 说明 |
0x10 | Genral Reject | |
0x11 | Service Not Supported | 服务不支持 |
0x12 | Sub-function Not Supported | 子功能不支持 |
0x13 | Incorrect Message Lenth or Invalid Format | 请求报文长度或格式不正确 |
0x22 | Conditions Not Correct | 条件不满足 |
0x24 | Request Sequence Error | 请求舒徐错误 |
0x31 | Request Out of Range | 请求超出范围、数据ID不支持 |
0x33 | Security Access Denied | 不满足安全策略 |
0x35 | Invalid Key(27 service) | 密钥无效 |
0x36 | Exceed Number of Attempts(27 service) | 解锁尝试超过次数 |
0x37 | Required Time Delay Not Expired(27 service) | 超时时间未到 |
0x70 | Upload/Download Not Accepted(34 service) | 不能上传/下载 |
0x71 | Transfer Data Suspended | 数据传输暂停 |
0x72 | General Programming Failure | 擦除或烧写内存时错误 |
0x73 | Wrong Block Sequence Counter | 块序列计数错误 |
0x78 | Request Correct Received - Response Pending | 收到请求,响应挂起 |
0x7E | Sub-function Not Supported in Active Session | 当前会话下,子服务不支持 |
0x7F | Serive Not Supported in Active Session | 当前会话下,该服务不支持 |
0x92 | Voltage Too High | 电压过高 |
0x93 | Voltage Too Low | 电压过低 |