0

关于投票
VI的动态调用
 根据个人学习和理解来谈谈:VI的动态调用问题。这仅仅是个人学习LabVIEW的一些体会和初浅的认识,难免会有许多概念或认识上的错误,欢迎大家指正。这里还是要感谢那些尽心尽力帮助过我的NI公司 AE们(应用工程师)。

—— 一切随缘

基本概念

    众所周知,LabVIEW程序又称虚拟仪器,即VI

VI由以下三部分构成:

·前面板——即用户界面。

·程序框图——包含用于定义VI功能的图形化源代码。

·图标和连线板——用以识别VI的接口,以便在创建VI时调用另一个VI。当一个vi可以应用在其它VI中,则称为子vi。子vi相当于文本编程语言中的子程序。

    在进行LabVIEW程序设计时,一个VI中可以包含一个或若干个子vi。这些子vi是被直接放置在程序框图中,习惯上称这些子vi为:静态链接子vi。这些子viVI载入的同时也被加载到内存中。

动态调用VI

    在应用程序设计时,我们希望能够自由地、任意切换操作界面和测量程序界面,并且希望在任何时候,前面板上仅运行一个程序界面。这样就能够保证良好地、准确地实现“人机对话”。完成这样的操作,就需要动态的调用不同的VI

    与静态链接的子vi不同,动态加载VI只有在打开VI引用时VI的调用程序才会将其加载。如果VI调用程序较大,采用动态加载VI的方式可以节省加载时间和内存,这是因为在调用程序需要运行该VI以前无需将其加载,在操作结束后又可将其从内存中释放。

    问题是:在涉及到动态调用的LabVIEW帮助文件中,看到了这样的概念:“严格类型VI”。那么与此相对应一定还存在着:“非严格类型VI”。似乎将VI分成了两种不同的形式?到底“什么是严格类型VI和非严格类型VI”?它们有什么内在联系和不同以及区别呢?

    前几天我还和NIAE讨论这个问题,就是:“什么是严格类型vi和非严格类型VI”?但一直没有得到明确的答复。察看一些LabVIEW的资料,也没有弄明白这个问题。直到开始写这篇博客时,因涉及到这个概念,才开始对这个问题进行了仔细的分析,分析的结果似乎找到了一些答案。

严格类型vi

    严格类型vi就是可以被其它VI调用的子vi(静态链接子vi)。进一步说LabVIEW提供的“函数”选板上的 vi都是严格类型vi。严格类型的vi能够和其它VI通过连接板的定义与其它VI进行直接的数据交换,既可以独立运行也可以作为子vi被调用,作为子vi调用时通常不打开前面板。 

非严格类型VI

    非严格类型VI是不能作为子vi来使用的,因为我们没有对它进行类型定义(除非你将它定义为严格类型vi)。非严格类型VI通常是一个独立的VI(或者称为:例程),它不能和其它VI进行直接的数据交换(可以通过全局变量来传递数据),可以独立作为一个程序运行,通常在导入时就将前面板打开。 

    二者的本质区别就是:是否准确地定义了“连线板”。

     为了能够更清楚地说明这个概念,我们通过LabVIEW提供的一个例程,来进一步说明这个问题。该例程可以通过“NI范例查找器”在路径为:硬件输入输出/DAQmx/模拟测量/Acq&Graph Voltage-Int Clk.VI下获得。它的程序框图见下图。

图1 Acq&Graph Voltage-Int Clk.VI的程序框图

    从图1可看到一个“Acq&Graph Voltage-Int Clk.VI”,它本身是由它所包含的6个子vi组成。它到底是什么类型的VI呢?从它的“连线板”看到它的确没有进行过任何定义,应该是非严格类型VI。参见下图。

2 非严格类型VI的“连线板”图

    我们以图1中的第一个子VIDAQmx Create Channel (AI-Voltage-Basic).vi的“连接板”为例,可以看出它是个严格类型VI。参见下图。

3 严格类型VI的“连线板”图

    因为存在非严格类型VI和严格类型vi,所以在进行动态调用时其调用方式也应该有所不同。下面分别列出它们的动态调用方式。

非严格类型VI的动态调用的方式

    假如程序设计要求先后分别动态调用三个VI,它们被存放在项目中的某个文件夹中,名子分别为:

A.VI(打包时的主VI);

B.VI

C.VI

    我们希望程序运行时首先运行A.VI(比如进行:欢迎界面、板卡验证、软件合法性验证等操作),待正确执行完成这些操作后,关闭A.VI,调用运行B.VI(可以是实际的应用程序)然后关闭B.VI,动态打开C.VI(测量结果保存等),关闭C.VI程序停止运行。并保证前面板上仅运行一个程序界面(实际上内存中也是仅保留一个VI,用LabVIEW提供的Memory Monitor.Vi可以清楚地看到这点)。

    这个示例程序有些像接力赛,A-B-C

    当然这三个VI也可以是严格类型vi,但这里的动态调用方式是针对非严格类型VI的。下面给出每个VI的程序框图。

注意:这里将动态调用程序设计成为一个子VI(动态调用1.VI

4 A.VI的程序框图

5 B.VI的程序框图

6 C.VI的程序框图

7 动态调用1VI的程序代码


4、图5、图6的程序都比较简单,大家一看就清楚,无需多说。这里重点谈谈图7的程序代码和编程思路。

Case结构选择LabVIEW推荐的子VI形式,点击“文件”/新建/带错误处理的子VI

下面以运行A.VI,关闭A.VI,动态调用运行B.VI这个过程来对程序代码加以进一步说明(动态调用的本质就是利用VI的“属性节点”和“调用节点”来实现的) :

7的上半部分是利用“属性节点”和“调用节点”对A.VI进行控制;图7的下半部分是利用“属性节点”和“调用节点”对B.VI进行控制。错误簇是它们的“公共线程”。

VI引用句柄:由于A.VI已经载入内存,所以使用“本VI”(也就是A.VI)的引用”见图4

属性节点FP.State根据A.VI的引用,确定A.VI的前面板状态,这里是:“Hidden”

打开VI的引用:根据B.VI的路径和文件名,打开B.VI的引用,此时载入B.VI程序。

调用节点FP.Open根据B.VI的引用, 确定B.VI的前面板状态,设定参数见图7

调用节点Run VI根据B.VI的引用, 确定B.VI开始运行,参数:不必等待运行结束和不自动关闭引用。

关闭引用:已完成B.VI的动态调用,关闭B.VI的引用。

调用节点FP.Close根据A.VI的引用,关闭A.VI的前面板(A.VI退出内存)。

关闭引用:关闭A.VI的引用。整个动态调用过程结束,只有B.VI运行。

上面的描述是依据“公共线程”(数据流)的。 

在程序设计中还有另一种动态调用的方式:A-B-A

也就是说:程序先运行A,然后动态调用B,直到B执行完毕,再返回程序A

程序框图见下图:

8 动态调用2VI的程序代码

关于图7与图8的区别,有兴趣的自己进行分析、理解吧。

9 动态调用12VI的前面板图

 

严格类型VI的动态调用的方式

我看到许多书的例子都是严格类型VI的调用,这里也就不再说的更多了,仅以LabVIEW帮助文件中的一个实例来表明。查看LabVIEW帮助文件中的:“引用节点调用和严格类型VI引用句柄调用”。

假如:有一个严格类型的“频率响应.vi”,其动态调用程序框图见下图。

10 严格类型VI引用句柄调用实例

 

注意:不论对VI的调用还是对节点的调用,在引用打开后,必须销毁(关闭),防止内存泄露。

VI的动态调用为程序设计提供了灵活的设计方法,这仅是我常用设计方法,供大家参考。

http://labview7i.blog.sohu.com/82683098.html

系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(146) | 回复(0)

3

关于投票
LabVIEW的核心要素——数据流
学习过LabVIEW的朋友都知道:LabVIEW是一个图形化软件开发环境,它所使用的编程语言是G语言,也称为图形化编程语言。由于LabVIEWG语言中开发的比较早、且开发的最成功的,所以人们还是习惯上用LabVIEW来指代G语言。当然,还有其它的G语言,比如像Agilent VEE等。

    传统文本编程语言根据指令的先后顺序决定应用程序执行顺序,也称为:“控制流”;而LabVIEW则按照“数据流”的模式运行VI。所谓数据流也就是说:当所有的输入端都具备了必要的输入数据时,程序框图节点将运行。节点在运行时产生输出数据并将该数据传送给数据流路径中的下一个节点。数据流经节点的动作决定了程序框图上VI和函数的执行顺序。

    使用LabVIEW进行编程则必须按数据流的方式进行程序设计。所以,养成良好的数据流编程习惯是非常必要的。那么根据数据流的特点,编程时要注意哪些问题呢?

1、根据自然的数据的依赖关系,从左向右进行程序设计

1数据依赖关系

    图1 可以清晰的表明数据流是依据数据依赖关系从左向右流动的。“差”只有在“和”完成后才能得到;以此类推,“积”必须在“差”完成后获得;而“商”也必须在得到“积”后获得。所以,这里是利用数据依赖关系实现数据流的。

    图1中的下图比较好的呈现出数据流的关系,所以我们称之为“好的习惯”,建议大家习惯用这种方式来进行程序设计。

    2 是一个数据采集任务设计的实例(良好的数据流概念)。

2 数据采集任务设计

我们上面谈到利用数据依赖关系很容易满足数据流的要求(自然的数据依赖关系)。那么,当数据依赖关系不存在或不明显时,怎么办?

2、 利用强制数据依赖关系之一:顺序结构

    如果我们想要知道一个vi的运行时间可以通过下面的实例程序进行测试,程序如图3所示。这     里我们利用强制数据依赖关系“顺序结构”来满足数据流的要求。这里待测vi我们用一个“等   待”函数来代替。
3强制人工数据依赖关系“顺序结构”

顺序结构确保:第一帧:开始计时,第二帧:运行“等待”函数或待测vi,第三帧:停止计时并显示结果。

这里要注意两点:

第一:Windows操作系统的定时精度为:1mS。所以,测量结果会出现100±1mS

第二:如果vi的运行时间很短小于1mS,可在第二帧内的vi外面加个N次的for循环增加运行时间。然后,在结果中再除个N

现在,我们用“等待下一个整数倍毫秒”(定时选板)函数来替代“等待”函数,运行后会发生什么情况?这应该对理解这两个函数的不同会有所帮助。

3、  利用人工数据依赖关系之二:错误簇

2中各个函数之间的错误簇连接就实现了利用人工数据依赖关系,与上面连接的任务I/O起的作用是一致的(它们应该成对出现)。有关“错误簇”的机制和数据流的作用,敬请看我的另一篇博客:LabVIEW中的“错误机制

4、  利用人工数据依赖关系之三:引用句柄

对于引用句柄LabVIEW的帮助文档是这样介绍的:引用句柄可作为对象(例如,文件、设备或网络连接)的唯一标识。可使用不同类型的引用句柄控件将引用句柄输入或输出VI

 由于引用句柄是一个打开对象的临时指针,因此它仅在对象打开期间有效。如关闭对象,LabVIEW会将引用句柄与对象分开,引用句柄随即失效。如再次打开对象,LabVIEW将创建一个与第一个引用句柄不同的新引用句柄。LabVIEW将为引用句柄指向的对象分配内存空间。关闭引用句柄,该对象就会从内存中释放。

由于LabVIEW可以记住每个引用句柄所指的信息,如读取或写入的对象的当前地址和用户访问情况,因此可以对单一对象执行并行但相互独立的操作。如一个VI多次打开同一个对象,那么每次的打开操作都将返回一个不同的引用句柄。VI结束运行时LabVIEW会自动关闭引用句柄,如果用户在结束使用引用句柄时就立即将其关闭,可最有效地利用内存空间和其它资源,这是一个良好的编程习惯。关闭引用句柄的顺序与打开时相反。例如,如果获得了对象A的一个引用句柄,然后对对象A调用方法使获得对象B的引用句柄,请先关闭对象B的引用句柄然后再关闭对象A的引用句柄。
4引用句柄的几个示例

关于引用句柄我们要注意的是:“引用句柄”是有“生命周期“的。从我们打开引用句柄开始,它就进入新的“生命周期”,直道关闭“引用句柄”后它的“生命周期”结束。如果一个引用句柄的生命周期无限长,那么就意味着发生了“内存泄露”。所以使用时必须注意“打开”与“关闭”必须是成双成对出现的。

    对于本地变量和全局变量来讲,因无法保证数据按数据流的方式工作,所以要尽量避免大量使用。由于顺序结构是强制数据流也尽量甚用。

    上面我们分别介绍了实现或确保数据流编程的几个方法,供大家参考,希望对大家能有一定的帮助。

http://labview7i.blog.sohu.com/81747558.html

系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(230) | 回复(2)

0

关于投票
便携式多通道应力、应变的测量方案

应用NI的虚拟仪器技术实现了被测物理量为载荷重力或拉力的现场测试和计量。有关应变测量的基本工作原理请参考下面的链接:

http://zone.ni.com/devzone/cda/tut/p/id/3642

http://zone.ni.com/devzone/cda/tut/p/id/4176

便携式多通道应力、应变测量仪的原理方框图见图1

                            1便携式多通道应力、应变测量仪的原理方框图

现场便携式测量有些特殊的要求:

1、  环境温度:0-55C 

2、  抗振动、抗冲击、电磁兼容性好

3、  体积小、重量轻、携带方便

4、  尽可能的简化供电电源、信号调理等单元

5、  可实现多通道、动态测试分析

6、  测量数据自动记录、分析、保存

NI公司的C系列模块NI 9219NI 9237基本可满足上述要求。


           图2 NI 9219多功能四通道测量模块、NI 9237四通道应变测量模块

这两种模块各自有不同的特点:

NI 9219适合于静态应力、应变的测量。它本身是一个多功能测量模块。

NI 9237适合于动态应力、应变的测量。应变、应力测量专用模块。

二者在应用于应变和应力测量的不同之处,请看下面的链接:在应变测试中使用NI 9237比使用NI 9219的优势在哪里?

实际上,图2所示的仅为两种可进行应变、应力测量模块,但是这两个模块是不能单独使用的,必须与NI的其它部件相配合才能实现便携式应变、应力测量。根据实际测量的需要基本上可以有三种方案可供选择。

第一种:用于CompactRIO嵌入式实时系统平台

   NI CompactRIO 是一种小巧而坚固的工业化控制和采集系统,采用可重新配置I/O (reconfigurable I/O,缩写为RIO) FPGA技术实现超高性能和可自定义功能。NI CompactRIO包含一个实时控制器与可重新配置的FPGA芯片,适用于可靠的独立嵌入式或分布式应用系统;还包含热插拔工业I/O模块,内置可直接和传感器/调节器连接的信号调理。因为CompactRIO 具有低成本开放性架构,用户可以轻松访问到底层的硬件设备。而且,CompactRIO嵌入式系统可以使用高效的LabVIEW 图形化编程工具进行快速开发。利用NI CompactRIO,您可以快速建立嵌入式控制和采集系统,而且该系统的工作性能和优化特性可与专门定制设计的硬件电路媲美。有关更详细的介绍请看:NI CompactRIO技术白皮书


3用于CompactRIO嵌入式实时系统平台


第二种:用于cDAQ测量系统平台(USB接口)

    NI CompactDAQ硬件为各种传感器提供了简单方便的即插即用USB连接,以及工作台、现场和生产线上的电子测量方案。NI CompactDAQ集易用性、低价位和模块化仪器的灵活性等优点于一身,在精小便携、简单易用、低价位的系统中实现快速精确的测量应用。有关更详细的内容请看:NI CompactDAQ概述

4用于cDAQ测量系统平台(USB接口)

第三种:基于USB接口的测量模块

         NI为扩展C系列模块的应用,提供了一种USB接口的扩展盒NI USB-9162USBNI USB-9162 C系列单模块外盒,为NI C系列模块,提供了低通道数、低价位且极为便携的解决方案。除独立应用之外,用户能够将NI USB-9162部署为适用于更大系统的调试设备。详细介绍请见:NI USB C系列模块外盒(NI USB-9162

5 USB接口的扩展盒NI USB-9162

6 NI USB9162NI 9237结合构成NI USB-9237

关于NI USB-9237的介绍请见:NI USB-9237电桥和应变测量模块

考虑到便携式测量的要求,结合将来动态测量应力、应变的需求,最终的实施方案我们选择了NI USB-9237

有关测试软件的设计方法,将在今后陆续发表,敬请关注。目前可参考我的另一篇博客:通过LabVIEW的”查找范例”提高程序设计能力

http://labview7i.blog.sohu.com/81622640.html

系统分类: 测试测量
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(151) | 回复(0)

0

关于投票
通过LabVIEW的”查找范例”提高程序设计能力

在使用LabVIEW设计数据采集项目时,往往由于缺乏对测量方法(原理)的了解及对专用测量版卡的生疏,感到无从下手。

比如,用压、拉力传感器做现场的压、拉力测量,硬件我们选择使用cDAQ 9172 配置NI 9237。NI 9237的基本性能参见下面的链接。

http://sine.ni.com/nips/cds/view/p/lang/zhs/nid/202632

应用程序设计中可以使用以下方法之一:

  1. 使用DAQ助手
  2. 使用Single Express
  3. 使用DAQmx

实际上,但大多数设计方案还是基于DAQmx,那么如何使用DAQmx进行设计呢?最好、最快的解决方法是利用NI提供的“范例查找”功能。因为NI所提供的范例是经过验证的,所以不会引入设计方法上的错误。根据NI提供的例程,作适当的修改就可以设计出满足我们需求的简单、迅捷、可靠实用程序。具体做法如下:

启动LabVIEW可以在“资源”栏目中,看到图1-1所示的启动界面。在该界面的下方可以看到红椭圆所包含的“查找范例”。

图1-1LabVIEW启动界面

用鼠标点击“查找范例”,从“硬件输入输出〉DAQmx>模拟测量〉应变〉……可以看到许多例程,如图1-2所示。

图1-2查找例程

在图1-2的左下角,我们看到一个控件上显示“未选择硬件”,也就是说这些例程是支持DAQmx的,对于支持NI 9237的有哪些例程,我们可以通过硬件选择来进行过滤,查找到适合我们使用的例程。

首先,按图1-2所示,点击右下角的“设置”按键后,呈现出图1-3所示的界面.

图1-3 硬件设置

第一步,选择“硬件”Tab并调节选项查找到“NI 9237”;

第二步,点击右方向箭头,可看到NI 9237 显示在"查找范例所需的设备"下,参见图1-4所示.

第三步,点击图1-4所示的“确定”按键

图1-4 硬件确定

并在左下角的“硬件”中选择“NI 9237”,在“结果仅包含硬件”中挑勾选中该项设定。即可在图1-5 中看到支持NI 9237的例程。

 图1-5 支持NI9237的例程

 最后按设计需求,修改该例程,完成设计,采用这种方法程序代码的利用率可高达80%以上

http://labview7i.blog.sohu.com/77245033.html

系统分类: 虚拟仪器
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(43) | 回复(0)

0

关于投票
电子基础知识回顾 误老师说贴片电阻
电子基础知识回顾 误老师说贴片电阻
 
  全文在 http://www.rd3721.com/tech/info1241.html


电阻应该是应用最为普及的一种电子元件了,也可能是最简单的元件。以电阻为题,还真很难写出东西来。这里随便聊聊,主要针对的是消费电子产品中常见的常规贴片电阻,那种传统的色环电阻以及特殊应用电阻,不在此讨论范围内。
电阻常识电阻的标称值厂家电阻产品的标识的电阻值,称之为标称值,大概有这么两层意思:一是表示这个值是在厂家约定的测试条件下(比如室温条件)下测试出来的电阻值。(换句话说,测试条件变更了,电阻值则可能变化)二是表示这只电阻是对应的国际机构组织规定的某约定电阻值。厂家不可能生产任意阻值的电阻,只可能生产国际机构定义的若干阻值的电阻。
EIA CODEEIA(电子工业协会)对电阻元件的规格进行了详细的定义。其中对电阻标称值及其误差范围定义了7个类别:E3    E6     E12   E24     E48     E96     E192   其中目前最常用的是E12 系列 E24系列.   (见图1
电阻标称值采用的计数法:E12E24命名法则中,电阻标称值采用的是三位计数法: abcAbc表示的电阻值是 a x 10 + bx 10^c  比如470表示的是47 x 10^0 = 47 ohm, 而不是470ohm  472 表示的是 47 x 10^2 = 4700 ohm= 4.7kohm

对于4.7ohm这样的电阻值,小数点不便书写,且不易引起注意,产生误会,通用的做法是用4R7这样的符号来表示。

 点击看大图                       1  E12 E24 电阻规则电阻的封装与功率贴片电阻的封装常用其长宽外形尺寸来表示,但实际应用中,有的产品封装以公制表示,有时用英制表示,造成了一定的混乱。        1inch=1000mil=25.4mm        1mm=40mil英制 (EIA)     mil   公制(IEC)  mm0402  (40mil x 20mil)      1005  (1.0mm x 0.5mm)0603  (60mil x 30mil)      1608  (1.6mm x 0.8mm)0805  (80mil x 50mil)      2012  (2.0mm x 1.2mm)1206 32161210   3225

常用电阻外形封装尺寸的英制与公制对照表

               实际应用中应牢记常用的封装类型数据及对应关系,确定封装参数使用的是英制还是公制。电阻所能承受的最大功率与其封装外形(散热面积)以及材料特性有关,而与其电阻值无关。电阻功耗超过其允许的最大值后,可能导致电阻烧毁。目前常用的0402电阻最大允许功耗为1/16 W,  0603封装电阻最大允许功耗为1/10W,  0805封装电阻最大允许功耗可以做到1/4W。这个数据在电阻规格书中可以查到。
电阻的温度系数电阻器的阻值随温度变化而变化,这是电阻材料特性决定的客观事实。而电阻温度系数就精确的反映了电阻值随温度变化的规律,单位为ohm/℃。即温度每变化1,电阻值变化多少ohm电阻值随温度升高而增大的电阻具有正温度系数,反之则为负温度系数。通常的电阻都是负温度系数的产品。由于温度变化1时,绝对电阻值变化很小,因此通常的电阻温度系数以ppm/℃为单位。ppm (part per million)意为百万分之一。常用贴片电阻的温度系数为100ppm/℃左右。
电阻的精度误差电阻的误差指电阻器的实际阻值与标称阻值的差异。常用电阻的精度都控制在5%(误差等级用J表示)以内,一些特殊材质的电阻可控制在1%以内。对于电阻排,几个电阻是一次性生产的,所以阻值的相对误差很小,可以控制在1%以内。
电阻与电阻器  电阻: 反映阻碍电流能力大小的理想电子模型。  电阻器: 电阻的物理实现,实际的电子元件。通常的所说的电阻应该称之为电阻器,但简称为电阻,它并不是一个理想的电阻。当工作频率在100MHZ以内时,可以等效为一个纯阻;但当工作频率在100MHZ以上时,就要考虑其高频特性(主要表现为感性),特别是在RF电路应用中。  
电阻选择的原则计算/估算 阻值和功耗   计算(估算)所需电阻的阻值,计算电阻器消耗的可能功耗,要留有一定裕量。根据阻值和功耗选择合适的系列和封装  根据算出的阻值,选择最接近的标称值电阻;根据功耗需求,选择合适的封装。尽量选择常用,公用的电阻不同类型的电阻能提供的阻值范围和功耗以及封装是不一样的。要尽量选择常用的,低成本的或者BOM中公用的电阻。比如对于一些对阻值不敏感的应用场合,如上拉或下拉电阻,可以选取BOM中已有的电阻,以降低BOM中的元件种类。以上描述的是通常应用场合的电阻选择,如果确认该应用场合有特别需求,比如低温度系数、高精度、高频特性好,则应该以满足这些特别需求为啥哦要目的。