嵌入式技术
我们知道,不是所有的板卡等硬件都提供了LabVIEW库。所以动态库(DLL)是我们写测控软件绕不开的一个话题。本篇推送我们聊一聊什么是动态库、它是怎么实现的、在LabVIEW里我们又如何使用它。
什么是动态库? 动态库全称动态链接库(Dynamic Link Library,DLL), 是一个包含函数和数据的模块,它可以被其它应用程序或者DLL使用。
动态链接库是怎么编写的呢? 简单来说就是通过dllexport标识出需要导出的函数和变量。 我们分别看一下C和C++编写的动态库代码结构。
C语言编写的动态链接库代码示例:
//CLib.h #ifndef C_LIB_H #define C_LIB_H //需要导出的函数按照指定格式声明 //extern int __declspec(dllexport) exportFunction(type para, ...); //通过DLL导出add函数 extern int __declspec(dllexport) add(int x,int y); #endif //CLib.c #include "Clib.h" //add函数实现 int add( int x, int y ) { return x + y; }
C++语言编写的动态链接库代码示例:
//CplusplusLib.h #ifndef LIB_H #define LIB_H //需要导出的函数按照指定格式声明 //extern "C" int __declspec(dllexport) exportFunction(type para, ...); //通过DLL导出add函数 extern "C" int __declspec(dllexport) add(int x, int y); #endif //CplusplusLib.cpp #include "CplusplusLib.h" //add函数实现 int add( int x, int y ) { return x + y; }与C语言编写的动态链接库相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 这一导出语句,在C代码中没有”C” ,而在C++代码中多了一个”C”。 原因是C++编译器与C编译器在对程序进行编译的时候,对函数声明的编译会有所区别。加上”C”,是为了告诉C++编译器,使用C编译器的方式对这一个函数声明进行编译。这样,在C程序调用C++写的动态链接库的时候,不会发生因为寻找不到对应的函数名(编译后的)而发生Link错误。
LabVIEW如何调用动态库?
我们以某品牌数据采集卡为例,说明一下如何使用动态库。 安装好驱动后,我们可以找到该品牌数据采集卡提供的动态库函数和头文件,D2K-Dask.dll和D2kDask.h。
方法1:直接调用 所谓直接调用,就是使用Call Library Function Node调用。这个VI位于Connectivity->Librarie&Executables分类下。 在程序框图里放置Call Library Function Node,双击进行设置。在Library name or path中设置到动态库文件,在Function name中选择需要调用的函数(LabVIEW会自动解析出该动态库导出的函数清单)。
例如我们选择D2K_AI_VReadChannel函数。这里我们需要找到动态库的文档,按照文档里提供的函数说明为CalDl Library Function Node设置好D2K_AI_VReadChannel函数的参数和返回值。
I16 __stdcall D2K_AI_VReadChannel (U16 CardNumber, U16 Channel, F64 *voltage)将Call Library Function设置对话框切换到Parameters标签页,设置好返回值和参数。error(return value)、cardNumber和channel都是值传递的参数,“Type”选择Numeric,“Data type”选择Unsigned 16-bit Interger,“Pass”选择Value;voltage是指向F64类型数据的指针,“Type”选择Numeric,“Data type”选择8-byte Double,“Pass”选择Pointer to Value。
设置好之后的Call Library Function Node类似下图,在左、右侧连接好对应参数即可调用D2K_AI_VReadChannel函数。
这个设置和调用过程,调用库函数个数较少时还是可以接受的。如果库函数的数量比较多,挨个设置很繁琐也容易出错。针对这种情况,LabVIEW有更好的方法,也就是我们要介绍的方法2。
方法2:动态库封装成VI库 Tools->Import->Shared Library打开Import Shared Library工具。
Step1,打开Import Shared Library,选择Create VIs for a shared library。
Step2,选择动态库文件和对应的头文件。注意这里头文件必须是C/C++规范的。
Step3,根据需要设置头文件包含路径和预处理定义。如果不需要,可以留空。
Step4,LabView自动识别出动态库里可以封装成VI导出的函数。
例如我们前面设置的D2K_AI_VReadChannel,这里自动识别出函数原型来了。
Step5,设置VI库名称和存放路径。路径建议使用默认路径,放置在用户库里。
Step6,设置出错处理方式。
Step7,设置各个导出函数(VI函数),一般可选择使用默认设置。
Step8,LabVIEW给出一个即将要生成的VI库的汇总信息。
Step9,生成中。
Step10,完成VI库生成。
勾选“Open the generated library”可以打开生成的VI库;勾选View the report可以查看有关所生成库的报表。
打开刚才生成的VI库,可以看到里面封装了非常多的库函数。这些库函数如果按照方法1去挨个设置,显然工作量是非常大的。
生成的动态函数VI库怎么使用呢?
在程序框图里找到User Libraries,里面就有刚才我们生成的D2K-DaskVI库。
VIs下面列出了所有库函数对应的VI,把你需要的拖放到程序框图上,按照输入输出类型连接好就可以了。
比如D2K AI V Read Channel.vi,显示Label、不勾选View as icon,如下图,输入输出非常明了。
以上是C/C++动态链接库的基本知识和LabVIEW中如何使用C/C++动态链接库的方法介绍,希望能够帮助到大家。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !