UDS (Unified Diagnostic Services) — ISO 14229에 정의된 차량 진단 서비스 표준. ECU와 진단 테스터(Tester) 사이에서 교환되는 진단 메시지의 포맷과 의미, ECU의 응답 행동을 규정한다. CAN, LIN, MOST, FlexRay, Ethernet 등 다양한 버스 시스템 위에서 공통으로 사용될 수 있도록 설계되어, 전송 계층과 독립적으로 진단 서비스 계층을 정의한다.
진단 프로토콜 개요
진단 프로토콜(Diagnostic Protocol)은 ECU와 진단 테스터 사이의 통신 규약. 다음 요소로 구성된다.
- ECU와 진단 테스터 사이에 직렬로 전송되는 진단 서비스의 묶음.
- 송신된 메시지의 의미.
- ECU가 응답할 때의 행동 방법에 관한 데이터.
OEM마다 적용 방법이 달라 여러 표준이 공존해 왔으며, UDS는 이들을 통합하는 역할을 한다.
KWP → UDS 전환
UDS의 전신 KWP(Keyword Protocol)의 한계를 보완하여 확장·추가된 사양이다.
| 항목 | KWP | UDS |
|---|---|---|
| DTC 크기 | 2 Byte | 3 Byte |
| Local Ident. | 1 Byte | 2 Byte |
| 지원 버스 | K-Line 중심 | CAN, LIN, MOST, FlexRay, Ethernet |
| Fault Memory | OEM별 상이 | 단일화 (ReadDTCInformation 서비스) |
| Service ID | - | 간략화 |
| 주기 요청 | 불가 | 가능 (ReadDataByPeriodicIdentifier) |
ISO 14229 구성
| 표준 | 내용 |
|---|---|
| ISO 14229-1 | UDS 진단 서비스 본문 — Service ID, 서브펑션, Request/Response 포맷 |
| ISO 14229-2 | UDS Session Layer Services — UDS와 전송·네트워크 계층 간 독립성을 위해 공통 세션 계층 정의 |
ISO 14229-2가 존재하는 이유는 UDS가 CAN/LIN/FlexRay/Ethernet 등 상이한 전송 프로토콜 위에서 동일한 방식으로 동작하도록 세션 계층에서 추상화하기 때문이다. 전송 계층은 CAN TP(CAN 기반), DoIP(IP 기반) 등이 담당한다.
Client-Server 아키텍처
UDS는 Client-Server 기반 통신이다.
- Client (Tester) — 일반적으로 외부 진단 테스트 장비. Server에 진단 기능을 요청(Request).
- Server (ECU) — 주로 차량 내 ECU. Client의 요청에 응답(Response) 데이터를 반환.
목적은 테스트, 검사, 모니터링, 진단 기능 수행.
Service ID 규칙 (Request ↔ Positive Response)
UDS에서는 Positive Response SID = Request SID + 0x40.
| 서비스 | Request SID | Positive Response SID |
|---|---|---|
| DiagnosticSessionControl | 0x10 | 0x50 |
| ECUReset | 0x11 | 0x51 |
| ReadDataByIdentifier | 0x22 | 0x62 |
| WriteDataByIdentifier | 0x2E | 0x6E |
| RoutineControl | 0x31 | 0x71 |
진단 서비스 분류 (Functional Units)
ISO 14229-1은 진단 서비스를 6개 Functional Unit으로 분류한다.
1. Diagnostic and Communication Management
| SID | 서비스 | 설명 |
|---|---|---|
| 0x10 | DiagnosticSessionControl | 진단 세션 전환 |
| 0x11 | ECUReset | ECU 리셋 |
| 0x27 | SecurityAccess | 보안 영역 접근 (Seed/Key 인증) |
| 0x28 | CommunicationControl | 통신 활성/비활성 제어 |
| 0x3E | TesterPresent | Tester 존재 알림 (세션 유지) |
| 0x83 | AccessTimingParameter | 타이밍 파라미터 접근 |
| 0x84 | SecuredDataTransmission | 보안 데이터 전송 |
| 0x85 | ControlDTCSetting | DTC 기록 제어 |
| 0x86 | ResponseOnEvent | 이벤트 기반 응답 설정 |
| 0x87 | LinkControl | 통신 링크 속도 제어 |
2. Data Transmission
| SID | 서비스 | 설명 |
|---|---|---|
| 0x22 | ReadDataByIdentifier | 식별자로 데이터 읽기 |
| 0x23 | ReadMemoryByAddress | 메모리 주소로 읽기 |
| 0x24 | ReadScalingDataByIdentifier | 데이터 스케일링 정보 읽기 |
| 0x2A | ReadDataByPeriodicIdentifier | 주기적 데이터 읽기 |
| 0x2C | DynamicallyDefineDataIdentifier | 동적 식별자 정의 |
| 0x2D | WriteMemoryByAddress | 메모리 주소로 쓰기 |
| 0x2E | WriteDataByIdentifier | 식별자로 데이터 쓰기 |
3. Stored Data Transmission
| SID | 서비스 | 설명 |
|---|---|---|
| 0x14 | ClearDiagnosticInformation | 저장된 진단 정보(DTC) 삭제 |
| 0x19 | ReadDTCInformation | 저장된 DTC 조회 (단일화된 진입점) |
4. InputOutput Control
| SID | 서비스 | 설명 |
|---|---|---|
| 0x2F | InputOutputControlByIdentifier | ECU 입출력 신호 강제 제어 |
5. Routine
| SID | 서비스 | 설명 |
|---|---|---|
| 0x31 | RoutineControl | 자가 진단·튜닝 루틴 시작/중지/결과 요청 |
6. Upload Download
| SID | 서비스 | 설명 |
|---|---|---|
| 0x34 | RequestDownload | 다운로드 요청 (Tester → ECU) |
| 0x35 | RequestUpload | 업로드 요청 (ECU → Tester) |
| 0x36 | TransferData | 데이터 블록 전송 |
| 0x37 | RequestTransferExit | 전송 종료 요청 |
| 0x38 | RequestFileTransfer | 파일 단위 전송 |
대표 서비스 상세
DiagnosticSessionControl (0x10)
ECU의 진단 세션을 전환한다.
Request 포맷
| Byte | 필드 | 값 |
|---|---|---|
| #1 | Request SID | 0x10 |
| #2 | sub-function = diagnosticSessionType | 0x00~0xFF |
sub-function 주요 값
| 값 | 세션 | Mnemonic |
|---|---|---|
| 0x00 | ISOSAEReserved | ISOSAERESRVD |
| 0x01 | DefaultSession | DS |
| 0x02 | ProgrammingSession | PROGS |
| 0x03 | ExtendedDiagnosticSession | EXTDS |
| 0x40~0x5F | SystemSupplierSpecific | SSS |
Positive Response 포맷
| Byte | 필드 | 값 |
|---|---|---|
| #1 | Response SID | 0x50 |
| #2 | diagnosticSessionType 에코 | Request 값과 동일 |
| #3~ | sessionParameterRecord[] | 세션별 부가 데이터 |
CAN TP 캡슐화 예:
- Request:
02 10 01— SF·길이 2 / SID 0x10 / DefaultSession - Response:
02 50 01— SF·길이 2 / SID 0x50 / DefaultSession 에코
ReadDataByIdentifier (0x22)
Client가 Server(ECU)에 저장된 데이터 값을 식별자로 요청한다.
Request
| Byte | 필드 |
|---|---|
| #1 | Request SID = 0x22 |
| #2~#3 | dataIdentifier #1 (2 Byte, MSB·LSB) |
| … | dataIdentifier #m (반복 가능) |
Positive Response
| Byte | 필드 |
|---|---|
| #1 | Response SID = 0x62 |
| #2~#3 | dataIdentifier 에코 |
| #4~ | dataRecord (요청된 데이터 값) |
WriteDataByIdentifier (0x2E)
Client가 Server(ECU) 내부에 데이터 값을 식별자 기준으로 기록한다.
Request
| Byte | 필드 |
|---|---|
| #1 | Request SID = 0x2E |
| #2~#3 | dataIdentifier (2 Byte) |
| #4~ | dataRecord (기록할 값) |
Positive Response
| Byte | 필드 |
|---|---|
| #1 | Response SID = 0x6E |
| #2~#3 | dataIdentifier 에코 |
A_PDU 파라미터
UDS 메시지의 Application Layer PDU는 다음 파라미터를 포함한다.
| 파라미터 | 이름 | 의미 |
|---|---|---|
| MType | Message Type | 메시지 타입 |
| SA | Source Address (Logical Address) | 송신자 논리 주소 |
| TA | Target Address | 수신자 주소 |
| TAtype | Target Address Type | 주소 타입 (Physical/Functional) |
| RA | Remote Address | 원격 주소 (remote addressing 시만) |
| A_Data.A_PCI.SI | Service ID | 서비스 식별자 |
| A_Data.Parameter | data-parameter #1…#k | 서비스별 페이로드 파라미터 |
| Length | Length of A_Data | 전체 A_Data 길이 |
Target Address는 DoIP Diagnostic Routing에서 Gateway가 메시지 목적 ECU를 식별하는 기준으로 사용된다.
전송 계층 매핑
UDS는 ISO 14229-2 세션 계층에서 추상화되며, 실제 전송은 버스별 전송 프로토콜을 사용한다.
| 버스 | 전송 프로토콜 |
|---|---|
| CAN / CAN FD | CAN TP(ISO 15765-2) — 8 Byte 제약 극복 |
| LIN | LIN TP |
| FlexRay | FlexRay TP |
| Ethernet | DoIP (ISO 13400) |