작성
·
112
·
수정됨
0
안녕하세요 강의를 듣고 CAPL 을 실제로 사용해보다가 궁금한 점이 있어서 문의드립니다.
현재 CANalyzer 프로그램을 사용하고 있습니다.
CANalyzer configuration 파일에 DBC 파일을 등록해놓고,
CAPL 에서 DBC에 있는 메시지를 선언한뒤,
특정 베리어블 값이 변했을때 선언한 메시지의 특정 시그널 값을 바꾸고 송신하는 코드를 짜봤습니다.
실제 차량에서 해당 코드를 통해 메세지를 송신하면 바로 에러프레임이 뜨면서 해당 도메인 로깅이 중단되거나, 1회 송신은 되는데 실제 차량 동작은 안하고, 2회째 송신하면 에러프레임이 뜨면서 해당 도메인 로깅이 중단됩니다.
혹시 무슨 상황인지 유추가 가능하신지 문의드립니다..
혹시 DBC를 Configuration 파일에 등록하고 CAPL에서 메시지를 선언해도 해당 메시지의 모든 시그널값을 선언한다던지, 스타트 비트 값이나 CRC 값을 계산한다던지의 추가적인 작업이 필요한건가요..?
제가 짰던 코드는 아래와 같습니다.
variables {
message 0x111 SWRC_FD; // 'SWRC_FD' 메시지 선언
}
on sysvar e_var::e_var { // 시스템 변수 e_var가 변경될 때 호출되는 이벤트 핸들러
if (@sysvar::e_var::e_var == 1) { // e_var의 값이 1로 변경된 경우
SWRC_FD.Audio_CustomSw = 1; // 'Audio_CustomSw' 시그널 값을 1로 설정
output(SWRC_FD); // 메시지 전송
write("SWRC_FD message sent with Audio_CustomSw = 1");
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
질문하신 내용에 대해 직접적으로 답변드리기는 어렵지만, CANalyzer 및 CAPL 사용 시 자주 발생하는 에러프레임 문제에 대해 몇 가지 일반적인 조언을 드리겠습니다.
먼저, DBC 파일에 메시지와 시그널을 등록했을 때 해당 메시지와 모든 시그널 값에 대한 정확한 정의가 필요합니다. 특정 시그널 값을 변경하여 송신할 경우, DBC 파일에서 정의된 시그널 값의 범위와 속성을 준수하는지 확인해야 합니다. DBC 파일 내의 메시지 ID, 시그널의 스타트 비트, 길이, 스케일, 오프셋, 엔디안 등이 올바르게 설정되어 있는지 재검토하는 것이 중요합니다.
CAPL 스크립트에서 메시지를 송신하기 전에 스타트 비트 값이나 CRC 값을 계산하는 과정이 필요할 수 있습니다. 특히, 네트워크 상에서 메시지의 무결성을 보장하기 위해 CRC 계산을 요구하는 프로토콜을 사용하는 경우가 있습니다. 이 경우, 메시지를 송신하기 전에 해당 메시지에 대한 CRC 값을 계산하여 메시지에 포함시켜야 합니다.
실제 차량에서 메시지를 송신했을 때 에러프레임이 발생하는 현상은 네트워크 상의 다른 참가자들과의 프로토콜 불일치, 메시지 ID의 충돌, 혹은 송신 주기의 문제 등 다양한 원인으로 인해 발생할 수 있습니다. 따라서, 실제 차량 네트워크의 요구 사항 및 기타 참가자들과의 통신 규약을 면밀히 검토할 필요가 있습니다.
위 사항들을 점검해보시고 여전히 문제가 해결되지 않는다면, CANalyzer의 로깅 기능을 활용하여 에러 프레임 발생 시점과 관련 메시지의 상세 정보를 분석해보시기 바랍니다. 또한, Vector 공식 문서나 관련 커뮤니티에서 추가적인 도움을 얻으실 수 있습니다.