在我的情况下,多个模块通过CAN总线将其状态报告给中央处理器,中央处理器回复并驱动它们。还有一个监控处理器,它监听CAN总线并分析来自模块的传入消息,用于危险情况(两个不同的模块报告激活输出,绝对禁止同时激活)。
只要CAN总线没有噪音,这一切都可以正常工作。
CAN总线保证收件人收到消息;如果没有收件人确认收到该邮件,则将重新发送该邮件。如果有多个收件人且所有收件人都必须收到邮件,则问题就开始了。 如果线是干净的,都接收它,确认它,一切都好。 如果邮件严重受损,则不会收到邮件,并且会重新发送。没关系。 但是,如果线路上的噪音“只是在边缘”,其中一个将接收它,并确认,另一个将无法接收它(总线末端的噪音最小),并且自发送者以来得到确认后,不会重新发送消息。
是否有一种可靠的方法可以确保邮件的两个不同收件人都能收到邮件? ...除了发送带有两个地址的两条消息之外,具体而言? (监控CPU必须听到与主CPU相同的消息,而不仅仅是类似)
答案 0 :(得分:4)
CAN层无法检测多个模块的接收情况。如果这绝对是至关重要的,您需要在通信协议中添加消息以确认收到。如上所述,您可以让每个模块接收相同的消息并发送唯一的回复。
一些一般性的想法:
1)重要信息是否定期播出?如果是这样,收件人可以测试邮件的周期是否正确,如果违反了该期限,则可以安全地失败。
2)CAN是一个非常强大的网络。在我多年的时间里,我没有看到像你所描述的那样影响单个节点的噪音,除非节点处于非常(非理性)长线的末端。您可以担心这种情况,并将您的消息格式和系统设计为对所有CAN故障都很稳健。通常,当安全性或可靠性至关重要时,我们将有多个CAN总线传递信息以及一些交叉检查消息,以验证不仅路径完好无损,而另一端的设备智能运行。我们的一般假设是,如果交叉检查信息正在进行,那么我们的操作信息也会成功地进行旅行。
答案 1 :(得分:1)
显然不是。
即使在简单的情况下,一个接收器关闭也会失败
主设备不可能检测到这个(对于这个单个数据包)。
对于每个收件人,您需要一个高级 CAN,具有更多的确认插槽。
但是您可以要求每个接收方都必须使用唯一的响应消息来确认消息 因此,您的主人可以通过超时检测到并非所有接收者都收到了该消息。