LabVIEW调用DLL有关一、二级指针参数,打包exe运行异常解决办法

合集下载

LABVIEW学习中常遇到的50个问题及解答

LABVIEW学习中常遇到的50个问题及解答

Labview初学者常见问题以及解答1、Labview如何实现由一个事件引发其他三个事件的顺序发生,且这三次事件间的时间间隔为50ms?回答:可以引用状态机来设计程序,将触发事件作为状态机的状态控制参数,后面发生的三个事件依次作为状态机的三个顺序状态,设置状态切换时间间隔为500ms.2、labview在主程序通过局部变量不能实时看子vi的参数回答:通过局部变量只能得到子vi运行完之后的结果。

可以用control reference 方式,在子vi加一个属性节点引出一个reference。

主程序里把需要显示的控件创建一个reference连到子vi的reference输入端口。

另外也可以用vi server方式实现。

3、如何在一个graph或chart显示多个Y轴刻度,并且使每个通道对应每个刻度?回答:在前面板上,右键点击刻度,然后选择duplicate scales,就会创建一个新的刻度。

然后再点击右键,选择swap sides,就可以让刻度显示在图的左边或右边。

然后右键右上角的plot legend上的曲线plot,选择Y scales然后就可以选择与该曲线相应的Y轴SCALES。

多条曲线对应多条Y轴的刻度时,是同样的方法。

4、如何从labview中打开一个pdf文件?回答:最简单的方法:用system exec.vi实现,在system exec.vi的command line 端口创建一个常量,输入adobe reader 的路径,再加上文件名等几个参数就可以实现上述要求。

举例如下:如果要拉开位于c盘的1234.pdf文件可以这样写“C:\Program files\Acrobt 7.0\Acrobat\Acrobat.exe”/t“C:\1234.pdf” “username”其中C:\Program files\Adobe\Acrobt7.0\Acrobat\Acrobat.exe是Adobe Reader 的安装路径,/t是命令参数,C:\1234.pdf则是要打开的文件名,最后的username是用户的名字5、采集数据在graph如何显示系统时间,并且随着采集点数时间不断刷新。

LabVIEW代码中常见的错误

LabVIEW代码中常见的错误

LabVIEW代码中常见的错误发现了程序的问题再回头去调试,在查找程序错误时就不可避免地要花⼤量时间。

要调⾼开发效率,最好是在编写代码时就避免⼀些常见的低级错误,这样可以节约⼤量的调试时间。

有些编程错误差不多是每个LabVIEW 程序员都曾遇到过的。

在编写相关代码的时候,对这些问题多留⼼⼀下,就可以⼤⼤减少调试时间。

1. 数值溢出图1:数值溢出错误图1 中的VI 只做了⼀个简单乘法300*300 ,不加思索就应该知道答案是90000,但程序中乘法节点给出的结果却是24464。

乘法节点是不会错的,错误是由于程序中使⽤的数据类型是I16。

I16 能表⽰的最⼤数⽬只有32767,所以在乘法计算中出现了溢出。

避免此类错误的⽅法是,在程序中使⽤短数据类型时,⼀定要确认程序中的数据绝不会超出该类型可以表⽰的范围。

2. For 循环的隧道循环相关的介绍可以参考《循环结构》。

数据传⼊传出循环结构可以通过移位寄存器(Shift Register)和隧道(Tunnel)两种⽅式。

隧道⼜有两种类型:带索引的和不带索引的。

移位寄存器⼀般⽤在需要局部变量的情况下,循环运⾏⼀次的输出数据要作为下次运⾏的输⼊数据使⽤;循环外的数组数据通过带索引的隧道在循环体内就可以直接得到数组元素;除此之外,简单地在循环内外传递数据,使⽤⼀般的隧道就可以了。

值得⼀提的是,如果⼀个数据传⼊循环体,⼜传出来,那么就应该使⽤移位寄存器或带索引的隧道来传递这个数据,尽量不要使⽤不带索引的隧道。

因为For 循环在运⾏时,循环次数有可能为0。

在循环次数为0时,⼤多数情况,⽤户还是希望传出循环的数据就是传⼊值,但使⽤不带索引隧道时,输⼊值有时会被丢失的。

如果使⽤移位寄存器,即使循环次数为0,也不会丢失传⼊的数据。

因为移位寄存器在循环上的两个接线柱指向的实际是同⼀块内存(参考:LabVIEW 程序的内存优化),⽽输⼊输出两个隧道指向的是不同的内存,数据不⼀定相同。

关于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窗口。

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利用activeX读取Excel文件报错3005等解决办法(有图)

Labview利用activeX读取Excel文件报错3005等解决办法(有图)

利用activeX读取Excel时遇到一些坑,希望能帮到和我一样遇到此类问题的朋友,废话不多说,具体步骤如下。

Step1:前面板放置自动化打开引用句柄,如下图:
Step2:右击到最下端浏览,如下图:
Step3:从类型库选择Excel对象,(labview访问PC安装的EXCEL应用对象)如下图:
Step4:下拉框选择具体对象,注意选择图一中的(_Application)会报3005错,请往下拉请选择第二个Application,如下图二:
图一
图二
Step5:程序框图具体操作如下图,具体步骤略;
注意事项:可能遇到的坑Sheets类的方法Index索引从1开始,0无效(报错-2147352565)当直接建立输入变体控件时运行会报代码为-2147352565的错误;
Step6:最后,运行结束,调WookBook方法进行关闭.
本人第一次发文章,水平有限,请多指教。

若喜欢的话请点个赞。

LABVIEW的DLL与API调用

LABVIEW的DLL与API调用

LABVIEW的DLL与API调用LABVIEW的DLL与API调用一.实验目的1.熟悉LabVIEW调用动态链接库的过程2.学会编写用LabVIEW调用WINDOWS的API函数二.实验器材1.计算机(带有声卡)2.LABVIEW8.20软件三.实验原理在开发自动测量系统时,经常遇到计算机与仪器的通信问题,涉及仪器控制及数据处理问题,LabVIEW语言在这一领域的应用有着独到的优势。

为了在LabVIEW中能够充分利用其他编程语言的优势,LabVIEW提供了外部程序接口能力,包括动态链接库(DLL)、C语言接口(CIN)、ActiveX和Matlab等。

动态链接库是基于Windows程序设计的一个非常重要的组成部分。

LabVIEW 开发中使用DLL,可以使代码更简洁,内存资源的使用更经济,而且可以便捷地利用仪器厂商或第三方提供的仪器控制子程序加速开发进程。

而windows平台包含有大量的API函数,这些API函数提供了大量在Windows环境下可操作的功能,它们位于Windows系统目录下的多个DLL文件中,因此在LabView中调用API 函数和DLL的方法是一致的。

在LabVIEW中,利用库函数节点可以较容易地实现对DLL的调用,从而提高了程序的开发效率。

使用调用库函数节点,可以调用Windows标准的动态连接库,也可以调用用户自己编制的DLL。

LabView中动态链接库的调用可在程序框图的函数选板中选取“调用库函数节点”来完成,该节点位于:互连接口->库和可执行程序->调用库函数节点。

将选择好的调用库函数节点图标放在程序框图中,然后通过对它的节点图标进行配置,可以指定DLL模块中与LabVIEW数据交换的相应的驱动函数。

在调用DLL时,首先要找到找到头文件(*.h)或者函数原型声明,确定你需要调用的函数,注意函数的参数是否包含了原始数据类型参数比如int,char, double,等等或者是否包含了复杂数据类型比如clusters。

LabVIEW编程中常见问题与解决方法

LabVIEW编程中常见问题与解决方法

LabVIEW编程中常见问题与解决方法LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一款广泛应用于科学与工程领域的视觉化编程环境。

它的独特之处在于,使用者可以通过拖拽和连接图形化编程元素来构建程序,而无需编写传统的文本代码。

然而,由于其特殊的编程方式和复杂的功能,LabVIEW编程过程中常常会遇到各种问题。

本文将介绍LabVIEW编程中常见问题,并提供相应的解决方法。

一、VI无法运行1. 问题描述:当尝试运行一个VI(Virtual Instrument)时,LabVIEW出现错误或者无响应。

解决方法:- 检查是否安装了适当的软件环境(如运行时引擎或特定模块)。

- 检查VI中使用的所有子VI或函数是否被正确地调用或配置。

- 检查是否有硬件设备连接问题或者相关设备驱动是否正确安装。

二、数据处理错误1. 问题描述:LabVIEW在执行数据处理操作时,产生了错误的结果或者没有得到期望的结果。

解决方法:- 检查数据的输入是否正确,并确保正确配置了对应的数据类型。

- 检查数据处理模块的参数设置,例如滤波器的截止频率或者函数的操作参数。

- 使用适当的数据结构和算法,以确保正确的数据处理过程。

- 进行调试,并通过添加数据显示或打印变量值等方式进行验证。

三、界面设计问题1. 问题描述:LabVIEW的用户界面显示效果不如期望的那样美观或者布局混乱。

解决方法:- 使用合适的面板布局工具和控件,确保界面的整洁美观。

- 使用适当的颜色和字体,以提高界面的可读性和用户体验。

- 充分利用丰富的LabVIEW组件库,添加图标、按钮和指示器等交互元素。

- 进行界面的测试和优化,以提高界面的响应速度和用户友好性。

四、性能问题1. 问题描述:LabVIEW程序在运行过程中出现了延迟、卡顿或者响应速度较慢的情况。

解决方法:- 尽量使用并行编程技术,以提高程序的性能和效率。

关于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窗口。

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

1. Why?
在实际项目中,经常会用到第三方提供的DLL(动态链接库),调用别人已经封
装好的函数来完成项目任务,但是有时候会碰到一些带指针的参 数,如 int * p;
int ** dp; 相信对部分人来说,指针还是比较让人头疼的 (包括我自己>_<...),
那如何在LabVIEW正确使用它们呢?最开始的我 也是模棱两可,凑合着用,忍
受着偶尔会出现的内存错误、无法顺利打包 exe的尴尬,故借此次项目的应用
深入摸索了一下相关内容,便有了这篇总结。

2. What?
此篇总结主要解决以下几个问题:
1. 有关DLL中一级指针参数的使用;
2. 有关DLL中二级指针参数的使用;
3. 使用GetValueByPointer.xnode导致程序打包exe运行异常的问题;

3. How?
为了说明方便,我自己用C封了几个函数,输出了一个111.dll文件用于测 试,
函数原型和定义如下图所示:
1. 一级指针
一级指针相对还是比较容易的,也比较好理解,就是内存中的地址,只是 需要
注意它的数据类型,配置时要与函数原型声明中的参数类型一致,关 于一级指
针在labview中的Call Library Function Node中还是得到了很好的 支持。以
TestFunc3函数为例。

在程序框图面板中放置Call Library Funtion Node.vi , 双击打开配置面板:
1. 选择DLL所在的路径
2. 选择要调用的函数名称
3. 选择调用约定 (这里选用C);
进入参数配置面板,函数申明中有一个形参,是unsigned char * 类型,在左
侧添加一个参数,然后Type选择数组类型(数组名称也就是首地址), 然后数
组存放的数据类型(unsigned char也就对应着这里的Unsigned 8bit Integer),
这里是一维的数组,默认的1不改,然后数组格式选用 Array Data Pointer,
并分配开辟的最小内存大小,这里设定为10,此时在 下方可以看到函数原型已
经配置成与DLL中的一样,基本上问题就不大了。
运行,结果与预期的一样。
如果内存大小没有去分配,是无法得到正确结果的,甚至会报错。将大小 改为
”,运行出错。
内存大小除了可以在配置面板中指定,还可以在程序框图中通过初始化一 个指
定长度的数组去分配大小,显然这种更加灵活,如下图所示。
2. 二级指针
也就是指针的指针,相当于是二重地址,简单理解如下图,&A表示A在内 存中
的地址,&B表示B在内存中的地址。

在内存中开辟了一块空间存放字符串A“Hello LabVIEW!”,B是个一级指 针,
存放着A的地址,通过*(&A)便可以解析出字符串A,C存放着B的 地址,通
过二重解析*(*(&B))也可以获取到字符串A。

接下来看看如何在LabVIEW中区配置这个参数类型,LabVIEW中无法直接配置二
级指针类型,但我们可以通过一级指针获取到实际数据的地址 (&A),然后通
过解析地址来获取相应的数据。
以TestFunc2函数为
例。

添加一个形参cp,类型选Numeric,数据类型选择Signed 32-bit Integer, 以
指针的形式传入。
如果以上面理解的例子来看,通过这样配置之后,cp其实保存的是B的 值,也
就是变量A的地址&A,那离我们真正想拿到的数据字符串“Hello LabVIEW!”,
还差一步地址解析。

这时候就该GetValueByPointer这个工具登场了,在此路径下可以找到,以 2012
版本为例(D:\Program Files (x86)\National Instruments\LabVIEW
2012\vi.lib\Utility\importsl\GetValueByPointer)
传入指针参数,然后指定数据类型,这里是一个字符串,便可以获取到正 确的
结果。如下图所示。

通过GetValueByPointer可以很方便的解析指针,使用也很简单。大家根据实际
的数据类型去配置即可。

关于指针的解析,LabVIEW还提供了一个间接的函数,MoveBlock函数, 这两种
的一个区别是:

MoveBlock:级别较低,控制更多,可以处理任何数据类型;

GetValueByPointer:使用简单,适应大部分数据类型,无法处理某些复杂的类
型;

从目前查看的资料来推测,MoveBlock函数应该是封装到LabVIEW中静态 库中,
调用方法如下:

打开调用库函数节点,在路径中输入“LabVIEW”;
此时函数名列表会更新出很多函数名,其中就有MoveBlock;
在参数面板,参考如下配置:
我这里配置的adress传入方式是Value,并不是Pointer to Value, 原因就是
通过直接介绍的TestFunc2的配置,返回的已经是一个Pointer了,所以这里选
择值传入。然后指定目标数据类型和大小,运行变可以获取正确的结 果“Hellow
LabVIEW!”.
3. 打包exe异常
这里打包有问题的情况主要是使用GetValueByPointer,正常打包完成后, 运
行会发现不报错,但是无法正确得到期望的结果,或者出现如下图的错误。

出现这些异常的原因就是GetValueByPointer.xonde根本没有正确执行,因 为
它调用了lvimptsl.dll中封装的GetValueByPointer函数,所以在打包的时 候,
我们要把lvimptsl.dll包含进去。

把lvimptsl.dll包含到项目中;
打包的时候,在Destinations中新建一个resource文件夹,然后始终 包含;
在Source File Settings中,把它添加到支持路径resource中;
这样打包之后,就可以正常运行了。

相关文档
最新文档