USD诊断服务的否定响应中包含有导致否定响应原因的编码,称为否定响应码(NRC, Negative Response Code)。否定响应码的取值范围为0x00 - 0xFF,被分为三组:
0x00:服务器内部实现否定响应码判断逻辑时使用,表示要给出肯定响应。 0x01 – 0x7F:诊断通信相关的否定响应码。 0x80 – 0xFF:服务器收到诊断服务请求时,由于某些条件不满足要求而给出的否定响应码。给出这些否定响应码而不是给出0x22的目的是为了提供请求的服务不能被执行的更详细的原因。
具体的否定响应编码及其使用条件,请见本文最后的列表。
所有服务都需支持的否定响应码
首先,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 | 诊断会话控制 DiagnosticSessionControl | 0x12, 0x13, 0x22 |
0x11 | ECU复位 ECUReset | 0x12, 0x13, 0x22, 0x33 |
0x14 | 清除故障信息 ClearDiagnosticInformation | 0x13, 0x22, 0x31, 0x72 |
0x19 | 读取故障码信息 ReadDTCInformation | 0x12, 0x13, 0x31 |
0x22 | 通过ID读取数据 ReadDataByIdentifier | 0x13, 0x14, 0x22, 0x31, 0x33 |
0x27 | 安全访问 SecurityAccess | 0x12, 0x13, 0x22, 0x24, 0x31, 0x35, 0x36, 0x37 |
0x28 | 通信控制 CommunicationControl | 0x12, 0x13, 0x22, 0x31 |
0x2E | 通过ID写入数据 WriteDataByIdentifier | 0x13, 0x22, 0x31, 0x33, 0x72 |
0x2F | 通过ID进行输入输出控制 InputOutputControlByIdentifier | 0x13, 0x22, 0x31, 0x33 |
0x31 | 例程控制 RoutineControl | 0x12, 0x13, 0x22, 0x24, 0x31, 0x33, 0x72 |
0x34 | 请求下载 RequestDownload | 0x13, 0x22, 0x31, 0x33, 0x70 |
0x35 | 请求上传 RequestUpload | 0x13, 0x22, 0x31, 0x33, 0x70 |
0x36 | 数据传输 TransferData | 0x13, 0x24, 0x31, 0x71, 0x72, 0x73, 0x92/0x93 |
0x37 | 请求结束传输 RequestTransferExit | 0x13, 0x24, 0x31, 0x72 |
0x3E | 测试设备在线 TesterPresent | 0x12, 0x13 |
0x85 | 控制故障码设置 ControlDTCSetting | 0x12, 0x13, 0x22, 0x31 |
否定响应码定义及其取值
最后,下表中列出了ISO14229-1:2013(E)中定义的否定响应码及其使用条件。供大家参考。
编码 | 描述 | 助记词 |
0x00 | 此编码用于服务器内部实现否定响应码的逻辑时使用,用于表示没有NRC,不给出否定响应。此编码不会在否定响应中给出。 | PR (PositiveResponse) |
0x01 - 0x0F | ISO预留。用于以后扩展。 | ISOSAERESRVD |
0x10 | 表示请求的诊断服务被服务器(ECU)拒绝,但在本表中所有已定义的编码都不适用,这时回复此编码。 | GR(GeneralReject) |
0x11 | 服务器不支持请求的诊断服务。诊断请求中的服务标识符(Service ID)是服务器不支持的或不能识别的,则服务器给出此NRC编码。 | SNS(ServiceNotSupported). |
0x12 | 服务器支持诊断请求中的服务标识符(Service ID),但不支持收到的子功能参数时,回复此编码。 | SFNS(SubFunctionNotSupported) |
0x13 | 请求服务的诊断报文中的数据长度与定义不一致时,回复此编码。请求服务中参数的格式与定义不一致时也会回复此编码。(不常用) | IMLOIF(IncorrectMessageLengthOrInvalidFormat) |
0x14 | 服务器准备给出的诊断响应中所包含的数据长度超出了服务器所支持的最大长度时,回复编码。 | RTL(ResponseTooLong) |
0x15 - 0x20 | ISO预留。用于以后扩展。 | ISOSAERESRVD |
0x21 | 给出这个NRC编码时,表示服务器忙于执行已请求的诊断服务,暂时无法执行当前请求的诊断服务。 | BRR(BusyRepeatReques) |
0x22 | 请求的诊断服务的执行条件不满足时,回复此编码。 | CNC(ConditionsNotCorrect) |
0x23 | ISO预留。用于以后扩展 | ISOSAERESRVD |
0x24 | 请求服务的顺序不正确时,回复此编码。某写诊断服务请求是有先后顺序的。典型的就是安全访问(SecurityAccess)服务。必须先请求种子(Request Seed),再回复密钥(Send Key)。如果直接回复秘钥(Send Key),则服务器会回复此编码。 | RSE(RequestSequenceError) |
0x25 | 此编码适用于网关。当向网关请求的服务需要子网段中的控制器执行去执行,但是子网段中的控制器没有正常的执行网关的请求。此时,网关应向请求诊断服务的设备回复此编码。 | NRFSC (NoResponseFromSubnetComponent) |
0x26 | 由于当前服务器存在故障,并且已经记录下了对应的故障码(DTC),切此故障会导致请求的服务无法执行时,回复此编码。 | FPEORA(FailurePreventsExecutionOfRequestedAction) |
0x27 - 0x30 | ISO预留。用于以后扩展。 | ISOSAERESRVD |
0x31 | 诊断请求中的参数超出定义的范围,或者访问的数据标识符(DID)、例程标识符(RoutineID)是服务器不支持或在当前会话不支持时,回复此编码。 | ROOR(RequestOutOfRange) |
0x32 | ISO预留。用于以后扩展。 | ISOSAERESRVD |
0x33 | 通常在所请求的诊断服务需要服务器处于解锁状态,但服务器未被解锁时,回复此编码。 SAD(SecurityAccessDenied) | |
0x34 | ISO预留。用于以后扩展。 ISOSAERESRVD | |
0x35 | 服务器收到的安全访问(SecurityAccess)服务请求子功能为发送秘钥(SendKey),但服务器收到的秘钥(Key)不正确时,回复此编码。 IK(InvalidKey) | |
0x36 | 请求安全访问(SecurityAccess)服务的失败次数超过服务器允许的最大次数时,回复此编码。 ENOA(ExceedNumberOfAttempts) | |
0x37 | 服务器在安全访问延迟时间内收到安全访问(SecurityAccess)服务请求时,回复此编码。 RTDNE(RequiredTimeDelayNotExpired) | |
0x38 - 0x4F | 预留。用于扩展数据链路安全。 RBEDLSD(ReservedByExtendedDataLinkSecurityDocument) | |
0x50 - 0x6F | ISO预留。用于以后扩展。 ISOSAERESRVD | |
0x70 | 由于故障导致从服务器的存储器上传数据失败或向服务器的存储器下载数据失败时,回复此代码。 UDNA(UploadDownloadNotAccepted) | |
0x71 | 由于故障导致数据传输操作被中断时,回复此编码。 TDS(TransferDataSuspended) | |
0x72 | 服务器在擦除或写入Flash出现错误时,回复此代码。 GPF(GeneralProgrammingFailure) | |
0x73 | 在执行数据传输服务(TransferData (0x36) service)的过程中,检测到数据块序列编号(BlockSequenceCounter)错误时,回复此编码。 WBSC(WrongBlockSequenceCounter) | |
0x74 - 0x77 | ISO预留。用于以后扩展。 ISOSAERESRVD | |
0x78 | 诊断请求已经收到,并且是有效的,服务器正在执行请求的服务,无法继续接收新的服务请求时,回复此代码。当正在执行的服务完成后,仍需给出最终的肯定或否定响应。 RCRRP(RequestCorrectlyReceived-ResponsePending) | |
0x79 - 0x7D | ISOSAEReserved This range of values is reserved for future definition. | |
0x7E | 诊断请求中服务的子功能参数在当前的会话下不支持时,回复此编码。需要注意的是,回复此编码时,子功能参数是服务器在其它会话下支持的,只是在当前的会话下不支持。如果服务器在任何会话下都不支持此子功能参数,则需回复0x12. SFNSIAS(SubFunctionNotSupportedInActiveSession) | |
0x7F | 诊断请求中的服务标识符(Service ID)在当前的会话下不支持时,回复此编码。需要注意的是,回复此编码时,的服务标识符(Service ID)是服务器在其它会话下支持的,只是在当前的会话下不支持。如果服务器在任何会话下都不支持此子功能参数,则需回复0x11. SNSIAS(ServiceNotSupportedInActiveSession) | |
0x80 | ISO预留。用于以后扩展。 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) |
0x8E | ISO预留。用于以后扩展。 | 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 |