Study/CAN+UDS

DTC(Diagnostic Trouble Code)-고장갯수 요청

Answer Choi 2025. 11. 3. 13:48
반응형

UDS에서 DTC관련 코드는 크게 2가지 입니다.

DTC Read, DTC Clear가 있습니다.

 

DTC Read의 sub function은 하기와 같습니다.

 

sub
function
sub function 내용 의미
0x01 reportNumberOfDTCByStatusMask DTC의 총 개수를 요청
0x02 reportDTCByStatusMask 모든 DTC의 목록과 상태를 요청
0x03 reportDTCSnapshotIdentification DTC와 관련된 스냅샷 데이터의 식별 정보(레코드 번호 등)를 요청
0x04 reportDTCByOccurrenceTimeOfFirsConfirmedDTC 처음 발생한 확정 DTC를 기준으로 DTC 정보를 요청
0x05 reportDTCByOccurrenceTimeOfMostRecentConfirmedDTC 가장 최근에 발생한 확정 DTC를 기준으로 DTC 정보를 요청
0x06 reportDTCExtendedDataRecordByDTCNumber 특정 DTC 번호에 대한 확장 데이터 레코드를 요청
0x07 reportNumberOfDTCBySeverityMaskRecord 각도 마스크(Severity Mask) 및 상태 마스크와 일치하는 DTC의 개수를 요청
0x08 reportDTCBySeverityMaskRecord 심각도 마스크 및 상태 마스크와 일치하는 DTC 목록을 요청
0x09 reportSeverityInformationOfDTC 특정 DTC의 심각도(Severity) 정보를 요청
0x0A reportFunctionalUnitOfDTC 특정 DTC가 속한 기능 단위(Functional Unit) 정보를 요청
0x0B reportDTCByStatusMask ISO 표준에서는 0x02와 유사
0x0F reportMostRecentDTC 가장 최근에 발생한 DTC 정보를 요청
0x10 reportFirstOccurredDTC 가장 먼저 발생한 DTC 정보를 요청
0x11 reportMostRecentConfirmedDTC 가장 최근에 확정(confirmed)된 DTC 정보를 요청
0x12 reportFirstOccurredConfirmedDTC 가장 먼저 확정된 DTC 정보를 요청
0x13 reportMirrorMemoryDTCByStatusMask 특정 조건 하에 DTC를 별도 저장하는 메모리)에 저장된 DTC를 요청
0x14 reportNumberOfMirrorMemoryDTCByStatusMask 미러 메모리 DTC의 개수
0x15 reportDTCSnapshotRecordByRecordNumber 특정 레코드 번호에 해당하는 스냅샷 데이터를 요청
0x16 reportDTCExtendedDataRecordByRecordNumber 특정 레코드 번호에 해당하는 확장 데이터를 요청
0x17 reportWWH-OBDDTCSnapshotRecordByDTCNumber WWH-OBD(World-Wide Harmonized On-Board Diagnostics) 관련 스냅샷 요청
0x18 reportWWH-OBDDTCExtendedDataRecordByDTCNumber WWH-OBD 관련 확장 데이터 요청
0x19 reportDTCFaultDetectionCounter DTC의 결함 감지 카운터 값을 요청
0x1A reportDTCWithPermanentStatus 영구적인 상태(Permanent Status, 일반적으로 삭제할 수 없는 특정 DTC)의 DTC를 요청

 

이중에서 자주 사용하는 코드로 고장 개수를 읽어오는 것과 상세 고장코드(0x01, 0x02)에 대해 알아보겠습니다.

 

DTC 고장갯수 읽기부터 보겠습니다.

 

고장갯수를 읽는 sequence를 보면 아래 그림과 같습니다.

DTC Read

 

DTC의 경우 Security access나 Diagnostic Session control이 따로 필요하지 않습니다.

 

데이터 프레임은 아래와 같고

data frame

각각의 내용은 아래와 같이 넣습니다.

Status Mask는 가져올 오류의 조건입니다.

bit  status mask 내용 의미
0x01(0000 0001) test Failed 가장 최근의 테스트 결과에서 오류가 감지
0x02(0000 0010) test Failed This Operation Cycle 현재 작동 주기(operation cycle) 내에서 오류 감지
0x04(0000 0100) Pending DTC 현재 또는 직전 작동 주기에서 오류가 감지, 보류 
0x08(0000 1000) Confirmed DTC 오류가 일정 기간/조건 동안 지속되어 ECU에 영구적으로 저장된 확정된 DTC
0x10(0001 0000) Test Not Completed Since Last Clear 마지막으로 DTC가 삭제된 이후 해당 DTC에 대한 테스트가 완료되지 않음
0x20(0010 0000) Test Failed Since LastClear 마지막으로 DTC가 삭제된 이후 해당 DTC에 대한 테스트가 한 번이라도 실패
0x40(0100 0000) Test Not Completed This Operation Cycle 현재 작동 주기 내에서 테스트가 완료되지 않
0x80(1000 0000) warning Indicator Requested 계기판에 경고등(예: MIL) 점등을 요청해야 함

Status Mask는 필요한 것 하나만 체크를 할 수도 있으나 여러개를 보고싶은 경우 bit위치가 다르므로 한번에 보내도 됩니다.

예를들어, 모두 보고싶은 경우 아래와 같이 보내면 됩니다.

Status Mask가 0xFF이므로 모든 bit가 체크된 (1111 1111)이 되어 모든 항목에 대해 가져오게 됩니다.

 

sub Fn이 1이므로 개수 정보만 가져오게 됩니다.

 

응답은 sid에 0x40을 더한 응답이 오게 됩니다.

예를 들어 아래와 같은 응답이 왔다고 가정합니다.

1byte : length이니 그 뒤부터 6byte만 필요한 정보입니다.

2byte : 0x59는 0x19+0x40으로 0x19에 대한 응답을 뜻합니다.

3byte : sub funtion으로 요청한 0x01에 대한 것임을 뜻합니다.

4byte : status mask인데 0xff를 요청했지만 0x09가 온건 제어기가 지원하는건 0x01과 0x08뿐이라는 것을 의미합니다.

즉, test Failed와 Confirmed DTC만 제공 가능합니다.

5byte : DTC 포맷을 나타냅니다.

6~7byte : DTC갯수를 요청했으므로 DTC갯수를 의미하며 여기서는 1개입니다.

 

부정응답일 경우 아래와 같은 패킷을 보내게 됩니다.

 SID는 0x19를 요청했으므로 그래도 0x19이고, NRC는 이전 자료에 설명했던 원인들이 나타납니다.

 

반응형