NRC (Negative Response Code)
핵심 요약
진단 요청에 대한 NRC를 해석하고 세션·입력·타이밍 조건을 비교해 원인을 좁힌다.
적용 범위
실행 예제의 주소·선택자·인터페이스·설정값은 시험 환경에 맞게 변경한다. 규격의 적용 판과 도구 버전을 확인한다.
본문
핵심 요약
NRC는 UDS 요청을 정상 완료하지 못한 이유 또는 처리가 계속 진행 중임을 나타내는 코드다. 진단 서비스는 배출가스 OBD에만 한정되지 않으며, 요청 형식·세션·보안 상태·동작 조건을 함께 해석해야 한다.
응답 프레임 읽기
UDS 부정 응답의 기본 구조는 0x7F, 원래 요청 SID, NRC다. 설명용 예시 7F 22 31은 ReadDataByIdentifier(0x22) 요청에 requestOutOfRange(0x31)가 반환됐다는 뜻이다. 실제 원인은 요청 DID와 ECU 사양을 함께 확인한다.
자주 확인하는 코드
- 0x11 serviceNotSupported: 요청 서비스 지원 여부를 확인한다.
- 0x12 subFunctionNotSupported: 해당 서비스의 하위 기능 지원 여부를 확인한다.
- 0x13 incorrectMessageLengthOrInvalidFormat: 길이·필드·인코딩을 점검한다.
- 0x22 conditionsNotCorrect: 서비스 수행에 필요한 조건을 확인한다.
- 0x31 requestOutOfRange: 식별자·파라미터·허용 범위와 서비스별 규정을 확인한다.
- 0x33 securityAccessDenied: 보안 접근 조건을 확인한다.
- 0x78 requestCorrectlyReceived-ResponsePending: 요청은 수신됐지만 최종 응답이 준비되지 않은 중간 상태다. 즉시 최종 실패로 집계하지 않는다.
0x78과 타임아웃 구분
P2/P2*와 테스트 도구의 대기 설정, 타임스탬프, 최종 응답을 함께 본다. 0x78을 수신했다고 모든 대기 시간이 무제한으로 연장되는 것은 아니다. 실제 시간 값과 반복 제한은 적용 규격·세션 설정·프로젝트 사양에 따른다.
분석과 검증 순서
- 원본 요청·응답을 보존하고 SID, 하위 기능, 데이터 길이를 확인한다.
- 세션·보안 수준·ECU 상태와 요청 순서를 기록한다.
- 정상 조건, 지원하지 않는 입력, 길이 오류, 조건 미충족을 각각 분리해 시험한다.
- 예상 NRC는 임의 선택하지 않고 서비스별 요구사항과 검사 우선순위에 따라 정한다.
- 타임아웃과 ECU의 부정 응답을 서로 다른 결과로 기록한다.
확인할 출처
ISO 14229-1의 적용 판과 해당 서비스 절을 확인한다: https://www.iso.org/search.html?q=ISO%2014229-1
AUTOSAR Classic DCM 규격은 프로젝트 릴리스에 맞춰 확인한다: https://www.autosar.org/standards/classic-platform
실습: 응답 해석과 결과 분류
response = bytes.fromhex("7F2278")
assert len(response) == 3 and response[0] == 0x7F
request_sid, nrc = response[1], response[2]
print(f"요청 SID=0x{request_sid:02X}, NRC=0x{nrc:02X}")
assert nrc == 0x78
위 응답은 ReadDataByIdentifier 요청의 처리 대기 상태다. 최종 응답을 계속 기다리되 적용 P2/P2*와 도구 timeout을 지킨다. 응답 미수신·최종 NRC·처리 대기를 다른 결과로 분류한다.
분석 기록에는 요청 원본, DID, 세션·보안·ECU 상태, 수신 시각과 최종 결과를 남긴다. 0x31을 받으면 DID 지원·입력 범위와 서비스별 검사 조건부터 확인한다.
Negative Response Code : 차량의 진단 통신 프로토콜에서 사용되는 코드로, 특정 진단 요청이 실패했거나 처리할 수 없을 때 ECU(Electronic Control Unit)에서 반환하는 응답 코드입니다. 이 코드는 ISO 14229 (UDS - Unified Diagnostic Services) 표준에서 정의되며, 차량의 OBD(On-Board Diagnostics) 시스템에서 진단 요청에 대한 부정적인 응답을 식별하는 데 사용됩니다.
- ECU가 진단 요청을 처리할 수 없을 때 송신되는 코드
- 진단 도구가 문제를 이해하고 해결하는 데 도움을 줄 수 있음
| NRC Hex | Mnemonic | Use Case |
|---|---|---|
| 0x10 | GR | General Reject |
| 0x11 | SNS | Service Not Supported |
| 0x12 | SFNS | Sub-Function Not Supported |
| 0x13 | IMLOIF | Incorrect Message Length or Invalid Format |
| 0x14 | RTL | Response Too Long |
| 0x21 | BRR | Busy Repeat Request |
| 0x22 | CNC | Conditions Not Correct |
| 0x24 | RSE | Request Sequence Error |
| 0x25 | NRFSC | No Response From Subnet Component |
| 0x26 | FPEORA | Failure Prevents Execution Of Requested Action |
| 0x31 | ROOR | Request Out of Range |
| 0x33 | SAD | Security Access Denied |
| 0x35 | IK | InvalidKey |
| 0x36 | ENOA | ExceedNumberOfAttempts |
| 0x37 | RTDNE | RequiredTimeDelayNotExpired |
| 0x38-0x4F | RBEDLSD | Reserved by Extended Data Link Security Document |
| 0x70 | UDNA | Upload/Download Not Accepted |
| 0x71 | TDS | Transfer Data Suspended |
| 0x72 | GPF | General Programming Failure |
| 0x73 | WBSC | Wrong Block Sequence Counter |
| 0x78 | RCRRP | Response Correctly Received, But Response is Pending |
| 0x7E | SFNSIAS | Sub-Function Not Supported in Active Session |
| 0x7F | SNSIAS | Service Not Supported in Active Session |
| 0x81 | RTH | RPM Too High |
| 0x82 | RTL | RPM Too Low |
| 0x83 | EIR | Engine is Running |
| 0x84 | EINR | Engine is Not Running |
| 0x85 | ERTTL | Engine Run Time Too Low |
| 0x86 | TTH | Temperature Too High |
| 0x87 | TTL | Temperature Too Low |
| 0x88 | VSTH | Vehicle Speed Too High |
| 0x89 | VSTL | Vehicle Speed Too Low |
| 0x8A | TPTH | Throttle Pedal Too High |
| 0x8B | TPTL | Throttle Pedal Too Low |
| 0x8C | TRNIN | Transmission Range Not in Neutral |
| 0x8D | TRNIG | Transmission Range Not in Dear |
| 0x8F | BSNC | Brake Switches Not Closed |
| 0x90 | SLNIP | Shifter Lever Not in Park |
| 0x91 | TCCL | Torque Converter Clutch Locked |
| 0x92 | VTH | Voltage Too High |
| 0x93 | VTL | Voltage Too Low |
| 0xF0-0xFE | < | Manufacturer Specific Conditions Not Correct |
with Description
| value | Mnemonic | responseCode | Description |
|---|---|---|---|
| 0x00 | < | positiveResponse | This response code shall not be used in a negative response message. This positiveResponse parameter value is reserved for server internal implementation. |
| 0x01 - 0x0F | < | ISOSAEReserved | This range of values is reserved by this document for future definition. |
| 0x10 | GR | generalReject | This response code indicates that the requested action has been rejected by the server. The generalReject response code shall only be implemented in the server if none of the negative response codes defined in this document meet the needs of the implementation. At no means shall this response code be a general replacement for other response codes defined. |
| 0x11 | SNS | serviceNotSupported | This response code indicates that the requested action will not be taken because the server does not support the requested service. The server shall send this response code in case the client has sent a request message with a service identifier, which is either unknown or not supported by the server. Therefore this negative response code is not shown in the list of negative response codes to be supported for a diagnostic service, because this negative response code is not applicable for supported services. |
| 0x12 | SFNS | subFunctionNotSupported | This response code indicates that the requested action will not be taken because the server does not support the service specific parameters of the request message. The server shall send this response code in case the client has sent a request message with a known and supported service identifier but with “sub function“ which is either unknown or not supported. |
| 0x13 | IMLOIF | incorrectMessageLengthOrInvalidFormat | This response code indicates that the requested action will not be taken because the length of the received request message does not match the prescribed length for the specified service or the format of the parameters do not match the prescribed format for the specified service. |
| 0x14 | RTL | responseTooLong | This response code shall be reported by the server if the response to be generated exceeds the maximum number of bytes available by the underlying network layer. |
| 0x15 - 0x20 | < | ISOSAEReserved | This range of values is reserved for future definition. |
| 0x21 | BRR | busyRepeatReques | This response code indicates that the server is temporarily too busy to perform the requested operation. In this circumstance the client shall perform repetition of the “identical request message” or “another request message”. The repetition of the request shall be delayed by a time specified in the respective implementation documents.Example: In a multi-client environment the diagnostic request of one client might be blocked temporarily by a NRC $21 while a different client finishes a diagnostic task.NOTE If the server is able to perform the diagnostic task but needs additional time to finish the task and prepare the response, the NRC 0x78 shall be used instead of NRC 0x21.This response code is in general supported by each diagnostic service, as not otherwise stated in the data link specific implementation document, therefore it is not listed in the list of applicable response codes of the diagnostic services. |
| 0x22 | CNC | conditionsNotCorrect | This response code indicates that the requested action will not be taken because the server prerequisite conditions are not met. |
| 0x23 | ISOSAEReserved | This range of values is reserved for future definition. | |
| 0x24 | RSE | requestSequenceError | This response code indicates that the requested action will not be taken because the server expects a different sequence of request messages or message as sent by the client. This may occur when sequence sensitive requests are issued in the wrong order.EXAMPLE A successful SecurityAccess service specifies a sequence of requestSeed and sendKey as sub-functions in the request messages. If the sequence is sent different by the client the server shall send a negative response message with the negative response code 0x24 (requestSequenceError). |
| 0x25 - 0x30 | < | ISOSAEReserved | This range of values is reserved for future definition. |
| 0x31 | ROOR |
requestOutOfRange | This response code indicates that the requested action will not be taken because the server has detected that the request message contains a parameter which attempts to substitute a value beyond its range of authority (e.g. attempting to substitute a data byte of 111 when the data is only defined to 100), or which attempts to access a dataIdentifier/routineIdentifer that is not supported or not supported in active session. This response code shall be implemented for all services, which allow the client to read data, write data or adjust functions by data in the server. |
| 0x32 | FPEORA | ISOSAEReserved | This range of values is reserved for future definition. |
| 0x33 | SAD | securityAccessDenied | This response code indicates that the requested action will not be taken because the server’s security strategy has not been satisfied by the client. The server shall send this response code if one of the following cases occur:the test conditions of the server are not met,the required message sequence e.g. DiagnosticSessionControl, securityAccess is not met,the client has sent a request message which requires an unlocked server.Beside the mandatory use of this negative response code as specified in the applicable services within this standard, this negative response code can also be used for any case where security is required and is not yet granted to perform the required service. |
| 0x34 | < | ISOSAEReserved | This range of values is reserved for future definition. |
| 0x35 | IK | invalidKey | This response code indicates that the server has not given security access because the key sent by the client did not match with the key in the server’s memory. This counts as an attempt to gain security. The server shall remain locked and increment its internal securityAccessFailed counter. |
| 0x36 | ENOA | exceedNumberOfAttempts | This response code indicates that the requested action will not be taken because the client has unsuccessfully attempted to gain security access more times than the server’s security strategy will allow. |
| 0x37 | RTDNE | requiredTimeDelayNotExpired | This response code indicates that the requested action will not be taken because the client’s latest attempt to gain security access was initiated before the server’s required timeout period had elapsed. |
| 0x38 - 0x4F | RBEDLSD | reservedByExtendedDataLinkSecurityDocument | This range of values is reserved by ISO 15764 Extended data link security. |
| 0x50 - 0x6F | ISOSAEReserved | This range of values is reserved for future definition. | |
| 0x70 | UDNA | uploadDownloadNotAccepted | This response code indicates that an attempt to upload/download to a server’s memory cannot be accomplished due to some fault conditions. |
| 0x71 | TDS | transferDataSuspended | This response code indicates that a data transfer operation was halted due to some fault. The active transferData sequence shall be aborted. |
| 0x72 | GPF | generalProgrammingFailure | This response code indicates that the server detected an error when erasing or programming a memory location in the permanent memory device (e.g. Flash Memory). |
| 0x73 | WBSC | wrongBlockSequenceCounter | This response code indicates that the server detected an error in the sequence of blockSequenceCounter values. Note that the repetition of a TransferData request message with a blockSequenceCounter equal to the one included in the previous TransferData request message shall be accepted by the server. |
| 0x74 - 0x77 | << | ISOSAEReserved | This range of values is reserved for future definition. |
| 0x78 | RCRRP | requestCorrectlyReceived-ResponsePending | This response code indicates that the request message was received correctly, and that all parameters in the request message were valid, but the action to be performed is not yet completed and the server is not yet ready to receive another request. As soon as the requested service has been completed, the server shall send a positive response message or negative response message with a response code different from this. The negative response message with this response code may be repeated by the server until the requested service is completed and the final response message is sent. This response code might impact the application layer timing parameter values. The detailed specification shall be included in the data link specific implementation document.This response code shall only be used in a negative response message if the server will not be able to receive further request messages from the client while completing the requested diagnostic service. When this response code is used, the server shall always send a final response (positive or negative) independent of the suppressPosRspMsgIndicationBit value. A typical example where this response code may be used is when the client has sent a request message, which includes data to be programmed or erased in flash memory of the server. If the programming/erasing routine (usually executed out of RAM) is not able to support serial communication while writing to the flash memory the server shall send a negative response message with this response code. This response code is in general supported by each diagnostic service, as not otherwise stated in the data link specific implementation document, therefore it is not listed in the list of applicable response codes of the diagnostic services. |
| 0x79 - 0x7D | < | ISOSAEReserved | This range of values is reserved for future definition. |
| 0x7E | SFNSIAS | subFunctionNotSupportedInActiveSession | This response code indicates that the requested action will not be taken because the server does not support the requested sub-function in the session currently active. Within the programmingSession negative response code 0x12 (subFunctionNotSupported) may optionally be reported instead of negative response code 0x7F (subFunctionNotSupportedInActiveSession). This response code shall only be used when the requested sub-function is known to be supported in another session, otherwise response code 0x12 (subFunctionNotSupported) shall be used. This response code shall be supported by each diagnostic service with a sub-function parameter, if not otherwise stated in the data link specific implementation document, therefore it is not listed in the list of applicable response codes of the diagnostic services. |
| 0x7F | SNSIAS | serviceNotSupportedInActiveSession | This response code indicates that the requested action will not be taken because the server does not support the requested service in the session currently active. This response code shall only be used when the requested service is known to be supported in another session, otherwise response code 0x11 (serviceNotSupported) shall be used. This response code is in general supported by each diagnostic service, as not otherwise stated in the data link specific implementation document, therefore it is not listed in the list of applicable response codes of the diagnostic services. |
| 0x80 | < | ISOSAEReserved | This range of values is reserved for future definition. |
| 0x81 | RTH | rpmTooHigh | This response code indicates that the requested action will not be taken because the server prerequisite condition for RPM is not met (current RPM is above a pre-programmed maximum threshold). |
| 0x82 | RTL | rpmTooLow | This response code indicates that the requested action will not be taken because the server prerequisite condition for RPM is not met (current RPM is below a pre-programmed minimum threshold). |
| 0x83 | EIR | engineIsRunning | This is required for those actuator tests which cannot be actuated while the Engine is running. This is different from RPM too high negative response and needs to be allowed. |
| 0x84 | EINR | engineIsNotRunning | This is required for those actuator tests which cannot be actuated unless the Engine is running. This is different from RPM too low negative response, and needs to be allowed. |
| 0x85 | ERTTL | engineRunTimeTooLow | This response code indicates that the requested action will not be taken because the server prerequisite condition for engine run time is not met (current engine run time is below a preprogrammed limit). |
| 0x86 | TTH | temperatureTooHigh | This response code indicates that the requested action will not be taken because the server prerequisite condition for temperature is not met (current temperature is above a preprogrammed maximum threshold). |
| 0x87 | TTL | temperatureTooLow | This response code indicates that the requested action will not be taken because the server prerequisite condition for temperature is not met (current temperature is below a preprogrammed minimum threshold). |
| 0x88 | VSTH | vehicleSpeedTooHigh | This response code indicates that the requested action will not be taken because the server prerequisite condition for vehicle speed is not met (current VS is above a pre-programmed maximum threshold). |
| 0x89 | VSTL | vehicleSpeedTooLow | This response code indicates that the requested action will not be taken because the server prerequisite condition for vehicle speed is not met (current VS is below a pre-programmed minimum threshold). |
| 0x8A | TPTH | throttle/PedalTooHigh | This response code indicates that the requested action will not be taken because the server prerequisite condition for throttle/pedal position is not met (current TP/APP is above a preprogrammed maximum threshold). |
| 0x8B | TPTL | throttle/PedalTooLow | This response code indicates that the requested action will not be taken because the server prerequisite condition for throttle/pedal position is not met (current TP/APP is below a preprogrammed minimum threshold). |
| 0x8C | TRNIN | transmissionRangeNotInNeutral | This response code indicates that the requested action will not be taken because the server prerequisite condition for being in neutral is not met (current transmission range is not in neutral). |
| 0x8D | TRNIG | transmissionRangeNotInGear | This response code indicates that the requested action will not be taken because the server prerequisite condition for being in gear is not met (current transmission range is not in gear). |
| 0x8E | ISOSAEReserved | This range of values is reserved by this document for future definition. | |
| 0x8F | BSNC | brakeSwitch(es)NotClosed (Brake Pedal not pressed or not applied) | For safety reasons, this is required for certain tests before it begins, and must be maintained for the entire duration of the test. |
| 0x90 | SLNIP | shifterLeverNotInPark | For safety reasons, this is required for certain tests before it begins, and must be maintained for the entire duration of the test. |
| 0x91 | TCCL | torqueConverterClutchLocked | This response code indicates that the requested action will not be taken because the server prerequisite condition for torque converter clutch is not met (current TCC status above a preprogrammed limit or locked). |
| 0x92 | VTH | voltageTooHigh | This response code indicates that the requested action will not be taken because the server prerequisite condition for voltage at the primary pin of the server (ECU) is not met (current voltage is above a pre-programmed maximum threshold). |
| 0x93 | VTL | voltageTooLow | This response code indicates that the requested action will not be taken because the server prerequisite condition for voltage at the primary pin of the server (ECU) is not met (current voltage is below a pre-programmed maximum threshold). |
| 0x94 - 0xFE | < | reservedForSpecificConditionsNotCorrect | This range of values is reserved for future definition. |
| 0xFF | < | ISOSAEReserved | This range of values is reserved for future definition. |