0

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

4

1 回答 1

1

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

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

于 2019-01-24T07:31:08.930 回答