CANOpen 오류 메시지 (EMCY) 분석 및 처리 방법
개요
CANOpen 프로토콜에서 오류 메시지(EMCY, Emergency Message)는 장치에서 발생한 오류를 신속하게 네트워크에 전파하는 중요한 기능입니다. EMCY 메시지는 장치의 상태를 모니터링하고, 오류 발생 시 적절한 대응을 수행할 수 있도록 도와줍니다. 본 장에서는 CANOpen의 EMCY 메시지 형식, 발생 조건, 분석 방법 및 처리 방안을 다룹니다.
EMCY 메시지 개요
EMCY 메시지는 CANOpen 네트워크에서 특정 장치가 오류를 감지했을 때, 이를 다른 장치에 알리는 역할을 합니다. EMCY 메시지는 일반적으로 짧고, 고정된 길이의 CAN 메시지로 구성됩니다.
EMCY 메시지 구조
EMCY 메시지는 8바이트 데이터 필드를 포함하는 CAN 메시지이며, 다음과 같은 형식을 가집니다.
바이트 | 내용 | 설명 |
---|---|---|
0-1 | 오류 코드 | 16비트 오류 코드 (Error Code) |
2 | 오류 등록 값 | 특정 오류의 추가 정보를 제공 |
3-7 | 제조사별 데이터 | 제조사가 정의하는 추가 정보 |
- 오류 코드(Error Code): EMCY 메시지의 주요 부분으로, 발생한 오류의 유형을 나타내는 16비트 값입니다.
- 오류 등록 값(Error Register): CANOpen 장치의 오류 상태를 나타내는 8비트 필드로, 장치가 어떤 범주의 오류를 경험하고 있는지 표시합니다.
- 제조사별 데이터: 제조사가 장치의 특정 오류를 보다 상세하게 표현할 수 있도록 정의하는 부분입니다.
EMCY 메시지의 송신 조건
CANOpen 장치는 다음과 같은 경우에 EMCY 메시지를 전송합니다.
- 하드웨어 오류 발생 시: 센서 오류, 통신 모듈 장애 등
- 소프트웨어 오류 발생 시: 펌웨어 실행 중 예외 상황 발생
- 전압 이상 감지 시: 전원 공급 장치의 문제 발생
- 통신 오류 발생 시: CAN 버스 장애 또는 데이터 전송 오류
EMCY 메시지 분석 방법
EMCY 메시지를 분석하려면, CAN 분석 툴을 활용하여 네트워크에서 전송된 CAN 메시지를 확인해야 합니다. 일반적인 분석 절차는 다음과 같습니다.
- CAN 메시지 캡처: CAN 분석기(예: PCAN-View, CANalyzer)를 이용하여 CANOpen 네트워크의 CAN 메시지를 캡처합니다.
- EMCY 메시지 필터링: CANOpen EMCY 메시지의 CAN ID 범위를 기반으로 필터링하여 해당 메시지를 추출합니다.
- 오류 코드 확인: 수신된 EMCY 메시지의 첫 2바이트를 확인하여 오류 코드 값을 해석합니다.
- 오류 등록 값 분석: 오류의 종류를 보다 상세하게 분석하기 위해 오류 등록 값을 참고합니다.
- 제조사별 데이터 활용: 추가적인 정보가 필요한 경우 제조사 문서를 참고하여 특정 오류를 해석합니다.
예제: EMCY 메시지 분석
다음은 EMCY 메시지를 캡처한 예제입니다.
CAN 메시지 예제:
ID: 0x80
Data: 0x23 0x01 0x04 0x00 0x00 0x00 0x00 0x00
- 오류 코드 (0x0123): 특정 센서 오류 발생
- 오류 등록 값 (0x04): 전원 이상 오류
- 제조사별 데이터 (0x00 0x00 0x00 0x00 0x00): 추가 정보 없음
EMCY 메시지 처리 방안
EMCY 메시지가 수신되었을 때, 이를 적절히 처리하는 방법은 다음과 같습니다.
- 오류 코드 매핑: 수신된 오류 코드에 대한 사전 정의된 오류 목록을 기반으로 의미를 해석합니다.
- 적절한 대응 수행:
- 경미한 오류의 경우: 로그 기록 및 모니터링 유지
- 치명적인 오류의 경우: 장치 동작 중지 또는 재시작
- 오류 발생 보고: 상위 컨트롤러 또는 운영 소프트웨어에 오류 발생 사실을 보고합니다.
- 자동 복구 시도: 일부 오류의 경우, 소프트웨어적으로 자동 복구를 시도할 수 있습니다.
STM32에서 EMCY 메시지 처리 구현
STM32F429 기반의 CANOpen 노드에서 EMCY 메시지를 처리하는 예제 코드를 살펴보겠습니다. STM32CubeIDE와 HAL 라이브러리를 이용하여 EMCY 메시지를 송수신하는 코드를 구현할 수 있습니다.
EMCY 메시지 송신 예제
#include "can.h"
void Send_EMCY_Message(uint16_t error_code, uint8_t error_register) {
CAN_TxHeaderTypeDef TxHeader;
uint8_t TxData[8] = {0};
uint32_t TxMailbox;
TxHeader.StdId = 0x80; // EMCY 메시지 ID
TxHeader.DLC = 8; // 데이터 길이
TxHeader.IDE = CAN_ID_STD;
TxHeader.RTR = CAN_RTR_DATA;
TxData[0] = error_code & 0xFF;
TxData[1] = (error_code >> 8) & 0xFF;
TxData[2] = error_register;
if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK) {
// 오류 처리 코드
}
}
EMCY 메시지 수신 및 분석 예제
void CAN_Rx_Callback(CAN_RxHeaderTypeDef *RxHeader, uint8_t *RxData) {
if (RxHeader->StdId == 0x80) { // EMCY 메시지 확인
uint16_t error_code = RxData[0] | (RxData[1] << 8);
uint8_t error_register = RxData[2];
// 오류 코드 해석 및 처리
Process_EMCY_Message(error_code, error_register);
}
}
결론
CANOpen 네트워크에서 EMCY 메시지는 오류 발생 시 신속한 대응을 가능하게 하는 중요한 기능입니다. 이를 효과적으로 분석하고 처리함으로써 시스템의 안정성과 신뢰성을 향상시킬 수 있습니다. STM32F429 기반의 CANOpen 장치에서도 HAL 라이브러리를 활용하여 EMCY 메시지를 송수신하고, 이를 적절히 처리하는 것이 중요합니다.
'CAN > CAN Open' 카테고리의 다른 글
CANOpen을 지원하는 주요 MCU 및 모듈 (0) | 2025.08.01 |
---|---|
CANOpen 개발을 위한 하드웨어 및 소프트웨어 (0) | 2025.07.31 |
CANOpen 데이터 패킷 캡처 및 해석 (0) | 2025.07.29 |
CANOpen 네트워크 분석 툴 (PCAN-View, CANalyzer, BusMaster) (0) | 2025.07.28 |
CANOpen 장치별 Node-ID 할당 방식 및 설정 방법 (0) | 2025.07.27 |