【诊断】汽车电子的UDS诊断总结
UDS诊断中的物理寻址和功能寻址
诊断的响应规则:物理寻址和功能寻址
- UDS诊断服务是实现人或设备与ECU控制器交流的一种语言,那么
- 诊断服务的响应规则就如同是语法,而SID(Service ID)定义就如同词汇。
- 2种响应规则:物理寻址和功能寻址
- 整车厂定义,提供给供应商
物理寻址PHY
- 指定发送特定诊断请求Request,等待指定ECU给与响应。
- 类似:医生和患者一对一
- 报文可以多帧
功能寻址FUN
- 可以广播诊断请求Request,同时等待总线上的ECU给与响应。
- 类似:医生喊话“感冒的人?”和患者一对多
- 所有报文都是单帧
![image]()
对比
支持的服务:
- 物理寻址:支持所有UDS服务,
- 功能寻址:只支持部分服务,如10、11、28、3E、85、22、14和19等
寻址对象:
- 功能寻址:它是基于ECU(Electronic Control Unit,电子控制单元)的功能或服务进行寻址的。当诊断仪发送请求时,所有支持该功能或服务的ECU都会响应。
- 物理寻址:它是基于ECU的物理地址(通常是ECU的硬件标识符或地址)进行寻址的。诊断仪通过物理地址来指定和通信特定的ECU。
通信范围:
- 功能寻址:通常用于广播请求,例如请求所有ECU报告它们的状态。
- 物理寻址:用于与特定ECU进行一对一的通信。
响应行为:
- 功能寻址:可能导致多个ECU响应同一个请求。
- 物理寻址:只有被寻址的ECU会响应请求。
工程示例
诊断所处的层



诊断命令
UDS本质上是一种定向的通信
- 是一种交互协议(Request/Response),即诊断方(Tester)给ECU发送指定的请求数据(Request)
诊断命令格式
- (报文长度) + (SID诊断服务ID) + (SF子功能) + (DID) + (其他)
- SF:粉色子功能
- DID: data ID,22/2E服务多用,如图绿色
![image]()
![image]()
SID常见服务格式
正反馈/负反馈交互
- 正反馈:(SID+40)
- 负反馈:7F + SID + NRC
![image]()
特殊的NRC——0x78
- requestCorrectlyReceived-ResponsePending(RCRRP,请求已被正确接收-回复待定)
- 这个NRC表明请求消息被正确地接收,请求消息中的所有参数都是有效的,但是要执行的操作还没有完成,Server端还没有准备好接收另一个请求。
- 一旦请求的服务已经完成,服务器应该发送一个积极的响应或消极的响应,响应代码应与此不同。
- 这个NRC的消极响应可以被Server端重复,直到被请求的服务完成并且最终的响应消息被发送。
- 在学钥匙报文中可见此NRC
诊断服务SID
-
UDS本质上是一系列服务的集合。
-
UDS的服务包含6大类,共26种。每种服务都有自己独立的ID,即SID
- 0开头的SID:给OBD使用的,OBD必须要有
-
诊断服务分类
- UDS的服务分为6大类,但常用的服务是加背景色的15种。
- 这15种服务又可粗略地划分为权限控制、读取数据/信息、写入数据/信息、通信控制、功能控制这几类(博主自己划分)
![image]()
-
最常用的诊断服务
- $10 Diagnostic Session Control(诊断会话)
- $27 Security Access(安全访问)
- $22 Read Data By Identifier(通过ID读数据)
- $2E Write Data By Identifier(通过ID写数据)
- $14 Clear Diagnostic Information(清除诊断信息)
- $19 Read DTC Information
- $3E Tester Present(待机握手)。
![image]()
$10:诊断会话 Diagnostic Session Control
不同会话:不同权限
- 不同的诊断服务需要的权限不同
3种会话
- ECU的两大区域:bootloader和application
- 10 02:进bootloader
- 10 03:进app
- 结合实例讲解UDS诊断中的—会话Session的切换
![image]()
![image]()
- 重启:直接跳转到最最开始的start重启处,重新进入bootloader和app
![image]()
![image]()
$3E 80:待机握手,连接保持
$3E服务用于向服务器指示诊断仪仍然连接在网络上
- 之前已经激活的诊断服务功能可以仍然保持激活状态。
例子:02 3E 80 00 00 00 00 00
- 发送一个3E服务的报文,保持非默认会话状态。
- 80:表示无需回复。
非默认会话保持
- 进入了一个非默认会话的状态,一个定时器会运转
- 如果一段时间内没有请求,那么到时间后,诊断退回到默认会话01(最低权限)
- $3E服务:可以使诊断保持在非默认的状态
$27:安全访问
不同DID: 单/双数
- 首轮Tester种子的请求(27+01),ECU会返回67+01+AA+BB+CC+DD,AA~DD就是种子了。
- 第二轮,诊断端的Tester会利用种子进行运算(根据整车厂的算法),生成k1(不一定是1个字节),之后发送请求,子服务是2n,这里我们还是假定n=1,即02子服务。这样Tester发出的就是27+02+[k1]。
- 之后,ECU同样也会根据第一轮的种子自行算出k2。
- 当ECU检查出k1和k2完全一致时,解锁(Unlocked)成功。
![image]()
![image]()
![image]()
安全验证算法的核心
- 最大的核心就是算法了。
- 举个简单的算法,比如seed和ECU SN前4个字节加一下,循环左移两位,执行3轮,return这个数作为key,结束。
- 安全验证就是一把锁,算法越复杂,短时间解开的成本越高,越不易被破解掉。
- 如果失败次数过多还会触发惩罚机制,一段时间内都无法再尝试解锁,防止人为的破解。
$22/2E:根据ID读写数据
$22读数据
- Request(请求):22+DID(Data Identifier,通常是两个字节)
- Response(响应):62+DID+Data
![image]()
部分DID
- DID有一部分已经被ISO 14229-1规定了。
- 比如0xF186就是当前诊断会话数据标识符,
- 0xF187就是车厂备件号数据标识符,
- 0xF188就是车厂ECU软件号码数据ID,
- 0xF189就是车厂ECU软件版本号数据标识符。
![image]()
$2E写数据
- Request(请求):2E+DID+Data
- Response(响应):6E+DID
写数据的安全等级
- 一般需要在一个扩展会话,和安全等级1的状态下才能进行。
$19:读DTC
19服务是一套诊断服务中的重中之重
DTC
DTC(diagnostic trouble code):如果系统检测到了一个错误,它将存储为DTC。DTC可表现为:一个显而易见的故障;通讯信号的丢失(不会使故障灯亮起);排放相关的故障;安全相关的错误等。DTC可以揭示错误的位置和错误类型。通常DTC占用3个字节,OBD II占用两个字节。图中FTB为Fault Type Byte。
DTC结构
- 故障码包括四个大类,分别是PCBU,P是powertrain动力系统,C是Chassis底盘,B是Body车身,U是network通信系统。
- 一个DTC信息占用4个字节。最后一个字节是DTC的状态。
- DTMMiddleByte和DTCLowByte两个字节是我们熟知的类似P0047(ISO15031中的故障码)中“0047”的纯数字故障码。
- 第一个字节在乘用车中,前两个bit代表P/C/B/U(动力/底盘/车身/网络)中的一个,之后六个bit是数字,合在一起的样子形如“C01”。
- 第一个字节的前2个bit中,用00/01/10/11分别表示P/C/B/U。(感谢aymjwwl007)
- 举个例子,U312345这个故障码(我杜撰的),
- 它的状态是Test failed叠加Confirmed,那么DTC信息这四个字节就应该是0xF1(二进制11110001),0x23,0x45,0x09。
![image]()
- 它的状态是Test failed叠加Confirmed,那么DTC信息这四个字节就应该是0xF1(二进制11110001),0x23,0x45,0x09。
$19拥有28个子服务(Sub-Function)。常用的子服务有:
-
01 (读取符合掩码条件的DTC数量)(必须支持)
- 后面的参数是DTC状态掩码,若为01表示我想读当前故障,若为08表示我想读历史故障,若为09表示当前故障和历史故障都想读。
- 在肯定回复时:
- 组合应该是59(19+40) - 01 (子功能) - 09 (本ECU所支持的掩码条件)-01 DTC的格式(ISO14229-1为01) - 00 01 (目前满足条件的DTC有一个)
-
02(读取符合掩码条件的DTC列表及其状态)(必须支持)
- 后面的参数是DTC状态掩码,解读同上。
- 在肯定回复时:
- 59 - 02(子功能)- 09(本ECU所支持的掩码条件) - XX XX XX ( DTC,车厂定义 ) - 01 (这个故障码怎么了,01表示当前故障)
-
04(读取快照信息),也叫冻结帧。
-
06(读取扩展信息)。
-
0A(读取ECU支持的所有DTC列表及其状态)(必须支持)
- 这个就不必发DTC状态掩码了。所有支持的DTC列表及其状态都会打印出来。
黄色框是DTC,紧跟着的是DTC状态

同时读取当前/历史故障,黄色框是DTC,紧跟着的是DTC状态

$14:清除DTC
$14命令
- 清除(复位)DTC格式,它可以改变DTC的状态。
- DTC状态中的八个位,除bit4和bit6外均会被清零,包含当前故障(TestFailed)和历史故障(ConfirmedDTC)
- bit4和bit6这两个testNotCompleted开头的会被强制置1。
格式
- 3个FF代表清除所有DTC。
- Request:14+FF+FF+FF
- Response:54
![image]()
$2F:直接控制IO
2F服务:通过DID(数据标识符) 强制控制输入信号的替换和控制零部件负载输出
- 这是一个用在产线上较多的服务。
Request(请求):至少由4个字节组成
- 第一个字节是2F,第二第三字节是DID,其中第二字节是高位。
- 第四字节是input Output Control Parameter(并不算一个子功能),可以看做IO控制类型。
- 如果第4字节是03,还需要第5字节:控制开关 00/01
IO控制类型分为4类
- 00是控制权还给ECU,Return Control To ECU。
- 请求报文是4个字节。
- 01是复位为默认值,Reset to Default。
- 请求报文是4个字节。
- 02是冻结当前的状态,Freeze Current State。
- 请求报文是4个字节。
- 03是短暂接管控制权,Short Term Adjustment。
- 请求报文的第五字节是控制代码
- 可以是数字量,比如01是开,00是关;也可以是模拟量,比如空调风门的开度。
举例
- 2F服务,黄色区域为2个字节的DID
![image]()
- 这个图可以理解为:
- 关闭开关:2F XX XX 03 00
- 之后打开开关:2F XX XX 03 01
- 之后控制权还给ECU:2F XX XX 00
- 之后想复位回默认值,但是发现ECU不支持:2F XX XX 01
诊断命令备忘录
常见UDS报文

否定响应NRC

DTC状态位
























浙公网安备 33010602011771号