CANopen NMT 命令与节点状态解析
简介
NMT 全称网络管理,是 CANopen 协议里核心的总线管控机制,相当于整段 CAN 总线的总指挥。主站依靠 NMT 指令统一管控所有从站设备,实现设备启停、节点复位、总线拓扑管理等各类运维操作。协议规定 NMT 指令固定占用 0x00 帧 ID,在总线仲裁机制中拥有最高优先级,能优先下发管控指令,保障总线调度的实时性。
NMT 命令组成
标准 NMT 数据帧仅由两个字节构成,首字节为专属命令代码,对应不同管控动作,第二字节填写目标设备的 Node-ID。如果第二字节设置为 0x00,代表这条 NMT 指令会对总线上全部节点同时生效,批量完成全网设备的复位、启停操作,适配整网统一调度场景。
🫀NMT 节点状态与心跳报文
在工业现场 CANopen 总线项目里,想要实时掌握各从站在线情况、捕捉通讯中断故障,心跳报文是行业通用监测方案。正常运行的从节点会按照设定周期主动向外发送心跳报文,主站持续接收报文就能判断节点是否离线,同时依据报文内容解析设备运行状态,快速定位故障并开展处置。
心跳报文的开关、监测时长依靠两组对象字典参数配置,分别是索引 0x1016 的消费者心跳超时、索引 0x1017 的生产者心跳周期。生产者心跳周期为 16 位无符号整数,单位毫秒,参数写 0 代表关闭该节点心跳上报功能;消费者心跳超时采用 32 位无符号整型,用于设置主站判定节点离线的等待时长。
协议明确心跳报文 COB-ID 计算规则,统一以 0x700 为基础数值,叠加设备自身 Node-ID 生成唯一报文标识,方便主站区分不同从站状态数据。
消费者心跳超时参数支持同时监控最多 127 个节点,参数子索引 16 至 23 位填写目标 Node-ID,低 16 位设置超时判定时长,单位毫秒。一旦对应节点心跳超时未上报,设备应用层会自动触发异常逻辑,推送 EMCY 故障报文,及时上报总线异常。
CANopen 协议划分三种常规工作状态,每种状态允许的通讯对象存在明确区分。停止状态下设备关闭绝大多数通讯服务,仅保留节点保护、心跳功能,此时产生的 EMCY 故障报文会暂时缓存,切换至其他状态后再统一上报。预操作状态仅开放 SDO 读写通道,常用于 PDO 映射、参数配置,可通过本地操作或 NMT 远程启动指令切换至运行态。操作状态开放全部通讯服务,PDO、SDO、同步报文、故障报文、NMT 指令均可正常收发,是设备业务数据传输的标准工作模式。
NMT 状态机
CANopen 设备上电或硬件复位后会完整走完三段初始化子状态,逐步完成参数加载与通讯初始化,各阶段流转逻辑有固定标准。初始化是上电后的首个阶段,设备完成底层基础初始化流程后,自动跳转至复位应用子状态。复位应用阶段会加载厂商自定义、标准协议对应的设备参数,参数初始化完毕后进入复位通讯子状态。复位通讯阶段完成总线通讯参数配置,执行 boot-up 启动报文上传,随后自动切换至预运行状态,等待主站下发运行指令。
完整状态流转覆盖预运行态、运行态、停止态三大工作模式,不同 NMT 指令会驱动设备在各状态之间切换。上电硬件复位后设备依次走完三段初始化流程进入预运行态;NMT 启动指令可将预运行、停止状态设备切换至运行态;NMT 停止指令会把运行、预运行设备切为停止态;复位、复位通讯类 NMT 指令则会让任意工作状态的设备重新走初始化流程,重置全部通讯与应用参数,适配设备故障重启、参数重置场景。