1. 基本说明
UDS(Unified Diagnostic Services)可以说是外界与汽车内部建立诊断的语言,若外部诊断仪与汽车内部ECU共同遵循UDS协议,诊断仪即可通过UDS相应的指令向汽车内部ECU获取相应的反馈信息,如诊断仪需要读取ECU里面的软件版本等信息,可以通过22服务指令,想写入ECU配置信息,可以通过2E服务写指令,想读取故障信息可通过19服务指令。详细服务指令本文将逐个讲解说明。汽车里的诊断由请求与响应组成,这好比医院看病,医生请求诊断,病人回答医生的问题,汽车中诊断是由外部设备发起,如诊断仪,响应是汽车内部ECU执行,如BCM、GW、PEPS等车身电子器件。
ISO 14229-1对UDS共分了如下几大类,诊断和通信管理功能组,数据传输功能组,存储数据传输功能组,输入输出控制功能组,例行程序功能组,上传下载功能组,如下图所示
2. 诊断服务格式
所有的UDS服务都有相同的请求与响应格式,掌握好该格式,对理解UDS将会容易很多。诊断是通过诊断仪和 ECU 之间的请求和响应完成的,诊断的请求通常是从诊断仪到 ECU,响应则从ECU到诊断仪。
请求报文区分带子服务的请求与不带子服务的请求,响应分正响应与负响应,其中正响应区分对应带子服务的响应与不带子服务的响应,负响应都一样。
下述表格中缩写字母解释
M:强制的
S:强制的,需从参数列表中选择一个
U:用户自定义,可选择的
注:以下所有例子中的数据都为16进制格式,为表达简明,省去“0x”前缀
- 含有子功能的请求报文
含有子功能的请求报文由请求ID,子服务ID,数据参数[可选]组成,如下图所示
例:10 01(请求切换默认会话模式)
例:19 02 FF(请求读取以0xFF为Mask的故障信息)
- 不含子功能的请求报文
不含有子功能的请求报文由请求ID,数据参数[可选]组成,如下图所示
例:22 F1 90(请求读取DID为0xF190的数据)
例:37(请求数据传输退出)
- 含有子功能正响应报文
含有子功能的响应报文由响应ID,子服务ID,数据参数[可选]组成,其中响应ID值为对应请求ID加0x40,如下图所示
例:
请求:10 01(切换默认会话模式)
响应:50 01 xx xx xx xx(成功切换默认会话模式)
- 不含有子功能正响应报文
不含有子功能的响应报文由响应ID,数据参数[可选]组成,其中响应ID值为对应请求ID加0x40,如下图所示
例:
请求:22 F1 90(读取DID为0xF190的数据)
响应:62 F1 90 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10(返回DID为0xF190的数值为00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10)
- 负响应报文
例:
请求:10 02(切换编程会话模式)
响应:7F 10 7E (错误切换至编程会话模式,NRC为7E )
3. 寻址方式
CAN是一种广播式的通信方式,即一条CAN报文发送出去后,在同一条CAN网络中的所有节点都能够收到该条CAN报文,那诊断仪在发出诊断请求报文后,具体是想诊断哪个节点,是通过什么方式判断呢?这里引出寻址方式的概念。
寻址方式有两种,一个叫物理寻址,另一个为功能寻址,物理寻址是诊断仪与单个ECU之间的诊断,而功能寻址是诊断仪与多个ECU之间的诊断,即诊断仪通过物理寻址方式发送请求报文时,只有指向的ECU可以回复响应报文;诊断仪通过功能寻址方式发送请求报文时,同一网络中支持功能寻址的所有ECU都需要回复响应报文。ECU收到诊断请求后,则通过消息的ID区分是物理寻址还是功能寻址,一般功能寻址的信号ID为0x7DF,物理寻址的消息ID为客户自定义,每个ECU都不一样。
例:整车同一网络中有ECU A, B, C, D多个节点,假设他们的物理请求消息ID为0x701, 0x702, 0x703, 0x704,响应消息地址分别为0x70A, 0x70B, 0x70C, 0x70D,所有ECU的功能寻址ID为0x7DF。
物理寻址时:
0x701 0x10 0x01 (对ECU A进行诊断请求)
0x70A 0x50 0x01 xx xx xx xx (仅ECU A响应)
功能寻址时:
0x7DF 0x10 0x01 (对所有ECU进行诊断请求)
0x70A 0x50 0x01 xx xx xx xx (ECU A响应)
0x70B 0x50 0x01 xx xx xx xx (ECU B响应)
0x70C 0x50 0x01 xx xx xx xx (ECU C响应)
0x70D 0x50 0x01 xx xx xx xx (ECU D响应)
4. 诊断服务
本文仅介绍常用的服务及格式,如下:
- 诊断会话控制DiagnosticSessionControl(0x10)
- ECU复位ECUReset(0x11)
- 安全访问SecurityAccess(0x27)
- 通讯控制CommunicationControl(0x28)
- 待机在线TesterPresent(0x3E)
- 诊断故障码设置控制ControlDTCSetting(0x85)
- 读DID数据ReadDataByIdentifier(0x22)
- 写DID数据WriteDataByIdentifier(0x2E)
- 清除故障码ClearDiagnosticInformation(0x14)
- 读故障码信息ReadDTCInformation(0x19)
- 通过DID控制输入输出InputOutputControlByIdentifier(0x2F)
- 例程控制RoutineControl(0x31)
- 请求下载RequestDownload(0x34)
- 传输数据TransferData(0x36)
- 请求数据传输退出RequestTransferExit(0x37)
其余详细了解请参考ISO 14229-1文档。
- 诊断会话控制DiagnosticSessionControl(0x10)
会话模式有默认会话模式(default session)和非默认会话模式(non-default session),非默认会话模式包含编程会话模式(ProgrammingSession)、拓展诊断会话模式(extendedDiagnosticSession)及其余会话模式。会话模式可以理解为诊断的功能模式,即在不同的会话模式下,能够支持不能的诊断功能,如在默认会话模式下,一般情况下不允许支持写服务(WriteDataByIdentifier0x2E),也不允许支持请求下载服务(RequestDownload0x34),而在拓展诊断会话模式下,就允许支持写服务(WriteDataByIdentifier0x2E),在编程会话模式下,就可以支持(RequestDownload0x34)。
DiagnosticSessionControl(0x10)为控制切换各个会话模式的服务。
如下图,为三种常用会话模式的转换图
- 默认会话模式(default session 0x01)
- 编程会话模式(ProgrammingSession 0x02)
- 拓展诊断会话模式(extendedDiagnosticSession 0x03)
图4-1 常用会话模式切换
ECU在刚上电或者复位之后处于默认会话模式(0x01),默认会话模式下发送10 03可以切换至拓展会话模式(0x03),拓展会话模式发送10 02可以切换至编程会话模式(0x02),而在默认会话模式不可以直接跳转至编程会话模式,若在模式会话模式直接发送10 02,此时ECU需要响应NRC为0x7E(subFunctionNotSupportedInActiveSession)的负响应,响应内容为7F 10 7E。
如果ECU处于非默认会话模式下,客户端发送10 01进入默认会话模式,ECU收到该请求后,ECU的安全访问状态切换到锁定状态,由ReadDataByPeriodicIdentifer(0x2A)服务配置的周期调度被禁止,通过CommunicationControl(0x28)和ControlDTCSetting(0x85)进行的设置均被复位,即ECU初始化所有在非默认模式下激活的事件,设置和控制等操作,但不包括已经写入到非易失性存储位置的操作。
请求格式
正响应格式
负响应格式
- ECU复位ECUReset(0x11)
ECU复位ECUReset(0x11)是控制ECU端执行复位的服务。诊断仪发送11 01复位请求后,ECU复位动作执行前,正响应需先发送给诊断仪,然后ECU执行复位操作,成功复位后,ECU需进入默认会话模式。
请求格式
正响应格式
负响应格式