图23对象字典的结构 对象字典是CANOpen最重要的特性,它将设备的描述标准化。 对象字典中的每一个对象都由16位的索引和8位的子索引来寻址。对于单个的对象字典项子索引总是0.所以一个数据字典最多有65536项。 静态数据类型包含标准数据类型的定义,比如BOOLEAN, INTEGER, floating, string,等。 复杂数据类型包含那些由标准数据类型构成的预定义的数据结构,他们对所有设备都是通用的。 制造商定义的复杂数据类型是由标准数据类型构成的数据结构,但是这些数据类型只是特定的设备使用。 设备子协议可能会为它们的设备定义一些额外的数据类型其中静态数据类型存放在0060-007F,复杂数据类型存放在0080-009F。 通讯子协议区指定了CAN网络的一些参数,它们对所有设备都是通用的。 标准设备子协议区包含了一类设备的所有数据对象。它们可以通过CAN网络读写。 4.2.2数据类型
图24基本的数据类型 CANOpen协议的基本数据类型如图24所列。 4.2.2.1整数的表示方式以INTEGER32为例:b=b0b1…b31
以REAL32为例:b=b0b1…b31
图25对象的基本属性 一个对象有上图所示的6种基本属性。 十六进制的index指示了对象在对象字典中的位置。其中不包含子索引。 Object列指示了对象的类型,如下图所示
Name是用来表示对象作用的文本。 Type指定数据类型。比如Boolean, Usigned8。如果对象是一个复杂类型,比如ARRAY。就会用子索引来指定组成复杂类型的每个基本类型。 Attrbi指定了对象的方位类型。如下图
M/O指定对象是必须的还是可选的。 4.2.4标识身份的对象 对象字典中的对象很多,但有几个是用来识别设备身份的,经常用到。
图26用来身份识别的几个对象
图27 Identity Object的子对象 1008h记录设备的名字,1009h记录设备的硬件版本号,100Ah记录设备的软件版本号。1018h记录了设备的制造商代码,产品号,序列号等。 |
你要想小学生样的理解,那么还是从入门开始吧。
https://wenku.baidu.com/view/dfe7551a195f312b3069a5cd.html
轻松掌握CANOpen最难理解的对象字典
http://blog.csdn.net/bood123/article/details/49835619
CANOpen基本对象字典
另外网上还有一些学习笔记,你也可以多看看
评分
查看全部评分
前提:需要对CAN总线有所了解,可以看CAN2.0总线的资料。
当然,对计算机系统、单片机以及编程也需要有一定的基础。
第一步:CANOpen Standard 301,这个是一切的基础,最然并不一定马上就要对所有的细节了如指掌,但至少对CANOpen总线以及各种传输控制方式以及其作用需要有一定的了解(比如:NMT、SDO、PDO、HeartBeat等等)。这里不推荐看ZLG的文档,ZLG的文档只是从301文档中,抽出的一些章节中的内容,我相信如果直接看ZLG的文档的话,大部分人是看不懂的。
第二步:最后有一个可以玩的硬件(最好是已经移植好CANOpen协议栈的),否则所有的协议只是资料中的数据格式以及操作方式而已。这样就需要有一个开发板和CAN逻辑分析仪工具。还好我在3年前就已经自己做过一块低成本的CAN的开发板(基于AT90CAN32),并且在这个开发板上实现了基于串口的CAN适配器(可以用于发送各种CAN数据),同时,也在这块板上实现了CANOpen。目前taobao上也有很多种类的CAN开发板和适配器。
在这个硬件上,测试各种CANOpen报文,包括NMT、SDO、PDO,可以远程设置HeartBeat频率,看看收到的HeartBeat报文等。这步完成后,对于CANOpen就有了一定的认识了。对于各种报文,这里要推荐一下ZLG的文档,最后部分对CANOpen的各种报文的格式做了一个总结,查看起来非常方便。
第三步:找个CANOpen的协议栈源码看看,从代码层次来理解CANOpen的各种操作的步骤以及实现方式。当然,目前协议栈也有不少了,有些是免费的,有些是收费的(估计价格还都不便宜)。
第四步:301文档只是描述了CANOpen有那些工具可以使用,但没有任何关于一个模块如何利用这些功能的信息。这样就要看一下CANOpen的各个模块的文档,比如401--I/O模块。不过,并不是所有的这些文档都是免费公开的,可能有些是需要$$才能得到的。
背景:CANopen四问
1. CANopen的起源,CANopen从何而来?
德国Bosch公司于1983年研发CAN协议,用于汽车传动系统的网络通讯。之后称为国际标准ISO11898,目前CANopen由非营利组织CiA(CAN in Automaion)进行标准的起草及审核工作,基本的 CANopen 设备及通讯子协定定义在 CAN in Automation (CiA) draft standard 301. 中。针对个别设备的子协定以 CiA 301 为基础再进行扩充,如针对 I/O 模组的 CiA401 及针对运动控制的 CiA402。
2. CANopen硬件的优势?
CAN协议最大的突出特点是错误检测,限制和处理。当CAN设备检测到总线错误时,会拒绝之前接收到的位序列,然后发送“错误帧”,其完全由CAN芯片本身处理,不需要人为编程。
支持多主站,类似Profibus DP,总线上每个设备都是主站,也是从站,免除了人为仲裁的过程,方便用户开发。
报文短帧结构,CAN报文通常只有8个字节,数据帧非常短,在抗干扰能力上具有先天的优势。解释一下,为什末短帧结构抗干扰好?如果通讯报文长,发送一帧耗时也就长,加入遇到干扰,辛辛苦苦好不容发送了一条报文,结果因为干扰对方还没有收到,只能嚎啕大哭。
成本低廉,CAN外设基本在现在主流芯片上都可以找到,20几块钱的MCU都支持CAN外设,有的还支持两个CAN。这里有CiA的积极推广作用。
3. CANopen软件优势?
CANopen主要有CiA在推广,是非盈利组织,CANopen协议资料,网上一堆,任何人都可以下载到,我们常用的DS301(Draft Standand),DS402,CAN粉丝几乎人手一本,犹如葵花宝典,一定要珍藏一本。
CANopen协议开发,开源项目非常多,CanFestival就是其中一个,我做过移植,在步科MT4414TE-CAN触摸屏,用在8位单片机上,此源码有点耗费资源,网上有很多基于MCU的精简源码。
开发完整的CANopen协议栈,是很艰辛的工作,想要做好非常难。难点就在于你对CANopen协议的理解上,比如EMCY,复位节点,是否需要“NO Initialization”,heartbeat,Node guard是否需要?如何处理?这条不能算是其优点。
4. 为什么如此多公司在推广CANopen?
CANopen对于运动控制来说是一款优秀的通讯协议,采用了面向对象的一些设计思路,比如对象字典,过程数据对象(PDO),服务数据对象(SDO)等等。
CANopen在欧洲已成为最普通的协议,任何一家自动化公司都有CANopen的通讯接口,也成了低配。低配并不代表不好,只是说明其性价比更高。CANopen定义了完整的同步控制机制,使其成为主流的运动控制协议,除了在CAN总线上运行外,还被搬到了以太网上(CANopen over Ethernet),形成了著名的PowerLink,EtherCat工业以太网协议。
在这里多废话几句,所谓的运动控制总线标准,没有多大意义,因为运动控制技术都掌握在各个厂商手里,每一个稍微大一点的厂商,都有自己的专用运动控制协议,如三菱的SSCNET,安川的MECHATROLINK,倍福的CANOPEN以及EtherCat,施耐德的CANopen,西门子的SiMotion,贝加莱的PowerLink,博世力士乐的SERCOS。
由于CANopen(可以看DS402,伺服控制标准)在运动控制的优势,尤其是同步控制,不管几流的厂商,在运动控制系统中,多多少少都加入了自己的东西,导致运动控制系统通常是封闭的,很少走互联路线,事实上要做到互联也非常困难。
二三流厂家,开发自己的CANopen协议,根据自己的需求,将其移至到不同的物理层上去运行,形成自己的运动控制系统,其性能优劣就在于其对CANopen协议的理解程度了。
基础:CANopen世界里的九个晦涩概念
1. DCF
是CAN网络的配置(Config)的数据存档文件。其作用不大,在Codesys软件里就有此选项。
2. EDS
电子数据表格,是描述一台从站设备的属性,参数的文件,是对从站设备对象字典的描述。比如一台伺服驱动器,如果其内部参数(每个参数对应对象字典中的一个位置,由index,sub-index决定)没有更改,其对应的EDS文件就不会更改。多说一句,不是所有的主控制器都需要使用EDS,比如Beckhoff就不需要,他需要你对CANopen DS301,DS402足够熟悉,人工对齐配置;步科FD,JD伺服按照DS402标准制定EDS文件,用户可直接配置,降低开发周期。
3. 复位节点
当设备遇到异常(如从站断线后重连,使用M258测试步科FD伺服),主控会发送“复位节点”,步科的ED伺服复位节点,驱动器恢复出厂值,而且连CAN通讯参数也恢复成默认值。FD,JD伺服是除了CAN通讯参数外,其他配置参数恢复出厂值。
4. EMCY
紧急报文,从站如伺服,在断电后会发送一条紧急报文,告诉主控其状态,一般伺服断电后,其电容电量能保证其发送该条报文。
5. 心跳,节点保护
配置心跳参数,设置心跳周期,心跳消费时间,这个消费者时间实际上是作为一个超时参数。主站收到一个心跳后,开始计时,如果在超时时间内没有收到下一个心跳,则认为从站离线,并报告错误,按照用户配置的错误处理方法处理。
网络中的每个节点都可以配置心跳,主站可以监听从站,从站可以监听主站,从站还可以监听从站。这里有一个生产者、消费者的概念,总线上的设备定义自己是心跳的生产者,还是消费者。生产者产生心跳,消费者监听心跳,然后在捕捉到异常后�做出对应的处理。
个人认为心跳作用不大,假设某个设备断线,重连后复位节点,而此设备刚好是使用了原点功能的伺服呢?断电上电后,原点位置改变。所以在一些客户应用中,出现此情况,小伙子,你麻利的,赶快断电重启吧。
节点保护,其作用类似心跳,但可以读取从站设备的CANopen通讯状态(初始化,预操作,操作中,停止),属于DS301的范畴。
6. DS301和DS402的区别
DS301就是一个通讯协议栈,DS402是建立在DS301的上层协议,属于伺服类的控制协议,协议中规定好每个对象字典值得作用,比如0x6040,是控制字。DS402把一个伺服应该具有的功能都定义好了,开发厂家按照协议定义即可。
7. 对象字典
从软件的角度来说,对象字典本质就是一些数据结构的集合。可以这么理解,把对象字典看做是一本书,CANopen设备的行为准则是要参考这本书的,不管它做什么,只要它的行为要参考对象字典,就必须先查阅字典,再决定要不要做。比如它什么时候发送TPDO,这个行为是需要查询对象字典中对应于TPDO的传输类型以及Event timer。还有就是像PDO映射的原理,比如我要发送的数据,都是去查询这本书,看下它那里写的什么内容,然后我在把这部分内容以PDO的形式发送出去。
例如你的程序收到了一笔CAN报文,由于可以访问对象字典的对象是SDO,首先要判断它是SDO对象,那么你的程序就需要按照SDO中指定的索引和子索引去查找对象字典(一个排好序的数据结构集),找到相应的对象后按照SDO中的指令去操作这个对象,例如把一个值赋给字典中的变量。
8. SDO
这个很简单,就是类似串口的一发一回模式,主站发送请求帧,从站回复应答帧。
大家看几个例子就明白了。
To write the 1 byte data : 0xFD in the object dictionary of node 5, at index 0x1400, subindex 2, sends :
605 2F 00 14 02 FD 00 00 00
If success, the node 5 responds :
585 60 00 14 02 00 00 00 00
To write the 4 bytes data : 0x60120208 in the object dictionary of node 5, at index 0x1603, subindex 1, sends :
605 23 03 16 01 08 02 12 60
If success, the node 5 responds :
585 60 03 16 01 00 00 00 00
9. PDO
分为TX-PDO,RX-PDO。
上图,这就是PDO的配置过程,0x1402(接收PDO通讯参数),PDO使用的cob-id,传输类型,Inhibit time,EventTimer。
0x1602(映射对象),上例中映射为Controlword,Target position。
这里着重讲一下Transmission Type,上述是codesys中支持的集中方式:
acyclic sync(数值为0):同步PDO,同步方式由具体设备协议定义
Cyclic sync(数值为1-240):同步PDO,每个N个SYNC周期后,发送PDO
Sync rtr(数值253):同步PDO,收到远程帧请求后发送PDO
Async(数值253):异步PDO,收到远程帧后发送PDO
最后两个Async(254,255),都是设备厂家定义的,也是大家最常用的,当事件发生时发送。各个厂家在这里基本都是使用数据变化时发送方式,FD,JD伺服两种方法是一样的,都是数据变化发送。要注意设置“禁止时间”,降低CANOPEN通讯带宽。
具体案例
主控制器写target position,mode of operation给伺服,此PDO的cob-id为0x200 node id。传输方式为255或者254,禁止时间为100,也就是10ms。
评分
查看全部评分
资料可以
谢谢分享
能有帮助就好
想问下,SDO例子中(如下),第二个字符,就在ID之后那个数:2F/60/23/60,的意义是什么?
To write the 1 byte data : 0xFD in the object dictionary of node 5, at index 0x1400, subindex 2, sends :
605 2F 00 14 02 FD 00 00 00
If success, the node 5 responds :
585 60 00 14 02 00 00 00 00
To write the 4 bytes data : 0x60120208 in the object dictionary of node 5, at index 0x1603, subindex 1, sends :
605 23 03 16 01 08 02 12 60
If success, the node 5 responds :
585 60 03 16 01 00 00 00 00
我以 605 2F 00 14 02 FD 00 00 00为例告诉你什么意思。
写一个字节的数据0XFD到节点5的的对象字典的主索引1400 子索引02的位置
那么605 23 03 16 01 08 02 12 60的意思就是写4个字节00 00 00 00的数据到节点5的主索引1603 子索引01的位置拆分之后就报文就是这个意思
605 COB_ID(600)+NODE_ID 05
2F 表示写一个字节
00 14表示主索引14 00
02 表示子索引 01
FD 要写的数据
00 00 00 把8个字节补齐。
剩下的自己找点资料再好好理解一下应该就能掌握SDO如何使用了