【问题标题】:What is the maximum size that can be used in SDO block transfer and how?在 SDO 块传输中可以使用的最大大小是多少?如何使用?
【发布时间】:2020-12-28 09:01:25
【问题描述】:

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

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

CiA301 标准中定义的 SDO 块传输中。

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

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

【问题讨论】:

    标签: can-bus canopen sdo


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我不知道 DOMAIN 类型,谢谢。那么,在master结束通信之前是否会传输多个子块?
    • 是的。块传输的结束由最后一个子块的最后一段的c 位标记。之后,客户端(主控)必须发送最后一个数据包(在Figure 29 中描述)。我猜服务器也会检查传输的字节总数,因此c 位可能是多余的或存在用于错误检查。
    猜你喜欢
    • 2010-10-02
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多