什么是CANOpen
CANOpen是位于CAN总线之上的一个应用层协议。CAN总线只规定了物理层和数据链路层,有了这两层,数据就可以在CAN总线上传输了。我们和哪个设备通信就和哪个设备约定好,哪个ID代表什么,哪个字节代表什么,但是这样一来,每个厂家的设备都定义一个自己的协议,岂不是乱套了。如果约定好一个开放的,标准化的协议,厂商都去遵循这个约定好的标准,那么设备之间互相通信就简单了。 CANOpen协议通常分为用户应用层、对象字典、通信这三个部分。
CANOpen协议
CANOpen 是由一系列协议组成的。比如CiA301、CiA401、CiA402协议等等。 CANOpen的基础协议是CiA 301协议。每个行业还有自己的设备子协议,
CANOpen协议报文分类
NMT网络管理报文,作用是管理网络,切换节点的状态。一般由主站发送NMT网络管理报文。 SDO服务数据对象报文,作用是设置设备参数,或者是一些关键数据的传输。一般由主站发起SDO报文,从站应答SDO报文。从站也可以发起SDO,主站响应,比如关键数据的传输。 PDO过程数据对象报文,作用是传输一些设备的过程数据,比如传输温度,速度等等。主站和从站都会发送。 EMCY紧急报文,作用是传输设备的故障信息。主站和从站都会发送。 SYNC同步报文,作用是同步数据,用来同步从站的TPDO数据。一般由主站发送。比如从站的TPDO传输类型是在同步模式下,当从站收到设定次数的SYNC报文后,从站会发送TPDO。这个在后续的文章中详细阐述。 NODE GUARDING节点保护报文,作用是主站请求从站的状态,主站询问,从站应答。这种模式逐渐已被淘汰,因为太占CAN总线网络带宽。 HeartBeat心跳报文,作用是设备主动发送心跳,表示自己在线。主站和从站都可以发送。
CANOpen状态机
CANOpen节点共包括:初始化、预操作、操作、停止这四个状态。状态机可以通过NMT服务相互切换。如下图:
NMT报文
只有CANOpen主站才会发送NMT报文。NMT报文不需要应答,是生产者消费者模型的。NMT报文的ID固定是0,数据域有两个字节,第一个字节是命令,第二个字节是Node-ID。Node-ID为0表示所有的从站。如下图
节点保护报文
通过节点保护报文主站可以监视每个从节点的当前状态。主站周期性的发送节点保护报文询问从站的状态,从站收到主站的询问后将自己的状态返回给主节点。 主站发送的是远程帧,请求从站的状态。从站应答的数据只有一个字节,这个字节bit7是交替0、1出现的。bit0~bit6表示从站的状态。 主站请求格式和从站应答格式如下图: 从站应答的状态字如下图:
节点保护报文是0x700+Node-ID ,这个Node-ID是从站的Node-ID,每个节点都要请求一次应答一次。节点保护相对于心跳来说太占用网络带宽了。
心跳报文:
心跳报文是从节点主动发送报文给主节点。心跳报文是周期性的,主节点为每一个从节点设置一个超时时间,如果超时时间到的时候还没有收到从节点的心跳报文,主站将对从站进行相应的动作。
节点上线报文
从站主动发送节点上线报文通知主站它已经从初始状态进入到了预操作状态。启动报文如下:
SYNC同步报文
同步报文的CAN-ID固定是0x80,数据长度是0或1。同步报文是生产者消费者模型,由主站发出,同步从站的TPDO。
EMCY紧急报文
当设备内部发生错误,触发该对象,紧急报文的格式如下:
紧急报文的COB-ID存储在0x1014的索引中,一般会定义为0x80+Node-ID。 紧急报文的ECC(紧急错误代码)如下: 紧急报文的错误寄存器位于0x1001索引中。 紧急报文的生产禁止时间,存储在索引0x1015中,防止一直发送紧急报文,占用CAN总线带宽。
SDO报文
SDO是客户端服务器模型的。通过使用索引子索引SDO客户机能访问设备对象字典中的对象。 SDO通常情况下传输的数据长度不超过4个字节,当数据长度超过4字节是分拆成几个报文发送的。
SDO读报文如下:
SDO写报文如下
如果使用SDO读取或写入的时候返回0x80错误的话,可以查询返回数据帧的后4个字节,后4个字节是被称为是中止代码,通过中止代码能得知出错的原因。中止代码如下:
关于PDO通信在下一篇文章中介绍。
|