본문 바로가기
회사/CAPL

섹션 7_CANoe - CAPL과 Panel 기본

by 응가1414 2024. 10. 20.

## Signal_Update , Signal_Change 이벤트

CANoe 환경 설정 및 BMS 메시지 처리 예제

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

OnSignal vs. OnSignalChange 이벤트 설명

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

 

 

한 번에 코드를 작성할 수도 있습니다.
- 무슨 말이냐면, BMS 메시지에 포함된 3개의 신호에 대해서 신호마다 각각 이렇게
- 코드를 작성할 수도 있지만, 오른쪽처럼 한 번에 코드를 작성할 수도 있습니다.

- 그래서 만약에 오른쪽처럼 코드를 작성해 놓으면 이 세 개의 신호 중에 하나라도 값이


 

Signal 이름이 중복되는 경우

 

메세지::시그널

 

 

CAPL 코드에서 신호 이름 중복 처리와 규칙 설명

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

CAN 채널 구분

CANoe에서 여러 CAN 채널 사용 시 신호 구분 방법

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

 


* Signal 값 읽기 & Selector 읽기

CAPL 코드에서 신호 값 읽기와 변환 방식

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

 


CAPL 코드에서 신호 값 읽기 방법

  1. 첫 번째 방법: $ 표시 사용
    • 변수 선언 시 신호 이름 앞에 $ 표시를 붙이면 해당 신호의 Physical Value를 읽을 수 있습니다.
    • 예시 코드:
      capl
      코드 복사
      variables { float voltage; } on message BMS_Message { voltage = $BMS-Volt; // BMS-Volt 신호의 Physical Value 읽기 write("BMS 전압 값: %f", voltage); }
    • 주의: $ 표시를 생략하면 CAPL 브라우저에서 에러가 발생하므로 필수입니다.

  1. 두 번째 방법: getSignal() 함수 사용
    • getSignal() 함수를 통해 특정 신호의 Physical Value를 읽습니다.
    • 예시 코드:
      capl
      코드 복사
      variables { float voltage; } on message BMS_Message { voltage = getSignal("BMS-Volt"); // BMS-Volt 신호의 Physical Value 읽기 write("BMS 전압 값: %f", voltage); }
    • 장점: $ 표기 없이 함수를 통해 값 접근이 가능해 더 직관적입니다.

  1. 세 번째 방법: this 키워드 사용 (이벤트 내 신호 참조)
    • this 키워드이벤트 내에서 해당 신호의 값을 참조할 때 사용합니다.
    • 예시 코드:
      capl
      코드 복사
      on signal-update BMS-Volt { float voltage = this; // 이벤트 내에서 BMS-Volt의 Physical Value 참조 write("업데이트된 BMS 전압 값: %f", voltage); }
    • 설명: 이 코드는 BMS-Volt 신호가 업데이트될 때마다 해당 값을 자동으로 가져옴.

  1. 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

s

셀렉터(Selector)와 Value Table에 대한 설명

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

 


Value Table 활용

 

CAPL 코드와 DBC의 Value Table 사용 방법

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

2. 함수 호출

capl
 
test_function(BmsVolt, BMS_Charge);
  • BmsVolt와 BMS_Charge 신호를 test_function() 함수의 매개변수로 전달합니다.
  • 각 신호의 값을 읽고 더한 결과를 출력합니다.

 

 


CAPL 코드 강의 요약: 신호 값 사용과 접근 방법

  1. CAPL에서 신호의 값이 중요한 이유:
    • this 키워드셀렉터를 활용하여 min, max, factor와 같은 속성에 접근하는 방법을 설명.
    • Value Table과 같은 기능을 통해 신호의 값을 의미 있게 해석하는 방법을 다룸.
  2. 타입과 신호 이름 사용:
    • 타입별로 사용할 수 있는 신호의 속성을 명확히 설명.
    • 함수의 파라미터로 신호를 전달할 때 주의해야 할 점도 언급.
  3. 신호 값을 송신할 때의 중요성:
    • CAPL에서 신호 값을 설정한 후 메시지로 송신하는 과정이 왜 중요한지 설명.
    • 이 작업은 단순히 값을 읽는 것뿐 아니라, 실제 송신되는 메시지와의 연계가 필수적임.
  4. 다음 강의의 내용 예고:
    • 이후 강의에서는 메시지 송신과 신호 값 설정에 대해 더욱 구체적으로 설명할 예정.