C和C++编写环境下LabVIEW如何调用动态库?

嵌入式技术

1337人已加入

描述

我们知道,不是所有的板卡等硬件都提供了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会自动解析出该动态库导出的函数清单)。

C语言

例如我们选择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。

 

 

C语言

设置好之后的Call Library Function Node类似下图,在左、右侧连接好对应参数即可调用D2K_AI_VReadChannel函数。

C语言

这个设置和调用过程,调用库函数个数较少时还是可以接受的。如果库函数的数量比较多,挨个设置很繁琐也容易出错。针对这种情况,LabVIEW有更好的方法,也就是我们要介绍的方法2。

方法2:动态库封装成VI库 Tools->Import->Shared Library打开Import Shared Library工具。

C语言

Step1,打开Import Shared Library,选择Create VIs for a shared library。

C语言

Step2,选择动态库文件和对应的头文件。注意这里头文件必须是C/C++规范的。

C语言

Step3,根据需要设置头文件包含路径和预处理定义。如果不需要,可以留空。

C语言

Step4,LabView自动识别出动态库里可以封装成VI导出的函数。

例如我们前面设置的D2K_AI_VReadChannel,这里自动识别出函数原型来了。

C语言

Step5,设置VI库名称和存放路径。路径建议使用默认路径,放置在用户库里。

C语言

Step6,设置出错处理方式。

C语言

Step7,设置各个导出函数(VI函数),一般可选择使用默认设置。

C语言

Step8,LabVIEW给出一个即将要生成的VI库的汇总信息。

C语言

Step9,生成中。

C语言

Step10,完成VI库生成。

勾选“Open the generated library”可以打开生成的VI库;勾选View the report可以查看有关所生成库的报表。

C语言

打开刚才生成的VI库,可以看到里面封装了非常多的库函数。这些库函数如果按照方法1去挨个设置,显然工作量是非常大的。

C语言

生成的动态函数VI库怎么使用呢?

在程序框图里找到User Libraries,里面就有刚才我们生成的D2K-DaskVI库。

C语言

VIs下面列出了所有库函数对应的VI,把你需要的拖放到程序框图上,按照输入输出类型连接好就可以了。

C语言

比如D2K AI V Read Channel.vi,显示Label、不勾选View as icon,如下图,输入输出非常明了。

C语言

以上是C/C++动态链接库的基本知识和LabVIEW中如何使用C/C++动态链接库的方法介绍,希望能够帮助到大家。

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分