application

diag_tester_FRD

hsl7 2026. 1. 19. 12:43

ESC Diagnostic Tester - Functional Requirement Document (FRD)

개요

  • ESC (Electronic Stability Control) 제어기를 진단하는 도구(Diagnostic Tester, 진단 시험기, 시험기)이다.
  • ESC와 시험기는 UDS(Unified Diagnostic Services) 기반 통신 프로토콜로 통신한다.
  • 통신은 CAN (Controller Area Network)으로 한다.
  • 사용자는 GUI에서 서비스를 선택하여 실행할 수 있다.
  • MVP(Minimum Viable Product) 접근법으로 단계별 개발을 진행한다.

참조 문서

  • esc_diag_hsl.md: ESC 진단 통신 스펙 
  • libTSCAN_Library_Python_Description.md: TOSUN사의 libTSCAN 라이브러리 사용법
  • libTSCANAPI/*.py: TOSUN사의 libTSCAN 라이브러리 사용을 위한 파이썬 모듈

개발 단계

Phase 1 - MVP (Minimum Viable Product)

목표: 기본 진단 통신 기능 구현 및 검증

  1. CAN 연결/해제
    • 하드웨어 인식 및 채널 선택
    • CAN 파라미터 설정
    • 연결 상태 표시
  2. Diagnostic Session Control (0x10)
    • Default Session (0x01)
    • Extended Diagnostic Session (0x03)
    • 세션 전환 및 상태 표시
  3. Tester Present (0x3E)
    • 주기적 전송 기능
    • suppressPosRspMsgIndicationBit 옵션
  4. 기본 메시지 송수신 로깅
    • 송신 메시지 표시
    • 수신 메시지 표시
    • 타임스탬프 포함

Phase 2 - 핵심 진단 기능

목표: 실용적인 진단 기능 추가

  1. Read Data by Identifier (0x22)
    • DID 읽기
    • 응답 데이터 파싱 및 표시
  2. Write Data by Identifier (0x2E)
    • DID 쓰기
    • 쓰기 확인
  3. DTC 관리
    • Read DTC (0x19)
    • Clear DTC (0x14)
    • DTC 상태 표시
  4. ECU Reset (0x11)
    • Hard Reset (0x01)
    • Soft Reset (0x03)

Phase 3 - 고급 기능 (추후 구현)

  1. Security Access (0x27)
  2. I/O Control (0x2F)
  3. Routine Control (0x31)
  4. Read Memory by Address (0x23)
  5. Write Memory by Address (0x3D)
  6. DID 데이터 그래프 출력

GUI 레이아웃

Phase 1, 2 GUI 구성

┌─────────────────────────────────────────────────────────────┐
│ 툴바: [Connect] [Disconnect] [Session] [Reset]              │
├─────────────────────────────────────────────────────────────┤
│ ┌──────────────┬──────────────────────────────────────────┐ │
│ │              │                                          │ │
│ │  Configuration│                                         │ │
│ │              │          메인 패널                       │ │
│ │  Diag & Comm │          (탭별 내용 표시)               │ │
│ │              │                                          │ │
│ │  DTC         │                                          │ │
│ │              │                                          │ │
│ │  Data        │                                          │ │
│ │              │                                          │ │
│ └──────────────┴──────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 메시지 로그 (송수신 메시지 표시 - 시간, 방향, ID, 데이터)    │
│ [12:34:56.123] TX 0x7D1: 10 03                             │
│ [12:34:56.130] RX 0x7D9: 50 03 00 32 01 F4                 │
├─────────────────────────────────────────────────────────────┤
│ 상태바: Connected | Baud: 500kbps | Session: Extended(0x03)│
└─────────────────────────────────────────────────────────────┘

Phase 1, 2 기능 상세 명세

일반 동작

  • 시험기는 사용자가 선택한 서비스의 요청 메시지를 CAN으로 전송한다.
  • 필요에 따라 TP(Transport Protocol)을 적용한다.
  • 시험기는 전송한 메시지와 메시지의 의미를 메시지 로그에 표시한다.
    • 포맷: [시간] TX/RX CAN_ID: 데이터바이트 | 설명
    • 예: [12:34:56.123] TX 0x7D1: 10 03 | DiagSession Extended
  • 시험기는 제어기의 응답 메시지를 수신한다. 필요에 따라 TP를 적용한다.
  • 시험기는 수신한 메시지와 메시지의 의미를 메시지 로그에 표시한다.
  • GUI의 상단에 툴바가 있다.
    • Connect/Disconnect 버튼
    • Session 선택 및 실행 버튼
    • Reset 버튼
  • GUI 맨아래 상태 표시줄이 있다.
    • Connect 상태 (Connected/Disconnected)
    • CAN Baud rate
    • 현재 Diagnostic Session

1. Configuration (Phase 1)

Configuration 탭에서 통신 파라미터를 설정한다.

1.1 CAN 설정

  • CAN/CAN-FD 선택
    • 라디오 버튼으로 CAN 또는 CAN-FD 선택
    • Phase 1, 2에서는 CAN만 지원
  • 채널 선택
    • 드롭다운 리스트로 채널 선택
    • 프로그램 시작 시 연결된 하드웨어의 채널 수를 자동 감지
    • 채널이 없으면 "No device found" 표시
  • CAN Baud Rate
    • 드롭다운 리스트: 125, 250, 500, 1000 kbps
    • 디폴트: 500 kbps
  • CAN-FD Baud Rate (Phase 3에서 구현)
    • 드롭다운 리스트: 1000, 2000, 4000, 8000 kbps
    • 디폴트: 2000 kbps

1.2 진단 통신 설정

  • Physical Request ID
    • 텍스트 입력 (Hex)
    • 디폴트: 0x7D1
    • ECU로 보내는 1:1 요청 메시지 ID
  • Physical Response ID
    • 텍스트 입력 (Hex)
    • 디폴트: 0x7D9
    • ECU로부터 받는 응답 메시지 ID
  • Functional Request ID
    • 텍스트 입력 (Hex)
    • 디폴트: 0x7DF
    • 브로드캐스트 요청 메시지 ID
  • ID Format 자동 판별
    • ID가 0x7FF 이하: Standard (11-bit)
    • ID가 0x7FF 초과: Extended (29-bit)
    • 자동 판별 결과를 라벨로 표시
  • Fill Byte
    • 텍스트 입력 (Hex)
    • 디폴트: 0xAA
    • CAN 메시지 패딩에 사용

1.3 Transport Protocol 설정

  • ST_Min (Separation Time Minimum)
    • ST_Min_Tx: 송신 시 프레임 간 최소 간격 (ms)
    • ST_Min_Rx: 수신 시 요구하는 최소 간격 (ms)
    • 텍스트 입력, 디폴트: 0 ms
  • Block Size (BS)
    • 텍스트 입력, 디폴트: 0 (무제한)
    • Flow Control 없이 보낼 수 있는 연속 프레임 수
  • P2 Timeout
    • 텍스트 입력
    • 디폴트: 500 ms
    • 첫 응답 대기 시간
  • P2 Extended
    • 텍스트 입력
    • 디폴트: 5000 ms
    • 부정 응답(NRC 0x78) 후 대기 시간
  • S3 Server Time
    • 텍스트 입력
    • 디폴트: 3000 ms
    • ECU가 Tester Present 없이 대기하는 시간
  • Max Length
    • 텍스트 입력
    • 디폴트: 4095 바이트
    • 단일 서비스 패킷의 최대 길이

Phase 3 파라미터 (현재는 비활성화):

  • User Define FC Delay
  • FD Max DLC
  • At least 8 Bytes 체크박스
  • FD BRS 체크박스

1.4 Tester Present 설정

  • Enable Tester Present 체크박스
    • Connect 상태에서만 활성화
    • Disconnect 되면 비활성화 (체크 상태는 유지)
    • 체크 시: 설정된 주기로 Tester Present 전송
    • 언체크 시: 전송 중지
  • suppressPosRspMsgIndicationBit 체크박스
    • 체크: 긍정 응답을 억제 (0x3E 0x80)
    • 언체크: 긍정 응답 요청 (0x3E 0x00)
  • 전송 주기
    • 텍스트 입력 (ms)
    • 디폴트: 2000 ms
    • 권장 범위: 1000~3000 ms (S3 Timer보다 짧게)

2. 진단기 연결/해제 (Phase 1)

2.1 Connect

  • 툴바 Connect 버튼
    • Configuration에서 설정한 파라미터로 CAN 연결
    • 연결 성공 시:
      • 상태바: "Connected" 표시
      • Baud rate 표시
      • 버튼 텍스트: "Disconnect"로 변경
    • 연결 실패 시:
      • 에러 다이얼로그 표시
      • 에러 내용: "Failed to connect. Please check hardware and configuration."

2.2 Disconnect

  • 툴바 Disconnect 버튼
    • CAN 연결 해제
    • Tester Present 자동 중지
    • 상태바: "Disconnected" 표시
    • 버튼 텍스트: "Connect"로 변경

3. Diagnostic Session Control (Phase 1)

Service ID: 0x10

3.1 GUI 구성

Diag & Comm 탭에 다음 요소가 있다:

  • Session 선택 드롭다운
    • Default Session (0x01)
    • Extended Diagnostic Session (0x03)
    • (Phase 3: Programming Session 0x02 추가 예정)
  • Change Session 버튼
    • 선택된 세션으로 전환 요청 전송
    • Connect 상태에서만 활성화

3.2 동작

  1. 사용자가 세션 선택 후 "Change Session" 버튼 클릭
  2. 요청 메시지 전송: 10 [session_type]
    • 예: Extended Session → 10 03
  3. 응답 대기 (P2 Timeout)
  4. 응답 수신 시:
    • 긍정 응답 (0x50):
      • 상태바 세션 표시 업데이트
      • 메시지 로그: [시간] RX 0x7D9: 50 03 00 32 01 F4 | Session Changed: Extended
    • 부정 응답 (0x7F):
      • NRC 코드 파싱 및 표시
      • 예: [시간] RX 0x7D9: 7F 10 13 | NRC: Incorrect Message Length
  5. 타임아웃 시:
    • 에러 다이얼로그: "Response timeout"

3.3 NRC 처리

주요 Negative Response Code:

  • 0x11: serviceNotSupported
  • 0x12: subFunctionNotSupported
  • 0x13: incorrectMessageLengthOrInvalidFormat
  • 0x22: conditionsNotCorrect
  • 0x78: requestCorrectlyReceived-ResponsePending

4. Tester Present (Phase 1)

Service ID: 0x3E

4.1 자동 전송

  • Configuration 탭에서 설정
  • 주기적으로 3E 00 또는 3E 80 전송
  • suppressPosRspMsgIndicationBit에 따라 서브 기능 결정

4.2 수동 전송

Diag & Comm 탭에 "Send Tester Present" 버튼 추가:

  • 클릭 시 즉시 Tester Present 전송
  • Connect 상태에서만 활성화

5. ECU Reset (Phase 2)

Service ID: 0x11

5.1 GUI 구성

Diag & Comm 탭에 다음 요소가 있다:

  • Reset Type 선택 드롭다운
    • Hard Reset (0x01)
    • Soft Reset (0x03)
  • ECU Reset 버튼
    • 선택된 Reset Type으로 ECU 재시작
    • Extended Session에서만 활성화

5.2 동작

  1. 사용자가 Reset Type 선택 후 "ECU Reset" 버튼 클릭
  2. 확인 다이얼로그: "ECU will be reset. Continue?"
  3. 요청 메시지 전송: 11 [reset_type]
  4. 응답 수신 시:
    • 긍정 응답 (0x51):
      • 메시지 로그: [시간] RX 0x7D9: 51 01 | ECU Reset: Hard Reset
      • ECU 재부팅 대기 (약 3초)
      • 자동 재연결 시도
    • 부정 응답:
      • NRC 표시
  5. Reset 후:
    • 세션이 Default Session으로 복귀
    • 상태바 업데이트

6. Read Data by Identifier (Phase 2)

Service ID: 0x22

6.1 GUI 구성

Data 탭에 다음 요소가 있다:

  • DID 입력
    • 텍스트 입력 (Hex, 2바이트)
    • 예: F190 (VIN)
  • Read DID 버튼
    • 입력된 DID 읽기 요청
  • 응답 데이터 표시 영역
    • Raw 데이터 (Hex)
    • ASCII 변환 (가능한 경우)

6.2 동작

  1. 사용자가 DID 입력 (예: F190)
  2. "Read DID" 버튼 클릭
  3. 요청 메시지 전송: 22 F1 90
  4. 응답 수신 시:
    • 긍정 응답 (0x62):
      • 데이터 파싱: 62 F1 90 [data...]
      • Raw 데이터 표시
      • ASCII 변환 표시 (printable한 경우)
    • 부정 응답:
      • NRC 표시

6.3 주요 DID 예시 (참고)

  • F190: VIN (Vehicle Identification Number)
  • F18C: ECU Serial Number
  • F187: Spare Part Number
  • F19E: System Name or ECU Software Number

7. Write Data by Identifier (Phase 2)

Service ID: 0x2E

7.1 GUI 구성

Data 탭에 추가:

  • DID 입력 (Read와 공통)
  • Write Data 입력
    • 텍스트 입력 (Hex)
    • 바이트 단위로 공백 구분
  • Write DID 버튼
    • Extended Session에서만 활성화

7.2 동작

  1. 사용자가 DID와 데이터 입력
    • 예: DID=F15A, Data=01 02 03
  2. "Write DID" 버튼 클릭
  3. 확인 다이얼로그: "Write DID 0xF15A. Continue?"
  4. 요청 메시지 전송: 2E F1 5A 01 02 03
  5. 응답 수신 시:
    • 긍정 응답 (0x6E):
      • 메시지 로그: [시간] RX 0x7D9: 6E F1 5A | Write DID Success
    • 부정 응답:
      • NRC 표시

8. DTC 관리 (Phase 2)

8.1 Read DTC

Service ID: 0x19

GUI 구성

DTC 탭에 다음 요소가 있다:

  • Read DTC 버튼
  • DTC 표 (Table)
    • 컬럼: DTC Code | Status | Description
  • DTC 통계 표시
    • Total DTC: n개
    • Confirmed DTC: n개
    • Pending DTC: n개
동작
  1. "Read DTC" 버튼 클릭
  2. 요청 메시지 전송:
    • reportDTCByStatusMask: 19 02 FF
    • 또는 reportNumberOfDTCByStatusMask: 19 01 FF
  3. 응답 수신 시:
    • DTC 파싱
    • 테이블에 표시
    • 통계 업데이트
DTC Status Byte 해석
Bit 7: warningIndicatorRequested
Bit 6: testFailedSinceLastClear
Bit 5: testNotCompletedSinceLastClear
Bit 4: confirmedDTC
Bit 3: testFailedThisOperationCycle
Bit 2: pendingDTC
Bit 1: testNotCompletedThisOperationCycle
Bit 0: testFailed

8.2 Clear DTC

Service ID: 0x14

GUI 구성
  • Clear DTC 버튼
    • Extended Session에서만 활성화
동작
  1. "Clear DTC" 버튼 클릭
  2. 확인 다이얼로그: "All DTCs will be cleared. Continue?"
  3. 요청 메시지 전송: 14 FF FF FF
  4. 응답 수신 시:
    • 긍정 응답 (0x54):
      • 메시지: "DTC cleared successfully"
      • DTC 테이블 비우기
    • 부정 응답:
      • NRC 표시

비기능 요구사항

성능

  • CAN 메시지 수신 지연: 최대 10ms
  • GUI 응답 시간: 1초 이내
  • 메시지 로그 표시: 최소 100줄 버퍼 (스크롤 지원)

신뢰성

통신 에러 처리

  • 연결 실패
    • 에러 다이얼로그 표시: "Failed to connect. Please check hardware and configuration."
    • 상태바에 "Connection Failed" 표시
  • 응답 타임아웃
    • P2/P2* 타임아웃 시 메시지 로그에 "Response Timeout" 표시
    • 사용자에게 알림 (옵션)
  • CAN 버스 오류
    • Bus-Off 상태 감지
    • 에러 다이얼로그: "CAN Bus Error. Please check connection."
    • 자동 Disconnect
  • 잘못된 메시지 형식
    • 메시지 파싱 실패 시 메시지 로그에 "Invalid message format" 표시
    • Raw 데이터는 그대로 표시

재연결 메커니즘

  • 연결이 끊어진 경우:
    • 3초 간격으로 2회 추가 재연결 시도 (총 3회)
    • 각 시도마다 상태바에 "Reconnecting... (n/3)" 표시
    • 재연결 실패 시 에러 다이얼로그 표시

로깅

메시지 로그

  • 모든 진단 통신 송수신 메시지를 로깅
  • 타임스탬프 포함 (ms 단위)
  • 로그 포맷: [HH:MM:SS.mmm] DIR ID: DATA | DESCRIPTION
    • DIR: TX (송신) / RX (수신)
    • ID: CAN ID (Hex)
    • DATA: 데이터 바이트 (Hex, 공백 구분)
    • DESCRIPTION: 서비스 설명
  • clear log 버튼

파일 로깅

  • logging 모듈을 사용한다.
  • Configuration 탭에 "Enable File Logging" 체크박스
  • 로그 파일 경로 설정 (텍스트 입력 + Browse 버튼)
  • 디폴트 경로: ./logs/diag_log_YYYYMMDD_HHMMSS.txt
  • 로그 파일은 프로그램 시작 시 새로 생성
  • 로그 포맷: 메시지 로그와 동일

설정 저장

  • 사용자 설정은 config/esc_diag_tester.json 파일에 저장
  • 프로그램 종료 시 자동 저장
  • 프로그램 시작 시 설정 파일 로드하여 디폴트 값으로 사용
  • 설정 파일이 없으면 하드코딩된 디폴트 값 사용

저장되는 설정 항목

  • CAN 설정: Baud rate, 채널
  • 진단 통신 설정: Request/Response ID, Fill Byte
  • TP 설정: ST_Min, Block Size, Timeouts
  • Tester Present: 활성화 여부, 주기, suppress 옵션
  • 로그 설정: 파일 로깅 활성화, 로그 경로
  • 윈도우 크기 및 위치

에러 처리

부정 응답 (NRC) 처리

메시지 로그에 NRC 코드와 설명 표시:

[시간] RX 0x7D9: 7F 10 13 | NRC 0x13: incorrectMessageLengthOrInvalidFormat

주요 NRC 코드:

  • 0x11: serviceNotSupported
  • 0x12: subFunctionNotSupported
  • 0x13: incorrectMessageLengthOrInvalidFormat
  • 0x22: conditionsNotCorrect
  • 0x24: requestSequenceError
  • 0x31: requestOutOfRange
  • 0x33: securityAccessDenied
  • 0x35: invalidKey
  • 0x36: exceedNumberOfAttempts
  • 0x37: requiredTimeDelayNotExpired
  • 0x78: requestCorrectlyReceived-ResponsePending

타임아웃 처리

  • P2 Timeout 시:
    • 메시지 로그: [시간] ERROR: Response timeout (P2)
    • 에러 카운터 증가 (상태바 표시)
  • P2* Timeout 시:
    • 메시지 로그: [시간] ERROR: Response timeout (P2 Extended)

CAN 버스 오류

  • Bus-Off 감지 시 자동 Disconnect 및 에러 알림
  • Error Passive 상태는 경고만 표시 (연결 유지)

잘못된 사용자 입력 처리

  • 잘못된 Hex 값 입력:
    • 입력 검증 (0-9, A-F만 허용)
    • 잘못된 입력 시 입력창 빨간색 테두리 표시
  • 범위 초과 값:
    • Baud rate, Timeout 등 허용 범위 검증
    • 경고 메시지 표시

Phase 3 이후 계획 (참고용)

Phase 3 - 고급 진단 기능

  1. Security Access (0x27)
    • Seed/Key 방식
    • 키 계산 알고리즘 설정
    • 시도 횟수 제한 표시
  2. I/O Control (0x2F)
    • 액추에이터 제어
    • 제어 옵션 선택
  3. Routine Control (0x31)
    • 루틴 시작/중지/결과 조회
    • 사전 정의된 루틴 목록
  4. Memory Access
    • Read Memory by Address (0x23)
    • Write Memory by Address (0x3D)
    • 메모리 주소 및 크기 입력

Phase 4 - 데이터 분석 및 시각화

  1. DID 데이터 그래프
    • 주기적 DID 읽기
    • 시계열 그래프 표시
    • 다중 DID 동시 표시 (최대 5개)
    • 그래프 export (이미지, CSV)
  2. DTC Freeze Frame
    • Freeze Frame 데이터 읽기
    • 상세 정보 표시
  3. 데이터 파일 저장
    • DID 데이터 CSV 저장
    • DTC 리포트 생성

Phase 5 - 자동화 및 편의 기능

  1. 테스트 시퀀스 자동화
    • 스크립트 작성 기능
    • 반복 테스트 실행
  2. DID/DTC 데이터베이스
    • 외부 파일(JSON/XML)로 DID/DTC 정의 관리
    • 설명 자동 표시
  3. ODX 파일 지원
    • ODX 파일 import
    • 자동 설정 적용

기술 스택 (참고)

개발 환경

  • 언어: Python 3.10+
  • GUI Framework: PyQt5 또는 Tkinter
  • CAN Library: libTSCAN (TOSUN)

주요 라이브러리

  • PyQt5 / PySide6 (GUI)
  • numpy, matplotlib (Phase 4 그래프용)
  • json (설정 관리)

프로젝트 구조 (예상)

mobis_esc_diag_tester/
├── main.py                 # 메인 엔트리 포인트
├── config/
│   └── esc_diag_tester.json  # 설정 파일
├── gui/
│   ├── main_window.py      # 메인 윈도우
│   ├── config_tab.py       # Configuration 탭
│   ├── diag_tab.py         # Diagnostic & Comm 탭
│   ├── dtc_tab.py          # DTC 탭
│   └── data_tab.py         # Data 탭
├── core/
│   ├── can_manager.py      # CAN 통신 관리
│   ├── uds_services.py     # UDS 서비스 구현
│   ├── message_parser.py   # 메시지 파싱
│   └── logger.py           # 로깅
├── libTSCANAPI/            # TOSUN 라이브러리
├── doc/
│   ├── esc_diag_tester_FRD.md
│   └── esc_diag_hsl.md
└── logs/                   # 로그 파일

개발 일정 (예상)

Phase 1 (2주)

  • Week 1: GUI 기본 구조, Configuration 탭, CAN 연결
  • Week 2: Diagnostic Session Control, Tester Present, 로깅

Phase 2 (2주)

  • Week 3: Read/Write DID, ECU Reset
  • Week 4: DTC Read/Clear, 테스트 및 버그 수정

Phase 3 이후

  • 필요에 따라 기능 추가

변경 이력

버전 날짜 변경 내용
1.0 2026-01-13 초기 FRD 작성 (Phase 1, 2 중심)
1.1 2026-01-14 트러블슈팅 섹션 추가 (CAN-FD 이슈, P2 타임아웃 반영)

트러블슈팅 (Troubleshooting)

1. ECU가 UDS 요청에 응답하지 않는 문제

증상:

  • CAN 버스에 요청 메시지는 보내지만 ECU 응답 없음
  • Type: "Data" (표준 CAN) 메시지로 전송됨
  • 로그에 timeout 오류 발생

원인:

  • Configuration Tab에서 CAN-FD를 선택했지만 실제로는 표준 CAN으로 전송됨
  • 일부 ECU는 CAN-FD 전용 모드로 동작하여 표준 CAN 프레임을 무시함

해결책:

# can_manager.py의 TSUDS 생성 시
is_fd_for_tsuds = is_canfd  # Configuration 설정과 일치시킴
dlc=8  # 8바이트 DLC 유지 (Flow Control 안정성)
bitrate_switch=is_fd_for_tsuds  # CAN-FD일 때 BRS 활성화

검증 방법:

  • CAN 버스 로그에서 Type: "FD", BRS: 1 확인
  • ECU가 정상 응답하는지 확인

2. ReadDTC 멀티프레임 응답 타임아웃 문제

증상:

  • SessionControl (Single Frame)은 성공하지만 ReadDTC (Multi Frame) 타임아웃
  • ECU가 10개 프레임을 모두 전송했지만 TSUDS가 수신 실패
  • TSUDS result: 161 (timeout)
  • Flow Control 메시지가 중복 전송됨:
    • 첫 번째: 표준 CAN "Data" type (30 00 14)
    • 두 번째: CAN-FD (30 00 00)
    • 세 번째: CAN-FD 64바이트 (30 00 00 00 00...)

원인:

  • TSUDS가 CAN-FD 모드에서 DLC=64로 설정되면 Flow Control 전송에 버그 발생
  • 표준 CAN과 CAN-FD Flow Control이 혼용되어 ECU가 혼란
  • Multi-frame 응답 처리 중 ISO-TP 프로토콜 오류

해결책:

# can_manager.py의 TSUDS 생성 시
dlc=8  # 64 대신 8바이트로 제한 (ISO-TP는 8바이트면 충분)
is_fd=is_canfd  # CAN-FD 사용은 유지

추가 안정화:

  • ReadDTC retry 로직 추가 (최대 3회 재시도)
  • msg_list 큐 초기화 (요청 전 이전 응답 제거)

3. P2/P2* 타임아웃 반영

배경:

  • ECU는 SessionControl 응답에 P2/P2* 타이밍 파라미터를 전송
  • 응답 형식: 50 <session> <P2_high> <P2_low> <P2*_high> <P2*_low>
  • 예: 50 03 00 2D 00 C8 → P2=45ms, P2*=200ms

구현:

# uds_services.py의 diagnostic_session_control()
if response[0] == 0x50 and len(response) >= 6:
    p2_can_server = (response[2] << 8) | response[3]  # milliseconds
    p2_star_can_server = (response[4] << 8) | response[5]  # milliseconds

    # Update TSUDS timeout with P2*
    new_timeout = p2_star_can_server / 1000.0  # Convert to seconds
    self.can_manager.uds_client.timeout = new_timeout

효과:

  • Extended Session 진입 시 ECU 요구 타이밍으로 자동 조정
  • 멀티프레임 응답의 안정성 향상

4. 설정 파일 저장/로드 문제

증상:

  • CAN-FD를 선택했지만 프로그램 재시작 시 CAN으로 초기화됨
  • Channel, CAN-FD Baudrate 등 일부 설정이 저장되지 않음

원인:

  • config_tab.pyload_settings()에서 누락된 필드:
    • can_type (CAN/CAN-FD 선택)
    • canfd_baudrate
    • termination_120
    • channel

해결책:

# config_tab.py의 load_settings()
if 'can_type' in settings:
    if settings['can_type'] == 'CAN-FD':
        self.canfd_radio.setChecked(True)
    else:
        self.can_radio.setChecked(True)

if 'channel' in settings:
    channel_idx = settings['channel']
    for i in range(self.channel_combo.count()):
        if self.channel_combo.itemData(i) == channel_idx:
            self.channel_combo.setCurrentIndex(i)
            break

if 'canfd_baudrate' in settings:
    self.canfd_baudrate.setCurrentText(str(settings['canfd_baudrate']))

if 'termination_120' in settings:
    self.termination_120.setChecked(settings['termination_120'])

검증:

  • 설정 변경 후 프로그램 종료
  • config/esc_diag_tester.json 파일 확인
  • 프로그램 재시작 시 설정 유지 확인

5. DTC 표 초기화가 보이지 않는 문제

증상:

  • ReadDTC 버튼 클릭 시 이전 DTC가 삭제되지 않는 것처럼 보임

원인:

  • UI 갱신이 DTC 응답 수신 후에만 발생
  • 표 삭제와 응답 표시가 너무 빨리 일어나 사용자가 인지 못함

해결책:

# dtc_tab.py의 read_dtc()
self.dtc_table.setRowCount(0)
self.update_statistics([], 0, 0)

# Force UI update before ECU request
from PyQt5.QtWidgets import QApplication
QApplication.processEvents()

효과:

  • 표 삭제 후 즉시 화면 갱신
  • ECU 요청 전에 빈 표를 사용자가 명확히 확인

개발 환경 설정 참고사항

필수 라이브러리:

pip install PyQt5
pip install pandas openpyxl  # DTC description xlsx 파싱용

libTSCAN 라이브러리:

  • libTSCANAPI/ 폴더 필요
  • TOSUN HS CANFD2 하드웨어 필요
  • Windows 64-bit 환경

디버깅 팁:

  • [DEBUG] 로그를 활성화하여 TSUDS 상태 확인
  • CAN 버스 모니터로 실제 프레임 타입 (Data/FD) 확인
  • config/esc_diag_tester.json 파일로 설정 직접 수정 가능