본문 바로가기

CAN(Controller Area Network)

CANoe - CAPL로 신호 생성하기

CAPL이란?

- CAPL은 vector에서 개발한 프로그래밍 언어로, C와 유사함

- Event-driven 방식으로 작동 => Event에 따라 동작하는 방식

 

1. 생성할 신호 DBC에 추가하기

- signals와, signals를 담을 message, message를 받을 노드를 생성

- CAPL에서 직접 message를 만들 수도 있지만, 이 방법이 좀 더 직관적임(사실 나도 잘 모름..)

 

CAPL코드 작성하기

- 수정된 dbc를 다시 cfg에 업데이트 함(Node Synchronization)

- 이후 message를 발생시킬 Simulation Node 생성

 

- File을 누르면 CAPL코드를 만들 수 있음

- 원하는 이름으로 정하면 됨

- 확장자는 .can

- Tx_SIM.can 파일이 추가된 걸 확인할 수 있음

 

- 해당 연필 표시를 누르면, 생성된 CAPL 창이 열림

- includes는 라이브러리

- variables는 전역 변수를 정의하는 영역

- 왼쪽 영역에서 CAPL관련 함수(?)들을 불러올 수 있는 부분

- 예를 들면 on start의 경우, 시스템이 시작할 때 {}안에 뭐를 수행하겠다 라는 의미

 

★Tx_SIM_Node CAPL 코드 ★  

※ CAPL도 양이 방대해서 여기서 다 설명 불가... 그나마 CAPL은 자료가 있어서 찾아보거나 함수 definition으로 확인하세요....

variables

- timer는 시간 변수 타입, on timer 작동을 위해 반드시 필요한 변수

- message는 message 변수 타입, 선언 방법은 기존의 선언된 메시지 타입이 있다면 message 선언된_msg instance

- 만일 새로운 타입의 message를 선언하고 싶다면 message instance라고 선언하고 CAPL 내부 코드를 통해 선언 가능(이 부분은 찾아 보세요..)

- int, float, double 등 다른 변수 선언 가능

 

on start

- write는 printf라고 생각하면 됨, system이 시작할 때 write window에서 확인할 수 있음. 주로 디버깅 용

- setTimerCyclic은 위에서 선언한 timer의 주기를 선언하는 함수, setTimer도 있는데 이건 timer에 값을 1번만 할당함, 

 

on timer

- 위에서 설정한 시간에 맞춰 {}내부의 코드가 작동됨

- message A안에 signal B가 있다면, A.B로 접근

- CAPL창 오른쪽 window에 dbc에 정의된 msg가 있는데, 이걸 CAPL window에 drag & drop하면 해당 msg 변수가 선언됨

- output은 선언한 message를 발생시키는 함수

 

msg_Rx_ECU CAPL 코드

on message

- ECU가 해당 message를 받으면 {}안의 코드를 작동

- on message 옆에 message를 선언할 수 있는데, 오른쪽 창에서 원하는 msg frame을 drag & drop하면 msg 선언됨

- 왼쪽 위 compile 버튼을 누르면 compile & error 확인 가능(error가 뭔지 되게 불친절하게 알려줌.....)

 

실행

- 잠깐 실행되다 실행이 안되는 문제가 발생......

- 신호 개수를 줄이거나... 컨셉만 알아두세요