我使用canopen在can总线上有2个节点(x和y)。使用临时节点“ z”,我发送nmt消息以将所有节点置于预操作状态,然后发送命令以将y置于操作状态。然后,我在打算用于节点y的总线上发送了一堆扩展的id消息,节点x在其字典中不知道这些消息。在发送到y期间,节点x上的节点监视说它处于preop状态。一切似乎都很好。在完成向节点y的数据发送后,我发送了一条命令,以使所有节点进入操作状态。节点x根据其nmt状态代码处于预操作状态。调试我发现canopen x中的rx fifo溢出了。在preop模式下应该忽略所有这些扩展消息吗?我什至在停止模式下尝试了x停留的相同结果。这是怎么回事?
答案 0 :(得分:1)
对于任何CAN总线节点,您都必须连续读取所有传入消息,而忽略那些无关紧要的消息。 CAN控制器中的过滤器设置可能会有所帮助,但是要构建坚固耐用的应用程序,必须始终准备好随时显示任何具有ID的CAN消息。确保这一点的最佳方法是始终连续读取rx fifo缓冲区,并每次保持读取直到其为空。
只要有错误,CANopen节点就保持运行前状态。可选地,它可以发出EMCY消息,告知错误的性质,然后发送另一条消息,清除错误时将所有位设置为零。在这种情况下,NMT主服务器应等到EMCY清除消息之后,再发出启动远程节点。