UDS 0x22 服务(按标识符读取数据 )是 ISO 14229-1 定义的高频诊断服务,核心功能是客户端(诊断仪 / 上位机)通过指定数据标识符(DID),从 ECU 中读取预设的标定数据、状态数据、标识信息。该服务是汽车电子 ECU 研发调试、产线检测、售后诊断的基础功能,在充放电控制器、VCU 等关键控制器中,常用于读取电压电流、SOC 值、软件版本、硬件序列号等核心数据。
一、核心属性与报文结构
1. 基础规范参数
| 属性项 | 具体内容 |
|---|---|
| 服务 ID | 0x22 |
| 肯定响应 ID | 0x62(SID+0x40) |
| 否定响应 | 0x7F + 0x22 + NRC(否定响应码) |
| 会话兼容性 | 支持默认会话、编程会话、扩展诊断会话(DID 权限与会话绑定) |
| 安全权限 | 部分敏感 DID(如加密密钥、标定参数)需先通过 0x27 服务解锁 |
| 数据长度 | 单 DID 读取支持 1~65535 字节,多 DID 读取需按 ECU 设计限制 |
2. 完整报文格式(CAN 总线为例)
(1)请求报文结构
请求报文由 服务 ID + 数据标识符(DID) 组成,支持单 DID 读取 和多 DID 读取两种模式:
| 读取模式 | 字节偏移 | 字段内容 | 说明 |
|---|---|---|---|
| 单 DID 读取 | 01~2 | 0x22DID(2 字节,大端序) | 最常用模式,一次读取一个数据项 |
| 多 DID 读取 | 01~23~4... | 0x22DID1DID2... | 一次读取多个数据项,DID 数量由 ECU 支持能力决定 |
关键说明:DID 是 ECU 内部预定义的 2 字节唯一标识,不同主机厂 / 零部件厂商有自定义 DID 库,例如:
0xF180:软件版本号0xF181:硬件序列号0x2801:充放电控制器 SOC 值
(2)肯定响应报文结构
肯定响应报文格式为 响应 SID + DID + 数据内容,数据内容的长度和格式由 DID 定义:
| 字节偏移 | 字段内容 | 说明 |
|---|---|---|
| 0 | 0x62(响应 SID) | 固定为服务 ID+0x40 |
| 1~2 | DID | 回显请求的 DID,与请求一致 |
| 3~n | 数据内容 | 对应 DID 的实际数据,格式由 ECU 标定规范定义 |
(3)否定响应报文结构
当 ECU 无法读取指定 DID 时,返回否定响应,格式固定:0x7F + 0x22(原服务ID) + NRC(否定响应码)
二、核心功能模式与工程应用
1. 单 DID 读取(主流应用模式)
执行时序
- 客户端发送单 DID 读取请求(如
0x22 0xF1 0x80,读取软件版本)。 - ECU 验证 DID 有效性、会话权限、安全权限。
- 验证通过,返回肯定响应(如
0x62 0xF1 0x80 0x12 0x34 0x56,携带版本数据)。 - 验证失败,返回对应 NRC 码。
典型应用场景
| DID 示例 | 数据内容 | 应用场景 |
|---|---|---|
0xF180 |
软件版本号(如 V1.0.2) | 售后固件版本核查、刷写前版本比对 |
0x2801 |
SOC 值(如 50% → 0x32) | 充放电控制器状态监控、诊断仪显示 |
0xF190 |
ECU 硬件序列号 | 产线追溯、零部件防伪校验 |
2. 多 DID 读取(高效批量读取)
执行时序
- 客户端发送多 DID 读取请求(如
0x22 0xF1 0x80 0xF1 0x81,同时读取软件版本 + 硬件序列号)。 - ECU 按 DID 顺序依次读取数据,拼接成响应报文。
- 返回肯定响应:
0x62 0xF1 0x80 [版本数据] 0xF1 0x81 [序列号数据]。
工程优势
- 减少总线通信次数,降低总线负载。
- 适用于产线批量检测(如一次读取 ECU 所有标识信息)。
注意:多 DID 读取的 DID 数量和总数据长度需与 ECU 预先约定,超出限制会返回 NRC 0x13(消息长度错误)。
三、常见 DID 数据格式定义(工程规范)
DID 的数据内容格式由汽车电子数据标定规范定义,常见格式包括:
- ASCII 字符串 :用于软件版本、硬件序列号等文本信息,例如
0xF180的响应数据为0x56 0x31 0x2E 0x30 0x2E 0x32→ 对应 ASCII 码V1.0.2。 - 数值型数据 :用于电压、电流、SOC 等参数,通常为 16/32 位整型,需配置转换因子 和偏移量 ,例如:
- SOC 值 DID
0x2801数据为0x32(十进制 50),转换公式:实际SOC = 数据值 × 1 + 0→ 50%。 - 电压 DID
0x2802数据为0x0E 0x10(十进制 3600),转换公式:实际电压 = 3600 × 0.01 + 0→ 36.00V。
- SOC 值 DID
- 状态位数据 :用于 ECU 工作状态、故障标志,按位定义含义,例如 1 字节数据
0x03→ bit0=1(充电中)、bit1=1(散热风扇开启)。
四、常见否定响应码(NRC)与故障排查
| NRC 码 | 含义 | 典型触发场景 | 排查建议 |
|---|---|---|---|
| 0x12 | 子功能不支持 | 请求的 DID 未在 ECU 中定义 | 核对 DID 列表,确认 ECU 软件版本是否支持该 DID |
| 0x13 | 消息长度错误 | 1. 多 DID 读取数量超限2. DID 或数据长度不匹配 | 检查请求报文字节数,按 ECU 规范调整 DID 数量 |
| 0x22 | 条件不满足 | 1. 未激活对应会话2. 敏感 DID 未解锁安全访问 | 1. 发送 0x10 服务激活扩展会话2. 先执行 0x27 服务解锁权限 |
| 0x31 | 请求非法 | DID 被 ECU 内部逻辑锁定(如刷写过程中读取标定 DID) | 等待 ECU 完成当前任务,或退出编程会话 |
| 0x33 | 安全访问被拒绝 | 敏感 DID 需要更高安全等级解锁 | 核对 DID 对应的安全等级,执行对应 0x27 解锁流程 |
五、工程设计与测试验证要点
1. 设计核心要求
- DID 权限划分:将 DID 分为 "公开 DID"(默认会话可读取)和 "敏感 DID"(需安全解锁),例如充放电控制器的 SOC 值为公开 DID,加密密钥为敏感 DID。
- 数据一致性:读取数据时需保证数据完整性,避免 ECU 在数据更新过程中返回错误值(可通过加锁机制实现)。
- 超时机制:客户端需设置读取超时时间(建议 100~500ms),防止 ECU 无响应导致诊断卡顿。
2. 测试验证(CANoe/CANape 工具)
- 单 DID 读取测试:遍历所有 DID,验证肯定响应数据格式是否符合标定规范。
- 权限验证测试:未解锁安全访问时读取敏感 DID,验证是否返回 NRC 0x22/0x33。
- 边界条件测试:发送超出长度的多 DID 请求,验证是否返回 NRC 0x13。
- 通信负载测试:批量发送多 DID 读取请求,验证 ECU 在高总线负载下的响应稳定性。
六、典型报文交互示例(充放电控制器)
以读取充放电控制器软件版本(DID=0xF180) 和 SOC 值(DID=0x2801) 为例:
场景 1:单 DID 读取软件版本
| 节点 | 方向 | 报文数据 | 说明 |
|---|---|---|---|
| 上位机→ECU | 请求 | 0x22 0xF1 0x80 |
读取软件版本 DID |
| ECU→上位机 | 响应 | 0x62 0xF1 0x80 0x56 0x31 0x2E 0x30 0x2E 0x32 |
版本数据:V1.0.2 |
场景 2:多 DID 读取版本 + SOC
| 节点 | 方向 | 报文数据 | 说明 |
|---|---|---|---|
| 上位机→ECU | 请求 | 0x22 0xF1 0x80 0x28 0x01 |
同时读取两个 DID |
| ECU→上位机 | 响应 | 0x62 0xF1 0x80 0x56 0x31 0x2E 0x30 0x2E 0x32 0x28 0x01 0x32 |
版本V1.0.2 + SOC 值 50% |