
CAPL (Communication Access Programming Language)은 벡터(Vector)사의 CANoe 및 CANape 환경에서 사용되는 이벤트 지향적인 프로그래밍 언어입니다.
CAPL의 문법 구조는 C 언어의 문법을 기반으로 하지만, 하드웨어 접근성이나 복잡한 메모리 관리(포인터, 동적 할당 등)와 관련된 기능이 대부분 제거되어 훨씬 단순하고 안전합니다. 따라서 C 언어의 모든 것을 알 필요는 없습니다. 오직 통신 로직을 처리하는 데 필요한 최소한의 문법만 이해하면 충분합니다.
CAPL을 능숙하게 다루기 위해 C 언어에서 반드시 학습해야 할 핵심 지식 4가지를 집중적으로 파헤쳐 보겠습니다.
CAPL에서 사용하는 변수는 C 언어와 매우 유사합니다. 데이터의 성격에 맞는 타입을 선언하고, 데이터를 담는 저장 공간(변수)을 만드는 것이 기본입니다.
| CAPL/C 타입 | 설명 | 예시 |
|---|---|---|
int, long |
정수 (가장 흔하게 사용) | int Speed = 100; |
float, double |
실수 (소수점 포함 데이터) | double Voltage = 12.5; |
char |
문자 (단일 문자 저장) | char Status = 'A'; |
message |
CAPL 고유 타입: CAN 메시지 전체를 담는 구조체 | message 0x100 Msg; |
CAPL은 들어오는 CAN 메시지에 따라 특정 조건에서만 코드를 실행해야 합니다. 이때 C 언어의 제어 흐름 구문이 그대로 사용됩니다.
// 'If' 구문 예시: 속도가 100을 초과하면 경고 출력
if (CAN_Speed > 100)
{
write("경고: 속도 초과!");
}
else if (CAN_Speed < 50)
{
write("경고: 속도 미달!");
}
else
{
write("속도 정상.");
}
// 'For' 반복문 예시: 5번 반복 실행
for (i = 0; i < 5; i++)
{
output(Test_Msg); // Test_Msg 5회 전송
}
CAPL에서 배열은 CAN 메시지의 Data Field(데이터 필드)에 접근할 때 가장 중요합니다. CAN 메시지는 최대 8바이트의 데이터를 가지며, 이 8바이트를 순서대로 다루는 것이 바로 배열의 역할입니다.
// 8개의 정수(바이트)를 담는 배열 선언
byte Data_Array[8];
// Data_Array의 첫 번째 요소 (인덱스 0)에 0x1A 값 대입
Data_Array[0] = 0x1A;
// 특정 메시지의 세 번째 바이트(인덱스 2)에 접근
on message MotorStatus
{
int motor_temp;
// 메시지 데이터 3번째 바이트(인덱스 2) 값을 변수에 저장
motor_temp = this.byte(2);
write("모터 온도: %d", motor_temp);
}

CAPL 스크립팅의 **80%는 비트 연산을 통해 이루어진다**고 해도 과언이 아닙니다. CAN 메시지의 데이터는 여러 개의 신호(Signal)가 비트 단위로 압축되어 들어있기 때문에, 원하는 신호만 추출하거나 삽입하려면 반드시 비트 연산을 사용해야 합니다.
| 기호 | 연산 | CAPL에서의 역할 |
|---|---|---|
& |
AND (논리곱) | 특정 비트만 추출할 때 (마스크) |
| |
OR (논리합) | 데이터에 새로운 비트를 삽입할 때 |
<<, >> |
비트 이동 (Shift) | 데이터를 원하는 위치로 정렬할 때 |
CAPL은 C 언어처럼 main 함수에서 순차적으로 실행되는 방식이 아니라, 이벤트(Event)가 발생할 때만 실행됩니다. C 언어에서 함수를 정의하고 호출하는 방식은 CAPL의 이벤트 정의에 그대로 적용됩니다.
// 반환값이 없는 (void) 함수 정의
void LogErrorMessage(int ErrorCode)
{
write("오류 코드: %d 발생", ErrorCode);
}
// 함수 호출 (다른 이벤트나 함수 내에서 사용)
on key 'a'
{
// 'a' 키가 눌릴 때 LogErrorMessage 함수 호출
LogErrorMessage(101);
}
CAPL 환경에서 사용하는 차량 네트워크 및 충전 통신 분야의 특정 용어 12가지를 영문 표기와 함께 정리했습니다.
| 번호 | 용어 (영문) | 핵심 정의 및 내용 |
|---|---|---|
| 1. | CAN (Controller Area Network) | 차량 내 ECU 간의 통신 표준 프로토콜. |
| 2. | CAPL (Communication Access Programming Language) | CANoe에서 사용되는 C 기반 이벤트 스크립트 언어. |
| 3. | ECU (Electronic Control Unit) | 차량 내부의 전자 제어 장치. |
| 4. | DBC (Data Base CAN) | CAN 메시지의 ID, 신호 이름 등을 정의한 핵심 데이터베이스 파일. |
| 5. | EVSE (Electric Vehicle Supply Equipment) | 전기차 충전소 또는 충전기. |
| 6. | CPMS (Charging Point Management System) | 충전기를 원격 관리하고 제어하는 중앙 서버 시스템. |
| 7. | ISO 15118 | EV와 EVSE 간의 **디지털 통신** 표준 (Plug & Charge 포함). |
| 8. | DIN 70121 | EV와 EVSE 간의 DC 충전 통신 초기 표준. |
| 9. | PnC (Plug & Charge) | 충전 케이블 연결 즉시 자동 인증 및 결제 기능. |
| 10. | Signal (신호) | CAN 메시지 내의 특정 비트/바이트 그룹 (실제 데이터 값). |
| 11. | Frame/Message (프레임/메시지) | CAN 통신의 기본 전송 단위. |
| 12. | DLC (Data Length Code) | CAN 프레임의 데이터 필드 바이트 수 (최대 8바이트). |
CAPL 작성을 위해 C 언어에서 핵심적으로 다뤄지는 요소들입니다. (변수 선언, 배열, 제어문, 함수)
CAPL이 실제 차량 네트워크와 통신할 수 있게 해주는 데이터 정의 파일입니다.
DBC 파일 (CAN Data Base)
CAPL의 모든 시그널 이름을 정의하며, CAPL 코드에서 신호 이름으로 바로 접근 가능하게 합니다.
LDF 파일 (LIN Description File)
LIN 버스 환경에서 사용되며, CAPL이 이를 참고하여 스케줄 테이블을 확인합니다.
CAPL은 EVSE 시뮬레이션 환경에서 복잡한 충전 프로토콜(ISO 15118 등)의 제어 파일럿(Control Pilot, CP) 신호를 직접 조작하여 테스트하는 데 필수적입니다.
**목표:** 배터리 온도(Batt_Temp) 확인 후, 온도가 높으면 충전을 거부(Reject)하는 로직을 시뮬레이션합니다.
variables
{
// 최대 허용 온도 (섭씨 50도)
const int MAX_TEMP = 50;
}
// 'ChargeRequest' 메시지가 수신될 때마다 실행
on message ChargeRequest
{
if (this.Batt_Temp > MAX_TEMP)
{
// 온도가 높으면 충전 거부 메시지 송신
message ChargeResponse RejectMsg;
RejectMsg.Response_Code = 0x01; // 거부 코드
output(RejectMsg);
write("배터리 과열 (온도: %d), 충전 요청 거부됨.", this.Batt_Temp);
}
else
{
write("배터리 온도 정상, 충전 시퀀스 진행.");
}
}
**목표:** EVSE가 차량에 제공하는 최대 전류 용량을 **Control Pilot (CP)** 신호의 PWM 듀티 사이클을 통해 변경하는 시뮬레이션입니다.
// 듀티 사이클을 기반으로 최대 허용 전류를 계산하는 함수
float CalcMaxCurrent(float duty_cycle)
{
// ISO 15118의 AC 충전 표준 공식: 전류 = 듀티 사이클 * 0.6
return duty_cycle * 0.6;
}
// CANoe 시스템 변수에서 CP 신호 듀티 사이클 변경 이벤트 감지
on sysvar SysVar::CP_DutyCycle
{
float current_duty = @SysVar::CP_DutyCycle;
float max_current;
max_current = CalcMaxCurrent(current_duty);
// 최대 전류 용량을 시뮬레이션하는 시스템 변수 업데이트
@SysVar::Max_Allowed_Current = max_current;
write("CP DutyCycle: %.1f%%, 허용 최대 전류: %.1f A", current_duty, max_current);
}
**목표:** 절연 오류 감지 시, **즉시 충전 중단(Stop Session)** 명령을 실행하고 로그를 남깁니다.
// 'Error_Status' 메시지가 수신될 때 실행
on message Error_Status
{
// 메시지 내의 'Insulation_Fault' 신호가 1(오류)인지 확인
if (this.Insulation_Fault == 1)
{
// CAPL 내장 함수: 충전 통신을 중단하고 오류 메시지 전송
StopChargeSession(0x02); // 0x02: 절연 오류 코드
write("FATAL ERROR: 절연 오류 감지. 충전 세션이 즉시 중단되었습니다.");
}
}
// 충전 세션을 중단하는 사용자 정의 함수 (가정)
void StopChargeSession(int reason)
{
// (실제 Stop 시퀀스를 구현하는 코드)
output(message ChargeStop { Code = reason });
cancelTimer(ChargeTimer);
}
**목표:** 배터리 잔량(SOC)이 80%를 초과하면 충전 속도를 **자동으로 낮추는** 스마트 충전 로직을 구현합니다.
variables
{
int Target_SOC = 80;
int Current_Power = 100; // 초기 전력 (100kW 가정)
}
// 'Battery_Status' 메시지가 수신될 때마다 실행
on message Battery_Status
{
int current_soc = this.SOC_Percent;
if (current_soc >= Target_SOC && Current_Power == 100)
{
// SOC 80% 초과 시 전력(Power)을 50kW로 감속 시뮬레이션
Current_Power = 50;
// EVSE가 충전 전력을 조절하는 메시지를 송신
output(message PowerLimit { Power = Current_Power });
write("SOC %d 도달. 스마트 충전을 위해 전력을 %d kW로 감속합니다.", current_soc, Current_Power);
}
}
Q1. CAPL에서 C 언어의 포인터는 사용되나요?
A. 대부분 사용되지 않습니다. CAPL은 메모리 주소 관리의 복잡성을 제거했습니다. 필요한 경우 C의 "참조(Reference)" 개념이 간접적으로 사용됩니다.
Q2. C 언어처럼 복잡한 헤더 파일도 필요한가요?
A. 아닙니다. CAPL은 CANoe 환경에 통합되어 있어, 별도의 표준 C 라이브러리를 포함할 필요가 없습니다. DBC 파일에 정의된 메시지나 시그널은 자동으로 사용 가능합니다.
Q3. CAPL에서 데이터 타입 선언 시 주의할 점은 무엇인가요?
A. Scope(영역)에 주의해야 합니다. 변수는 variables 블록(전역 변수) 또는 함수/이벤트 블록 내부(지역 변수)에 선언해야 합니다.
CAPL 스크립팅을 더욱 깊이 있게 이해하고 싶다면, 아래의 EV 충전 통신 및 소프트웨어 테스트 관련 글을 함께 참고하세요.
이 종합 가이드를 통해 CAPL 스크립팅의 기초부터 EV-EVSE 실무 응용까지 완벽하게 마스터하시길 응원합니다!
| DIN SPEC 70121 규격 분석 Deep Dive (2) | 2025.11.26 |
|---|---|
| SLAC 심층 분석: ISO 15118과 V2G를 가능케 하는 전기차 충전의 '첫 대화' 기술 (1) | 2025.11.26 |
| 전기차 무선·유선 충전의 핵심 규격, DIN 70121 완벽 분석: 기초 통신 원리부터 심화 구현까지 (0) | 2025.11.18 |
| 하드웨어 신호부터 산업용 명령까지: 통신 스택 완전 정리 (1) | 2025.10.18 |
| RS232와 RS485 통신 비교 완벽 가이드: 전문가용 심층 분석 (5) | 2025.08.28 |