3、NMT主站与从站:主站职责与功能、从站行为模式、主从通信流程

好,咱们进入第三讲。这一讲要聊的,是整个CANopen网络里最核心的一对关系——NMT主站和从站。说白了,一个网络里谁说了算?就是NMT主站。它负责发号施令,从站负责听令行事。这个机制搞不清楚,后面调试网络的时候你会一头雾水。

我个人习惯,在搭建一个新系统时,第一件事就是先把NMT主站的角色定死。谁做主站?是PLC还是工控机?这个不明确,后面所有节点状态管理都会乱套。

3.1 NMT主站的职责与功能

NMT主站,你可以把它理解成整个CANopen网络的“大脑”或“指挥官”。它的职责非常明确,我归纳为以下几点:

  • 网络状态管理:主站负责控制所有从站的状态机。从站是初始化、预操作、操作还是停止,都由主站通过NMT命令来切换。
  • 节点启动与停止:主站可以发送命令让某个从站启动(进入操作状态),或者让它停止(进入停止状态)。
  • 节点复位:当某个从站死机或异常时,主站可以发送复位命令,让它重新初始化。我在项目中遇到过,一个电机驱动器偶尔会卡在“预操作”状态,就是靠主站定时发送复位命令解决的。
  • 心跳监控:主站会监听所有从站的心跳报文。如果某个从站超过设定时间没发心跳,主站就知道它掉线了,可以采取相应措施。
  • 网络启动流程:系统上电后,主站负责按顺序启动所有从站,确保网络有序进入工作状态。

核心要点:一个CANopen网络中,只能有一个NMT主站。如果有多个设备试图当主站,网络会乱套。我曾经见过一个项目,两个PLC都配置成了主站,结果互相发NMT命令,从站直接懵了。

3.2 从站的行为模式

从站相对简单,它就是个“听话”的角色。从站内部有一个状态机,包含以下几个状态:

状态说明可执行操作
初始化上电后自动进入,完成硬件和协议栈初始化自动跳转到预操作
预操作可以接收SDO,但不能发送PDO配置参数、设置对象字典
操作正常工作状态,可以收发PDO实时数据交换
停止停止所有通信,只响应NMT命令等待主站唤醒

你想想看,从站就像一个士兵。上电后先“立正”(初始化),然后“稍息”(预操作),等主站下令“开始行动”(操作),或者“原地待命”(停止)。

嗯,这里要注意:从站不能自己决定进入操作状态。它必须等主站发命令。我见过有人写程序时让从站上电后直接进操作状态,结果主站还没准备好,PDO数据就乱飞了。这是典型的错误。

3.3 主从通信流程

主从通信流程,说白了就是主站怎么控制从站,从站怎么响应。我把它拆成几个步骤:

  1. 上电初始化:所有从站上电后自动进入初始化状态,然后快速跳转到预操作状态。
  2. 主站发送启动命令:主站通过NMT命令(COB-ID为0x000),让从站从预操作进入操作状态。命令格式是:0x01(启动命令)+ 节点ID
  3. 从站响应:从站收到命令后,切换到操作状态,开始发送心跳报文(如果配置了心跳)。
  4. 正常通信:在操作状态下,从站可以收发PDO,主站也可以通过SDO读写对象字典。
  5. 异常处理:如果从站掉线,主站通过心跳超时检测到,然后可以尝试复位或报警。

我的经验:在实际项目中,我建议主站在启动时不要一次性把所有从站都启动。最好一个一个来,每启动一个,确认它发心跳了,再启动下一个。这样万一哪个从站有问题,你能立刻定位。

来看一个简单的NMT命令发送示例:

// 伪代码:NMT主站发送启动命令给节点ID=5
uint8_t nmt_command = 0x01;  // 启动命令
uint8_t node_id = 0x05;      // 目标节点ID
uint16_t cob_id = 0x000;     // NMT命令的COB-ID

// 发送CAN报文
can_send(cob_id, nmt_command, node_id);

这段代码很简单,但背后逻辑很关键。主站发送的NMT命令,所有从站都会收到。但只有节点ID匹配的那个从站才会执行。其他从站会忽略。

3.4 心跳机制与主从交互

心跳机制是主从通信的“保命符”。从站会定期发送一个心跳报文,告诉主站“我还活着”。主站收到后就知道这个从站状态正常。

心跳报文的格式很简单:

  • COB-ID:0x700 + 节点ID
  • 数据字节:1个字节,表示从站当前状态(0x00=启动中,0x04=停止,0x05=操作,0x7F=预操作)

举个例子,节点ID为5的从站在操作状态,它发送的心跳报文是:COB-ID=0x705,数据=0x05。

避坑指南:我曾经在一个项目中,把心跳生产时间设成了100ms,结果总线负载直接爆了。后来改成500ms,一切正常。心跳时间别设太短,一般100ms到1秒之间比较合理。太短浪费带宽,太长又检测不到掉线。

主站这边,需要为每个从站配置一个“心跳消费时间”。如果在这个时间内没收到从站的心跳,主站就认为从站掉线了。这个时间一般设成心跳生产时间的2-3倍,留点余量。

3.5 主从通信的典型场景

我总结一下实际项目中常见的几种主从通信场景:

  • 系统启动:主站上电后,先发NMT命令让所有从站进入预操作,然后逐个配置参数,最后统一发启动命令进入操作状态。
  • 正常运行时:主站通过PDO接收从站数据,通过SDO读写配置。从站定期发心跳。
  • 从站异常:主站检测到心跳超时,先尝试复位该从站。如果复位失败,记录故障并报警。
  • 系统停机:主站发NMT停止命令,所有从站进入停止状态,然后主站自己断电。

嗯,这里要特别强调一点:主站和从站的角色不是固定的。有些设备可以配置成主站,也可以配置成从站。比如一个带CANopen接口的PLC,你既可以把它当主站控制别人,也可以把它当从站被别人控制。这完全取决于你的系统设计。

好了,这一讲就到这里。记住一句话:NMT主站是司令,从站是士兵。司令发令,士兵执行。搞清楚了这一点,CANopen网络管理你就掌握了八成。