ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 미니프로그램: 코드에서 CAN 메시지의 신호를 읽는 방법
    tip 2025. 1. 7. 19:49

    코딩을 하다보면 메시지의 신호에서 값을 읽어올 경우가 있다. 그 방법을 설명한다.

     

    신호를 포함하는 메시지를 읽을 수 있도록 준비

    • 먼저 읽을 신호를 포함하고 있는 메시지를 코드에서 사용할 수 있도록 준비해야 한다.  
    • Python Code Editor의 Properties 탭을 클릭한다. 
    • 왼쪽 아래쪽에 Database Symbols 영역이 있다. 
    • 읽을 메시지가 포함된 dbc 파일을 체크한다. (TSMaster에서 dbc를 읽으면 pdbc로 변환된다.)

    dbc에 포함된 메시지들을 코드에서 사용할 수 있도록 하기 위해 Properties 탭의 Database Symbols에서 dbc를 체크한다.

    • Symbols 탭을 클릭한다.
    • Global Definition을 선택한다. 여기에 메시지를 읽는데 필요한 코드가 삽입되어야 한다. 코드 어디에서나 사용되어야 해서 Global Definition에서 정의한다.

    메시지를 읽는데 필요한 코드가 들어갈 Global Definition을 클릭한다.

    • Functions 탭을 클릭한다.
    • 읽을 메시지에서 우클릭한다. Insert into script를 클릭한다. Global Definition에 코드가 삽입된다.  

    메시지를 우클릭하고 Insert into script를 클릭한다.

     

    Global Definition에 메시지를 읽는데 필요한 코드가 추가된다. 코드는 Databases 모듈을 import 하고 글로벌 변수 WHL_SPD11_1를 정의

    • CAN 메시지들의 정의가 있는 Databases 모듈을 import 한다.
    • WHL_SPD11_1 메시지를 읽기 위한 글로벌 변수를 정의한다.
    • 글로벌 변수의 이름은 아래 규칙으로 만들어진다. 
      • WHL_SPD11: 메시지 이름
      • _1: 채널 이름
    • 위와 같이 준비하면 해당 메시지를 읽고 쓸 수 있다.

     

    메시지 안의 시그널을 읽는 법 

    • 새 메시지를 수신할 때 신호를 읽어 사용하게 된다. 그래서 On CAN Rx 이벤트에 신호를 읽는 코드를 추가한다.  

    메시지를 수신할 때 신호를 읽기 위해서 On CAN Rx에 함수를 만든다. On CAN Rx에서 마우스 우클릭한다. 용도에 맞게 CAN 혹은 CAN FD를 선택한다.

     

    연동할 CAN(CAN-FD) 메시지를 선택하고, 함수 이름을 입력한다. 메시지 이름을 함수 이름으로 사용하면 무난하다.

     

    • 아래 이름의 함수가 하나 만들어진다. 이름이 직관적이다. 
    def on_can_rx_WHL_SPD11(ACAN: RawCAN) -> None:

     

    • 함수에서 실행할 코드를 추가한다. 

    함수에서 실행할 코드를 추가한다.

    • 메시지의 신호를 읽어서 사용하는 방법은 아래와 같이 간단하다.
    def on_can_rx_WHL_SPD11(ACAN: RawCAN) -> None:
    
        # WHL_SPD11 메시지를 수신하면, 
        # TSMaster는 on_can_rx_WHL_SPD11 함수를 실행한다.
    
        # WHL_SPD11 메시지는 ACAN 인자에 들어있다.
        # ACAN에 있는 데이터를 WHL_SPD11의 구조에 맞게 읽어야 한다.
        # WHL_SPD11 구조에 따라 선언된 WHL_SPD11_1 클래스를 이용한다.
    
        # Global Definition에서 선언한 WHL_SPD11_1 클래스를 사용하기 위해서
        global WHL_SPD11_1 # 변수 이름과 겹치지 않으면 안 해도 된다.         
        
    
        # ACAN의 데이터를 WHL_SPD11_1 클래스에 넣는다. 
        # 이로서 WHL_SPD11 메시지의 구조대로 신호들에 값이 할당된다.  
        WHL_SPD11_1.FRawCAN = ACAN
    
        # WHL_SPD11_1 메시지의 WHL_SPD_RR과 WHL_SPD_RL 신호를 이용하는 방법
        whl_spd_rr_minus_r1 = WHL_SPD11_1.WHL_SPD_RR - WHL_SPD11_1.WHL_SPD_RL