用LABVIEW调用C语言的方法
基于LabVIEW直接读取C语言数据文件的研究

[05,= ・ , + .】 1 2‘因此符号位 Ms [】; 。 =02
阶码 E [ 1 1 2 ] = 1 2 ] , = - + 0 3, [0 2, 表示成二进制即 。 。
件 。 对 于 大 多 数 工 程 师 来 说 , 写 动 态链 接 库 程序 也 并 不 是 一 但 编 件 轻 松 的 工 作 。因 此 , 文 通 过 对 C 语 言 文 件 以及 L b lW 文 本 a VE 件 存 储 格 式 的 分 析 ,提 出 了 一 种 直 接 采用 L b IW 读 取 C 语 a VE 言 文 件 的 方 法 , 不 需 要 编 写 动 态 链 接 库 , 便 地 解 决 了 L b 而 方 a— VE 对 以前 C 语 言 数 据 的读 取 。 IW
0 0 H。 0 0
当 前 , 有 已 知 的 C/ + 编 译 器 都 是 按 照 IE 国 际 电 子 所 C + E E(
电器 工 程 师 协 会 ) 制 定 的 IE E E浮 点 数 表 示 法 来 进 行 运 算 的 。
IE E E标 准 7 4规 定 了 三种 浮 点 数 格 式 : 精 度 、 精 度 、 展 精 5 单 双 扩 度 。前 两者 分 别 对 应 C 语 言 的 F a 、 o be精 度 类 型 , 是 大 l tD u l o 也
关键词 : C语 言 , 点数 , a VE 读 写 文件 浮 L b IW,
Ab ta s rct
hs I t i pap , ne n er a w e e t m e h d o e biar l t f ci ve t o t rad n yf oa i ng—poit i fr n fe o med l by C ln a gua i pu f wa d ge s t or r ac or n c dig t te ompa ion et en t ig or o h c rs b we sor f mato C l gu n f an age an La d bVl . m pa e wi r t alm e h d ln EW Co rd t tadion t o ofcal g dy a i h i i nm c
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 这个指针所指的就是数据区的第一个字符。
北信科测控技术与仪器系虚拟仪器期末考试考点总结范文

北信科测控技术与仪器系虚拟仪器期末考试考点总结范文简答:1.虚拟仪器程序调试方法主要有哪些答:1、设置执行程序为高亮方式,程序执行前点击高亮按钮,则运行过程会以高亮形式显示数据流。
2、单步执行方式:如果要使框图程序一个节点一个节点则按下单步单步按行钮就会闪烁,指示它将被执行,再次点击单步按钮,程序将会变成连续运行。
3、探针,从工具模板中选择探针工具,将探针工具置于某根连线上可以用来查看运行过程中数据流在该连线时的数据4、断点使用断点工具可以在程序的某一点中止程序执行,用探针或单步方式查看数据。
2、简要叙述局部变量和全局变量的使用特点和区别。
答:通过局部变量或全局变量,可以实现在程序框图中的多个地方读写同一个控件。
局部变量只能在同一程序内部使用,每个局部变量都对应前面板上的一个控件,一个控件可以创建多个局部变量。
读写局部变量等同于读写相应控件。
通过全局变量可以在不同的VI之间进行数据交换,一个全局变量的VI文件中可以包含多个不同数据类型的全局变量。
LabVIEW中的全局变量是以独立的VI文件形式存在的,这个VI文件只有前面板,没有程序框图不能进行编程。
3、简要介绍For循环和While循环的自动索引功能。
答:For循环和While循环可以自动地在数组的上下限范围内编索引和进行累计。
这些功能称为自动索引。
在启动自动索引功能以后,当把某个外部节点的任何一维元素连接到循环边框的某个输入通道时,该数组的各个元素就将按顺序一个一个地输入到循环中。
循环会对一维数组中的标量元素,或者二维数组中的一维数组等编制索引。
在输出通道也要执行同样的工作――数组元素按顺序进入一维数组,一维数组进入二维数组,依此类推。
4、For循环和While循环的区别是什么?使用中它们各自适用于什么场合答:For循环规定了循环次数,其条件选择是根据计数器计数次数是否达到循环次数而决定结束循环的条件;而While循环不规定循环次数,其条件选择是根据选择器端子的条件是否得以满足而决定结束循环的条件。
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++生成的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文件刚才介绍了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的VI转换为C语言代码
如何将LabVIEW的VI转换为C语言代码方法一:利用LabVIEW的C Generator工具包下载安装LabVIEW 2012软件,下载LabVIEW工具包2012CGenerator.exe。
下载地址/download/labview-c-generator-2012/3143/en/安装好工具包的LabVIEW开始界面变为这样,有个转换的小标志。
新建一个工程文件,并在文件中添加需要转换成C语言的vi文件。
楼主要转换的是源代码转换.vi。
就添加进工程就好。
在程序生成规范右键-----新建------C Code Generation。
生成一个C文件。
将出现这个框,点击左侧Source Files将需转换的vi选中并点击上面的导出vi弹出对话框,点击ok 导出vi,点击生成完成了C文件的转换。
在转换的过程中会出现转换失败的情况,是因为LabVIEW中有些模块不能转换成C语言。
生成的C语言也不一定能运行,还要看各位追求的精度有多高。
方法二:利用NI的微处理器SDK模块步骤1、下载并安装代码转换工具包对于代码转换这个问题,其实NI有多个工具包可用。
这些工具包虽然都是针对嵌入式开发用的,但是其中代码转换功能不妨借来一用。
这里推荐NI的微处理器SDK模块。
这个模块的具体功能这里就不罗嗦了,详细介绍可参看其介绍页面。
这里给出下载页面。
可根据需要选择下载。
也可以。
步骤2、下载并安装完后就可以进行代码转换了。
如果你只是使用这个工具包的代码转换功能并且不是经常使用,就没必要购买授权了,试用版就可以。
安装完成后,在启动LabVIEW时会看到会看到微处理器SDK的工具包图标,图1中的红圈部分图1步骤3:新建一个空的项目。
这里将项目保存为Convert code。
由于NI的这个工具包是针对微处理器开发的,所以我们要使用其中的功能就要新建一个特定的终端。
如图2所示。
图2 这个工具包提供的功能还是蛮多的,别的就不管了,我们这里只是想转换代码,选择Code Generation下的Code Generation Only就可以了。
LabVIEW调用库函数节点技术
LabVIEW调用库函数节点技术LabVIEW提供了调用库函数节点(Call Library Function node,简称CLF),利用CLF,可以在LabVIEW中实现DLL和API函数的调用。
在LabVIEW中使用CLF 需要了解动态链接库里被调用的函数名称、功能及其输入输出参数等,下面将详细介绍在LabVIEW 8.6下利用CLF调用6050运动控制卡基于C语言编写的驱动程序[41]。
首先在框图程序中创建一个空的CLF,CLF位于“函数模板→互连接口→库与可执行程序子模板”,如图1-1所示,下面给出其详细的配置过程:图1-1 CLF节点图标(1)双击CLF图标弹出配置对话框,如图1-2所示,首先要指定6050控制卡动态链接库的库名或路径。
点击其右边的文件夹图标,打开一个文件对话框,找到6050运动控制卡的动态链接库文件“dfjzh6050dll.dll”所在位置。
(2) LabVIEW装载了DLL文件后会自动检测其所包含的函数,但不能检测函数中的参数及其数据类型,因此接下来的要参照DLL说明文件“dfjzh6050dll.h”及控制卡使用手册选择所要配置的函数名,设置函数参数。
(3)在调用规范中有“stdcall(WINAPI)”和“C”两个选项,它们的区别是,若调用函数为Windows标准共享库函数则选择“stdcall(WINAPI)”选项,若调用函数为VC环境下编译的库函数则选择“C”选项,本文选择“C”选项。
(4)在“线程”选项中选择“在UI线程中运行”。
至此,完成了所有配置选项,在CLF配置图最下方可以看到函数原型。
下面阐述配置CLF过程中需注意的两个问题:图1-2 CLF节点配置图Figure1-2 CLF Node Setting Chart(1) LabVIEW线程调用方式节点配置中,有两种线程调用方式,“在UI线程中运行”和“在任意线程中运行”。
“在UI线程中运行”表示在用户接口线程中调用,DLL的执行期将等到用户接口线程(在此即LabVIEW环境下的VI应用程序)执行DLL的导出函数调用时才开始;“在任意线程中运行”表示允许多个线程同时调用这个DLL。
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à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àsettingsàc/C++中设置参数:category: code generation ;根据函数要求可以选择1Byte4 Byte 8Byte,采用默认就可以;multithread;其余默认可以;自己也可以微调;4)BuildàBuild code.dll;5)Ok。
LabVIEW中调用C语言研究与实现
S TUDY AND REALI ZATI oN oF CALL I La C N bVI EW
Kua i iRU
( h nh intueo cn l yS a g a 0 2 3 C ia Sa g a stt fT hoo ,h n h i 0 3 , hn ) I i e g 2
并且 通 常 情 况 下 , 用 CN 可 获 得 较 高 的程 序 效 率 , 为 使 I 因 a VE L b IW中数据 的存储格式 遵循 了 c语 言中数据 的存储 格式 , 二者 完全 相 同。CN源 代 码对 编 译 I
器有严 格 的 限 制 , 因 L b IW 用 且 aV E 于不 同 的操 作 系统 平 台 而异 。L b a- V E 支 持 Widw9 , n o s T IW n o s5 Widw N , H .X等多种操作系统平 台。 PU Lb IW 中通过 与 C语言 的接 a VE 口图标来调用 C Lb IW 与 C语 言 , aV E 的接 口图标是 CN节点 。其 调用 路 I
构 。使用 CN技术 , I 用户 可 向 CN传 递任 意复合 的数据结 构 , I
I 5l 昌 J
L b I W 是美 国 N ( ai a Is m n o p n ) 司推 a VE I N t n nt e t m ay 公 ol u r C 出的一 种基 于 G语言 ( rp i a gae 的虚拟仪器 软件开发 Gahc L n g ) s u 工具 。是 目前应 用最广 、 发展最快 、 功能最强的图形化软件开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
改写后保存该文件就完成了.c 源文件的编写,下面我们通过 Visual C++ 6.0 集成开发环境来编译该源文件。 第四步:编译.c 源文件为.lsb 文件 1. 打开 VC++ 6.0,在主窗口菜单中选择文件->新建,在弹出的对话框选 择 Win32 Dynamic-Link Library,设置工程名称为 add,并在位置栏设 置该工程所在路径,如图 18.10 所示。点击 OK 按钮后,在接下来的对话 框中选择完成按钮, 在接着弹出的信息提示对话框中点击 OK, 就成功创 建了一个空的 DLL Project。
图 18.10 VC 中创建新 DLL建的 add.c 源文件与...\LabVIEW 8.2\cintools 目录下的 cin.obj, labview.lib, lvsb.lib, lvsbmain.def 添加到工程中。添加方法是在 VC++ 主菜单中选择工程->添加到工程->文件...。 3. 选择工程->设置...,在弹出对话框的设置栏中选择所以配置,然后选择 C/C ++ 页, 选择分类栏为预处理器,将...\LabVIEW 8.2\cintools 目录添加到附加包 含路径中; 4. 仍然在上面的对话框中选择分类为 Code Generation,设置 Struct me mber alignment 为 1 byte。设置 Use run-time library 为 Multithreade d DLL。 5. 选择自定义组件页,在命令栏中输入:”cintools 所在目录\lvsbutil” $(TargetNa me) –d “$(WkspDir)\$(OutDir)” ” (注意这里是用半角输入法) , 在输出栏中输入: $(OutDir)$(TargetName).lsb”,如图 18.12 所示。这一步就是利用 LabVIEW 的 C INTools 工具包中的 lvsbutil 工具将 VC++生成的 DLL 文件转换为 CIN 节点能够 使用的.lsb 文件。 6. 点击 OK 按钮完成配置后,点击 VC++工具栏中的组件按钮,全部组件。 编译过程中,VC++首先创建一个 DLL 文件,然后调用 lvsbutil 工具将这 个 DLL 文件转换为.lsb 文件。编译完成后,打开工程目录下的 Debug 文 件夹,我们可以看到新生成的.lsb 文件:add.lsb。下面就可以将该文件加 载到 CIN 节点中了。 第五步:加载.lsb 文件到 CIN 节点 回到 LabVIEW 程序中,右击第二步中创建的 CIN 节点,选择加载代码资源,在 弹出的文件选择对话框中双击选择刚才创建好的 add.lsb 文件,这就完成了.lsb 文件的加载过程。这时候 VI 窗口工具栏中的 Run 按钮也变为可执行状态 运行 VI 可以得到预期结果; 到此为止,我们就完成了一个 CIN 节点的创建过程。其实 LabVIEW 提供了 大量的外部函数供 CIN 节点调用,这些函数涵盖了从底层字节操作到数据排序、 内存管理等各个方面。这些函数都在一个称为 Managers 的库中管理。在 C 代码 。
右击 CIN 节点选择创建.c 文件,在弹出的对话框中保存文件,这里文件名命 名为 add.c。 打开该文件可以看到 LabVIEW 已经自动添加了一些代码用于包含库 以及函数声明等,内容如下: /* CIN source file */ #i nclude "extcode.h" MgErr CINRun(float64 *a, float64 *b, float64 *c); MgErr CINRun(float64 *a, float64 *b, float64 *c) { /* Insert code here */ return noErr; } 用户可以在“/*Insert code here*/”处添加函数所需的 C 代码。头文件“ext code.h” 是 LabVIEW 自带的一个头文件, 位于... \LabVIEW 8.2\cintools 目录下。 它定义了 CIN 和外部程序所用到的基本数据类型和许多函数等。其中定义的某 些常量和数据类型可能会与系统头文件相冲突, 因此在使用系统头文件并进行系 统调用时,需要将 cintools 目录下的 hosttype.h 文件也包含进来。#i nclude “ho sttype.h”必须紧跟着#i nclude “extcode.h”语句, 然后才能用#i nclude 语句包含 系统头文件。 当 CIN 节点执行时,LabVIEW 将调用 CINRun 函数。CINRun 函数将 CIN 节点的输入输出作为参数看待。此外,还可以添加一些其它的后台例行程序(R outines):CINLoad,CINSave,CINUnload,CINAbort,CINInit,CINDispo se 和 CINProperties。它们分别在不同的时刻执行。例如 CINLoad 在第一次载入 VI 时执行。缺省情况下是不执行任何内容的,如果你需要在 VI 载入时执行某段 程序,则可以把该段程序添加在 CINLoad 例程中。编写 CINLoad 例程的代码如 下: CIN MgErr CINLoad(RsrcFile reserved) { Unused (reserved); /* ENTER YOUR CODE HERE */ return noErr; } 通常情况下,我们只需要编写 CINRun 函数。本例中,只需要将.c 源文件中 的 CINRun 函数改写如下: MgErr CINRun(float64 *a, float64 *b, float64 *c) { *c=*a+*b; return noErr; }
中通过调用这些函数可以方便的实现非常强大的功能。限于篇幅,这里就不详细 介绍了,有兴趣的读者可以参考 NI 公司的 Using External Code in LabVIEW. pdf 文档。在...\LabVIEW 8.2\examples\cins 目录下也可以看到 LabVIEW 提供的 不少 CIN 节点实例。