Automotive/Testing

[CAPL] 메시지 주기 송신하기

코딩쪼앙 2025. 7. 17. 15:41

 

CAPl에는 메시지를 주기적으로 송신해주는 내장 함수가 없기 때문에 메시지를 주기적으로 송신하고싶다면 사용자가 직접 타이머를 이용해 재귀적으로 구현해야한다. 나는 아래와 같이 주기적으로 메시지를 송신하는 타이머를 구현했다.


🕒 1. 메시지를 보낼 타이머 설정하기

variables {
    msTimer cycle100msTimer;
}

 

  • variable 영역에 msTimer 타입의 변수를 선언한다.

🔁 2. 타이머 이벤트가 발생할 때 실행되는 함수 만들기

on timer cycle100msTimer {
  setCycle100ms();
}

 

타이머가 호출되면 sendCycle100ms 함수를 호출하여 메시지를 송신한다.


📤 3. 함수 내부에서 setTimer를 사용해 주기적으로 메시지 송신하기

void setCycle100ms() {
  msTimer cycle_100ms.byte(0) = 0x12;
  msTimer cycle_100ms.byte(1) = 0x34;
  output(cycle_100ms);
  setTimer(cycle100msTimer, 100);
}
  • 메시지가 정상적으로 송신되는지 쉽게 확인하기 위해 특정 바이트에 원하는 값을 담아 보낼 수 있다.
  • ouptut을 사용하여 원하는 메시지를 송신한다.
  • setTimer를 다시 설정하여 원하는 메시지가 재귀적으로 계속해서 호출될 수 있도록한다. -> 전송을 더이상 중단하기 위해서는 cancelTimer를 사용한다.

🎛️ 4. Panel과 연동해서 메시지 송신 제어하기

Panel의 버튼을 눌렀을 때 메시지를 주기적으로 송신하고 싶다면 System Variable을 생성하고 해당 값이 변경될 때 이벤트를 처리할 수 있다.

on sysvar sendCyclicMessages {
  if (sysGetVariableInt(this)) {
    setCycle100ms();
  }
}
  • sendCyclicMessages는 Canoe에서 설정한 System Variable
  • 이벤트가 발생하면 cycle100msTimer 타이머를 시작하여 주기 송신을 시작한다.

System Variable을 생성하고 연결하는 과정은 아래에서 참고할 수 있다.

 

[CAPL] Panel 버튼과 CAPL 연결하여 메시지 송신하기

🧩 왜 CAPL과 Panel을 함께 사용할까?CANoe에서 테스트를 수행할 때, 보다 직관적이고 간편하게 메시지를 송수신하기 위해 CAPL 스크립트와 패널 기능을 함께 활용할 수 있다. 특히 반복적인 테스트

iilovecode.tistory.com

 


✨ 메시지 송신 취소하기

cancelTimer(cycle100msTimer);
  • CAPL에서 제공하는 cancelTimer를 사용하여 타이머를 손쉽게 취소할 수 있다.