基于Windows的Powerlink主从站通信 下载本文

用户需要根据应用场合的需要来决定该延迟是否可以忽略,如果不可以忽略,POWERLINK

提供了测量机制,可以测出来相邻两个节点的传输延迟。用户根据这些延迟时间给各个节点 做一个补偿,从而达到各个节点在同一时刻做同步事件。 综上,介绍完了 POWERLINK 数据链路层的整个工作原理和过程。

三、总体实现方案流程

1. 所需软件和硬件:需要准备两台电脑,一台作为主站,一台作为从站;操作系统为

Windows XP; 需要安装 VS2008 开发环境;需要安装 WinPcap 或者 Wireshark。 2. 将 POWERLINK 的源码分拷贝到要作为主站和从站的电脑上,随便选哪台电脑 做主站都可以,主站和从站上的程序有所不同。

3. 打开主站\\Examples\\X86\\Windows\\VC9\\demo_pcap 下的工程,使用 VS2008 打开,

此外为了能在Windows上运行openPOWERLINK,你需要安装winpcap或wireshark 软件,因为 openPOWERLINK 将 pcaplib 作为网卡驱动程序。

4. 修改主站上的网络参数和映射参数,假定我们要通信 2 个参数,一个参数是主站发

送给从站,另一个是主站接收来自从站的数据。打开 objdict.h 文件。首先确定要把 哪 个 object 作 为 主 站 发 送 给 从 站 的 参 数 , 我 们 注 意 到 源 码 里 有 一 个

Object0X2000/01,可以将该 object 作为主站发送给从站的参数。 因此我们配置发送的网络参数和映射参数:

将 0x1801/0x01 的值设为 1,即发送数据给 1 号节点: 将 0x1A01 的参数设置为如下的值:

5. 修改主站上的源程序。打开 demo_main.c 文件,将 NODEID 改为:

#define NODEID 0xF0 //=>MN,主站的 nodeid 为 240 即 16 进制的 FO 6. 定义一个变量(BYTE output8),与 0X2000/01 link 起来。

POWERLINK 实时以太网教程 59

在 main.c 中,将与 0x2000/0x01 连接的代码修改如下:

至此,我们就映射了一个 object,并把他和我们自己定义的一个变量 link 起来。 接下来我们再映射一个 object,用来接收数据。

7. 接收的网络参数和映射参数:

我们注意到源码中有索引为 0x2200 的对象字典,可以将 0x2200/02 作为接收的 objcet。

将 0x1402 作为接收 1 号节点的网络参数。将 0x1402/0x01 的值设为 1,即接收来自 1

号节点的数据。

相应的映射参数为 0x1602,将 0x1602 的参数设置为如下的值: 8. 定义一个变量(BYTE input8),与 0X2200/02 link 起来。

POWERLINK 实时以太网教程 60

在 main.c 中,在 main.c 中,将与 0x2200/0x02 连接的代码修改如下:

至此,我们映射了一个 object,并把他和我们自己定义的一个变量 link 起来。接下来

我们将 AppCbSync 修改如下,这段代码的意思是我们把主站要发给从站的数据不断的累加,

同时打印出来自从站的数据。

6.1.2 设置从站的参数 设设置置从从站站的的参参数数 设置从站的参数 1. 从站需要 2 个参数,一个参数用来接收来自主站的数据,另一个参数发送给主站。 打开 objdict.h 文件。首先确定我们要把哪个 object 作为发送给主站的参数,我们注

意到源码里有一个 Object0X6000/01,可以将该 object 作为从站发送给主站的参数。

因此我们配置发送的网络参数和映射参数: 将 0x1800/0x01 的值设为 0。

POWERLINK 实时以太网教程 61

将 0x1A00 的参数设置为如下的值:

2. 修改从站上的源程序。打开 demo_main.c 文件,将 NODEID 改为: #define NODEID 0x01 //=>从站的 nodeid 取值范围 1-239 3. 定义一个变量(BYTE output8),与 0X6000/01link 起来。 在 main.c 中,将与 0x6000/0x01 连接的代码修改如下: ObdSize=sizeof(output8); uiVarEntries=1;

EplRet=EplApiLinkObject(0x6000,&output8,&uiVarEntries,&ObdSize,0x01); if(EplRet!=kEplSuccessful) {

Goto ExitShutdown; }

至此,我们就映射了一个 object,并把他和我们自己定义的一个变量 link 起来。接下来

我们再映射一个 object,用来接收数据。 4. 接收的网络参数和映射参数。

我们注意到源码中有索引为 0x6200 的对象字典,可以将 006200/01 作为接收的 objcet。

POWERLINK 实时以太网教程 62

将 0x1400 作为接收来自主站的网络参数。将 0x1400/0x01 的值设为 0。 相应的映射参数为 0x1600,将 0x1600/01 的参数设置为如下的值: 5. 定义一个变量(BYTE input8),与 0X6200/01link 起来。 在 main.c 中,将与 0x6200/0x01 连接的代码修改如下: ObdSize=sizeof(input8); uiVarEntries=1;

EplRet=EplApiLinkObject(0x6200,&input8,&uiVarEntries,&ObdSize,0x01); if(EplRet!=kEplSuccessful)

{

goto ExitShutdown; }

接下来我们将 AppCbSync 修改如下,这段代码的意思是我们把从站要发给主站的数据

不断的累加 10,同时打印出来自主站的数据。

完成上述步骤,我们就完成了主站和从站的配置。先将两台电脑用网线连接起来,接下

POWERLINK 实时以太网教程 63

来将从站先运行起来,最后再把主站运行起来。

当把主站或从站运行起来时,出现如下界面来选择使用哪个网口作为 POWERLINK 口。

在这里我使用第三个网口(MarvellYukonEthernetController),因此我输入 3,然后回车。

1.

所需软件和硬件:需要准备两台电脑,一台作为主站,一台作为从站;操作系统为 Windows XP; 需要安装 VS2008 开发环境;需要安装 WinPcap 或者 Wireshark。 将 POWERLINK 的源码分别拷贝到要作为主站和从站的电脑上,随便选哪台电脑 做主站都可以,主站和从站上的程序有所不同。

打开主站\\Examples\\X86\\Windows\\VC9\\demo_pcap 下的工程,使用 VS2008 打开, 此外为了能在 Windows 上运行 openPOWERLINK,你需要安装 winpcap 或 wireshark

2.

3.

软件,因为 openPOWERLINK 将 pcaplib 作为网卡驱动程序。

用 openCONFIGURATOR 配置 Windows 主站和从站

1.

使用这种方法配置网络,从站需要一个 XDD 文件,该文件与从站的对象字典相匹 配(即与从站的 objdict.h 定义的对象字典匹配),例子中从站使用的 objdict.h 文件

2.

在目录\\ObjDicts\\Api_CN 下,而相应的 XDD 文件在\\ObjDicts 目录下,名称为 0000003F_openPOWERLINK_demo_CN.xdd。

使用 openCONFIGURATOR 配置网络,比较简单,参考第五章第七节 5-7 使用 openCONFIGURATOR 组建 POWERLINK 网络。将生成的 monbd.cdc 和 xap.h 这两

3.

个文件拷贝到主站源代码的 Examples\\X86\\Windows\\VC8\\demo_cfm_pcap 目录下。

用 VS 打开主站 Examples\\X86\\Windows\\VC8\\demo_cfm_pcap 的工程,然后打开 demo_main.c,在 AppCbSync(void)函数中,AppProcessImageIn_g 变量的类型是 xap.h

4.

中定义的数据结构 PI_IN 的类型,AppProcessImageOut_g 变量的类型是 xap.h 中定 义的数据结构 PI_OUT 的类型.这两个变量自动被映射到主站相应的 Object 上,使 用者可以直接使用,而无需 link 操作。注意,这里 AppProcessImageIn_g 是指主站 输出给从站的数据,而 AppProcessImageOut_g 是指主站接收的来自从站的数据。

从站程序的修改:将从站 objdict.h 文件中的所有映射参数的值都设为 0,因为主站

会来配置这些参数的值。只是从站的 object 与用户自己定义的变量的 link,还需要

使用者自己来调用 EplApiLinkObject()来连接。

4.1 获得 POWERLINK 源码

从 http://sourceforge.net/projects/openpowerlink/ 下载 POWERLINK 源码。目前的最新版 本为 V1.7.1,下载解压后你会看到如下目录。

图 4-1

Documentation:文档的目录,其中包含了源代码中一些重要函数、数据结构的说

明,还有关于 POWERLINK 在 Linux 下如何编译的说明。

EplStack:POWERLINK 协议栈的.C 文件,这里包含了数据链路层和 CANopen 的 源码。

Include:包含了 POWERLINK 协议栈的.h 文件,这个文件夹和 EplStack 文件夹匹 配。

ObjDicts:CANopen 对象字典的源程序,用户需要根据自己要实现的设备修改对 象字典。

Edrv:因为 POWERLINK 可运行于多种不同的软件平台和硬件平台,和不同的平 台打交道,就需要有不同的驱动程序,这个文件夹包含了一些常用平台的驱动,如 ARM,8139,82573,FPGA 等平台的驱动程序,如果你想要将 POWERLINK 移植 到一个新的平台,可以参考这里的例子,修改驱动程序即可。

Examples:这里是重点,包含了一些常用平台的例子,你可以直接运行,评估 POWERLINK。如基于 Windows 的、Linux 的、FPGA 的、ARM 的。

32

4.2 POWERLINK 源码概览

图 4-2 软件架构

从下至上,软件分别分为以太网驱动模块、数据链路层模块、对象字典、SDO 模块、网络管理

NMT 模块已经 API 模块。

4.3

POWERLINK API 接口

这个是用户的应用程序与 POWERLINK 协议栈的接口。用户实现 POWERLINK 时,不 需要修改协议栈里面的内容。因为这部分内容是标准的,如果用户修改了,可能会导致最终

的协议不遵守 POWERLINK 标准。用户根据自己需要调用 API 的一些函数。其中比较重要 的函数有如下几个:

4.3.1

AppCbEvent 这个函数是协议栈的回调函数。当协议栈内部发生状态变化、特定事件、以及一些错误

等,协议栈自动调用此函数。如果用户需要根据协议栈的状态或者事件做特殊处理,就可以

把处理程序写在这里。例如当检查到该节点从网络上脱离开,需要将该设备安全停机。对于

33