在 CANopen 中发送超过 8 个字节数据的事件(异步数据)
Sending events (async data) in CANopen with more than 8 bytes of data
我们正在开发一个典型的 CANbus 网络系统,您可以将其称为组织多个设备的控制器。
设备需要配置,控制器使用常规对象字典项(当前在制造商特定范围内)写入(也可能读回)。
设备还执行超过 8 个字节的数据的操作(命令),我们通过在设备对象字典中只写项目并依赖 SDO 的常规 segmentation/de-segmentation 来解决这个问题。 (我不知道这是否是CANopen的做事方式,但看起来很合理)。
但是,设备也会产生事件(比如某些传感器数据超过某个阈值),导致设备发出超过 8 个字节的异步数据。 PDO 旨在用于发送异步事件数据,但它只能包含 8 个字节。设备可以将数据写入控制器上的对象字典项中,但这似乎不像 CANopen 方式。我说得对吗?
我们想到的最好办法是向控制器发送 PDO,通知控制器设备上的对象字典中有更多数据可用。
任何具有 CANopen 背景的人都可以找到解决此问题的最佳 (CANopen) 方法吗?
因为我重复了很多 8 个字节,我们可以放心地假设这个网络不是 运行 CAN-FD。
任何明智的 CAN 网络设计的关键是尽早考虑 real-time、数据优先级、总线负载和数据量。如果您发现自己的数据块大于 8 字节,那么这强烈表明此设计存在问题 - 它可能应该分成几个包。
一般来说,您根本不应该对数据使用 SDO,因为它们会带来开销。这包括写入对象字典,这也意味着 SDO 访问。使用 SDO 的块传输等用于引导加载程序或 one-time 配置之类的东西,而不是用于操作模式下的实时数据流量。可以做,但是有点腥
理论上您可以使用 PDO 映射在多个 PDO 之间映射数据,但是所有这些听起来真的像是一个“XY 问题”——您确信您需要传输更大的数据块并寻找一种方法来完成它。但是第 1 步是查看基础网络 data/design 并查看您是否真的需要那些大块,或者将它们分成几个是否有意义。理想的 CANopen 设计是在可能的情况下,每种类型的数据都有一个 PDO。
我们正在开发一个典型的 CANbus 网络系统,您可以将其称为组织多个设备的控制器。
设备需要配置,控制器使用常规对象字典项(当前在制造商特定范围内)写入(也可能读回)。
设备还执行超过 8 个字节的数据的操作(命令),我们通过在设备对象字典中只写项目并依赖 SDO 的常规 segmentation/de-segmentation 来解决这个问题。 (我不知道这是否是CANopen的做事方式,但看起来很合理)。
但是,设备也会产生事件(比如某些传感器数据超过某个阈值),导致设备发出超过 8 个字节的异步数据。 PDO 旨在用于发送异步事件数据,但它只能包含 8 个字节。设备可以将数据写入控制器上的对象字典项中,但这似乎不像 CANopen 方式。我说得对吗?
我们想到的最好办法是向控制器发送 PDO,通知控制器设备上的对象字典中有更多数据可用。
任何具有 CANopen 背景的人都可以找到解决此问题的最佳 (CANopen) 方法吗?
因为我重复了很多 8 个字节,我们可以放心地假设这个网络不是 运行 CAN-FD。
任何明智的 CAN 网络设计的关键是尽早考虑 real-time、数据优先级、总线负载和数据量。如果您发现自己的数据块大于 8 字节,那么这强烈表明此设计存在问题 - 它可能应该分成几个包。
一般来说,您根本不应该对数据使用 SDO,因为它们会带来开销。这包括写入对象字典,这也意味着 SDO 访问。使用 SDO 的块传输等用于引导加载程序或 one-time 配置之类的东西,而不是用于操作模式下的实时数据流量。可以做,但是有点腥
理论上您可以使用 PDO 映射在多个 PDO 之间映射数据,但是所有这些听起来真的像是一个“XY 问题”——您确信您需要传输更大的数据块并寻找一种方法来完成它。但是第 1 步是查看基础网络 data/design 并查看您是否真的需要那些大块,或者将它们分成几个是否有意义。理想的 CANopen 设计是在可能的情况下,每种类型的数据都有一个 PDO。