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的时序和超时处理,这可是调试中的重灾区。咱们到时候见。