UDS诊断之 22服务

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 读取(主流应用模式)

执行时序
  1. 客户端发送单 DID 读取请求(如0x22 0xF1 0x80,读取软件版本)。
  2. ECU 验证 DID 有效性、会话权限、安全权限。
  3. 验证通过,返回肯定响应(如0x62 0xF1 0x80 0x12 0x34 0x56,携带版本数据)。
  4. 验证失败,返回对应 NRC 码。
典型应用场景
DID 示例 数据内容 应用场景
0xF180 软件版本号(如 V1.0.2) 售后固件版本核查、刷写前版本比对
0x2801 SOC 值(如 50% → 0x32) 充放电控制器状态监控、诊断仪显示
0xF190 ECU 硬件序列号 产线追溯、零部件防伪校验

2. 多 DID 读取(高效批量读取)

执行时序
  1. 客户端发送多 DID 读取请求(如0x22 0xF1 0x80 0xF1 0x81,同时读取软件版本 + 硬件序列号)。
  2. ECU 按 DID 顺序依次读取数据,拼接成响应报文。
  3. 返回肯定响应:0x62 0xF1 0x80 [版本数据] 0xF1 0x81 [序列号数据]
工程优势
  • 减少总线通信次数,降低总线负载。
  • 适用于产线批量检测(如一次读取 ECU 所有标识信息)。

注意:多 DID 读取的 DID 数量和总数据长度需与 ECU 预先约定,超出限制会返回 NRC 0x13(消息长度错误)。


三、常见 DID 数据格式定义(工程规范)

DID 的数据内容格式由汽车电子数据标定规范定义,常见格式包括:

  1. ASCII 字符串 :用于软件版本、硬件序列号等文本信息,例如0xF180的响应数据为0x56 0x31 0x2E 0x30 0x2E 0x32 → 对应 ASCII 码V1.0.2
  2. 数值型数据 :用于电压、电流、SOC 等参数,通常为 16/32 位整型,需配置转换因子偏移量 ,例如:
    • SOC 值 DID 0x2801 数据为0x32(十进制 50),转换公式:实际SOC = 数据值 × 1 + 0 → 50%。
    • 电压 DID 0x2802 数据为0x0E 0x10(十进制 3600),转换公式:实际电压 = 3600 × 0.01 + 0 → 36.00V。
  3. 状态位数据 :用于 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%
相关推荐
运维闲章印时光2 小时前
单位本部与分部网络已实现互联互通,网络访问通畅,数据传输正常
开发语言·网络·php
AC赳赳老秦3 小时前
DeepSeek教育科技应用:智能生成个性化学习规划与知识点拆解教程
前端·网络·数据库·人工智能·学习·matplotlib·deepseek
I · T · LUCKYBOOM14 小时前
iptables防火墙
linux·运维·服务器·网络·安全
_Orch1d15 小时前
详解SSL/TLS协议握手协议、记录层协议与警报协议
网络·计算机网络·安全·密码学·ssl·身份认证·对称加密
chenyuhao202416 小时前
Linux网络编程:HTTP协议
linux·服务器·网络·c++·后端·http·https
duration~16 小时前
IPv6 详解
网络·网络协议·ip
广东大榕树信息科技有限公司16 小时前
动环监控如何有效提升机房环境管理的可靠性与响应速度?
运维·网络·物联网·国产动环监控系统·动环监控系统
zhengfei61118 小时前
【POC漏洞】XXX网上阅卷系统 monitor 未授权访问
网络·安全·web安全
福尔摩斯张19 小时前
Linux的pthread_self函数详解:多线程编程中的身份标识器(超详细)
linux·运维·服务器·网络·网络协议·tcp/ip·php