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服务的"地图"。
3.6 实际应用场景
在EOL下线测试中,这四个服务家族是怎么配合的?我给你捋一个典型流程:
- 第一步:建立会话(0x10)—— 切换到扩展会话,获取操作权限。
- 第二步:安全访问(0x27)—— 解锁ECU,允许写入操作。
- 第三步:写入配置(0x2E)—— 写入VIN码、车辆配置参数。
- 第四步:输出测试(0x2F)—— 控制大灯、喇叭、雨刮,验证功能。
- 第五步:刷写固件(0x34/0x36/0x37)—— 如果需要,更新ECU软件。
- 第六步:读取验证(0x22)—— 读回写入的数据,确认正确。
- 第七步:清除DTC(0x14)—— 清掉测试过程中产生的临时故障码。
- 第八步:复位退出(0x11)—— 让ECU复位,恢复正常模式。
总结一下:四大服务家族不是孤立的。在EOL测试里,它们像流水线一样串联起来。你掌握了每个服务的SID和用途,就等于拿到了UDS的钥匙。剩下的,就是多写代码、多踩坑、多总结。