SDO块传输通信详解

7 篇文章 0 订阅
订阅专栏

这篇文章主要是记录CANopen 块传输协议的基本思路,具体代码各位可以根据思路跟进源码阅读,这里只贴出主要内容代码~

目录

1.块上传详解(读取)

1).主节点:发送读取数据初始化

2).从节点:服务器端响应”需要读取的总数据包字节数” 

3).主节点:收到响应后,发送命令,表示可以开始传输了

4).从节点:开始循环向主节点发送数据包

5).主节点:告诉从节点,我收到了多少条包!

6).从节点:告诉主节点,已经发送完毕

7).主节点:告诉从节点,我也接收完毕了,整个传输完成!

2.块下载详解(写入)

1).主节点:告诉从节点我要写入多少个字节数

2).从节点:我准备好了,可以写入数据

3).主节点:收到响应后,开始逐条发送数据,无需响应

4).从节点:告诉主节点我收到了多少条

5).主节点:告诉从节点,写入完毕!

6).从节点:告诉主节点,我知道写入完毕了


1.块上传详解(读取)

这里以图2为例子, 进行说明

假设主节点为01,待读取节点为0x1b

读取的数据是

 UNS8 g_upgrade_buf_appbin[258]="bbbcccddd111222333444555666777888999AAA\0";

/* Mapped at index 0x2007, subindex 0x01 */

1).主节点:发送读取数据初始化

发送:

A0 07 20 01 10 00 00 00

data[0] = (5 << 5) | SDO_BCS_INITIATE_UPLOAD_REQUEST;

data[1] = index & 0xFF;        /* LSB */

data[2] = (index >> 8) & 0xFF; /* MSB */

data[3] = subIndex;

data[4] = SDO_BLOCK_SIZE;

for (i = 5 ; i < 8 ; i++)

data[i] = 0;

2).从节点:服务器端响应”需要读取的总数据包字节数” 

接收:

C2  07 20 01 27 00 00 00

data[0] = (6 << 5) | (1 << 1) | SDO_BSS_INITIATE_UPLOAD_RESPONSE;

data[1] = index & 0xFF;        /* LSB */

data[2] = (index >> 8) & 0xFF; /* MSB */

data[3] = subIndex;

data[4] = (UNS8) nbBytes;

data[5] = (UNS8) (nbBytes >> 8);

data[6] = (UNS8) (nbBytes >> 16);

data[7] = (UNS8) (nbBytes >> 24);

3).主节点:收到响应后,发送命令,表示可以开始传输了

发送:

A3 00 00 00  00 00 00 00

data[0] = (5 << 5) | SDO_BCS_START_UPLOAD;

for (i = 1 ; i < 8 ; i++)

data[i] = 0;

4).从节点:开始循环向主节点发送数据包

接收:

01 62 62 62 63 63 63 64

02 64 64 31 31 31 32 32

03 32 33 33 33 34 34 34

04 35 35 35 36 36 36 37

05 37 37 38 38 38 39 39

86 39 41 41 41 00 00 00

data[0] = SeqNo;

err = lineToSDO(d, line, 7, data + 1);

5).主节点:告诉从节点,我收到了多少条包!

发送:

A2 06 10 00  00 00 00 00 

data[0] = (5 << 5) | SDO_BCS_UPLOAD_RESPONSE;

data[1] = d->transfers[line].seqno;

data[2] = SDO_BLOCK_SIZE;

data[3] = data[4] = data[5] = data[6] = data[7] = 0;

6).从节点:告诉主节点,已经发送完毕

接收:

Cd 00 00 00 00 00 00 00

data[0] = (6 << 5) | ((d->transfers[line].endfield) << 2)|SDO_BCS_END_DOWNLOAD_REQUEST;

for (i = 1 ; i < 8 ; i++)

data[i] = 0;

7).主节点:告诉从节点,我也接收完毕了,整个传输完成!

发送:

A1 00 00 00  00 00 00 00

data[0] = (5 << 5) | SDO_BCS_END_UPLOAD_REQUEST;

for (i = 1 ; i < 8 ; i++)

data[i] = 0;

2.块下载详解(写入)

 

图3

这里以图3为例子, 进行说明

假设主节点为01,待写入节点为0x1b

假如待写入的数据是

UUNS8 write_net_block_buf[] =  "0123456789aaabbbcccddd\0";

/* Mapped at index 0x2007, subindex 0x01 */

 

1).主节点:告诉从节点我要写入多少个字节数

发送:

C2 07 20 01 18 00 00 00

buf[0] = (6 << 5) | (1 << 1 );   /* CCS = 6 , CC = 0 , S = 1 , CS = 0 */

buf[1] = index & 0xFF;        /* LSB */

buf[2] = (index >> 8) & 0xFF; /* MSB */

buf[3] = subIndex;

for (i = 0 ; i < 4 ; i++)

buf[i+4] = (UNS8)((count >> (i<<3))); /* i*8 */

2).从节点:我准备好了,可以写入数据

接收:

A0 07 20 01 10 00 00 00

data[0] = (5 << 5) | SDO_BSS_INITIATE_DOWNLOAD_RESPONSE;

data[1] = (UNS8) index;        /* LSB */

data[2] = (UNS8) (index >> 8); /* MSB */

data[3] = subIndex;

data[4] = SDO_BLOCK_SIZE;

data[5] = data[6] = data[7] = 0;

3).主节点:收到响应后,开始逐条发送数据,无需响应

发送:

01 30 31 32 33 34 35 36

02 37 38 39 61 61 61 62

03 62 62 63 63 63 64 65

84 64 00 00 00 00 00 00

当实际发送字节大于7个字节时:

data[0] = SeqNo;

err = lineToSDO(d, line, 7, data + 1);

剩余的小于7个字节的发送时:

data[0] = 0x80 | SeqNo;

err = lineToSDO(d, line, nbBytes, data + 1); //实际的剩余字节

for (i = nbBytes + 1 ; i < 8 ; i++) //多余的空间填0

 data[i] = 0;

4).从节点:告诉主节点我收到了多少条

接收:

A2 04 10 00 00 00 00 00

data[0] = (5 << 5) | SDO_BSS_DOWNLOAD_RESPONSE;

data[1] = d->transfers[line].seqno;

data[2] = SDO_BLOCK_SIZE;

data[3] = data[4] = data[5] = data[6] = data[7] = 0;

5).主节点:告诉从节点,写入完毕!

发送:

D1 00 00 00  00 00 00 00

data[0] = (6 << 5) | ((d->transfers[line].endfield) << 2) | SDO_BCS_END_DOWNLOAD_REQUEST;

for (i = 1 ; i < 8 ; i++)

data[i] = 0;

6).从节点:告诉主节点,我知道写入完毕了

将传输结构体里面的数据拷贝到数据字典里,并复位SDO传输!

接收:

A1 00 00 00 00 00 00 00

data[0] = (5 << 5) | SDO_BSS_END_DOWNLOAD_RESPONSE;

for (i = 1 ; i < 8 ; i++)

data[i] = 0;

canopen服务器协议,CANopen 传输通信详解
weixin_39640090的博客
08-05 961
CANopen 传输通信详解1.上传详解(读取)这里以图2为例子, 进行说明假设主节点为01,待读取节点为0x1b读取的数据是UNS8g_upgrade_buf_appbin[258]="bbbcccddd111222333444555666777888999AAA\0";/* Mapped at index 0x2007, subindex 0x01 */1).主节点:发送读取数据初始化发送...
CANopen中SDO、PDO字典以及COB-ID理解
热门推荐
sunarmy的专栏
01-12 1万+
CANopen SDO PDO
SDO概述
03-27
NULL 博文链接:https://holdbelief.iteye.com/blog/1186874
Ethercat总线学习:CAN、CANopen、EtherCAT、PDO与SDO
最新发布
木牛的博客
08-01 802
EtherCAT的解决方法就是,所有的节点使用一个数据帧,主站发出数据帧后,所有的从站会在飞行中处理数据,读取自己需要的,塞入自己需要返回的数据,然后继续把数据帧继续向下传输,直到碰到最后一个节点,利用Ethernet的全双工特性再将数据返回给主站。前面提到,因为EtherCAT数据帧的独特设计,有效数据率非常高,所以在工业自动化领域可以充分利用起来Ethernet的百兆带宽,实际上百兆带宽也可以让非常多的电机实现1ms的通信周期,例如正运动家就有128轴的控制器。机制实现数据的读取和写入。
SDO
abcdzt
08-20 400
数据对象是SDO框架的核心。数据对象是一个业务对象的一般表达,并且没有和特殊的持久化存储机制绑定。 数据图是一个相关数据对象的集合。在SDO1.0里,一个数据图总是被一个DataGraph信封对象所包装,而在SDO.0里,数据对象图可以存在于DataGraph之外。(数据图)Data graph作为两个单词分开使用时,指任何一个数据对象集合;(数据图)DataGraph作为一个单一单词使用时...
Transport Block Size, Throughput and Code rate-----http://www.simpletechpost.com/2012/12/transport-b...
weixin_34130389的博客
10-07 249
Transport Block Size, Throughput and Code rate Since the size of transport block is not fixed, often a question comes to mind as to how transport block size is calculated in LTE.BackGroundIf we ...
基于STM32F4的CANopen快速SDO通信(超级详细)
qq_37662088的博客
03-03 1万+
本教程是基于STM32F4的CANopen快速SDO通信教程。 .
认识SDO
weixin_30679823的博客
08-20 97
待更 转载于:https://www.cnblogs.com/neversayno/p/5790293.html
CANopen工业协议中的SDO数据传输方式详解
# 1. 简介 ## 1.1 CANopen工业协议概述 CANopen是基于CAN总线的高级通信协议,广泛应用于工业控制系统中。...SDO在CANopen中扮演着至关重要的角色,它为实时数据通信和控制提供了基础支持。通过SDO
PDO与SDO实例详解:数据传输与对象字典构建
总结来说,PDO和SDO都是为了简化设备间的通信,提高效率和可扩展性。它们通过标准化的对象字典和明确的通信协议,使得数据的交换更为有序,有助于构建灵活、可靠的工业控制系统。无论是PDO的生产者/消费者模型还是...
SDO实例详解:机械工程中CANopen数据传输工作流程
通过这篇文章的学习,读者不仅能掌握SDO的基本概念,还能了解到如何在实际的CANopen网络环境中运用SDO技术来管理节点间的通信。这对于从事机械工程或自动化领域的工程师来说,是一项重要的技能。
带你了解SDO
10-25
SDO是soq的一个标准,对sao的概述等
PIC单片机双机异步通信程序详解
07-19
### PIC单片机双机异步通信程序详解 #### 一、基础知识介绍 在深入了解具体的程序之前,我们先来简要回顾一下相关的基础知识。 - **单片机**:单片机是一种集成微处理器、存储器及多种接口电路于一体的微型计算机...
服务数据对象简介
吾本布衣 隐于三秦
12-24 1215
服务数据对象(Service Data Objects,SDO) 是BEA 和 IBM 最近共同发布的一项规范,而且它正由JSR-235专家组进行标准化以通过JCP(Java 标准化组织)的审核。SDO是Java平台的一种数据编程架构和API,它统一了不同数据源类型的数据编程,提供了对通用应用程序模式的健壮支持,并使应用程序、工具和框架更容易查询、读取、更新和检查数据。关于SDO架构的高级概述
SDO 简介
aitaji9988的博客
05-30 2464
SDO 简介 SDO 简介 服务数据对象(Service Data Objects,SDO) 是BEA 和 IBM 最近共同发布的一项规范,而且它正由JSR-235专家组进行标准化以通过JCP(Java 标准化组织)的审核。SDO是Java平台的一种数据编程架构和...
04_服务数据对象(SDO)
zaichen321的博客
02-17 2218
SDO
CANOpen SDO
qq_36115224的博客
03-05 1169
普通SDO(分段传输)进行下载和上传服务时,应用程序负责将SDO作为一个分段序列进行传输。与此同时,快速SDO也应当得到支持。如果传输的数据长度大于4字节,则应支持SDO分段传输。当使用SDO下载和SDO上传服务时,应用程序负责将负责将数据作为一个的序列传输
SDO处理过程(一)
tangtang_yue的博客
06-23 3082
/* the last SDO is still in work */           return MBXERR_SERVICEINWORK;       }   #endif   /*根据SDO的不同的服务类型,选择想对应的SDO服务*/       switch (command)       {       case SDOSERVICE_INITIATEDOWNLOAD
SDO简介
吾本布衣 隐于三秦
12-24 3298
简单地说,SDO是一种数据应用程序开发框架,它包括一个体系结构和相应的 API。SDO 能够实现以下操作: 简化 J2EE 数据编程模型。 抽象面向服务体系结构(SOA)中的数据。 统一数据应用程序的开发。 支持和集成 XML。 结合 J2EE 模式和最佳实践。 在这篇介绍 SDO 框架的文章中,我们将尝试着解释 SDO
写文章

热门文章

  • STM32F407串口收发数据代码实现(标准库) 2923
  • STM32 RTC设置时钟时,用BCD码设置和BIN码设置有什么区别 2033
  • STM32 HAL库RTC根据时间戳计算当前时间方法 1919
  • Canopen学习笔记——sync同步报文增加数据域(同步计数器) 1847
  • LVGL学习笔记——长按弹出按键,短按按键消失 1749

分类专栏

  • LWIP 1篇
  • STM32 11篇
  • CanOpen 7篇
  • LVGL学习笔记 2篇
  • 传感器 1篇
  • 编程语言 2篇
  • QT 2篇

最新评论

  • Canopen学习笔记——canfestival分段sdo下载

    断奶小鲁班: 是的,之前不知道怎么实现,现在已经实现了。感谢表情包

  • Canopen学习笔记——canfestival分段sdo下载

    码农江_一叶知秋: 这个肯定会用到啊,比如主机给你写某个参数的时候,写成功之后就会立马执行一个回调函数然后去启动电机或者停止电机之类的,这个都是可以通过添加SDO写操作的回调函数去实现的

  • Canopen学习笔记——canfestival分段sdo下载

    断奶小鲁班: 好嘞,还有一个问题请教下您。您有使用过它里面的回调函数吗?比如我在接收到一个数据后触发一次回调函数

  • Canopen学习笔记——canfestival分段sdo下载

    码农江_一叶知秋: 这个协议栈已经实现了的,你只需要把数据字典那个表配置好,接口什么的写好就可以了

  • Canopen学习笔记——canfestival分段sdo下载

    断奶小鲁班: 对呀,那是不是下载可以由客户端发起,但是上传只能由服务器自己判断发起,不知道这个canfestival库有没有实现。我是没找到在哪表情包

大家在看

  • 物理学基础精解【115】 444
  • 【产品经理修炼之道】-SaaS创业路线图(九):怎样的竞争策略最聪明? 170
  • 单元测试方法及其运用
  • 【Markdown速成】半小时入门Markdown(后缀.md文件详解)
  • 大模型算法岗常见面试题100道(值得收藏)非常详细收藏我这一篇就够了

最新文章

  • GD32F470 FREERTOS + lwip UDP丢包问题解决
  • SDIO CMD & 数据部分 CRC 计算规则
  • STM32下载仿真时候出现NO UNLINK DEVICE FOUND问题的解决
2024年9篇
2023年20篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家浙江省玻璃钢雕塑定制玻璃钢素描雕塑新密肖像玻璃钢雕塑和田气球商场美陈哪家好安庆商场春节美陈天津玻璃钢雕塑设计安装济南商场美陈费用陕西优质玻璃钢景观雕塑周口校园玻璃钢景观雕塑小品濮阳玻璃钢雕塑车玻璃钢雕塑定制厂家常用商场美陈生产公司中山玻璃钢雕塑价格表玻璃钢造型雕塑价位山东景观玻璃钢雕塑制作山西玻璃钢雕塑设计玻璃钢雕塑作品教程超大玻璃钢花盆图片玻璃钢雕塑哪里最多山东玻璃钢仿真水果雕塑厂家玻璃钢卷轴雕塑图片池州景区玻璃钢雕塑批发平凉玻璃钢雕塑多少钱天津玻璃钢雕塑场池州商场开业美陈重庆双桥玻璃钢仿铜雕塑肇庆品质玻璃钢人物雕塑海丰雕塑玻璃钢雕塑厂家郑州步行街玻璃钢雕塑黄梅玻璃钢造型雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化