CANopen协议详情讲解.docx

上传人:b****9 文档编号:25089009 上传时间:2023-06-05 格式:DOCX 页数:30 大小:1.31MB
下载 相关 举报
CANopen协议详情讲解.docx_第1页
第1页 / 共30页
CANopen协议详情讲解.docx_第2页
第2页 / 共30页
CANopen协议详情讲解.docx_第3页
第3页 / 共30页
CANopen协议详情讲解.docx_第4页
第4页 / 共30页
CANopen协议详情讲解.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

CANopen协议详情讲解.docx

《CANopen协议详情讲解.docx》由会员分享,可在线阅读,更多相关《CANopen协议详情讲解.docx(30页珍藏版)》请在冰豆网上搜索。

CANopen协议详情讲解.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 营销活动策划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1