4. UDS诊断协议在底盘量产中的落地

在底盘量产诊断与EOL测试中,UDS(Unified Diagnostic Services,统一诊断服务)是贯穿研发、试制、量产和售后全生命周期的通信基础。ISO 14229标准定义了服务集、会话模型、安全访问机制以及DTC、例程、IO控制等核心能力,但真正落地到量产场景时,必须结合ECU资源、产线节拍、诊断仪能力和整车网络拓扑进行裁剪与扩展。本节围绕底盘量产中最常用的几类服务,说明它们"是什么、怎么用、量产中如何取舍"。

一、ISO 14229服务集与量产常用子集

ISO 14229-1定义了六大类服务:诊断与通信管理(0x10、0x11、0x27、0x28、0x3E、0x83、0x84、0x85、0x86、0x87)、数据传输(0x22、0x23、0x24、0x2A、0x2C、0x2E、0x3D)、存储数据传输(0x14、0x19)、输入输出控制(0x2F)、例程控制(0x31)、上传下载(0x34~0x38)。底盘量产EOL并不需要全部实现,典型裁剪后的服务子集包括:0x10会话控制、0x11 ECU复位、0x14清除DTC、0x19读取DTC、0x22按DID读数据、0x27安全访问、0x28通信控制、0x2E按DID写数据、0x2F IO控制、0x31例程控制、0x3E保持连接、0x85控制DTC设置。0x23/0x24/0x2A/0x2C/0x34~0x38等内存与下载类服务,在底盘量产EOL中通常被Bootloader刷写流程替代,不纳入常规EOL诊断序列。

裁剪原则有三条:一是产线必须用到的服务必须实现且响应时间可控;二是仅研发或售后使用的服务可保留但不必优化;三是与安全相关的服务(0x27、0x2E、0x31、0x2F)必须实现权限分级,防止误操作改变底盘标定或执行机构状态。

二、会话与安全访问:量产诊断的"门禁"

UDS会话模型由0x10服务切换,默认会话(0x01)只允许读取类服务;编程会话(0x02)用于刷写;扩展会话(0x03)开放写入、例程和IO控制。量产EOL通常流程是:默认会话→扩展会话→安全访问→执行写入/例程/IO→返回默认会话。会话有S3超时(通常5s),超时后自动回默认会话,因此EOL序列中必须周期性发送0x3E保持连接,或在每个服务间控制间隔小于S3。

安全访问0x27采用"种子—密钥"机制:诊断仪发送0x27 01请求种子,ECU返回4字节或8字节随机种子;诊断仪用预置算法计算密钥,发送0x27 02 + 密钥;ECU校验通过后解锁。底盘ECU常见安全等级分为Level 1(标定写入)和Level 2(例程/IO控制),不同等级种子算法不同。量产中密钥算法固化在诊断仪脚本中,不通过明文传输;若连续多次(通常3次)密钥错误,ECU会启动延时锁定(如10s),EOL工位必须处理该异常,避免整线停线。

底盘量产EOL UDS诊断序列(会话·安全·DTC·例程·IO) 诊断仪 / EOL工位 Tester 0x10 03 扩展会话 0x27 01 请求种子 0x27 02 发送密钥 0x31 01 例程启动 0x2F 03 IO控制 0x19 02 读取DTC 0x14 清除DTC 底盘ECU ESC / EPS / 域控 会话切换成功 返回种子 8Byte 密钥校验通过 例程执行/结果 执行器动作 DTC状态位 DTC清除确认 S3超时5s,需0x3E保活 密钥错误3次→延时锁定10s 例程结果:0x71 01 FF 00 00 DTC状态位bit0=testFailed 注:图中参数为教学示例,实际以ECU诊断规范CDD/ODX为准

三、DTC读取与清除:量产质量门禁

DTC(Diagnostic Trouble Code)在底盘量产中是判断装配、标定和功能是否合格的核心依据。读取使用0x19服务,常用子功能:0x02按状态掩码读取DTC数量与列表、0x04读取DTC快照、0x06读取DTC扩展数据、0x0A读取所有支持的DTC。量产EOL最常用0x19 02,状态掩码通常取0x08(confirmedDTC)或0xFF(全部状态),返回格式为:DTC数量(2字节)+ 每个DTC 3字节(高字节+中字节+低字节)+ 状态字节(1字节)。状态字节8个bit分别表示testFailed、testFailedThisOperationCycle、pendingDTC、confirmedDTC、testNotCompletedSinceLastClear、testFailedSinceLastClear、testNotCompletedThisOperationCycle、warningIndicatorRequested。

清除使用0x14服务,请求格式为0x14 + 3字节DTC组,0xFFFFFF表示清除所有DTC。量产中清除后必须再次读取0x19 02确认DTC数量为0,且状态位全部复位,否则判定清除失败。需要注意的是,部分底盘ECU对安全相关DTC(如ESC故障)有"清除后需重新自检"的要求,EOL序列中应在清除后执行一次0x31例程自检,再读取DTC确认。

四、例程控制0x31:EOL功能测试的核心

0x31服务用于启动、停止和查询ECU内部例程,是底盘EOL功能测试的主要手段。请求格式为:0x31 + 子功能(0x01启动、0x02停止、0x03请求结果)+ 2字节例程标识符RoutineIdentifier + 可选参数。响应格式为:0x71 + 子功能 + 例程标识符 + 例程状态字节 + 可选结果。例程状态字节常见值:0x00成功、0x01进行中、0x02失败、0x03超时。

底盘EOL典型例程包括:ESC阀体自检(RoutineID示例0x0201)、EPS电机零点标定(0x0301)、制动踏板行程学习(0x0401)、轮速传感器信号校验(0x0501)。以EPS零点标定为例,诊断仪发送0x31 01 03 01,ECU返回0x71 01 03 01 00表示标定成功;若返回0x71 01 03 01 02,则需检查方向盘是否回正、电机温度是否过高、电压是否在9~16V范围内。量产中每个例程都有明确的执行时间上限(如5s),超时未返回则判定失败并记录工位日志。

五、IO控制0x2F:执行器与信号强制

0x2F服务用于临时控制ECU的输入输出信号,常用于产线验证执行器动作和传感器信号链。请求格式为:0x2F + 控制参数(0x00返回默认、0x01短时调整、0x02调整至默认、0x03短时调整并返回默认)+ 2字节DID + 控制状态 + 控制值。响应为0x6F + 控制参数 + DID + 控制状态。

底盘EOL中,0x2F常用于:强制点亮制动灯(验证灯驱动电路)、强制ESC泵电机运转(验证液压单元)、模拟轮速信号(验证ABS信号链)、强制EPS助力电流(验证电机驱动)。例如,控制制动灯DID 0xF1A0,发送0x2F 03 F1 A0 01 FF,ECU返回0x6F 03 F1 A0 01,表示制动灯已强制点亮。IO控制必须在扩展会话且安全解锁后执行,且多数ECU要求控制值在安全范围内(如泵电机占空比不超过30%),超出范围返回NRC 0x31(requestOutOfRange)。

六、量产场景下的裁剪与扩展

量产裁剪的核心是"够用、快、可追溯"。够用指只实现EOL序列必需的服务;快指响应时间满足产线节拍(通常单条诊断请求响应<50ms,整个EOL序列<30s);可追溯指每条诊断请求和响应都记录到工位日志,包含时间戳、服务ID、DID/RoutineID、结果码。

扩展方面,底盘ECU常增加以下量产专用能力:一是自定义DID,如0xF1F0读取EOL测试结果、0xF1F1读取标定版本、0xF1F2读取产线序列号;二是自定义例程,如0xE001写入车辆配置字、0xE002触发下线自检;三是0x85控制DTC设置,在EOL测试期间关闭非相关DTC记录,避免误报干扰;四是0x28通信控制,在EOL工位关闭非必要报文,降低总线负载。这些扩展必须在CDD/ODX诊断描述文件中明确定义,并与诊断仪脚本、MES系统保持一致。

量产EOL诊断序列建议按"会话→安全→写入/例程/IO→DTC读取→DTC清除→DTC复读→返回默认会话"组织,每个步骤设置超时和重试次数(通常重试2次),失败则记录NRC并触发工位报警。所有诊断交互应通过CANoe/CANalyzer或产线诊断仪自动记录,形成可追溯的EOL报告。
安全访问密钥算法和种子生成规则属于ECU安全资产,量产诊断仪中应以加密或混淆方式存储,禁止明文写在脚本或配置文件中。同时,0x2F IO控制和0x31例程控制必须在车辆静止、驻车制动激活、挡位在P挡的条件下执行,防止底盘执行器误动作引发安全事故。