CANopen通信之PDO通信

       过程数据对象(Process Data Object,PDO)是用来传输实时数据的,提供对设备应用对象的直接访问通道,它用来传输实时短帧数据,具有较高的优先权。PDO 传输的数据必须少于或等于 8 个字节,PDO 的 CAN 报文数据域中每个字节都用作数据传输,因此,在应用层上不包含传输控制信息,报文利用率极高。

       PDO 通信是基于生产者/消费者的通讯模式[13],如图 3-3 所示,每个 PDO 有一个唯一的标识符且可以通过一个节点发送,但有多个节点可以接收。由生产者发送的 PDO称为发送 PDO(TPDO),同样消费者接收的 PDO 称为接收 PDO(即 RPDO)。PDO 的接收不需要消费者的确认。

CANopen通信之PDO通信_第1张图片

                                                          生产者/消费者通讯模型

       每个 PDO 在对象字典中由两个对象描述:通信参数和映射参数。PDO 通信参数指明使用哪个 COB-ID,传输类型,禁用时间和定时时间;PDO 映射参数用于设定 PDO报文中的数据的映射关系,确定要传输的数据在 CAN 报文数据域中的定位。该参数允许 PDO 的生产者和消费者知道正在传输什么信息,而不需要在 CAN 报文中增加额外的协议控制信息,使传输的效率达到最高。一个 PDO 最多可以映射 64 个对象[7]。

       PDO 通讯具有三种触发模式:内部事件驱动或内部定时器触发、同步触发、远程请求触发。

       1) 内部事件驱动或内部定时器触发。通讯由某一事件触发。例如数字 I/O 口状态改变,超过预先设定的值、定时器中断等都会触发节点发送一个 PDO。这种模式可使总线负载达到最小,在相对低的波特率下获得比较高的通讯特性。

       2)同步触发。同步触发 PDO 是指 CANopen 节点收到由管理节点发出的同步报文(同步对象 Sync)之后,根据触发报文条件向总线发出 PDO 报文。同步传输又分为周期性和非周期性,周期性是指 CANopen 节点接收到一定数量的同步报文之后才开始发送;非周期性 PDO 是指 PDO 触发条件成立之后,当收到下一个同步对象后马上发送PDO。

       3) 远程请求触发。PDO 消费者可以给 PDO 生产者发送远程 PDO 请求,相应 PDO 生产者将对远程帧做出响应,向总线上发送相应的 PDO 数据。

PDO 通讯时的触发模式由 PDO 通信参数中的传输类型来确定,传输类型是一个 8位无符号整数,这个传输类型值的大小与 PDO 触发方式的对应关系如下表所示。

                                                         PDO 传输类型与 PDO 触发模式对应表

CANopen通信之PDO通信_第2张图片

      上表中的 SYNC 代表接收到同步对象,RTR 代表接收到远程帧,Event 代表事件发生,如数值改变或定时时间到了等。B 代表两个触发条件均满足时触发 PDO 传输,而 O代表一个或者两个触发条件满足时均可触发 PDO 传输。

      作为一个例子,假定第二个 transmit-PDO 映射如下(在 CANopen 中用对象字典索引 0x1A01 描述):

CANopen通信之PDO通信_第3张图片

      在 CANopen I/O 模块的设备子协议( CiA DSP-401) 定义中, 对象 0x6000 子索引 2 是节点的第 2 组 8位数字量输入,对象 0x6401 子索引 0x01 是节点的第 1 组 16 位模拟量输入。

       这个 PDO 报文如果被发送(可能由输入改变,定时器中断或者远程请求帧等方式触发,和 PDO 的传输类型相一致,可以在对象 0x1801 子索引 2 中查找),则由 3 字节数据组成,格式如下:


       通过改变对象 0x1A01 的内容, PDO 的内容可被改变(如果节点支持(可变 PDO 映射))。

       注意在 CANopen 中多字节参数总是先发送 LSB( little endian)。

       不允许超过 8 个字节的数据映射到某一个 PDO 中。

       在 CANopen Application Layer and Communication Profile ( CiA DS 301 V 4.02 ) 中 定 义 了MPDO(multiplexor PDO),允许一个 PDO 传输大量变量, 通过在报文数据字节中包含源或目的节点 ID、 OD中的索引和子索引来实现。举个例子:如果没有这个机制,当一个节点有 64 个 16 位的模拟通道时,就需要 16 个不同的 Transmit-PDOs 来传送数据。

       以上是介绍PDO在通信协议中的定义。下面介绍具体用PDO通信的例子。

      本次设计主站和从站使用的平台是RSB-4210和softlink CANopen I/O模块,我们设计这个系统的目的是读取 I/O模块输入端口和写输出端口的数据。

       SoftlinkCANopen I/O模块遵守基于DS301通信子协议之上的设备子协议DS401协议。CanFestival开源协议栈中集成了DS301协议与各个设备子协议之间通信的开源代码,故本次开发过程是基于CanFestival开源协议栈来完成的。

       Canpen的通信方式有PDO通信、SDO通信、NMT通信等多种方式,在对CANopen I/O模块的输入输出端口进行操作时,主要采用的是PDO通讯方式。在介绍具体实现过程之前,先介绍一下PDO通讯的机制。

        前面已经简单介绍过PDO的基本概念。过程数据通讯对象 PDO 是基于生产者和消费者模式来交换数据的,其索引和子索引都保存在各自的对象字典中,而不需要占用 CAN 报文的数据域空间,同时触发 PDO的方式非常多样化,因此采用 PDO 来交换过程数据效率会更高。为了保证输入输出端口数据传输的准确性,采用 PDO 来传输控制命令和实时数据。下面将从 PDO 参数的定义、从站 PDO 对象字典数据定义、PDO 的发送和接收等几方面来讲述 PDO 的整个通讯流程。

1PDO 通讯参数和映射参数的定义

由前面的介绍可知,PDO 分为 TPDO(发送 PDO)和 RPDO  (接收 PDO),每一个PDO 都在它的对象字典中通过“PDO 通信参数”和“PDO 映射参数”的对象条目来描述。

       PDO的通信参数定义了PDOCOB- ID、传输类型、抑制时间和事件定时器。例如TPDO1的映射参数的对象字典索引为 1A00h,子索引为映射到该 PDO 中待传输的数据所在的索引和子索引及数据长度。

各个PDO对象在对象字典中索引如下图所示:

CANopen通信之PDO通信_第4张图片

CANopen通信之PDO通信_第5张图片

2)主站和从站PDO通信的机制

       由前面介绍的PDO的基本概念及其在对象字典中的索引,在主站和从站采用PDO通信方式时,我们的思路是先配置主站的PDO的通信参数(COB-ID、数据传输类型),再配置从站的通信参数与主站一致,这样就建立了主站与从站的PDO通信的关系。然后再通过字典配置主站PDO映射参数,配置完成后主从站就可以通过PDO通信传输数据。

       这里以预定义中的TPDO1 为例,其通讯参数的对象字典索引为 1800h,它有 5 个子索引,各个子索引含义如下图所示,包括 COB-ID,传输类型,抑制时间和事件定时器等。映射参数的对象字典索引为 1A00h,子索引为映射到该 PDO 中待传输的数据所在的索引和子索引及数据长度。

CANopen通信之PDO通信_第6张图片

                                                 POD2的发送和映射参数描述地址及内容

       PDO传输的“总指挥”就是对象字典。PDO发送什么数据,接收什么数据,什么时候发送和接收,发送和接收的数据都放在哪儿,都是有对象字典配置。从CAN控制器看来就是一串帧的交互。下面简单的示意图可以描述一对主从站PDO1的发送和接收模型

CANopen通信之PDO通信_第7张图片

                                           一对主从站的PDO1的同步通信的模型


       本次调试的任务是向CANopen I/O模块的输出端口写入数据并输出,能读取I/O模块的输入端口的值,并显示在终端上。RSB-4210开发板上安装的的是Ubuntu 14.02系统。CanFestival开源协议栈中集成的开发例程TestMasterMicroMod是基于DS401协议,我们就在此基础上进行开发。

主站程序的设计流程:

1、 设置主站PDO1的通信参数;

2、 在主站进入预处理阶段,通过SDO配置从站PDO1的通信参数,配置传输类型为同步传输,COBID为主站PDO1对应的COBID

3、 关闭从站的PDO2PDO3PDO4.

4、 发送STARTNMT指令,让从站开始运行。此时主从站的PDO1通信已经建立起来。

5、 修改主站的对象字典,把PDO1的接收和发送参数映射到厂家自定义的区域,方便程序的读取和修改。

CANopen通信之PDO通信_第8张图片

        在主站和从站进行PDO通信之前,我们要先修改主站的对象字典。

4.2.1修改对象字典

      首先我们要根据DS401协议中,对象字典的中的定义和要求,检查主站的对象字典的配置,其步骤如下:

1) 在PC机上开启Ubuntu虚拟机,打开一个终端;

2) 输入 cd CanFestival-3-7740ac6fdedc/examples/TestMasterMicroMod#,

3) 切换到TestMasterMicroMod目录下;

4) 输入ls命令,可以看到该目录下有一个名为TestMaster.od的文件,该文件就是TestMasterMicroMod工程的对象字典;

5) 输入 两次cd ..命令,切换到CanFestival-3-7740ac6fdedc目录下;

6) 输入cd objdictgen/,切换到objdictgen目录下,在该目录下调用objdictedit.py工具来编辑对象字典;

7) 输入./objdictedit.py ../examples/TestMasterMicroMod/TestMaster.od命令,调用objdictedit.py工具编辑上一级文件中的TestMasterMicroMod的对象字典,弹出如下图所示的界面:

CANopen通信之PDO通信_第9张图片

                                                                         TestMasterMicroMod的对象字典

8) 在对象字典编辑器中,点击不同的索引范围,即可查看相应区域定义的数据类型和通讯对象的结构。在本次设计中,根据DS401协议和CANOPEN I/O设备手册的要求,我们主要查看TPDO1RPDO1的通信参数和映射参数的配置是否正确。

9) 由于本系统中CANOPEN I/O模块的输入与输出各有16位。根据阅读从站CANOPEN I/O设备的EDS文件和用户手册可知,CANOPEN数字I/O模块映射区(6000h6200h)的数据类型是UNSIGNED 8,所以我们在Manufacture Specific中定义输出输出各2个变量,如下图所示。

CANopen通信之PDO通信_第10张图片

                                                                                                                  输入输出变量定义

10) 阅读从站CANOPEN I/O设备的EDS文件和用户手册可知,CANOPEN I/O设备的IO口对应的映射参数中的数据类型是UNSIGNED 3216进制数,所以把对象字典的映射参数修改如下图所示:

CANopen通信之PDO通信_第11张图片

                                                                                                                        RPDO1映射参数

CANopen通信之PDO通信_第12张图片

                                                                                                                             TPDO1映射参数

11) 在对象字典中检查修改完PDO1的相关配置后,必须对SDO Parameter进行设置。如下图所示。我们把SDO配置成Client SDO, Client SDO能对主站的对象字典进行修改(servicer SDO是修改从站的对象字典,而从站的对象并不需要修改)。理论上我们需要添加99个(从站节点ID的范围)Client SDO,当从站的节点ID00~99范围内变化时,都可以与主站PDO建立联系(COB-ID变化)。这里主要是添加Client SDO,并修改其对应的值(值的大小查阅对象字典)。

CANopen通信之PDO通信_第13张图片

                                                                                                                      SDO参数配置

在主站对象字典配置完成后,主从站之间就可以实现PDO通信了。

综上所述,CANfestival很强大,开源代码提供了SDO的操作方法,修改配置从站的对象字典是关键。同时它也具备了图形界面修改编辑字典的优势,使主站设计更加方便。在源码中提供的操作DS401的例程,极大的缩短了主从站建立CANopen通信的开发周期。


4.2.2CANOPEN I/O设备的通信调试

        根据对象字典中定义的输入输出变量DI1DI2DO1DO2PDO同步传输数据如下:

void TestMaster_post_sync(CO_Data* d)

{

DO1++;//  8位数字输出端口

DO2++;// 8位数字输出端口

eprintf("MicroMod Digital In: %2.2x\n",DI1);//DI1表示低8位数字输入端口

eprintf("MicroMod Digital In: %2.2x\n",DI2);//DI2表示高8位数字输入端口

}

DO1表示低8位数字输出端口值,unsigned char类型。

DO2表示高8位数字输出端口值,unsigned char类型。

DI1表示低8位数字输入端口,unsigned char类型。

DI2表示高8位数字输入端口,unsigned char类型。

DI1DI2会打印到串口终端上。


4.2.3编译调试结果分析

       程序修改完成,保存退出。基于RSB-4210 ARM开发板上Ubuntu14.02的系统,编译调试的过程如下:

1) 把SD卡插在电脑上,在Ubuntu终端窗口上切换到CanFestival-3-7740ac6fdedc目录下,将修改好的canfestival源代码工程(can_new.tar.gz)压缩打包,并拷贝到SD卡上,拷贝完成后取出SD卡插入ARM板;

2) 打开串口工具,在ARMrivo下启动系统后,输入sudo su,切换到root用户下运行;

3) 输入fdisk –l命令,查看存储分区情况,如下图所示:


4) 输入mount –t vfat /dev/mmcblk1p1 mnt命令,将SD卡的文件系统挂载到mnt(一个空目录)下,现在我们就可以在mnt目录下看见SD卡的文件系统了;

5) 输入cp can_new.tar.gz ~/命令,将canfestival源代码工程(can_new.tar.gz)拷贝到Ubuntu系统根目录下,这样下次上电重启后就不用重新挂载了。

6) 输入cd 命令,查看该目录下的can_new.tar.gz文件;

7) 输入tar xzvfm can_new.tar.gz命令,解压出文件夹CanFestival-3-7740ac6fdedc;

8) 输入ip link set can0 type can bitrate 500000 命令,设置通信波特率为500K

9) 切换到CanFestival-3-7740ac6fdedc目录下,输入命令

10) ./configure --cc=arm-linux-gnueabihf-gcc --arch=arm --os=unix --kerneldir=/usr/src/linux-3.5.7  --prefix=$PWD/myinstall  --target=unix  --can=socket  --timers=unix --debug=WAR,MSG 来配置编译工具、编译条件和环境等;

11) 输入make clean命令,删除原有的所有编译过的残余文件,只剩下源代码;

12) 输入make all命令,选择满足配置条件的文件全部编译;

13) 输入 make install命令,将编译好的文件放在myinstall文件目录下;

14) 输入cd ~/myinstall/bin 命令,切换到bin目录下;

15) 输入./TestMasterMicroMod –h 命令,查看执行该文件的格式如下图所示:

CANopen通信之PDO通信_第14张图片

16) 根据提示,输入./TestMasterMicroMod -l ../lib/libcanfestival_can_socket.so -i 0x00 -m 0 -M 500K命令,执行TestMasterMicroMod,即可看见canopen I/O模块上输出端口上数据的变化,串口工具上返回的输入端口的数据和PDOSDO通信的信息如下图所示:

CANopen通信之PDO通信_第15张图片

        输出的信息可以看出PDO数据传输时的详细信息,输入端口的返回值根据输入端口的接线情况变化而不同。

你可能感兴趣的:(CANopen通信之PDO通信)