Canopen 节点卡在预操作状态

Canopen node become stuck in preop state

我在使用 canopen 的 can 总线上有 2 个节点(x 和 y)。使用临时节点 "z" 我发送一条 nmt 消息将所有节点置于预操作状态,然后发送一条命令将 y 置于操作状态。然后我在用于节点 y 的总线上发送一堆扩展 id 消息,节点 x 在其字典中不知道这些。在发送给 y 的过程中,节点 x 上的节点监控说它处于 preop 状态。一切似乎都很好。完成向节点 y 发送数据后,我发送命令将所有节点置于运行状态。根据其 nmt 状态代码,节点 x 处于预操作状态。调试我发现 canopen x 中的 rx fifo 溢出了。在预操作模式下应该忽略所有这些扩展消息吗?我什至在停止模式下尝试过卡住 x 的相同结果。这是怎么回事?

对于任何 CAN 总线节点,您都必须连续读取所有传入消息并忽略不感兴趣的消息。 CAN 控制器中的过滤器设置可以提供一些帮助,但要构建坚固的应用程序,您必须始终做好准备,任何具有任何 ID 的 CAN 消息都可能随时出现。确保这一点的最好方法是始终连续读取 rx fifo 缓冲区,并且每次都继续读取直到它为空。

只要有错误,CANopen 节点就会保持在预操作状态。可选地,它可以发送一条 EMCY 消息来告知错误的性质,然后在错误被清除时发送另一个所有位都设置为零的消息。在这种情况下,NMT 主机应该等到 EMCY 清除消息,然后再发送启动远程节点。