본문 바로가기
회사/CAPL

섹션 6_CANoe - CAPL과 Panel 기본 (섹션 5)

by 응가1414 2024. 10. 19.

## Event 개념소개 및 Measure Start/Stop Event

General Event

이벤트 종류 코드 작성 패턴 이벤트 의미
시작/종료 관련 on preStart Measurement 시작 직전
시작/종료 관련 on start PreStart 종료 직후
시작/종료 관련 on preStop Measurement 종료 직전
시작/종료 관련 on stopMeasurement PreStop 종료 직후
키보드 on key 키보드 특정 키 눌렸을 때
CAN 통신 관련 on message CANoe에 메시지 계속됐을 때(Tx 또는 Rx 모두)
CAN 통신 관련 on busoff 버스 오프 발생됐을 때
CAN 통신 관련 on errorFrame Error 메시지 계속됐을 때
CAN 통신 관련 on signal, on signal_change 시그널 값 바뀌었을 때
CAN 통신 관련 on signal_update 시그널 값 새로 쓰였을 때(값 안 바뀌어도 실행)
System Variable 관련 on sysvar, on sysvar_change System Variable 변경됐을 때
System Variable 관련 on sysvar_update System Variable 값 새로 쓰였을 때(값 안 바뀌어도 실행)
타이머 on timer 타이머 만료됐을 때(일정 시간 흘렀을 때)

 

이벤트 사용 시기 및 활용 예시

  • ONVSTART, ON_START 같은 이벤트는 시작할 직후나 처음에 사용됩니다.
  • 시작 직후에는 메시지를 보내거나 변수를 초기화하는 데 적합합니다.

활용 예시:

  • 초기 값을 초기화하거나 타이머를 시작하는 작업은 시작 관련 이벤트에 배치합니다.
  • 이러한 메시지는 CANoe로 바로 송신되거나, 변수 초기화 후 다음 작업으로 넘어갈 수 있습니다.

PreStart와 Start 이벤트의 차이점:

  • PreStart는 말 그대로 시작 전에 실행되는 의미를 가지며, 시작 직전 준비 작업에 사용합니다.
  • 반면 Start 이벤트는 시작과 동시에 실행되는 작업에 적합합니다.

FreeStart와 FreeStop 이벤트의 활용:

  • FreeStart는 시작 이벤트와 유사하지만, 코드 작성 시 추가적으로 자유로운 동작을 할 수 있습니다.
  • FreeStop 이벤트는 프로그램이 끝나기 직전에 마지막 정리를 하는 데 적합합니다.
  • 메시지를 보내거나 로그 파일을 마무리하는 작업에 유용하게 사용됩니다.

*** 주의 할점

출력안됨

on PreStart

on PreStop

 

정확하게 출력

on PreStart

 

 

on PreStop

  • CAPL 코드 작성 및 실행 테스트:
    • 아직 배우지 않았지만 CAPL에서 메시지를 송신하는 함수를 작성해 보았습니다.
    • 아래와 같은 코드를 on preStart 이벤트에 작성했습니다:
    • capl
      코드 복사
      on preStart { message myMessage = {0x123}; output(myMessage); }
    • 이 코드는 ID가 0x123인 메시지를 송신하는 역할을 합니다.
  • 코드 실행 및 결과 확인:
    • 코드를 작성한 후 CAPL을 실행해 Start 전에 메시지가 송신되는지 확인했습니다.
    • 그러나 트레이스 윈도우에서 메시지가 송신되지 않은 것을 확인했습니다.
  • onStart 이벤트에서 코드 테스트:
    • 같은 코드를 onStart 이벤트에 넣고 실행해 보았습니다.
    • capl
      코드 복사
      on start { message myMessage = {0x123}; output(myMessage); }
    • onStart 이벤트에서 실행한 경우 메시지가 정상적으로 출력되는 것을 확인했습니다.
  • onFreeStop 이벤트 테스트:
    • 이후 onFreeStop 이벤트에 동일한 코드를 작성하고 프로그램을 중지한 후 실행했을 때:
      • 프리스탑 이벤트가 정상적으로 메시지를 송신하며 실행되었습니다.
  • 트레이스 윈도우 결과:
    • 프로그램 종료 후 트레이스 윈도우에 출력된 메시지를 통해 모든 단계가 정상적으로 완료되었음을 확인했습니다

 

 

deeper stop() , CompleteStop()

deeper stop() 

deeperStop 함수에 대한 설명

  1. deeperStop 함수의 기능:
    • deeperStop은 가짜(펄스) 정지 이벤트입니다.
    • 이 함수에 전달되는 숫자는 밀리세컨드(ms) 단위입니다.
      • 예: 1000을 넣으면 1초 동안 정지하고,
      • 3000을 넣으면 3초 동안 정지합니다.
  2. deeperStop 함수의 역할:
    • 만약 이 펄스 정지 함수를 코드에 작성하면 해당 시점에서 일시적으로 메시지 송신을 중지할 수 있습니다.
    • 이후 정지 시간이 끝난 후 트레이스 윈도우에 메시지가 다시 출력됩니다.
  3. deeperStop 사용 예시:
    • 이 코드는 2초간 메시지 송신이 중단되며, 이후 메시지가 다시 출력됩니다.
    • 트레이스 윈도우에서 메시지 송신이 일시적으로 중단된 모습을 확인할 수 있습니다.
  4. capl
    코드 복사
    deeperStop(2000); // 2초 동안 정지
  5. 실제 실행 순서와 트레이스 확인:
    • 코드가 실행된 후 한번 deeperStop을 거치면 정지 시간이 끝난 후 트레이스 윈도우에 메시지가 출력되는 것을 볼 수 있습니다.

 

 

CompleteStop()

활용

on preStart
{
    // preStart 이벤트 - 프로그램이 시작되기 직전에 실행됩니다.
}

on start
{
    // start 이벤트 - 프로그램이 시작되었을 때 실행됩니다.
}

on preStop
{
    message 0x123 msg;  // ID가 0x123인 메시지 선언
    output(msg);        // 메시지를 송신
    deferStop(3000);    // 3초 대기 후 프로그램 종료 준비 (지연된 정지)
}

on stopMeasurement
{
    // stopMeasurement 이벤트 - 측정이 중지될 때 실행됩니다.
}

on message 0x123
{
    completeStop();  // completeStop 호출 - 즉시 종료
}

completeStop과 deeperStop 함수의 활용

  1. completeStop 함수:
    • completeStop은 호출된 이후 더 이상 대기하지 않고 즉시 종료되는 함수입니다.
    • 어떤 상황에서 종료 작업을 강제로 수행할 때 사용됩니다.
    • 예를 들어, 특정 작업이 중간에 종료되어야 할 때 completeStop을 호출합니다.
  2. deeperStop 함수와의 비교:
    • deeperStop은 지정된 시간 동안 정지하고 나서 메시지를 송신합니다.
    • 하지만, 만약 deeperStop에서 별도 대기 없이 비효율을 줄이려면 상황에 따라 숫자를 잘 조정해야 합니다.
    • 예제 코드:
      capl
      코드 복사
      on preStop { deeperStop(2000); // 2초 동안 정지 message myMessage = {0x123}; output(myMessage); }
  3. 이벤트 실행 과정과 트레이스 확인:
    • 만약 on preStop에 위와 같은 코드를 작성하고 실행하면:
      • 2초 대기 후 메시지 ID 0x123이 송신됩니다.
      • 트레이스 윈도우에 정지된 후 출력된 메시지를 확인할 수 있습니다.
  4. completeStop과 deeperStop의 차이:
    • completeStop즉시 종료되어 더 이상 대기하지 않습니다.
    • deeperStop은 일정 시간 후 메시지를 송신하는 데 적합합니다.
  5. onMessageEvent와의 연계 사용:
    • 만약 메시지를 계속 송신해야 하는 상황에서는 onMessageEvent를 사용합니다.
    • 이 이벤트와 completeStop을 함께 사용하면 메시지가 반복되는 작업이 완료되었음을 쉽게 확인할 수 있습니다.
  6. 실제 실행 순서 예시:
    • on preStop 이벤트에 deeperStop을 설정하고, on start 이벤트에 메시지 송신을 연결하면:
      • 프로그램이 시작한 후 3초 동안 대기했다가 모든 메시지 송신이 종료되는 과정을 볼 수 있습니다.

마무리 및 결론:

  • deeperStopcompleteStop은 메시지 송신과 정지 동작을 조절하는 데 유용합니다.
  • 이 두 함수와 on preStop, onMessageEvent 이벤트를 적절히 활용하면 정지와 송신의 타이밍을 세밀하게 조절할 수 있습니다.