CANopen协议本质

一、CAN总线协议

      CAN总线协议规定了ISO七层通信协议模型的物理层和数据链路层。其具体实现都已经被固化到CAN总线控制芯片中,无需软件实现。理论上,CAN总线在速率小于5K时,距离可达10000m;速率接近1M时,距离小于0.4m。现实中常用的高速CAN总线速率有500k或250k,低速CAN总线有125k和62.5k,传输距离在几米到几十米间。速率和传输距离的选择还有考虑硬件的要求。理论上,一条CAN总线上可以连接无数个CAN设备,但实际上受到其他条件限制,数量总是有限的。例如,使用了更上层的CANOPEN协议,则一条总线上只能有128个设备。

  1. CAN总线网络属于广播网络,同一条总线的设备都可以放送和接受数据。同一时刻只能有一个设备作为发送设备,其他设备为接收设备。
  2. 同一条总线上的设备必须工作在同一速率下。
  3. 当两个设备同时发送数据时,根据其CAN通信帧(CAN通信的最小信息单元详情见下文)的ID号进行仲裁,ID号小的优先级高,将获得发送权,优先级低的则需要放弃发送,转为接收状态。
  4. CAN设备可以检测总线上的错误类型是暂时性的还是持续性的,如果是持续性的,出错的设备会不停的向总线发送错误帧,一段时间后将自动脱离总线。
  5. can总线的终端电阻的选择很重要,选择的不好会影响通信质量。

       CAN总线所使用的最基本通信单元称为帧,CAN总线协议规定了数据帧、遥控帧(也有称为远程帧的)、错误帧、过载帧和间隔帧。以下仅详细分析数据帧的帧格式,其他均只描述功能,不详细描述格式。有些文档喜欢用显性电平和隐性电平来描述帧格式,这里说明一下,显性电平可以理解为逻辑1,隐性电平可以理解为逻辑0。

标准数据帧由7段构成

起始段仲裁段控制段数据段CRC段ACK段帧结束
11230-641621

      起始段:长度固定为1bit,逻辑0

      仲裁段:前11bit为帧ID,后1bit为RTR标志,小ID优先线高

      控制段:前2bit规定为0,后4bit为数据段的BYTE长度

      数据段:长度可变,0~8BYTE,没有数据段的数据帧一般用作心跳。

      CRC段、ACK段、帧结束对于软件工程师来说可以不关注,比较重要的是理解仲裁段、控制段和数据段的含义。

二、CANOPEN协议

        CANOPEN协议是基于CAN总线协议建立的应用层协议。CANOPEN协议属于“主-从站协议”,一个CANOPEN网络中有一个主站和若干个从站。每一个从站点都有一个ID号,一个数据字典和四种工作状态。CANOPEN协议将CAN总线协议的通信帧进行了进一步的封装和分类,以满足更高层次通信的需要。

        CANOPEN网络中的每一个从站设备都要有一个数据字典,其实数据字典这个翻译不太准确,应该叫做“命令ID与功能对照表”。比如网络中有一个信号灯设备,则这个设备就可能有这样一个数据字典。

indexsubIndexdata功能
0x40000开灯
0x40001关灯

      其中,index我们可以理解为“命令ID”,subIndex可以理解为“子ID”。这个“字典”表示,只要有其他设备向信号灯发送一条包含命令ID为0x400和子ID为0的命令,如果data为0,则信号灯就亮;如果data为1,则信号灯就灭。所以说“数据字典”更像是“命令ID与功能对照表”

      实际上,CANOPEN协议规定了设备数据字典的格式,并对命令ID号进行了规定和划分(具体的规定很复杂,需要请参阅规范)。有一些命令ID的功能是固定的,有一些则可以由设备生产厂家自己决定。命令ID对应的功能也不总是操作这个设备,也可以是读取这个设备的信息,比如设备名等。

     接下来的问题是如何向一个设备发送命令ID呢?对此,CANOPEN协议也有规定,在下文中会进行介绍。

     CANOPEN协议是一个“主-从站协议”,其中规定,在总线上每一个作为“从站”的设备要有一个自己的设备ID(主站设备不做强制要求),称为Node-ID,这个英文名字在许多文章中更常见,范围是1~127(0有特殊用途,不能作为ID分配给设备),同一个总线上不能出现ID号相同的两个从站设备。所以,基于CANOPEN协议的总线上最多有127个从站设备。

  那么为什么是127个呢?为了解释这个问题,要先了解CANOPEN协议规定的通信对象。就像CAN总线协议的基本通信单元称为“帧”一样,CANOPEN协议的基本通信单元叫做“通信对象”(英文为Object,姑且这么翻译吧)。常用的通信对象有NMT、SYNC、EMERGENCY、TIME STAMP、SDO、PDO这几个,他们结构相同,包括funciton Code、Node-ID、DLC(数据长度)、DATA(数据)四部分构成,本质上都是通过封装CAN总线协议的数据帧实现的。他们的不同体现在DATA这个部分,有的对象DATA部分可以完全用来传输数据,有的对象针对DATA部分进一步做了划分和要求。

     上文说过,CAN总线协议的数据帧包含一个仲裁段,其前11位是帧ID。CANOPEN协议进一步把帧ID分为FunctionCode和Node-ID两部分,如下:

function CodeNode-ID
47

      由于Node-ID只有7位,最大值为127,所以CANOPEN协议的总线上最多有127个从站设备。functionCode和Node-ID在一起又被称为COB-ID。DLC则对应数据帧控制段的后4位,表示后续负载数据的长度。DATA与数据帧的数据段长度相同,至于有何用途,不同对象有不同要求。

functionCodeNode-IDDLCDATA
4bit7bit4bit8*8bit

    可见,CANOPEN协议的通信对象就是数据帧,只是进一步规定了数据帧的内容格式,所以说CANOPEN协议是基于CAN总线协议的应用层协议。

      常用的通信对象有NMT、SYNC、EMERGENCY、TIME STAMP、SDO、PDO,每一种通信对象都有自己的用途。本章重点介绍PDO对象,了解了这个对象的机理,其他对象也可以融会贯通。

       PDO对象称为“过程数据对象”,用于无连接的数据传输,即A站发送数据给B站后,不需要等待B站给出确认收到的应答。当然B站也可以应答一些信息给A站,这个有点像网络通信中的UDP协议,即应答不是强制要求的,B站可以回答,也可以不回答。PDO对象的DATA部分可以完全用来传输数据,没有进步做要求。

根据上文知道,CAN总线本质上是广播的,对于B站来说,它面临三个问题(假设B站是主站):

    1、总线上的通信对象是不是PDO对象,因为不同对象的数据部分的含义是不同的,需要不同的方式去解析?

    2、如何知道PDO对象是A站发出的?

    3、如何回答,即发送PDO给A站?

    对于问题1,B站是通过读取functionCode来判断当前总线上是不是PDO对象的。上文提到functionCode有4bit位,即有16个不同的functionCode。CANOPEN协议并没有硬性规定PDO对象必须使用那一个(或几个)functionCode,A站和B站可以自行约定。但是CANOPEN协议给了一个划分的《建议》(用书名号只是为了强调,不是真有一本叫做建议的书),既然是建议,你可以遵守也可以不遵守,但事实上,只要不是特殊情况,所用人都遵守了这个《建议》,如下:

对象functionCodeNode-IDCOB-ID
NMT(Model Control)0x00x00x0
SYNC0x10x00x80
TIME STAMP0x20x00x100
EMERGENCY0x10x1-0x7F0x81-0xFF
PDO0x3-0xA0x1-0x7F0x181-0x57F
SDO0xB-0xC0x1-0x7F0x581-0x67F
NMT(ERROR)0xD0x1-0x7F0x701-0x77F

       对于问题2和问题3,我们先假设A站的Node-ID为1,并且需要进一步引入TPDO和RPDO的概念才能解决。

       从上表中我们注意到PDO的functionCode是一个范围,共8个,即functionCode在此范围内的所有通信对象都是PDO对象。刚才提到的《建议》进一步对PDO进行了细分。以A站的PDO为例,如下表:

对象functionCodeNode-IDCOB-ID
TPDO10x30x10x181
RPDO10x40x10x201
TPDO20x50x10x281
RPDO20x60x10x301
TPDO30x70x10x381
RPDO30x80x10x401
TPDO40x90x10x481
RPDO40xA0x10x501

      通过上表,我们可以看出,从站A可以拥有8个PDO对象,其中4个为TPDO,4个为RPDO。下面来回答问题2,B站“如何知道PDO是A站发来的?”。答案就是检测PDO对象是否属于A站的TPDO,即COB-ID等于0x181,0x281,0x381或0x481。

     对于问题3,答案是B站(主站)发送属于A站的RPDO。A站检查到总线上有自己的RPDO就知道数据是发送给自己的。

上一节讲了“主-从”站间PDO对象的通信原理。不过有一个大前提就是我们遵循了《建议》,这就引申出如下两个问题:

  1. 《建议》给每个从站分配了4个RPDO对象,即每次主站最多只能发送4*8BYTE(64字节)的数据给从站,不够怎么办?
  2. 从站与从站之间如何通信?

      对于问题1,答案是不去遵守《建议》,自己根据需要规定,比如将0x281也规定为RPDO也可以,只要主站和从站都遵守这个规定就行。但这种情况是不多见的,因为《建议》本身是许多厂商共同商讨的结果,显然满足绝大部分应用情况。

        对于问题2,其实超出了CANOPEN协议的应用范围,因为CANOPEN协议是“主-从站”协议,这类协议的特点就是从站之间没有通信的渠道。如果需要通信,也是通过主站中转。比如从站A发给主站,主站再发给从站B,来实现从站A与从站B的通信。从我的工业经验来看,这种从站之间通信的情况就没发生过。

有了PDO对象的基础,SDO对象的说明就容易多了。

  1. SDO对象也分为TSDO和RSDO两种。(遵循《建议》)
  2. SDO对象是用来操作从站设备的数据字典的。
  3. SDO对象是一个有应答的通信对象,即主站发送RSDO给从站后,从站如果接收到,必须发送TSDO给主站进行应答。
  4. SDO对象对DATA段进行了进一步的规定和划分。

以下为SDO对象的结构

functionCodeNode-IDDLCControlCodeIndexSubIndexdata
4bit7bit4bit8bit16bit8bit32bit

     其中ControlCode、Index、SubIndex和data就是DATA部分,SDO对象对此进行了细分规定。Index,SubIndex和data的含义,可以参考前文数据字典部分的信号灯的例子。

     ControlCode在RSDO中经常表示此次操作是写入数据字典还是读取数据字典,在TSDO中表示写入是否成功,或者错误码一类的。虽然只有8bit,但是其构成还是挺复杂的,这里就不详细描述了,可以在网上找更加详细的文档来看。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CANopen协议文档是描述CANopen协议的一份文件,用于指导CANopen网络的设计、配置和实施。CANopen协议是基于CAN总线的开放式通信协议,用于在工业自动化和机器控制系统中实现设备之间的通信。 CANopen协议文档主要包括以下内容: 1. 协议介绍:文档会对CANopen协议的发展背景、目的和重要性进行介绍,以便读者理解该协议的应用领域和价值。 2. 协议结构:文档会详细描述CANopen协议的结构和层次,包括物理层、数据链路层、网络层和应用层。每个层级的功能和特点会被解释和说明,以便读者了解协议的组成部分和通信流程。 3. 对象字典:文档会列出CANopen协议中使用的对象字典,并解释每个对象的作用和属性。对象字典是CANopen协议中的核心概念,用于定义设备的功能和参数,读者可以根据文档中的说明进行对象字典的配置和应用。 4. 通信机制:文档会介绍CANopen协议中的通信机制,包括消息传输、节点控制和网络管理等方面。读者可以通过文档了解CANopen协议的通信规则和操作方法。 5. 应用示例:文档会提供一些实际应用场景的示例,以便读者理解CANopen协议在不同领域的应用方式和效果。 总之,CANopen协议文档是一份详细的指南,用于向读者介绍CANopen协议的基本概念、实现方法和应用技巧。通过阅读和理解这份文档,读者可以更好地使用和应用CANopen协议,实现设备之间的高效通信和协同工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值