1、简介
在车辆维修和开发工作中,诊断工具必不可少,通过诊断工具,可以读取车辆的故障码,定位故障原因,也可以读取和解析车辆的实时数据。而**诊断协议就是指诊断工具与车辆之间的通信协议**。目前,市场上最常见的两种汽车诊断协议是OBD和UDS。
统一诊断服务(UDS,Unified Diagnostic Services)是基于**ISO 14229标准的诊断协议,用于在车辆中对ECU进行诊断、修复、调试等操作。UDS协议可以提供丰富的服务,包括故障诊断、数据读取、编程、ECU重启**等功能,是车辆故障诊断、调试以及维修保养中不可或缺的一部分。


2、目的
本设计文档旨在定义和规范基于 ISO 14229 标准的UDS协议的实现方案,主要包括寻址模式、服务功能、诊断请求和响应及TP层实现,为开发人员提供清晰的开发指导。
3、参考ISO标准
- ISO14229
UDS协议规范在 ISO 14229 的不同子标准中进行了定义。ISO-14229 标准由以下部分组成:
- ISO 14229-1:UDS协议的规范和要求。
- ISO 14229-2:UDS协议的会话层服务。
- ISO 14229-3:定义了UDS基于CAN总线的实现。
- ISO 14229-4:定义了UDS基于FlexRay总线的实现。
- ISO 14229-5:定义了UDS基于以太网协议的实现。
- ISO 14229-6:定义了UDS基于K-Line总线的实现。
- ISO 14229-7:定义了UDS基于LIN总线的实现。
- 基于CAN总线实现
UDS协议是一个应用层的协议,不关心底层通信的接口如何实现,可以基于CAN、LIN、以太网等任意通信接口。
UDS基于CAN总线的实现,在物理层和数据链路层遵循的是ISO 11898(定义经典CAN物理、数据链路层规范),而它的传输层遵循的是ISO 15765-2(定义CAN传输层规范),在应用层遵循的是ISO 14229-3(定义UDS基于CAN应用层规范)。
经典CAN数据链路层最大能够支持8个字节,但ISO 14229并不仅仅是为了CAN总线设计的,最大容量达到4095个字节。比如VIN码是17个字节,CAN总线必然需要传递3帧才能传完VIN码,那么如何科学、快捷、安全地将多个字节通过经典CAN来进行传输,就成了一个需要解决的问题。ISO 15765-2 协议由此诞生。

4、术语和缩写
- **UDS: **Unified Diagnostic Services (统一诊断服务)
- **ECU: **Electronic Control Unit (电子控制单元)
- DTC: Diagnostic Trouble Code (诊断故障码)
- **SID: **Service ID (服务ID)
- **DID: **Data Identifier (数据标识符)
- RID: Routine Identifier (例程标识符)
- **NRC: **Negative Response Code (否定响应码)
- Tester: 外部诊断仪
二、UDS协议的基本概念
1、UDS协议的寻址模式
物理寻址(点对点、一对一)
根据物理地址的不同进行访问,但只能访问(通过CAN ID访问)单个ECU节点,Tester为SA源地址,ECU作为TA目标地址。
功能寻址(广播、一对多)
根据功能的不同进行访问,它能访问(通过CAN ID访问)多个ECU节点,对于标准帧来说,通常是0x7DF,也就是说本网络中所有ECU都要对这条指令做出响应,即一对多模式。
每一个ECU都有2个CAN的诊断帧ID,分别对应物理寻址的收与发。通常由主机厂来确定不同ECU的这两个特定的诊断ID。比如0x701对应接收Tester的消息,0x709对应发给Tester的消息。
2、服务ID(SID)
在UDS协议中,Service ID(SID)是指服务标识符,用于标识要执行的服务。每个服务都有一个唯一的SID,在诊断会话中通过SID来区分要执行/响应哪种服务请求。14229-1中定义了26种服务并将这些服务分为6大类:诊断和通信管理类、数据传输类、存储数据传输类、输入输出控制类、例程功能类、上传下载类。


3、诊断请求
诊断请求是指诊断工具向车辆发送的请求消息,用于请求执行某个服务。诊断请求消息由三个部分组成:SID、子功能和实际数据。其中,SID用于标识要执行的服务,至于子功能:指的是这个服务还能更进一步的划分或者具有启动/暂停之类的子功能。
尽管服务类型不尽相同,但UDS针对这些服务定义了统一的诊断请求包的格式,每个诊断请求由1个Byte的SID+1个Byte的sub-function(实际上是1bit spr+7bitsub-function,具体解释看下文)+不定长的实际数据构成,其格式如下所示:


4、正响应/负响应
诊断工具向车辆发送服务请求后,如果服务执行成功,则返回的响应消息称为正响应,反之,返回的响应消息称为负响应。
正响应报文格式
正响应报文的字节组成格式如下图:

举例:0x10诊断会话控制服务

负响应报文格式
负响应消息由两部分组成:SID和负响应码(NRC)。SID用于标识响应的服务,负响应码指示服务执行失败的原因。
负响应报文的字节组成格式如下所示:

举例:0x10诊断会话控制服务

5、负响应码(NRC)
在UDS协议中,负响应码用于指示服务执行失败的原因。NRC用一个字节表示,每个取值都对应一种不同的错误类型。
三、UDS协议的服务
UDS协议提供多种诊断服务,下面介绍常见的几种服务。
1、诊断和通信管理类
1.1、会话控制服务(SID=0x10)
服务功能
功能描述
在《ISO14229-1》ISO标准文档中针对10服务做了十分详细的说明,总结下来其主要体现为以下几点:
- 10服务是用来使能Server(即ECU)不同诊断会话的一种服务;
- 不同的诊断会话则规定了Server在相应session可以开启的功能权限;
- 在不同的诊断会话则应使用对应的数据链路层的时间参数;
其中最为核心的一点就是诊断服务权限控制。如下图所示,明确规定了不同的诊断服务在默认会话和非默认会话下的可用性,其中“X”则代表可用,”not applicable”则代表不可用。

应用场景
- 如上图所示,当执行27或者28等非常规服务时,则需要在非默认会话下执行,在默认会话下则不
能够使用;
- 当需要重新编程Server时,那么此时需进入到编程会话下,这样所有与编程会话相关的诊断服务便
可以设定仅允许在该session下运行;
- 当整车制造商或者零部件供应商需要在自定义的seesion下完成某些特别的操作时,可以采用10服
务控制,如产线内部使用的特定服务便可以在其自定义的会话下进行,避免与客户的会话下服务需求起冲突。
服务请求格式

SessionType的取值及对应含义如下:(标黄的为主要使用类型)
服务响应格式
正响应

SessionType的取值同上,SessionParameterRecord的4个字节含义如下:

这四个字节实际上是两个时间参数的值(P2Server max和P2*Server max),关于时间参数,可以简单理解为Server端接收到请求后如果未在指定的时间参数内给出响应,则需要执行超时操作。
负响应

支持的负响应码(NRC)如下:
服务示例
假设现在诊断仪控制目标ECU进入编程会话模式,发送请求时设置spr位为0(即不抑制正响应),同时假设目标ECU中设置的时间参数分别为:P2server_max=50ms(0×0032),和P2*Server_max=5000ms(0×01F4),通信过程如下所示:

1.2、ECU复位服务(SID=0x11)
服务功能
功能描述
该服务请求ECU根据请求消息中的ResetType参数的值执行不同类型的ECU复位。复位成功后(ECU正响应该服务请求),进入Default Session(默认会话模式)。
应用场景
- ECU被刷写新的软件后,此时需要通过11服务重启该ECU使其恢复到初始状态;
- 为满足特定功能的需要,输入相关标定参数给到ECU后,只有通过11服务重启该ECU才能使得标定参数生效的场景;
服务请求格式

对应请求消息中的ResetType的取值及其含义如下表所示:(标黄的为主要使用类型)
服务响应格式
正响应

**ResetType:**取值及对应含义与上表相同;
powerDownTime:****该参数仅在subfunction(即ResetType)=0x04时才会有,指的是ECU断电过程中保持待机状态的最小时间,即指示这个ECU至少要多久才能进入休眠状态。其他情况下,Server只回复前两个字节,该参数取值范围为0x00-0xFE(254s),0xFF为无效值。
负响应

支持的负响应码(NRC)
服务示例
假设现在诊断仪控制目标ECU进行硬复位,发送请求时设置spr位为0(即不抑制正响应),通信过程如下所示:

1.3、安全访问服务(SID=0x27)
服务功能
功能描述
在车载ECU中,一些数据或者操作是比较重要的,对于这种敏感的数据或者操作需要有安全访问控制,因此,诊断服务0x27应运而生。它主要用于车载ECU数据上传或者下载,传递重要信息以及敏感操作等过程中。即对请求执行操作的人进行**鉴权,只有正确解锁对应的安全等级**,才能访问该安全等级的数据,否则无法访问。
应用场景
- 通常在向Flash中写数据时,都需要先执行0x27安全解锁之后才能进行安全写入,最常见的就是对ECU进行软件刷写时,需要先通过0x27安全解锁才能进行后续重编程操作,否则将对ECU造成极大的安全风险。
- 使用0x31服务执行十分重要的routine时,需要优先执行0x27进行安全解锁之后才能够执行对应的routine。
- 在产线写入较为重要的版本或者标定等信息过程中,需要先使用0x27服务才能使用写操作的诊断指令,如0x2E服务。

