canopen报文格式,通信及映射参数

CanOpen协议是在标准的CAN总线上运行的应用层协议,其通信模式也是工业通信协议常用的“主从”模式通信,也就是网络中会有一个主站+多个从站,从站之间不会直接互相通信,所有通信都是主站与从站之间进行的。主站也被称为“客户端”,从站也被称为“服务器”。

底层通信方式使用CAN标准帧格式,也就是CAN ID为11位(0x000~7FF),数据8字节。简单的看,协议主要是定义了:

1、CAN ID的使用约定。

2、CAN数据部分8个字节的使用约定

由于本人也是初学者,之前只是对CAN的链路层和使用比较熟悉(就知道有CAN ID和8字节数据),一般初学者会建立在自己已知范围内去对一些未知的内容进行了解,所以本文从这两个角度展开讲解,把初学者熟悉的CAN报文翻译成CanOpen的内容。

——EXyang

1、对于CAN ID的使用约定:

把11位的ID分割为4bit的功能码和7bit的节点ID,并且CAN ID也被称为COB ID

canopen报文格式,通信及映射参数_第1张图片

节点号就是can总线上的各个从设备节点,注意从站节点号不能为0,这里也同时说明了在CANOPEN中的从站个数最多为127个。

而对于功能码的划分则比较复杂,其缺省的说明如下图:

canopen报文格式,通信及映射参数_第2张图片

从图中可以看到COB-ID有分为广播型和子站对象节点型两种,对于广播型的通信,节点号为0;对于和节点从设备的通信,会有节点号来表示要通信的从设备。图中的“通讯参数在OD中的索引“是指这些CAN ID发送的报文相关的定义放在OD对象字典“的索引之中。对象字典会在后文进行讲解。

上图中的功能码列表是缺省的,只是连接的预定义集合。其他的还有例如下图表中白色的部分(配上这张图只是为了表示还有其他的类型数据,而不是列出所有的类型,具体可以详细查看CANOPEN的标准规范):

canopen报文格式,通信及映射参数_第3张图片

2、对于CAN数据内容的使用约定:

接下来介绍CAN数据内容的8个字节使用,上文中COB-ID的功能分配里可以看到PDO和SDO的类型,这两种类型就是CanOpen中的主要通信方式,本文主要介绍的就是这两种类型。

这两种CAN ID代表的数据对8字节的使用定义有所不同;但是,他们通信目的都是为了访问从设备里的各种数据,也就是在canopen中被称之为“对象字典”的数据。

2.1、对象字典

要了解SDO\PDO通信协议之前,我们首先要对通信的内容有所了解,也就是“对象字典“的概念,这样可以清楚的知道SDO\PDO的通信目的,要获取的具体内容。

对象字典”这个概念其实就是各类数据的“键值对”,只要提前给设备定义好各种数据的编码,在读写这些数据时就根据编码进行查找,就像一部字典一样。(这个概念和MODBUS协议的数据地址分配机制是十分相似。)可以把一个设备理解为一部“字典“,字典中有的数据就是主站需要查询并读写的各种数据(比如获取温度、电流或控制从设备的动作等),其中一些数据是用来定义CAN的各类数据通信的(比如SDO、PDO的数据怎么发、发什么等)。

对象字典中使用一个16位长度的Index作为主索引进行数据查找,规范中定义了主索引对应的数据功能,总体概述如图所示:

canopen报文格式,通信及映射参数_第4张图片

以上图中的0x1000~1FFF为例,这里面的区域又被规范定义细分,如下图所示:

canopen报文格式,通信及映射参数_第5张图片

以上图中的0x1000~1029为例,这里按照规范又有进一步的细分,如下图所示只列出了前三个对象,其他具体的可以查看规范文档:

canopen报文格式,通信及映射参数_第6张图片

CanOpen考虑到主索引不够用的情况,为了增强灵活性,在主索引下还有一个8位长度的SubIndex子索引进行数据细分,有的字典对象索引会有子索引扩展,如图:

canopen报文格式,通信及映射参数_第7张图片

从上面的几张对象字典的描述图可以看到对象字典被规范预分为了不同的功能区域,有的被规范直接定义了它的具体数据内容,有的是留给开发人员(制造商)自定义使用的,对象字典特点描述:

1、每个对象采用一个 16 位的索引值Index来寻址,这个索引值通常被称为索引,其范围在 0x0000到 0xFFFF 之间。 为了避免数据大量时无索引可分配,所以在索引下也定义了一个 8 位的索引值,这个索引值通常被称为子索引SubIndex,其范围是 0x00 到 0xFF 之间。(也可以说索引Index+子索引SubIndex才是完整的指向某一个具体的数据,当某一索引下不需要子索引来扩展时,子索引0x00的值就是当前索引的数据内容;当某一索引下需要有一些子索引来表示更多数据时,子索引0x00的值表示的是这个索引下面还有几个子索引。)

2、大部分索引内具体的参数,最大用 32 位的变量来表示,即 Unsigned32,四个字节。

也有特别的对象字典超过4字节,比如要使用SDO多段传输来上传、下载的对象。

每个 CANopen 设备都有一个对象字典,使用电子数据文档(EDS 文件)来记录这些参数。对于 CANopen 网络中的主节点来说,不需要对CANopen 从节点的每个对象字典项都访问。

3、CANopen 对象字典中的项由一系列子协议(也就是不同行业对对象字典的定义形成的标准)来描述。子协议为对象字典中的每个对象都描述了它的功能、名字、索引、子索引、数据类型,以及这个对象是否必需、读写属性等等,这样可保证不同厂商的同类型设备兼容。CANopen 协议的核心描述子协议是 DS301,其包括了 CANopen 协议应用层及通信结构描述,其它的协议子协议都是对 DS301 协议描述文本的补充与扩展。在不同的应用行业都会起草一份 CANopen 设备子协议,子协议编号一般是 DS4xx 。

2.2、SDO通信报文格式

SDO的通信报文是canopen中的一个基本协议格式,是最容易理解的针对对象字典的读写访问协议方式。SDO的CAN ID可以看第1章中的ID分配,CAN报文中的8字节数据被通信协议定义为如下图的格式:

canopen报文格式,通信及映射参数_第8张图片

从上图中我们可以看到,这个格式简单明了,就是根据“命令代码”对指定的对象字典进行读、写等操作,通过这种方式,主站与从站直接就可以实现基本的有效通讯了。

这里我们看到数据部分只有4个字节,如果数据在4字节以内,就可以使用这个格式在一条报文实现,也就是快速传输方式。虽然使用快速传输方式对大部分的对象字典进行操作已经可以满足了,但是对于超过4字节的特殊对象,这个格式显然无法满足。

SDO为了能够传输超过4字节的字典对象,在原本的格式上做了不同的格式变化以便能够传输更长的数据内容,也就是分段传输方式

2.2.1、快速传输方式

快速传输方式对索引对象的操作分为读指令和写指令。

2.2.1.1、读指令CAN报文格式及交互过程:

canopen报文格式,通信及映射参数_第9张图片

2.2.1.2、写指令CAN报文格式及交互过程:

canopen报文格式,通信及映射参数_第10张图片

图中的符号”-“表示数据不予考虑,使用0进行填充。

总结一下快速传输的过程:由前文描述可以看到,在通信时仅仅只要使用对应数据长度的指令发送对应索引对象的数据,主机(客户端)就可以实现对从机(服务器)的读、写操作了。

2.2.2、分段传输方式

分段传输方式与快速传输方式的区别是在于分段传输为了传输更大量的数据,把分段读、写操作都分别分成了三个阶段进行:

  1. 初始报文,在传输数据之前确认要传输的数据长度。
  2. 传输过程报文,按照传输规则把数据分成多次分段进行传输。
  3. 结束报文,数据分段的最后一段数据。

2.2.2.1、分段传输的读操作

1、分段读初始报文:获取从站(服务器)指定索引对象的读取数据长度,与快速传输的读指令一致使用0x40指令(这里同时也就说明分段读取是由从设备的返回数据所决定的,这里返回的是0x41指令而不是快速传输中的0x43、47等指令):

canopen报文格式,通信及映射参数_第11张图片

2、分段读传输过程报文:在传输过程中,主站(客户端)先发送指令0x60的报文开始读传输,同时从站(服务器)响应0x00指令的报文上传一段数据;下一帧主站发送0x70指令的报文,这时从站响应0x10指令的报文继续上传下一段数据,然后又会再次按照0x60-00、0x70-10的顺序接着往下传输后续的数据,每次7个字节。最后的一段数据将会进入结束报文阶段,其实要是总数据大小不超过7也会一开始直接进入结束阶段。

canopen报文格式,通信及映射参数_第12张图片

3、分段读结束报文:在上一个阶段中,数据是按照0x60-00、0x70-10的顺序进行交替传输,当发送到最后一段数据时,主站并不知道是到达最后一段了,所以主站发送的 “0x60或70“指令保持不变,而其对应从站的响应指令”0x00或10“替换成对应的结束指令,如下图所示:

canopen报文格式,通信及映射参数_第13张图片

2.2.2.2、分段传输的写操作

1、分段写初始报文:通知从站(服务器)指定索引对象的写入数据长度,使用0x21指令发送这个长度值:

canopen报文格式,通信及映射参数_第14张图片

2、分段写传输过程报文:在传输过程中,主站(客户端)先发送指令0x00的报文开始读传输,同时从站(服务器)响应0x20指令的报文上传一段数据;下一帧主站发送0x10指令的报文,这时从站响应0x30指令的报文继续上传下一段数据;然后又会再次按照0x00-20、0x10-30的顺序接着往下传输后续的数据,每次7个字节。最后的一段数据将会进入结束报文阶段,要是总数据大小不超过7也会一开始直接进入结束阶段。

canopen报文格式,通信及映射参数_第15张图片

3、分段写结束报文:在上一个阶段中,数据是按照0x00-20、0x10-30的顺序进行交替传输,当发送到最后一段数据时,主站会把“0x00或10“指令替换成对应的结束指令,而其对应的从站响应指令”0x20或30“保持不变,如下图所示:

canopen报文格式,通信及映射参数_第16张图片

2.2.3、异常终止代码

前文介绍的图表中我们看到在通信的接收方回复的报文分为正常和异常,发送的异常报文使用指令0x80表示接收方发现有错误,发起SDO终止传输请求,使对方停止当前的SDO传输。此时的数据段中的内容为4字节中止代码,表示了终止的异常原因,终止代码如下所示:

canopen报文格式,通信及映射参数_第17张图片

canopen报文格式,通信及映射参数_第18张图片

2.3、PDO通信报文格式

上面介绍的SDO通信是对对象字典的单独读写操作,而PDO则是可以理解为多个对象字典的值放在同一个CAN报文中一口气发出去,CAN报文数据段的8字节完全用作存放各个对象字典的数据内容,而且PDO发送之后是没有像SDO的返回响应报文机制的,目的是为了快速送达一些优先级更高的数据。由于一条PDO中8字节数据有64位长度,所以最多可以包含64个1bit长的对象字典。

PDO有分为接收RPDO和发送TPDO,这里的收发是站在从站设备的角度取名的,对于主站就要反过来叫。可以看第1章中的CAN ID分配中的相关定义(预定义上每个从设备都预分配了4对R/TPDO,但是如果某一从站需要超过4个的PDO时,只要不影响其他从站的ID使用,可以把没有实际使用的节点的那些ID专门分配给这一从站作为扩展PDO)。

2.3.1、PDO通信参数和映射参数

那么PDO的CAN数据段里既然都是实际对象的数据值,那么接收方是如何知道这些数据的哪些位、字节分别对应的是什么对象呢?

答案就是:需要在PDO通信之前,先在通信双方的对象字典中指定好每条PDO里面的各个对象排列位置(这个过程也可以在初始化时使用SDO通信方式由主站去设置从站的相关对象字典以达成字典定义一致),这些字典去定义各个对象在PDO的数据位置的概念就叫做PDO映射,这部分的字典就是映射参数

除了映射参数定义了数据内容之外,还需要有定义数据在何时发送、发送指定的CAN ID等配置参数,这部分配置参数所对应的字典就是通信参数

映射参数和通信参数通俗的说就是:前者定义了CAN数据段中8字节的数据都是谁组成的,后者定义的是由哪条CAN ID发送以及怎么发、发送触发条件。

RPDO和TPDO分别都有自己独立的映射参数,在对象字典中的索引分配为:

RPDO:通信参数:索引=1400~15ffh,映射参数:索引=1600~17ffh,由1400h对齐1600h索引为起始,后面的索引一一对应相关联的参数。

TPDO:通信参数:索引=1800~19ffh,映射参数:索引=1A00~1Bffh,由1800h对齐1A00h索引为起始,后面的索引一一对应相关联的参数。

2.3.1.1、通信参数

通信参数对象字典:

canopen报文格式,通信及映射参数_第19张图片

Number of entries 参数条目数量:即本索引中有几条参数;

COB-ID:即这个 PDO 发出或者接收的对应 CAN 帧 ID;

发送类型:即这个 PDO 发送或者接收的传输形式,通常使用循环同步和异步制造商特定事件较多;

Inhibit time 生产禁止约束时间(1/10ms):约束 PDO 发送的最小间隔,避免导致总线负载剧烈增加,比如数字量输入过快,导致状态改变发送的 TPDO 频繁发送,总线负载加大,所以需要一个约束时间来进行“滤波”,这个时间单位为 0.1ms;

Event timer 事件定时器触发的时间(单位 ms):定时发送的 PDO,它的定时时间,如果这个时间为 0,则这个 PDO 为事件改变发送。

SYNC start value 同步起始值:同步传输的 PDO,收到诺干个同步包后,才进行发送,这个同步起始值就是同步包数量。比如设置为 2,即收到 2 个同步包后才进行发送。

2.3.1.2、映射参数

举例描述,以CANopen中用对象字典索引0x1A01为例:

canopen报文格式,通信及映射参数_第20张图片

这里展示了映射参数的格式:

  1. 子索引0的值定义了这个PDO数据中映射了几个对象,这里是2个。
  2. 子索引>0的值定义了具体映射了哪些对象,这些对象会按顺序排列到CAN数据段8字节中去。

2.3.2、PDO理解思路

前文描述了PDO的几个关键内容,这里做一个总结把这些内容和主要名词连贯起来,并举例帮助理解:

1、问题:例如 CAN ID预定义了从站的4对PDO,那么这4对PDO所对应的CAN报文到底要收发什么数据呢?

2、思路:首先从对象字典中找到这个CAN ID被哪个通信参数中的子索引0x01所指定,例如从站Node ID=1的设备具有一个TPDO2可以发送数据,其COB ID=0x281,对应的通信参数为0x1801索引对象,而由0x1801这个对象我们又可以找到通信对象对应的映射对象:0x1A01,那么又从映射参数0x1A01中我们可以知道这个CAN ID中的报文数据的具体内容了。

canopen报文格式,通信及映射参数_第21张图片

另一个完整的例子使用图文理解:

TPDO1 通讯参数 1800h, 映射参数 1A00h, 数据存放为 2000h 之后厂商自定义区域。

canopen报文格式,通信及映射参数_第22张图片

你可能感兴趣的:(笔记,其他)