0

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

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

4

1 回答 1

1

免责声明:嗯,我没有任何大宗转账的经验,但我在我的项目中实施了加速和分段转账。我已阅读 CiA 301,以下是我从文档中了解到的内容:

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

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

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

于 2020-12-28T10:38:04.787 回答