SDO 块传输中可以使用的最大大小是多少?如何使用?

What is the maximum size that can be used in SDO block transfer and how?

我正在尝试构建一个基于 CANOpen 原则的嵌入式系统。我构建了大部分对象字典。我主要是和SDO沟通(主要是加急转账)。我以前用过一次CANOpen作为主站(所以我的限制很清楚),但是我现在在从站。

最近我被要求通过相同的协议更新我的设备的软件。为了做到这一点,我倾向于 SDO 块传输,但我不知道它是如何完成的;通过 SDO 块传输可以传输的最大大小是多少?

在 SDO 块传输中,如 CiA301 标准中所定义。

size : 4 bytes addressing = 4GB

但是考虑块和序列:

1 < blksize < 128
0 < seqno < 128
Each segment consists 7 bytes of data
1 block: blksize (127) * seqno(0 to 127: 128) * 7 = ~111KB

相比之下,在同一个初始化中,我们设置了一个m值(由索引和子索引组成)。

1 sub-index: 4 bytes
1 index: ~256(1 byte addressing)* 4 = ~1KB
Object dictionary: ~64K(2 bytes addressing) * ~1KB = ~64MB

哪一个(或none)是正确的?我在这里很困惑。

免责声明:好吧,我没有任何块传输的经验,但我在我的项目中实施了加急和分段传输。我已阅读 CiA 301,以下是我从文档中了解到的内容:

首先,对象字典条目没有大小限制。它们可以包含二进制 blob(请参阅 DOMAIN 类型)。我猜块传输的 4 GB 限制在实践中可能也限制了对象字典条目的大小。块传输针对单个对象字典条目,由索引 - 子索引对标识。

块传输可以包含多个子块。每个子块由多个段组成,编号从1到n(最大127),也是序号。 SDO 服务器(大多数情况下为从设备)在每次子块传输开始时和之后决定每个子块的大小。每个段可以包含 1-7 个字节的数据。

子块的数量没有限制,每个子块内的段数限制为127。因此,SDO 块传输最多可以传输 4 GB 的数据。