UDS诊断学习(二)---- 否定响应码(NRC)

否定响应码列表

唯一的对通信有影响的否定响应码是78。

10该响应码表示 ECU 拒绝执行请求的动作。

仅当本文档中不存在其它满足实现需求的否定响应码时,该响应码才应在 ECU中实现。这不代表该响应码可作为通用的替换码而替代本文档中定义的其他响应码。

11该响应码表示由于 ECU 不支持请求的服务,所以请求的动作没有被执行。

在诊断工具发送了带有不为 ECU 所知或所支持的服务标识符的请求报文后,
ECU 将发送该响应码。因此,该否定响应码并不会在某个诊断服务支持的否
定响应码列表中显示,因为该否定码不适用于所有支持的服务。

12该响应码表示由于 ECU 不支持请求报文中具体服务的参数,所以请求的动作没有被执行。

在诊断工具发送了请求报文,该报文带有为 ECU 所知且支持的服务标识符,
但是其子功能不为 ECU 所知或所支持, ECU 将发送该响应码。

13 该响应码表示由于接收到的请求报文的长度与具体服务预定义的长度不能匹配或参数的格式与具体服务预定义的格式不能匹配,所以请求的动作没有被执行。

14如果 ECU 生成的响应超过了底下的网络层可用的最大字节数,则 ECU 将报告该响应码。

举例:当在同一时间请求多个 DID 时,在响应中所有 DID 的组合超过了传输
协议的限制。

15 – 20 (ISO 保留)

21该响应码表示 ECU 暂时太忙而暂时不能执行请求的操作。在这种情况下,诊断工具必须将“相同的请求报文”或“其它请求报文”重新发送。请求的重复发送的延迟时间必须在各自的实现文件中规定好。

举例:在多诊断工具环境下,一个诊断工具的诊断请求可能通过 NRC $21 被
暂时封锁,原因是另一个诊断工具刚完成了一项诊断任务。
注意:如果 ECU 能够执行诊断任务但是需要额外的时间才能完成任务并准备
响应,则必须使用 NRC $78 来代替 NRC $21。
通常该响应码为每个诊断服务所支持,并在数据链路具体实现文档中规定,因
此该否定响应码并不会在某个诊断服务可用的否定响应码列表中列出。

22该响应码表示由于 ECU 端先决条件不满足,所以请求的动作不会被执行。

23 (ISO 保留)

24该响应码表示由于诊断工具所发送的请求报文的顺序不符合 ECU 的规定,所以请求的动作没有被执行。当对顺序有要求的请求以错误的顺序被发出时,将用到该响应码。

举例: “安全访问”服务规定了其两种子功能请求报文“请求种子”和“发送密钥”的发送顺序。如果诊断工具的发送顺序与规定不符,则 ECU 将发送否定响应码为 24 的否定响应报文。

25该响应码表示 ECU 已经接收到请求,但是由于提供必需的被请求信息的子网部件未在规定的时间响应,导致请求的动作不能被 ECU 执行。

那些包含子网部件的电子系统,且其子网不能直接响应诊断工具的请求的网关应实现该否定响应码。网关可接收针对子网部件的请求然后向子网部件请求必要的信息,如果子网部件响应失败,则 ECU 必须使用该否定响应码通知诊断工具此种情况的发生。
通常该响应码为每个诊断服务所支持,并在数据链路具体实现文档中规定,因此该否定响应码并不会在某个诊断服务可用的否定响应码列表中列出。

26该响应码表示由于发生故障且该故障禁止 ECU 执行请求的动作,所以请求的动作没有被执行

故障由 DTC 所标识(DTC 的状态位 TestFailed, Pending,Confirmed 或 TestFailedSinceLastClear 中,至少有一位被设置为 1) 。
该否定响应码可引导维修技师去读取 DTC 以识别并定位问题。
注意:这其中隐含的意思是,用于访问 DTC 的诊断服务不能使用该 NRC,因为外部测试工具可能检测 NRC 并在接收到该 NRC 时自动请求读 DTC。
通常该响应码为每个诊断服务(除了上述的服务)所支持,并在数据链路具体实现文档中规定,因此该否定响应码并不会在某个诊断服务可用的否定响应码列表中列出。

27 - 30 (ISO 保留)

31该响应码表示由于 ECU 检测到请求报文中包含的参数值超出了授权范围(如用于替代某数的参数值为 111,而该数据仅定义到 100)或试图访问的数据标识符/例程标识符是不被支持的或在当前会话模式下不被支持,所以请求的动作没有被执行。

那些允许诊断工具读取数据,写数据或校准 ECU 内的数据的服务,必须实现该响应码。

32 (ISO 保留)

33 该响应码表示由于诊断工具未能满足 ECU 的安全策略,所以请求的动作不能被执行。

在以下情况发生时, ECU 必须发送该响应码:
ECU 的测试条件不满足,
要求的报文序列顺序不满足,例如要求先执行“诊断会话控制”服务,才能执行“安全访问”。
诊断工具发送请求报文,而此请求需要 ECU 处于解锁状态。
除了此标准中规定必须使用该响应码的服务外,该否定响应码也可用于任何需
要安全访问而尚未允许执行所需服务的地方。

34 (ISO 保留)

35 该响应码表示由于诊断工具发送的密钥与 ECU 内存中的密钥不能匹配,所以ECU 还不能进行安全访问。这可认为是一次获取安全访问权限的尝试, ECU将保持锁定并将其内部的“安全访问失败(securityAccessFailed) ”计数器递增1。

36该响应码表示由于诊断工具获取安全访问权限的尝试失败次数超过了 ECU 安全策略所允许的次数,所以请求的动作不能被执行。

37 该响应码表示由于诊断工具在 ECU 要求的超时周期未到之前,发送了尝试获取安全访问权限请求报文,所以请求的动作不能被执行。

38 – 4F该范围值为 ISO 15764(扩展数据链路安全)所保留。

50 – 6F (ISO 保留)

70该响应码表示由于存在某些错误情况,尝试向 ECU 的内存上传/下载的操作不能被完成。

71该响应码表示由于存在某些错误,数据传输操作被停止。激活的“数据传输(transferData) ”序列将被废除。

72该响应码表示 ECU 在永久性存储器设备(如 Flash 存储器)上擦除或编程一个存储器单元时检测到了错误。

73该响应码表示 ECU 在检测“块序列计数(blockSequenceCounter) ”值时发现了错误。注意, ECU 必须接受被重复发送的“数据传输”请求报文,该报文所包含的“块序列计数(blockSequenceCounter) ”参数与前一个“数据传输”请求报文的相等。

74 – 77 (ISO 保留)

78该响应码表示请求的报文被正确接收到,请求报文中所有的参数均是有效的,但是所执行的动作还未完成,而 ECU 还未准备好接收另一个请求。请求的服务一被完成, ECU 就会立即发送肯定响应报文或不同于此响应码的否定响应报文。

带有该响应码的否定响应报文可被 ECU 重复发送,直至请求的服务完成且最终的响应报文被发送。该响应码可能会影响应用层的定时参数值。数据链路具体实施文档将包含关于这方面的详细规范。
只有 ECU 在完成请求的诊断服务期间不能再接收任何来自诊断工具的请求报文的条件下,才可使用包含该响应码的否定响应报文。
当使用该响应码时,不管“禁止肯定响应报文指示位(suppressPosRspMsgIndicationBit) ”取何值, ECU 都必须发送一个最终的响应(肯定或否定)。
此处典型的例子是:当诊断工具发送了一个请求报文,其中包含需要在 ECU的 Flash 存储器中编程或擦除的数据。如果编程/擦除例程(通常在 RAM 外执行)在写 Flash 存储器期间不能支持串行通信,则 ECU 必须发送包含该响应码的否定响应报文。
通常该响应码为每个诊断服务所支持,并在数据链路具体实现文档中规定,因此该否定响应码并不会在某个诊断服务可用的否定响应码列表中列出。

79 – 7D (ISO 保留)

7E该响应码表示由于 ECU 在当前的会话模式下不支持请求的子功能,所以请求的动作不能被执行。

通常该响应码为每个诊断服务所支持,并在数据链路具体实现文档中规定,因此该否定响应码并不会在某个诊断服务可用的否定响应码列表中列出。

7F该响应码表示由于 ECU 在当前的会话模式下不支持请求的服务,所以请求的动作不能被执行。只有当知道请求的服务可在其他会话模式下支持时才能使用该响应码,否则将使用 SNS 码(11, serviceNotSupported)。

通常该响应码为每个诊断服务所支持,并在数据链路具体实现文档中规定,因此该否定响应码并不会在某个诊断服务可用的否定响应码列表中列出。

80 (ISO 保留)

81该响应码表示由于 ECU 中关于 RPM 的先决条件未能满足(当前 RPM 高于预设的最大门限值),所以请求的动作不能被执行。

82该响应码表示由于 ECU 中关于 RPM 的先决条件未能满足(当前 RPM 低于预设的最小门限值),所以请求的动作不能被执行。

83这是针对那些执行器测试的要求,在发动机运转期间执行器不能被测试。这与“RPM 过高”的否定响应码不同,需要被准许。

84这是针对那些执行器测试的要求,只有在发动机运转期间执行器才能被测试。

这与“RPM 过低”的否定响应码不同,需要被准许。

85该响应码表示由于 ECU 中关于发动机运行时间的先决条件未能满足(当前发动机运行时间低于预设的门限值),所以请求的动作不能被执行。

86该响应码表示由于 ECU 中关于温度的先决条件未能满足(当前温度高于预设的最大门限值),所以请求的动作不能被执行。

87该响应码表示由于 ECU 中关于温度的先决条件未能满足(当前温度低于预设的最小门限值),所以请求的动作不能被执行。

88该响应码表示由于 ECU 中关于车辆速度的先决条件未能满足(当前车辆速度高于预设的最大门限值),所以请求的动作不能被执行。

89该响应码表示由于 ECU 中关于车辆速度的先决条件未能满足(当前车辆速度低于预设的最小门限值),所以请求的动作不能被执行。

8A该响应码表示由于 ECU 中关于节气门/踏板位置的先决条件未能满足(当前节气门/踏板位置高于预设的最大门限值),所以请求的动作不能被执行。

8B该响应码表示由于 ECU 中关于节气门/踏板位置的先决条件未能满足(当前节气门/踏板位置低于预设的最小门限值),所以请求的动作不能被执行。

8C该响应码表示由于 ECU 中关于挂空档的先决条件未能满足(当前变速模式的范围不在空档上),所以请求的动作不能被执行。

8D该响应码表示由于 ECU 中关于挂档的先决条件未能满足(当前传输模式的范围不在档位上),所以请求的动作不能被执行。

8E (ISO 保留)

8F为安全原因,某些测试开始之前需要处于制动状态,并且在测试持续期间都必须保持制动状态。

90为安全原因,某些测试开始之前需要换挡手柄位于驻车档,并且在测试持续期间必须保持驻车状态.

91该响应码表示由于 ECU 中关于扭矩转换器离合器的先决条件未能满足(当前扭矩转换器离合器状态在预设的门限值之上或锁定),所以请求的动作不能被执行。

92该响应码表示由于 ECU 中关于 ECU(ECU)的主电源引脚的电压的先决条件未能满足(当前电压高于预设的最大门限值),所以请求的动作不能被执行。

93该响应码表示由于 ECU 中关于 ECU(ECU)的主电源引脚的电压的先决条件未能满足(当前电压低于预设的最小门限值),所以请求的动作不能被执行。

94 – FE该范围值为本文档所保留,留作将来定义。

FF (ISO 保留)

### UDS 协议中的否定响应码 (NRC) #### 背景介绍 在 UDS(Unified Diagnostic Services)协议中,NRC(Negative Response Code)被定义为一种特定的错误代码集合,用于描述 ECU(Electronic Control Unit)无法完成某个诊断请求的具体原因。这些代码不仅帮助开发者理解问题所在,还能够指导后续的操作调整[^1]。 当车辆或设备上的 ECU 接收到一条不符合预期或者不可执行的服务请求时,它会返回一个带有 NRC 的负向应答消息。这种机制允许上层应用软件识别并分析失败的原因,从而采取相应的措施来解决问题[^2]。 #### 常见的 NRC 类型及其解释 以下是几种常见的 NRC 及其对应的含义: 1. **`0x10`: General Reject** 表示所接收到的服务 ID 不受支持。这意味着当前节点不提供该服务的功能实现[^3]^。 2. **`0x11`: Service Not Supported In Active Session** 当前活动会话模式下不允许调用此服务。这通常发生在尝试在一个不适合的状态下调用了某些功能的情况下[^4]^。 3. **`0x12`: Sub-Function Not Supported/Invalid Format** 子函数未得到支持或者是参数格式有误。例如,在读取数据标识符的过程中传递了一个非法的数据长度字段值^。 4. **`0x13`: Incorrect Message Length Or Invalid Format** 收到的消息长度不对或是整体结构存在问题。比如发送方遗漏了一些必要的字节信息^。 5. **`0x21`: Request Out Of Range** 请求超出了合理范围之外。可能是因为输入数值过大、过小或者其他形式违反了预设条件限制的情况发生^。 6. **`0x22`: Security Access Denied** 安全访问遭到拒绝。只有通过适当的安全验证过程之后才能解锁受限区域内的操作权限^。 7. **`0x31`: Request Sequence Error** 发送序列存在逻辑错误。如果多个命令之间依赖于彼此的结果,则必须按照严格的顺序依次提交;否则就会触发此类错误提示^. 8. **`0x7F`: Conditions Not Correct – Common For All Requests** 条件尚未满足而无法继续下一步动作。这类情况可能是由于硬件状态暂时不稳定等原因引起^. 9. **`0x78`: Request Correctly Received, But Response Is Pending** 正常接收到了指令但是回复还需要等待一段时间才会准备好。这种情况适用于那些耗时较长的任务处理场景之中^. 以上只是部分列举出来的典型例子而已实际上还有更多种类别的NRC可供参考查阅具体文档资料获取完整的列表详情. ```python def interpret_nrc(nrc_code): """ 解析给定的 NRC 代码,并返回其意义说明 参数: nrc_code (int): 需要解析的 NRC 数值 返回: str: 对应的 NRC 描述文字 """ interpretations = { 0x10: "General Reject", 0x11: "Service Not Supported In Active Session", 0x12: "Sub-function Not Supported or Invalid Format", 0x13: "Incorrect Message Length or Invalid Format", 0x21: "Request Out of Range", 0x22: "Security Access Denied", 0x31: "Request Sequence Error", 0x7F: "Conditions Not Correct - Common for all requests", 0x78: "Request correctly received but response is pending" } return interpretations.get(nrc_code, "Unknown NRC code") # 测试案例 print(interpret_nrc(0x12)) # 输出:"Sub-function Not Supported or Invalid Format" ``` #### 总结 UDS 中的 NRC 是一套标准化的错误报告体系,旨在提高系统间交互透明度的同时简化故障排查流程。通过对不同类型的 NRC 进行深入研究可以更好地掌握整个通讯链路的工作原理以及潜在风险点的位置分布状况^.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值