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协议基础架构与请求/响应链路 物理/传输层 CAN / CAN FD / LIN FlexRay / Ethernet 数据链路层 N_PCI / N_Data 单帧 / 首帧 / 连续帧 应用层(ISO 14229-1) SID + Sub-function + 参数 诊断会话 / 安全等级 / 服务控制 诊断会话管理 默认会话 (0x01) 编程会话 (0x02) 扩展会话 (0x03) SID 分类 诊断控制类 (0x10/0x11/0x28) 数据读取类 (0x22/0x23/0x2E) IO控制类 (0x2F/0x31/0x34) 请求/响应格式 请求: SID + Sub + 数据 正响应: 40+SID + 数据 负响应: 7F + SID + NRC 典型请求/响应链路示例(读取DID 0xF190) 请求: 03 22 F1 90 [长度][SID][DID高][DID低] 正响应: 06 62 F1 90 01 2C [长度][40+SID][DID][数据] 负响应: 03 7F 22 31 [长度][7F][SID][NRC] NRC 0x31 = requestOutOfRange(请求超出范围) 正响应SID = 请求SID + 0x40,用于区分请求与响应 诊断会话决定可用的服务集合与安全等级

上图展示了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码名称典型触发场景
0x11serviceNotSupported当前会话不支持该SID
0x12subFunctionNotSupportedSID支持但子功能无效
0x22conditionsNotCorrect安全状态未满足(如未解锁)
0x31requestOutOfRange参数超出允许范围
0x72generalProgrammingFailure刷写过程中校验失败

案例拆解

某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权限的映射关系是诊断排障的基础。

常见误区

风险提醒:不要将ISO 14229-1与ISO 15765-2(CAN传输层)混淆。前者是应用层协议,后者是网络层协议。很多初学者在分析CAN报文时,误将N_PCI字节当作SID,导致解析错误。务必先剥离传输层头部,再解析应用层数据。

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*(增强定时)参数,用于告知诊断仪后续服务的超时阈值。

判断方法或操作流程

  1. 确认当前会话:发送0x10服务读取当前会话ID(子功能0x00),或通过0x22读取DID 0xF186(会话状态)。
  2. 切换会话:发送 02 10 03 进入扩展会话,等待正响应。
  3. 验证会话生效:尝试执行仅限扩展会话的服务(如0x2F),若返回正响应则切换成功。
  4. 注意会话超时:若在P2*时间内无诊断请求,ECU可能自动回退到默认会话。
经验提示:在开发测试阶段,建议在每次上电后先发送0x10 0x03切换到扩展会话,避免因默认会话权限不足导致测试中断。同时,注意P2*定时器的值,通常为5000ms,若诊断仪响应慢,需调整超时设置。

案例拆解

在一次Bootloader刷写流程中,刷写工具发送 02 10 02 切换到编程会话,但ECU返回 03 7F 10 22(conditionsNotCorrect)。工程师排查发现,ECU要求必须先进行安全解锁(0x27服务)才能进入编程会话。于是调整刷写顺序:先发送 02 10 03 进入扩展会话,执行0x27解锁,再发送 02 10 02 切换编程会话,最终成功。此案例表明,会话切换并非孤立操作,它受安全等级、ECU状态机等多重条件约束。

常见误区

风险提醒:不要假设所有ECU都支持三种标准会话。部分ECU可能仅支持默认会话和扩展会话,或自定义了会话ID。在开发诊断仪时,应通过0x10服务的负响应NRC(如0x12)来判断目标会话是否受支持。

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-0x3E0x10/0x11/0x28会话切换、复位、通信控制
数据读取0x22-0x2E0x22/0x23读取DID、读取内存地址
数据写入0x2E-0x3D0x2E/0x3D写入DID、写入内存地址
IO控制0x2F-0x310x2F/0x31控制输入输出、例程控制
上传下载0x34-0x370x34/0x36/0x37请求下载、传输数据、请求退出传输
安全类0x270x27安全解锁/锁定

案例拆解

某诊断日志显示,ECU连续收到 02 2F 01 00 请求(控制DID 0x01的输出),但响应为 03 7F 2F 22。工程师分析:NRC 0x22表示条件不正确,可能原因是ECU当前处于默认会话,而IO控制服务要求扩展会话。通过切换会话后重试,请求成功。此案例说明,SID分类与会话权限紧密相关,诊断仪应依据会话状态动态调整可用服务列表。

常见误区

风险提醒:不要将SID与DID混淆。SID是服务标识,DID是数据标识。例如,0x22是“读取数据”服务,而0xF190是“VIN码”数据标识。在报文中,SID位于第一个字节,DID位于后续字节。

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 告知诊断仪“正在处理”,避免诊断仪误判超时。

判断方法或操作流程

  1. 解析请求帧:提取SID、子功能、参数,确认服务类型。
  2. 判断响应类型:若SID最高位为0x7F,则为负响应;否则为正响应。
  3. 检查NRC:若为负响应,根据NRC码定位原因。
  4. 监控定时:使用CANoe或PCAN记录请求与响应的时间戳,计算实际响应时间,与P2/P2*对比。
实战要点:在刷写场景中,0x34(RequestDownload)和0x36(TransferData)的响应时间可能较长。若ECU在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后延长等待时间,通信恢复正常。

常见误区

风险提醒:不要忽略“长度”字段的校验。某些ECU在收到长度与实际数据不符的报文时,会直接丢弃或返回NRC 0x13(incorrectMessageLengthOrInvalidFormat)。诊断仪应严格计算长度字节,避免因填充错误导致通信失败。

总结而言,UDS协议基础是诊断开发的基石。理解ISO 14229-1的会话模型、SID分类和请求/响应格式,能够帮助工程师快速定位通信故障、合理设计诊断流程。在实际项目中,建议结合CANoe的Trace窗口和UDS诊断模板,逐步积累常见NRC的排查经验,从而提升诊断开发的效率与质量。