PMAC运动控制软件开发中动态链接库的加载方法①

2012-09-27 14:26邹丽梅
关键词:对话框调用程序

郭 波, 邹丽梅

(武夷学院,福建 武夷山 354300)

0 引言

Turbo PMAC Clipper控制器(Turbo PMAC2 Eth-Lite)是美国Delta Tau公司推出的PMAC开放式多轴运动控制器家族的一员.其具备全部Turbo PMAC特征,提供最多32轴独立闭环控制[1],主要用于数控机电产品开发.本文开发用数控双轴实验台采用上位机串口连接CLIPPER作为控制端完成信息处理;执行机构为日本富士伺服驱动器与电机(200W);机械本体采用X-Y十字滑台;由伺服电机编码器形成模拟输出,速度环闭环控制.在Y轴安装Renishaw RGH41光栅读数,仅用于测定位置.实验软件需要完成实时控制、反馈和显示等多种控制功能,基本思想是建立一个对话框程序,分区域成组布置静态文本控件、复选控件及按钮控件,分别实现反馈位置速度数据、标识限位原点、微动或增量运动、回零运动及执行运动程序各模块功能.PMAC提供了编程所需的动态链接库,封装了驱动、函数和对话框等资源,进行实验软件编程的基础是正确加载PMAC动态库.

1 动态链接库一般加载方法分析

PComm32 Pro Library是PMAC为在Windows系统下开发人机界面提供的动态链接库.动态链接库的安装需要软件PComm32PRO,该通讯驱动程序为建立PMAC应用程序的开发工具,可设定和使用多于400个功能函数[2].PComm32PRO 包括以下5个文件 :(1)PCOMM32.DLL是32位的动态连接库;(2)PMACSERVER.EXE是一个服务器应用程序,负责传递全局变量;(3)PMAC ISA,SER,PCI or USB.SYS是 Windows 98/ME/2000/XP核心驱动.动态库的加载就是围绕这几个文件展开.

动态库PCOMM32的加载分为隐式调用与显式链接两个大类.不论哪类方法,均应在正确安装PComm32PRO软件后实施,否则在进行工程链接时将报错.

1.1 隐式调用

隐式调用方法通过导入lib库中的函数,使工程能直接调用函数名,具有操作步骤少,调用速度快等优点,需要开发技术人员对库中函数有一定的了解,如知道函数名称、用途及返回值的类型等.其步骤应实施如下:

(1)设定库函数的链接路径:

在新建工程的解决方案资源管理器中右击工程名,选择属性.在弹出的属性页窗口选择链接器下的输入,在附加依赖项右边填入C:windowssystem32pcomm32.lib.

(2)在工程头文件全局作用域中把需要的函数导入,如导入OpenPmacDevice函数为:extern"C"_declspec(dllimport)BOOL_stdcall OpenPmac-Device(DWORD dwDevice);

(3)可以在需要的时候直接调用该函数名并且传递参数,如OpenPmacDevice(0).

1.2 显式链接

VC显式链接方式分为两种:手动加载与头文件包含.

手动加载占用资源少,加载速度快,函数随用随调,但加载步骤最复杂.

(1)在工程中,应在使用函数之前加载动态链接库:1)定义变量HMODULE pcdll;2)加载动态链接库 pcdll=::LoadLibrary(“Pcomm32.dll”);

(2)函数调用以OpenPmacDevice为例:1)在.h的工程头文件声明类型OPENPMACDEVICE程序为typedef BOOL(CALLBACK*OPENPMACDEVICE)(DWORD dwDevice);2)在.cpp的工程源文件中定义类型变量OPENPMACDEVICE OpenPmac-Device,3)源文件中使用函数GetProcAddress来获取函数在内存中的地址,程序为OpenPmacDevice=OPENPMACDEVICE)GetProcAddress(pcdll,"OpenPmacDevice");4)函数需要时即可调用,如OpenPmacDevice(dwDevice);

头文件包含调用实质上原理和手动加载相同,软件PComm32PRO在安装目录下Include文件夹中将所有的函数分类声明,调用方法很简单,将该文件夹拷贝至工程的文件路径下,在工程源文件中声明#include“Runtime.h”,然后可以调用 Runtime.h中设定好的函数名.头文件包含的使用看起来很简单,但实际应用中有几个麻烦.(1)Include文件夹中各种头文件相互包含交织在一起,难于清理分解;(2)任何文件位置错误或不存在均会链接报错.

以上加载的方法均要求开发者对C++语言开发有比较深入的基础,且对PMAC动态库的函数有一定了解.

2 动态库加载中出现的问题及分析

初学PMAC开发应用软件面对庞大的库函数,往往不知如何才能调用所需函数.但根据PComm32PRO软件所提供的例程myRuntimePmacTestNew发现,该例程将常用的PMAC函数以手动加载的形式编写进myRuntime文件中,所以首先将这两个文件myRuntime.h和myRuntime.cpp拷贝至工程目录下,在工程中添加它们;接着在工程源文件中声明#include“myRuntime.h”;最后在对话框初始化函数OnInitDialog()中调用头文件的OpenRuntimeLink();即完成了动态库加载工作.

在Visual Studio 2008环境里编译程序成功,可以调用PMAC的多数程序,如OpenPmacDevice()、ClosePmacDevice()、PmacDownload()、PmacSend-Line()、PmacGetResponse().这些常用函数在许多文献中均有介绍其参数使用方法,软件PComm32PRO的帮助文件更是有所有函数的全面说明,本文就不再赘述[3,4].

程序编写虽然链接通过,但调试时,却出现了一个新的问题.正确调用PmacSelect()函数后,应当出现动态库的选择驱动器的对话框,但是原开发程序出现的对话框却不能与在串口上的Clipper通讯,如图 1,然而同样的硬件环境中,PEWIN32PRO2却可以通讯,如图2所示.

图1 原开发程序无法检测到COM1口Clipper

图2 PEWIN32PRO2可以检测到COM1口Clipper

分析该对话框是调用Pcomm32.dll库内资源而形成的,图2标题栏有一个标识Pcomm Version:4.2.4.1,而因此判定应当是 Pcomm32.dll库的版本过旧,且使用的Clipper为新的Turbo PMAC2型卡,使用旧的驱动不能通讯说得通.但新版的驱动属于收费软件,代理商也不提供下载,为此只能另想办法.在查阅资料的过程中,发现PMAC提供了另一种方法,即是使用PMACSERVER.EXE可以倒出编程需要的函数.因为当PEWIN32PRO2启动时,进程中就会调用 PMACSERVER.EXE,由此判定PMACSERVER.EXE的库函数应当是最新可用的.

3 从PMACSERVER.EXE倒出类实现动态库加载

PMACSERVER的软件参考手册描述了在VC6.0 的开发环境中倒出类的方法[2],Visual Studio 2008的开发环境的导出过程又有所不同,本文将以此环境为例说明步骤.

(1)新建MFC应用程序,在向导中根据软件需求选择文档模板或对话框模板,采用默认的其他选项,点击完成生成程序.

(2)在类视图中添加TypeLib中的MFC类,在打开的类向导中来源选择文件,位置为C:WINDOWSsystem32PcommServer.exe,将接口 IPmac-Device添加到生成的类,其操作应如图3.点击完成即可以看到类视图中增加了一个类CPmacDevice,点击选中后可以看到有大量成员函数,当SelectDevice函数有三个参数long hWindow、long*pDeviceNumber、BOOL*pbSuccess 的时候说明添加成功了正确的类,否则应是操作错误,将引起编译错误,请复核以上步骤.

图3 TypeLib中的MFC类向导

(3)在对话框源程序(Test1Dlg.cpp)中加入#include"CPmacDevice.h".并在该文件增加三个全局变量与一个CPmacDevice类的对象:long testInterface,dwDevice;

(4)在对话框源程序OnInitDialog()函数下添加以下代码实现初始化:

(5)其后就可以用类对象的成员函数形式调用,如与之前OpenPmacDevice功能相同的函数为Open(long dwDevice,BOOL*pbSuccess),这些函数的说明可以通过查阅Pcomm Server软件参考手册获得,其使用方法和其他库加载方法的调用函数不同.如 Open函数调用程序为 pmacDevice.Open(dwDevice,&pbSuccess);需要说明的是这些成员函数大部分没有返回值,调用是否成功存储在pb-Success这个参数中,可以通过访问该参数进行下一步判定.

(6)接着上述第4条的位置输入以下代码,即可完成驱动器选择对话框的调用.调用编译成功后运行可见图4与图5的对话框.

图4 程序与Clipper通讯成功

图5 PMAC启动成功消息

4 结束语

PMAC运动控制器功能强大,用途广泛,但因为其技术较新,供应商支持力度不够,使开发技术员不得不面对各种各样难以解决的问题.作者在控制软件开发的经验总结起来有两点:(1)PMAC实现其控制有很多种方法,遇上困难可以考虑用其他方法绕开它;(2)美国DELTA TAU公司提供了大量软硬件文档及例程,这些资料将可能是解决问题的唯一途径.本文通过总结开发经验,提出PComm32 Pro Library动态库加载的一个新方案,避开了驱动版本过低造成的通讯故障,希望此方法对同行有所帮助.

[1]DELTA TAU Data System,Inc.Turbo PMAC/PMAC2 SOFTWARE REFERENCE MANUAL[M].January 5,2010.

[2]DELTA TAU Data System,Inc.Pcomm Server Pro2 Library SOFTWARE REFERENCE MANUAL[M].June 8,2007.

[3]卢旭.基于PMAC的伺服控制系统的开发[J].舰船电子对抗.2009,02:112 -114,120.

[4]窦伟,赵新华,李振华.基于VC++与PMAC的机器人控制软件的开发[J].天津理工大学学报.2010,03:58-61.

猜你喜欢
对话框调用程序
正常恢复虚拟机
核电项目物项调用管理的应用研究
试论我国未决羁押程序的立法完善
Bootlace Worms’Secret etc.
What Is Beauty?
LabWindows/CVI下基于ActiveX技术的Excel调用
“程序猿”的生活什么样
英国与欧盟正式启动“离婚”程序程序
基于系统调用的恶意软件检测技术研究
浅谈VB的通用对话框《CommonDialog》控件的使用