车UDS诊断协议学习

# PREFACE:

# 车 UDS 诊断协议学习

# 概念

统一诊断服务(英语:Unified Diagnostic Services,简称 UDS)是车用电子的通信协议,是电子控制器(ECU)中设备诊断用的网络传输协议,对应的标准是 ISO 14229-1。

诊断工具可以连接车上所有支持统一诊断服务功能的电子控制器。车上常用的控制器局域网只用到 OSI 模型的第一层及第二层,而统一诊断服务集成了 OSI 模型的第五层及第七层。服务标识符(Service ID、SID)及服务相关的参数都放在 8 个字节的消息框内。

现今的车辆有配合离线诊断的诊断接口,让电脑或是诊断工具(作为测试设备)可以连接到汽车上的通信系统。因此可以发送统一诊断服务的请求到控制器,控制器必须回复(可能是正面或是负面的回复),这样可以确认个别控制单元中的故障存储器、更新控制单元的固件、和硬件进行低端的交互(例如开启或关闭特定的输出)、或是进行特定的机能,目的是了了解电子控制器的环境或是操作条件,以诊断故障或是不希望出现的行为。

# 术语

Diagnostic Service (诊断服务)

诊断服务是介于诊断设备和 ECU 之间的一种信息交互方式。通常由诊断设备发出请求,ECU 做出回应。

Diagnostic Trouble Code (故障码)

故障码是用来标记 ECU 故障的代码,它遵循一定的规则,存储在 ECU 的非易失性存储中。(以后别人提到 DTC,不要说不知道是什么了)

Diagnostic Data (诊断数据)

诊断数据是可以被诊断设备请求的 ECU 内部数据,它包括:

  • 当前数据:ECU 正在运行的数据,比如车速、节气门开度,发动机转速等;
  • 存储数据:被 ECU 存储在存储器中某时刻的数据,比如 DTC;
  • 静态数据:恒定不变的 ECU 内部数据,比如 VIN 码。

Diagnostic Session (诊断会话)

可以理解为某种诊断模式或权限,即在不同的模式下,对不同的诊断服务的使用做了限制。

Diagnostic Routine (诊断例程)

驻留在被诊断 ECU 中的子程序,它可以被诊断设备启动和停止。比如格式化 EEPROM 的子程序。

Addressing Type (寻址方式)

寻址方式指的是诊断消息的传递方式,有两种寻址方式:

  • 物理寻址,即 1 对 1 通信,用于知道确切的被诊断 ECU 的地址;
  • 功能寻址,即 1 对 n 通信,或者说广播发送,用于不知道确切的被诊断的 ECU 的地址,向一组或者全体 ECU 发送请求;

Response(响应)

tester 请求诊断服务执行后,从 ECU 的返回结果。可以有两种结果:

  • Positive Response,正响应,即诊断请求执行成功;
  • Negative Response,负响应,即诊断请求执行失败;

Service Identifier

Service Identifier,诊断服务标识符,简称为 SID,一字节的无符号整数,用来指代某个诊断服务。诊断协议为每个诊断服务都分配唯一 SID,因此更方便协议的软件实现。同时,在开发过程中沟通更加方便。比如,ReadDataByIdentifier 服务是去按照 ID 去读诊断数据,直接说 22 服务会更加便捷。

Data Identifier

简称 DID,2 个字节无符号整数的 ID,用来标识 ECU 中存储的某个诊断数据单元。它的好处是当要读取某个单元的诊断数据时,只要读对应的 DID 就可以,不必知道数据的具体地址。即使当 ECU 中的数据地址发生变化时,改变 DID 和地址单元的映射关系即可,对于使用者来说 DID 屏蔽了具体实现细节,而将重点放在了数据本身。

Negative Response Code

可以简称为 NRC,或者叫负响应码,是一个字节的无符号整数。它是诊断协议为每种执行失败的诊断服务分配的失败原因代号。

Sub-function

有些诊断服务可以支持不同的诊断子服务,sub-function 就是用来定义这种子服务的,它将某一个服务细分为更为具体的服务,是一个字节的无符号整数。比如 ECU Reset 这个服务就有 0x01,0x02,0x03 等 sub-function 指代具体的 reset 方式。

# 通信模式

事件驱动型,一问一答。

类比 client-server 通信方式,诊断仪即客户端,发送 request,服务器即 ECU,收到 request 之后进行处理,然后向诊断仪回复 response。

有确认服务:

![Untitled](车 UDS 诊断协议学习 12f4a2023fb44b1abadd10b14d012d7c/Untitled.png)

无确认服务:

![Untitled](车 UDS 诊断协议学习 12f4a2023fb44b1abadd10b14d012d7c/Untitled 1.png)

寻址模式

  • 物理寻址,点对点,一对一,可根据物理地址的不同进行访问,但只能访问单个节点,各个 ECU 也采用不同的 CANID 针对提问作出应答。
  • 功能寻址,广播模式,一对多,根据功能的不同进行访问,它可以访问多个 ECU 节点,各个 ECU 也采用不同的 CANID 针对提问作出应答。其 SID 对于标准帧来说,通常是 7DF。

比如,通过诊断仪请求各控制器进入编程模式(10 02):

** 物理寻址:** 诊断仪请求 EMS 进入刷新模式 7E0 10 02 ECU 响应诊断仪进入刷新模式 7E8 50 02

** 功能寻址:** 诊断仪请求所有控制器进入刷新模式 7DF 10 02EMS 应答诊断仪进入刷新模式 7E8 50 02TCU 应答诊断仪进入刷新模式 7E9 50 02MMI 应答诊断仪进入刷新模式 7EA 50 02

# 请求和响应

基本格式

归纳起来,诊断的 request 格式无非以下两种:

+ +

+

即有无 sub-function 的区别。Parameter 可以是 DID,可以是输入参数,可以是自定义的值,字节数视具体要求而定。

有 sub-function

首先,了解下 sub-function 的定义方法。

https://pic2.zhimg.com/80/v2-77482878fd4af8374b34d8eb1cd648f1_1440w.webp

功能寻址的客户端请求信息

https://pic4.zhimg.com/80/v2-6ae2618313c5487b2c7579dc09455d7b_1440w.webp

物理寻址的客户端请求信息

需要注意的是,Bit7 用来指示是否要抑制 Positive Response。当 Bit 7 为 1 时,对该 request 的 Positive Response 要被抑制,即不发送 Positive Response;当 Bit7 为 0 时,对该 request 的 Positive Response 不被抑制,正常发送。除了 Bit 7,Sub-function 有不同的值,具体的值和含义在协议中对每个服务的解释时都会有介绍。

无 sub-function

不带 sub-function 的服务,就带 parameter。Parameter 可以是 DID,可以是输入参数,可以是自定义的值,字节数目也是视具体要求而定。一般在协议内都会有表格,当遇到具体问题时,可查表确定。

https://pic1.zhimg.com/80/v2-349d7a784958fa581ad5230392cad4ac_1440w.webp

不带子功能–功能寻址的客户端请求信息

https://pic3.zhimg.com/80/v2-9a1eb7e0db90bcd3beffcf395c455e1e_1440w.webp

不带子功能–物理寻址的客户端请求信息

5.2 Response

通常,response 会在服务被 request 且执行之后发送,成功的话就发 positive response,失败的话要发 negative response,但是也有例外的时候。比如,ECUreset,诊断仪要求先发送 response,然后再去执行具体的 reset,因为如果先 reset,那么 ECU 的通信模块 shut down,是无法发送出去 response 的。像这种特殊情况,协议会在描述具体服务时标注出来。

Positive Response

基本格式:

<SID+0x40> + +

<SID+0x40> +

要注意,第一个字节是由 SID 和 0x40 的和构成。这里的 Parameter 项是 optional 的,具体要看协议规定。

比如,session control 这个服务:

Send:02 10 01(02 中的 0 代表网络层单帧 SF,2 代表数据域有 2 个字节;10 是 SID,02 是子功能)

肯定响应:

Receive:02 50 01 (02 同上,10+40 表示对 SID 的肯定回复,01 是 sub-funtion)

否定响应:

03 7F 10 22 xx xx xx xx;(03 同上,7F 表示否定响应,10 是 SID,22 是 NRC)不论是物理寻址还是功能寻址,对于 Positive Response 来说都没有影响,只需要关注 sub-function 中的 Bit 7 suppressPosRspMsgIndicationBit 是 0 还是 1,如果为 0 即 false,那么正常发送即可,如果是 1 即 true,那么就不发送 response。如果根本没有 subfunction 呢,那么什么都不要考虑,肯定是要发送 positive response 的。

https://pic1.zhimg.com/80/v2-35fcf45931108493f16f71bbe0bba5e8_1440w.webp

安全访问的过程

Negative Response

基本格式:

<0x7F> + +

看起来比较简单,格式比较固定,只要是 Negative Response,第一字节就是 0x7F,第二字节照抄原来的 SID,第三个字节是错误响应码,指示具体错误响应的原因,这个 NRC 可以在下文中参看。

比如,session control 这个服务:

Send:10 05(现在 sun-function 变为 05 了,假定系统不支持这个 sub-function)

Receive:7F 10 12(7F 即指代错误响应,10 为 SID,12 是 NRC,查协议可知其指代 sub-function not supported 这个错误)

常用的 NRC

  • 11:ServiceNotSupported / 服务不支持,诊断仪发送的请求消息中服务标识符无法识别或不支持;
  • 12:SubFunctionNotSupported / 不支持子服务,诊断仪发送的请求消息中子服务无法识别或不支持;
  • 13:IncorrectMessageLengthOrInvalidFormat / 不正确的消息长度或无效的格式,请求消息长度与特定服务规定的长度不匹配或者是参数格式与特定服务规定的格式不匹配;
  • 21:BusyRepeatRequest / 重复请求忙,表明 ECU 太忙而不能去执行请求。一般来说,在这种情况下,诊断仪应进行重复请求工作;
  • 22:conditionsNotCorrect / 条件不正确,表明 ECU 的状态条件不允许支持该请求;
  • 24:requestSequenceError / 请求序列错误,表明收到的是非预期的请求消息序列;
  • 25:noResponseFromSubnetComponent / 子网节点无应答,表明 ECU 收到请求,但所请求的操作无法执行;
  • 26:failurePreventsExecutionOfRequestedAction / 故障阻值请求工作执行,表明请求的动作因一故障原因而没有执行;
  • 31:requestOutOfRange / 请求超出范围,请求消息包含一个超出允许范围的参数,或者是不支持的数据标识符 / 例程标识符的访问;
  • 33:securityAccessDenied / 安全访问拒绝,诊断仪无法通过 ECU 的安全策略;
  • 35:invalidKey / 密钥无效,诊断仪发送的密钥与 ECU 内存中的密钥不匹配;
  • 36:exceedNumberOfAttempts / 超出尝试次数,诊断仪尝试获得安全访问失败次数超过了 ECU 安全策略允许的值;
  • 37:requiredTimeDelayNotExpired / 所需时间延迟未到,在 ECU 所需的请求延迟时间过去之前诊断仪又执行了一次请求;
  • 70:uploadDownloadNotAccepted / 不允许上传下载,表明试图向 ECU 内存上传 / 下载数据失败的原因是条件不允许;
  • 71:transferDataSuspended / 数据传输暂停,表明由于错误导致数据传输操作的中止;
  • 72:generalProgrammingFailure / 一般编程失败,表明在不可擦除的内存设备中进行擦除或编程时 ECU 检测到错误发生;
  • 73:wrongBlockSequenceCounter / 错误的数据块序列计数器,ECU 在数据块序列计数序列中检测到错误发生;
  • 78:requestCorrectlyReceived-ResponsePending / 正确接收请求消息 - 等待响应 表明 ECU 正确接收到请求消息,但是将执行的动作未完成且 ECU 未准备好接收其它请求;
  • 7E:subFunctionNotSupportedInActiveSession / 激活会话不支持该子服务,当前会话模式下 ECU 不支持请求的子服务;
  • 7F:serviceNotSupportedInActiveSession / 激活会话不支持该服务,当前会话模式下 ECU 不支持请求的服务;
  • 92:voltageTooHigh / 电压过高,当前电压值超过了编程允许的最大门限值;
  • 93:voltageTooLow / 电压过低,当前电压值低于了编程允许的最小门限值;

诊断仪发送报文 “85 02” 要求 EMS 关闭故障管理 ,如果是肯定应答则 EMS 会回复 “C5 02”,表示已经关闭故障管理;如果是否定应答,EMS 会回复 “7F 85 22”,表示没有关闭故障管理,原因是条件不正确。

值得一提的是,在物理寻址和功能寻址情况下,Negative Response 有所不同。

在物理寻址情况下,只要是 Negative Response 就应该按照规定格式发送。而在功能寻址情况下,有一点特殊,对于 NRC 为 0x11(service not supported)、0x12(subfunction not supported)、0x31(request out of range)这三种情况,功能寻址是不会发送 response 的。

https://pic2.zhimg.com/80/v2-f499d2093bc10d07c17db3b576d08975_1440w.webp

# 服务

功能群 请求  SID 回复  SID 服务 说明
诊断及通信管理 0x10 0x50 诊断会话控制 Diagnostic Session Control UDS 会使用不同的会话(session),可以用诊断会话控制(Diagnostic Session Control)来切换。可用的服务会依照目前有效的会话而不同。在一开始,控制单元默认是在 “默认会话”(Default Session),有定义其他的会话,需要实现的会话会依照设备的种类而不同。
・“程序会话”(Programming Session)可以用来上传固件到设备,并更新设备的固件。
・“扩展诊断会话”(Extended Diagnostic Session)可解锁特定的诊断功能,例如调整传感器等。
・“安全系统诊断会话”(Safety system diagnostic session)用来测试安全相关的诊断机能,例如安全气囊的测试。
此外,也有一些保留的会话识别符,为了汽车生产者及供应商的特殊需求而设计。
诊断及通信管理 0x11 0x51 ECU 重置 ECU Reset ECU 重置的服务是要重启 ECU。依照控制单元硬件以及实现方式的不同,有以下几种不同的重置:
・“硬重置” 模拟电源关闭的重置。
・“关闭锁匙重置” 模拟用锁匙将汽车熄火,再开启汽车的 https://zh.wikipedia.org/wiki/ 點火開關。
・“软重置” 初始化特定程序单元以及存储结构。
也有一些汽车生产者及供应商定义的特殊数值。
诊断及通信管理 0x27 0x67 安全性访问 Security Access 可以用安全性检查(Security check)来启动大部分的安全关键性服务(security-critical services)。此情形下控制单元会发送 “密码种子(seed)” 到客户端(电脑或是诊断工具)。客户端再用密码种子计算密钥(key)送回控制单元,以此来解安全关键性服务
诊断及通信管理 0x28 0x68 通信控制 Communication Control 此服务可以关闭控制单元发送以及接收消息的功能。
诊断及通信管理 0x29 0x69 认证 Authentication 标准在 2020 年的更新版本,提供一种标准化的方式,可以提供一些安全性访问(0x27)服务无法支持的现代认证方式,包括以 https://zh.wikipedia.org/wiki/ 公開金鑰基礎建設为基础的认证交换,以及双向的 https://zh.wikipedia.org/wiki/ 身份验证机制。
诊断及通信管理 0x3E 0x7E 测试者存在 Tester Present 若客户端长时间没有交换通信资料,控制单元会自动离开目前的会话,回到 “默认会话”,也可能会进入休眠模式。而此一服务的目的就是让控制单元知道客户端仍存在。
诊断及通信管理 0x83 0xC3 访问时序参数 Access Timing Parameters 在控制器及从机的通信中,需要观察一定的时间,若时间超过此限制,仍没有提交消息,就会假设连接已有问题。可以读取及修改此时间。
诊断及通信管理 0x84 0xC4 安全资料传输 Secured Data Transmission
诊断及通信管理 0x85 0xC5 控制 DTC 设置 Control DTC Settings 启动或关闭部分(或所有)错误的侦测。若诊断工作是在车内进行的,这个机能格外重要,因为诊断工作有可能造成部分零件的异常行为。
诊断及通信管理 0x86 0xC6 事件回复 Response On Event
诊断及通信管理 0x87 0xC7 链接控制 Link Control 服务链接控制是用来设置诊断访问的比特率。多半只在中间网关上实现此一机能。
资料传输 0x22 0x62 根据标识符读取资料 Read Data By Identifier 透过此服务可以读取控制单元中一个或多个的资料。这些资料的种类不限,也可以有不同的长度,例如料号或是软件版本等。也可以读取像是传感器状态之类会变动的值。每一个值会对一个资料标识符(Data Identifier、简称 DID),数值从 0 到 65535。会用正常的 CAN 信号来发送特定 ECU 使用的资料。DID 资料只用在资料请求上,也可以用一些没有 ECU 使用的 DID 来发送信息,虽 ECU 不会使用,但服务工具或软件测试程序可以使用这类的信息。
资料传输 0x23 0x63 根据地址读取存储器 Read Memory By Address 依给定地址读取物理内存中的值。测试工具可以用此机能来读取软件内部的行为。
资料传输 0x24 0x64 根据标识符读取缩放比例资料 Read Scaling Data By Identifier
资料传输 0x2A 0x6A 周期性根据标识符读取资料 Read Data By Identifier Periodic 透过此服务可以让控制单元周期性发送资料。只能发送透过 “动态定义资料标识符” 定义的标识符
资料传输 0x2C 0x6C 动态定义资料标识符 Dynamically Define Data Identifier 此服务提供一个修正设备资料标识符(DID)的方式,可以重新调整资料标识符。这个通常是不同资料标识符的组合,或者单纯是所有 DID 的串接。请求资料可以依以下的原则规划配置:
・原始资料标识符、位置、长度(依字节表示)、子功能字节:defineByIdentifier
・存储器位置、长度(依字节表示)、子功能字节:defineByMemoryAddress
・可以结合上述二种方式
资料传输 0x2E 0x6E 根据标识符写入资料 Write Data By Identifier 可以更改资料标识符中的数值,命令中除了资料标识符外,也要同时提供要修改的数值
资料传输 0x3D 0x7D 根据地址写入到存储器 Write Memory By Address “根据地址写入到存储器” 可以让外面诊断工具写信息到 ECU 里的特定地址,或特定的连续地址
存储资料发送 0x14 0x54 清除诊断信息 Clear Diagnostic Information 清除已存储的诊断问题码(Diagnostic Trouble Code,简称 DTC)
存储资料发送 0x19 0x59 读取 DTC 信息 Read DTC Information DTC 是诊断问题码。每一个 DTC 对应一个控制单元的故障,会以其编码存储在错误存储器中,可以在任意时候读取。除了错误外,也可能会记录一些相关的信息,也可以一并读取。
输入/输出控制 0x2F 0x6F 根据标识符的输入/输出控制 Input Output Control By Identifier 此服务可以让外部系统接口透过诊断接口控制输入/输出信号透过设置选择字节,可以设置有关请求的特殊条件,可以设置以下的值:
ReturnControlToECU:设备需将信号的控制权送回
ResetToDefault:测试者试图重置信号,回到系统的默认值
Freeze Current State:设备需冻结目前的信号,不允许变化
ShortTermAdjustment:设备需使用目前提供的信号值
远程启动程序 0x31 0x71 远程控制 Routine Control 此控制服务程序可以进行各种的服务,有三种不同的信息种类:
・配合启始信息,可以开始服务。可以定义此信息来确认要执行各动作,或是提示服务已经完成。
・配合停止信息,运行中的服务可以在任何时间下中断。
・第三个选项是查询服务状态的信息
可以特别标示启始及结束的信息参数,因此可以实现每一种项目特定的服务。
上传/下载 0x34 0x74 请求下载 Request Download 利用 “请求下载” 服务,可以下载新的软件或是其他资料到控制单元内。需标示资料的位置以及长度,因此,控制器可以知道数据包的大小。
上传/下载 0x35 0x75 请求上传 Request Upload “请求上传” 服务和 “请求下载” 服务是类似的,此服务可以将控制单元的软件发送给测试者。也需标示资料的位置以及长度,测试者需指定数据包的大小。
上传/下载 0x36 0x76 发送资料 Transfer Data 在真正发送资料时,会用到此一服务,不论是上传或是下载都是使用此一服务。发送的方向则视之前是 “请求上传” 服务或 “请求下载” 服务而不同。此一服务会用之前指定的最大数据包长度发送资料,若资料长度超过最大数据包长度,需要用数个数据包来发送,直到发送完成为止。
上传/下载 0x37 0x77 请求结束发送 Request Transfer Exit 可以用此服务中止资料发送。此服务用在测试着和控制单元比较时。在执行时,控制单元可以负面回应来中止资料发送请求。若指定的资料量还没发送完,也可以用此服务中止发送。
上传/下载 0x38 0x78 请求文件发送 Request File Transfer 此服务用来启始客户端到服务器的文件下载,或是服务器到客户端的文件上传。也可以提供一些文件系统的相关信息。
0x7F 否定回应 Negative Response 此回应会在服务无法进行时回复,例如不支持的资料识别符。此时会加上否定的回应码。

# NRC: Negative response codes

来自 ECU 的否定回应 (Negative Response) 包含 SID 0x7F 和两个有效负载字节:请求的 SID 和错误代码。

错误代码 (NRC) 如下:

NRC Description
0x10 General reject 一般拒绝
0x11 Service not supported 不支持的服务
0x12 Subfunction not supported 不支持的子功能
0x13 Incorrect message length or invalid format 消息长度不正确或格式错误
0x14 Response too long 反应时间太长
0x21 Busy, repeat request 忙碌 / 重复请求
0x22 Conditions not correct 条件不正确
0x24 Request sequence error 请求顺序错误
0x25 No response from subnet component 子网组件无回应
0x26 Failure prevents execution of requested action 阻止执行请求的操作失败
0x31 Request out of range 请求超出范围
0x33 Security access denied 安全访问被拒绝
0x34 Authentication failed 认证失败
0x35 Invalid key 无效的密钥
0x36 Exceeded number of attempts 超过尝试次数
0x37 Required time delay not expired 要求的延迟时间未到
0x38 Secure data transmission required 需要安全的资料传输 (SID=0x84)
0x39 Secure data transmission not allowed 不允许安全资料传输
0x3A Secure data verification failed 安全资料验证失败
0x50 Certificate validation failed, invalid time period 证书验证失败,时段无效
0x51 Certificate validation failed, invalid signature 证书验证失败,签名无效
0x52 Certificate validation failed, invalid chain of trust 证书验证失败,信任链无效
0x53 Certificate validation failed, invalid type 证书验证失败,类型无效
0x54 Certificate validation failed, invalid format 证书验证失败,格式无效
0x55 Certificate validation failed, invalid content 证书验证失败,内容无效
0x56 Certificate validation failed, invalid scope 证书验证失败,范围无效
0x57 Certificate validation failed, invalid certificate 证书验证失败,证书无效
0x58 Ownership verification failed 所有权验证失败
0x59 Challenge calculation failed 挑战计算失败
0x5A Setting access right failed 设置访问权限失败
0x5B Session key creation/derivation failed 会话密钥建立 / 派生失败
0x5C Configuration data usage failed 配置资料使用失败
0x5D Deauthentication failed 取消认证失败
0x70 Upload download not accepted 上传下载不被接受
0x71 Transfer data suspended 传输资料暂停
0x72 General programming failure 一般程序设计失败
0x73 Wrong block sequence number 错误的区块序号
0x78 Request correctly received, response pending 请求已正确接收,回应待处理
0x7E Subfunction not supported in active session 当前会话中不支持子功能
0x7F Service not supported in active session 当前会话中不支持服务
0x81 RPM too high 转速太高
0x82 RPM too low 转速太低
0x83 Engine is running 引擎正在运转
0x84 Engine is not running 引擎未运转
0x85 Engine run time too low 引擎运转时间太短
0x86 Temperature too high 温度过高
0x87 Temperature too low 温度太低
0x88 Vehicle speed too high 车速太高
0x89 Vehicle speed too low 车速太低
0x8A Throttle/pedal too high 油门 / 踏板太高
0x8B Throttle/pedal too low 油门 / 踏板太低
0x8C Transmission range not in neutral 传输范围不在空档
0x8D Transmission range not in gear 未挂档的传动范围
0x8F Brake switch not closed 刹车开关未闭合
0x90 Shifter lever not in park 变速杆不在停车位置
0x91 Torque converter clutch locked 变矩器离合器锁止
0x92 Voltage too high 电压过高
0x93 Voltage too low 电压太低
0x94 Resource temporary unavailable 资源暂时无法使用

参考:统一诊断服务 - 维基百科,自由的百科全书 (wikipedia.org)

汽车 UDS:统一诊断服务概览 - 知乎 (zhihu.com)