文章目录
- SDO分类
- SDO 段下载
- 快速SDO下载
- 普通SDO段下载发起
- 普通SDO段下载
- SDO 段上传
- 快速SDO上传
- 普通SDO发起段上传
- 普通SDO段上传
- SDO 块下载
- SDO块下载发起
- SDO子块下载
- SDO块下载结束
- SDO 块上传
- SDO块上传发起
- SDO上传子块
- SDO块上传结束
SDO分类
根据应用程序需求,以下服务可以应用于SDO:
- SDO下载分为如下几个部分
- SDO下载发起
- SDO段下载
- SDO上传分为如下几个部分
- SDO上传发起
- SDO段上传
- SDO终止传输
普通SDO(分段传输)进行下载和上传服务时,应用程序负责将SDO作为一个分段序列进行传输。与此同时,快速SDO也应当得到支持。如果传输的数据长度大于4字节,则应支持SDO分段传输。
SDO块下载服务作为可选项,可用于进行高速的SDO块数据传输:
- SDO块下载分为如下几个部分
- SDO块下载发起
- SDO块下载
- SDO块下载结束
- SDO块上传分为如下几个部分
- SDO块上传发起
- SDO块上传
- SDO块上传结束
当使用SDO块下载和SDO块上传服务时,应用程序负责将负责将数据作为一个块的序列传输。
SDO 段下载
使用SDO读写对象时,如果数据长度不大于4字节,使用快速SDO可以在一个来回之间完成通讯,读写对象超过4字节时需要进行分段传输,流程如下:
快速SDO下载
普通SDO段下载发起
- ccs = 1发起段下载请求
- scs = 3 发起段下载应答
- n 当e和s均为1时有效,其他时候为0,当其有效时代表快速SDO通讯中后4字节数据区中非段数据的字节数。
- e 传输类型
- 0 普通SDO
- 1 快速SDO
- s 数据长度标识
- 0 请求中不包含数据长度
- 1 请求中包含数据长度
- byte4 - byte7
- e = 0, s = 1,4字节表示下载的字节数
- e = 1, s = 1,前4-n字节为被下载的数据
普通SDO段下载
- ccs = 0 段下载请求
- scs = 1 段下载应答
- toggle 反转位
- 第一帧的toggle为0,该位每传输一帧会自动进行反转,发送的请求和接收到的应答中的toggle位应该相同。
- n 7字节中非段数据的字节数
- c 是否还有段需要下载
- 0 还有段需要下载
- 1 没有段需要下载
SDO 段上传
快速SDO上传
普通SDO发起段上传
- ccs = 2 发起段上传请求。
- scs = 2 发起段上传应答。
- n 当e和s均为1时有效,其他时候为0,当其有效时代表快速SDO通讯中后4字节数据区中非段数据的字节数。
- e 传输类型
- 0 普通SDO
- 1 快速SDO
- s 数据长度标识
- 0 请求中不包含数据长度
- 1 请求中包含数据长度
- byte4 - byte7
- e = 0, s = 1,4字节表示上传的字节数
- e = 1, s = 1,前4-n字节为被上传的数据
普通SDO段上传
- ccs = 3 段上传请求
- scs = 0 段上传应答
- toggle 反转位
- 第一帧的toggle为0,该位每传输一帧会自动进行反转,发送的请求和接收到的应答中的toggle位应该相同。
- n 7字节中非段数据的字节数
- c 是否还有段需要上传
- 0 还有段需要上传
- 1 没有段需要上传
SDO 块下载
SDO块下载发起
- ccs = 6 块下载
- scs = 5 块下载
- s 数据长度标识
- 0 请求中不包含数据长度
- 1 请求中包含数据长度
- cs 客户端子命令
- 0 发起块下载请求
- ss 服务端子命令
- 0 发起块下载应答
- sc 服务端CRC支持
- 0 服务端不支持生成CRC
- 1 服务端支持生成CRC
- blksize 客户端可用于发送的每个块中段的数量
SDO子块下载
- 服务端仅在最后一个分段传输完成后会进行应答
- scs = 5 块下载
- ss 服务端子命令
- 2 块下载应答
- seq 段序号 (0 < seq < 128)
- data 最多7字节数据
- ackseq 在上一次块下载期间成功接收到的最后一段的序列号,如果服务端将其设置为0,表明服务端未正确接收到序列号为1的包,客户端需要重新传输所有的分段。
- blksize 客户端可用于发送的每个块中段的数量
SDO块下载结束
- ccs = 6 块下载
- scs = 5 块下载
- s 数据长度标识
- 0 请求中不包含数据长度
- 1 请求中包含数据长度
- cs 客户端子命令
- 1 结束块下载请求
- ss 服务端子命令
- 0 结束块下载应答
- n 最后一个块中最后一个分段里非数据的字节数
- crc 数据集的16位CRC
- x 未使用填0
- sc 服务端CRC支持
- 0 服务端不支持生成CRC
- 1 服务端支持生成CRC
- blksize 客户端可用于发送的每个块中段的数量
SDO 块上传
- 如图所示,上述协议通常用于SDO块上传,协议以发起段上传作为开始。
- 客户端可能会向服务端传递一个最小传输阈值,当传递的数据长度小于或者等于该值时,服务端将会使用普通SDO上传协议或者快速SDO上传协议来进行数据传输。
SDO块上传发起
- ccs = 5 块上传
- scs = 6 块上传
- cs 客户端子命令
- 0 发起上传请求
- 3 开始上传
- ss 服务端子命令
- 0 发起上传应答
- cc 客户端CRC支持
- 0 客户端不支持从数据中产生CRC
- 1 客户端支持从数据中产生CRC
- sc 服务端CRC支持
- 0 服务端不支持从数据中产生CRC
- 1 服务端支持从数据中产生CRC
- pst SDO协议切换阈值
- 0 不允许切换SDO协议
- pst > 0 当传输长度小于等于该值的时候,将使用普通SDO或者快速SDO协议进行传输
- s 数据长度标识
- 0 请求中不包含数据长度
- 1 请求中包含数据长度
- size 上传的数据大小
- 0 保留
- 1 size为上传数据的大小,单位为字节,小端格式
- blksize 每个块允许的最大分段数
- 0 < blksize < 128
SDO上传子块
- ccs = 5 块上传
- cs 客户端子命令
- 块上传应答
- c 表示是否还有段需要被上传
- 0 还有段需要上传
- 1 没有更多的段需要上传,将进入结束块上传阶段
- seqno
- 段序号
- segment data
- 分段数据,最大7字节
- ackseq
- 在上一次块上传期间成功接收到的最后一段的序列号,如果客户端将其设置为0,表明客户端未正确接收到序列号为1的包,服务端需要重新传输所有的分段。
- blksize 每个块允许的最大分段数
- 0 < blksize < 128
SDO块上传结束
- ccs = 5 块上传
- scs = 6 块上传
- cs 客户端子命令
- 1 结束块上传请求
- ss 服务器子命令
- 1 结束块上传应答
- n 最后一个块中最后一个分段中非数据的字节数
- crc 数据集的16位CRC