UDS诊断中的NRC

本文详细介绍了NRC(NegativeResponseCode)在汽车诊断中的应用,包括其基本概念、分类、优先级规则以及在不同服务请求下的响应策略。作者通过实例解析了NRC的触发条件和处理方式,有助于理解和解决诊断过程中的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我总结了一张表格:详细解释了NRC的分布情况和NRC的触发条件

1:基本概念

NRC 全称Negative Response Code(否定响应代码),是指示uds诊断中的,指示否定响应的原因

例如:0x22 服务

request 报文  0x618 03 22 F1 34 00 00 00 00

Negative Response 响应报文 0x658 03 7F 22 31

4dca440c89384637c0fb0bee0a2c291d.png

2:NRC相关详细解释

我已经上传到资源中(excel表格总结),大家可以自行下载

3:对NRC简单的分类

 

一级分类二级分类英文简写解释
通用型NRC0x00-0x0FISOSAEReserved系统保留
0x10GeneralReject一般错误
0x11ServiceNotSupported服务不支持
0x12subfunctionNotSupoot子功能不支持
0x13INcorrectMessageLengthOrInvalidFormat长度或格式不支持
0x14长度过大,这里是指"软件配置中设定的最大接受长度"<N-PCI<=4095byte(专门针对can,canfd则不适用这个最大长度) 
0x15-0x20  
0x21

BusyRepeatRequest

 

 
0x22条件不适合 
0x23  
0x24  
0x25  
0x26  
0x27-0x30  
0x31DID 
0x32  
关于0x27服务的NRC0x33  
0x34  
0x35  
0x36  
0x37  
 0x38-0x4F  
 0x50-0x6F  
关于刷新的NRC0x70  
0x71  
0x72  
0x73  
 0x74-0x77  
 0x78  
 
 0x79-0x7D  
 0x7E  
 0x7F  
 0x80  
关于发动机系统的特定NRC0x81  
0x82  
0x83  
0x84  
0x85  
0x86  
0x87  
0x88  
0x89  
0x8A  
0x8B  
0x8C  
0x8D  
0x8E  
0x8F  
0x90  
0x91  
0x92  
0x93  
 0x94-0xFF  

4:NRC的优先级

我们以通用型NRC为例:

请求报文:0x618 05 10 99 XX XX XX XX XX;

可以看到 05 长度是错误的,对于0x10服务来说,0x99的子功能也是不存在的。 

那么该该返回 NRC 0x13还是返回NRC 0x11?带着这个问题,我们进入NRC优先级的讲解。

NRC是优先级,

1:有一个非常重要的前提条件:必须是针对特定的服务来讨论优先级关系,因为每个服务对应的NRC是不一致的。

2:ISO14229-1 中规定了相应的NRC优先级,其中存在三个概念

名称解释
mandatory强制性的,也就是强制性的规定NRC的优先级
optional可选择的

manufacture

supplier specific

主机厂要求,具体按照主机厂规范来做就好

通常情况下:按照如下优先级顺序实现,即可

NRC11>0x7F>0x13>0x12>0x7E>0x33(0x34&&0x35&0x36是0x33出现以后才能出现的)>0x24>0x31>0x22>0x78

4.1 接下来,我们以0x22服务为模板,

9ad3331b0a2aa365c74ead94b86e3d53.png

 

可以看到关于0x22请求服务,

1:服务器先是检查报文长度,长度不符合返回否定响应码0x13,。

2:然后进入循环,(这里循环,是因为0x22是可以同时支持多个DID读取的)故需要有个计数。

同时客户端还能选择,比如0x21检查,看能不能支持多DID读取。

3:然后检查DID是否需要安全解锁等级的要求。

4:下一步,主机厂如果对DID读取有(如整车电源模式要求,车速<3km/h的要求,检查不通过则返回0x22)

5:检查是否至少有一个DID支持,在本会话模式中,不通过则返回0x31

6:最后服务器检查客户端,发出的最长长度(CAN最长长度4095Byte),如果超出此长度则放回0x14

补充:如果0x22服务,不被ECU支持,难道不检查了吗?则返回0x11,虽然不常见,但是必须要了解。

4.2 0x2E服务的NRC优先级

fe0525cd2b127e420a14d5dfd8b900e1.png

和ox22差不多,只是可以最后阶段,需要检查下,是否写入(EER)成功成功!

4.3 0x14服务的NRC优先级顺序

cb18b14d000cdfd3cc166c72024f6194.png

 14服务注意,他没有子功能,也没有DID,但是如果项目要求,其必须,在某种会话模式下才能使用,如果不满足此条件。那么将会返回0x31。

5:最后附上个NRC的英文全称和简写

一级分类二级分类英文全称简写
通用型NRC0x00-0x0F  
0x10GeneralRejectGR
0x11ServiceNotSuportedSNS
0x12SubFunctionNotSupportedSFNS
0x13IncorrectMessagelengthOrInvalidFormatIMLOIF
0x14-0x20  
0x21busRepeatRequestBRR
0x22ConditionsNotCorrectCNC
0x23  
0x24RequestSequenceErrorRSE
0x25  
0x26  
0x27-0x30  
0x31RequestOutOfRangeROOR
0x32  
关于0x27服务的NRC0x33SecurityAccessDeniedSAD
0x34  
0x35invalidKeyIK
0x36ExceedNumberOfAttempENOA
0x37RequiredTimeDelayNotExpiredRTDNE
 0x38-0x4F  
 0x50-0x6F  
关于刷新的NRC0x70UploadDownNotAcceptUDNA
0x71TransferDataSuspendedTDS
0x72GeneralProgrammingFailureGPF
0x73WrongBlockSequenceCounterWBSC
 0x74-0x77  
 0x78RequestCorrectlyReceived
-ResponsePending
RCRRP
 
 0x79-0x7D  
 0x7EsubFunctionNotSupported
inActiveSession
SFNSIAS
 0x7F  
 0x80  
关于发动机系统的特定NRC0x81  
0x82  
0x83  
0x84  
0x85  
0x86  
0x87  
0x88  
0x89  
0x8A  
0x8B  
0x8C  
0x8D  
0x8E  
0x8F  
0x90  
0x91  
0x92  
0x93  
 0x94-0xFF  

 

 

 

 

 

### UDS Diagnostic NRC 0x31 错误原因分析 当接收到UDS服务RoutineControl (0x31)时,如果请求的总长度不正确,DCM模块会NRC 0x13表示消息长度或格式有误[^2]。然而针对NRC 0x31而言,该否定响应码通常指示的是“请求超出执行条件”,意味着所请求的操作无法满足当前车辆状态下的执行需求。 具体来说,在尝试控制某个特定ECU例行程序的过程中,若存在如下情形之一,则可能导致返回NRC 0x31: - 请求启动某一例行程序而此时已有其他相同类型的例行程序正在运行; - 尝试停止一个尚未开始或者已经完成的例行程序; - 所需资源被占用,例如电力供应不足或其他关键组件正忙于处理不同任务; - 车辆处于不允许执行某些操作的状态下(如行驶过程中禁止调整动机参数); 对于上述提到的情况,开者应当确保应用程序逻辑能够妥善应对这些异常状况,并提供相应的用户提示信息以便及时解决问题。 ### 解决方案建议 为了有效预防并解决因NRC 0x31引的问题,可以采取以下措施: #### 预防策略 - **增强前置验证**:在起任何涉及改变系统行为的服务调用前,先查询目标节点的工作模式及其忙碌程度,确认其具备接受新指令的能力。 ```python def check_routine_status(ecu_id, routine_type): status = query_ecu_state(ecu_id) if not is_idle(status) or has_conflict(routine_type, get_running_routines()): raise PreconditionFailedError() ``` - **优化业务流程设计**:合理规划各项功能之间的依赖关系以及触时机,减少不必要的并冲突可能性。 #### 故障恢复机制 一旦遇到此类错误反馈,除了记录日志外还应该实施自动化的重试逻辑或是引导人工干预来恢复正常运作: ```python from time import sleep MAX_RETRIES = 3 RETRY_DELAY_SECONDS = 5 for attempt in range(MAX_RETRIES + 1): try: execute_routine_control(command_data) break except RequestOutOfRange as e: log_error(e.message) if attempt < MAX_RETRIES: sleep(RETRY_DELAY_SECONDS * attempt) else: notify_user_of_failure() ``` 通过以上手段可以在很大程度上降低由于环境因素造成的临时性失败概率,提高整个系统的鲁棒性和用户体验满意度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值