3、UDS服务分类:强制服务与可选服务、6大类服务功能
好,咱们接着聊。上一章我们把UDS的协议栈框架搭起来了,这一章我重点讲讲UDS服务的分类。说白了,就是搞清楚哪些服务是必须有的,哪些是看心情加的,以及这几十个服务到底怎么归类。
我记得刚入行那会儿,看到UDS协议里密密麻麻的服务列表,头都大了。后来跟着老工程师做项目,才慢慢摸出门道。其实UDS服务没那么复杂,你只要抓住两个维度:强制 vs 可选,以及六大功能类。
3.1 强制服务与可选服务
UDS协议(ISO 14229-1)里定义了很多服务,但不是每个都得实现。它分了两类:
- 强制服务(Mandatory):ECU必须支持的,否则不符合协议规范。
- 可选服务(Optional):根据ECU功能需求决定要不要实现。
你想想看,如果每个ECU都把所有服务实现了,那存储空间和性能开销得多大?尤其是那些资源紧张的MCU,根本扛不住。
核心原则:强制服务是UDS的“最小公倍数”,是所有ECU都能理解的通用语言。可选服务则是“锦上添花”,按需定制。
具体来说,强制服务就那么几个:
| SID | 服务名称 | 说明 |
|---|---|---|
| 0x10 | 诊断会话控制 | 切换会话模式(默认、扩展、编程等) |
| 0x11 | ECU复位 | 硬件复位、钥匙复位等 |
| 0x27 | 安全访问 | 解锁受保护的功能 |
| 0x28 | 通信控制 | 开启/关闭通信 |
| 0x3E | 测试仪保持连接 | 防止会话超时 |
| 0x83 | 访问时间参数 | 读写时间参数 |
| 0x84 | 安全数据传输 | 加密传输 |
| 0x85 | 控制DTC设置 | 开启/关闭故障码记录 |
| 0x86 | 响应事件 | 事件响应机制 |
| 0x87 | 链路控制 | 波特率切换等 |
个人经验:我在做BCM项目时,客户要求必须支持所有强制服务。但实际调试中发现,有些服务(比如0x84安全数据传输)在量产阶段根本用不到。我建议你开发时先实现强制服务,可选服务按客户需求列表来,别一股脑全做了。
可选服务就多了,比如0x22(读取数据)、0x2E(写入数据)、0x31(例程控制)等等。这些服务虽然不强制,但实际项目中几乎都会用到。嗯,这里要注意:可选不代表不重要,只是协议不强制你实现而已。
3.2 六大类服务功能
UDS把服务分成了6大类,每一类对应一组功能。我个人习惯把这6类记成“诊断六脉神剑”,哈哈。咱们一个一个看。
3.2.1 诊断与通信管理(Diagnostic and Communication Management)
这一类服务负责管理诊断会话本身。说白了,就是“诊断的开关和规则”。
- 0x10 诊断会话控制:切换会话模式。默认会话只能做基本操作,扩展会话才能读写数据,编程会话才能刷写。
- 0x11 ECU复位:软复位、硬复位、钥匙复位。
- 0x27 安全访问:解锁受保护功能。比如刷写前要解锁。
- 0x28 通信控制:关闭或开启CAN/LIN通信。
- 0x3E 测试仪保持连接:防止会话超时自动退出。
- 0x83 访问时间参数:读写时间参数。
- 0x84 安全数据传输:加密传输。
- 0x85 控制DTC设置:开启/关闭故障码记录。
- 0x86 响应事件:事件响应机制。
- 0x87 链路控制:波特率切换等。
避坑指南:我曾经在一个项目中,测试仪发送0x3E的频率太慢,导致ECU频繁超时退出会话。后来我建议客户把超时时间从5秒改成10秒,问题才解决。记住:0x3E的发送间隔一定要小于会话超时时间。
3.2.2 数据传输(Data Transmission)
这一类服务用于读写ECU内部的数据。比如读取传感器值、写入配置参数。
- 0x22 读取数据:按DID(数据标识符)读取数据。
- 0x2E 写入数据:按DID写入数据。
- 0x23 读取内存地址:按物理地址读取内存。
- 0x24 读取缩放数据:带缩放因子的数据读取。
- 0x2F 输入输出控制:控制IO口。
你想想看,0x22和0x2E是最常用的。比如读取VIN码、写入VIN码,都是通过这两个服务。
3.2.3 存储数据传输(Stored Data Transmission)
这一类服务专门处理故障码(DTC)和冻结帧数据。
- 0x14 清除诊断信息:清除DTC和冻结帧。
- 0x19 读取DTC信息:按状态掩码读取DTC。
我记得有一次,客户反馈说DTC清不掉。排查后发现是0x14服务没实现清除冻结帧的功能。嗯,这里要注意:0x14不仅要清DTC,还要清关联的冻结帧和环境数据。
3.2.4 输入输出控制(Input Output Control)
这一类服务用于控制ECU的IO口。比如强制让某个继电器吸合、让某个LED点亮。
- 0x2F 输入输出控制:按DID控制IO口。
这个服务在产线测试中特别有用。比如测试雨刮电机,直接发0x2F控制雨刮继电器,比等ECU自己触发快多了。
3.2.5 远程激活(Remote Activation)
这一类服务用于远程启动ECU的某些功能。比如远程启动例程、远程启动诊断。
- 0x31 例程控制:启动、停止、查询例程。
例程控制是个好东西。比如刷写前擦除Flash,就是通过0x31启动一个擦除例程。我建议你把常用的例程做成可配置的,方便后期维护。
3.2.6 上传下载(Upload Download)
这一类服务用于刷写ECU软件。比如OTA升级、产线刷写。
- 0x34 请求下载:告诉ECU我要下载数据。
- 0x35 请求上传:告诉ECU我要上传数据。
- 0x36 传输数据:实际传输数据块。
- 0x37 请求传输退出:结束传输。
- 0x38 请求文件传输:文件级别的传输。
核心要点:上传下载服务是刷写的核心。0x34和0x35协商传输参数(比如块大小),0x36分块传输数据,0x37结束传输。顺序不能乱,否则ECU会报错。
好了,这一章的内容就这些。总结一下:UDS服务分强制和可选,强制服务是底线,可选服务按需实现。六大类服务功能覆盖了诊断的方方面面,从会话管理到刷写升级,一应俱全。
下一章我会讲讲UDS的时序和超时处理,这可是调试中的重灾区。咱们到时候见。