CANopen协议详情讲解.docx
《CANopen协议详情讲解.docx》由会员分享,可在线阅读,更多相关《CANopen协议详情讲解.docx(30页珍藏版)》请在冰豆网上搜索。
CANopen协议详情讲解
根据DS301的内容进行介绍
1、CAN总线
CAN标准报文
2、CANopen应用层协议
CANopen协议不针对某种特别的应用对象,具有较高的配置灵活性,高数据传输能力,较低的实现复杂度。
同时,CANopen完全基于CAN标准报文格式,而无需扩展报文的支持,最多支持127个节点,并且协议开源。
一个标准的CANopen节点(下图),在数据链路层之上,添加了应用层。
该应用层一般由软件实现,和控制算法共同运行在实时处理单元内.
一个标准的CANopen节点
CANopen应用层协议细化了CAN总线协议中关于标识符的定义.定义标准报文的11比特标识符中高4比特为功能码,后7比特为节点号,重命名为通讯对象标识符(COB-ID)。
功能码将所有的报文分为7个优先级,按照优先级从高至低依次为:
网络命令报文(NMT)
同步报文(SYNC)
紧急报文(EMERGENCY)
时间戳(TIME)
过程数据对象(PDO)
服务数据对象(SDO)
节点状态报文(NMTErrControl)
7位的节点号则表明CANopen网络最多可支持127个节点共存(0号节点为主站)。
下表给出了各报文的COB-ID范围。
NMT命令为最高优先级报文,由CANopen主站发出,用以更改从节点的运行状态。
SYNC报文定期由CANopen主站发出,所有的同步PDO根据SYNC报文发送。
EMERGENCY报文由出现紧急状态的从节点发出,任何具备紧急事件监控与处理能力的节点会接收并处理紧急报文。
TIME报文由CANopen主站发出,用于同步所有从站的内部时钟.
PDO分为4对发送和接收PDO,每一个节点默认拥有4对发送PDO和接收PDO,用于过程数据的传递。
SDO分为发送SDO和接收SDO,用于读写对象字典。
MTErrorControl报文由从节点发出,用以监测从节点的运行状态.
状态机
CANopen的每一个节点都维护了一个状态机。
该状态机的状态决定了该节点当前支持的通讯方式以及节点行为。
初始化时,节点将自动设置自身参数和CANopen对象字典,发出节点启动报文,并不接收任何网络报文。
初始化完成后,自动进入预运行状态.在该状态,节点等待主站的网络命令,接收主站的配置请求,因此可以接收和发送除了PDO以外的所有报文.
运行状态为节点的正常工作状态,接收并发送所有通讯报文。
停止状态为一种临时状态,只能接收主站的网络命令,以恢复运行或者重新启动.
CANopen节点状态转换图
CANopen节点状态转换条件
3、DeviceModel
Communication提供通信对象和传输经过底层的数据的适当功能;
ObjectDictionary对此设备上的应用程序对象,通信对象和状态机的行为有影响的所有数据项的集合。
Application由在处理环境方面的设备功能组成.
设备应用在数据条目中的完整描述在对象字典中叫设备子文件(deviceprofile)
4、OD
每个节点维护一个对象字典(ObjectDictionary,OD)。
该对象字典保存了节点信息、通讯参数和所有的过程数据,是CANopen节点的核心数据结构.上层应用程序也主要通过读写对象字典和CANopen应用层进行交互。
CANopen对象字典为两级数组结构,通过索引(16bits)和子索引(8bits)来编址。
设备子文件中最重要的就是对象字典的描述,对象字典在slave节点中一般是在设备初始化写好的不会修改,而在master节点中可以在运行过程中动态修改,不修改的OD一般存在ROM中,而修改的存在RAM中.
由于它是由16bits的位索引,所以最多有65536个entries.
根据节点所支持的通讯方式,每一个节点都必须实现1000h~1FFFh当中的一个必要子集,同时实现6000h以上部分的数据区。
数据区大小由节点的功能自行决定。
1000h以下部分所有的节点都不需实现。
对象字典作为在CAN总线上连接application和通信的媒介,其允许来自application数据在CAN网络上进行交换.CANopen定义了可以进入对象字典的服务和通信对象.每一个入口通过索引和子索引来编址。
在一个主索引里中的子索引入口的类型和属性可能会变化.
5、PDO
数据处理对象(PDO)特别适合快速的数据处理传输。
通信模块针对这些数据
处理对象定义了一个PDOproducer和一个或多个PDOconsumers.
PDO的传输是由事件触发的,这样的事件可以是代表一个PDO变量的变化;可
以是时间的过期或者是接收到一个特定的消息。
过程数据直接在一个CAN消息中传输而不需要协议头文件。
一个PDO的长度是在0到8个字节之间。
PDOs包含在其映射参数和通信参数中。
TPDOs和RPDOs的最大的数可以被定义为512。
一个简单的CANopen设备一般支持4个PDOs。
实际当中,对一个具体的CANopen
设备而言,其PDOs的个数由应用层或设备profile来决定的。
3。
1PDO的结构-映射参数
在对象词典中一个PDO由临近的条目构成。
所谓的映射参数定义了这些条目的
连接.一个映射参数通过索引、分索引和位数定义数据源.
例如:
一个CAN消息最多有8个字节。
这意味着当使用一个PDO时,在一个PDO中发送
8个字典的对象条目。
3。
2PDO的结构—通信参数
为了传输一个PDO,通信参数定义了传输的性质和CAN标识符(CANidentifier).
PDO通信参数是在对象词典的条目
(RPDOs:
index0x1400–0x15FF,TPDOs:
0x1800—0x19FF)
如果允许,映射参数在数据服务对象帮助下可以通过CAN修改。
3.2COB—ID(CAN标识符,分索引1)
COB—ID作为身份证明,PDO的优先权在总线入口(access)之前。
对于每一个
CAN消息来说只允许有一个发送者(生产者)。
然而,对这个已存在的消息来
说其允许多个接收者(消费者).
位30=0,著对这个PDO来说一个远程发送请求(RTR)是被允许。
3.3PDO连接的例子
设备A的输入2和3被转移到设备B的输出1和3。
两个设备都支持完全映射。
传输和接收都是PDOs使用的是相同的标识符0x01C0.因此设备B自动的接
收由设备A发送的PDO。
设备B作为接收者根据映射原理分析数据:
它传递
第一个字节到输出1,传递第二个字节到输出3.在另一方面,发送设备A
以同样的字节存储它的输入2和3。
6、SDO
数据字典作为应用层和通信层的主要数据交换媒介.一个CANopen设备的所有数据的入口可以通过对象字典来管理。
每一个对象字典的入口可以用索引和子索引来表示其地址。
CANopen定义了所谓的SDO就是用于进入到这些入口.
通信模块基于客户—服务器框架上的数据交换.读或写入口总是由客户来初始
化并且是由服务器服务。
每一个CANopen设备必须有一个数据服务对象服务器
来进入到它的对象字典。
SDO发送需要两类不同的COBIDs(CANidentifier)。
第一个COBID用于从
客户到服务器发送一个请求。
服务器通过第二个COBID发送反馈信号到客户。
不同的COBID必须用于各自的方向以防止在CAN总线上的冲突。
通信profile
定义了COBIDs可以用defaultSDPserver。
每一个CANopen设备可以处理127
个SDOservers。
CANopen标准CiADS-301定义了不同的协议用于发送SDOs。
读OD入口称作为上传,写入口称为下载。
一个正在进行的发送可以在终止转
移服务帮助下由客户或服务器来中断。
TPDO传输的是采样的数据,当发生触发TPDO传输的事件时,各个TPDO根
据自己的传输类型决定是否进行采样并传输。
TPDO的传输分为同步和异步两大类,传输类型为同步的,需要在接收到同步消息(SYNC)时采样数据。
同步又分为周期和非周期两种.传输类型0为非周期传输,表示只有接收到同步消息并且规定的事件发生才进行采样数据发送,具体是在收到同步对象后,判断规定的事件是否发生,如果发生则进行采样并触发TPDO的发送。
传输类型1~240为周期传输,传输类型的值表示在接收到对应个数的同步消息后采样并触发TPDO的发送,例如某个TPDO的传输类型为10,就表示此TPDO每次接收到10个同步消息后采样并发送数据.传输类型252为非周期传输,在接收到同步对象后进行采样但不发送,在接收到请求该数据的远程帧后发送.传输类型253—255为异步传输,定义为此三种类型的TPDO在接收到远程帧或规定的事件发生后进行传输.
7、CANopen中的协议
CANmessageinCANopen
数据放在CAN帧中是按最小位在前的顺序存放。
NMTprotocol
设置节点进入操作
设置节点进入停止
设置节点进入预操作
设置节点进入复位应用
设置节点进入复位通信
配置所有节点时,使用nodeID=00
NodeGuardProtocol
主节点发送下列命令来询问节点的状态
节点响应
HeartBeatProtocol
节点周期传送它的状态。
BootupProtocol
节点进入预操作状态时,它发送:
SDOprotocol
所有SDO帧都具有相同的CAN帧长度:
8bytes数据和rtr=0。
SDODownloadexpeditedprotocol
为了写0xd0d1…到服务器节点对象字典,客户机发送请求:
SDOUploadexpeditedprotocol
为了读0xd0d1…到服务器节点对象字典,客户机发送请求:
SDOabortprotocol
Abortcode(hexa)
05030000Togglebitnotalternated
05040000SDOprotocoltimedout
05040001Client/servercommandspecifiernotvalidorunknown
05040002Invalidblocksize(blockmodeonly)
05040003Invalidsequencenumber(blockmodeonly)
05040004CRCerror(blockmodeonly)
05040005Outofmemory
06010000Unsupportedaccesstoanobject
06010001Attempttoreadawriteonlyobject
06010002Attempttowriteareadonlyobject
06020000Objectdoesnotexistintheobjectdictionary
06040041ObjectcannotbemappedtothePDO
06040042ThenumberandlengthoftheobjectstobemappedwhouldexeedPDOlength
06040043Generalparameterincompatibilityreason
06040047Generalinternalincompatibilityinthedevice
06060000Accessfailedduetoahardwareerror
06070010Datatypedoesnotmatch,lengthofserviceparameterdoesnotmatch
06070012Datatypedoesnotmatch,lengthofserviceparametertoohight
06070013Datatypedoesnotmatch,lengthofserviceparametertoolow
06090011Sub—indexdoesnotexist。
06090030Valuerangeofparameterexceeded(onlyforwriteaccess)
06090031Valueofparameterwrittentoohight
06090032Valueofparameterwrittentoolow
06090036Maximumvalueislessthanminimumvalue
08000000Generalerror
08000020Datacannotbetransferredorstoredtotheapplication
08000021Datacannotbetransferredorstoredtotheapplicationbecauseoflocalcontrol
08000022Datacannotbetransferredorstoredtotheapplicationbecauseofthepresentdevicestate
08000023Objectdictionarydynamicgenerationfailsornoobjectdictionaryispresent.
8、CANopen中PDO与SDO配置
HowtoconfigureaPDOTransmit?
例子:
—-——配置PDO0x1800+n
———-它的COBID是0x387
——-—该PDO始终触发传输
-—--它必须包含数据:
dataX(2bytes),dataY(4bytes),按下面的顺序
-—dataX定义在索引0x6000,子索引03
——dataY定义在索引0x2010,子索引21
1—索引1800+n,子索引01:
写COBID(4bytes)
2—-子索引02:
写传输字节《t》(1byte)
t=1to0xF0:
PDO在每接到《t》个SYNC后被传输
t=FD:
在接收到PDO请求(rtr=1)后传输
t=FF:
根据事件进行传输,节点自发发送PDO
3-索引1A00+n:
定义第n个数据的映射
子索引0:
写嵌入到PDO中的数据个数(1byte),本例是,写入《2》
子索引1:
定义在哪里寻找嵌入的第一个数据和大小。
(8bytes)
格式是:
index(2bytes)–subindex(1byte)–sizeinbits(1byte)
本例,写入《60000310》
子索引2:
定义在哪里寻找嵌入的第二个数据和大小。
(8bytes)
本例,写入《20102120》
配置节点5的PDO1802在每3个SYNC传输,发送的SDO(s)应为
6052302180100008703
6052F02180203000000
6052F021A0002000000
60523021A0110030060
60523021A0220211020
什么是PDOTransmitedXXX〈onrequestXXX>?
当一个节点接受到带有相同COBID的rtr,该PDO必须传输。
例如:
如果带有COBID384的PDO被请求,它就必须被传输。
HowtoconfigureaPDOReceive?
例子
-———配置PDO0x1400+n
—-—-它的COBID是0x183
----该PDO始终触发传输
----它必须包含数据:
dataX(2bytes),dataY(4bytes),按下面的顺序
——dataX定义在索引0x6000,子索引03
-—dataY定义在索引0x2010,子索引21
1-索引1400+n,子索引01:
写COBID(4bytes)
2-—子索引02:
写传输字节《t》(1byte)
t=1to0xF0:
PDO在每接到《t》个SYNC后被传输
t=FD:
在接收到PDO请求(rtr=1)后传输
t=FF:
根据事件进行传输,节点自发发送PDO
3-索引1600+n:
定义映射
子索引0:
写嵌入到PDO中的数据个数(1byte),本例是,写入《2》
子索引1:
定义在哪里寻找嵌入的第一个数据和大小。
(8bytes)
格式是:
index(2bytes)–subindex(1byte)–sizeinbits(1byte)
本例,写入《60000310》
子索引2:
定义在哪里寻找嵌入的第二个数据和大小。
(8bytes)
本例,写入《20102120》
配置节点5的PDO1802在每3个SYNC接收,发送的SDO(s)应为
6052302140100008301
6052F02140203000000
6052F02160002000000
6052302160110030060
6052302160220211020
HowtoconfigureaSDOclient?
在CANopen网络,每一个slave节点实现一个SDO服务器(index1200),来接收来自client节点的SDO。
缺省情况下,slave节点功能都是很好的配置的了。
一般,slave节点不需要实现任何SDOclient,因为它不需要发送SDO到其他的节点。
Master节点为了发送SDO到slave节点,它应该有几个SDOclients(每个slave一个)。
项必须被配置在1280,1281,…
配置SDOclient定义在index0x1280+n来和节点nsl通信
1–Index1280+n,subindex01:
writethecobIdtransmit(4bytes):
600+nsl
2–subindex02:
writethecobIdreceive(4bytes):
580+nsl
3–subindex03:
writetheslavenodeid(1byte):
nsl(Optional)
HowtoconfigureanodetosendtheSYNC?
Index1006,subindex00:
writetheperiodinmicroseconds。
(4bytes):
例子:
tosendaSYNCevery10(dec)ms(1000micro),writethevalue:
0x2710
TheSDOshouldbeifitisthenode9:
6092306100010270000
Tostop,write0。
Tostart,write0x40000080atindex0x1005,subindex0
WhatistheSYNCmessage?
Howtoconfigureanodetosenditsheartbeat?
Tosenditsheartbeateverynmilliseconds:
1–Index1017–subindex00:
write《n》XXX(2bytes):
例子:
tosendaheartbeatevery100ms,writethevalue:
0x64
TheSDOshouldbe,ifitisthenode9:
6092B17100064000000
Tostop,write0.
9、CANopen如何修改对象字典的理解
SDO的基本结构如下:
Client→Server/Server→Client
下载/上传(Download/upload)
请求/应答(Request/response)
分段/加速传送(Segmented/expeditedtransfer)
CAN帧数据字节长度
用于后续每个分段的交替清零和置位的触发位(togglebit)
SDO中实现了5个请求/应答协议:
启动域下载(InitiateDomainDownload);域分段下载(DownloadDomainSegment);启动域上传(InitiateDomainUpload);域分段上传(UploadDomainSegment)和域传送中止(AbortDomainTransfer)。
§下载(Download)是指对对象字典进行写操作,上传(Upload)指对对象字典进行读操作.
§协议的SDO命令字(SDOCAN报文的第一个字节)语法和细节在下面部分说明:
(‘-’表示不相关,应为0)。
§读取参数时,使用启动域上传(InitiateDomainUpload)协议
§设置参数时,使用启动域下载(InitiateDomainDownload)协议
n:
表示报文数据中无意义数据的字节数【从(8-n)字节到第7字节数据无意义】(当e=1且s=1时n有效,否则n为0)。
e:
e=0时正常传送,e=1时加速传送.
s:
表示是否指明数据长度,0为数据长度未指明,1为数据长度指明。
e=0,s=0:
由CiA保留.
e=0,s=1:
数据字节为字节计数器,byte4是数据低位部分(LSB),byte7是数据高位部分(MSB)。
e=1:
数据字节为将要下载(download)的数据。
Examples:
※读取参数
发送SDO报文
接收SDO报文
(**为最大字节数据)
※注:
SDO报文发送时命令字均为0x40
如果数据为1个字节,则接收命令字为0x4F
如果数据为2个字节,则接收命令字为0x4B
如果数据为3个字节,则接收命令字为0x47
如果数据为4个字节,则接收命令字为0x43
※修改参数时
发送SDO报文
(**为最大字节数据)
如果数据为1个字节,则发送命令字为0x2F
如果数据为2个字节,则发送命令字为0x2B
如果数据为3个字节,则发送命令字为0x27
如果数据为4个字节,则发送命令字为0x23
接收SDO报文
※注:
SDO报文接收时命令字均为0x60
读取参数举例
Send:
6014001650