- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
Labview与其他应用程序的接口设计
labview前面板有两种容器:.net容器和activeX容器。.net是使用
具体调用细节实际摸索后逐步添加:
图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所示。
图2
图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)
用户可以在“”处添加函数所需的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源文件的编写,下面我们通过Visual C++ 6.0集成开发环境来编译该源文件。
第四步:编译.c源文件为.lsb文件
1.
图4
2.
3.
图5
4.
图6
6.
回到LabVIEW程序中,右击第二步中创建的CIN节点,选择Load Code Resource...,在弹出的文件选择对话框中双击选择刚才创建好的CINExample_add.lsb文件,这就完成了.lsb文件的加载过程。这时候VI窗口工具栏中的Run按钮也变为可执行状态。运行VI可以得到预期结果,如图7所示。
图7
到此为止,我们就完成了一个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为输出的求和值;一个三维曲面的显示,通过改变三维曲面数值,可以展示曲面的不同形状。程序前面板如图
(1)利用matlab节点实现简单运算
①函数面板的“数学→脚本与公式→脚本节点”,将Matlab脚本节点放置在合适的位置。
②单击工具选板上的
③在Matlab Script Node中输入如下语句:
z=x+y;
④在Matlab Script Node框图左侧上单击鼠标右键,选择“添加输入”,在出现的方框中输入x;重复操作,在方框中输入y。
注意:在Matlab Script Node中有几个输入变量,则需要添加几个输入。
⑤在Matlab Script Node框图右侧上单击鼠标右键,选择“添加输出”,在出现的方框中输入z。
注意:此时只有一个输出变量,故只添加一个输出变量。
⑥在前面板中选择“控件→新式→数值”,选择数值输入控件,将其放在前面板的合适位置。重复上述操作,将第二个数值控件放在前面板的合适位置。
⑦在前面板中选择“控件→新式→数值”,选择数值显示控件,将其放在前面板的合适位置
⑧在程序框图中将两个数值输入控件分别与x,y连接,数值显示控件与z连接。
程序框图如图所示:
运行程序,改变数值输入控件2和3的值,可以看到数值显示控件随之改变。同时会启动Matlab,并在Matlab中自动运行该脚本
(2)利用Matlab脚本节点实现3D图形
①在函数面板的“数学→脚本与公式→脚本节点”,将Matlab脚本节点放置在合适的位置。
②单击工具选板上的
③在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和三维曲面图的“矩阵”输入端口。
运行该VI的同时也会启动Matlab,并在Matlab中自动运行该脚本,产生如图所示图形。
4、调用库函数节点(调用DLL)
下面的内容将具体讲解:
配置Call library function node (CFN)
在CFN图标的右键菜单选择“配置”,打开配置对话框,通过该对话框,可以指定动态库存放路径、调用函数名以及传递给函数的参数类型和函数返回值的类型。在配置完成后,CFN节点会根据用户的配置自动更新其显示。
通过browse按钮或者直接在library name or path输入框中指定调用函数多在.dll文件的路径。
通过browse按钮下的控件用户可以指定多个线程同时调用DLL。默认情况下,labview以run in UI Thread方式调用DLL,调用的函数将直接在用户线程中运行。另外一种方式是递归方式reentrant,在这种情况下可以允许多个线程同时调用DLL中的函数。但要确保正常调用,必须使dll中的代码线程安全。
调用自己开发DLL中的函数
供项目使用。
下面就以一个简单的求数组求和的项目为例来说明这种开发过程。
1. 在LabVIEW 中创建DLL 函数原型。
a) 在LabVIEW 的diagram 面板上添加一个CFN 并通过其右键菜单打开CFN 的配置对话框;
b) 使“Library Name or Path”输入框为空;
c) 指定函数名“Function Name”和调用方式“Calling Conventions”分别为add_num和C;
d) 重命名返回参数的名称为“error”,并指定其类型为Numeric 的Signed 32-bit Integer;
e) 用“Add a Parameter After”按钮添加第一个参数p,指定其类型为Array 的4-byte Single 并设定Array Format 为Array Data Pointer;
f) 用“Add a Parameter After”按钮添加第二个参数size,指定其类型为为Numeric 的Signed32-bit Integer 并设置参数传递方式为Value;
g) 用“Add a Parameter After”按钮添加第三个参数sum,指定其类型为为Numeric 的4-byteSingle 并设置参数传递方式为Pointer to Value;
h) 至此,函数的原型应如下图所示
long add_num(float *p, long size, float *sum);
i) 确定后会发现CFN 根据配置自动进行了更新更新后的情况如图示。
2. 生成.C 或.C++文件,完成实现函数功能的代码并为函数添加DLL 导出声明;
在CFN 节点上通过右键菜单选择“Create .C File…”生成mydll.c 文件,其内容如下:
将以下代码插入到句之后实现函数的功能。
int i;
float tmpSum = 0;
if(p != NULL)
{
for(i=0; i < size; i++)
tmpSum = tmpSum + p[i];
}
else
return (1);
* sum = tmpSum;
return (0);
在完成实现函数功能的代码后,还必须为函数添加导出声明以便能在LabVIEW 中使用这些函数。
C/C++声名导出函数的关键字是_declspec (dllexport),使用该关键字可以代替模块定义文件。
对于此处的例子来说,只要在函数声明和定义部分添加关键字即可。最终代码如下:
3. 在外部IDE(以VC++为例)中创建DLL 项目并编译生成.dll 文件。
用VC++ 6.0 进行编译生成.dll 文件的步骤如下:
a) 在VC++中创建一个DLL 项目,如果在DLL 中没有使用MFC 就选择创建“Win32Dynamic-Link Library”,否则选择“MFC AppWizard(dll)”,对此例子来说选择前者。选定后进入下一步选择创建一个空的DLL 项目。
b) 通过Project»Add to Project»Files 添加mydll.c 到创建的mydll 项目之中
c) 通过Project»Settings 打开项目配置对话框,选择C/C++选项卡。
d) 配置项目的All Configurations。选择Settings For 下拉列表框中的All Configurations,选择Category下拉列表框中的Code Generation,最后设置Struct member alignment 为1 Byte。
e) 配置项目的Release 版本。选择Settings For 下拉列表框中的Win32 Release,选择Category下拉列表框中的Code Generation,最后从Use run-time library 下拉列表框中选择Multithreaded DLL。配置结果如图。
f) 配置项目的Debug 版本。选择Settings For 下拉列表框中的Win32 Debug,选择Category
下拉列表框中的Code Generation,最后从Use run-time library 下拉列表框中选择Debug
Multithreaded DLL。配置结果如图
4. 在LabVIEW 项目中调用.dll 中的函数。创建如图所示的VI,其中Array 为Representation»Single Precision 类型的数组,Sum 为Representation»Single Precision 类型的Indicator, error 为Representation»Long 类型的Indicator。运行后可以看到对数组求和的结果。
调用API的例子不细述了。
5、调用ActiveX控件:不细述。看labview自带的例子。
6、调用.dll程序集和共享库。通过.net容器,查看自己编写的光功率计采样程序。有时间会加到这里面来。