ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • UDS 기반 제어기 프로그래머 개발 - libTSCAN
    application 2025. 8. 11. 16:23

    시작하기 전에 

    • ts_can_flash_programmer 개발 - libTSCAN :: hsl's tsmaster 사용기 에서 토선의 libTSCAN.dll (libTSCAN은 공짜다. 토선 하드웨어는 공짜가 아니다.)을 이용하여, Texas Instrument의 C2000 패밀리 마이크로콘트롤러 칩을 CAN으로 프로그램밍하는 PC용 툴을 개발했다.
    • ts_can_flash_programmer는 오늘날 자동차 산업에서 사실상 표준인 UDS (Universal Diagnostic Service)를 따르지 않는다. 
    • libTSCAN을 이용하여 UDS 표준에 따라 CAN 통신으로 프로그래밍을 하는 PC용 툴을 만들어본다.
    • ts_can_flash_programmer는 C로 짰다. (ai가 짰지만) 내가 익숙한 파이썬으로 짜본다. (해본 후 감상은 "C를 배워서 C로 짜야겠다"이다.) 
    • SDV(Software Defined Vehicle)는 소프트웨어 업데이트라는 과정을 통해서 소비자에게 효용이 전달된다. 즉, 제어기 프로그래밍을 통한다. 

     

     

    참조

     

    개요

    • 제어기 프로그래밍 절차는 아래와 같다고 가정한다.
      • 진단 모드 진입, 프로그래밍 모드 진입 (0x10: Diagnostic Session Control) 
      • 씨드 키(Seed & Key) 보안 접속 (0x27: Security Access)
      • 다운로드 (0x34: Request Download, 0x36: Transfer Data, 0x37: Request Transfer Exit)
      • 제어기 리셋 (0x11: ECU Reset)
      • 실제로는 위 절차 보다 더 길고 복잡할 것이다. 내가 절차를 정하는 입장이라면, 최소한 프로그래밍 전에 제어기 품번, 하드웨어 정보, 소프트웨어 정보, 진단 코드 확인 등을 할 것이다.  프로그래밍 후에는 진단 코드를 확인하여 프로그래밍이 잘 되었는지 확인할 것이다. 하드웨어 정보, 소프트웨어 정보, 프로그래밍 날짜 등을 제어기에 쓸 것이다. 이 정보가 제대로 쓰여졌는지 확인할 것이다. 그리고 이 정보를 서버에 보관할 것이다. 필요할 때 추적할 수 있도록. 
    • 위 절차에 따라 UDS 서비스를 요청하는 진단기용 데모 코드 (esc_flash_programmer.py)를 개발한다.
    • 진단기의 요청에 응답하는 제어기용 데모 코드(esc.py)를 개발한다.
    • 나는 ESC (Electronic Stabililty Control) 제어기를 좋아한다. 제어기는 ESC인 것으로 가정한다. UDS 진단 통신을 하는 제어기라면 어떤 제어기라도 해당된다.

     

    esc_flash_programmer.py

    • 코드는 1차로 claude.ai와 대화를 통해서 작성했다. 클로드와 대화를 첨부한다. 대화 중 코드 부분이 길다. 삭제하였다. 코드 파일을 업로드한다.

    Claude-UDS Diagnostic Service for ESC_코드_삭제.pdf
    1.50MB

    esc_flash_programmer.py 개발을 하기 위한 클로드와 대화

    esc_flash_programmer.py
    0.06MB

    클로드가 1차 작성한 코드를 깃헙 코파일럿과 수정한 코드다.

    • libTSCAN api의 pdf 문서와 예제 코드를 업로드하니 클로드가 api 사용법을 파악하였다. 간편하였다.
    • 파일이 너무 크거나 많으면 업로드할 때 파일을 분리하여야 해서 귀찮다. 자료가 있는 github 링크 (https://github.com/TOSUN-Shanghai/libTSCANDemos)를 알려주고 자료를 확인하라고 했다. 이 방법도 된다. 파일 업로드보다 더 간편해서 좋다.
      • 링크에 자료가 너무 많지 않도록 주의해야 한다. ai가 자료를 읽는데 시간이 많이 걸린다. (= 돈도 많이 들 것이다.)
    • 이렇게 작성한 코드를 vscode에서 github copilot과 함께 수정하였다. 깃헙 코파일럿은 ai 모델을 선택할 수 있다. (내가 따로 선택하지 않은 것 같은데) 결국 수정도 클로드와 함께 했다. 

    vscode에서 클로드와 코드 수정 작업을 했다.

     

    • 위에 정의한 프로그램밍 절차로 수행할 것을 요청하였다.  
    • DOS 창에서 실행하기 좋도록 커맨드라인 옵션들을 만든다.
      • -i 혹은 --input-file: 프로그램할 hex 파일
      • -r 혹은 --request: 진단 통신 요청용 CAN 메시지 ID
      • -s 혹은 --response: 진단 통신 응답용 CAN 메시지 ID
      • -c 혹은 --channel: 사용할 CAN 인터페이스 하드웨어의 채널. 0부터 시작한다.
      • --stmin: 진단 통신의 STmin. 연속 전송하는 메시지들 사이의 간격. 단위 msec. 너무 빨리 보내서 수신 측에서 오버플로우가 발생하지 않도록 
      • -b 혹은 --block-size: 진단 통신의 block-size. 연속 전송하는 메시지들의 개수. 너무 많이 보내서 수신 측에서 오버플로우가 발생하지 않도록  
      • --s3-server: 진단 통신의 s3-server timeout 시간. msec 단위. 제어기나 진단기는 타임아웃되면 기본 모드로 변경한다.
      • --s3-client: 진단 통신의 s3-client timeout 시간. msec 단위. 제어기나 진단기는 타임아웃되면 기본 모드로 변경한다.
      • --p2-server-max: 진단 통신의 p2-server-max. msec 단위. 서버는 이 시간 안에 일단 응답을 해야한다.
      • --p2star-server-max: 진단 통신의 p2*-server-max. msec 단위. 서버는 이 시간 안에 서비스를 완료해야 한다.
      • --n-as, --n-ar, --n-bs, --n-ar, --n-cs, --n-ar:  TP(Transport Protocol) 통신 중, 타임아웃 한계 시간. 단위 msec. 
    • DOS 창에서 커맨드라인으로 실행할 수 있도록 하면, DOS 창을 여러 개 열어서 여러 제어기들을 동시에 프로그래밍 할 수 있지 않을까 기대한다. (해보고 포스팅하겠다.)
    • 위 코드를 실행하기 위해서 github의 libTSCAN 파일들이 필요하다. 
      • 아래 libTSCANAPI_py.zip 압축 파일의 py 코드 파일들을, esc_flash_programmer.py가 있는 디렉토리 아래 libTSCANAPI 디렉토리를 만들어서 압축 해제한 파일을 저장한다.
      • 아래 libTSCAN.zip에는 libTSCAN.dll 파일이 있다. 이 dll 파일을 esc_flash_programmer.py가 있는 디렉토리에 압축 해제하여 저장한다.

    libTSCANAPI_py.zip
    0.05MB

    libTSCAN API를 사용하기 위한 파이썬 코드 파일

    libTSCAN.zip
    8.93MB

    libTSCAN.dll 파일

    • esc_flash_programmer.py를 실행해보기 위해서는 아래에서 설명하는 esc.py 가 함께 필요하다.

     

     

    esc.py

    • esc_flash_programmer.py를 만들할 때와 같은 방식으로 클로드와 대화로 코드를 개발하였다. 파일 정리 중에 대화가 없어졌다. 아마도 무심결에 대화를 삭제한 것 같다. 
    • 클로드에게 esc_flash_programmer.py의 상대 시뮬레이터라는 점을 설명했던 것 같다. 코파일럿이 vscode에 열려있는 esc_flash_programmer.py를 알아서 참조했다.
    • 코파일럿의 문의에 빠짐없이 답을 하고, 코파일럿에게 더 필요한 정보가 있는지 확인한 후에, 코드 작성을 요청했다.
    • 요즘 나는 이 방식으로 ai와 대화한다. ai는 준비가 안 된 상태에서 마구 코딩을 하는 나쁜 습관이 있다. (ai 회사 사람들이 그렇게 하도록 시킨 것이 아닐까 의심한다. 내가 구매한 토큰을 빨리 소진시키려고.) 이를 방지하기 위해서 나는 대화 초기에 요구 조건들이 충분히 마련되어 내가 시작하라고 하기 전까지 코딩을 하지 말라고 요청한다. 그리고 대화 중간에 논의된 요구 조건들을 정리해달라고 요청한다. 이는 새로 대화를 시작할 때를 대비해서다. 새 대화를 시작할 때, 정리 내용을 업로드하면 시간이 절약된다.  

    esc.py
    0.04MB

    코파일럿에게 esc_flash_programmer의 상대 시뮬레이터 작성을 요청했다. 

     

     

    실행

    • CAN 채널이 2 개 있는 TC1013의 채널 1과 2를 연결하였다. 같은 CAN 버스에 제어기와 진단기가 연결된 상태에 해당한다.

    TC1013의 채널 두 개를 연결하였다. 한 채널은 제어기, 다른 한 채널은 진단기 역할이다.

    • 윈도에서 DOS 창을 두 개 연다.
    • 한 쪽에서 esc.py를 실행한다. esc는 진단 요청을 대기한다. esc.py를 먼저 실행한다. 채널 1번을 사용하도록 설정한다.
    • 다른 쪽에는 esc_flash_programmer.py를 실행한다. 채널 0번을 사용하도록 설정한다.
    • 제어기와 프로그래머 사이의 CAN 통신을 모니터링하기 위해서 TSMaster를 실행한다.
      • 트레이스 창을 2개 연다. 한 창은 채널 0만 (TSMaster 채널로는 1번이다.), 다른 창은 채널 1만 모니터링 하도록 필터를 적용한다.
      • 필터를 적용하는 방법은 아래 그림과 같다. (아래 그림에서 트레이스창의 이름을 Programmer라고 변경하였다.)

    트레이스창에서 필터 아이콘을 클릭한다.

     

    필터 설정창에서 필터를 설정한다. 왼쪽 아래에서 Filter Enabled를 체크한다. Pass 필터를 선택한다. 마우스 우클릭으로 메뉴를 띄운다. Add raw CAN frame을 선택한다. 필터 행이 추가된다. Channel을 선택하고 Identifier를 입력한다.

    • 토선 하드웨어의 장점은 TSMaster와 libTSCAN.dll을 사용하는 프로로그램들이 하드웨어를 공유할 수 있다는 점이다. 그래서 파이썬 프로그램을 실행하면서 TSMaster로 프로그램간 CAN 메시지 전송을 모니터링 할 수 있다.
    • 실행하면 아래 비디오와 같이 된다. 
    esc 시뮤레이터와 esc_flash_programmer를 함께 동작한 상황. TSMaster로 두 프로그램이 송수신하는 메시지들을 모니터한다.

     

     

    시트 키 dll 작성 및 사용법

    • 위에 첨부한 클로드와 대화 pdf 파일의 마지막에 있듯이, 처음에는 씨드 키를 코드로 작성했다. 일반적으로 씨드 키 알고리즘은 OEM이 dll로 제공한다. 파이썬 예제에 dll을 이용하는 방법을 설명하기 위해서 씨드 키 부분을 dll로 만들었다.
    • dll 작성도 코파일럿과 함께 했는데, 무심결에 대화를 삭제한 것 같다. 기억하는 (중요한) 포인트들은 아래와 같다.
    • 코파일럿에게 dll을 생성 방법을 문의하였다. 파이썬으로 dll을 만드는 방법이 없던가 복잡했다. 코파일럿이 권하는대로 PC에서 dll을 생성할 수 있는 MinGW라는 C 컴파일러를 사용하기로한다. (코파일럿은 MSYS2라는 것도 함께 권했다. MinGW가 낯익어서 이걸로 정했다.)
    • MinGW를 다운로드 받아 설치한다. (코파일럿에게 설치 방법을 문의했던가? 기억이 정확하지 않다.)
    • 씨드 키 함수를 호출하는 프로토타입이 필요하다. Vector CANOe의 함수 프로토타입이 준표준이 아닐까? 인터넷 검색으로 함수 프로토타입을 찾았다. 함수 이름도. https://github.com/Evilpaul/seedkey 
    • 참고로, ETAS의 누군가가 작성한 예제도 찾았다. https://github.com/elupus/autosar-xcp/tree/master/tools/SeedNKeyDll  
    • 알고리즘은 예제를 보는 사람들이 암산으로도 확인 가능하도록 간단하게 하기로 한다. 예를 들어, 해당 바이트 + 1 같은 방식이다. 코파일럿에게 인터넷에서 구한 예제 C, H 파일들을 주고, 간단한 알고리즘으로 해달라고 하여 C 코드 작성을 요청했다.
    • 코파일럿이 친절하게 MinGW로 C 코드에서 dll을 생성하는 커맨드라인 명령어를 알려주었다. 이 명령어로 dll을 생성하였다.
    • 코파일럿이 더 친절하게 dll이 제대로 작동하는지 실험할 수 있는 파이썬 코드도 작성해주었다.
    • 첨부 seedNKey.zip에는 위에서 말한 시드 키 관련된 파일들이 있다. 이 중에 seedNKey_demo.dll 파일은 esc_flash_programmer.py와 같은 디렉토리에 저장되어야 한다.  

    seedNKey.zip
    0.01MB

    씨드 키 dll과 dll을 만드는데 사용된 C, H 파일

     

     

     

    결론

    • libTSCAN.dll을 이용하여 UDS 표준의 진단 서비스들을 이용하여 제어기를 프로그래밍하는 프로그램을 파이썬으로 작성했다.
    • 프로그램을 실험해보기 위해서 제어기를 시뮬레이션한느 파이썬 프로그램을 함께 작성했다.
    • TP(Transport Protocol) 구현하였다.
      • 구현한 후에 libTSCAN.dll에 TP가 구현되어 있다는 것을 발견하였다.
      • libTSCAN.dll에 UDS 서비스들도 구현되어 있다.   
      • libTSCAN.dll의 TP와 UDS 함수들을 이용하도록 파이썬 프로그램을 수정하려고 시도했다. 잘 안 되었다.
      • 차라리 내가 C를 배워서 C로 프로그램을 작성하면 잘 될 것 같다. 그렇게 생각하게된 이유는 파이썬 타입 변수를 C  타입 변수로 변환하는 부분이 잘 처리되지 않아서이다. 잘 안 되는 이유는 여러 가지가 있을텐데 ... 토선이 제공하는 문서와 예제 코드의 내용이 서로 맞지 않는 것도 그중 하나일 것이다. ai가 두 자료의 불일치로 크게 혼동되는 것 같다. 다행히 libTSCAN.dll을 사용하기 위해 필요한 C 지식 수준이 높아보이지 않는다.
    • libTSCAN을 사용할 때, python-can이라는 공개 라이브러리 (https://python-can.readthedocs.io/en/stable/)를 사용했다. 나는 아마 전에 https://www.tosunai.com/en/download/python-can/ 의 안내에 따라 python-can에서 토선 하드웨어를 사용할 수 있도록 해두었을 것이다. 
      • 클로드와 함께 python-can을 제거한 코드를 작성해봤다. esc.py는 수월하게 수정되었다. esc_flash_programmer.py는 하루 종일 시도와 실패를 반복했는데도 잘 안 되었다. 나중에는 코파일럿이 태업을 하는 것처럼 느꼈다. (ai는 프로그램이니까, ai 회사 사람들이 프로그램으로 조치를 했을 것이라 짐작한다. ☺️) 

     

     

    이 포스트를 대표하는 이미지가 필요하여 클로드에게 "자동차 제어기 프로그래밍을 표현하는 일러스트를 그려줄 수 있습니까?" 라고 요청하여 받은 이미지. 대단한 세상에 살고 있음을 실감한다.

     

     

     

     

    목차 :: hsl's tsmaster 사용기