Windows下的Powerlink主从站通信-(现场总线作业——NJIT)
- 一、设计任务(要求)
- 二、Powerlink工作原理
-
- 1、Powerlink简介:
- 2、Powerlink设备类型及设备模型
- 3、 openPowerlink 源码简单介绍
-
- (1) 下载网址是 http: //sourceforge.net/projects/openpowerlink
- (2) 源码目录介绍
- 三、 总体实现方案流程及软件框图
-
- 1、XDD文件修改与配置:
- 2、openconfigurator使用
-
- (1)要使用openconfiguator,首先安装ActiveTcl,界面如图三所示,直接点击NEXT按钮安装即可。
- (2)安装openConfigurator,这里使用的版本为1.4.1,还是因为之前的原因,只有这个版本能在windows上运行,安装也很简单。
- (3)我们新建一个openconfigurator工程,按如下图四、图五、图六所示进行配置。
- (4)右键点击主站, 添加一个从站,如图八所示:
- (5)展开从站的 OD 树,可以看到各种 Object 信息,包括网络配置, PowerLink 状态机参数,以及 PDO,这里我们只关注从站的 PDO 及其映射。可以看到默认情况下,右边的映射列表里面所有值都为0,接下来我们来进行配置。如图十所示:
- (6)我们来看看 openConfigurator 的图形界面做映射, 实际产生了如图十二所示效果。
- (7)生成主站的 PDO 映射及总线网络配置参数文件 cdc
- (8)配置网络参数
- 3、主站应用层程序修改
- 4、总体实现方案流程:
- 5、软件框图
- 四、 设计调试结果
- 五、 设计总结
一、设计任务(要求)
两人一组,一人作为主站(MN),一人作为从站(CN),实现Windows下的Powerlink主从站通信,在两台PC的控制台分别显示
1、 MN:姓名和学号
2、 CN:姓名和学号
3、根据任务书要求,完成以下设计任务:
(1)参考学习《Powerlink实现以太网教程》相关部分,学习怎样修openPowerlink源代码,怎样使用openConfigurator配置从站网络参数和映射参数
(2)在Windows系统下安装Visual Studio 2008,编译openPowerlink开源代码
(3)利用开源配置工具openConfigurator配置网络参数和映射参数,将产生的mnobd.cdc和xap.h文件放置正确的目录下
(4)根据配置参数,修改源代码相关部分,重新编译源代码,完成主从站通信功能,并在控制台显示各自的姓名和学号
(5)通过wireshark进行功能演示,对监视到的Powerlink数据帧进行解析,通过解析数据帧,能够正确说明各数据域的内容,例如:该数据帧的目的/源MAC地址,以太帧类型,Powerlink数据帧类型,Powerlink目的/源地址,等等。
二、Powerlink工作原理
1、Powerlink简介:
Ethernet Powerlink 是一种工业以太网现成总线协议。 Powerlink 协议对标准的以太网数据链路层进行了简单的修改, 将 CSMA/CD 机制禁用, 从而由主站完全控制网络上数据的收发过程, 从而保证了严格的时间特性, 实现实时通讯功能。
Powerlink 的软件实现仅对传统的操作系统的网络驱动程序做修改, 去掉基于中断的网络 IO 流程, 仅保留网卡初始化以及收发函数。 主站网络数据的发出是由高精度的时钟触发的, 定时与从站进行 IO 操作。 一般主从站直接采用主站轮询从站的形式来传送实时同步性的数据, 在一个循环周期的后部分时间内来传送非实时要求的普通数据。
Powerlink 协议有很好的开放性,包括一个开源的软件和 FPGA 实现openPowerlink, 并存在一个开源的 OpenConfigurator 软件来对整个网络进行配置, 能够省却一部分代码上的开发工作, 能够在网络运行时重新配置整个网络。
Powerlink 协议在应用层使用 CanOpen 协议, 用户编程基本上是面对对象字典,PDO(过程数据对象) 和 SDO(服务数据对象) 及其映射关系的定义。 对象与我们设备上的数据单元对应, 比如一个 8bit 的输入数据, 32bit 的长整形数据,以及字符串, 时间, 温度等等。 一组数据对象则构成一个对象字典。 PDO 是同步实时的数据对象, SDO 是异步非实时的。 CanOpen 定义了一些工业自动化方面的设备规范, 会详细描述某类设备应该支持哪种数据类型, 索引以及子索引等信息。 一般来说开发一个 powerlink 设备应该跟开发 CanOpen 设备一样去实现规范的定义
2、Powerlink设备类型及设备模型
我们知道 Powerlink 的应用层协议是 CanOpen, CanOpen 对设备类型进行了规范,并详细定义了每种工业设备的功能以及数据定义。 这里我们使用比较简单的 IO设备模型, 但是因为对象字典的定义都为自定义, 所以很容易理解, 并且会使用自定义的 OD, 对于符合标准规范的 OD 定义也是同样道理。
我们假设这样一个设备模型, 从站是一个常见的按键与 LED 类型输入输出设备, 对于从站, 我们定义有个两个按键 onBoardKey: keyA 与 keyB, 然后有两个LED 灯: LEDa 与 LEDb。应用场景是, 主站访问从站的输入元素 keyA 与 keyB, 并根据 keyA 与 keyB 的输入电平来点亮和关闭从站的 LED 灯。 keyA 与 LEDa 对应, keyB 与 LEDb 对应。 如果 keyA 高电平, 则主站输出数据点亮 LEDa 命令 1, 反之, 输出命令 0。从站根据从主站得到的命令状态来管理自己板子上的 LEDa 与 LEDb 的亮灭状态。 具体如图一所示:
图一:
可见这是一个典型的主站与从站交互过程, 基本可以代表主从站的设备通信的场景。
3、 openPowerlink 源码简单介绍
(1) 下载网址是 http: //sourceforge.net/projects/openpowerlink
这里使用的是旧版本V1.7.1,因为新版本openPowerlink已经作为Eclipse的插件了,因此不能单独在windows上运行了。
(2) 源码目录介绍
解压下载的源码, 内容如下图二所示:
图二
Documentation: 是文档目录, 不过目前不是特别完整。
EplStack : Powerlink协议实现, 都是ANSI C文件。
Include : 头文件目录, API接口声明。
Target : 平台相关代码, 因为powerlink涉及系统高精度时钟。
Edrv/ : openPowerlink支持的网卡驱动。
SharedBuff : 共享数据缓存, powerlink协议栈高速收发数据之用。
ObjDicts : 数据字典目录, 一般一种从站一个, 主站公用一个。
Examples : 各种主从站例程存放目录
CMakeLists. txt : 主目录CMake项目管理文件。
一般开发主从站, 我们仅需要对ObjDicts与Examples目录熟悉即可, 并能够对Examples \X86\Windows\VC9\demo_pcap的例程使用Visual Studio 2017进行主从站参数修改即可。
三、 总体实现方案流程及软件框图
1、XDD文件修改与配置:
XDD 为设备描述文件, 是Powerlink中用来描述对象字典的电子说明文档,通常由设备供应商提供,其实是一个 XML文件, 此文件包括 3 个部分:
一是 header部分, 定义设备的一些描述信息, 包括设备名称, 厂商, 型号, 版本号, 软件硬件固件版本, 遵循的 Powerlink 协议版本等;
二是设备的数据字典定义及与收发通道的映射关系;
三是设备的网络通讯参数。
开发一个从站,我们以一个 现有XDD 文件作为模板, 然后修改或者添加我们关注的部分。实际上 XDD 文件 2 部分和 3 部分都是以 object 的形式表现的。 CanOpen 协议将设备的参数和收发通道映射关系以及网络通讯参数都抽象成了数据对象(object), 因为本质上这些东西无非就是数据而已。 不同的是, 对于每类数据对象, 都分配了索引号(ID 号), 而 ID 号或者 ID 号段的不同就代表了不同的功能。
设备纯粹的数据对象 OD 的索引号一般在 0x2000 之后, 这个段是厂家自定义参数段。 0x6000 后的是设备定义数据段。 0xA000 之后完全由厂家和设备自定义。而 0x2000 之前的用来配置通讯参数与主从站本身的其他信息。
0x1400 到 0x1A00 段是数据与收发通道的映射配置区域, 包括两个子段: PDO定义区及 PDO 映射区。 PDO 代表一个接收或者发送通道, 仅仅是通道的类型声明。 PDO 映射区代表 OD 数据与通道之间的映射关系, powerlink 协议栈根据这个映射关系来安排接收和发送数据的顺序。 这样就能够清楚, 当一个 powerlink数据帧被发送或者接收时, 从前到后都分别是什么数据, 代表什么意思, 这样才能跟 OD 相对应。 对于 PDO, 根据收发的不同, PDO 被分为 TPDO 和 RPDO 两部分。 RPDO 通道的定义在 0x1400, 映射在 0x1600, TPDO 通道的定义在 0x1800,映射在 0x1A00 段。
实际上, 因为 openConfigurator 的强大功能, 我们在开发从站的时候不用那么繁琐的在 XDD 文件里面描述映射关系, 这样, 就只剩余两部分内容: OD 定义和PDO 通道定义。
2、openconfigurator使用
openConfigurator 的安装需要先安装 ActionScript 的 TCL(一种脚本语言) for windows 环境, 这个安装请选择 32 位版本, 另外, 经过测试, 目前的openconfigurator 在 win 7 64 位下测试不兼容, 在读取 XDD 文件的时候会报错,一般我们建议在 win XP 32bit 下来运行, 因为 openConfigurator 的一部分代码使用了 system 函数来运行 dos 命令, 这种代码的做法在 win7 兼容性不好, 尤其是64 位运行 32bit 的复杂环境。
(1)要使用openconfiguator,首先安装ActiveTcl,界面如图三所示,直接点击NEXT按钮安装即可。
图三:ActiveState安装界面
(2)安装openConfigurator,这里使用的版本为1.4.1,还是因为之前的原因,只有这个版本能在windows上运行,安装也很简单。
(3)我们新建一个openconfigurator工程,按如下图四、图五、图六所示进行配置。
图四:创建新的工程
图五:工程配置
图六:工程配置
注意, 这里选择主站的 XDD, 我们使用默认, 一般来说, openConfigurator 给的默认主站就足够我们的开发了, 没有特殊需要, 一般我们不用自己编写主站的XDD 文件。
然后, 我们选择视图为高级模式, 以便看到详细的主从站 object 信息。如图七所示:
图七:主站Object信息
(4)右键点击主站, 添加一个从站,如图八所示:
图八:从站添加
这里, 我们导入之前搞定的从站 XDD 文件,如图九所示:
图九:导入XDD文件
(5)展开从站的 OD 树,可以看到各种 Object 信息,包括网络配置, PowerLink 状态机参数,以及 PDO,这里我们只关注从站的 PDO 及其映射。可以看到默认情况下,右边的映射列表里面所有值都为0,接下来我们来进行配置。如图十所示:
图十:Object详细信息
配置两条 TPDO 映射, 实际上新版本的 openConfigurator 会根据我们定义的 XDD文件中 object 的 mapping 属性来自动列出 index 中哪些值可用, 这里, 我们点击index 列的输入框, 会在下拉列表中有0x6000的选项, 选择它便是, 然后依次是subindex, length, 当选择了 length 参数, offset 会被自动计算得出。 如果是按照我们之前的 XDD 文件, 正确的映射配置应该如下图十一所示:
图十一映射配置
接着我们用同样的方法来配置 RPDO, 可以看到 RPDO 的 index 是0x6001, 其他都是一样的, 因为我们的变量都是 U8类型。
因为 openConfigurator 的支持, 我们来配置一个从站的 PDO 映射现在就只这么简单就够了, 所以对于一个任意类型设备的从站, 只要厂家提供了正确的 XDD文件, 我们导入, 然后用这样的办法来做映射设置就可以了。
(6)我们来看看 openConfigurator 的图形界面做映射, 实际产生了如图十二所示效果。
图十二:openconfigurator效果图
展开 TPDO 树, 然后我们看一个 TxMappParam, 可以看到, 实际上这个图形设置过程无非就是设置了 objectMapping subobject 的 Value 值, 比如
0x0008000800026000, 关于这个值, 应该如表一所示去理解。
Lenght | offset | subindex | index |
---|---|---|---|
0008 | 0008 | 0002 | 6000 |
表一
也就是说6000 object 的02号 subobject 长度为8bit, 然后在发出去的数据包中的偏移位置为0008, 也就是说, 从站发出的数据安排6000的01subobject 在前,02的 subobject 在后, 两个都是8bit 长度。
所以说, 这样的映射设置, 无非就是告诉网络, 我1号从站发出的数据就是这个意思了, 根据 OD 的定义, 我们很容易确定, 每次发出的数据, 1号从站安排自己的 keyA 变量在前, keyB 在后, 而且发送出去的就这两个数据, 都为 U8类型。
(7)生成主站的 PDO 映射及总线网络配置参数文件 cdc
在做好从站的配置之后, 我们来编译工程, Project 菜单里面执行 build project 即可, 然后我们展开主站的 object 树, 可以看到, openConfigurator 自动生成了0xA040 和 0xA4C0 这两个 Object, 并且在 TPDO 和 RPDO 上面已经自动做好了映射:
(8)配置网络参数
在 mnodb.txt 文件里面有这么一行:
1006 00 00000004 0000C350
这个是整个网络的运行循环周期配置, 这个值是在openConfigurator里面支持配置的。
此外还要点击主站, 右边的属性里面有个Cycle Time参数, 单位为us, 这里因为我们使用windows做实验, 不可能达到实时特性, 我们设置的是50ms,原因是windows不是实时系统, 只能做到10个ms级别的响应。
另外, 还有一个参数比较重要, 就是从站的响应超时,点击从站, 属性里面的 PoolResponse Timeout,这个是主站在发送一个对从站的访问请求之后, 等待从站回应 Pres 的时间, 我们设置为 10ms。
3、主站应用层程序修改
将openPOWERLINK源码复制到作为主站的PC上,然后用VS2017打开openPOWERLINK_v1.7.1\Examples\X86\Windows\VC9\demo_pcap下的demo_pcap.vcproj工程,如图十三所示:
(课程设计要求使用VS2008,但是电脑上已经安装2017版本,为避免电脑上一些C++程序受版本影响,直接使用2017版本)
图十三:
首先修改objdict.h文件,将文中如下代码修改为图十四所示:
图十四:
此处将0x1402/0x01的object的默认值设置为0x01,意味着主站的接受PDO通道0x1402用来接收来自1号从站的数据。
图十五:
如图十五,此处将0x1602/0x01的object的默认值设置为0x0008000000016200,意味着主站将从1号从站发来的数据放到自身的0x6200/0x01 object中。
图十六:
如图十六,此处将01801/0x01的object的默认值设置为0x01,意味着主站的发送PDO通道0x1801用来发送数据给1号从站。
图十七:
如图十七,此处将0x1A01/0x01的object的默认值设置为0x0008000000016000,意味着主站将从自身0x6000/0x01 object中的数据发送给1号从站。
然后修改demo_main.c文件:
(1)如图十八,将NODEID改为:
图十八
即主站的NodeId为240即十六进制F0
(2)如图十九,在demo_main.c中应有如下程序段,这段程序中有两个变量,一个是bVarIn1_l,另一个是bVarOut1_l。当POWERLINK工作正常后,主站会周期性的把bVarIn1_l变量的值发送给1号从站;周期性的把从1号从站接受到的值存入变量bVarOut1_l。
图十九
如图二十,将变量bVarIn1_l与object 0x6000/0x01联系在一起,这样object 0x6000/0x01就使用变量bVarIn1_l的地址空间来存放数据。当的object 0x6000/0x01数据改变时,也就意味着变量bVarIn1_l的数据改变,反之亦然。
图二十
将变量bVarOut1_l与object 0x6200/0x01联系在一起,这样object 0x6200/0x01就使用变量bVarOut1_l的地址空间来存放数据。当的object 0x6200/0x01数据改变时,也就意味着变量bVarOut1_l的数据改变,反之亦然。
(3)修改demo_main.c文件中的AppCbSyns函数,将其改为如图二十一所示内容:
图二十一
该函数每个循环周期执行一次。
4、总体实现方案流程:
(1)确定设备的数据对象字典 OD
(2)完成数据对象与收发通道数据帧的映射关系定义: TPDO 与 RPDO
(3)确定网络通讯参数配置
这三个步骤对主从站都是必要的步骤, 只是因为有 openConfigurator 存在, 主站的 PDO 映射可以由软件自动生成好, 简化软件的开发流程。
5、软件框图
图二十二 软件流程图
软件框图如图所示:在使用windows实现主从站通信最主要的便是对对象字典(OD)修改,及数据对象处理。
四、 设计调试结果
1、控制台控制及结果
(1)主从站程序修改好后,两台电脑使用网线连接起来,点击VS2017本地调试按钮,如图二十三所示:
图二十三
(2)如图二十四所示,弹出如下对话框。
图二十四
这里列举了本台电脑所有的以太网接口类型,这里我们选择1号接口:Realtek以太网控制器,注意在这之前需要powerlink demo 和wincap 用于网络分析和数据传输,安装界面如图二十五所示。这里直接输入1,点击回车。
图二十五
(3)如图二十六所示:显示powerlink编码管理器正在运行,之后便会出现如图所示的数据传输:
图二十六
图二十七
如图二十七所示,这里传输数据是8位二进制数不断累加,因为检验程序就是主站每周期发送一个加一的8位二进制数,从站也是如此。如果想要完成主从站之间学号姓名传输,之际更改变量bVarIn1_l和bVarOut1_l的类型和内容即可完成,最终主站发送接受数据如图二十八任务显示:
图二十八
2、Wireshark解析
(1)这里使用的Wireshark版本位3.0.1,在上述步骤的基础上,打开软件,进入图二十九下界面,这里是选择捕获的网口,网口选择为以太网,可以看到该以太网口有数据波形显示。
图二十九
(2)选择以太网口后,进入捕获数据分析界面,如图三十所示:
图三十
Wireshark有3个窗口,最上面的窗口显示抓抓取的数据包的编号(No)、时间(Time)、MAC地址( Source)、目标MAC地址( Destination)、协议类型( Protocol)、附加信息(Info)。Preq数据帧有目标node号,即该数据包发往哪个节点(dst=1),Pres数据帧有源node号,即该数据包由哪个节点发出(src=1)。
单击选中该窗口中的某一行,也就是选中了一个数据包, 中同的窗口和最下边的窗口中的内容就会改变,最下面窗口的内容是选中的数据包的内(以十六进制格式显示)。这里显示的是一个数据帧中的真实数据。
中间窗口的内容为数据包中各个数据段的内容,以及数据包中每个数据段的含义。在这里,根据 POWERLINK协议,对数据帧中的每一个字段做出解析,例如字段中的 Destination是目标节点号,接收该数据帧的节点号,它的值是255(十六进制值为OxFF),值255代表的意义是广播( broadcast)。依次类推,字段中 Source字段是源节点号,即发送该数据帧的节点号,它的值是240,表示是240号从节点发送的。
五、 设计总结
通过此次课程设计,使我更加扎实的掌握了有关POWERLINK设计方面的知识,以及最新POWERLINK知识。在设计过程中虽然遇到了一些问题,如最新的openconfigurator已经成为esclipe的插件、POWERLINK最新源代码已经不适合VS打开等,但经过我一次又一次的探索与老师帮助,最终还是几乎完成了任务。虽然用时近乎五天时间,但从无到有的一个学习过程还是收获蛮大的。
这次课程设计是基于windos 下powerlink的主从站通信原理,涉及XDD文件配置、openconfigurator的配置、使用VS对powerlink源码的更改,两台电脑基于powerlink的以太网通信、利用Wireshark进行传输数据分析。
参考文献
[1]肖维荣,王瑾秋,宋华振.开源实时以太网POWERLINK详解[M].北京市:机械工业出版社,2015.11
[2] 贾鸿莉,于淼.实时以太网Powerlink技术的研究[J].中国科技信息,2016(21):37-38
[3]赵岚.Powerlink现场总线教学实践[J].中国现代教育装备,2018(19):47-48+58.
[4] 贾鸿莉,吴玲.现场总线技术及其应用[M].北京:化学工业出版社,2016.12
最后感谢一下钱总的仿真实现的参与
报告原文:link.
仿真图片:link.
仿真软件资源:link.
今天的文章主从通信的现场总线系统_共享计算机总线和内存的多处理系统[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89527.html