【车联网】UDS诊断学习
[TOC]
UDS简介
UDS(Unified Diagnostic Services 统一的诊断服务)是一种通用的诊断服务标准,用于汽车电子控制单元(ECU)的诊断和调试。UDS是ISO 14229标准定义的一种通信协议,可以在CAN、LIN等多种总线上进行通信。
UDS协议定义了一套标准的诊断服务,包括会话控制、诊断请求、诊断响应和ECU编程等功能。通过UDS协议,诊断工具可以向ECU发送特定的请求,获取ECU的状态信息和故障码,诊断和解决故障问题。
UDS协议被广泛应用于汽车电子控制系统的诊断和调试,成为现代化汽车制造的重要组成部分。
UDS诊断采用挑战/应答机制,客户端发送报文数据到服务端,服务端验证报文数据的有效性,并针对不同的报文数据内容应答不同的数据给客户端,
UDS特点
- 支持多种总线:UDS协议可以在CAN、LIN等多种总线上进行通信,具有较强的适用性。
- 提高诊断效率:UDS协议定义了一套标准的诊断服务,可以提高诊断工具的兼容性和效率。
- 增加诊断功能:UDS协议支持ECU编程等高级诊断功能,可以满足更复杂的诊断需求
UDS报文格式
客户端发送报文数据格式
格式1:[Service Identifier] + [Sub-function]
格式2:[SID] + [DID]
格式3:[SID] + [Sub-function] + [DID]
常见的诊断服务:
服务端响应报文数据格式
格式1:[SID + 0x40] + [Sub-function]
格式2:[SID + 0x40] + [DID]
格式3:[SID + 0x40] + [Sub-function] + [DID]
诊断响应分为正响应positive和负响应negative,正响应即是说客户端发送的数据合法且可以被执行,服务端响应给客户端执行输出的结果数据。
而negative负响应即是说客户端发送的数据不合法或者不正确,负响应根据不同的错误返回不同的字段,也叫做NRC码。
Negative Response的格式固定为3个字节,第一个字节为0x7F,第二个字节是SID,第三个字节是这个诊断服务无法被执行的原因
[0x7F] + [SID] + [NRC]
常见的NRC码:
UDS寻址模式
物理寻址(点对点,一对一)
根据物理地址的不同进行访问,但只能访问单个ECU节点,Tester为SA源地址,ECU作为TA,目标地址,也即测试中常说的诊断ID。不同车厂,不同零部件的物理寻址都是不同的,每个物理寻址都会配备一个对应的响应地址,例如物理寻址0x781,在进行UDS诊断发送数据的时候,就要发送0x781 02 10 01是,无论是正响应还是负响应,回复的地址都是物理寻址对应的0x789响应地址。
功能寻址(广播,一对多)
根据功能的不同进行访问,它能访问多个ECU节点,对于标准帧来说,通常是0x7DF。例如在整车环境下,利用OBD口发送7df,会发现存在多个地址不同的响应。及车内多个ECU都会对7DF有响应。
UDS 10服务
10服务即为诊断会话控制服务,用来控制服务端的会话模式切换。SID为0x10。一般默认上电后是在默认会话模式下,当某一个服务端正在运行时,只会出现一个会话模式,不会同时存在两个会话模式。
UDS三种会话模式
默认会话01:读取数据、故障码、重置ECU
默认会话下,仅支持信息的读取和查询操作,当服务端在默认会话模式下收到默认会话的请求时,服务端应当重新初始化默认会话,即之前被临时激活或者改变的数据都应该恢复到刚上电初始化的状态,写入到非易失存储器(断电数据不会消失的存储器)的数据不会重新初始化。
编程会话02:解锁ECU、控制输入输出
编程会话下,主要用来烧录程序,常用作对ECU软件进行刷写。
扩展会话03:刷写ECU的相关服务
扩展会话下,主要是用来读写数据,如写入VIN,序列号,读写诊断码等。
10服务响应
肯定响应
TX 02 10 03 00 00 00 00 00 // 02: 0表示单帧,2表示后面的数据有2个字节;10:10服务是诊断会话控制服务;03:表示子功能,扩展诊断会话;后面的0是填充位
RX 06 50 03 00 32 01 F4 AA // 06:0表示单帧,6表示后面的数据有6个字节;50:肯定响应码,值为服务请求的值加0X40;03表示子功能;00 32表示P2server_max,转换成十进制就是50,那么P2server_max就是50ms
01 F4表示P2server_max,转换成十进制就是500,再乘以单位10ms,即P2server_max为5000ms
否定响应
TX 02 10 02 00 00 00 00 00 // 10:诊断会话控制服务,02:编程会话模式
RX 03 7F 10 78 AA AA AA AA // 03: 0表示单帧,3表示后面的数据有3个字节;7F为否定响应的SID;10为会话请求;78为否定应答码
UDS11服务
11服务即为ECU复位服务,SID为0x11,主要功能是控制ECU执行复位动作,主要用于Client向Server(ECU)请求重启行为,该重启行为将会导致Server复位回归到特定的初始状态。
11服务NRC响应码
- 当发送报文长度或者格式不对时,则Server会回复”7F 11 13”
- 当诊断请求的resetType不在Server支持的范围内时,则Server会回复”7F 11 12“;
- 当Server在发生复位前处于security lock状态,那么此时Server则会回复”7F 11 33”
- 当进入到编程会话时且当前车速条件不满足,Server将会回复“7F 11 22”来告诉请求者当前进入编程会话的条件不满足,请再次检查进入编程会话的条件
报文格式
TX 02 11 01 00 00 00 00 00
RX 02 51 01 AA AA AA AA AA
正常情况下,TX之后会立即执行返回02 51,但如果ECU存在响应时间,那么可能会出现先回复一个03 7F 11 78,等待响应时间到达,再次回复02 51 01。
UDS 14服务
14服务即为清除诊断信息服务,可清除一个或多个ECU内存中的诊断信息。SID为0x14,可清除单个DTC,可以按组清除DTC,也可以清除全部DTC。当清除诊断信息服务被完全处理时,服务端需发送肯定响应。即使没有存储DTC,也需要发送肯定响应。
如果服务器在内存中支持DTC状态信息的多个副本(例如,一个RAM副本和一个EEPROM副本),则服务器应清除ReadDTCInformation状态报告服务使用的副本。其他副本(例如长期内存中的备份副本)根据适当的备份策略进行更新(例如,在电源锁定阶段)。通过此服务重置/清除DTC信息包括但不限于以下内容:
- DTC状态字节
- 捕获DTC快照数据
- 捕获DTC扩展数据
- 其他DTC相关数据,例如DTC专用/最近的DTC,标志,计数器,定时器等
groupOfDTC参数
肯定响应
只回复SID,不像其他服务,肯定响应后面会跟sub-function或参数。也就是发送04 14 FF FF FF,响应只有01 54,没有后面的参数。
报文格式
TX 04 14 FF FF FF
RX 01 54
UDS 19服务
19服务即为读取DTC信息服务,用于读取ECU的故障信息,该服务允许客户端从任何服务器或车辆内的一组服务器读取服务器驻留的诊断故障代码(DTC)信息的状态。除非特定子功能另有要求,否则服务器应返回所有DTC信息。
一般在开发当中定义以下三个DTC快照记录号:
- 0x01 故障第一次发生时的快照信息
- 0x02 故障最近一次发生时的快照信息
- 0xFF 表示支持的所有DTC Snapshot Record Number支持的快照记录
FTB含义
子功能01
01子功能:根据状态掩码报告诊断故障代码(DTC)数量。
就是返回和状态掩码相匹配的DTC数量,如果发送的故障,没有和状态掩码匹配,也不会计入到诊断故障码数量里面。状态掩码在项目中客户会提供的,每个客户需要支持的状态掩码可能不一样。
如上图的例子,首先发送了一个02 19 01,得到了负响应,NRC码为13,代表长度错误;
接着发送一个03 19 01 01,代表读取ECU存储的DTC数量,且只读取DTC状态匹配01的DTC数量。得到正响应06 59 01 0B 01 00 00 AA,0B代表可用掩码,后三位00 00 AA,00 00两个字节都为0,代表没有产生故障。
这张图片中,回复了00 01 AA,代表产生一个DTC。
子功能02
02子功能:根据状态掩码报告诊断故障代码
如图片,红框中的前3个字节为过压的诊断故障码,最后一个字节0B为DTC的状态。
负响应:
子功能04
04子功能:根据诊断故障代码报告诊断故障代码快照记录
红框里面的,即DTC和DTC的状态
子功能06
子功能0A
报告支持的DTC,在支持的状态掩码0B后面,都是DTCAndStatusRecord即支持的DTC和DTC的状态
五位故障码
P0420
第一位P代表故障系统:
- P(0):动力系统
- C(1):底盘系统
- B(2):车身系统
- U(3):网络系统
第二位0代表故障码来源(标准故障码或制造商自定义):
- 0:ISO/SAE协议
- 1:制造商自定义
- 2:ISO/SAE协议
- 3:ISO/SAE协议
第三位4代表故障所属的子系统:
第四、第五位20算作一个整体,代表发送故障的具体部件及类型,是被协议定义的:
UDS传输的四种帧
单帧传输(SF):一帧CAN报文可以传输完成
多帧传输:一帧CAN报文无法完全传输完成,包括首帧FF、流控帧FC、连续帧CF
10的1代表首帧,30的3代表流控帧,21、22的2代表连续帧
UDS流控帧
流控帧的控制信息一定是三个字节
30的0,代表流状态FS,包含0、1、2三个状态:
08代表块大小BS,包含00、1-255(01-FF)两种:
14代表最小间隔时间STmin,包含0-7F(十进制0-127)、F1-F9两种值,需要注意从80-F0和F9以上没有任何意义,被协议规定保留:
27服务
27服务前置条件应在扩展会话下请求,也即先发送02 10 03更改会话。如果得到06 50 正响应,就可以发送02 27 01请求种子。
如果10 03是7F负响应或没有进行10 03请求,直接请求27服务会7F负响应
01 03 05均为请求种子,02 04 06 08均为发送KEY进行验证
27服务涉及的NRC状态码:
参考文章
https://www.bilibili.com/video/BV1DN4y1Q7Da/?spm_id_from=333.999.0.0