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

问题描述

我正在尝试构建基于 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

哪个(或没有)是真的?我在这里很困惑。

解决方法

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

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

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

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