第11章 与其它应用程序的通讯.docx
- 文档编号:2751602
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:11
- 大小:619.73KB
第11章 与其它应用程序的通讯.docx
《第11章 与其它应用程序的通讯.docx》由会员分享,可在线阅读,更多相关《第11章 与其它应用程序的通讯.docx(11页珍藏版)》请在冰点文库上搜索。
第11章与其它应用程序的通讯
第11章 其它应用程序的通讯
11.1C代码调用
11.1.1调用CIN节点
11.1.2编写C代码
11.1.3编译VisualC++6.0源程序
11.1.4装载lsb源文件
11.2库函数调用
11.3动态数据交换DDE
11.3.1LabVIEW的DDE功能
11.3.3由Excel读数据
11.4在LabVIEW中运行其它应用程序
11.5在LabVIEW中使用ActiveX控件
第11章 其它应用程序的通讯
任何一个应用程序的开发环境都有其自身的优势与不足,作为高级编程人员在开发一个大的复杂应用程序时必须能够综合应用不同的软件开发环境的功能,才能使项目更加完善;一个好的软件开发环境,它也必然具备与其它应用程序通讯的功能及必要的开发工具,LabVIEW在这方面提供了大量的函数和VI,包括外部代码调用、库函数调用、运行外部程序等。
11.1C代码调用
尽管LabVIEW具有开发效率高、内置函数丰富等种种优势,但是在图形表达、对底层硬件的驱动等方面,却不如C语言功能更强大。
因此在LabVIEW中提供了一个C代码调用的接口,即Advanced函数子模板中的代码接口节点(CIN—CodeInterfaceNode)。
关于外部代码调用,NI公司提供的技术手册CodeInterfaceReferenceManual做了详尽说明。
本书只结合实例说明LabVIEW如何调用目前流行的VC++环境下编写的代码。
11.1.1调用CIN节点
假定有两数相加,调用C代码求其和,方法步骤如下。
在LabVIEW中,调出CIN节点,增加它的参数端口,连接乘数、被乘数和积。
在CIN节点上击右键,弹出菜单,选Create.cFile,如图11-1所示。
图11-1创建C代码
选择保存C文件的位置以后,LabVIEW自动产生以下C代码:
/*
*CINsourcefile
*/
#include"extcode.h"
CINMgErrCINRun(float64*a1,float64*a2,float64*s);
CINMgErrCINRun(float64*a1,float64*a2,float64*s)
{
/*ENTERYOURCODEHERE*/
returnnoErr;
}
11.1.2编写C代码
打开LabVIEW自动产生的C代码,进入VC++环境,在/*ENTERYOURCODEHERE*/的位置,添写如下C代码。
*s=*a1+*a2;
11.1.3编译VisualC++6.0源程序
在VisualC++6.0中编写的是一个动态链接库DLL,而CIN需要的是以.LSB为扩展名的源文件。
因此需要将DLL文件转换成LSB文件。
(1)在VisualC++6.0中创建一个DLL工程。
选择文件>>新建,弹出新建对话框,选择工程页中的Win32Dynamic-LinkLibrary,在工程文本框中输入工程名称,点击确定。
在下一级对话框选择AnEmptyDLLproject,点击完成。
(2)在DLL工程中加入CIN对象和函数库。
选择工程>>添加工程>>Files,从CINTOOLS路径下选择cin.obj,labview.lib,lvsb.lib和lvsbmain.def4个文件添加到工程中。
在LabVIEW默认安装时,CINTOOLS的路径为C:
\ProgramFiles\NationalInstruments\LabVIEW6.1\CINTOOLS。
自己编写的实现两数相加的C代码也要添加进去。
(3)在DLL工程中加入CINTOOLS路径
选择工程>>设置…,弹出工程设置对话框,将SettingsFor设成AllConfigurations。
选择C/C++页,设分类为Preprocessor,在附加包含路径文本框中输入CINTOOLS路径。
如图11-2所示。
图11-2在DLL工程中加入CINTOOLS路径
(4)alignment和run-timelibrary设置
选择Project>>Setting,弹出工程设置对话框,将SettingsFor设成AllConfigurations。
选择C/C++页,设分类为CodeGeneration,在Structmemberalignment列表框中选1Byte。
在Userun-timelibrary列表框中选MutithreadedDLL。
如图11-3所示。
(5)创建LSB源文件
选择Project>>Setting,弹出工程设置对话框,将SettingsFor设成AllConfigurations。
选择CustomBuild页,在命令文本框中输入如下字符串:
其中尖括号内是CINTOOLS的路径,但是在这里输入时,如果遇到路径名中有空格,应将空格及以后的部分用“~1”代替,一个简单的方法是将CINTOOLS路径下的lvsbutil.exe文件拷贝到一个简单的路径下;□处应输入一个空格;其余全部原样按字符输入。
在输出文本框中原样输入字符串$(OutDir)\$(TargetName).lsb。
如图11-4所示。
图11-3DLL工程设置
图11-4DLL工程的编译命令
(6)编译DLL工程,生成.lsb源文件
在C++菜单中选择编译>>全部重建。
如果编译成功,则在保存工程目录的Debug文件夹中生成一个.lsb源文件。
11.1.4装载lsb源文件
进入LabVIEW环境,在CIN节点上点击右键,弹出菜单,选LoadCodeResource。
弹出选择文件对话框后选中编译完成的.lsb文件。
此时工具条上的运行钮由断开的状态变为完整,程序将执行正确的操作。
如果读者需要用低价位A/D卡做一些简单的数据输入输出工作,那么可以参照以上的方法,用C语言编写A/D卡驱动程序,然后通过CIN把驱动程序嵌入LabVIEW,就可以发挥LabVIEW巨大的编程优势,完成需要的工作。
11.2库函数调用
LabVIEW在Advanced函数子模板中提供了调用库函数节点(CallingLibraryFunctionNode)。
通过调用Windows标准共享库函数,可以提高程序的开发效率,增加应用软件的功能。
在LabVIEW中调用库函数的编程并不复杂,关键是要了解被调用的函数名称、功能及其输入输出参数。
例如要在程序中获取光标当前位置,而且知道Windows的GetCursorPos函数可以实现这个功能,这个函数位于Windows/System目录下的User32库中。
那么可以执行以下的操作。
在LabVIEW图形代码窗口中放上调用库函数节点,双击节点弹出图11-5的对话框。
图11-5调用库函数设置1
(2)点击Browse…钮,打开一个文件对话框,找到User32.dll文件。
或者直接输入库文件路径和名称。
(3)在FunctionName下拉列表框中找到GetCursorPos函数。
或者直接输入函数名。
(4)在CallingConventions下拉列表框中选中stdcall(WINAPI)。
如果是VC环境下编译的库函数就要选C调用约定。
(5)Parameter框中的returntype不变。
Type框中选Numeric。
DataType框中选Signed32-bitInteger。
即指定返回32位整型数。
(6)点击AddaParameterAfter钮,Parameter框中的选项变为图11-6所示。
将缺省值agr1改为lpPoint,因为在GetCursorPos函数声明中定义了参数lpPoint。
BOOLGetCursorPos(
LPPOINTlpPoint//cursorposition
);
lpPoint是一个指向有两个32位整型量的指针。
图11-6调用库函数设置2
(7)Type框中选AdapttoType。
表示将编程时指定的LabVIEW数据类型与该参数数据类型自动匹配。
DataFormat框中选HandlesByValue。
(8)点击OK钮退出这个对话框。
调用库函数节点变为图11-7(a)中的情况。
上面一个I32端口表示返回值的类型,下面的端口由编程者连接输出参数。
在程序前面板上放一个簇,其中包含两个32位整数型显示件。
在图形代码窗口中连接好线后如图11-7(b)所示。
(a)(b)
图11-7调用库函数程序的图形代码
运行这个程序,移动鼠标,即可显示出光标当前在屏幕上的位置。
11.3动态数据交换DDE
11.3.1LabVIEW的DDE功能
动态数据交换(DDE-DynamicDataExchange)是Windows应用程序之间通讯的协议。
这些应用程序可以在一台计算机上,也可以在不同的计算机上。
DDE是一种客户控制信息传输的协议。
客户程序传递信息给服务器程序,这些信息可以是传送数据或要求数据,或者是要求服务器程序执行的命令。
LabVIEW对DDE客户与服务器两者都支持,也就是说。
既可以通过编程初始化与其它应用程序的DDE对话,也可以创建程序等待其它应用程序的DDE对话。
LabVIEW6.1在默认安装的情况下DDEVI并不出现在Communication子模板中,可以在LabVIEW6.1的安装目录下,找到vi.lib\platform文件夹中的dde.llbVI库,把它拷贝到user.lib文件夹中。
这样在userLibraries子模板中就可以找到图11-8所示的DDEVI。
图11-8DDEVI
11.3.2向Excel写数据
图11-8是LabVIEW程序做为客户程序向Excel电子表应用程序创建的文件写数据的实例。
图11-9LabVIEW向Excel文件写数据
DDEOpenConversationVI首先建立与MicrosoftExcel的对话,给这个VI的service参数输入要求服务的名称,给它的topic参数输入交换数据的文件名fdde.xls。
这个VI产生一个对话参考数Conversationrefnum,传递给后面的VI。
第一个DDEPokeVI向fdde.xls电子表文件写入第一列数据,即数据序号。
For循环的循环数i加1变为自然数,再由NumbertoDecimalString函数转换为字符串,输入DDEPokeVI的data参数。
这个字符串再经过ConcatenateStrings函数与其它字符常量合成一个字符串RiC1。
i是1到12的自然数。
字符串RiC1输入DDEPokeVI的item参数,指定数据写在fdde文件1到12行、第1列的位置。
其中所有字符串转换函数都在String>>String/NumberConversion函数子模板中。
字符串RiC1经过SearchandReplaceString函数替换后成为字符串RiC2。
随机数经过NumbertoFractionalString函数转换为一个带小数的字符串。
再次调用DDEPokeVI将数据写入fdde文件1到12行、第2列的位置。
最后DDECloseConversationVI关闭DDE对话。
需要说明的是通讯开始之前,两个应用程序都必须运行,并且Excel要打开fdde.xls文件。
11.3.3由Excel读数据
图11-10是LabVIEW程序做为客户程序从Excel电子表文件读回图11-9的程序写的数据的实例。
图11-10LabVIEW从Excel文件读数据
这个程序与图11-9的程序主要不同在于它调用了两次DDERequestVI,分别读出fdde.xls文件的两列数据,再转换为数值型的数据。
11.4在LabVIEW中运行其它应用程序
LabVIEW的Communication函数子模板的SystemExecVI提供了在LabVIEW中执行其它Windows应用程序的方法。
运行图11-11的程序,可以打开MicrosoftExcel。
与此类似,只要在SystemExecVI的命令行commandline参数,输入需要执行的应用程序名,就可以运行这个应用程序。
图11-11在LabVIEW中运行其它程序
11.5在LabVIEW中使用ActiveX控件
利用LabVIEW的ActiveX控件容器,可以调用第三方提供的ActiveX控件,从而使程序前面板功能更加丰富,界面更加友好,节省程序开发的时间。
LabVIEW控件模板的ActiveX子模板中的Container即ActiveX控件容器。
如图11-12(a)所示。
把它拖放到前面板上,在容器框内单击右键,弹出图11-12(b)所示的快捷菜单。
在菜单中选InsertActiveXObject,弹出一个对话框,列出所有可选的ActiveX控件。
如图11-12(c)所示。
这里选用MicrosoftAccess的日历控件CalendarControl9.0。
确定后一个日历控件即进入容器。
如图11-12(d)所示。
对这个日历控件可以编辑它的属性,可以在程序中读出它的值,也可以在程序中为它赋值。
图11-13的程序让这个日历控件显示指定的一个日期。
首先在图形代码窗口中日历控件的节点上弹出菜单,选Create>>Property>>Value,产生一个属性节点。
这个属性节点要求的数值类型是变量Variant,所以在按CalendarControl9.0的格式写好一个日期字符串以后还要转换为变量数据类型。
转换用的是Communication>>ActiveX函数子模板中的ToVariant函数。
图11-12在前面板添加日历控件
图11-13为日历控件赋值程序的图形代码
练习与思考:
11.1用VC++编一个小程序求两个浮点数的平均值,调用CIN节点将它嵌入LabVIEW程序。
11.2将20个随机数和序号写入电子表文件。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第11章 与其它应用程序的通讯 11 与其 应用程序 通讯
![提示](https://static.bingdoc.com/images/bang_tan.gif)