1

我对 CANopen 协议相当陌生,并为模拟读数创建从设备。

我的问题与访问 SDO 层上的一些索引有关。在官方文档 CIA 301 和 CIA 404 中,在所有索引中,子索引 0x00 定义了该索引下有多少条目。但是一些变量,如 nodeID 或网络波特率是单一的并且有单独的索引(例如:0x3000、0x3001)。这两个示例除了它们自己之外没有任何其他数据。

我需要在子索引 0x00 下访问它们还是子索引必须是 0x01?

4

2 回答 2

0

是的,我很确定所有 CANopen 对象字典条目必须至少有一个子索引,并且索引 0 始终是该地址支持的子索引数。我从来没有在任何地方看到过例外,无论是在标准中还是在其他地方。

如果您发现一些没有子索引的东西,很可能您正在查看一些不合规的自定义解决方案。那里肯定有很多废话。此外,CANopen 标准又大又笨重,所以也有很多“偷工减料”的解决方案。

如果您可以选择,我建议您选择经过一致性测试和认证的 CANopen 产品。一致性测试非常棒,因为它会检查设备是否在收到意外的东西时开始运行异常,等等。大多数人宁愿不想使用可能失控的产品。可在此处找到所有认证产品的列表:https ://www.can-cia.org/services/test-center/conformance-testing/tested-devices/

于 2021-06-24T09:31:09.380 回答
0

来自 CiA 301(重点是我的)

16 位索引用于寻址对象字典中的所有对象。在简单变量的情况下,索引直接引用该变量的值。 然而,在记录和数组的情况下,索引处理整个数据结构。

为了允许通过网络访问数据结构的各个元素,定义了一个子索引。 对于单个对象字典对象,例如 UNSIGNED8、BOOLEAN、INTEGER32 等,子索引的值始终为 00h。 对于复杂的对象字典对象,例如具有多个数据字段的数组或记录,子索引引用主索引指向的数据结构中的字段。子索引访问的字段可能具有不同的数据类型。

因此,子索引值仅用于数组和记录,与单个值无关。我没有在现场使用实际 CANopen 设备的经验,但我希望它们仅接受子索引 0x00 或完全忽略单个变量的子索引。

另请注意,数组/记录子索引 0x00 规则至少有一个例外。通常它代表记录的最大索引值(我不确定是否存在差距)。但是对于RPDO/TPDO 映射参数,它具有特殊的含义,表示哪些映射项是有效的/活动的。

于 2021-06-24T11:10:27.410 回答