CANOpen Network Management (NMT) 상태 및 전이 과정
CANopen 네트워크에서 각 노드는 특정한 상태(State)를 가지며, 네트워크 관리(Network Management, NMT) 서비스를 통해 상태 전이가 이루어집니다. NMT는 네트워크의 정상적인 운영을 보장하고, 장치의 상태를 관리하기 위한 중요한 역할을 수행합니다. 본 장에서는 CANopen 장치의 NMT 상태와 상태 전이 과정을 자세히 살펴보겠습니다.
NMT 상태 개요
CANopen 장치는 다음과 같은 NMT 상태를 가집니다.
- Initialization: 장치가 시작될 때 진입하는 상태로, 하드웨어 및 소프트웨어 초기화가 이루어집니다.
- Pre-operational: 장치가 초기화를 완료하고 네트워크에 참여할 준비가 된 상태입니다. 이 상태에서는 일부 통신이 가능하지만, PDO(프로세스 데이터 오브젝트) 전송은 제한됩니다.
- Operational: 네트워크에서 정상적인 데이터 통신이 이루어지는 상태입니다. 모든 PDO 통신이 활성화됩니다.
- Stopped: 장치가 동작을 멈추고, 네트워크의 명령을 수신하지 않는 상태입니다. 일부 노드 보호 기능이 활성화될 수 있습니다.
NMT 상태 전이 과정
CANopen에서 NMT 상태 전이는 특정한 명령을 통해 이루어집니다. 주요 상태 전이 과정은 다음과 같습니다.
Initialization → Pre-operational
- 장치가 초기화를 완료하면 자동으로 Pre-operational 상태로 전이됩니다.
Pre-operational → Operational
- NMT 명령
Start Remote Node (0x01)
를 수신하면 장치는 Operational 상태로 전환됩니다.
- NMT 명령
Operational → Stopped
- NMT 명령
Stop Remote Node (0x02)
를 수신하면 장치는 Stopped 상태로 전환됩니다.
- NMT 명령
Stopped → Pre-operational
- NMT 명령
Enter Pre-operational (0x80)
를 수신하면 장치는 Pre-operational 상태로 전환됩니다.
- NMT 명령
Pre-operational → Stopped
- NMT 명령
Stop Remote Node (0x02)
를 수신하면 장치는 Stopped 상태로 전환됩니다.
- NMT 명령
Operational → Pre-operational
- NMT 명령
Enter Pre-operational (0x80)
를 수신하면 장치는 Pre-operational 상태로 전환됩니다.
- NMT 명령
임의의 상태에서 Initialization
- 장치가 리셋되거나 NMT 명령
Reset Node (0x81)
,Reset Communication (0x82)
를 수신하면 Initialization 상태로 돌아갑니다.
- 장치가 리셋되거나 NMT 명령
NMT 명령 메시지 형식
NMT 명령은 CAN 표준 프레임을 사용하며, 다음과 같은 형식을 가집니다.
Byte | 설명 |
---|---|
0 | NMT 명령 코드 (0x01, 0x02, 0x80 등) |
1 | 노드 ID (0x00 = 모든 노드) |
NMT 메시지는 COB-ID 0x000로 전송되며, 이는 네트워크의 모든 노드가 수신할 수 있는 브로드캐스트 메시지입니다.
NMT 상태 전이의 예제 코드 (STM32F429)
STM32F429와 STM32CubeIDE에서 HAL 라이브러리를 사용하여 NMT 상태 전이를 수행하는 예제 코드를 살펴보겠습니다.
#include "can.h"
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 메시지 COB-ID
txHeader.IDE = CAN_ID_STD;
txHeader.RTR = CAN_RTR_DATA;
txHeader.DLC = 2;
txData[0] = command; // NMT 명령 코드
txData[1] = node_id; // 대상 노드 ID (0x00 = 모든 노드)
HAL_CAN_AddTxMessage(&hcan1, &txHeader, txData, &txMailbox);
}
void transition_to_operational(uint8_t node_id) {
send_nmt_command(0x01, node_id);
}
void transition_to_preoperational(uint8_t node_id) {
send_nmt_command(0x80, node_id);
}
void transition_to_stopped(uint8_t node_id) {
send_nmt_command(0x02, node_id);
}
위 코드에서는 send_nmt_command()
함수를 사용하여 NMT 명령을 CAN 메시지로 전송하는 방식을 구현하였습니다. transition_to_operational()
, transition_to_preoperational()
, transition_to_stopped()
함수는 각각 Operational, Pre-operational, Stopped 상태로 전이하는 기능을 합니다.
결론
NMT 상태와 상태 전이 과정은 CANopen 네트워크에서 중요한 역할을 하며, 적절한 NMT 명령을 활용하여 노드의 동작을 관리할 수 있습니다. STM32F429와 STM32CubeIDE에서 HAL 라이브러리를 활용하여 NMT 상태 전이를 수행할 수 있으며, 이를 통해 안정적인 CANopen 네트워크를 구축할 수 있습니다.
'CAN > CAN Open' 카테고리의 다른 글
CANOpen SYNC & TIME 메시지의 활용 (0) | 2025.07.24 |
---|---|
CANOpen의 EMCY (Emergency Message)와 사용법 (0) | 2025.07.23 |
CANOpen Heartbeat & Node Guarding (0) | 2025.07.21 |
CANOpen PDO Mapping과 동작 방식 (0) | 2025.07.20 |
SDO (Service Data Object)와 PDO (Process Data Object) (0) | 2025.07.19 |