CAN与CANOPEN

目录

名词缩写说明... 2

1.通讯概述... 3

2.CAN总线... 5

2.1 CAN总线介绍... 5

2.2 CAN总线的组成... 6

3.CANOPEN协议... 9

3.1协议简介... 9

3.2对象和对象字典... 9

3.3 EDS文件... 10

3.4 SDO通讯... 11

3.5 PDO通讯... 12

3.6 PDO触发类型... 14

3.7映射PDO.. 15

3.8 HeartBeat&NodeGuarding. 17

3.9网络状态管理... 18

参考文献... 20

附录A CANopen控制字常用功能表... 20

附录B CANopen通讯错误对照表... 21

 

 

名词缩写说明

CAN             Controller Area Network控制局域网

CANopen         CAN总线的一种应用层协议名称

PDO             Process data object过程数据对象

SDO             Service data object服务数据对象

TPDO            发送PDO

RPDO            接收PDO

Object           对象,CANopen协议中的名词

Index            索引,即编号

SubIndex         子索引,和索引类似,也是编号

节点             CAN总线上各设备的名称

从站             CAN总线上各设备在CANopen应用层的名称,本文中节点和从站都表示CAN总线上的节点

主站             CANopen应用层中的第一个节点

 

 

 

1.通讯概述

       在开始学习CAN之前,我们先说下通讯的组成。最早的通讯我们可以认为是旗语,用不同的旗子,不同的摆放来传递信息。后面出现了电话、电报,可以用来传递信息。随着计算机的出现,通讯方式变的越来越多样化,可以传递的信息量也越来越多。早期的通讯方式都没有什么固定标准,两者之间规定好相应的规则即可,这个规则就可以理解为通讯协议,而帮助传递信息的就是总线。总线是传输信息的载体,是实实在在的硬件,总线+协议最终构成了通讯方式。这里要提前说下的是总线和协议不是一回事,总线是总线,协议是协议,后面我们会慢慢介绍。

        如果通讯的发展停留在这个阶段,那我们现在所处的世界就不像现在丰富多彩了。为了建立一定的标准去方便不同系统互联通讯,这个时候就有一些组织提出了制定规范来解决这个问题。经过多次修订,最终就有了开放系统互连的通讯模型,简称OSI(Open System Interconnection)七层模型。图1-1即为OSI七层模型的示意图。

图1-1 OSI七层模型

        从模型中我们可以看到,通讯最终是转化为比特流发送出去,我们说的通讯速率就是比特流的速率,比如百兆网络100Mbit/s。比特流的传输载体是物理层,是我们看的见摸得着的线缆以及接口芯片等。物理层往上是数据链路层,数据链路层的职责是负责将具体的数据转化成比特流,然后通过物理层的硬件发送。可以简单理解为,硬件的编码与解码,比如要发送数字8,那么数字8的比特流高低电平是怎样的;当收到一串比特流后,应该转换为哪个数字,这个就靠数据链路层完成的,数据链路层也是硬件,以及底层的协议。

        数据链路层再往上,还有五层。这五层都有一个特点,他们都是软件层,是运行在处理器上的软件代码,这五层完成数据报的解析,编组,归类,最终到显示。当我们用因特网看视频时,这些层就在周而复始发送请求,解析数据,并最终刷新到显示界面。这五层搞起来确实有点复杂,有些时候其实是不需要的,比如我们知道数据的具体含义,我们就不需要再去分组整理数据,直接使用即可,工业通讯应用正是符合这个特点。尤其是针对运动控制或者过程控制总线,层数太多不仅没用,反而会增加不必要的成本,并且运动控制或者过程控制这种专用总线上数据的含义都是严格一一对应的,不需各种分组分段解析啥的。所以,将五层压缩为一层,叫应用层。物理层,数据链路层,应用层都有各自的功能,三层功能没有重叠部分。发送工作流程是当数据到达后应用层后把数据放到对应的存储区,数据需要发送时到对应区域取出数据,交给数据链路层,比特流经物理层发送出去;接收工作流程就是反过来,物理层上的比特流被数据链路层解析为正确的数值,放到对应的存储区域,应用层需要数据的时候取走数据即可。

        所以,工业通讯环境下,一般就是三层的通讯模型。如下表1-1所示,各层有各层的功能。表1-1

层名称

功能

应用层

搬运数据,完成控制功能

数据链路层

承上启下,生成比特流,以及解析比特流

物理层

比特流传输载体

        任何一种通讯都满足这三层的通讯模型,理解了三层通讯模型后,后续无论遇到什么新的总线,就按这个框架去学习,突破现象看本质。学起来也就更轻松,理解的也会更透彻,不会似懂非懂,更不会出现碰运气才能通讯上的情况。

 

2.CAN总线

2.1 CAN总线介绍

        控制局域网CAN(Controller Area Network)是德国博世公司为汽车应用而开发的多主机局部网络,用于汽车的监测和控制。CAN总线设计的初衷是为了解决汽车上众多的电子设备之间的通信问题、减少电子设备之间繁多的信号线。这就是CAN总线的起源。

        CAN总线的通信过程如图2-1所示,可以用寄快递来比喻,有发送的有接收的。还有一个滤波器设置,保证是送到正确的地址,不需要接收的节点不需要处理,过滤掉即可。 

图2-1

        CAN总线上传输的信息叫报文,也就是要传递的信息,当总线空闲时,任何连接的单元都可以发送新的报文。CAN报文有两种不同的帧格式,标准格式和扩展格式。标准格式是11位标识符,扩展格式是29位标识符。标志符的作用就是写明此帧数据发送的地址信息、数据信息的长度。我们以数据帧为例,说明下报文的构成,如下图2-2所示。

图2-2

        每一帧数据的开始有个帧起始位,紧跟着是仲裁域和控制域,也就是对应标识符那一段。数据域是要发送的数据,数据域之后是跟着CRC循环冗余校验,这个确保发送和传输的数据正确性,如果传输过程中数据被损坏,则发送的CRC和接收端计算的CRC不一样,数据传输错误。CRC之后就是应答域,表示节点收到数据,最后是帧结尾,表示这一帧数据结束了。

        刚说的报文中的这些域,以及帧起始和帧结尾对应的电气信号都是高低电平。CAN总线的信号传输是差分信号,静态时对地均是2.5V,当有数据时CAN_H是3.5V,CAN_L是1.5V。CAN总线的电平如图2-3所示


图2-3

        需要传输的数据会被CAN控制器转换为连续不断的高低电平,接收端接收到信号后会将连续不断的高低电平翻译为对应的数据。这个CAN控制器就是我们前文说的数据链路层,数据链路层的协议就是CAN总线的底层协议。现在CAN总线的底层协议有CAN 2.0A和CAN 2.0B,区别是标志符的长度不一样,2.0B是29位标识符,同时也可以识别11位标志符的报文。CAN总线的底层协议不是我们学习的重点,了解即可,这个是CAN控制器开发者需要关心的,也就是芯片开发者的主要工作。作为使用者或者叫应用工程师,我们重点关注的是应用层的高级协议,比如我们后面要重点介绍的CANOPEN就是应用层协议,是应用层的东西。

2.2 CAN总线的组成

        CAN总线或者任何总线的组成从抽象层面讲,都是物理层、数据链路层,或者包含应用层,CAN总线是没有包含应用层的,应用层是开发者后续增加的。基于CAN总线的应用层有很多,如CANOPEN、DeviceNet、SDS、CANKingdom等等,这些都是叫应用层协议。故我们可知,同样的总线可以有不同的应用层。同样的应用层也可以基于不同的总线,比如CANOPEN协议在EtherCAT总线上也有,即CoE。简言之,应用层是软件代码,数据链路层是既有硬件,也包含硬件的底层协议,物理层是单纯的硬件。

        接下来看看CAN总线的物理层和数据链路层。物理层由双绞线和CAN收发器组成,常用的CAN收发器有TJA1050芯片。数据链路层就是CAN控制器,CAN控制器既有独立的芯片,如SJA1000,也有嵌入到MCU的CAN控制器,如我们常用的STM32系列微控制器一般都自带CAN控制器。CAN控制器的结构示意如下图2-4所示,CAN控制器能独立处理总线上的数据,处理完成的数据再和主控制器交互。

        前面我们提到CAN总线上任意时间只能有一个节点发送数据,其余节点都是在接收状态,如果这个时候有其他节点要发送数据的话那要怎么办呢?是不是等当前节点的数据发送完成了再去补发呢?这些都不需要,CAN控制器中有一个发送缓冲器管理着数据的发送,如果总线上有数据则进入等待,总线空闲的时候再发送出去。如果同时有几个节点要发送数据,怎么办,通过仲裁解决,ID值小的节点先发送,ID值大的节点等待,直到数据发送出去。接收数据的时候CAN控制器会把数据直接写入接收缓冲区,如果不是本节点需要的数据,滤波器会直接过滤掉。这样主控制器就不用一直轮询来接收数据了,CAN控制器产生相应的接收中断来通知主控制器数据已经达到,大大提高主控制器的效率。

 

图2-4

        CAN总线的拓扑结构如下图2-5所示,理论上总线可以有无限多的节点。但节点越多,通讯的速度就会越慢,并且CAN总线是半双工的,任何一个节点在使用的时候,其他节点都不能发送数据。CAN总线上第一个和最后一个节点120Ω终端电阻是需要的,主要是为了减少信号的回波反射,使总线更会更稳定。CAN总线的最快波特率是1Mb/s,同一总线上的波特率要一致。总线越长,则波特率越低,一般常用的就是1Mb/s到125kb/s。

 

图2-5

        CAN总线大概就是这样,我们只需知道它的物理层和数据链路层的原理和组成即可,不需要深入这两层的具体实现细节。用CAN总线通讯数据是非常简单的事情,初始化好CAN控制器,配置好滤波器,当总线上有本节点关心的数据时,数据就会存到缓存区并触发中断,主控制器去读取数据即可。需要基于MCU的CAN总线通讯相关例子的可以自己去百度搜索,或者看下MCU芯片的使用手册,这里不展开讲了。对CAN总线的基本概念有个系统性的了解即可,编写程序用总线实现通讯,达到我们的控制要求才是我们的主要目的。下面将会把主要篇幅用来介绍CANOPEN协议,CANOPEN协议在伺服控制系统中非常常见,非常主流。同样,协议的具体实现细节不展开讲,主要讲下协议的基本概念,术语,重点是怎样使用。

 

3.CANOPEN协议

3.1协议简介

        CAN总线是博世公司创立的,而CANOPEN协议是一个叫CiA的组织制定的,CiA是CAN in Automation的缩写。这个组织是一个非营利性机构,是帮助成员制定各种规范,成为这个组织的会员就会获得一个vendor ID,这个ID就是一个厂商编号,用以区别不同厂商。与CANopen相关的规范文件有DS301/DS401/DS402,其中DS301只是CANopen的一个基础规范,具体到细分领域有,I/O模组的DS401,伺服控制的DS402。感兴趣的可以自己去翻下这些手册,百度都可以下载,接下来我们就开始讲CANopen协议了。

       前面我们讲了CAN总线的通讯方式,在CAN总线中是没有主从概念的,所有节点都可以是主,所有节点都可以是从,节点之间可以相互通讯。但在CANopen协议中是有主从概念的,这一点要记住。CANopen协议中规定了,一个总线中只能有一个节点为主站,节点号为0,其余的节点都是从节点,节点号从1开始递增。只能在主从之间通讯,从站之间不能直接通讯,从站之间的通讯也需要经过主站。CANopen协议中有对象的概念,理解了对象这个名词的含义后对学习协议非常有帮助。

3.2对象和对象字典

        CANopen协议下的通讯方式有SDO和PDO。SDO是service data object服务数据对象的缩写,PDO是process data object过程数据对象的缩写。对象这个名词比较抽象,刚开始可能不好理解。对象是有编号和名称等信息的,可以简单理解为区分不同寄存器的一个描述,不必过于纠结为什么叫对象这个名字。很多对象组合在一起就形成了对象字典,对象字典就是把不同功能的对象罗列到一起,方便查找不同对象的编号、名称、功能等详细信息。CANopen协议的对象有上百个之多,如0x6040控制字,0x6041是状态字,还有设置目标位置,规划速度的等等。

        除了对象这个概念之外,有的对象又还有子索引,如果0x1800 TPDO1的参数对象就不仅仅只有一个地址。0x1800是这个对象的入口,下面还有子索引,子索引的编号一般是从0x00开始。要全部记住这些对象的功能编号是不太可能的,当我们需要的时候去查对象字典就可以了,关键是要理解这些名词,然后知道怎样去看,突破现象看本质。每个CANopen产品都会有一个对象字典手册,里面有详细全面的描述,使用的时候要参考这个。

        对象的代表的含义就是和芯片手册中各个寄存器的功能一样,理解到这一点,接下来的学习就扫清障碍了,熟练程度就需要项目实战了。

3.3 EDS文件

        还有一个与对象相关的名词叫EDS文件,EDS是英文electronic data sheet的缩写,即电子数据表格。在CANopen中的EDS文件就是从站的对象描述文件,通过这个文件我们就可以知道对应从站有哪些对象,对象的入口地址编号是多少,有没有子索引,有几个子索引,是否映射了PDO等等。相当于一个非常详细的背景信息,这就是EDS文件的作用。图3-1是EDS文件内容的一个截屏,里面的关于每个对象的详细描述,能看的懂,知道怎么修改可以配置PDO即可,关于PDO的配置在后面会详细说明。

图3-1

3.4 SDO通讯

        SDO是询问才应答的模式,询问是主站询问从站,应答是从站应答主站,相当于从站给主站提供服务,只有询问才会有应答。图3-2是SDO通讯读数据,主->从和从->主的报文结构。询问的时候发送的COB-ID = 0x600+Node-ID,0x600标识符,节点编号是变化的,节点1就是0x601,节点2对应0x602,依此类推。应答的时候发送的COB-ID = 0x580+Node-ID,0x580标识符,节点编号是变化的,节点1就是0x581,节点2对应0x582,依此类推。紧跟着COB-ID的就是数据区,Byte0是控制字符,简单理解就是要进行什么操作,读的数据长度是多少。当应答是时候,Byte0也是控制字符。这个Byte0的含义请看图3-3,询问的时候Byte0都是发0x40,应答的时候则根据不同的数据长度会不同。图3-3只是以一个厂家的手册举例,具体到不同厂家是大同小异,也许有的会分的更细,使用的时候发现不一样的,再详细参考对应厂家的手册。

        Byte1 Byte2对象地址,地址都是两个byte的,发送的时候需要分开,低位地址在前,高位地址在后。Byte3是子索引地址,如果当前对象没有分子索引的则填0x00。Byte4-7在读的时候是没有意义的,全部填0x00即可。

        应答的时候Byte1-3是和发送出去的指令一样的,Byte4-7就是读取回来的数据,同样也是低字节在前,高字节在后,低字在前,高字在后。

图3-2

        如果读取的时候发生错误,则错误码就存在Byte4-7这四个字节中,也低字节在前,高字节在后。错误码的具体含义请参附录B ,一般就是地址写错之类的错误。

图3-3

        SDO通讯写入数据和读取数据差不多,如图3-4所示,也是询问之后再应答的模式。指令中Byte0的含义参见图3-3,写入数据长度不同则操作码不同。Byte4-7是要写入的数据,同样也是低字节在前,高字节在后,低字在前,高字在后。

        应答的时候Byte0是0x60,且Byte4-7如果全部都是0x00,则表示写入数据成功,没有错误。反之则Byte0是0x80,Byte4-7则是报错的代码,没有写入成功,错误码的具体含义请参附录B,Byte1-3的含义还是对应的对象和索引地址。

图3-4

        SDO通讯比较简单,按部就班的操作就可以。一般容易出错的是Byte0控制字符不对,对象地址写错,子索引写错,写的数据超出范围,或者写入了只读对象,使能模式下禁止某些对象的写入等等,都比较好排查。

3.5 PDO通讯

        带着问题学习PDO通讯。为什么已经有SDO通讯方式了,还要再去折腾PDO通讯呢?这会增加嵌入式开发的难度,也会增加使用者的难度,岂不得不偿失。这就要先说说SDO的不足了,SDO虽然能满足数据的读写,但是SDO是一发一收的模式,会更多的占用总线资源,前面我们已经讲过CAN总线是半双工的形式,任何时间总线上只能有一个操作,后面的操作要排队等待。CAN总线的波特率最快只有1Mbps,这种改善的效果是立竿见影的,可以大大增加数据的吞吐量。当然PDO的优点不仅仅是这个,接下来我们慢慢掀开PDO的神秘面纱。

        PDO是过程数据对象,分为TPDO发送过程数据对象和RPDO接收收据对象,TPDO可以理解从站把数据上传给主站,RPDO可以理解为主站把数据写入从站。TPDO和RPDO各4个,有各自对应的COB-ID,如表3-1所示

                                                      表3-1

名称

对象

子索引

默认COB-ID

Node-ID=1时

TPDO1

0x1800

0x01

0x180+Node-ID

0x181

TPDO2

0x1801

0x01

0x280+Node-ID

0x281

TPDO3

0x1802

0x01

0x380+Node-ID

0x381

TPDO4

0x1803

0x01

0x480+Node-ID

0x481

RPOD1

0x1400

0x01

0x200+Node-ID

0x201

RPDO2

0x1401

0x01

0x300+Node-ID

0x301

RPDO3

0x1402

0x01

0x400+Node-ID

0x401

RPDO4

0x1403

0x01

0x500+Node-ID

0x501

        每个PDO的最大数据长度是8个byte,映射的数据长度可以小于8个byte,则总共的收发PDO长度最大为各32个byte。那么PDO要怎么映射呢?

        每个PDO都有两个对象,一个是参数对象,如TPDO1的参数对象就是0x1800,这个对象不止一个子索引。0x01子索引存的是COB-ID,0x02子索引定义的是PDO的传输类型,这个接下来会单独讲解。0x03子索引是TPDO的最小传输时间间隔,RPDO没这个参数。不同厂家的可能还有更多的子索引,但这几个是肯定有的。PDO的另一个对象是管理映射的,比如TPDO1管理映射的对象是0x1A00,子索引0x00是存储总共映射了几个对象,从0x01开始,存的就是映射对象的具体信息,包括映射的对象地址,数据长度。

一个对象管理PDO具体的映射信息,我们就知道了映射了哪些对象。另一个对象则管理PDO的COB-ID,传输类型。这样我们就可以通过PDO的COB-ID来直接写入或者读取PDO中映射的对象数据,也就是说相当于一个报文可以操作几个对象了,省去了SDO通讯每读一个对象都要一来一回的不便,效率大大提高。说了这么多,举例让大家看的更清楚,理解的更透彻。

                                                                  表3-2

PDO名称

COB-ID

映射的对象

RPDO1

0x201

0x6040

0x607A

0x6060

TPDO1

0x181

0x6041

0x6064

0x6061

        如表3-2所示,RPDO1中映射了3个对象,分别是控制字、目标位置、运行模式,我只需要一条指令就可以一次把这三个对象都写入数据,指令是

        0x201 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX

        0x201是RPDO1的COB-ID,后面是跟着要写入的数据,写入的数据是根据映射的先后顺序写入的,前面的两个byte就会写入到0x6040,紧跟着的四个byte写入到0x607A,最后一个byte写入0x6060。因为映射的三个对象数据宽度不一样,写入的数据是根据对象的数据宽度来定的,按顺序排列。

TPDO1的和RPDO1的类似,只要一次就可以把三个对象的数据都传给主站,返回的指令是

        0x181 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX

        0x181是TPDO1的COB-ID,后面是跟着上传的数据,前面的两个byte就对应0x6041的状态,紧跟着的四个byte对应0x6064,也就是实际位置,最后一个bayte对应0x6061运行模式。

       到这里是不是看到PDO的强大和方便之处了,果然有存在的必要吧。接下来再讲讲PDO的触发类型,以及怎样映射PDO。

3.6 PDO触发类型

       PDO不是配置完了之后就会上传数据,需要设置触发方式,不同的触发方式上传数据的条件不一样。只有触发条件满足之后PDO才会上传数据给主站,不然总线上就乱套了。有三种触发方式,分别同步触发、远程帧触发和异步触发。

       同步触发方式是从站只有收到主站的同步帧之后才会上传数据,同步帧是主站发出的,指令格式是COB-ID = 0x80,数据区全部为空,只要有一个COB-ID=0x80发出。当从站监测到总线上有同步帧之后,所有需要等待同步命令才执行的PDO都会开始工作。

       远程帧触发是主站发送远程帧请求,对应的PDO上传数据,注意是只有对应的PDO上传数据,这一点与同步模式不一样。指令格式是COB-ID =0x181,数据区也是全部为空,即数据长度为0,这里是举例0x181,其他PDO同样操作。当对应从站的PDO监测到这个请求后,就会上传数据。

       异步触发方式又叫事件触发,一般是值改变时间和定时事件。值改变事件是当PDO中对象的数值发生改变时就会上传数据,但如果数据一直改变就会一直上传,这样会导致总线满载,所以这个触发方式下抑制时间参数会生效,两次上传的最短时间间隔不会小于这个抑制时间。这个抑制时间只有TPDO有,RPDO没有。定时事件就是把定时时间值设好,当时间到了之后就上传数据。

       这几种触发方式都又各自的特点,需要根据实际需要选择适合的触发方式。

3.7映射PDO

        PDO映射,常见三种方法。第一种是厂家的调试软件上可以直接配置,这个方便简单,好用。这里以maxon驱动器的作为举例讲解下,如图3-5是RPDO的映射,设置好COB-ID,PDO是否生效,触发方式,右边就是添加PDO要传输哪些对象。

 

图3-5

        TPDO的映射比RPDO多了远程帧方式和抑制时间设置,如图3-6,这个在前面已经讲过,其他的配置都一样。这种通过向导配置PDO的方式就是这么简单,配置完成后保存到flash,以后每次上电就是这个配置了,非常方便。

 

图3-6

        第二种映射PDO方式是通过CANopen通讯报文配置,这种就比较繁琐了,需要一条一条的发送指令。但有的厂家不支持向导配置方式的时候,我们也不得不用。这里具体TPDO的配置,RPDO配置的方法也是一样,举例的从站号是1。如下代码所示,第一步先使0x1800子索引0x01的最高位为1,这样就可以开始修改TPDO了。接着设置触发方式,清空映射对象的数目,映射对象,映射对象的数量,最后0x1800子索引0x01的最高位置0,这样配置就完成了。如果要映射几个对象,就是在0x1A00中继续添加要映射的对象。

//使1800 subindex1通讯对象TPDO 最高位为1,以便修改TPDO

0601        23  00  18  01  81  01  00  80

0581        60  00  18  01  00  00  00  00

//设置通讯模式 255-异步

0601        2F  00  18  02  FF 

0581        60  00  18  02  00  00  00  00

//清空1A00中映射的对象数目

0601        2F  00  1A  00  00 

0581        60  00  1A  00  00  00  00  00

//映射第一个对象6064 subindex0  20代表数据长度,00是6064的第0个subindex

0601        23  00  1A  01  20  00  64  60

0581        60  00  1A  01  00  00  00  00

//设置1A00中映射的对象数目

0601        2F  00  1A  00  01

0581        60  00  1A  00  00  00  00  00

//将1800 subindex1的最高位清零,是TPDO有效

0601        23  00  18  01  81  01  00  00

0581        60  00  18  01  00  00  00  00

        第三种映射PDO的方式是通过EDS文件,EDS文件前面已经介绍过了,就是对象的信息描述。主站在上电后,把EDS文件的内容读取,然后再下发到从站中去。这种配置是CANopen主站完成的,其流程细节和第二种方式一样,只不过不用自己一个一个发送。

        三种PDO映射方式的最终效果是一样的,使用过程中怎么方便怎么来,怎样可以实现怎样来。

3.8 HeartBeat&NodeGuarding

        我们带着问题继续学习,假如CAN总线上的某个从站断线了,从前面学到的知识我们有办法让主站知道这个节点断线了?肯定是可以的,比如设置一个超时时间,超过规定的时间没有收到上传的消息就认为这个从站断线了,但如果每一个指令都要这要去判断的话效率就低了。为了解决这个问题,在设计CANopen协议的时候就设计了两种机制去监测节点的状态,HeartBeat和NodeGuarding。

        HeartBeat直译的话就是心跳,如果一直有心跳就表示状态正常,如果没有的话就表示出问题了。当HeartBeat功能打开之后,从站就会根据设定好的时间间隔去上传自己的状态。CANopen协议下,从站有如下表3-3所示几种状态。假如设定的心跳参数是1s上传一次从站状态,则每次上传的报文就是COB-ID+当前状态,如0x701 0x04。当从站的状态发生变化时,报文也会跟着变化,比如切换为运行模式的时候,就会上传0x701 0x05。只要从站没故障,则从站一直按照这个频率上传自己的状态,这就确保了从站在出现故障时尽快让控制系统得知,触发控制系统的故障机制,尽可能减小损失。

                                                               表3-3

编号

状态

状态对应的值

1

Bootup初始化

0x00

2

Stopped停止

0x04

3

Pre-operational预运行

0xFF

4

Operational运行

0x05

        NodeGuarding要达到的目的是和HeartBeat一样的,但他们的实现方式不一样。这两个功能只能二选一,一个启用则另外一个失效。NodeGurading功能在从站端设置节点监控的时间,比如1s,则需要主站每间隔1s发送节点状态请求,然后从站才上传自己的状态。如果在规定的时间内,从站没有等到主站的请求,则从站会报错,这一点和心跳功能不一样。在节点监控功能下,如果主站故障了,从站也会跟着故障。

        一般来看,用心跳功能的多点。因为主站处理的东西比较多,如果是节点监控功能的话,主站超时发送状态请求则会导致整个总线故障,而主站可能只是处理其他数据而来不及发送状态请求,这是不希望发生的。况且这个从站状态监控功能只需要按一定频率上传状态就可以了,没有严苛到不能有任何时间偏差。所以,现在有些厂家都取消了NodeGuarding功能。

3.9网络状态管理

        设想下,假如总线上有很多从站,这个时候突然有一个从站故障了,如果不得不断电才能恢复这个从站的话,是不是感觉太不友好,又太麻烦了。然而不用担心,因为协议在设计的时候就考虑到了这种情况,增加了网络状态管理功能。

        网络状态管理有如下这几种功能,启动远程节点,停止远程节点,重置节点,重置通讯,进入Pre-OP也就是预运行模式。这几种功能的操作对象下表3-4

功能

COB-ID

Byte0

Byte1

描述

进入Pre-OP

0

0x80

0

总线上所有节点进入Pre-op

0

0x80

n

n表示具体站号(下同),指定的站号进入Pre-op

重置通讯

0

0x82

0

总线上所有节点重置通讯

0

0x82

n

指定的站号重置通讯

重置节点

0

0x81

0

总线上所有节点重启

0

0x81

n

指定的站号重启

启动远程节点

0

0x01

0

总线上所有节点启动

0

0x01

n

指定的站号启动

停止远程节点

0

0x02

0

总线上所有节点停止

0

0x02

n

指定的站号停止

        指令的具体格式,举例所有节点进入Pre-op,则为0x00 0x80 0x00,第一个是COB-ID,第二三个是数据区,其他功能指令类似,通过这些指令就可以灵活的控制总线上的各个节点了。启动和停止远程节点的含义,节点初始化完成后是只可以进行SDO通讯的,PDO的通讯以及心跳上传都要等待主站发送启动命令后才开始工作,这就是启动远程节点的意思。停止远程节点的话,PDO和从站心跳这些功能都会停止。其他功能应该都好理解,不再一一叙述。

       其实CANopen用起来也不是特别复杂,搞清楚他的框架,有哪些功能,对照手册操作几遍基本就学会了。基本的操作学会之后,自己再总结一遍,查漏补缺,就无师自通了。

 

 

参考文献

1.《CAN总线应用层协议实例解析(第2版)》北京航空航天大学出版社,牛跃听,周立功,高宏伟,黄敏思

2.CANopen协议手册,DS301 DS402

3.maxon相关使用手册

 

附录A CANopen控制字常用功能表

        这里列举了几个模式的常用控制指令,使能的开和关都是一样的,其他模式的可以参考对应厂家的使用手册,基本是一样的,有区别的可能是有特殊功能定义。

序号

控制模式

对象字典

功能

描述

1

规划位置模式

0X6040-00

0X06

使能设备

0X0F

0X1F

开始运动

绝对

0X3F

绝对立即

0X7F

相对

0X5F

相对立即

0X10F

停止运动

正常减速

0X0B

急停

2

回零模式

0X6040-00

0X1F

开始回零

 

0X11F

停止回零

 

3

规划速度模式

0X6040-00

0X00F

开始运动

 

0X10F

停止运动

 

4

清除错误

0X6040-00

0X80

清除错误

 

 


附录B CANopen通讯错误对照表

 

如图3-4所示,

posted @ 2022-04-10 15:42  Let'sDoSomething  阅读(3808)  评论(1编辑  收藏  举报