主机是client客户端,从节点是server服务器。上传与下载是对服务器来说的,上传指的是服务器发送数据给客户端,下载是客户端给服务器数据。
参考CSDN:https://blog.csdn.net/zpqiatongxueshaonian/article/details/73826816
1.SDO 支持块序列传输,其中每块可由多至 127 段(包含序号和数据)的段序列组成。
先发送一个初始化块,让客户端和服务器准备好处理接下来的块,并议定每块的分段数。在传输完成阶段,客户端和服务器通过校验来验证之前接收到的数据集的正确性。
SDO 块下载完成后,服务器向客户端确认成功收到最后一个 SDO 块传输分段。 执行此操作的服务器也隐含的承认之前的分段接收正常。 客户端应开始接下来的 SDO 块传输。此外服务器应在应答内容里明确下一 SDO 块的分段数。
SDO 块上传完成后,客户端向服务器确认成功收到最后一个 SDO 块传输分段。执行此操作的客户端也隐含承认之前的分段接收正常。服务器应开始接下来的 SDO 块传输。此外客户端应在应答内容里明确下一 SDO 块的分段数。
注意:任何类型的 SDO 传输都由客户端发起。数据字典持有者是服务器。客户端或服务器都可以主动中止传输。
CANopen 设备可以支持多个 SDO。每个设备支持一个 Server-SDO 作为默认项(缺省 SDO)。
2.SDO报文结构
SDO传输基本结构有两种:
1.最大4字节数据报文结构(快速SDO)。
Byte0 Byte1-2 Byte3 Byte4-7
SDO命令字 对象字典索引 对象字典子索引 最大4字节数据
2.最大7字节数据报文结构(普通SDO,即块传输)。
Byte0 Byte4-7
SDO命令字 最大7字节数据
最大7字节数据报文中,其中SDO命令字在CANopen协议中有许多规定,其中包括:下载/上传、请求/应答、分段/加速传输、CAN帧的数据长度。后续每个分段交替清零和置位等。
SDO分段传输
1.SDO分段下载初始化----SDO命令字的含义及8位数据位形式。
报文结构
Byte0 | Byte1-2 | Byte3 | Byte4-7 | ||||
bit7-5 | bit4 | bit3-2 | bit1 | bit0 | |||
ccs | - | n | e | s | 索引 | 子索引 | 数据 |
字节Byte0解析:
css:SDO传输时client指令的识别码(client->server),可以分为以下几种:
000:SDO分段下载
001:初始化下载
010:初始化上传
011:SDO分段上传
100:中断SDO传输
SDO传输时server指令的识别码(server-->client),可以分为以下几种:
011:初始化下载
001:SDO分段下载
010:初始化上传
000:SDO分段上传
- : 表示不相关,表示为0
n:仅在 e==1 且 s==1时有效,表示数据部分无意义数据的字节,否则为0;
e:e==1表示快速传输(即1帧包括所有要传输的资料),e==0表示块传输。
s:s仅在e==0时候才有意义,表示Byte4~Byte7为要读/写的字节数。
Byte4-7:快速传输时表示数据,块传输时表示下载数据的长度。
3.SDO块传输有下载和上传两种:
1.SDO分段下载初始化(客户端启动SDO块下载服务client-->server)
报文格式如下:
0x600+ID 21(Byte0) index(Byte1-2) subindex(Byte3) 传输数据字节数(Byte4-7)
2.服务器收到下载初始化报文后,返回报文如下
0x580+ID 60 index(Byte1-2) subindex(Byte3) 00 00 00 00
2.SDO块下载
报文格式如下:
t:翻转位,每传输1次segment翻转1次,请求和响应中的t必须相等。
n:代表数据d0~d6中无效数据的长度,n=0表示7个字节数据均有效。
c:为0表示还有更多数据等待传输,为1表示传输完毕。
错误响应:
3.最后一段下载结束
SDO块传输举例(块上传(服务器传输数据给客户端))
总共有6次收发,下面逐步分析:
1.读的发起
第一次收发是读的发起,CS含义如下:
根据上面说的,根据 client 的命令字 010表示初始化上传,首先发送 0x40(这里和快速SDO一样)
服务器返回报文和快速SDO略有不同,其n、e、s的值变了,n为0,e为0,s为1。根据前面n、e、s的解释,
n的值无效,因为e != 1
e为0表示传输为块传输,即1次无法完全传输。
s==1 表示返回报文里Byte4~Byte7字节的值是字典项的size,其值为0x20,表示传输32字节数据。
2.读的数据传输
剩余的5次收发就是读的数据传输,其CS值定义如下:
client发送的CS值只有bit4即toogle bit在变化,所以CS值在0x70和0x60之间相互变化。
Server返回的报文里,除了t,还有n和c,字面意义也比较好理解,注意这里n是3bit,expedited传输里n是2bit。
只要不是最后一次收发,n和c都为0,CS值在0x00和0x10间互相变化,第一次是0x00;每次能传输7个字节,4次收发传了28个字节;
第6次收发是最后一次,此时还剩32-28=4个字节,那么n就为3(表示3个字节无效),即011,c为1(表示传输完毕),即1,组合在一起是0111,另外此次的t是0,那么最后一次返回的报文的CS就是0x07。
SDO块传输举例(块下载(客户端传输数据给服务器))
总共有4次收发,下面逐步分析:
1.第一次收发是写的发起,CS含义如下:
根据上面说的,根据client的命令字 001表示初始化下载,首先发送0x21(这里和快速SDO一样),e==0表示块(段)传输,s==1表示Byte4~Byte7要写入的字节数为0x10即16字节。
服务器返回的报文:0x60 根据server的命令字 011表示初始化下载的响应。
2.写的数据传输
剩余的3次收发就是写的数据传输,client和server的CS值定义如下:
client:因为当前阶段是SDO分段下载阶段,其client的命令字为000,又因为bit4要翻转变化,所以client的Byte0在0x00和0x10之间变化。
server:因为当前阶段是SDO分段下载阶段,其client的命令字为001,又因为bit4要翻转变化,所以server的Byte0在0x20和0x30之间变化。
只要不是最后一次收发,n和c都为0(c为0表示还有更多数据等待传输,为1表示传输完毕)。
第4次收发是最后一次,此时还剩16-14=2字节,那么n就应该为5,且是最后1次收发,所以c应该为1表示后面没有数据了。所以最后一次client的Byte0为0x0B。
最后一次server响应为0x20,因为当前阶段是SDO分段下载阶段,其client的命令字为001,恰好此时t应该置为0,所正好是0x20。
参考链接:https://blog.csdn.net/wojiuguowei/article/details/128215026?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-128215026-blog-81284085.235%5Ev43%5Epc_blog_bottom_relevance_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-128215026-blog-81284085.235%5Ev43%5Epc_blog_bottom_relevance_base3&utm_relevant_index=14
参考链接:https://www.docin.com/p-1260329242.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】