ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • diag_tester_FRD
    application 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 파일로 설정 직접 수정 가능