• [UDS] --- UDS服务应该支持的NRC


    USD诊断服务的否定响应中包含有导致否定响应原因的编码,称为否定响应码(NRC, Negative Response Code)。否定响应码的取值范围为0x00 - 0xFF,被分为三组:

    0x00:服务器内部实现否定响应码判断逻辑时使用,表示要给出肯定响应。
    0x01 – 0x7F:诊断通信相关的否定响应码。
    0x80 – 0xFF:服务器收到诊断服务请求时,由于某些条件不满足要求而给出的否定响应码。给出这些否定响应码而不是给出0x22的目的是为了提供请求的服务不能被执行的更详细的原因。
    
    • 1
    • 2
    • 3

    具体的否定响应编码及其使用条件,请见本文最后的列表。

    所有服务都需支持的否定响应码

    首先,ISO14229-1:2013(E)中定义了一组每个诊断服务都需要支持的否定响应码。见下表。

    否定响应码 NRC定义 Definition
    0x21服务器忙 BusyRepeatRequest
    0x11诊断服务不支持 ServiceNotSupported
    0x7F诊断服务在当前会话下不支持 serviceNotSupportedInActiveSession
    0x78收到诊断请求,等待响应 RequestCorrectlyReceived-ResponsePending

    具体的服务需要支持的否定响应码

    其次,针对具体的诊断服务,ISO14229-1:2013(E)定义了其所需支持的特定否定响应码。这里以诊断会话控制服务(0x10)为例。在ISO14229-1:2013(E)的9.2.4章节,定义了诊断会话控制服务(0x10)需要支持的否定响应码,为0x12、0x13、0x22。其它诊断服务支持的特定否定响应码,可以参考标准中的相应章节。

    否定响应码 NRC定义 Definition
    0x12子功能不支持
    0x13报文长度不正确
    0x22服务执行条件不满足

    下面列举了常用的诊断服务所支持的否定响应码。如下表:

    诊断服务标识 Service ID诊断服务 Diagnostic Service支持的否定响应码 Supported NRC
    0x10诊断会话控制 DiagnosticSessionControl0x12, 0x13, 0x22
    0x11ECU复位 ECUReset0x12, 0x13, 0x22, 0x33
    0x14清除故障信息 ClearDiagnosticInformation0x13, 0x22, 0x31, 0x72
    0x19读取故障码信息 ReadDTCInformation0x12, 0x13, 0x31
    0x22通过ID读取数据 ReadDataByIdentifier0x13, 0x14, 0x22, 0x31, 0x33
    0x27安全访问 SecurityAccess0x12, 0x13, 0x22, 0x24, 0x31, 0x35, 0x36, 0x37
    0x28通信控制 CommunicationControl0x12, 0x13, 0x22, 0x31
    0x2E通过ID写入数据 WriteDataByIdentifier0x13, 0x22, 0x31, 0x33, 0x72
    0x2F通过ID进行输入输出控制 InputOutputControlByIdentifier0x13, 0x22, 0x31, 0x33
    0x31例程控制 RoutineControl0x12, 0x13, 0x22, 0x24, 0x31, 0x33, 0x72
    0x34请求下载 RequestDownload0x13, 0x22, 0x31, 0x33, 0x70
    0x35请求上传 RequestUpload0x13, 0x22, 0x31, 0x33, 0x70
    0x36数据传输 TransferData0x13, 0x24, 0x31, 0x71, 0x72, 0x73, 0x92/0x93
    0x37请求结束传输 RequestTransferExit0x13, 0x24, 0x31, 0x72
    0x3E测试设备在线 TesterPresent0x12, 0x13
    0x85控制故障码设置 ControlDTCSetting0x12, 0x13, 0x22, 0x31

    否定响应码定义及其取值

    最后,下表中列出了ISO14229-1:2013(E)中定义的否定响应码及其使用条件。供大家参考。

    编码描述助记词
    0x00此编码用于服务器内部实现否定响应码的逻辑时使用,用于表示没有NRC,不给出否定响应。此编码不会在否定响应中给出。PR (PositiveResponse)
    0x01 - 0x0FISO预留。用于以后扩展。ISOSAERESRVD
    0x10表示请求的诊断服务被服务器(ECU)拒绝,但在本表中所有已定义的编码都不适用,这时回复此编码。GR(GeneralReject)
    0x11服务器不支持请求的诊断服务。诊断请求中的服务标识符(Service ID)是服务器不支持的或不能识别的,则服务器给出此NRC编码。SNS(ServiceNotSupported).
    0x12服务器支持诊断请求中的服务标识符(Service ID),但不支持收到的子功能参数时,回复此编码。SFNS(SubFunctionNotSupported)
    0x13请求服务的诊断报文中的数据长度与定义不一致时,回复此编码。请求服务中参数的格式与定义不一致时也会回复此编码。(不常用)IMLOIF(IncorrectMessageLengthOrInvalidFormat)
    0x14服务器准备给出的诊断响应中所包含的数据长度超出了服务器所支持的最大长度时,回复编码。RTL(ResponseTooLong)
    0x15 - 0x20ISO预留。用于以后扩展。ISOSAERESRVD
    0x21给出这个NRC编码时,表示服务器忙于执行已请求的诊断服务,暂时无法执行当前请求的诊断服务。BRR(BusyRepeatReques)
    0x22请求的诊断服务的执行条件不满足时,回复此编码。CNC(ConditionsNotCorrect)
    0x23ISO预留。用于以后扩展ISOSAERESRVD
    0x24请求服务的顺序不正确时,回复此编码。某写诊断服务请求是有先后顺序的。典型的就是安全访问(SecurityAccess)服务。必须先请求种子(Request Seed),再回复密钥(Send Key)。如果直接回复秘钥(Send Key),则服务器会回复此编码。RSE(RequestSequenceError)
    0x25此编码适用于网关。当向网关请求的服务需要子网段中的控制器执行去执行,但是子网段中的控制器没有正常的执行网关的请求。此时,网关应向请求诊断服务的设备回复此编码。NRFSC (NoResponseFromSubnetComponent)
    0x26由于当前服务器存在故障,并且已经记录下了对应的故障码(DTC),切此故障会导致请求的服务无法执行时,回复此编码。FPEORA(FailurePreventsExecutionOfRequestedAction)
    0x27 - 0x30ISO预留。用于以后扩展。ISOSAERESRVD
    0x31诊断请求中的参数超出定义的范围,或者访问的数据标识符(DID)、例程标识符(RoutineID)是服务器不支持或在当前会话不支持时,回复此编码。ROOR(RequestOutOfRange)
    0x32ISO预留。用于以后扩展。ISOSAERESRVD
    0x33通常在所请求的诊断服务需要服务器处于解锁状态,但服务器未被解锁时,回复此编码。 SAD(SecurityAccessDenied)
    0x34ISO预留。用于以后扩展。 ISOSAERESRVD
    0x35服务器收到的安全访问(SecurityAccess)服务请求子功能为发送秘钥(SendKey),但服务器收到的秘钥(Key)不正确时,回复此编码。 IK(InvalidKey)
    0x36请求安全访问(SecurityAccess)服务的失败次数超过服务器允许的最大次数时,回复此编码。 ENOA(ExceedNumberOfAttempts)
    0x37服务器在安全访问延迟时间内收到安全访问(SecurityAccess)服务请求时,回复此编码。 RTDNE(RequiredTimeDelayNotExpired)
    0x38 - 0x4F预留。用于扩展数据链路安全。 RBEDLSD(ReservedByExtendedDataLinkSecurityDocument)
    0x50 - 0x6FISO预留。用于以后扩展。 ISOSAERESRVD
    0x70由于故障导致从服务器的存储器上传数据失败或向服务器的存储器下载数据失败时,回复此代码。 UDNA(UploadDownloadNotAccepted)
    0x71由于故障导致数据传输操作被中断时,回复此编码。 TDS(TransferDataSuspended)
    0x72服务器在擦除或写入Flash出现错误时,回复此代码。 GPF(GeneralProgrammingFailure)
    0x73在执行数据传输服务(TransferData (0x36) service)的过程中,检测到数据块序列编号(BlockSequenceCounter)错误时,回复此编码。 WBSC(WrongBlockSequenceCounter)
    0x74 - 0x77ISO预留。用于以后扩展。 ISOSAERESRVD
    0x78诊断请求已经收到,并且是有效的,服务器正在执行请求的服务,无法继续接收新的服务请求时,回复此代码。当正在执行的服务完成后,仍需给出最终的肯定或否定响应。 RCRRP(RequestCorrectlyReceived-ResponsePending)
    0x79 - 0x7DISOSAEReserved This range of values is reserved for future definition.
    0x7E诊断请求中服务的子功能参数在当前的会话下不支持时,回复此编码。需要注意的是,回复此编码时,子功能参数是服务器在其它会话下支持的,只是在当前的会话下不支持。如果服务器在任何会话下都不支持此子功能参数,则需回复0x12. SFNSIAS(SubFunctionNotSupportedInActiveSession)
    0x7F诊断请求中的服务标识符(Service ID)在当前的会话下不支持时,回复此编码。需要注意的是,回复此编码时,的服务标识符(Service ID)是服务器在其它会话下支持的,只是在当前的会话下不支持。如果服务器在任何会话下都不支持此子功能参数,则需回复0x11. SNSIAS(ServiceNotSupportedInActiveSession)
    0x80ISO预留。用于以后扩展。 ISOSAERESRVD
    0x81请求的诊断服务被执行的条件之一是发动机转速低于某一限值,而此时的发动机转速不满足此要求时,回复此编码。RPMTH(RpmTooHigh)
    0x82请求的诊断服务被执行的条件之一是发动机转速高于某一限值,而此时的发动机转速不满足此要求时,回复此编码。RPMTL(RpmTooLow)
    0x83请求的诊断服务被执行的条件之一是发动机处于停机状态,而此时发动机处于运转状态,则回复此编码。EIR(EngineIsRunning)
    0x84请求的诊断服务被执行的条件之一是发动机处于运转状态,而此时发动机处于停机状态,则回复此编码。EINR (EngineIsNotRunning)
    0x85请求的诊断服务被执行的条件之一是发动机运转的时间超过某一限值,而此时该条件不满足,则回复此编码ERTTL(EngineRunTimeTooLow)
    0x86请求的诊断服务被执行的条件之一是当前的温度低于某一限值,而此时该条件不满足,则回复此编码。TEMPTH(TemperatureTooHigh)
    0x87请求的诊断服务被执行的条件之一是当前的温度高于某一限值,而此时该条件不满足,则回复此编码。TEMPTL(TemperatureTooLow)
    0x88请求的诊断服务被执行的条件之一是当前的车速低于某一限值,而此时该条件不满足,则回复此编码。VSTH(VehicleSpeedTooHigh)
    0x89请求的诊断服务被执行的条件之一是当前的车速高于某一限值,而此时该条件不满足,则回复此编码。VSTL(VehicleSpeedTooLow)
    0x8A请求的诊断服务被执行的条件之一是节气门开度或加速踏板开度低于某一限值,而此时该条件不满足,则回复此编码。TPTH(Throttle/PedalTooHigh)
    0x8B请求的诊断服务被执行的条件之一是节气门开度或加速踏板开度高于某一限值,而此时该条件不满足,则回复此编码。TPTL(Throttle/PedalTooLow)
    0x8C请求的诊断服务被执行的条件之一是变速器处于空档,而此时该条件不满足,则回复此编码。TRNIG(TransmissionRangeNotInNeutral)
    0x8D请求的诊断服务被执行的条件之一是变速器处于非空档,而此时该条件不满足,则回复此编码。TRNIG(TransmissionRangeNotInGear)
    0x8EISO预留。用于以后扩展。ISOSAERESRVD
    0x8F请求的诊断服务被执行的条件之一是在诊断服务被执行前和执行过程中制动踏板没有被踩下,而此时该条件不满足,则回复此编码。BSNC(BrakeSwitch(es)NotClosed)
    0x90请求的诊断服务被执行的条件之一是变速器处于P空档,而此时该条件不满足,则回复此编码。SLNIP(ShifterLeverNotInPark)
    0x91请求的诊断服务被执行的条件之一是液力变矩器未处于锁止状态,而此时该条件不满足,则回复此编码。TCCL(TorqueConverterClutchLocked)
    0x92请求的诊断服务被执行的条件之一是蓄电池电压低于设定的限值,而此时该条件不满足,则回复此编码。VTH(VoltageTooHigh)
    0x93请求的诊断服务被执行的条件之一是蓄电池电压高于设定的限值,而此时该条件不满足,则回复此编码。VTL(VoltageTooLow)
    0x94 - 0xEF预留。用于将来定义特定的条件不满足情况。RFSCNC(ReservedForSpecificConditionsNotCorrect)
    0xF0 - 0xFE预留。用于车辆制造商定义特定的条件不满足的情况。VMSCNC(VehicleManufacturerSpecificConditionsNotCorrect)
    0xFF ISO预留。用于以后扩展。ISOSAERESRVD
  • 相关阅读:
    LLM漫谈(六)| 复旦MOSS提出数据配比scaling law
    200道Java面试题
    《Python语言程序设计》刘卫国主编字典与集合习题7详解(选择)
    python基本语法
    黑盒子测试
    PCA与梯度上升法
    剑指 Offer 13. 机器人的运动范围
    小马识途:如何做好短视频内容运营
    基于SSM的社区疫情居民信息登记系统
    #27ES6的数值扩展
  • 原文地址:https://blog.csdn.net/weixin_42445727/article/details/133952392