4. UDS服务分类:六大服务与常用SID
好,咱们今天聊聊UDS服务的分类。说实话,我刚接触UDS那会儿,看着那一堆服务ID(SID)真是头大。后来慢慢摸清了门道,发现其实就六大类,每类干每类的事,清晰得很。
UDS(ISO 14229)把诊断服务分成了六大功能组。我个人习惯把这六大类记成:通信管理、数据读写、存储操作、IO控制、远程唤醒、刷写升级。你想想看,一辆车从下线到维修,基本就离不开这些操作。
4.1 诊断与通信管理类(0x10~0x3E)
这类服务说白了就是管“怎么说话”的。ECU要不要理你、用什么模式说话、有没有超时,都归它管。
| SID | 服务名称 | 作用 |
|---|---|---|
| 0x10 | 诊断会话控制 | 切换会话模式(默认/扩展/编程) |
| 0x11 | ECU复位 | 硬复位/软复位/快速上电 |
| 0x3E | 测试仪保持连接 | 防止ECU自动退出诊断会话 |
| 0x28 | 通信控制 | 开启/关闭某些报文 |
| 0x3D | 安全访问 | 解锁受保护的功能 |
0x10 诊断会话控制——这个我用的最多。ECU上电默认是默认会话,只能读点基本信息。你要做刷写或复杂诊断,得先切到扩展会话(0x03)或编程会话(0x02)。嗯,这里要注意:切会话时ECU可能会停掉一些非诊断报文,别把正常通信搞断了。
0x3E 测试仪保持连接——这个服务我习惯叫它“心跳包”。ECU有个定时器,如果一段时间没收到诊断请求,它会自动退出会话。我遇到过好几次,调试时忘了发0x3E,结果ECU自己退出了,搞得我排查了半天。后来我写代码时都会加个定时器,每2秒发一次0x3E。
4.2 数据传输类(0x22, 0x2E, 0x23)
这类服务最常用。说白了就是读数据、写数据。你想想看,维修技师连上诊断仪,第一件事就是读故障码、读数据流,用的就是这类服务。
| SID | 服务名称 | 说明 |
|---|---|---|
| 0x22 | 读取数据标识符 | 读单个或多个DID |
| 0x2E | 写入数据标识符 | 写单个DID(需安全访问) |
| 0x23 | 读取内存地址 | 直接读物理地址(很少用) |
0x22 读取数据标识符——每个DID对应一个数据项,比如车速(0x0101)、发动机转速(0x0102)。我习惯把DID按功能分组,比如0xF1xx放标定数据,0xF2xx放故障信息。这样查起来方便。
0x2E 写入数据标识符——这个服务一般需要先做安全访问(0x27)。我记得有一次,客户说写DID总是失败,我一看日志,原来是没发安全访问的解锁请求。ECU直接回了NRC 0x33(安全访问拒绝)。
4.3 存储数据传输类(0x14, 0x19)
这类服务管的是故障码(DTC)的读写和清除。说白了就是“查病”和“治病”。
| SID | 服务名称 | 作用 |
|---|---|---|
| 0x19 | 读取故障码信息 | 读DTC状态、快照、扩展数据 |
| 0x14 | 清除诊断信息 | 清除DTC及相关数据 |
0x19 读取故障码信息——这个服务有好多子功能,比如0x01(报告DTC数量)、0x02(报告DTC列表)、0x04(报告快照数据)。我刚开始用的时候,经常搞混子功能号。后来我做了个表格贴在工位上,才没再出错。
0x14 清除诊断信息——这个服务很简单,但要注意:清除DTC时,ECU可能会同时清除冻结帧、扩展数据等。我曾经遇到过,清完DTC后,客户说某些标定值也丢了。后来查了规范才发现,0x14确实会清除关联数据。
4.4 输入输出控制类(0x2F)
这类服务就一个SID——0x2F 输入输出控制。但它的功能可不简单。说白了,就是让诊断仪直接控制ECU的某个输出,比如让某个继电器吸合、让某个灯点亮。
我做过一个项目,客户要求能通过诊断仪控制雨刮器。用的就是0x2F,控制雨刮电机的PWM占空比。这里要注意:0x2F控制是临时的,一旦退出诊断会话,ECU会恢复原来的控制逻辑。
- 强制输出到指定值
- 冻结当前输出
- 短时激活(比如点动控制)
我建议用“短时激活”模式,安全一些。万一诊断仪掉线了,ECU能自动恢复。
4.5 远程激活类(0x31)
这类服务就一个——0x31 例程控制。它用来执行ECU内部的一段程序。比如启动自学习、执行传感器校准、触发某个算法。
0x31有三个子功能:
- 0x01:启动例程
- 0x02:停止例程
- 0x03:查询例程结果
我记得有一次,客户说ECU的某个传感器数据不准。我通过0x31启动了一个“传感器偏移校准”例程,ECU自动采集数据并修正了偏移量。整个过程不到5秒,比手动标定快多了。
4.6 上传下载类(0x34, 0x36, 0x37, 0x35)
这类服务是刷写升级的核心。说白了就是往ECU里写程序、读程序。
| SID | 服务名称 | 作用 |
|---|---|---|
| 0x34 | 请求下载 | 告诉ECU我要写数据了 |
| 0x36 | 传输数据 | 实际传输数据块 |
| 0x37 | 请求传输退出 | 结束传输 |
| 0x35 | 请求上传 | 从ECU读数据 |
刷写的流程是这样的:
1. 先切到编程会话(0x10 02)
2. 做安全访问(0x27)
3. 发0x34,告诉ECU要写多少数据
4. 循环发0x36,每次传一小块数据(我习惯用4096字节一块)
5. 发0x37,结束传输
6. 最后发0x11复位ECU
我做过一个刷写工具,刚开始时0x36的块大小设成了64KB,结果ECU老是超时。后来改成4KB一块,加了个流控,就稳了。你想想看,ECU的处理能力有限,别一次喂太多数据。
总结
好了,六大类服务就这些。我个人觉得,最常用的是数据传输类(0x22/0x2E)和存储数据传输类(0x19/0x14)。如果你刚开始学UDS,建议先把这两个大类吃透。其他类可以边用边学。
嗯,最后说一句:UDS的规范文档(ISO 14229-1)有400多页,别想着全背下来。把常用SID记住,遇到不熟的查文档就行。我到现在还经常翻文档呢。