1. UDS协议基础回顾:ISO 14229-1概述、SID分类、诊断会话控制(0x10)与ECU复位(0x11)
各位同学,咱们今天正式开讲。我是你们的老朋友,一个在新能源车诊断领域摸爬滚打了十几年的工程师。说实话,每次讲UDS基础,我都觉得特别重要。因为后面所有的高级应用,什么BMS、MCU、VCU的诊断,全都建立在这些基础之上。地基不牢,楼盖得再高也得塌。
好,咱们直接进入正题。
1.1 ISO 14229-1到底在讲什么?
ISO 14229-1,说白了就是UDS的“总纲”。它定义了诊断服务的通用规则,不针对某个具体系统。你想想看,不管是发动机、变速箱,还是咱们新能源车的电池、电机,诊断的方式得统一吧?不然每个ECU各说各话,诊断仪得累死。
我个人习惯把UDS理解成一套“汽车界的HTTP协议”。客户端(诊断仪)发请求,服务器(ECU)给响应。就这么简单。但细节上,它比HTTP要严谨得多。
这里有个关键点:UDS是面向连接的。什么意思?就是ECU不会无缘无故搭理你。你得先建立“会话”,它才听你的。这个咱们后面会细讲。
核心要点:UDS是应用层协议,它不关心底层是CAN、LIN还是以太网。你只要把诊断报文封装好,发出去就行。我在项目中遇到过有人纠结“UDS是不是只能用CAN”,其实不是,现在很多车用DoIP(基于以太网),照样跑UDS。
1.2 服务标识符(SID)分类——别被数字吓到
SID,Service Identifier,服务标识符。每个诊断服务都有一个唯一的ID,比如0x10、0x11、0x22等等。很多新手一看到这些十六进制数就头大。其实不用怕,咱们把它分类记就好。
UDS的服务大致分这么几类:
- 诊断和通信管理类:0x10(诊断会话控制)、0x11(ECU复位)、0x28(通信控制)等。这类服务负责“能不能聊”、“怎么聊”。
- 数据传输类:0x22(读取数据)、0x2E(写入数据)、0x23(读取内存)等。这类服务负责“看数据”、“改数据”。
- 存储数据传输类:0x14(清除诊断信息)、0x19(读取DTC信息)等。这类服务负责“查故障”、“清故障”。
- 输入输出控制类:0x2F(输入输出控制)。这类服务负责“强制让某个引脚输出高电平”之类的操作。
- 远程激活类:0x31(例程控制)、0x34(请求下载)等。这类服务负责“让ECU干点复杂的事”。
嗯,这里要注意:SID的请求和响应格式不一样。请求SID是0x10,响应SID就是0x50(请求SID + 0x40)。这是UDS的一个固定规则,别搞混了。
我的小技巧:记SID不用死记硬背。你只要记住几个常用的:0x10、0x11、0x22、0x2E、0x19。其他的用到再查表。我刚开始做诊断时,桌上永远摆着一张SID速查表,后来用多了自然就记住了。
1.3 诊断会话控制(0x10)——ECU的“门禁系统”
0x10服务,诊断会话控制。这个服务太重要了。它就像ECU的门禁系统。你不刷门禁卡,ECU连门都不给你开。
UDS定义了三种默认会话:
| 会话类型 | 子功能值 | 说明 |
|---|---|---|
| 默认会话(Default Session) | 0x01 | ECU上电后的初始状态。只能做基本的数据读取,不能做编程、复位等操作。 |
| 编程会话(Programming Session) | 0x02 | 用于刷写ECU固件。这个会话下,ECU会关闭一些非必要的通信,保证刷写安全。 |
| 扩展会话(Extended Session) | 0x03 | 用于解锁更多诊断功能,比如读写数据、执行例程等。咱们做BMS、MCU诊断时,大部分时间都在这个会话里。 |
为什么会这样设计?你想想看,如果ECU一上电就允许任何人复位、刷写,那得多危险。所以默认会话只给最基础的功能。你需要什么权限,就切换到对应的会话。
我曾经遇到过一个问题:某款车的BMS在扩展会话下才能读取电池单体电压,但诊断仪一直发0x22请求,结果ECU一直回复NRC 0x78(请求正确接收,但响应待定)。查了半天,原来是诊断仪忘了先发0x10 0x03切换到扩展会话。嗯,这种坑我踩过不止一次。
注意:会话切换不是无条件的。ECU可能会检查安全访问(0x27服务)的状态。有些ECU要求必须先通过安全访问,才能切换到扩展会话。另外,会话有超时机制(S3定时器),如果一段时间没有诊断请求,ECU会自动回到默认会话。这个超时时间一般在5秒左右,具体看OEM定义。
1.4 ECU复位(0x11)——让ECU“重启一下”
0x11服务,ECU复位。这个服务简单粗暴,但用起来要小心。
复位有三种常见类型:
- 硬复位(Hard Reset,0x01):模拟ECU断电再上电。所有RAM数据丢失,ECU重新初始化。相当于你电脑按了重启键。
- 钥匙通断复位(Key Off/On Reset,0x02):模拟点火开关从OFF到ON的过程。有些ECU会保留部分数据。
- 软复位(Soft Reset,0x03):只复位应用层软件,不重启底层硬件。速度最快,但有些ECU不支持。
我个人习惯在调试BMS时,经常用0x11 0x01来复位电池管理系统。因为BMS有时候会因为某些异常状态卡住,比如接触器粘连检测失败。复位一下,让它重新跑一遍初始化流程,往往能解决问题。
但这里有个大坑:千万不要在车辆行驶中复位ECU。尤其是VCU(整车控制器),你一发复位指令,整车动力中断,后果不堪设想。所以UDS协议规定,复位服务只能在特定会话下执行,而且很多OEM会要求车速为0时才能复位。
避坑指南:我曾经在测试时,不小心对MCU(电机控制器)发了复位指令。当时电机还在高速旋转,结果复位后MCU丢失了转子位置信息,电机瞬间产生巨大反电动势,差点烧了IGBT。从那以后,我每次发复位指令前,都会再三确认车辆状态。记住:复位不是儿戏,尤其是对高压部件。
1.5 小结一下
好了,咱们今天把UDS的底子打了一遍。ISO 14229-1是总纲,SID是服务的“身份证”,0x10是门禁,0x11是重启键。这些东西看着简单,但实际项目中,80%的诊断问题都出在这些基础服务上。
下一章,咱们会深入讲安全访问(0x27)和通信控制(0x28)。这两个服务在新能源车中特别常用,尤其是BMS的绝缘检测和MCU的高压互锁诊断,都离不开它们。
好,今天就到这儿。有什么问题,咱们课后交流。