UDS服务简易教程

本文主要以简单易懂的描述向大家介绍CAN诊断基础知识,本文主要介绍CAN诊断中UDS服务的基本内容,主要参考文件ISO15765-2、ISO15765-3、ISO14229-1,读完本篇文章后希望进一步了解的朋友请查阅上述参考文件。

本人关于CAN诊断轻松入门系列的文章有第一讲至第三讲,其中

第一讲:CAN诊断网络层与应用层基本知识讲解

第二讲:CAN诊断UDS服务讲解

第三讲:CAN诊断DTC知识讲解

本文章适合汽车行业刚刚入门的嵌入式软件工程师、系统工程师、测试工程师及其余对CAN诊断感兴趣的朋友们。

欢迎关注本团队关于汽车车身电子系统嵌入式软件开发入门系列文章

《汽车车身电子系统嵌入式软件开发入门》

Yueting Ben:汽车车身电子系统嵌入式软件开发入门11 赞同 · 0 评论文章


目录:

  1. 基本说明

  2. 诊断服务格式

  3. 寻址方式

  4. 诊断服务

  5. 负响应码


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需进入默认会话模式。

请求格式

正响应格式

负响应格式

  • 安全访问SecurityAccess(0x27)

安全访问SecurityAccess(0x27),此服务是提供访问ECU内部数据或者出于安全因素需被限制的诊断服务的请求权限。常见的如读服务(0x22)读取非安全信息时能够直接读取,不需要利用27服务进行安全访问,而通过写服务(0x2E)写入数据时,则通常需要通过27服务进行安全访问才可以写,刷新程序也需要利用27服务通过相关的安全等级才能够对ECU进行程序下载,显然这些都是需要利用27服务进行权限管控,从而保障ECU的安全可靠。

安全访问序列如下图所示,一共4步组成,

  1. 诊断仪先发送请求seed的报文(27 01)

  2. ECU响应seed(67 01 xx xx xx xx)

  3. 诊断仪根据返回的seed按照约定算法计算key值,并发送给ECU请求验证(27 02 xx xx xx xx)

  4. ECU收到请求之后,也按照约定的算法对该key进行校验,并给出响应,若计算一致,则为正响应(67 02),否则为负响应(7F 27 NRC)

图4-8 安全访问序列图

ECU若校验key一致,则ECU则切换安全状态至对应的解锁状态,此时在该解锁状态下能够支持的服务都应该可以工作。如果ECU已经处于解锁状态,此时诊断仪再次发送请求seed的报文,ECU应该响应seed为0的正响应。

seed请求的子服务值为奇数,对应的key请求验证的子服务值为该奇数加1,如27 01与27 02为一组安全等级,27 03与27 04为一组安全等级,27 11与27 12为一组安全等级。不同的安全等级由客户定义功能区分。

seed请求格式

seed正响应格式

key请求验证格式

key验证正响应格式格式

负响应格式

  • 通讯控制CommunicationControl(0x28)

通讯控制服务用于开启或关闭ECU对某些报文的发送或接收,如应用报文和网络管理报文等。

请求格式

正响应格式

负响应格式

  • 待机在线TesterPresent(0x3E)

该服务用于诊断仪端告知ECU诊断仪依然在线。该服务通常用于保持ECU处于非默认模式,由于ECU在S3server时间收不到诊断请求的话,ECU将会退回默认会话模式(default session),所以诊断仪为了保持ECU处于非默认模式,需要周期性发送TesterPresent服务指令,周期时间需要小于S3server。

请求格式

正响应格式

负响应格式

  • 诊断故障码设置控制ControlDTCSetting(0x85)

诊断故障代码设置控制服务用于停止或重启ECU诊断故障代码的记录。

当通过该服务对故障码记录进行抑制操作后,若会话层时序参数超时从而ECU进入默认会话,或ECU执行复位操作后,诊断故障代码应该恢复记录。

当接收到诊断仪发送的清除诊断信息(0x14)服务后,ECU应重新开启诊断故障代码记录。

请求格式

正响应格式

负响应格式

  • 读DID数据ReadDataByIdentifier(0x22)

根据DID(标识符)读取数据服务用于从ECU存储器中读取由DID所确定的数据记录值,其中DID为两个字节长度的数值。

ISO14229中定义该服务的请求报文允许支持1个或者多个数据标识符,一般主机厂仅支持1个DID读取。下图报文格式也以1个DID作为讲解。

请求格式

正响应格式

负响应格式

  • 写DID数据WriteDataByIdentifier(0x2E)

根据DID写入数据服务允许诊断仪将数据写入由DID指定的内部存储单元。ECU应在数据写入成功后发送该服务的肯定响应。

请求格式

正响应格式

负响应格式

  • 清除故障码ClearDiagnosticInformation(0x14)

正响应需在诊断信息清除请求后,ECU处理完成后发出,即使 ECU 没有存储的 DTC,也需发出正响应报文。清除 DTC 的同时,所有 DTC 相关存储信息都应被清除。

请求格式

正响应格式

负响应格式

  • 读故障码信息ReadDTCInformation(0x19)

请求格式

正响应格式

负响应格式

  • 通过DID控制输入输出InputOutputControlByIdentifier(0x2F)

该服务是用于通过DID来直接控制ECU对应的输入输出信号。

请求格式

正响应格式

负响应格式

  • 例程控制RoutineControl(0x31)

请求格式

正响应格式

负响应格式

  • 请求下载RequestDownload(0x34)

请求格式

正响应格式

负响应格式

  • 传输数据TransferData(0x36)

请求格式

正响应格式

负响应格式

  • 请求数据传输退出RequestTransferExit(0x37)

请求格式

正响应格式

负响应格式


5. 负响应码

https://mp.weixin.qq.com/s/-uQ5rnXooLnCeTlKF6Ii8A

  • 12
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDS (Unified Diagnostic Services) 是一种面向汽车电子控制系统的诊断协议。其中,服务 0x1101 是请求 ECU 的诊断标识符。下面是一个简单的 C 语言程序,用于实现 UDS 服务 0x1101: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/un.h> #define SOCKET_PATH "/tmp/uds_socket" // UDS Socket 路径 #define SERVICE_ID 0x1101 // UDS 服务 ID int main() { int sock_fd, conn_fd; struct sockaddr_un addr; char buf[1024]; int len; // 创建 Socket sock_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (sock_fd < 0) { perror("socket"); exit(1); } // 绑定 Socket memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1); if (bind(sock_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(1); } // 监听 Socket if (listen(sock_fd, 5) < 0) { perror("listen"); exit(1); } // 接受连接请求 conn_fd = accept(sock_fd, NULL, NULL); if (conn_fd < 0) { perror("accept"); exit(1); } // 读取请求数据 len = read(conn_fd, buf, sizeof(buf)); if (len < 0) { perror("read"); exit(1); } // 处理请求 if (len >= 2 && buf[0] == SERVICE_ID && buf[1] == 0x00) { // 请求 ECU 诊断标识符 char response[] = { SERVICE_ID, 0x02, 0x11, 0x22 }; // 返回诊断标识符 0x1122 write(conn_fd, response, sizeof(response)); } else { // 其他未实现的服务 char response[] = { 0x7F, SERVICE_ID, 0x12, 0x34 }; // 返回未实现服务响应码 write(conn_fd, response, sizeof(response)); } // 关闭连接 close(conn_fd); return 0; } ``` 在上述代码中,我们使用 Unix 域套接字 (AF_UNIX) 来实现 UDS 服务。程序先创建 Socket 并绑定到指定的路径,然后监听 Socket 并接受连接请求。当有客户端连接到 Socket 后,程序从连接中读取请求数据,并判断是否是请求 ECU 诊断标识符的服务 (0x1101)。如果是,则返回诊断标识符 0x1122,否则返回未实现服务响应码。最后,程序关闭连接并退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值