| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 学习CANopen --- [5] SDO -> 正文阅读 |
|
[Python知识库]学习CANopen --- [5] SDO |
文章目录前言SDO是Service Data Object的缩写,中文叫服务数据对象,关键是这个服务二字,指的是读写服务,Client可以通过SDO读写Server里的对象字典(Object Dictionary,简称OD) OD存在于Server中,用户在和Server通信之前,也会有一份相同的OD表,不然没法继续操作。如果用户想读写OD里的值,那么就可以使用SDO。 PS:要记住:用户是Client,CANOpen设备是Server;如果2个CANOpen设备间互相通信,那么发起通信的那个就是Client,这里统一使用Client指代 一 工作原理SDO的收发有点像TCP,读写请求发送出去后必须要有一个来自Server的应答,如下图 Client一般都会设置个SDO超时时间,如果在规定时间内没有收到应答,Client这边就会报错。 PS:CANOpen文档里读叫upload,写叫download,感觉是从Server角度来看的 二 使用范围只有当Server处于Pre-Operational和Operational状态下,Client才可以使用SDO去和Server通信,如下图, 关于状态切换,请查看讲NMT的那篇文章。 三 例子下面讲例子,实战可以让理解更加深入,首先使用pythonCANOpen来创建2个文件:server.py和client.py,如下,
client.py如下,
PS:eds文件来自这个 然后创建vcan0,
创建好之后开一个终端,然后使用candump进行观察,
最后是运行,先运行server.py,
接着运行client.py,
client运行结束后,观察得到的CAN报文如下,有三组,注意数字都是16进制, 1. COB-ID分析先看606和586,这2个是SDO报文的COB-ID,
PS:0x600号0x580是专属于SDO的,且是固定的 2. 报文内容分析 — 读操作报文内容的基本结构如下,发送和接收的报文结构一样,
命令提示符例子中第一个SDO报文是读取字典项0x2341_02,读操作对应的CS字节如下,注意这是一个字节, Server返回报文的CS值则需要考虑被读字典项的数据类型,n, e, s的含义如下, 例子中返回的CS是0x4B,转为二进制后得出:n值为10b,十进制数字为2,e=1b,s=1b,根据上述含义可以得出:
然后打开eds文件,找到0x2341_02对应的描述,如下, 索引和子索引字节1的值为0x41,字节2的值是0x23,从右往左读就是0x2341,即字典项的索引 字节3的值是0x02,也就是字典项的子索引 发送报文和返回报文在字节1~3写入的都是相同的索引和子索引 报文中的数据值发送报文的最后四个字节都是0,因为是读,这4个字节都是无意义的,虽然无意义,但是还是要传输,所以就写0 返回报文里字节5的值为0x7F,字节4的值为0xFF,合起来就是0x7FFF,与EDS文件里看到的这个字典项对应的默认值相同 3. 报文内容分析 — 写操作写操作的内容结构和读一样, 命令提示符写操作的CS值如下, 返回报文的CS值则是固定的0x60,表示写入OK 索引和子索引与读操作相同,就是把0x2341_02写入到字节1~3里 报文中的数据值由于是写,所以在发送报文的字节4~5里填入期望的目标值,这里是0x123,字节4是0x23,字节5是0x01,字节6和7则为0 在返回报文里字节4~7都是无意义的,虽然无意义,但是还是要传输,所以都写0 3. Segment传输前面的读写操作都是expedited传输,即一个来回就能传输完成,要求数据长度<=4字节,但有的字典项长度是大于4字节的,这样一次就无法传输完成,此时就需要Segment传输,也叫段传输 在eds文件里,字典项0x1009的默认值超过了4,其数据类型是0x0009,即Visible String,
运行client.py后观察到的报文如下,2道橘黄色的横线之间是一次收发, 读的发起第一次收发是读的发起,其CS含义如下,
读的数据传输剩余的5次收发就是读的数据传输,其CS值定义如下, Server返回的报文里,除了t,还有n和c,字面意义也比较好理解,要注意这里的n是3个bit,expedited传输里n是2个bit。 只要不是最后一次收发,那么n和c都为0,CS值在0x00和0x10间互相变化,第一次是0x00;每次能传输7个字节,4次收发传了28个字节; 第6次收发是最后一次,此时还剩32-28=4个字节,那么n就为3,即011b,c为1,即1b,组合在一起是0111b,另外此次的t是0b,那么最后一次返回的报文的CS就是0x07 写的发起和数据传输写也是类似,分为写的发起和写的数据传输,分别对应下面2张图
运行client.py后观察得到的can报文如下, 4. Block传输由于pythonCanopen库暂时不支持block传输,所以先等等… 5. AbortServer和Client都可以发送abort报文来中断报文传输,其CS值定义如下, 四 总结本文讲述了SDO报文的含义和实践,通过例子+理论,可以更加深刻的理解SDO及其用途。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 16:48:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |