2、UDS协议基础:ISO 14229-1概述、诊断会话、服务标识符(SID)分类、请求/响应格式
UDS(Unified Diagnostic Services,统一诊断服务)是ISO 14229标准定义的一套面向整车电子控制单元(ECU)的诊断通信协议。它不依赖于特定的物理层(可运行于CAN、CAN FD、LIN、FlexRay、以太网等),而是聚焦于应用层的服务定义、会话管理与数据交互规则。对于从事ECU开发、测试与售后诊断的工程师而言,理解UDS协议基础是掌握复位服务(0x11)与通信管理服务(0x28等)的前提。本章将围绕ISO 14229-1的核心框架,系统梳理诊断会话模型、SID分类逻辑以及请求/响应的字节流格式,为后续章节的深度解析奠定基础。
上图展示了UDS协议栈的分层关系与核心交互链路。物理层与数据链路层负责字节的可靠传输,而应用层(ISO 14229-1)则定义了诊断服务的语义。诊断会话(Diagnostic Session)是ECU内部的一种运行状态,决定了当前允许执行哪些服务;SID(Service Identifier)是每个服务的唯一编号;请求/响应格式则规定了诊断仪与ECU之间交换数据的字节排列规则。下面逐一展开。
2.1 ISO 14229-1标准概述与适用范围
核心原理
ISO 14229-1定义了独立于物理层的诊断服务规范,其核心目标是提供一套统一的诊断服务接口,使得不同厂商、不同车型的ECU能够通过标准化的方式被访问。该标准规定了服务ID(SID)、子功能(Sub-function)、参数格式、正负响应规则以及会话切换逻辑。它不关心底层是CAN报文还是以太网帧,而是将诊断数据封装为“服务原语”,由下层协议负责传输。
标准中最重要的概念之一是“服务”与“子功能”的区分。例如,0x11(ECUReset)服务包含硬复位(0x01)、钥匙下电复位(0x02)等子功能;0x28(CommunicationControl)服务包含启用/禁用通信等子功能。子功能字节的最高位(bit 7)用于指示是否抑制正响应(suppressPosRspMsg),这在批量刷写或快速测试中非常实用。
判断方法或操作流程
在实际工程中,判断一个ECU是否支持某服务,通常通过发送该服务的请求并观察响应。若返回正响应(SID+0x40),则支持;若返回负响应(0x7F + SID + NRC),则根据NRC判断原因。常见的NRC包括:0x11(serviceNotSupported)、0x12(subFunctionNotSupported)、0x22(conditionsNotCorrect)、0x31(requestOutOfRange)等。诊断工程师需要熟悉这些NRC的含义,以便快速定位问题。
| NRC码 | 名称 | 典型触发场景 |
|---|---|---|
| 0x11 | serviceNotSupported | 当前会话不支持该SID |
| 0x12 | subFunctionNotSupported | SID支持但子功能无效 |
| 0x22 | conditionsNotCorrect | 安全状态未满足(如未解锁) |
| 0x31 | requestOutOfRange | 参数超出允许范围 |
| 0x72 | generalProgrammingFailure | 刷写过程中校验失败 |
案例拆解
某OEM在产线终检环节发现,部分ECU无法通过0x22(ReadDataByIdentifier)读取VIN码。诊断仪发送请求 03 22 F1 90 后,ECU返回 03 7F 22 31。工程师分析:NRC 0x31表示请求超出范围,说明DID 0xF190在当前会话中不可用。进一步检查发现,ECU处于默认会话(0x01),而VIN码的读取权限被限制在扩展会话(0x03)中。解决方案是:先发送 02 10 03 切换到扩展会话,再重新读取VIN,成功返回 06 62 F1 90 31 32 33。此案例说明,理解会话与DID权限的映射关系是诊断排障的基础。
常见误区
2.2 诊断会话(Diagnostic Session)机制
核心原理
诊断会话是ECU的一种运行模式,不同会话下可用的服务集合、定时参数(如P2/P2*)和安全等级不同。ISO 14229-1定义了三种标准会话:默认会话(Default Session,0x01)、编程会话(Programming Session,0x02)、扩展会话(Extended Session,0x03)。此外,OEM可自定义会话(0x40-0x7F)。ECU上电后默认进入默认会话,该会话下仅允许执行基础诊断服务(如读取DID、清除DTC),而刷写、安全解锁等敏感操作必须在编程或扩展会话下进行。
会话切换通过0x10(DiagnosticSessionControl)服务实现。请求格式为 02 10 03,其中0x03为目标会话ID。ECU正响应为 02 50 03,并附带P2(默认定时)和P2*(增强定时)参数,用于告知诊断仪后续服务的超时阈值。
判断方法或操作流程
- 确认当前会话:发送0x10服务读取当前会话ID(子功能0x00),或通过0x22读取DID 0xF186(会话状态)。
- 切换会话:发送
02 10 03进入扩展会话,等待正响应。 - 验证会话生效:尝试执行仅限扩展会话的服务(如0x2F),若返回正响应则切换成功。
- 注意会话超时:若在P2*时间内无诊断请求,ECU可能自动回退到默认会话。
案例拆解
在一次Bootloader刷写流程中,刷写工具发送 02 10 02 切换到编程会话,但ECU返回 03 7F 10 22(conditionsNotCorrect)。工程师排查发现,ECU要求必须先进行安全解锁(0x27服务)才能进入编程会话。于是调整刷写顺序:先发送 02 10 03 进入扩展会话,执行0x27解锁,再发送 02 10 02 切换编程会话,最终成功。此案例表明,会话切换并非孤立操作,它受安全等级、ECU状态机等多重条件约束。
常见误区
2.3 服务标识符(SID)分类与功能映射
核心原理
SID是诊断服务的唯一标识,范围从0x00到0x7E。ISO 14229-1将SID划分为六大类:诊断控制类(0x10-0x3E)、数据读取类(0x22-0x2E)、数据写入类(0x2E-0x3D)、IO控制类(0x2F-0x31)、上传下载类(0x34-0x37)以及安全类(0x27)。每类服务对应不同的功能域,例如0x11(ECUReset)属于诊断控制类,0x22(ReadDataByIdentifier)属于数据读取类。
SID的编码规则是:正响应SID = 请求SID + 0x40。例如,请求0x22,正响应为0x62;请求0x11,正响应为0x51。负响应统一使用0x7F作为SID,并在数据场中携带原始请求SID和NRC码。
判断方法或操作流程
在实际诊断中,判断SID分类有助于快速定位问题。例如,若0x2F(InputOutputControlByIdentifier)返回NRC 0x31,说明IO控制参数超出范围;若0x27(SecurityAccess)返回NRC 0x35(invalidKey),说明密钥错误。工程师应熟记常用SID及其分类,以便在日志分析中快速识别服务类型。
| 分类 | SID范围 | 典型服务 | 用途 |
|---|---|---|---|
| 诊断控制 | 0x10-0x3E | 0x10/0x11/0x28 | 会话切换、复位、通信控制 |
| 数据读取 | 0x22-0x2E | 0x22/0x23 | 读取DID、读取内存地址 |
| 数据写入 | 0x2E-0x3D | 0x2E/0x3D | 写入DID、写入内存地址 |
| IO控制 | 0x2F-0x31 | 0x2F/0x31 | 控制输入输出、例程控制 |
| 上传下载 | 0x34-0x37 | 0x34/0x36/0x37 | 请求下载、传输数据、请求退出传输 |
| 安全类 | 0x27 | 0x27 | 安全解锁/锁定 |
案例拆解
某诊断日志显示,ECU连续收到 02 2F 01 00 请求(控制DID 0x01的输出),但响应为 03 7F 2F 22。工程师分析:NRC 0x22表示条件不正确,可能原因是ECU当前处于默认会话,而IO控制服务要求扩展会话。通过切换会话后重试,请求成功。此案例说明,SID分类与会话权限紧密相关,诊断仪应依据会话状态动态调整可用服务列表。
常见误区
2.4 请求/响应格式与定时参数
核心原理
UDS请求帧格式为:[长度] [SID] [子功能/参数] [数据...]。其中“长度”是应用层数据的字节数(不含长度字节本身)。正响应帧格式为:[长度] [SID+0x40] [数据...]。负响应帧格式为:[长度] [0x7F] [请求SID] [NRC]。例如,请求ECU复位(子功能0x01)的报文为 02 11 01,正响应为 01 51(长度1,SID 0x51,无数据)。
定时参数P2和P2*是诊断通信的关键指标。P2是ECU处理请求并开始发送响应的最大等待时间(默认50ms),P2*是P2超时后ECU发送“待定响应”(0x78)后,诊断仪等待最终响应的最大时间(默认5000ms)。若ECU处理时间超过P2,必须发送 02 7F 11 78 告知诊断仪“正在处理”,避免诊断仪误判超时。
判断方法或操作流程
- 解析请求帧:提取SID、子功能、参数,确认服务类型。
- 判断响应类型:若SID最高位为0x7F,则为负响应;否则为正响应。
- 检查NRC:若为负响应,根据NRC码定位原因。
- 监控定时:使用CANoe或PCAN记录请求与响应的时间戳,计算实际响应时间,与P2/P2*对比。
02 3E 00(TesterPresent)保持会话,或等待0x78待定响应。切勿直接判定超时,否则可能导致刷写中断。案例拆解
在一次CANoe仿真中,诊断仪发送 02 11 01 请求复位,但ECU在100ms后才返回 01 51。由于P2默认50ms,诊断仪已触发超时重发。工程师检查ECU代码发现,复位服务中包含了Flash写入操作,导致处理时间超过P2。解决方案:在ECU代码中,在复位服务开始时立即发送 02 7F 11 78 待定响应,然后执行复位操作,最后发送正响应。修改后,诊断仪在收到0x78后延长等待时间,通信恢复正常。
常见误区
总结而言,UDS协议基础是诊断开发的基石。理解ISO 14229-1的会话模型、SID分类和请求/响应格式,能够帮助工程师快速定位通信故障、合理设计诊断流程。在实际项目中,建议结合CANoe的Trace窗口和UDS诊断模板,逐步积累常见NRC的排查经验,从而提升诊断开发的效率与质量。