잡식왕

반응형
CAPL 스크립팅 마스터 가이드: C 언어 핵심 & EV-EVSE 활용

CAPL 스크립팅 마스터 가이드: C 언어 핵심 10%와 EV-EVSE 실무 활용

1. CAPL과 C 언어: 완벽한 이중주

CAPL (Communication Access Programming Language)은 벡터(Vector)사의 CANoe 및 CANape 환경에서 사용되는 이벤트 지향적인 프로그래밍 언어입니다.

CAPL의 문법 구조는 C 언어의 문법을 기반으로 하지만, 하드웨어 접근성이나 복잡한 메모리 관리(포인터, 동적 할당 등)와 관련된 기능이 대부분 제거되어 훨씬 단순하고 안전합니다. 따라서 C 언어의 모든 것을 알 필요는 없습니다. 오직 통신 로직을 처리하는 데 필요한 최소한의 문법만 이해하면 충분합니다.

2. CAPL에 필수적인 C 언어의 핵심 4가지

CAPL을 능숙하게 다루기 위해 C 언어에서 반드시 학습해야 할 핵심 지식 4가지를 집중적으로 파헤쳐 보겠습니다.

2.1. 핵심 1: 데이터 타입과 변수

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;

2.2. 핵심 2: 제어 흐름 구문

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회 전송
}

2.3. 핵심 3: 배열 (메시지 데이터 접근)

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);
}

2.4. 핵심 4: 비트 연산 (데이터 디코딩)

CAPL 스크립팅의 **80%는 비트 연산을 통해 이루어진다**고 해도 과언이 아닙니다. CAN 메시지의 데이터는 여러 개의 신호(Signal)가 비트 단위로 압축되어 들어있기 때문에, 원하는 신호만 추출하거나 삽입하려면 반드시 비트 연산을 사용해야 합니다.

비트 연산 종류 및 활용

기호 연산 CAPL에서의 역할
& AND (논리곱) 특정 비트만 추출할 때 (마스크)
| OR (논리합) 데이터에 새로운 비트를 삽입할 때
<<, >> 비트 이동 (Shift) 데이터를 원하는 위치로 정렬할 때

2.5. 심화 이해: CAPL 함수와 이벤트

CAPL은 C 언어처럼 main 함수에서 순차적으로 실행되는 방식이 아니라, 이벤트(Event)가 발생할 때만 실행됩니다. C 언어에서 함수를 정의하고 호출하는 방식은 CAPL의 이벤트 정의에 그대로 적용됩니다.

// 반환값이 없는 (void) 함수 정의
void LogErrorMessage(int ErrorCode)
{
    write("오류 코드: %d 발생", ErrorCode);
}

// 함수 호출 (다른 이벤트나 함수 내에서 사용)
on key 'a'
{
    // 'a' 키가 눌릴 때 LogErrorMessage 함수 호출
    LogErrorMessage(101); 
}

3. CANoe/CAPL 환경 필수 용어 정의 (12가지)

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바이트).

4. CAPL 스크립팅에 사용되는 핵심 언어 및 파일

4.1. C 언어 문법 요소 (CAPL의 기본 구조)

CAPL 작성을 위해 C 언어에서 핵심적으로 다뤄지는 요소들입니다. (변수 선언, 배열, 제어문, 함수)

4.2. 데이터 정의 언어 (CAPL의 생명줄)

CAPL이 실제 차량 네트워크와 통신할 수 있게 해주는 데이터 정의 파일입니다.

DBC 파일 (CAN Data Base)

CAPL의 모든 시그널 이름을 정의하며, CAPL 코드에서 신호 이름으로 바로 접근 가능하게 합니다.

LDF 파일 (LIN Description File)

LIN 버스 환경에서 사용되며, CAPL이 이를 참고하여 스케줄 테이블을 확인합니다.

5. EV-EVSE 통신 제어를 위한 CAPL 활용 예시 (4가지)

CAPL은 EVSE 시뮬레이션 환경에서 복잡한 충전 프로토콜(ISO 15118 등)의 제어 파일럿(Control Pilot, CP) 신호를 직접 조작하여 테스트하는 데 필수적입니다.

5.1. 예시 1: 충전 시작 전 배터리 상태 확인

**목표:** 배터리 온도(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("배터리 온도 정상, 충전 시퀀스 진행.");
    }
}

5.2. 예시 2: ISO 15118 CP 신호 기반 PWM 제어

**목표:** 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);
}

5.3. 예시 3: 오류 발생 시 충전 세션 즉시 중단

**목표:** 절연 오류 감지 시, **즉시 충전 중단(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);
}

5.4. 예시 4: SOC 기반 스마트 충전 스케줄링

**목표:** 배터리 잔량(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);
    }
}

6. FAQ: CAPL 스크립팅, 이것만은 꼭!

Q1. CAPL에서 C 언어의 포인터는 사용되나요?

A. 대부분 사용되지 않습니다. CAPL은 메모리 주소 관리의 복잡성을 제거했습니다. 필요한 경우 C의 "참조(Reference)" 개념이 간접적으로 사용됩니다.

Q2. C 언어처럼 복잡한 헤더 파일도 필요한가요?

A. 아닙니다. CAPL은 CANoe 환경에 통합되어 있어, 별도의 표준 C 라이브러리를 포함할 필요가 없습니다. DBC 파일에 정의된 메시지나 시그널은 자동으로 사용 가능합니다.

Q3. CAPL에서 데이터 타입 선언 시 주의할 점은 무엇인가요?

A. Scope(영역)에 주의해야 합니다. 변수는 variables 블록(전역 변수) 또는 함수/이벤트 블록 내부(지역 변수)에 선언해야 합니다.


이 종합 가이드를 통해 CAPL 스크립팅의 기초부터 EV-EVSE 실무 응용까지 완벽하게 마스터하시길 응원합니다!

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band