目录
一.AutoSAR 诊断功能概述
二.UDS 服务分类
诊断报文格式
(1)带有子服务的请求报文
(2)不带子服务的请求报文
(3)含有子服务正响应报文
(4)不含子服务正响应报文
(5)负响应报文
三.诊断的寻址方式
(1)物理寻址
(2)功能寻址
四.UDS 常用诊断服务
0x10服务(诊断会话控制)
0x11服务(ECU 复位)
0x27服务(安全访问)
0x28服务(通讯控制)
0x3E服务(待机在线)
0x85服务(诊断故障码设置控制)
0x22服务(读 DID 数据)
0x2E服务(写DID 数据)
0x14服务(清除故障码)
0x19服务(读故障码信息)
0x2F服务(通过 DID 控制输入输出)
0x31服务(例程控制)
0x34服务(请求下载)
0x36服务(传输数据)
0x37服务(传输数据)
NRC(负响应码)
一.AutoSAR 诊断功能概述
从图中可以看出,诊断服务属于 AutoSAR 服务层,诊断数据流通过CAN驱动CANIF 层 CANTP PDUR DCM 给到 DCM 模块,DCM 模块处理诊断数据,并执行对应的具体诊断服务。
DCM: Diagnostic Communication Manager,诊断通信管理。实现具体的诊断协议,比如 UDS、 OBD。这里具体定义了各种不同的诊断服务,比如读取 ECU 故障码、写入 DID 数据等。
DEM:Diagnostic Communication Manager 诊断事件管理,用来记录和存储诊断事件的,在诊断故障码写入的时候会加入防抖策略。
FIM:Function Inhibition Manager,功能禁止管理。当一些错误出现的时候,禁止一些功能,比如检测到电流过大的时候,关闭继电器。就是有些 SWC是需要使能条件的,这些条件取决于故障内容(源于 DEM),而 FIM 负责根据故障内容关闭一些 SWC 或执行一些 SWC、DCM 和 DEM 直接交互,只要在 0x19 0x14 等与 DTC 相关服务的时候进行交互。
故障响应:应用层传输数据到 DEM, DEM 判断出是哪个故障,之后发送给 FIM;FIM 立即做出判断,通过回调函数通知 SWC 或者轮询的方式禁止 SWC。
故障记录:应用层传输数据给 DEM, DEM 一边发送给 FIM,另一边发送给 NVM,NVM 会将 DTC 存储到 FLASH 中。
二.UDS 服务分类
UDS 服务(Unified Diagnostic Service)统一诊断服务协议, ISO 14229 对UDS 服务分成了几大类
• 诊断和通信管理功能组
• 数据传输功能组
• 存储数据传输功能组
• 输入输出控制功能组
• 例行程序功能组
• 上传下载功能组
其中诊断服务有支持子服务和不支持子服务之分。
诊断报文格式
下面缩写字母解释
M:强制的 必须的
S:强制的,需从参数列表中选择一个
U:用户自定义,可选的
(1)带有子服务的请求报文
由服务 ID,子服务 ID,数据参数(可选)组成
例如: 10 01(请求切换到默认会话模式)
例如: 19 02 FF(请求读取以 0xFF 为 Mask 的故障信息)
(2)不带子服务的请求报文
由服务 ID,数据参数(可选)组成
例如: 22 F0 90(请求读取 DID 为 0xF090 的数据)
例如: 37(请求数据传输退出服务)
(3)含有子服务正响应报文
由响应 ID,子服务 ID,数据参数(可选)组成,其中响应 ID 值为对应请求ID+0x40
例如:
请求: 10 01(切换默认会话模式)
响应: 50 01 xx xx xx xx(成功切换默认会话模式)
(4)不含子服务正响应报文
由响应 ID,数据参数(可选)组成,其中响应 ID 为对应请求 ID+0x40
例如:
请求: 22 F0 90(读取 DID 为 0xF090 的数据)
响应: 62 F0 90 11 11 11 11 11 11 11 11 11 11(返回 DID 为 0xF090 的数据为 11 11 11 11 11 11 11 11 11 11)
(5)负响应报文
例如:
请求: 10 02(切换编程会话模式)
负响应: 7F 10 7E(切换编程会话服务执行失败 错误码 NRC 为 7E)
三.诊断的寻址方式
CAN 总线是广播形式的通信,即一条报文发送后, CAN 网络中的所有节点都可以收到该报文,诊断仪在发送诊断请求报文后,具体是想跟网络中的哪个 ECU 进行诊断会话呢,这个是通过什么方式判断的?这就引出了寻址方式的概念。
寻址方式有两种, 物理寻址和功能寻址。
(1)物理寻址
是诊断仪和单个 ECU 之间的诊断,也就是诊断请求报文发出去后,根据报文ID, CAN 网络中只会有对应的一个 ECU 进行诊断响应。
(2)功能寻址
是诊断仪和多个 ECU 之间的诊断,也就是诊断请求报文发出去后, CAN 网络中支持该功能寻址报文 ID 的 ECU,一般功能寻址报文 ID 为 0x7DF,这些 ECU 都会执行诊断服务,并且发出诊断响应。
一个 ECU 内部一般会定义 3 条诊断报文:
• 诊断请求接收报文(物理寻址 报文 ID 用户自定义 同一网络中的每个 ECU 不一样)
• 诊断请求接收报文(功能寻址 一般为 0x7DF)
• 诊断应答发送报文(同一网络的每个 ECU 的 ID 不一样)
例:整车同一网络中有 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 响应)
四.UDS 常用诊断服务
• 诊断会话控制 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)
0x10服务(诊断会话控制)
请求格式
正响应格式
负响应格式
NRC
会话模式有默认会话模式(default session)和非默认会话模式(non-default session),非默认会话模式包含编程会话模式(ProgrammingSession)、拓展诊断会话模式(extendedDiagnosticSession)及其余会话模式。会话模式可以理解为诊断的功能模式,即在不同的会话模式下,能够支持不同的诊断功能,如在默认会话模式下,一般情况下不允许支持写服务(WriteDataByIdentifier0x2E),也不允许支持请求下载服务(RequestDownload0x34),而在拓展诊断会话模式下,就允许支持写服务
(WriteDataByIdentifier0x2E),在编程会话模式下,就可以支持(RequestDownload0x34)。
DiagnosticSessionControl(0x10)为控制切换各个会话模式的服务。
如下图,为三种常用会话模式的转换图
• 默认会话模式(default session 0x01)
• 编程会话模式(ProgrammingSession 0x02)
• 拓展诊断会话模式(extendedDiagnosticSession 0x03
注意:默认会话模式不能直接进入拓展诊断会话模式,必须先进入编程会话模式再进入拓展诊断会话模式。
0x11服务(ECU 复位)
ECU 复位 ECUReset(0x11)是控制 ECU 端执行复位的服务。诊断仪发送 11 01 复位请求后, ECU 复位动作执行前,正响应需先发送给诊断仪,然后 ECU 执行复位操作,成功复位后, ECU 需进入默认会话模式。
请求格式
子功能
正响应格式
负响应格式
NRC
0x27服务(安全访问)
seed 请求格式
seed 正响应格式
key 请求验证格式
key 验证正响应格式格式
负响应格式
安全访问 SecurityAccess(0x27),此服务是提供访问 ECU 内部数据或者出于安全因素需被限制的诊断服务的请求权限。常见的如读服务(0x22)读取非安全信息时能够直接读取,不需要利用 27 服务进行安全访问,而通过写服务(0x2E)写入数据时,则通常需要通过 27 服务进行安全访问才可以写,刷新程序也需要利用 27 服务通过相关的安全等级才能够对 ECU 进行程序下载,显然这些都是需要利用 27 服务进行权限管控,从而保障 ECU 的安全可靠。
安全访问序列如下图所示,一共 4 步组成:
• 诊断仪先发送请求 seed 的报文(27 01)
• ECU 响应 seed(67 01 xx xx xx xx)
• 诊断仪根据返回的 seed 按照约定算法计算 key 值,并发送给 ECU 请求验证(27 02 xx xx xx xx)
• ECU 收到请求之后,也按照约定的算法对该 key 进行校验,并给出响应,若计算一致,则为正响应(67 02),否则为负响应(7F 27 NRC)
ECU 若校验 key 一致,则 ECU 则切换安全状态至对应的解锁状态,此时在该解锁状态下能够支持的服务都应该可以工作。如果 ECU 已经处于解锁状态,此时诊断仪再次发送请求 seed 的报文, ECU 应该响应 seed 为 0 的正响应。
seed 请求的子服务值为奇数,对应的 key 请求验证的子服务值为该奇数加 1,如 27 01 与 27 02 为一组安全等级, 27 03 与 27 04 为一组安全等级, 27 11 与27 12 为一组安全等级。不同的安全等级由客户定义功能区分。
0x28服务(通讯控制)
通讯控制服务用于开启或关闭 ECU 对某些报文的发送或接收,如应用报文和网络管理报文等。
请求格式
正响应格式
负响应格式
NRC
0x3E服务(待机在线)
该服务用于诊断仪端告知 ECU 诊断仪依然在线。该服务通常用于保持 ECU 处于非默认模式,由于 ECU 在 S3server 时间收不到诊断请求的话, ECU 将会退回默认会话模式(default session),所以诊断仪为了保持 ECU 处于非默认模式,需要周期性发送 TesterPresent 服务指令,周期时间需要小于 S3server。
请求格式
正响应格式
负响应格式
0x85服务(诊断故障码设置控制)
诊断故障代码设置控制服务用于停止或重启 ECU 诊断故障代码的记录。当通过该服务对故障码记录进行抑制操作后,若会话层时序参数超时从而 ECU进入默认会话,或 ECU 执行复位操作后,诊断故障代码应该恢复记录。
当接收到诊断仪发送的清除诊断信息(0x14)服务后, ECU 应重新开启诊断故障代码记录。
请求格式
正响应格式
负响应格式
0x22服务(读 DID 数据)
根据 DID(标识符)读取数据服务用于从 ECU 存储器中读取由 DID 所确定的数据记录值,其中 DID 为两个字节长度的数值。
ISO14229 中定义该服务的请求报文允许支持 1 个或者多个数据标识符,一般主机厂仅支持 1 个 DID 读取。下图报文格式也以 1 个 DID 作为讲解。
请求格式
正响应格式
负响应格式
0x2E服务(写DID 数据)
根据 DID 写入数据服务允许诊断仪将数据写入由 DID 指定的内部存储单元。 ECU应在数据写入成功后发送该服务的肯定响应。
请求格式
正响应格式
负响应格式
0x14服务(清除故障码)
正响应需在诊断信息清除请求后, ECU 处理完成后发出,即使 ECU 没有存储的DTC,也需发出正响应报文。清除 DTC 的同时,所有 DTC 相关存储信息都应被清除。
请求格式
正响应格式
负响应格式
0x19服务(读故障码信息)
该服务允许客户端从服务器请求诊断信息(包括 DTC,捕获的数据等)。该服务允许客户端从车辆内的任何服务器或服务器组读取服务器驻留诊断故障代码(DTC)信息的状态。 除非另有说明,否则服务器应返回与排放有关的 DTC 信息和与排放无关的 DTC 信息。
请求格式
正响应格式
负响应格式
0x2F服务(通过 DID 控制输入输出)
该服务是用于通过 DID 来直接控制 ECU 对应的输入输出信号。
请求格式
正响应格式
负响应格式
0x31服务(例程控制)
请求格式
正响应格式
负响应格式
0x34服务(请求下载)
请求格式
正响应格式
负响应格式
0x36服务(传输数据)
请求格式
正响应格式
负响应格式
0x37服务(传输数据)
请求格式
正响应格式
负响应格式