Labview调用C语言、Matlab脚本节点以及库函数节点的方法_第1页
Labview调用C语言、Matlab脚本节点以及库函数节点的方法_第2页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、。 由于LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,并且二者完全相同,所以用户可以向CIN传递任意复合的数据结构。另外,CIN比图形化语言可获得更高的执行效率。 注意:对于完全相同的代码,CIN和DLL的执行效率是完全一样的。 如果要使用CIN节点,你必须安装了C编译器。在Windows下,CIN支持以下编译器: Microsoft Visual C+ Symantec C CIN节点必须调用.lsb文件。.lsb文件是通过外部编译器与CINTools工具结合将C代码编译生成的。 下面我们通过一个Step byStep的实例来看如何在LabVIEW中实现CIN节点调用,本例所用

3、外部编译器为MicrosoftVisual C+6.0。 第一步:在程序框图放置一个空CIN节点; CIN节点位于FunctionsPalette的Connectivity-Libraries& Executables-Code InterfaceNode。 第二步:创建CIN节点的输入输出端口; 初始情况下,CIN只有一对端口:一个输入端口和一个输出端口。向下拉大节点边框或右击节点端口选择AddParameter,可以为节点增加输入输出端口。CIN 节点的端口都是成对出现的,因为CIN节点端口传递的是指针,所以该参数既可以作为输入又可以作为输出。如果不需要输入,则可以右击该输入端口选择Out

4、putOnly,这时候该对端口的左侧端口变为灰色,表明这对端口仅用作输出。本例实现的功能为c=a+b,因此需要两个输入端口:a,b;一个输出端口c。 设置好端口后,在前面板窗口创建两个NumericControl(分别命名为a和b)和一个NumericIndicator(命名为c)。分别将a,b与输入端口连接,c与输出端口连接,如图3所示。可以看到,端口会自动根据输入参量的类型与之匹配。 图2设置CIN节点端口 图3CIN节点端口与控件连接 虽然控件与端口已经连接,但是此时的CIN节点并不具备任何功能,因为它还没有装载.lsb文件。因此此时VI是不可运行的,即Run按钮处于Broken状态。下

5、面的任务就是创建.c源文件,并编译为.lsb文件,最后加载到节点上。 第三步:创建.c源文件 右击CIN节点选择Create.cFile.,在弹出的对话框中保存文件,这里文件名命名为CINExample_add.c。打开该文件可以看到LabVIEW已经自动添加了一些代码用于包含库以及函数声明等,内容如下: i ncludeextcode.h MgErrCINRun(float64*a,float64*b,float64*c); MgErrCINRun(float64*a,float64*b,float64*c) return noErr; 用户可以在“”处添加函数所需的C代码。头文件“extc

6、ode.h”是LabVIEW自带的一个头文件,位于http:/./doc/54c747a3b9f67c1cfad6195f312b3169a451ea29.html bVIEW8.2cintools目录下。它定义了CIN和外部程序所用到的基本数据类型和许多函数等。其中定义的某些常量和数据类型可能会与系统头文件相冲突,因此在使用系统头文件并进行系统调用时,需要将cintools目录下的hosttype.h文件也包含进来。include“hosttype.h”必须紧跟着i nclude“extcode.h”语句,然后才能用i nclude语句包含系统头文件。 当CIN节点执行时,LabVIEW将调

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

8、rnnoErr; 通常情况下,我们只需要编写CINRun函数。本例中,只需要将.c源文件中的CINRun函数改写如下: MgErrCINRun(float64*a,float64*b,float64*c) *c=*a+*b; return noErr; 改写后保存该文件就完成了.c源文件的编写,下面我们通过Visual C+6.0集成开发环境来编译该源文件。 第四步:编译.c源文件为.lsb文件 1打开VC+6.0,在主窗口菜单中选择File-New.,在弹出的对话框选择Win32Dynamic-Link Library,设置ProjectName为CINExample_add,并在Locat

9、ion栏设置该Project所在路径,如图4所示。点击OK按钮后,在接下来的对话框中选择Finish按钮,在接着弹出的信息提示对话框中点击OK,就成功创建了一个空的DLLProject。 图4VC中创建新DLLProject对话框 2将前面创建的CINExample_add.c源文件与http:/./doc/54c747a3b9f67c1cfad6195f312b3169a451ea29.html bVIEW8.2cintools目录下的cin.obj,labview.lib,lvsb.lib,lvsbmain.def添加到Project中。添加方法是在VC+主菜单中选择Project-Add

10、To Project-Files.。 3选择Project-Settings.,在弹出对话框的Settingsfor栏中选择AllConfigurations,然后选择C/C+tab页,选择Category栏为Preprocessor,将http:/./doc/54c747a3b9f67c1cfad6195f312b3169a451ea29.html bVIEW8.2cintools目录添加到Additional includedirectories中,如图5所示。 图5将cintools目录添加到搜索目录中 4仍然在上面的对话框中选择Category为CodeGeneration,设置Str

11、uct member alignment为1byte。设置Use run-time library为MultithreadedDLL。5选择Custom Buildtab页,在Commands栏中输入:”cintools所在目录lvsbutil”$(TargetName)d“$(WkspDir)$(OutDir)”,在Outputs栏中输入:”$(OutDir)$(TargetName).lsb”,如图6所示。这一步就是利用LabVIEW 的CINTools工具包中的lvsbutil工具将VC+生成的DLL文件转换为CIN节点能够使用的.lsb文件。 图6设置CustomBuild为lvsbu

12、til 6点击OK按钮完成配置后,点击VC+工具栏中的Build按钮,编译工程。编译过程中,VC+首先创建一个DLL文件,然后调用lvsbutil工具将这个DLL 文件转换为.lsb文件。编译完成后,打开工程目录下的Debug文件夹,我们可以看到新生成的.lsb文件:CINExample_add.lsb。下面就可以将该文件加载到CIN节点中了。 第五步:加载.lsb文件到CIN节点 回到LabVIEW程序中,右击第二步中创建的CIN节点,选择LoadCodeResource.,在弹出的文件选择对话框中双击选择刚才创建好的CINExample_add.lsb文件,这就完成了.lsb文件的加载过程

13、。这时候VI窗口工具栏中的Run按钮也变为可执行状态。运行VI可以得到预期结果,如图7所示。 图7利用CIN节点进行加法运算 到此为止,我们就完成了一个CIN节点的创建过程。其实LabVIEW提供了大量的外部函数供CIN节点调用,这些函数涵盖了从底层字节操作到数据排序、内存管理等各个方面。这些函数都在一个称为Managers的库中管理。在C代码中通过调用这些函数可以方便的实现非常强大的功能。限于篇幅,这里就不详细介绍了,有兴趣的读者可以参考NI公司的UsingExternal Code in LabVIEW.pdf 文档(点此进入下载)。在http:/./doc/54c747a3b9f67c1

14、cfad6195f312b3169a451ea29.html bVIEW8.2examplescins目录下也可以看到LabVIEW提供的不少CIN节点实例。 利用Labview调用Matlab脚本节点 Matlab脚本节点的介绍 Matlab脚本节点位于函数面板的“数学脚本与公式脚本节点Matlab脚本节点”。由于Matlab脚本节点中的脚本完全是Matlab中的M文件,运行Matla 脚本节点时会启动Matlab,并在Matlab中执行脚本内容,其支持的函数由Matlab 来提供。 Matlab脚本节点可以通过增加输入输出端子来实现LabVIEW和Matlab脚本节点交互数据。方法为:右击

15、节点边框,选择Add Input或者AddOutput选项;可以手动输入M文件,也可以导入或者导出M文件。方法为:右击节点边框,选择Import或者Export选项。 利用LabVIEW调用Matlab实例 在实例中,我们将完成两个实验:一个简单的加法运算,x,y为输入的两个加数,z为输出的求和值;一个三维曲面的显示,通过改变三维曲面数值,可以展示曲面的不同形状。程序前面板如下图 (1)利用matlab节点实现简单运算 函数面板的“数学脚本与公式脚本节点”,将Matlab脚本节点放置在合适的位置。 单击工具选板上的,在Matlab Script Node中单击即可以编辑M脚本。 在Matlab

16、 Script Node中输入如下语句: z=x+y; 在Matlab Script Node框图左侧上单击鼠标右键,选择“添加输入”,在出现的方框中输入x;重复操作,在方框中输入y。 注意:在Matlab Script Node中有几个输入变量,则需要添加几个输入。 在Matlab Script Node框图右侧上单击鼠标右键,选择“添加输出”,在出现的方框中输入z。 注意:此时只有一个输出变量,故只添加一个输出变量。 在前面板中选择“控件新式数值”,选择数值输入控件,将其放在前面板的合适位置。重复上述操作,将第二个数值控件放在前面板的合适位置。 在前面板中选择“控件新式数值”,选择数值显示

17、控件,将其放在前面板的合适位置 在程序框图中将两个数值输入控件分别与x,y连接,数值显示控件与z连接。程序框图如图所示: 运行程序,改变数值输入控件2和3的值,可以看到数值显示控件随之改变。同时会启动Matlab,并在Matlab中自动运行该脚本 (2)利用Matlab脚本节点实现3D图形 在函数面板的“数学脚本与公式脚本节点”,将Matlab脚本节点放置在合适的位置。 单击工具选板上的,在Matlab Script Node中单击即可以编辑M脚本。 在Matlab Script Node中输入如下语句: x=-8:0.5:8; y=x; XX,YY=meshgrid(x,y); r=sqrt

18、(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中自动运行该脚本,产生如图所示图形。 Labview调用库函数节点(调用DLL) 相对于CIN来讲,NI更推荐用户使用DLL来

19、共享基于文本编程语言开发的代码。除了共享和重复利用代码,开发人员还能利用DLL封装软件的功能模块,以便这些模块能被不同开发工具利用。在labview中,使用DLL一般有以下几种途径: (1)使用自己开发DLL中的函数。 (2)调用操作系统或硬件驱动供应商提供的API。 对于前一种方法来说,又可以通过以下几步实现: (a)在labview中定义DLL原型; (b)生成.C或.C+文件,完成实现函数功能的代码并为函数添加DLL 导出声明; (c)通过外部IDE(如VC+)创建DLL项目并编译生成.dll文件。下面的内容将具体讲解: 配置Call library function node(CFN)

20、 无论在labview中使用自己开发的DLL,或者硬件驱动供应商(操作系统)提供的API,都可以通过配置CFN来完成。如下图 在CFN图标的 右键菜单选择“配置”,打开配置对话框,通过该对话框,可以指定动态库存放路径、调用函数名以及传递给函数的参数类型和函数返回值的类型。在配置完成后,CFN节点会根据用户的配置自动更新其显示。 通过browse按钮或者直接在library name or path输入框中指定调用函数多在.dll文件的路径。 通过browse按钮下的控件用户可以指定多个线程同时调用DLL。默认情况下,labview以run in UI Thread方式调用DLL,调用的函数将直

21、接在用户线程中运行。另外一种方式是递归方式reentrant,在这种情况下可以允许多个线程同时调用DLL中的函数。但要确保正常调用,必须使dll中的代码线程安全。 在“Function Name”输入框中指定要调用函数的函数名。 通过“Call Conventions”下拉列表框指定调用DLL中函数的方式。可以指定调用方式为“C”(默认方式)或Windows标准调用方式“stdcall”。一般来说用“C”方式调用开发人员自己写的DLL函数,而“stdcall”一般做为标准调用方式来调用windows的API 通过Parameter域可以指定所调用函数的返回值类型。默认情况下CFN 节点没有输入

22、参数而且只有一个void类型的返回参数。该参数由CFN节点第一对连接点的右端返回,代表CFN执行结果。如果返回参数的类型是void类型,则CFN连接点为未启用状态(保持为灰色)。CFN的每一对连接点代表一个输入或输出参数,若要传递参数给CFN则将参数连接至相应连接点的左端,若要读取返回值,则将相应连接点的右端连接到Indicator。CFN返回参数的类型可以是Void,Numeric或String。只能为返回参数指定Void类型,输入参数不能指定为Void类型。调用的函数没有返回值时,指定CFN的返回参数类型为void类型。即使参数有确定类型的返回值,也可以指定CFN的返回类型为Void,但是

23、此时,函数的返回值将被忽略。有些时候,调用的函数返回值不是以上三种类型,可以使用与以上三种类中有相同大小的一个来代替。例如如果调用的函数返回一个Char类型数据,则可以用一个8-bit unsigned integer Numeric类型来代替。此外,由于LabVIEW中没有指针,因此调用DLL中的返回指针的函数似乎不可能。但是可以设定返回值类型为一个与指针有相同大小的Integer 类型,LabVIEW将把地址以整型值来看待,并且用户可以在以后的调用中直接使用它。 通过Parameter域和其右边的“Add a Parameter Before”,“Add a Parameter After

24、”和“Delete thisParameter”三个按钮可以增加、删除以及修改CFN的输入参数和类型。当用户选择某参数的类型后,其详细的数据类型列表和参数传递方式列表将显示出来,以方便进行详细设定。下表列出了可以设定的输入参数类型及其详细数据类型信息。 有时可能在CFN配置对话框中并不能找到要传递给它的参数类型,在这种情况下可以通过下面方法来解决。如果参数不含指针,则可以通过Flatten to String函数将参数转换为字符串,并将此字符串指针传递给函数。还有其它一些技巧请参见NI手册。设定后的最终结果显示在“Function Prototype”文本框中,在确认前,可以在此检查设定是否正

25、确。如果不正确可以在此修改设定。调用自己开发DLL中的函数 开发人员可以在LabVIEW中指定DLL函数的原型,然后在外部IDE中完成代码并编译生成.dll文件以 供项目使用。 下面就以一个简单的求数组求和的项目为例来说明这种开发过程。 1.在LabVIEW中创建DLL函数原型。 a)在LabVIEW的diagram面板上添加一个CFN并通过其右键菜单打开CFN的配置对话框; b)使“Library Name or Path”输入框为空; c)指定函数名“Function Name”和调用方式“Calling Conventions”分别为add_num和C; d)重命名返回参数的名称为“er

26、ror”,并指定其类型为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并

27、设置参数传递方式为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;isize;i+) tmpSum=tmpSum+pi; else return(1); *sum=tmpSum; return(0); 在完成实现函数功能的代码后,还必须为函数添加导出声明以便能在LabVIEW 中使用这些函数。 C/C+声名导出函数的关键字是_declspec(dllexport),使用该关键字可以代替模块定义文件。 对于此处的例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论