Labview与其他应用程序的接口设计

2015-09-08 14:34:26   来源:eefocus   

关键字: Labview  接口设计

    labview固然强大,但是有些功能实现起来也是比较麻烦的。我们想使用其他语言或者平台下的现成的程序,怎么办呢?

    可以通过下面的集中办法来实现:

    1、调用公式节点 functions- All fuctions-structures

    2、调用C语言代码(code interface node)  functions- All fuctions-structures  代码接口节点

    3、调用matlab脚本节点   functions- All fuctions-analyze-mathematics-formula

    4、调用windows API函数(call library function node) 调用库函数节点 .dll

    5、调用ActiveX控件(微软的)   使用ActiveX容器,具体的实例可参见labview帮助文件里面的事件回调的浏览器的例子。

    6、调用.dll程序集或者共享库,通过.net容器来实现。

labview前面板有两种容器:.net容器和activeX容器。.net是使用 应用程序集。而ActiveX是使用微软的对象模型(如浏览器,ms播放器等,比较直观的交互技术集)

 

具体调用细节实际摸索后逐步添加:

 1、调用公式节点的例子

Labview与其他应用程序的接口设计

图1  公式节点实例

其公式与C语言具有类似的表达式,具体看帮助文件。

2、调用C语言代码

这个内容从网络上找到一篇介绍的比较好的文章,现收录进来。在此注明原文地址(为使文章更可读,将图号进行修改):

http://www.eefocus.com/bbs/article_10_6482.html
CIN(Code Interface Node)节点是LabVIEW中用来调用C/C++代码的功能节点。它与动态链接库的不同之处在于,它能够将代码集成在VI中作为单独的一个VI发布,而不需要多余的文件。另外,它提供了函数入口,它可以根据用户提供的输入输出自动生成函数入口代码,从而使用户专心关注代码功能而不用为函数声明、定义等语句费心。因此CIN节点与DLL在不同的场合有不同的优势,但是CIN节点的使用比调用DLL要复杂得多。

由于LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,并且二者完全相同,所以用户可以向CIN传递任意复合的数据结构。另外,CIN比图形化语言可获得更高的执行效率。

注意:对于完全相同的代码,CIN和DLL的执行效率是完全一样的。

如果要使用CIN节点,你必须安装了C编译器。在Windows下,CIN支持以下编译器:

  • Microsoft Visual C++
  • Symantec C

CIN节点必须调用.lsb文件。.lsb文件是通过外部编译器与CINTools工具结合将C代码编译生成的。

 

下面我们通过一个Step by Step的实例来看如何在LabVIEW中实现CIN节点调用,本例所用外部编译器为Microsoft Visual C++ 6.0。

第一步:在程序框图放置一个空CIN节点;

CIN节点位于Functions Palette的Connectivity->Libraries & Executables->Code Interface Node。

第二步:创建CIN节点的输入输出端口;

初始情况下,CIN只有一对端口:一个输入端口和一个输出端口。向下拉大节点边框或右击节点端口选择Add Parameter,可以为节点增加输入输出端口。CIN节点的端口都是成对出现的,因为CIN节点端口传递的是指针,所以该参数既可以作为输入又可以作为输出。如果不需要输入,则可以右击该输入端口选择Output Only,这时候该对端口的左侧端口变为灰色,表明这对端口仅用作输出。

本例实现的功能为c=a+b,因此需要两个输入端口:a,b;一个输出端口c。如图18.8所示。

设置好端口后,在前面板窗口创建两个Numeric Control(分别命名为a和b)和一个Numeric Indicator(命名为c)。分别将a,b与输入端口连接,c与输出端口连接,如图3所示。可以看到,端口会自动根据输入参量的类型与之匹配。

Labview与其他应用程序的接口设计                                                  

图2  设置CIN节点端口 

 Labview与其他应用程序的接口设计

                

图3 CIN节点端口与控件连接

 

虽然控件与端口已经连接,但是此时的CIN节点并不具备任何功能,因为它还没有装载.lsb文件。因此此时VI是不可运行的,即Run按钮处于Broken状态。下面的任务就是创建.c源文件,并编译为.lsb文件,最后加载到节点上。

第三步:创建.c源文件

右击CIN节点选择Create .c File...,在弹出的对话框中保存文件,这里文件名命名为CINExample_add.c。打开该文件可以看到LabVIEW已经自动添加了一些代码用于包含库以及函数声明等,内容如下:

 

 

#i nclude "extcode.h"

 

MgErr CINRun(float64 *a, float64 *b, float64 *c);

MgErr CINRun(float64 *a, float64 *b, float64 *c)

       {

      

       return noErr;

       }

 

用户可以在“”处添加函数所需的C代码。头文件“extcode.h”是LabVIEW自带的一个头文件,位于... LabVIEW 8.2cintools目录下。它定义了CIN和外部程序所用到的基本数据类型和许多函数等。其中定义的某些常量和数据类型可能会与系统头文件相冲突,因此在使用系统头文件并进行系统调用时,需要将cintools目录下的hosttype.h文件也包含进来。#i nclude “hosttype.h”必须紧跟着#i nclude “extcode.h”语句,然后才能用#i nclude语句包含系统头文件。

当CIN节点执行时,LabVIEW将调用CINRun函数。CINRun函数将CIN节点的输入输出作为参数看待。此外,还可以添加一些其它的后台例行程序(Routines):CINLoad,CINSave,CINUnload,CINAbort,CINInit,CINDispose和CINProperties。它们分别在不同的时刻执行。例如CINLoad在第一次载入VI时执行。缺省情况下是不执行任何内容的,如果你需要在VI载入时执行某段程序,则可以把该段程序添加在CINLoad例程中。编写CINLoad例程的代码如下:

 

CIN MgErr CINLoad(RsrcFile reserved) {

Unused (reserved);

 

return noErr;

}

 

通常情况下,我们只需要编写CINRun函数。本例中,只需要将.c源文件中的CINRun函数改写如下:

 

MgErr CINRun(float64 *a, float64 *b, float64 *c)

       {

       *c=*a+*b;

       return noErr;

       }

 

改写后保存该文件就完成了.c源文件的编写,下面我们通过Visual C++ 6.0集成开发环境来编译该源文件。

第四步:编译.c源文件为.lsb文件

1.  打开VC++ 6.0,在主窗口菜单中选择File->New...,在弹出的对话框选择Win32 Dynamic-Link Library,设置Project Name为CINExample_add,并在Location栏设置该Project所在路径,如图4所示。点击OK按钮后,在接下来的对话框中选择Finish按钮,在接着弹出的信息提示对话框中点击OK,就成功创建了一个空的DLL Project。

 Labview与其他应用程序的接口设计

图4  VC中创建新DLL Project对话框

 

2.  将前面创建的CINExample_add.c源文件与...LabVIEW 8.2cintools目录下的cin.obj, labview.lib, lvsb.lib, lvsbmain.def添加到Project中。添加方法是在VC++主菜单中选择Project->Add To Project->Files...。

3.  选择Project->Settings...,在弹出对话框的Settings for栏中选择All Configurations,然后选择C/C++ tab页,选择Category栏为Preprocessor,将...LabVIEW 8.2cintools 目录添加到Additional include directories中,如图5所示。

 Labview与其他应用程序的接口设计
 

图5  将cintools目录添加到搜索目录中

 

4.  仍然在上面的对话框中选择Category为Code Generation,设置Struct member alignment为1 byte。设置Use run-time library为Multithreaded DLL。

5.  选择Custom Build tab页,在Commands栏中输入:”cintools所在目录lvsbutil” $(TargetName) –d “$(WkspDir)$(OutDir)”,在Outputs栏中输入:” $(OutDir)$(TargetName).lsb”,如图6所示。这一步就是利用LabVIEW的CINTools工具包中的lvsbutil工具将VC++生成的DLL文件转换为CIN节点能够使用的.lsb文件。

 

Labview与其他应用程序的接口设计

 

图6  设置Custom Build为lvsbutil

 

6.  点击OK按钮完成配置后,点击VC++工具栏中的Build按钮,编译工程。编译过程中,VC++首先创建一个DLL文件,然后调用lvsbutil工具将这个DLL文件转换为.lsb文件。编译完成后,打开工程目录下的Debug文件夹,我们可以看到新生成的.lsb文件:CINExample_add.lsb。下面就可以将该文件加载到CIN节点中了。

 第五步:加载.lsb文件到CIN节点

回到LabVIEW程序中,右击第二步中创建的CIN节点,选择Load Code Resource...,在弹出的文件选择对话框中双击选择刚才创建好的CINExample_add.lsb文件,这就完成了.lsb文件的加载过程。这时候VI窗口工具栏中的Run按钮也变为可执行状态。运行VI可以得到预期结果,如图7所示。

 Labview与其他应用程序的接口设计
 

图7  利用CIN节点进行加法运算

 

到此为止,我们就完成了一个CIN节点的创建过程。其实LabVIEW提供了大量的外部函数供CIN节点调用,这些函数涵盖了从底层字节操作到数据排序、内存管理等各个方面。这些函数都在一个称为Managers的库中管理。在C代码中通过调用这些函数可以方便的实现非常强大的功能。限于篇幅,这里就不详细介绍了,有兴趣的读者可以参考NI公司的Using External Code in LabVIEW.pdf文档。在...LabVIEW 8.2examplescins目录下也可以看到LabVIEW提供的不少CIN节点实例。


3、调用Matlab脚本节点

 

Matlab脚本节点的介绍

Matlab脚本节点位于函数面板的“数学→脚本与公式→脚本节点→Matlab脚本节点”。由于Matlab脚本节点中的脚本完全是Matlab中的M文件,运行Matla脚本节点时会启动Matlab,并在Matlab中执行脚本内容,其支持的函数由Matlab来提供。

Matlab脚本节点可以通过增加输入输出端子来实现LabVIEW和Matlab 脚本节点交互数据。方法为:右击节点边框,选择Add Input或者Add Output选项;可以手动输入M文件,也可以导入或者导出M文件。方法为:右击节点边框,选择Import或者Export选项。

利用LabVIEW调用Matlab实例

在实例中,我们将完成两个实验:一个简单的加法运算,x,y为输入的两个加数,z为输出的求和值;一个三维曲面的显示,通过改变三维曲面数值,可以展示曲面的不同形状。程序前面板如图

Labview与其他应用程序的接口设计
 

(1)利用matlab节点实现简单运算

①函数面板的“数学→脚本与公式→脚本节点”,将Matlab脚本节点放置在合适的位置。

②单击工具选板上的Labview与其他应用程序的接口设计  ,在Matlab Script Node中单击即可以编辑M脚本。

③在Matlab Script Node中输入如下语句:

z=x+y;

④在Matlab Script Node框图左侧上单击鼠标右键,选择“添加输入”,在出现的方框中输入x;重复操作,在方框中输入y。

注意:在Matlab Script Node中有几个输入变量,则需要添加几个输入。

⑤在Matlab Script Node框图右侧上单击鼠标右键,选择“添加输出”,在出现的方框中输入z。

注意:此时只有一个输出变量,故只添加一个输出变量。

⑥在前面板中选择“控件→新式→数值”,选择数值输入控件,将其放在前面板的合适位置。重复上述操作,将第二个数值控件放在前面板的合适位置。

⑦在前面板中选择“控件→新式→数值”,选择数值显示控件,将其放在前面板的合适位置

⑧在程序框图中将两个数值输入控件分别与x,y连接,数值显示控件与z连接。

程序框图如图所示:

Labview与其他应用程序的接口设计
 

 

 

运行程序,改变数值输入控件2和3的值,可以看到数值显示控件随之改变。同时会启动Matlab,并在Matlab中自动运行该脚本

(2)利用Matlab脚本节点实现3D图形

①在函数面板的“数学→脚本与公式→脚本节点”,将Matlab脚本节点放置在合适的位置。

②单击工具选板上的Labview与其他应用程序的接口设计   ,在Matlab Script Node中单击即可以编辑M脚本。

③在Matlab Script Node中输入如下语句:

x=-8:0.5:8;

y=x;

[XX,YY]=meshgrid(x,y);

r=sqrt(XX.^2+YY.^2)+eps;

z=sin(r)./r;

surf(z);

title('sin(r)/r');

④在Matlab Script Node框图右侧上单击鼠标右键,选择“添加输出”,在出现的方框中输入z。并在z方框中右击,选择“选择数据类型→2-D Array of Real”。

⑤在前面板中选择“新式→图形→三维曲面图”,将其放在前面板合适的位置。

⑥连接z和三维曲面图的“矩阵”输入端口。

    最终程序框图如图所示:

Labview与其他应用程序的接口设计
 

      

 

运行该VI的同时也会启动Matlab,并在Matlab中自动运行该脚本,产生如图所示图形。

Labview与其他应用程序的接口设计
 

4、调用库函数节点(调用DLL)

 相对于CIN来讲,NI更推荐用户使用DLL来共享基于文本编程语言开发的代码。除了共享和重复利用代码,开发人员还能利用DLL封装软件的功能模块,以便这些模块能被不同开发工具利用。在labview中,使用DLL一般有以下几种途径:

    (1)使用自己开发DLL中的函数。

    (2)调用操作系统或硬件驱动供应商提供的API。

    对于前一种方法来说,又可以通过以下几步实现:

    (a)在labview中定义DLL原型;

    (b)生成.C或.C++文件,完成实现函数功能的代码并为函数添加DLL导出声明;

    (c)通过外部IDE(如VC++)创建DLL项目并编译生成.dll文件。

[1] [2]
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

推荐阅读

编辑:什么鱼
本文引用地址: http://www.eeworld.com.cn/Test_and_measurement/2015/0908/article_13032.html
[发表评论]
[加入收藏]
[打印本页]
[关闭窗口]
[返回顶部]
[RSS订阅]
小广播
每日新闻
最热点击
本周热门资源推荐
EEWORLD独家
论坛精华
精选博文