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

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

生产者/消费者通讯模型

每个 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 触发模式对应表

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

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

在 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模块输入端口和写输出端口的数据。

Softlink的CANopen 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 的整个通讯流程。

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

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

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

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

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

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

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

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

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

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

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

主站程序的设计流程:

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

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

3、 关闭从站的PDO2,PDO3,PDO4.

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

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

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

4.2.1修改对象字典

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

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

2) 输入 cdCanFestival-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的对象字典,弹出如下图所示的界面:

TestMasterMicroMod的对象字典

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

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

输入输出变量定义

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

RPDO1映射参数

TPDO1映射参数

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

SDO参数配置

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

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

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

根据对象字典中定义的输入输出变量DI1、DI2、DO1、DO2,PDO同步传输数据如下:

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类型。

DI1和DI2会打印到串口终端上。

4.2.3编译调试结果分析

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

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

2) 打开串口工具,在ARM板rivo下启动系统后,输入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--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 命令,查看执行该文件的格式如下图所示:

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

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

canopen pdo通信c语言,CANopen通信之PDO通信相关推荐

  1. 单片机双机通信c语言实验心得,单片机双机通信实验报告.doc

    单片机双机通信实验报告 计算机与信息工程学院综合性实验报告 专业:物联网 年级/班级: 2015-2016学年第一学期 课程名称单片机原理及应用指导教师学号姓名实验地点实验时间2015.11.14项目 ...

  2. canopen服务器协议,CANOpen协议如何保证通讯不丢帧?-通信/网络-与非网

    摘要:如何让现场总线通讯更加稳定可靠,不丢失,这向来都是工程师们难以解决的问题.本文将运用国际规范的通讯协议来展示怎样才能搭建好握手通讯. 服务数据对象 SDO(Service data object ...

  3. 管道通信C语言,Go语言通道(chan)——goroutine之间通信的管道

    如果说 goroutine 是 Go语言程序的并发体的话,那么 channels 就是它们之间的通信机制.一个 channels 是一个通信机制,它可以让一个 goroutine 通过它给另一个 go ...

  4. 从入门到入土:基于C语言采用TCP协议实现通信功能的程序(仅有代码)

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  5. 从入门到入土:基于C语言采用UDP协议实现通信功能的程序

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  6. 半双工通信是指c语言,Linux下C语言实现半双工的UDP通信

    ------------恢复内容开始------------ Linux下C语言实现半双工的UDP通信 1.单向通信:又称为单工通信,即只能有一个方向的通信而没有反方向的交互.无线电广播或有线电广播以 ...

  7. c语言管道通信实例,C语言辅导:VC命名管道通信的实现

    无论是SQL Server的用户,还是PB的用户,作为C/S结构开发环境,他们在网络通信的实现上,都有一种共同的方法--命名管道.由于当前操作系统的不惟一性,各个系统都有其独自的通信协议,导致了不同系 ...

  8. 多路双向串口转网口上位机C++源代码带主动连接支持UDP和TCP客户端Socket通信C语言

    多路双向串口转网口上位机C++源代码带主动连接支持UDP和TCP客户端Socket通信C语言 使用说明介绍 1.功能介绍: 完成了多路网口和串口数据转换的功能. 可实现串口接收到的数据,通过网口发送出 ...

  9. C# 语言 和西门子S7200 smart通信

    C# 语言 和西门子S7200 smart通信 界面如截图所示,关注公众号Aidu_auto,回复软件包,获得DEMO(VS2013 C#) 支持断线重连!详细情况见软件包帮助文件. 或百度网盘: 链 ...

最新文章

  1. 怎么用python找论文_如何利用Python绘制学术论文图表方法
  2. Java处理excel根据某列的值查询,并将结果显示在其他列中
  3. 《Android App开发入门:使用Android Studio 2.X开发环境》——1-2 在计算机的仿真器上执行 App...
  4. 转载、Python的编码处理(二)
  5. C# 这些年来受欢迎的特性
  6. Qt之QProcess(一)运行cmd命令
  7. $_SERVER['REQUEST_URI']和$_SERVER[HTTP_X_REWRITE_URL]的区别
  8. hihocoder #1617 : 方格取数(dp)
  9. UI实用素材|APP动效设计
  10. python调用hive与java调用区别_python3.6.5基于kerberos认证的hive和hdfs连接调用方式
  11. L1-045 宇宙无敌大招呼-PAT团体程序设计天梯赛GPLT
  12. 2017-07-12 周三 今日总结
  13. Android仿微信源码下载
  14. 用友U8案例教程财务报表
  15. 超简单!用 Python 为图片和 PDF 去掉水印
  16. 计算机二级保存错地方,盘点考计算机二级那些容易出错的地方
  17. Pycharm生成决策树
  18. 常见的负载均衡器(一)
  19. 数据分析可视化- 十三朝古都西安
  20. [Neo4j] CQL命令

热门文章

  1. opencv把图片转换成二进制_Python+OpenCV实现将图像转换为二进制格式
  2. Linux基础-apt-搜狗输入法
  3. 13. Linux权限管理命令
  4. MySQL学习笔记04-DDL语句学习
  5. win10的Win快捷键使用简易操作方法
  6. 小米路由器编程器强刷breed,可用于救砖,恢复官方系统,恢复SN
  7. Java创建单例模式(singleton)的几种实现方式
  8. google 云开启 ssh 账号密码登录
  9. 一度智信:拼多多探路知识普惠
  10. 复活→移步:https://beiyuouo.github.io/