【问题标题】:Sending events (async data) in CANopen with more than 8 bytes of data在 CANopen 中发送超过 8 字节数据的事件(异步数据)
【发布时间】:2020-09-08 06:26:13
【问题描述】:

我们正在开发一个典型的 CANbus 网络系统,您可以称之为控制器来组织许多设备。

设备需要配置,控制器使用常规对象字典项(当前在制造商特定范围内)写入(也可能读回)。

设备还使用超过 8 个字节的数据执行操作(命令),我们通过在设备对象字典中只写入项目并依靠 SDO 的常规分段/取消分段来解决这个问题。 (不知道这算不算是CANopen的做事方式,不过貌似合理)。

但是,设备也会产生事件(例如某些传感器数据超过某个阈值),从而导致来自设备的异步数据超过 8 个字节。 PDO 用于发送异步事件数据,但它只能包含 8 个字节。设备可以将数据写入控制器上的对象字典项,但这似乎不像 CANopen 方式。我说的对吗?

我们想出的最好办法是向控制器发送一个 PDO,通知控制器设备上的对象字典中有更多数据可用。

任何具有 CANopen 背景的人都可以找到解决此问题的最佳 (CANopen) 方法吗?

由于我经常重复 8 个字节,我们可以放心地假设这个网络没有运行 CAN-FD。

【问题讨论】:

    标签: can-bus canopen


    【解决方案1】:

    任何明智的 CAN 网络设计的关键是尽早考虑实时性、数据优先级、总线负载和数据量。如果您发现自己的数据块大于 8 字节,则强烈表明此设计存在问题 - 它可能应该拆分为多个包。

    通常,您根本不应该将 SDO 用于数据,因为它们会带来开销。这包括对对象字典的写入,这也意味着 SDO 访问。 SDO 的块传输等适用于引导加载程序或一次性配置等,而不适用于操作模式下的实时数据流量。可以做,但是有问题。

    理论上,您可以使用 PDO 映射跨多个 PDO 映射数据,但所有这些听起来确实像是一个“XY 问题”——您确信您需要传输更大的数据块并寻找一种方法来实现它。但第一步是查看基本的网络数据/设计,看看您是否真的需要这些大块,或者将它们分成几块是否有意义。理想的 CANopen 设计是尽可能为每种数据类型配备一个 PDO。

    【讨论】:

    • 感谢您的回复,所以让我澄清一下,也许您可​​以帮助我。我们将现有设备放在 CANbus(改装)上,因此数据包是固定的。但它们并不大(仅就 CANbus 而言)。我们发送的最长消息是 16 个字节(将适合两个数据包)。那么使用两个 PDO(前半部分,后半部分)并超时发送两者是否是一个更好的选择?对我来说似乎也很可疑......但在总线上只需要两条消息,而使用 SDO 方法则需要 8 条消息(标头、确认、7 字节、确认、7 字节、确认、2 字节、确认)
    • @VegarWesterlund 是的,在多个帧中同时发送相关数据是很常见的。例如,如果您有一个具有 8 个相关模拟功能的控制系统,每个 16 位,您会将其中 4 个放在一个 PDO 中,另外 4 个放在另一个 PDO 中,然后按顺序发送它们。如果网络优先级设计正确,它们只会被更重要的任务打断。必须编写接收方,以便它可以在任何时间或在时间窗口内接受任何这些包。
    • 请注意,很难用通用的 CANopen 术语来讨论这个问题,这完全取决于整个网络的具体情况。
    • 我理解一般来说讨论这个问题的难度。但是“在多个帧中发送相关数据很常见” 正是我正在寻找的响应。我想避免让具有实际 CANbus 经验的人在两年后​​进入该项目并思考“为什么哦,为什么?”。网络不会拥塞,时间限制也很宽松,所以我不太担心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多