본문 바로가기
CAPL

CAPL 이벤트 함수 완전 정리

by Autosar 2026. 4. 12.
반응형

앞선 글에서 CAPL이 무엇인지, 그리고 기본 문법은 어떻게 구성되는지 정리했다면 이제는 CAPL의 핵심 구조를 이해할 차례다.

많은 사람이 CAPL을 처음 배우면서 변수 선언, 조건문, 반복문 같은 문법에 먼저 집중한다.

 

물론 그것도 중요하다.

하지만 실제로 CAPL을 제대로 사용하려면 문법보다 먼저 이해해야 하는 개념이 있다.

 

바로 이벤트(Event) 기반 실행 구조다.

C언어를 처음 배울 때는 main() 함수 안에서 코드가 위에서 아래로 순차적으로 실행되는 방식에 익숙하다.

프로그램이 시작되면 첫 줄부터 마지막 줄까지 흐름대로 동작하고, 필요한 경우 함수 호출을 통해 기능을 나누어 구현한다.

반면 CAPL은 이런 구조와 다르다.

 

CAPL은 특정한 사건이 발생했을 때 해당 블록이 실행되는 방식으로 동작한다.

예를 들어 차량 네트워크 환경에서는 아래와 같은 상황이 끊임없이 발생한다.

- CAN 메시지가 수신된다.
- 특정 Signal 값이 변경된다.
- 100ms 주기가 도래한다.
- 사용자가 키보드를 누른다.
- 시뮬레이션이 시작된다.

CAPL은 이런 상황을 각각 이벤트로 인식하고, 이벤트가 발생했을 때 미리 작성한 코드를 실행한다.

그래서 차량 통신 테스트, ECU 동작 검증, 메시지 자동화, 진단 시나리오 구성 같은 업무에 매우 적합하다.

이번 글에서는 실무에서 가장 많이 사용하는 CAPL 이벤트 함수들을 하나씩 자세히 정리하고,

실제 프로젝트에서 어떤 방식으로 활용되는지도 함께 설명하겠다.

 

1. CAPL에서 이벤트 구조가 중요한 이유

 

차량 제어 시스템은 정적인 프로그램이 아니라 외부 입력에 따라 계속 상태가 바뀌는 시스템이다.

운전자가 시동을 켜면 IGN 상태가 바뀌고, 차량이 움직이면 속도 값이 바뀌며, 도어를 열고 닫으면 관련 신호가 변경된다.

또한 ECU들은 주기적으로 CAN 메시지를 송수신하며 서로 상태를 주고받는다.

만약 이런 시스템을 순차 실행 코드로만 만들려고 한다면, 모든 상태를 계속 검사하는 복잡한 루프를 만들어야 한다.

하지만 이벤트 기반 구조에서는 필요한 순간에만 코드가 동작하므로 훨씬 효율적이고 직관적이다.

예를 들어:

- 메시지가 들어왔을 때만 처리한다.
- 타이머 시간이 되었을 때만 송신한다.
- 키 입력이 있을 때만 테스트를 시작한다.

즉, CAPL은 “계속 검사하는 방식”이 아니라 “발생한 순간 반응하는 방식”이라고 이해하면 된다.

 

2. 가장 많이 사용하는 이벤트 함수 정리

 

실무에서 자주 사용하는 이벤트 함수는 생각보다 명확하다.

모든 기능을 다 외울 필요는 없고, 아래 몇 가지만 정확히 이해해도 대부분의 업무를 수행할 수 있다.

 

on start

 

on start는 시뮬레이션이 시작되는 순간 한 번만 실행되는 이벤트다.

프로젝트를 실행했을 때 가장 먼저 동작한다고 생각하면 된다.

on start
{
    write("Simulation Start");
}

 

위 코드는 시뮬레이션이 시작되면 로그 창에 문자열을 출력한다.

언제 사용할까?

실무에서는 on start를 단순 로그 출력보다 훨씬 중요한 초기화 구간으로 사용한다. 예를 들면:

- 전역 변수 초기화
- 테스트 카운터 초기화
- 타이머 시작
- 초기 CAN 메시지 송신
- 환경 변수 설정
- 시작 상태 로그 출력

프로그램을 실행하자마자 필요한 준비 작업을 이곳에 넣는다고 생각하면 된다.

실무 예제

variables
{
    int gCount = 0;
    msTimer t1;
}

on start
{
    gCount = 0;
    write("초기화 완료");
    setTimer(t1, 1000);
}

 

위 예제에서는 카운터 값을 0으로 초기화하고, 1초 후 동작할 타이머를 시작한다.

실제 프로젝트에서도 이런 패턴은 매우 흔하다.

 

on message

 

on message는 특정 CAN 메시지를 수신했을 때 실행되는 이벤트다.

CAPL에서 가장 많이 사용하는 기능 중 하나이며, 차량 네트워크 테스트의 핵심이라고 해도 과장이 아니다.

on message BDC_FD_02_200ms
{
    write("Message Receive");
}

 

BDC_FD_02_200ms 메시지가 수신되면 코드가 실행된다.

왜 중요한가?

차량 ECU 테스트의 대부분은 “어떤 메시지가 들어왔을 때 어떻게 반응하는가?”를 확인하는 작업이다.

따라서 메시지를 감지하고 처리하는 on message는 거의 모든 CAPL 프로젝트에서 등장한다.

실무 예제

on message BDC_FD_02_200ms
{
    if (this.IGN1 == 1)
    {
        write("IGN ON 상태");
    }
    else
    {
        write("IGN OFF 상태");
    }
}

 

메시지 내부의 IGN1 Signal 값을 읽어 현재 상태를 판단한다.


this 는 현재 수신된 메시지 객체를 의미한다.

쉽게 말해 지금 들어온 메시지 데이터 전체라고 보면 된다.

this.IGN1

 

현재 메시지의 IGN1 값을 읽는다.

this.VehicleSpeed

 

현재 메시지의 VehicleSpeed 값을 읽는다.

CAPL에서 메시지 데이터를 다룰 때 매우 자주 사용하는 문법이다.

 

on timer

 

on timer는 설정한 시간이 지나면 실행되는 이벤트다. 주기 동작을 구현할 때 필수적으로 사용한다.

차량 시스템은 10ms, 20ms, 100ms, 200ms 주기로 메시지를 송신하는 경우가 많다.

이런 주기 동작을 구현할 때 타이머 이벤트가 사용된다.

 

기본 구조

variables
{
    msTimer t1;
}

on start
{
    setTimer(t1, 1000);
}

on timer t1
{
    write("1초 후 실행");
}

 

시뮬레이션 시작 후 1초가 지나면 이벤트가 실행된다.

 

반복 실행 구조

variables
{
    msTimer t1;
}

on start
{
    setTimer(t1, 1000);
}

on timer t1
{
    write("주기 실행");
    setTimer(t1, 1000);
}

 

이벤트 안에서 다시 setTimer()를 호출하면 1초마다 반복 실행된다.

 

실무 예제: 100ms 메시지 송신

variables
{
    msTimer TxTimer;
}

on start
{
    setTimer(TxTimer, 100);
}

on timer TxTimer
{
    output(WHL_01_10ms);
    setTimer(TxTimer, 100);
}

 

100ms마다 메시지를 송신하는 구조다. 실제 테스트 자동화에서 매우 자주 등장한다.

 

on key

 

on key는 사용자가 키보드를 눌렀을 때 실행되는 이벤트다.

자동화 코드라기보다 수동 제어나 디버깅 용도로 많이 사용된다.

on key 'w'
{
    write("Wakeup Test Start");
}

 

키보드에서 w를 누르면 코드가 실행된다.

 

예제

on key 's'
{
    output(WHL_01_10ms);
    write("메시지 수동 송신");
}

 

테스트 중 특정 메시지를 수동으로 보내고 싶을 때 유용하다.

 

on signal

 

on signal은 특정 Signal 값이 변경될 때 실행되는 이벤트다.

메시지 전체가 아니라 개별 Signal 변화에 집중하고 싶을 때 사용한다.

on signal VehicleSpeed
{
    write("속도 변경 = %d", this);
}

 

VehicleSpeed 값이 바뀔 때마다 실행된다.

 

예제: IGN ON 되면 주기 메시지 송신
variables
{
    msTimer TxTimer;
}

on message BDC_FD_02_200ms
{
    if (this.IGN1 == 1)
    {
      setTimer(TxTimer, 100);
    }
}

on timer TxTimer
{
    output(WHL_01_10ms);
    setTimer(TxTimer, 100);
}

 

동작 흐름 분석
1. BDC 메시지를 수신한다.
2. IGN1 값이 1인지 확인한다.
3. 조건이 만족되면 100ms 타이머를 시작한다.
4. 타이머 이벤트마다 메시지를 송신한다.
5. 다시 타이머를 걸어 반복 동작한다.

이런 구조는 실제 차량 제어 테스트에서 매우 자주 사용된다.

 

정리

 

CAPL은 단순한 스크립트 언어가 아니다.

차량 네트워크 환경에서 발생하는 다양한 이벤트를 감지하고 자동으로 반응하도록 설계된 전문 언어다.

이번 글에서 소개한 이벤트 함수 중 아래 세 가지는 반드시 익혀야 한다.

    on start : 시작 시 초기화
    on message : 메시지 수신 처리
    on timer : 주기 동작 구현

여기에 on key, on signal 까지 이해하면 실무에서 필요한 대부분의 기본 구조를 만들 수 있다.

반응형

'CAPL' 카테고리의 다른 글

CAPL 기본 문법 정리  (0) 2026.04.09
CAPL 언어란?  (0) 2026.04.09