CAN/CAN Open

CANopen NMT 명령을 통한 노드 제어

임베디드 친구 2025. 8. 14. 19:41
728x90
반응형

CANopen NMT 명령을 통한 노드 제어

NMT (Network Management) 개요

NMT(Network Management)는 CANOpen 네트워크에서 노드를 관리하는 중요한 기능입니다. NMT 명령을 통해 노드의 상태를 변경하고, 네트워크의 정상적인 동작을 유지할 수 있습니다.

CANOpen에서는 각 노드가 특정 상태를 가지며, 마스터 디바이스는 NMT 명령을 사용하여 슬레이브 노드의 상태를 전환할 수 있습니다. 기본적인 NMT 상태는 다음과 같습니다.

  • Initialization: 노드가 초기화되는 상태
  • Pre-Operational: 일부 CANOpen 서비스(SDO, NMT 등)를 사용할 수 있는 상태
  • Operational: 모든 CANOpen 서비스(PDO 포함)를 사용할 수 있는 상태
  • Stopped: 노드가 네트워크에서 중단된 상태

NMT 명령어 형식

NMT 명령은 CAN ID 0x000에 전송되며, 데이터 길이는 2바이트로 구성됩니다. 첫 번째 바이트는 명령을 의미하며, 두 번째 바이트는 대상 노드 ID를 나타냅니다.

바이트 설명
1바이트 NMT 명령 코드
2바이트 노드 ID (0은 전체 노드 대상으로 브로드캐스트)

대표적인 NMT 명령 코드는 다음과 같습니다.

NMT 명령 코드 설명
0x01 Operational 모드로 전환
0x02 Stopped 모드로 전환
0x80 Pre-Operational 모드로 전환
0x81 Reset Node (전체 리셋)
0x82 Reset Communication (통신 스택만 리셋)

STM32에서 NMT 명령 전송하기

STM32F429를 사용하여 CANOpen 네트워크에서 NMT 명령을 전송하려면, CAN 통신을 설정한 후 NMT 메시지를 구성하여 전송해야 합니다. 아래 예제 코드는 HAL 라이브러리를 이용하여 NMT 명령을 전송하는 방법을 보여줍니다.

#include "stm32f4xx_hal.h"

extern CAN_HandleTypeDef hcan1;

void send_nmt_command(uint8_t command, uint8_t node_id) {
    CAN_TxHeaderTypeDef txHeader;
    uint8_t txData[2];
    uint32_t txMailbox;

    txHeader.StdId = 0x000; // NMT 명령어의 CAN ID
    txHeader.RTR = CAN_RTR_DATA;
    txHeader.IDE = CAN_ID_STD;
    txHeader.DLC = 2;

    txData[0] = command;
    txData[1] = node_id;

    if (HAL_CAN_AddTxMessage(&hcan1, &txHeader, txData, &txMailbox) != HAL_OK) {
        // 오류 처리
    }
}

NMT 명령 활용 예제

다음 예제는 특정 노드를 Operational 모드로 변경하는 코드입니다.

send_nmt_command(0x01, 0x02); // 노드 ID 2를 Operational 모드로 전환

네트워크 내 모든 노드를 Pre-Operational 모드로 변경하려면 다음과 같이 브로드캐스트 ID(0x00)를 사용합니다.

send_nmt_command(0x80, 0x00); // 모든 노드를 Pre-Operational 모드로 전환

NMT 상태 확인

NMT 명령을 전송한 후 노드의 상태를 확인하려면, 각 노드가 주기적으로 자신의 상태를 보고하도록 설정할 수 있습니다. 상태 보고는 Heartbeat 또는 Node Guarding 기능을 통해 수행됩니다.

  • Heartbeat: 노드가 자신의 상태를 정기적으로 CAN 버스로 전송 (ID: 0x700 + 노드 ID)
  • Node Guarding: 마스터가 슬레이브 노드의 상태를 질의하고 응답을 확인하는 방식

예를 들어, Heartbeat 메시지를 확인하면 노드가 현재 어떤 상태인지 알 수 있습니다. 일반적으로 Heartbeat 메시지는 다음과 같은 형식으로 전송됩니다.

바이트 설명
1바이트 현재 NMT 상태

NMT 상태 값 예제:

상태 값 설명
0x00 Boot-Up (부팅 완료)
0x04 Stopped
0x05 Operational
0x7F Pre-Operational

STM32에서 CAN 인터럽트를 활용하여 Heartbeat 메시지를 수신할 수 있도록 설정할 수도 있습니다.

결론

NMT 명령을 활용하면 CANOpen 네트워크에서 각 노드의 상태를 제어하고, 네트워크의 정상적인 동작을 유지할 수 있습니다. STM32F429와 HAL을 이용하면 손쉽게 NMT 명령을 전송하고, 네트워크 상태를 모니터링할 수 있습니다.

728x90
반응형