Can bus 缺少主心跳不会导致节点在CANopen系统中做出反应

Can bus 缺少主心跳不会导致节点在CANopen系统中做出反应,can-bus,canopen,Can Bus,Canopen,我有一个关于心跳协议的奇怪发现。也许有人见过这样的东西,也许它应该是这样工作的。。。不管怎样,这里是它的内容: 在CANopen中有两种基于超时的生命保护机制:第一种是节点保护,我将不再进一步提及,因为它被认为是老新闻 另一个叫做心跳。这很简单:网络上的任何参与者都会发送一条常规消息,说明其节点ID和状态。频率由对象0x1017sub0定义,称为心跳生成器时间。如果设置为零,则不会发送心跳信号 然后,任何其他参与者都可以定义它希望在网络上找到的节点数量,以及两个连续心跳消息之间的最长时间。此信息

我有一个关于心跳协议的奇怪发现。也许有人见过这样的东西,也许它应该是这样工作的。。。不管怎样,这里是它的内容:

在CANopen中有两种基于超时的生命保护机制:第一种是节点保护,我将不再进一步提及,因为它被认为是老新闻

另一个叫做心跳。这很简单:网络上的任何参与者都会发送一条常规消息,说明其节点ID和状态。频率由对象0x1017sub0定义,称为心跳生成器时间。如果设置为零,则不会发送心跳信号

然后,任何其他参与者都可以定义它希望在网络上找到的节点数量,以及两个连续心跳消息之间的最长时间。此信息作为32位条目存储在对象0x1016sub1..n中,用于此特定节点想要侦听的节点数

这些条目包括节点ID(位22到16)和所提到的心跳之间可能经过的最大时间,称为心跳消费者时间(位15..0)。同样,如果条目为零,则忽略它

正如您可能已经收集到的,网络主节点(节点ID 1)和从节点(节点ID 2到127)之间没有区别

到目前为止,我的问题是:

我将网络中的一个从节点配置为主节点的心跳消费者,因此在对象0x1016sub1中有一个条目如下所示:0x000107D0。这意味着至少两秒钟后会收到来自主机的心跳消息

我在两个例子中观察到这一点。如果我发送主心跳一段时间,然后停止,节点要么返回到预操作模式,要么发送适当的紧急消息

如果我不发送任何主心跳消息,我希望在启动节点(将其发送到操作模式)后,节点最多需要两秒钟才能返回到操作前模式或发送适当的紧急消息,甚至可能两者都需要。但在我尝试的两个例子中,什么都没有发生。如果我从未发送过任何心跳信号,那么节点就不会期望有心跳信号,而是继续运行

这两个例子截然不同。我不确定他们是否使用相同的CANopen堆栈库

有什么解释吗?

如果您阅读第39页第1.3.1.6节,您会注意到心跳消费者在接收到来自生产者的心跳时首先被激活。我假设,因为在您的示例中,第一个心跳从未发送,所以消费者没有被激活

如果您阅读第39页第1.3.1.6节,您会注意到心跳消费者在接收到来自生产者的心跳时首先被激活。我假设,因为在您的示例中,第一个心跳从未发送,所以消费者没有被激活

如果您阅读第39页第1.3.1.6节,您会注意到心跳消费者在接收到来自生产者的心跳时首先被激活。我假设,因为在您的示例中,第一个心跳从未发送,所以消费者没有被激活

如果您阅读第39页第1.3.1.6节,您会注意到心跳消费者在接收到来自生产者的心跳时首先被激活。我假设,因为在您的示例中,第一个心跳从未发送,所以消费者没有被激活