如何使用LabVIEW调用C#编写的DLL

合集下载

用LABVIEW调用C语言的方法

用LABVIEW调用C语言的方法
用 labview 调用 c 语言其实是一件挺简单的是, 下面我们通过一个求两个数的相 加来一步步的介绍怎样来调用 C 语言, 只要大家按照步骤一步一步的来一定会功 的,加油! LabVIEW 中使用 CIN 节点调用 C 语言 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 代码编译生成的。 下面我们通过一个两数相加的实例来看如何在 LabVIEW 中实现 CIN 节点调 用,本例所用外部编译器为 Microsoft Visual C++ 6.0。 例 18.6 利用 CIN 节点实现加法运算 第一步:在程序框图放置一个空 CIN 节点; CIN 节点位于程序框图的互连接口->库与可执行程序->代码借口节点。 第二步:创建 CIN 节点的输入输出端口; 初始情况下,CIN 只有一对端口:一个输入端口和一个输出端口。向下拉大 节点边框或右击节点端口选择增加参数,可以为节点增加输入输出端口。CIN 节 点的端口都是成对出现的,因为 CIN 节点端口传递的是指针,所以该参数既可 以作为输入又可以作为输出。 如果不需要输入, 则可以右击该输入端口选择仅可 输出,这时候该对端口的左侧端口变为灰色,表明这对端口仅用作输出。 本例实现的功能为 c=a+b,因此需要两个输入端口:a,b;一个输出端口 c。 设置好端口后,在前面板窗口创建两个数值输入控件(分别命名为 a 和 b) 和一个数值显示控件(命名为 c)。分别将 a,b 与输入端口连接,c 与输出端口 连接,如图 18.9 所示。可以看到,端口会自动根据输入参量的类型与之匹配。 虽然控件与端口已经连接,但是此时的 CIN 节点并不具备任何功能,因为它 还没有装载.lsb 文件。因此此时 VI 是不可运行的,即运行按钮处于断开状态。 下面的任务就是创建.c 源文件,并编译为.lsb 文件,最后加载到节点上。 第三步:创建.c 源文件

关于LabVIEW产生的DLL被C调用的问题

关于LabVIEW产生的DLL被C调用的问题

关于LabVIEW产生的DLL被C调用的问题1 LabVIEW的工作1.1 工程项目从LV8.0开始,想要生成exe、安装程序或DLL就必须首先创建1个工程,然后把所有有关的VI全部添加到工程中,如图1:图1 LV项目为了使目录结构清晰,最好把最后需要输出的VI放置在一起,把子VI放置在一起,如图1中,虚拟目录Top Level Vis用来存放3个输出的VI(可以把它想像成DLL中的函数)、虚拟目录Dynamic Vis存放子VI、虚拟目录Support Files存放支持文件(位图、光标等)。

1.2 VI设置如同在LV中一样,有些VI完全是作为计算模块使用的(调用时不会弹出界面,如图1中的acquire.vi、analyze.vi),而有些是用来显示界面的(调用时弹出对话框,如图1中的present.vi)。

那么如何设置1个输出VI是否显示界面呢?想要产生界面调用的函数,请配置Window Appearance(如图2),然后确保红线圈住的地方必须被选中:图2 VI界面设置1.3 输出配置(Build Specification)右击Build Specification选择New->DLL,弹出DLL输出配置对话框,其有以下对话框需要配置:1.3.1 基本信息(Information)图3∙Build specification name—指定唯一的生成模板名称(出现在项目管理页面中),用以和其他模板相区别∙Target filename—指定输出的DLL名称∙Destination directory—指定生成文件的输出路径∙Build specification description—描述该生成模板的相关信息。

1.3.2 输出源指定(Source Files)图4∙Project Files窗口—显示项目窗口My Computer下列举的项目(如图1),使用图4中的左/右箭头可将My Computer下列举的项目移入/移出Exported VIs和Always Included窗口。

74.调用动态链接库 6 - LabVIEW 中对 C 语言指针的处理

74.调用动态链接库 6 - LabVIEW 中对 C 语言指针的处理

调用动态链接库6 - LabVIEW 中对 C 语言指针的处理C 语言函数常有指针类型的参数,有时候,在LabVIEW 中只能得到一个指向某个数据的指针。

比如,在第4节里的一个例子:#pragma pack (1)typedef struct { char a; char* str; int b} MyStct;MyStct* testStruct;long TestStructure(MyStct* tempStct);在LabVIEW CLN 节点中,就只能返回以整数类型表示的str 的指针。

在大多数情况下,并不需要在LabVIEW 中得到指针指向内存的具体数据,对这些数据的操作是在DLL的函数中完成的。

我们只需在LabVIEW中得到这个指针的地址,再把它传递到下一个CLN 节点就可以了。

但在某些情况下,我们仍然需要在LabVIEW 中得到指针指向的内容,这只能借助C 语言来完成。

在上面的例子,我们需要另外写一个 C 函数,把函数TestStructure 返回的tempStct 结构中的元素拆开成简单数据类型,作为新的函数的参数(新函数中的一个参数就是char* str,LabVIEW可以识别它)。

在LabVIEW 中调用这个新的函数,可以得到这些简单数据类型的数据。

有些函数需要在外部开辟的一块内存中写入数据,LabVIEW 中没有分配内存的操作,也需要再写一个 C 的函数分配好内存,给被调用的函数使用。

这种做法的缺点是针对每个需要得到内容的指针都要做个包装函数,相当麻烦。

一个减少C代码的方法是:编写一个C函数,负责把指针指向的内存中的数据以数组的形式读出,再在LabVIEW 中把它们从新组织成合理的数据类型。

这种方法其实更复杂,好在LabVIEW 8.5 中自带的一些VI 已经做了这个工作。

如果你需要,不需要再额外编写代码,直接用LabVIEW 提供的VI 就可以了。

[LabVIEW]\vi.lib\Utility\importsl\GetValueByPointer\GetValueByPointer.xnode 就是用来得到指针内容的一个VI。

LabVIEW 调用 C-C++ Dll 详解

LabVIEW 调用 C-C++ Dll 详解

LabVIEW 调用C/C++ Dll 详解LabVIEW 在配上NI 的采集卡或者别的第三方的硬件,约等于神器(虽然有时候贵了点)。

这样你可以比较集中精力的专注于数据处理了,就不用学习麻烦的Win32 的GUI 编程, 也不用关注和你自己搞的采集板之间的通信了。

对于每一个测控行业的程序来说,基本上都是:初始化-->数据采集-->数据处理-->数据显示-->数据保存-->结束的一个过程。

当然如果是实时的,那么采集,处理,显示就是在一个loop 里面。

当然为了保证实时性,数据处理和数据采集不一定在一个线程里,因为处理的时候把采集给block 住也挺傻的。

LabVIEW 很容易帮你搞定:初始化-->数据采集-->数据处理-->数据显示-->数据保存-->结束但是数据处理部分,是和你的学科紧密相关的,有时候算法会诡异到你很难用VI来实现,那么你就要有C++”target=“_blank”>C++code来搞了。

那么C/C++ 是如何与LabVIEW 交互的呢,本文来较详细的阐述一下,因为准备采用总分总的写作手法...所以先来个概括...1. 把C/C++ code 编译成Dll。

2. 用LabVIEW 的call library node 来调用。

难点在于:如何把LabVIEW 的数据类型和C/C++ 的来对应。

控件x 相当与一个double,当然其类型也是可以选择的(如右图所示)。

boolean 按理说应该是一个bool, 但是传入call library node 的时候,一般要转成unsigned int 型。

cluster 其实就是个struct ,左图的cluster 是:struct tCluster{ double x11; // 类型都可以向右图那样自己配置double x2; int x3;};对于string,这里要着重讲一下,labview 的string 类型里面是包含长度信息的,它不是一个简单的char *它是个LStrHandle 类型:定义咋extcode.h 里面(可以在labview 目录下搜到)typedef struct {int32 cnt;uChar str[1];} LStr, *LStrPtr, **LStrHandle;cnt 就是含有多少个字符,str 这个指针所指的就是数据区的第一个字符。

LabVIEW调用C++包含复杂类型参数的函数

LabVIEW调用C++包含复杂类型参数的函数

LabVIEW Add-on Dev Center » Calling External Code » Calling C/C++ DLLs » Simple and Complex Datatypes
Overview Attached Files Example Hierarchy Caveats with the Import Shared Library Wizard
Choose your country | 联系
产品
行行业和应用用 资源与服务 NI在线社区
院校
活动及培训
| MyNI | 站内信
购物⻋车
!
Community
欢迎, mrfhohhot (登出)
新建
您的资料
历史记录
浏览
Help
首首⻚页 > Community > LabVIEW Tools Network Developer Center > 文文档
For an example on using the Import Shared Library Wizard, refer to:
Tutorial: Creating Wrapper VIs for C/C++ DLL functions using the Import Shared Library Wizard
Search Community
操作
这是仅供会员参与的群组,您发帖前 必须先加入入。
举报非非法信息 接收电子子邮件通知 以电子子邮件发送 查看 PDF 版本 查看打印预览 为此添加书签
书签添加人人 (28)
查看: 所有人人
下一一⻚页
其他同类内容

Labview调用C语言、Matlab脚本节点以及库函数节点的方法

Labview调用C语言、Matlab脚本节点以及库函数节点的方法

Labview调用C语言、Matlab脚本节点以及库函数节点的方法Labview调用C语言的方法CIN(Code InterfaceNode)节点是LabVIEW中用来调用C/C++代码的功能节点。

它与动态链接库的不同之处在于,它能够将代码集成在VI中作为单独的一个VI发布,而不需要多余的文件。

另外,它提供了函数入口,它可以根据用户提供的输入输出自动生成函数入口代码,从而使用户专心关注代码功能而不用为函数声明、定义等语句费心。

因此CIN节点与DLL在不同的场合有不同的优势,但是CIN节点的使用比调用DLL要复杂得多。

由于LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,并且二者完全相同,所以用户可以向CIN传递任意复合的数据结构。

另外,CIN比图形化语言可获得更高的执行效率。

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

如果要使用CIN节点,你必须安装了C编译器。

在Windows下,CIN支持以下编译器:Microsoft Visual C++Symantec CCIN节点必须调用.lsb文件。

.lsb文件是通过外部编译器与CINTools工具结合将C代码编译生成的。

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

第一步:在程序框图放置一个空CIN节点;CIN节点位于FunctionsPalette的Connectivity->Libraries& Executables->Code InterfaceNode。

第二步:创建CIN节点的输入输出端口;初始情况下,CIN只有一对端口:一个输入端口和一个输出端口。

向下拉大节点边框或右击节点端口选择AddParameter,可以为节点增加输入输出端口。

CIN 节点的端口都是成对出现的,因为CIN节点端口传递的是指针,所以该参数既可以作为输入又可以作为输出。

在LabVIEW中调用VC++生成的动态链接库文件DLL

在LabVIEW中调用VC++生成的动态链接库文件DLL

LabVIEW中调用VC++生成的DLL1.// 新建一个空的Win32 Dll 工程,加入新的cpp,写入下面代码_declspec(dllexport) int sum(int a, int b){return a+b;}//Build出一个dll:sum.dll2.// 新建一个新的Win32 Console程序//选择Simple Console Application,修改main函数所在的cpp#include "stdafx.h"#include <iostream>using namespace std;// for base type and LoadLibrary#include <WINDOWS.H>// define function pointer which will point to sum(a, b)typedef int(*Func)(int,int);int main(int argc, char* argv[]){HMODULE dll = ::LoadLibrary("sum.dll");// 加载刚才那个dll,路经要对if(dll){Func f = (Func)GetProcAddress(dll, ?sum@@YAHHH@Z);// 加载那个sum函数if(f)cout<<f(3, 4); // 等价于调用sum(3, 4)elsecout<<"function call error";}elsecout<<"lodad error";}//Build & Execute3.上面一个不便的地方就是GetProcAddress,第二个参数是个很复杂的字符串,需要事先用dumpbin sum.dll /exports得到sum函数的实际名称所以,一般会在最上面写dll时,导出函数前面不仅加上已有的红字表示导出,还要加上extern "C" ,表示以C方式编译,因为C方式编译时,函数名在库中和在程序代码中会保持一致,不像C++生成新的编码后的函数名。

VC调用labview生成的DLL

VC调用labview生成的DLL

VC调用LabVIEW生成的DLL文件刚才介绍了LabVIEW调用DLL文件的方法,使用VC调用LabVIEW生成的DLL 文件也很简单。

还是以之前生成Scale 的DLL文件为例,不同的是采集电压程序使用的是C语言的例程,但和LavVIEW实现的功能相同。

首先将先前生成Scale DLL文件时,路径下所有的文件全部复制粘帖到C语言例程的文件夹下。

打开连续采集程序,点击状态栏的Project——Settings,在Project Settings对话框中加载入Scale.lib的静态链接库。

在程序中键入#include "Scale.h",以便引入该DLL函数。

下面是C程序的代码,功能是有限点采集电压,通过Scale.dll文件实现采样值放大10倍的功能。

加粗部分是因为调用DLL文件所做的改动。

#include <stdio.h>#include "NIDAQmx.h"#include "Scale.h"#define DAQmxErrChk(functionCall)if( DAQmxFailed(error=(functionCall)) ) goto Error; elseint main(void){int32 error=0;TaskHandle taskHandle=0;int32 read;float64 data[1000];char errBuff[2048]={'\0'};int i=0;double x10=0;/*********************************************/// DAQmx Configure Code/*********************************************/DAQmxErrChk (DAQmxCreateTask("",&taskHandle));DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0"/*Config correct device*/,"",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));/ /DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_V al_FiniteSamps,1000));/*********************************************/// DAQmx Start Code/*********************************************/DAQmxErrChk (DAQmxStartTask(taskHandle));/*********************************************/// DAQmx Read Code/*********************************************/DAQmxErrChk(DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,dat a,1000,&read,NULL));printf("Acquired %d points\n",read);for(i=0;i<1000;i++){Scale(data[i], &x10);printf("the %d Value is : %f \n",i,x10);}Error:if( DAQmxFailed(error) )DAQmxGetExtendedErrorInfo(errBuff,2048);if( taskHandle!=0 ) {/*********************************************/// DAQmx Stop Code/*********************************************/DAQmxStopTask(taskHandle);DAQmxClearTask(taskHandle);}if( DAQmxFailed(error) )printf("DAQmx Error: %s\n",errBuff);printf("End of program, press Enter key to quit\n");getchar();return 0;}所以,使用LabVIEW不仅可以方便地调用各种编译软件生成的DLL文件,自己也能生成DLL文件供其他编译软件调用。

VC调用labview生成的DLL

VC调用labview生成的DLL

VC调用LabVIEW生成的DLL文件刚才介绍了LabVIEW调用DLL文件的方法,使用VC调用LabVIEW生成的DLL 文件也很简单。

还是以之前生成Scale 的DLL文件为例,不同的是采集电压程序使用的是C语言的例程,但和LavVIEW实现的功能相同。

首先将先前生成Scale DLL文件时,路径下所有的文件全部复制粘帖到C语言例程的文件夹下。

打开连续采集程序,点击状态栏的Project——Settings,在Project Settings对话框中加载入Scale.lib的静态链接库。

在程序中键入#include "Scale.h",以便引入该DLL函数。

下面是C程序的代码,功能是有限点采集电压,通过Scale.dll文件实现采样值放大10倍的功能。

加粗部分是因为调用DLL文件所做的改动。

#include <stdio.h>#include "NIDAQmx.h"#include "Scale.h"#define DAQmxErrChk(functionCall)if( DAQmxFailed(error=(functionCall)) ) goto Error; elseint main(void){int32 error=0;TaskHandle taskHandle=0;int32 read;float64 data[1000];char errBuff[2048]={'\0'};int i=0;double x10=0;/*********************************************/// DAQmx Configure Code/*********************************************/DAQmxErrChk (DAQmxCreateTask("",&taskHandle));DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0"/*Config correct device*/,"",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));/ /DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_V al_FiniteSamps,1000));/*********************************************/// DAQmx Start Code/*********************************************/DAQmxErrChk (DAQmxStartTask(taskHandle));/*********************************************/// DAQmx Read Code/*********************************************/DAQmxErrChk(DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,dat a,1000,&read,NULL));printf("Acquired %d points\n",read);for(i=0;i<1000;i++){Scale(data[i], &x10);printf("the %d Value is : %f \n",i,x10);}Error:if( DAQmxFailed(error) )DAQmxGetExtendedErrorInfo(errBuff,2048);if( taskHandle!=0 ) {/*********************************************/// DAQmx Stop Code/*********************************************/DAQmxStopTask(taskHandle);DAQmxClearTask(taskHandle);}if( DAQmxFailed(error) )printf("DAQmx Error: %s\n",errBuff);printf("End of program, press Enter key to quit\n");getchar();return 0;}所以,使用LabVIEW不仅可以方便地调用各种编译软件生成的DLL文件,自己也能生成DLL文件供其他编译软件调用。

LABVIEW中调用C的方法和CIN节点的配置

LABVIEW中调用C的方法和CIN节点的配置

LABVIEW中调用C的方法和CIN节点的配置LABVIEW中调用C的方法和CIN节点的配置CIN概述CIN是一个位于LabVIEW框图程序窗口的带有输入输出端口的图标。

用户可将需调用的外部代码编译成LabVIEW所能识别的格式后与此结点相连,当此结点执行时,LabVIEW将自动调用与此结点相连的外部代码,并向CIN传递特定数据结构。

使用CIN技术,用户可向CIN 传递任意复合的数据结构,并且通常情况下,使用CIN可获得较高的程序效率,因为LabVIEW中数据的存储格式遵循了C语言中数据的存储格式,二者完全相同。

CIN源代码对编译器有严格的限制,且因LabVIEW用于不同的操作系统平台而异。

LabVIEW支持Windows95,WindowsNT, HP-UX等多种操作系统平台。

LABVIEW中通过与C语言的接口图标来调用C,LABVIEW与C 语言的接口图标是CIN节点。

可在help中搜索cin即可得到该节点CIN的设计方法确定CIN节点的输入、输出个数和参数类型。

CIN输入(输出)口参数的数据类型由连接在输入(输出)口上的控件的数据类型决定。

(1)生成C源代码编辑格式文件。

(2)在C源代码编辑格式文件的规定位置添加C源代码。

(3)编辑*.C文件源代码,生成可执行文件。

(4)装载编译好的可执行文件,这样就基本上形成了一个具备一定功能的CIN图标。

3应用例子通信系统中,CRC编码是非常常用的一种编码方式。

在LABVIEW 中实现比较复杂和困难。

因此,采用C语言编写CRC校验码,在LABVIEW中利用CIN节点进行调用。

3.1生成C源代码编辑格式文件(*.c文件)的代码框架生成C源代码编辑格式文件(*.c文件)的代码框架的步骤如下所述。

首先,从CIN图标的快捷菜单中选择Create.c File项,弹出一个文件存储对话框,键入文件名(本例中文件名设为“crc.c”),则生成C语言代码框,然后打开。

Labview调用VC

Labview调用VC

Labview调用VC对初学者来说来个比较详细的包含步骤例子是难得的,我来个简单的小例子,希望对您有用,呵呵!!!1。

建立动态连接库的C 代码调用1.1 建立函数原形1)后面框图程序中,调用CLF 节点;2)配置一个函数原形,设置调用规程为C,其它不变,确定,退出;3)右键CLF 节点,create C file,保存名字为code.cpp,以供VC++编译使用;1.2 编辑源代码文件1)将所需要的labview 头文件复制到code.cpp 所在目录中,包括:extcode.h platdefines.h fundtype.h;2) 打开code.cpp,添加关键词extern c 、_declspec(dllexport)并包装;然后输入函数的功能代码,如果1 个dll 里面需要多个函数,则需要声明多个函数的原形。

2。

VC++中编译产生dll1)建立project ,file&agrave;new-> win32 Dyna,mic Link Library,输入工程名,选择an empty dll project;2)添加code.cpp 到source file,添加extcode.h platdefines.h fundtype.h 到head files 里面;3)设置dll 参数project&agrave;settings&agrave;c/C++中设置参数:category: code generation ;根据函数要求可以选择1Byte4 Byte 8Byte,采用默认就可以;multithread;其余默认可以;自己也可以微调;4)Build&agrave;Build code.dll;5)Ok。

虚拟仪器复习试题库

虚拟仪器复习试题库

虚拟仪器复习题库一、填空题<一>1、VI虚拟仪器的三个主要组成局部是_前面板_、_程序框图_和_图标_。

2、LabView有三种操作模板,分别是_控件模板_、_函数模板_和_工具模板_。

3、CIN节点需要调用__*.lsb__格式文件,这种文件可以通过__Visual C++__来生成。

4、虚拟仪器设计中连线为虚线时表示___数据类型不匹配出错_,当RUN按钮显示为折断的箭头时,表示程序___有错误发生__。

5、在LabView中_局部变量_主要用于程序部传递数据,_全局变量_主要用于程序之间传递数据。

6、程序框图由_端口_、_节点_和_连线_组成的可执行代码。

7、一个完整的VI包括三个局部:( 前面板、程序框图、图标/连接口 )。

8、LabVIEW有四种类型的节点:〔函数〕、〔子程序〕、构造和代码接口。

9、因为For循环的常用来处理数组,所以数据出口的自动索引默认为〔有〕。

10、而While循环的数据出口的自动索引默认为〔无〕。

11、使用两个For循环,把其中一个嵌套在另一个中可以生成一个二维数组。

外层的For 循环产生〔行〕元素,而层的For循环产生〔列〕。

12、利用〔相关滤波〕可以方便地从复杂的待测信号中别离出*一特定频率的信号。

采样间隔是指〔一个连续采集的序列中,相邻两次采集之间的时间间隔〕。

13、虚拟仪器最核心的思想是〔硬件实现的功能软件化〕,从而降低系统本钱,增强系统功能与灵活性。

14、如果没有现成的数据采集卡,我们也可以利用LabVIEW中的〔动态库〕功能实现数据采集。

15、Sequence构造有〔重叠式和平铺式〕两种方式。

16、框图程序是由〔节点〕、〔端口〕和〔连线〕组成的可执行代码。

<二>1、假设需要从一条已经存在的数据连线引出一条数据连线分支,有两种方法可以实现:(1) 将连线工具移动到这条数据连线上,当数据连线闪烁时,单击鼠标左键,然后拖动鼠标,在鼠标的单击处就会引出一条数据连线分支;(2) 将鼠标移动到这条数据连线上适宜的位置,在线上单击鼠标右键,在弹出的快捷菜单中选择Create Wire Branch,在鼠标的单击处就会引出一条数据连线分支。

Labview调用dll详解(C语言DLL

Labview调用dll详解(C语言DLL

Labview调用dll详解(C语言DLLLabview调用dll详解(C语言DLL)之一labview中提供了两个C接口,一个是CLF,一个是CIN。

本帖子讨论DLL的调用,也就是CLF。

由于C的强大功能,本帖子讨论C创建的DLL的调用。

首先简单解释一下DLL,也就是动态链接库。

DLL 的好处是屏蔽底层的细节,用户不用也不能打开DLL,便于资源代码数据共享,节省内存等。

一般情况下labview是不需要调用DLL的。

DLL分两类,一类是API,一类是自己创建的DLL。

这两者本质都一样,但是调用一般来说是有区别的。

R) {$ f0 x7 @3 B 要调用DLL必须要有DLL,也就是所谓的路径。

这个一般不会出错的,不用解释了。

其次是选择函数,这个也不难。

线程一般选择UI线程,任意线程的DLL和UI线程DLL有颜色上的区别,其次在源代码中也有区别(这个不是DLL调用失败的主因,不用过多纠缠)。

接下来是调用设置:Ccall和standcall。

一般来说,windows API采用的是standcall,自己创建的采用Ccall。

两种调用区别在于参数进入栈的顺序不同。

这里随便说一下,栈由系统自动分配内存,类似C语言的int a都是分配的栈内存;new分配的是堆内存。

栈内存由系统负责回收,堆内存一般程序员负责释放,所以要注意系统的内存泄漏。

labview的初始化数组也会分配内存,所以不宜频繁调用。

8 h. p8 V/ m, J- D4 X 接下来是最重要的参数配置,也是最复杂的参数配置。

首先要知道函数原型,C语言里面叫导出函数类。

一般在include文件下面的头文件里面。

下面是一个典型的函数原型:extern "C" ZLDS10X_DLL_API SENSOR_HANDLE ZLDS10X_DLL_stdcall ZLDS10X_Open(char * portnum , int baud , int timeout , int address); 值得注意的是,很多人会把函数原型看错。

LabVIEW与C语言接口的方法

LabVIEW与C语言接口的方法

关键词 !"#$%&’$
7/12>? %2 0> "1 /44/520@/ ;"2. 28 /1."15/ 2./ /1203/ 4=152081 84 !"#$%&’? ()*+,%-# $032="< 01>23=7/12
.
引言
/?3
012 图标端口参数设置 初始时, (%F 只有一个参数的输入端口和输出端
),
《自动化仪表》 第 !& 卷第 ’ 期
!(() 年 ’ 月 ( N Q T; { =9? N W 293>; N XX )
! ?6>438*3A8<
Q T;
! [ 0! O X . ] X Q &*3A8<
( 3 Q T; =9? 3 W O; 3 XX )
! ?6>438*3A8<
[ 3! 293> ’*3A8<
#$%&’() 与 2 语言接口的方法 !"#$%&’ 向工程文件中分别添加上述 ! ()*%+ , , , 操作,
陈金平, 等
文件比第二 杂, 且第一种方法生成的 “矩阵相乘 , *+2” 种方法生成的 “矩阵相乘 , *+2” 文件要小得多。本文采 文件。 用的是第一种方法生成的 “矩阵相乘 , *+2” ! ," 在 #$%&’()*+, 中调入 - ./% 文件 打开 I12QPUN 程 序 “矩 阵相乘 , 关闭 Q/ = = R ST, , 从 /PM 结 点 的 快 捷 菜 单 中 选 择 “ I#17 /#7% V%G 3)” 命令, 并选择刚创建的 , *+2 文件 “矩阵相乘 , +#;"&% , , , ” 。 *+2” 命令将目标代码 “矩阵相 “I#17 /#7% V%+#;"&% , , , ” 乘 , *+2” 调入内存并与 I12QPUN 程序 “矩阵相乘 , 3)” 中 的 /PM 相连。至此, 该 I12QPUN 程序已可运行, 结果如 图 W 所示。将该程序 “矩阵相乘 , 3)” 存盘, 则目标代码 将 完 美 地 与 I12QPUN 程 序 结 合 在 一 “矩阵 相 乘 , *+2” 将 不 再 有 用, 将 “矩 阵 相 乘 , 起, 至此 “矩 阵 相 乘 , *+2” 删除, “矩阵相乘 , 3)” 照样运行自如。 I12QPUN 程序 *+2”

在LabVIEW中调用C语言的方法及其应用

在LabVIEW中调用C语言的方法及其应用

在LabVIEW中调用C语言的方法及其应用
刘航;徐杜
【期刊名称】《工业控制计算机》
【年(卷),期】2000(013)004
【摘要】在简要介绍LabVIEW虚拟仪器软件开发平台的基础上,结合具体例子,重点说明了在LabVIEW中利用代码接口节点CIN(CodeInterfaceNodes)调用C语言的方法,并将其应用于一个自调整因子模糊控制位置纠偏实验系统的设计中。

【总页数】3页(P30-32)
【作者】刘航;徐杜
【作者单位】汕头大学工学院机电工程系;汕头大学工学院机电工程系
【正文语种】中文
【中图分类】TP216
【相关文献】
1.C语言静态代码分析中的调用关系提取方法 [J], 江梦涛;荆琦
bVIEW中调用C语言研究与实现 [J], 蒯锐
3.在VB中调用基于ActiveX技术的LabVIEW部件的方法 [J], 朱立军
4.在LabVIEW中调用Virsual C++的方法 [J], 赵冬梅;张宾
bVIEW中调用MATLAB进行信号处理方法研究 [J], 吴小红
因版权原因,仅展示原文概要,查看原文内容请购买。

LabVIEW调用库函数节点

LabVIEW调用库函数节点

LabVIEW调⽤库函数节点⼀、dll⽂件的创建dll⽂件的创建,我使⽤的是VS 2017,以此为例介绍:1、新建⼀个dll项⽬,选择Visual c++》Windows 桌⾯》动态链接库(DLL)然后会得到如下图所⽰的Dll.cpp⽂件会得到⼀个空的头⽂件⽂件其中#pragma once 代表这个头⽂件只被编译⼀次,与1 #ifndef _DELL1_H2#define _DELL1_H3456#endif作⽤类似。

2、编写程序在头⽂件写声明,值得注意的是,这⾥需要使⽤__declspec(dllexport)关键字修饰,表⽰这个函数是输出的函数可以在外部使⽤,这⾥的 extern “C” 表⽰的是⽤c的编译器来编译这个函数,这⾥的C是⼤写的要注意,这样编译出来的函数名就是我们希望的,否则就会产⽣不⼀样函数名。

extern"C" __declspec(dllexport) UINT8 choose(double *a, UINT8 *b);去源⽂件Dll1.cpp定义函数体,别忘记在开头把Dll1.h头⽂件包括进来。

1 #include "stdafx.h"2 #include "Dll1.h"34double abs(double a)5 {6return a > 0 ? a : -a;7 }8910extern"C" __declspec(dllexport) UINT8 choose( double *a,UINT8 *b)11 {12double T = *a;13double To = *(a + 1);14double Tb = *(a + 2);15double Tt = *(a + 2);16if (Tb < T | Tt < T)17 {18if (abs(Tb - Tt) < 3)19 {20 *b = 1;21 *(b + 1) = 1;22 }23else24 {25 *b = 0;26 *(b + 1) = 0;2728 }29 }30else31 {32 *b = 0;33 *(b + 1) = 0;3435 }3637return1;38 }⽣成dll,在“⽣成”》⽣成解决⽅案,如果没报错的话就能⽣成dll⽂件,实际⽣成的时候,如果之前这个dll⽂件已经zailabview 使⽤了,那么⽣成的时候可能会报错(即使是复制出去的dll)关闭labview重新尝试。

用labview调用c语言的方法

用labview调用c语言的方法

用labview调用c语言其实是一件挺简单的是,下面我们通过一个求两个数的相加来一步步的介绍怎样来调用C语言,只要大家按照步骤一步一步的来一定会功的,加油!LabVIEW中使用CIN节点调用C语言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 CCIN节点必须调用.lsb文件。

.lsb文件是通过外部编译器与CINTools工具结合将C代码编译生成的。

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

例18.6 利用CIN节点实现加法运算第一步:在程序框图放置一个空CIN节点;CIN节点位于程序框图的互连接口->库与可执行程序->代码借口节点。

第二步:创建CIN节点的输入输出端口;初始情况下,CIN只有一对端口:一个输入端口和一个输出端口。

向下拉大节点边框或右击节点端口选择增加参数,可以为节点增加输入输出端口。

CIN节点的端口都是成对出现的,因为CIN节点端口传递的是指针,所以该参数既可以作为输入又可以作为输出。

【LabVIEW】构造器节点调用C#动态链接库dll

【LabVIEW】构造器节点调用C#动态链接库dll

【LabVIEW】构造器节点调⽤C#动态链接库dll
⼀、调⽤C#动态链接库dll
(1)新建VI,后⾯板选择“互连接⼝->.NET->构造器节点”。

(2)双击“构造器节点”图标,找到我们刚刚编译好的dll⽂件,选中相应类名,确定。

(3)选择“互连接⼝->.NET->调⽤节点”。

(4)将⼆者相连,点击调⽤节点选择相应⽅法。

⼆、实现遍历DataTable
互连接⼝-->.net-->构造器节点
在C#中写⼀个函数来实现这个功能,然后再将⼯程⽣成⼀个动态链接库,然后在LabVIEW中就可以调⽤⽣成的dll中所写的这个函数来实现对datatable的读取。

三、常见问题
1、调⽤.net构造器占⽤内存
运⾏不久后提⽰构造器节点内存已满。

问题是在构造了多个引⽤后没有合理的关闭引⽤导致了使⽤引⽤的增加也就导致了内存的增加。

解决⽅法:在使⽤调⽤节点和属性节点时要做到每⼀个节点后都有⼀个对应的关闭引⽤,这样就可以避免由于没有关闭引⽤⽽使内存增加的问题。

注意:如果有for循环,要在循环外关闭引⽤,否则也会产⽣错误的。

2、.NET构造器节点该类不包括任何公共构造器
1、确认已经在类和⽅法上加了Public关键字;
2、把构造函数删掉。

3、报错“Object reference not set to an instance of an object”
某函数调⽤产⽣这个问题。

该部函数传⼊参数有ref,数据类型是数组,删掉这个传⼊参数就不报错了,但其他函数同样传⼊参数⼜不报错...个例先记录下来,原因待查。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何使用LabVIEW调用c#编写的DLL
最近在做一个项目时,需要在Labview中列出可用的磁盘驱动器,我们可以使用互连接口》库与可执行程序》执行系统命令vi,但是在程序运行时会弹出命令提示符窗口,对于计算机菜鸟用户而言,他们或许会以为那是在执行病毒程序,为了增加用户的好感度,本文采用调用DLL的方式来解决问题。

在调用DLL之前,我们先来创建一个DLL,打开VS2008,新建一个类库项目,如下图:
点击确定后进入代码编写窗口。

编写好的代码如下图所示:
选择VS2008的生成》配置管理器,打开配置管理器,如下图所示:
在活动解决方案配置下拉框中选择Release,然后点击关闭。

选择生成》生成DrivesInfoDll,然后生成一个DLL文件。

在项目的的bin\Release目录下面可以找到生成的DLL文件,如下图所示:
我们把它复制我要使用它的地方,如下图:
现在,打开LabVIEW2012,新建一个VI,切换到程序框图,选择下图的构造器节点到程序框图:
此时将自动打开选择.NET构造器:
点击浏览按钮,选择要调用的DLL:
点击确定后在对象中选择Class1:,如下图所示:
点击确定按钮关闭对话框。

选择下图的调用节点到程序框图:
将构造器节点的“新引用”输出端与调用节点的“引用”输入端连接起来,然后在调用节点的“方法”上点击,选择我们要使用的方法,这里选择GetDrivesInfo()。

选择下图的关闭引用到程序框图并连接调用节点的“引用输出”输出端到关闭引用的“引用”输入端。

然后创建一个字符串数组,显示GetDrivesInfo方法的执行结果。

完整的程序框图如下:
运行后的前面板结果如下:
这说明程序是执行成功了的。

相关文档
最新文档