## Signal_Update , Signal_Change 이벤트




CANoe 환경 설정 및 BMS 메시지 처리 예제
- DBC 설정 가정:
- CANoe에 DBC가 임포트된 상태로 BMS 메시지를 다루는 예제.
- 예를 들어 메시지 ID는 0x123일 때, 해당 메시지가 BMSVoltSignal이라는 신호를 포함.
- CAPL 코드 작성:
- 메시지를 송신하거나 수신할 때 OnSignalUpdateBMSVolt라는 이벤트를 사용해 코드 실행.
- CANoe가 버스에서 메시지를 송수신하면 이벤트가 트리거되어 코드가 작동.
- 메시지 송수신과 이벤트 트리거:
- 모든 수신된 메시지는 Trace Window에 출력됨.
- 예를 들어 BMS 메시지가 수신될 때마다 이벤트가 실행되어 처리.
- BMS 메시지 반복 처리 로직:
- BMS 메시지를 여러 번 수신하면 매번 이벤트가 실행됨.
- 만약 엔진 메시지 등 신호가 없다면, 해당 코드는 실행되지 않음.
- 송신 이벤트 처리:
- 송수신된 메시지에 포함된 신호에 대해 OnSignalUpdate로 코드를 활용.
- 송신 이벤트 발생 시 적절한 코드가 실행되도록 설계.
- DBC 내 다양한 신호와 이벤트 활용:
- BMSCharge(충전)와 BMSMaxCurrent(최대 전류) 같은 신호 포함.
- 각 신호에 대해 이벤트 코드 작성 가능.
- 코드 실행 순서와 주의점:
- 모든 송수신 시 모든 코드가 동시에 실행될 수 있음.
- 메시지 수신 시 코드 중 어떤 이벤트가 실행되는지 명확하게 파악해야 함.




OnSignal vs. OnSignalChange 이벤트 설명
- 이벤트 정의와 차이점:
- OnSignal과 OnSignalChange는 이름은 다르지만 비슷한 이벤트임.
- 두 이벤트를 모두 사용 가능하나, 더 명확한 의미 전달을 위해 OnSignalChange 사용을 권장.
- OnSignalUpdate와 유사하지만, OnSignalChange는 값이 변경될 때만 호출되는 것이 차이점.
- OnSignalChange 이벤트의 동작 원리:
- OnSignalChange는 메시지가 수신될 때마다 무조건 실행되는 것이 아니라, 수신된 신호 값이 이전 값과 달라진 경우에만 실행됨.
- 예시: 값이 3에서 5로 바뀌면 이벤트가 실행되며, 동일한 값이 수신될 경우에는 실행되지 않음.
- 예제 코드 설명:
- 코드 작성: ON SIGNAL CHANGE BMS VOLT와 같은 방식으로 코드 작성.
- 메시지 값 변경 예시:
- 초기 값이 3 → 5로 변경될 경우, 이벤트가 실행됨.
- 이후 5가 연속으로 수신되면 실행되지 않음.
- 5에서 7로 변경될 경우 다시 실행됨.
- 초기 메시지 처리와 InitValue 사용:
- 초기 수신 메시지는 비교할 이전 값이 없으므로, DBC에서 정의된 InitValue와 비교해 처리함.
- 예: BMS 메시지의 InitValue가 0일 때, 처음 수신된 메시지 값이 3이라면 OnSignalChange가 실행됨.
- 실제 코드에서 활용되는 방식:
- 메시지가 수신될 때마다 신호 값이 변경된 경우에만 OnSignalChange 이벤트가 호출됨.
- OnSignalUpdate와 OnSignalChange의 사용 예시를 비교하며 설명.

한 번에 코드를 작성할 수도 있습니다.
- 무슨 말이냐면, BMS 메시지에 포함된 3개의 신호에 대해서 신호마다 각각 이렇게
- 코드를 작성할 수도 있지만, 오른쪽처럼 한 번에 코드를 작성할 수도 있습니다.
- 그래서 만약에 오른쪽처럼 코드를 작성해 놓으면 이 세 개의 신호 중에 하나라도 값이
Signal 이름이 중복되는 경우
메세지::시그널

CAPL 코드에서 신호 이름 중복 처리와 규칙 설명
- 신호 이름 중복 문제:
- 예: BMS-Bolt라는 신호가 BMS 메시지와 엔진 메시지에 동시에 포함될 수 있음.
- CAPL 코드에서 동일한 신호 이름 사용 시 구분 불가로 오류 발생 가능성.
- 해결 방법:
- CAPL 코드 작성 시 명확한 구분을 위해 메시지 이름을 앞에 추가하는 방식 사용 가능.
- 예: NetworkNodeName을 앞에 붙여서 메시지를 구분.
- CAPL 브라우저 활용:
- CAPL 브라우저를 통해 신호 이름이 중복될 경우 구분이 자동으로 처리될 수 있음.
- DBC 파일에 포함된 메시지와 신호를 통해 코드 작성 시 오류 예방 가능.
- CAPL 코드 예시:
- 코드: OnSignalDateBMSBolt와 같은 형식으로 작성해 구분.
- 만약 DBC 파일 내 동일 신호 이름이 중복되면, 메시지 이름을 앞에 붙여 자동 처리 가능.
- 중복 신호 처리 시 고려사항:
- 네트워크 노드가 메시지를 구분할 때 메시지 이름을 명확하게 앞에 붙여야 오류 방지.
- CANoe 환경에서 CAN 채널 사용 시 신호 중복 문제를 피하기 위해 명명 규칙을 준수.
CAN 채널 구분



CANoe에서 여러 CAN 채널 사용 시 신호 구분 방법
- CAN 채널 설정과 네트워크 노드 구성:
- 여러 개의 CAN 채널을 사용할 경우, 각각의 채널에 네트워크 노드를 따로 만들어야 함.
- 예: 채널 1의 노드는 채널 2에 있는 DBC 파일에 접근 불가하고, 반대도 동일하게 제한됨.
- Program 노드 활용:
- Measurement Setup의 Program 노드를 사용하면 채널 간의 DBC 모듈에 접근 가능.
- 이로 인해 서로 다른 채널에 있는 동일한 신호 이름을 구분하여 사용할 수 있음.
- DBC 파일과 신호 이름 구분:
- 같은 이름의 신호가 다른 채널에 있을 때, 혼동을 피하기 위해 네트워크 이름을 신호 앞에 붙임.
- 예: CAN1, CAN2와 같은 네트워크 이름을 사용해 구분.
- CAPL 브라우저와 작성 실습:
- CAPL 브라우저에서 TEST1, TEST2와 같은 DBC 파일을 열어 실습.
- 신호 이름 예시: ON, SIGNAL, UPDATE, GAMES, VOLT 등.
- 자동 구분 방식:
- CANoe에서 자동으로 채널을 구분해 주기 위해서는 신호 앞에 컨트롤러나 네트워크 이름을 명시.
- 이처럼 네트워크 구분자를 사용하는 것이 혼동 방지에 효과적임.
- 채널 간 신호 이름 충돌 해결:
- 동일한 이름의 신호를 사용할 때, 각 채널의 네트워크 이름을 명시하여 정확히 구분해야 함.
- CAPL 코드 작성 시 구체적인 구분 방법을 준수하는 것이 중요함.
* Signal 값 읽기 & Selector 읽기

CAPL 코드에서 신호 값 읽기와 변환 방식
- Physical Value와 Raw Value의 개념:
- Physical Value: 사용자가 이해할 수 있는 실제 값.
- Raw Value: CAN 메시지에 포함된 데이터로, 전송되는 원시 값.
- Physical Value와 Raw Value 간의 변환:
- 변환은 공식에 따라 수행됨:
(Raw Value * Factor) + Offset = Physical Value - 예를 들어, BMS 전압 신호가 8비트 신호로 표현되는 경우, 이 신호는 전압을 몇 볼트로 나타내기 위해 변환이 필요.
- 변환은 공식에 따라 수행됨:
- 예시:
- BMS 전압값을 표현하려면 Raw Value가 53인 경우를 사용.
- 공식: (53×0.1)+0=5.3(53 \times 0.1) + 0 = 5.3
- 이 값은 CAN 메시지에서 53이라는 Raw Value로 전달됨.
- 수신 측에서는 이 값을 변환하여 5.3V로 해석.
- BMS 전압값을 표현하려면 Raw Value가 53인 경우를 사용.
- CAN 메시지의 값 처리:
- 송신 시 CAN 메시지에 53이라는 값이 담겨 전송됨.
- 수신 측에서는 이를 받아 0.1로 곱하고 0을 더해 5.3V로 해석.
- Physical Value와 Raw Value의 중요성:
- Raw Value는 원시 값이지만, 사용자 입장에서 의미 있는 값으로 변환되는 것이 중요.
- 이는 CAPL 코드와 CAN 메시지 간의 데이터를 이해하고 처리하는 핵심임.




CAPL 코드에서 신호 값 읽기 방법
- 첫 번째 방법: $ 표시 사용
- 변수 선언 시 신호 이름 앞에 $ 표시를 붙이면 해당 신호의 Physical Value를 읽을 수 있습니다.
- 예시 코드:
capl코드 복사variables { float voltage; } on message BMS_Message { voltage = $BMS-Volt; // BMS-Volt 신호의 Physical Value 읽기 write("BMS 전압 값: %f", voltage); }
- 주의: $ 표시를 생략하면 CAPL 브라우저에서 에러가 발생하므로 필수입니다.
- 두 번째 방법: getSignal() 함수 사용
- getSignal() 함수를 통해 특정 신호의 Physical Value를 읽습니다.
- 예시 코드:
capl코드 복사variables { float voltage; } on message BMS_Message { voltage = getSignal("BMS-Volt"); // BMS-Volt 신호의 Physical Value 읽기 write("BMS 전압 값: %f", voltage); }
- 장점: $ 표기 없이 함수를 통해 값 접근이 가능해 더 직관적입니다.
- 세 번째 방법: this 키워드 사용 (이벤트 내 신호 참조)
- this 키워드는 이벤트 내에서 해당 신호의 값을 참조할 때 사용합니다.
- 예시 코드:
capl코드 복사on signal-update BMS-Volt { float voltage = this; // 이벤트 내에서 BMS-Volt의 Physical Value 참조 write("업데이트된 BMS 전압 값: %f", voltage); }
- 설명: 이 코드는 BMS-Volt 신호가 업데이트될 때마다 해당 값을 자동으로 가져옴.
- Raw Value 접근 (Raw64 사용)
- Raw64를 사용해 원시 데이터 값에 접근합니다. 신호의 길이가 52비트 이상일 경우 Raw64로 처리해야 합니다.
- 예시 코드:
capl코드 복사variables { int rawValue; } on message BMS_Message { rawValue = $BMS-Volt.Raw_64; // BMS-Volt 신호의 Raw Value 읽기 write("BMS 전압 Raw Value: %d", rawValue); }
- 설명: Raw64는 큰 신호 데이터에 사용되며, Physical Value와 다르게 원시 값 자체를 제공합니다.
요약:
- $ 표기: 신호의 Physical Value를 읽을 때 사용.
- getSignal() 함수: 함수를 통한 접근으로 직관적 코드 작성 가능.
- this 키워드: 이벤트 내에서 자동으로 해당 신호 값 참조.
- Raw64: 원시 값을 직접 접근하고자 할 때 사용.

그리고 제가 앞에 강의에서 이렇게 여러 개의 신호에 대해서 한 번에 이런 이벤트 코드를
작성할 수 있다고 했는데 이때는 바로 방금 제가 설명한 이 this라는 키워드를 사용할
수가 없습니다.
그거를 이제 참고로 알아두면 될 것 같고 만약에 여기서 제가 this라는 키워드를 사용하면
어차피 컴파일이 안 되고 에러가 날 겁니다.
Signal Selector

셀렉터(Selector)와 Value Table에 대한 설명
- DBC에 정의된 신호의 속성 접근
- DBC 파일 내 신호에는 다양한 파라미터가 정의되어 있으며, CAPL 코드에서 이를 읽고 접근할 수 있습니다.
- 비트 카운트와 신호 길이
- 신호의 길이(비트 수)를 CAPL 코드에서 읽기 위해선 다음과 같이 작성합니다:
capl코드 복사bms_volt 점 비트 카운트 8
- 여기서 8은 해당 신호가 8비트임을 의미합니다.
- 신호의 길이(비트 수)를 CAPL 코드에서 읽기 위해선 다음과 같이 작성합니다:
- 오프셋, 팩터 등 속성 접근 방법
- DBC에서 정의된 오프셋, 팩터, 최소값 등 속성도 쉽게 접근할 수 있습니다.
- 속성 접근 예시:
capl코드 복사PMSVOLT.GEN-SIG-START-VALUE
- 이 코드는 Start Value를 의미하며, 해당 값이 1이거나 12로 리턴될 수 있습니다.
- 로우 값(Raw Value)와 Physical Value의 변환
- 로우 값과 피지컬 값 간의 변환이 필요할 경우, 신호의 팩터와 오프셋을 사용해 구합니다.
- 예시:
- 로우 값이 100일 때:
text코드 복사Physical Value = (100 * Factor) + Offset
- 로우 값이 100일 때:
- 셀렉터(Selector) 개념
- 셀렉터는 신호나 메시지의 특정 속성을 선택하고 접근할 때 사용되는 개념입니다.
- 예시: 신호에 점(.) 표기와 속성명을 붙여 특정 값을 가져올 수 있습니다.
Value Table 활용


CAPL 코드와 DBC의 Value Table 사용 방법
- Value Table 개념과 역할:
- Value Table은 C 언어의 Enum Type과 유사하게, 특정 값에 대해 이름을 부여하여 의미를 부여합니다.
- DBC 파일 내에서 신호와 매핑되어 가독성을 높이고 코드의 유지 보수를 용이하게 합니다.
- Value Table 생성과 활용:
- DBC 편집기에서 View Value Table 옵션을 통해 Value Table을 생성할 수 있습니다.
- 예시:
- VTAdasMode라는 Value Table을 생성하여, 값 123에 대해 "HighwayManualHalfWater"라는 이름을 부여.
- 이 Value Table을 AdasMode 신호에 할당하면, 코드에서 123 대신 의미 있는 이름으로 접근할 수 있습니다.
- Value Table 사용의 장점:
- 단순히 숫자 값을 사용하는 대신 의미 있는 이름을 사용할 수 있어 가독성 향상.
- 예:
capl코드 복사if (AdasMode == Highway) { // Highway 모드에 대한 처리 }
- 이처럼 숫자 값 대신 이름으로 처리하여 코드가 더 명확해집니다.
- CAPL 코드에서 Value Table 접근 방법:
- Value Table 값 사용 예시:
capl코드 복사variables { int mode; } on message AdasMessage { mode = AdasMode.Value; // Value Table 값 읽기 write("현재 모드: %d", mode); }
- 점(.) 표기와 속성명으로 Value Table 값을 손쉽게 접근할 수 있습니다.
- Value Table 값 사용 예시:
- Value Table 사용 방법 정리:
- 첫 번째 방법: 사용자 정의 Value Table의 이름을 코드에 직접 작성.
- 두 번째 방법: 자동 생성된 이름을 사용해 접근.
- 예: "HighwayManualHotPorto"와 같은 구성을 활용.
- 세 번째 방법: 신호와 매핑된 Value Table을 통해 의미 있는 이름으로 접근.
- 결론 및 사용자 이점:
- 사용자 입장에서 가독성을 높이기 위해 Value Table을 사용하는 것이 좋습니다.
- 코드 유지보수 시, 숫자 대신 의미 있는 이름을 사용하면 편리합니다.
시그널을 함수의 파라미터로 넘기기, function

이 요약은 CAPL 코드에서 함수의 파라미터로 신호를 전달할 때의 방법을 설명하고 있습니다.
- 신호 이름을 명시한 후, **별표(*)**를 사용하여 전달해야 합니다.
- 함수 호출 시 함수 이름과 신호 이름을 정확히 적어 호출합니다.
1. 함수 정의
capl
void test_function(signal *sig1, signal *sig2) {
float sum1;
float sum2;
// 첫 번째 방식: getSignal() 함수로 신호 값 읽기
sum1 = getSignal(sig1) + getSignal(sig2);
// 두 번째 방식: $ 표기를 사용해 신호 값 직접 접근
sum2 = $sig1 + $sig2;
// 결과 출력
write("두 신호의 합은 %f", sum1);
write("두 신호의 합은 %f", sum2);
}
- signal * 타입을 사용해 신호를 함수의 매개변수로 전달합니다.
- 두 가지 방식으로 신호 값 접근:
- getSignal() 함수 사용: 매개변수로 받은 신호 값을 읽음.
- $ 표기 사용: 직접 신호 값을 읽어 더함.
2. 함수 호출
capl
test_function(BmsVolt, BMS_Charge);
- BmsVolt와 BMS_Charge 신호를 test_function() 함수의 매개변수로 전달합니다.
- 각 신호의 값을 읽고 더한 결과를 출력합니다.
CAPL 코드 강의 요약: 신호 값 사용과 접근 방법
- CAPL에서 신호의 값이 중요한 이유:
- this 키워드와 셀렉터를 활용하여 min, max, factor와 같은 속성에 접근하는 방법을 설명.
- Value Table과 같은 기능을 통해 신호의 값을 의미 있게 해석하는 방법을 다룸.
- 타입과 신호 이름 사용:
- 타입별로 사용할 수 있는 신호의 속성을 명확히 설명.
- 함수의 파라미터로 신호를 전달할 때 주의해야 할 점도 언급.
- 신호 값을 송신할 때의 중요성:
- CAPL에서 신호 값을 설정한 후 메시지로 송신하는 과정이 왜 중요한지 설명.
- 이 작업은 단순히 값을 읽는 것뿐 아니라, 실제 송신되는 메시지와의 연계가 필수적임.
- 다음 강의의 내용 예고:
- 이후 강의에서는 메시지 송신과 신호 값 설정에 대해 더욱 구체적으로 설명할 예정.
'회사 > CAPL' 카테고리의 다른 글
CAPL getProfileArray 사용법 (0) | 2024.10.19 |
---|---|
섹션 6_CANoe - CAPL과 Panel 기본 (섹션 5) (0) | 2024.10.19 |
섹션 5_CANoe - CAPL과 Panel 기본 (섹션 5) (0) | 2024.10.19 |
섹션 4_CANoe - CAPL과 Panel 기본 (섹션 4) (1) | 2024.10.19 |
CANoe - CAPL과 Panel 기본 (섹션 3_3 ~ 3_6) (1) | 2024.10.19 |