UDS 服务和NRC,以及单帧多帧

本文深入解析了UDS(统一诊断服务)中的诊断数据传输原理,包括基于CAN总线的单帧与多帧数据交互过程,以及负响应代码(NRC)的分类与应用。通过实例展示了数据的发送与接收流程,解释了数据包结构如PCI和DATA的重要性。

在这里插入图片描述

Negative response codes
The negative response codes (NRC) are divided into 3 ranges:

0x00: positiveResponse parameter value for server internal implementation,
0x01 – 0x7F: communication related negative response codes,
0x80 – 0xFF: negative response codes for specific conditions that are not correct at the point in time the request is received by the server. These response codes may be utilized whenever response code 0x22 (conditionsNotCorrect) is listed as valid in order to report more specifically why the requested action can not be taken.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通用服务响应流程:

在这里插入图片描述

带子功能服务响应流程:
在这里插入图片描述

&&&&&&&&&&&&&&&&&下面是单帧和多帧&&&&&&&&&&&&&&&&&&&&&

在这里插入图片描述

UDS 的诊断数据的发送与接收都是基于CAN,所以每个数据流都包含基本的CAN Message 的架构

CAN Message = CAN ID + CAN DATA

CAN ID 分为标准与扩展

在UDS的协议里面 ID 的类型并没有对其进行具体的定义,可以根据自己的需求进行自己定义,在Autosar里面是个两个配置变量,一个配置ID值,一个配置ID类型,大家自己配置一下就可以 ,对于UDS数据流来说,需要重点分析一下CAN DATA. CAN DATA的最终形成是在 网络层实现的,遵循ISO15765-2的规则,在这个层里面吸收应用层的UDS诊断数据,同时增加了这个CAN 信息的控制信息,最终形成一个帧的CAN消息,放入物理层的数据收发器里面。

每一个PDU 包含控制信息PCI,数据信息Data. 具体如下图所示:
在这里插入图片描述

综上所述,N_PDU =N_PCI+N_DATA, N_PCI的值主要集中的前三个字节,N_DATA值主要集中在后面7位字节。其中,SF_DL 代表单帧中数据的个数,FF_DL代表 连续帧中的数据总数,SN代表此帧为连续帧中的第几帧, FS参数控制发送端是否能继续传输数据,BS规定发送端允许持续传输连续帧数目的最大值,STmin限定连续帧相互之间所允许的最小值。

先面用连个例子进行说明,请参考!

例子 1— 单帧的数据传输与接收

数据发送:27 09

数据反馈:7F 27 7E — 负反馈

数据发送: 10 40

数据反馈: 50 40 00 32 01 F4

下图为在Canlyzer里面的数据截图,请参考

在这里插入图片描述

由于这个数据发送与接收都是单帧传输,所以第一个数据的高四位均为0,四个数据流中的第一个数据位,02,03,02,06代表的为此帧数据含有几个数据位,多余的数据位都用 00或者AA行填充。

例子2 — 多帧的数据接收与传输

数据发送:19 04 00 01 00 00

数据反馈:59 04 00 01 00 27 00 0B FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

下图为在Canlyzer里面的数据截图,请参考

在这里插入图片描述

数据发送为单帧,所以06代表发送的数据中含有6个字节,回复为正反馈,为连续帧,10 代表连续帧的首帧,1E代表此连续帧含有30个字节,30代表此连续帧的流控制帧,21,22,23,24代表连续帧中的第几帧,21代表第一帧,22代表第二帧,依此类推,其中AA为填充位。

UDS(Unified Diagnostic Services)协议中,NRC(Negative Response Code)码用于表示否定响应。NRC22(即0x22 hex)对应的是“conditionsNotCorrect”,表示服务器端收到请求时的条件不正确,无法采取所请求的操作。对NRC22进行诊断的方法如下: #### 确认故障现象 通过诊断设备与车辆ECU进行通信,触发相关的诊断服务请求。当收到NRC22响应时,记录下具体的请求服务ID以及相关的上下文信息,例如请求的时间、车辆的状态(如是否启动、行驶中还是静止等)。 #### 检查条件因素 根据UDS协议,NRC22表示当前条件不满足执行请求操作的要求。这可能涉及种因素,如车辆的运行状态、传感器数据、系统配置等。检查以下方面: - **车辆运行状态**:某些诊断服务可能要求车辆处于特定的运行状态,如发动机启动、车速为零等。检查车辆的实际运行状态是否符合请求服务的要求。 - **传感器数据**:传感器数据异常可能导致条件不满足。检查相关传感器的读数是否在正常范围内,例如水温、油温、电压等。 - **系统配置**:检查ECU的配置参数是否正确,某些服务可能需要特定的配置才能执行。 #### 排查通信问题 虽然NRC22主要表示条件不正确,但通信问题也可能导致误判。检查通信链路是否正常,包括CAN总线的连接、信号强度等。可以使用示波器等工具检测CAN总线的信号质量。 #### 参考诊断手册 查阅车辆制造商提供的诊断手册,其中可能包含针对NRC22响应的具体诊断流程建议。手册中可能会列出每个诊断服务对应的正确执行条件,以及如何解决条件不满足的问题。 #### 代码示例(Python模拟简单诊断流程) ```python # 模拟向ECU发送诊断请求 def send_diagnostic_request(service_id): # 这里只是模拟,实际需要通过CAN总线等进行通信 # 假设收到NRC22响应 if service_id == 0x10: # 示例服务ID return 0x22 return 0x00 # 模拟正响应 # 处理NRC22响应 def handle_nrc_22(service_id): print(f"收到NRC22响应,请求服务ID: {hex(service_id)}") # 检查车辆状态等条件 # 这里只是示例,实际需要根据具体情况实现 vehicle_running = True # 假设车辆正在运行 if not vehicle_running: print("车辆未启动,可能是条件不满足的原因。") # 其他检查逻辑... # 主程序 service_id = 0x10 response = send_diagnostic_request(service_id) if response == 0x22: handle_nrc_22(service_id) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值