simulation
Python 미니프로그램: 코드에서 CAN 메시지의 신호를 읽는 방법
hsl7
2025. 1. 7. 19:49
코딩을 하다보면 메시지의 신호에서 값을 읽어올 경우가 있다. 그 방법을 설명한다.
신호를 포함하는 메시지를 읽을 수 있도록 준비
- 먼저 읽을 신호를 포함하고 있는 메시지를 코드에서 사용할 수 있도록 준비해야 한다.
- Python Code Editor의 Properties 탭을 클릭한다.
- 왼쪽 아래쪽에 Database Symbols 영역이 있다.
- 읽을 메시지가 포함된 dbc 파일을 체크한다. (TSMaster에서 dbc를 읽으면 pdbc로 변환된다.)
- Symbols 탭을 클릭한다.
- Global Definition을 선택한다. 여기에 메시지를 읽는데 필요한 코드가 삽입되어야 한다. 코드 어디에서나 사용되어야 해서 Global Definition에서 정의한다.
- Functions 탭을 클릭한다.
- 읽을 메시지에서 우클릭한다. Insert into script를 클릭한다. Global Definition에 코드가 삽입된다.
- CAN 메시지들의 정의가 있는 Databases 모듈을 import 한다.
- WHL_SPD11_1 메시지를 읽기 위한 글로벌 변수를 정의한다.
- 글로벌 변수의 이름은 아래 규칙으로 만들어진다.
- WHL_SPD11: 메시지 이름
- _1: 채널 이름
- 위와 같이 준비하면 해당 메시지를 읽고 쓸 수 있다.
메시지 안의 시그널을 읽는 법
- 새 메시지를 수신할 때 신호를 읽어 사용하게 된다. 그래서 On CAN Rx 이벤트에 신호를 읽는 코드를 추가한다.
- 아래 이름의 함수가 하나 만들어진다. 이름이 직관적이다.
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