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 명령을 전송하고, 네트워크 상태를 모니터링할 수 있습니다.
'CAN > CAN Open' 카테고리의 다른 글
CANOpen NMT 명령을 통한 노드 제어 (0) | 2025.08.15 |
---|---|
CANOpen Slave 개발 (STM32 MCU 활용) (0) | 2025.08.13 |
CANOpen Master 개발 (STM32 및 C 기반) (0) | 2025.08.12 |
CANOpen STM32F429를 이용한 모터 제어 CiA 402 프로파일 (0) | 2025.08.11 |
CANOpen 노드 구성 및 테스트(STM32F429 활용) (0) | 2025.08.10 |