CAN/CAN Open

CANOpen의 EMCY (Emergency Message)와 사용법

임베디드 친구 2025. 7. 23. 19:56
728x90
반응형

CANOpen의 EMCY (Emergency Message)와 사용법

EMCY 개요

CANOpen 프로토콜에서 EMCY(Emergency Message)는 네트워크 내 장치가 치명적인 오류 상태를 감지했을 때 이를 즉각적으로 다른 노드들에게 알리는 메시지입니다. EMCY 메시지는 빠르게 전송되어 네트워크 내 다른 장치들이 이를 인식하고 적절한 조치를 취할 수 있도록 합니다.

EMCY 메시지는 특정한 이벤트가 발생할 때만 전송되며, 일반적인 데이터 통신과 달리 주기적인 전송이 이루어지지 않습니다. 이를 통해 네트워크의 부하를 최소화하면서도 중요한 장애 상황을 빠르게 공유할 수 있습니다.

EMCY 메시지 구조

EMCY 메시지는 표준 CAN 프레임을 사용하며, 다음과 같은 구조를 가집니다.

바이트 오프셋 필드명 설명
0~1 오류 코드 16비트 오류 코드 (Big-Endian)
2 오류 등록 값 8비트 오류 상태를 나타내는 값
3~7 제조사별 정보 특정 제조사에서 정의한 추가적인 오류 정보

CANOpen에서 EMCY 메시지는 COB-ID 0x80 + 노드 ID를 사용하여 전송됩니다. 예를 들어, 노드 ID가 5라면 해당 장치에서 발생하는 EMCY 메시지의 COB-ID는 0x85가 됩니다.

EMCY 메시지 전송 과정

  1. 장치에서 오류 감지
  2. EMCY 메시지 생성 및 CAN 버스를 통해 전송
  3. 네트워크 내 다른 노드들이 메시지를 수신하고 처리
  4. 오류가 해제되면 추가적인 EMCY 메시지를 전송하여 상태 정상화 알림

EMCY 메시지는 일반적으로 네트워크 관리자나 상위 제어 장치에서 로그를 남기거나 적절한 조치를 취하는 용도로 사용됩니다.

STM32에서 EMCY 메시지 전송 구현

STM32F429에서 EMCY 메시지를 전송하기 위해서는 HAL 라이브러리를 사용하여 CAN 메시지를 구성해야 합니다. 예제 코드는 다음과 같습니다.

#include "stm32f4xx_hal.h"

extern CAN_HandleTypeDef hcan1;

void Send_EMCY_Message(uint8_t node_id, uint16_t error_code, uint8_t error_register, uint32_t manufacturer_specific) {
    CAN_TxHeaderTypeDef TxHeader;
    uint8_t TxData[8];
    uint32_t TxMailbox;

    TxHeader.StdId = 0x80 + node_id; // EMCY 메시지 COB-ID 설정
    TxHeader.RTR = CAN_RTR_DATA;
    TxHeader.IDE = CAN_ID_STD;
    TxHeader.DLC = 8;

    // EMCY 데이터 구성
    TxData[0] = (uint8_t)(error_code & 0xFF);
    TxData[1] = (uint8_t)((error_code >> 8) & 0xFF);
    TxData[2] = error_register;
    TxData[3] = (uint8_t)(manufacturer_specific & 0xFF);
    TxData[4] = (uint8_t)((manufacturer_specific >> 8) & 0xFF);
    TxData[5] = (uint8_t)((manufacturer_specific >> 16) & 0xFF);
    TxData[6] = (uint8_t)((manufacturer_specific >> 24) & 0xFF);
    TxData[7] = 0; // 사용되지 않는 바이트

    // CAN 메시지 전송
    if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK) {
        // 오류 발생 처리
    }
}

EMCY 메시지 수신 및 처리

네트워크 내 다른 장치에서 EMCY 메시지를 수신하려면 CAN 인터럽트를 활용하여 특정 ID의 메시지를 필터링하고 처리해야 합니다. 예제 코드는 다음과 같습니다.

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
    CAN_RxHeaderTypeDef RxHeader;
    uint8_t RxData[8];

    if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK) {
        if ((RxHeader.StdId & 0xFF80) == 0x80) { // EMCY 메시지 확인
            uint8_t node_id = RxHeader.StdId & 0x7F;
            uint16_t error_code = (RxData[1] << 8) | RxData[0];
            uint8_t error_register = RxData[2];
            uint32_t manufacturer_specific = (RxData[6] << 24) | (RxData[5] << 16) | (RxData[4] << 8) | RxData[3];

            // 수신된 EMCY 메시지 처리
        }
    }
}

결론

EMCY 메시지는 CANOpen 네트워크에서 오류 상황을 신속하게 전파하기 위한 중요한 메커니즘입니다. STM32F429에서 HAL 라이브러리를 활용하면 EMCY 메시지를 쉽게 전송하고 수신할 수 있으며, 이를 통해 네트워크 내 오류 감지 및 대응을 자동화할 수 있습니다. 실제 구현 시에는 특정 장치의 요구사항에 맞춰 오류 코드 및 처리 방식을 조정해야 합니다.

728x90
반응형