3. UDS服务分类:四大服务家族

UDS协议里服务挺多的,但别慌。我个人习惯把它们分成四大类来记。这就像工具箱里的四层抽屉——诊断、数据、控制、下载。每层抽屉放什么工具,今天咱们捋清楚。

核心记忆口诀:诊断(10-3E)、数据(22-2E)、控制(2F-31)、下载(34-37)。

每个服务都有一个唯一的SID(Service Identifier),也就是一个字节的ID。你想想看,从0x10到0x3E,这中间其实有重叠的区间,但每个SID只属于一个功能组。

3.1 诊断服务(0x10 - 0x3E)

这类服务是UDS的"门面"。说白了,就是ECU和诊断仪之间建立会话、做检查、保活用的。我刚开始做EOL测试时,最常打交道的就是它们。

SID 服务名称 一句话说明
0x10 诊断会话控制 切换ECU的工作模式(默认/编程/扩展)
0x11 ECU复位 让ECU软复位或硬复位
0x14 清除诊断信息 清DTC(故障码)和快照数据
0x19 读取诊断信息 读DTC、快照、扩展数据
0x28 通信控制 开启/关闭某些报文
0x3E 测试仪保持连接 俗称"心跳包",防止会话超时

我的经验:0x3E这个服务,很多人觉得它不重要。但我在产线上遇到过因为没发心跳包,ECU在刷写中途自动退出编程会话的惨案。嗯,从那以后,我写测试脚本时都会在循环里加上0x3E。

3.2 数据服务(0x22 - 0x2E)

这类服务用来读写ECU内部的数据。比如读取VIN码、软件版本、传感器值。我个人觉得,这是EOL测试里用得最频繁的一组服务。

  • 0x22(读取数据标识符): 按DID(Data Identifier)读数据。比如DID 0xF190通常是VIN码。
  • 0x23(读取内存地址): 按物理地址读数据。一般用于底层调试,产线很少用。
  • 0x24(读取缩放数据标识符): 读带单位或缩放系数的数据。比如温度值直接返回摄氏度。
  • 0x2A(读取周期数据标识符): 订阅一组DID,ECU会周期上报。适合做实时监控。
  • 0x2C(动态定义数据标识符): 动态组合DID,一次性读取。我挺喜欢这个,能减少总线负载。
  • 0x2E(写入数据标识符): 按DID写数据。比如写入VIN码、配置参数。

注意:0x2E写入操作通常需要在扩展会话(0x10 03)下才能执行。而且写入前最好先做安全访问(0x27)。我曾经见过有人直接写0x2E,结果ECU返回NRC 0x33(安全访问拒绝),排查了半天才发现会话没切对。

3.3 输入输出控制服务(0x2F - 0x31)

这类服务就一个核心服务:0x2F(输入输出控制)。0x30和0x31是预留的,目前基本不用。

0x2F能干啥?说白了,就是让诊断仪强制控制ECU的某个输出引脚。比如让某个继电器吸合、让某个LED点亮、让某个电机转动。

在EOL测试里,这个服务特别有用。举个例子:

// 控制某个输出引脚为高电平
请求:2F XX XX 03 01 00
// XX XX 是 DID(数据标识符)
// 03 表示强制为高电平
// 01 00 是具体参数

避坑指南:0x2F控制完成后,一定要记得用0x2F把控制权还给ECU本地(参数设为00)。否则ECU会一直保持你的强制状态,产线下一台车可能就出问题了。我曾经在产线调试时忘了释放,结果后面连续三台车的大灯都不受控……

3.4 上传下载服务(0x34 - 0x37)

这类服务是刷写(Flash)的核心。ECU升级固件、刷写应用软件,全靠它们。

SID 服务名称 作用
0x34 请求下载 告诉ECU:我要写数据了,你准备好
0x35 请求上传 告诉ECU:我要读你的数据,你准备好
0x36 传输数据 实际传输数据块(一次最多4095字节)
0x37 请求传输退出 结束传输,ECU开始校验和写入

刷写的流程其实很固定:先0x34握手,然后循环0x36发数据,最后0x37收尾。你想想看,这就像寄快递——先填单子(0x34),然后装箱发货(0x36),最后签收确认(0x37)。

我的习惯:每次0x36发送的数据块大小,我建议不要超过ECU能接受的最大值。ECU会在0x34的响应里告诉你"blockLength"是多少。别贪多,一次发太大,ECU可能直接丢帧。

3.5 四大服务家族关系图

下面这张图,是我自己画的服务分类关系。你可以把它当作UDS服务的"地图"。

UDS四大服务家族关系图 UDS四大服务家族 UDS (ISO 14229) 诊断服务 0x10 - 0x3E 数据服务 0x22 - 0x2E 控制服务 0x2F - 0x31 上传下载服务 0x34 - 0x37 常用子服务 • 0x10 诊断会话控制 • 0x11 ECU复位 • 0x19 读取诊断信息 • 0x3E 测试仪保持连接 常用子服务 • 0x22 读取数据标识符 • 0x2E 写入数据标识符 • 0x2A 读取周期数据 • 0x2C 动态定义DID 常用子服务 • 0x2F 输入输出控制 • 控制继电器/灯/电机 • 强制输出状态 • 释放控制权 常用子服务 • 0x34 请求下载 • 0x36 传输数据 • 0x37 请求传输退出 • 0x35 请求上传 EOL测试中,四大服务家族协同工作 诊断会话 → 数据读写 → 输出控制 → 固件刷写 诊断会话 数据读写 输出控制 固件刷写

3.6 实际应用场景

在EOL下线测试中,这四个服务家族是怎么配合的?我给你捋一个典型流程:

  1. 第一步:建立会话(0x10)—— 切换到扩展会话,获取操作权限。
  2. 第二步:安全访问(0x27)—— 解锁ECU,允许写入操作。
  3. 第三步:写入配置(0x2E)—— 写入VIN码、车辆配置参数。
  4. 第四步:输出测试(0x2F)—— 控制大灯、喇叭、雨刮,验证功能。
  5. 第五步:刷写固件(0x34/0x36/0x37)—— 如果需要,更新ECU软件。
  6. 第六步:读取验证(0x22)—— 读回写入的数据,确认正确。
  7. 第七步:清除DTC(0x14)—— 清掉测试过程中产生的临时故障码。
  8. 第八步:复位退出(0x11)—— 让ECU复位,恢复正常模式。

总结一下:四大服务家族不是孤立的。在EOL测试里,它们像流水线一样串联起来。你掌握了每个服务的SID和用途,就等于拿到了UDS的钥匙。剩下的,就是多写代码、多踩坑、多总结。