收藏 分销(赏)

3.3--数据流运行机制中的节点教学文案.doc

上传人:精**** 文档编号:3732951 上传时间:2024-07-16 格式:DOC 页数:44 大小:1.09MB
下载 相关 举报
3.3--数据流运行机制中的节点教学文案.doc_第1页
第1页 / 共44页
3.3--数据流运行机制中的节点教学文案.doc_第2页
第2页 / 共44页
3.3--数据流运行机制中的节点教学文案.doc_第3页
第3页 / 共44页
3.3--数据流运行机制中的节点教学文案.doc_第4页
第4页 / 共44页
3.3--数据流运行机制中的节点教学文案.doc_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、3.3 数据流运行机制中的节点精品文档3.3 数据流运行机制中的节点(The data flow node in the operational mechanism)版本 8 创建于: 2010-9-30 下午8:16 作者 jwdz - 最后修改: 2010-10-29 下午8:21 作者 jwdz 前面已经介绍过图形化语言中端子、连线的基本作用和数据流运行机制下的特点。本节将介绍图形化语言中其它的节点类型基本作用和数据流运行机制下的特点。 节点包括:内置函数、内置VI和结构。 节点类似于文本编程语言中的语句、函数、和子程序。 下面我们分别进行讨论。3.3.1 内置函数的数据流运行机制3.3

2、.1.1 内置函数节点 我们之所以称LabVIEW开发环境所提供的函数为内置函数是想表明这些函数是开发环境中所特有的,并内置在开发环境中提供给图形化程序设计者使用。内置函数包含在开发 环境的程序框图中的“函数 Functions ”选项板上。它是构成图形化语言VI中最小的、最基本的可操作元素,是图形化程序执行基本操作的内部节点。 作为图形化语言中的最小可执行元素,内置函数不仅具备了最基本的函数功能如:加、减、乘、除、常数、常量等等外,同时还具备处理更复杂事物的函数功能如:数组处理、字符 串处理等等。如此众多、功能强大的内置函数保证了LabVIEW基本上具备了通用编程语言的基本特征。 内置函数图

3、标的背景颜色为浅黄色,很容易分辨。它不同于VI,它没有前面版和程序框图,只有简单的连接端口,所以我们无法查看它的内部程序代码。 下面给出进行数组操作用的一些内置函数。 图 3.3.1.1-1 数组操作内置函数 内置函数是LabVIEW图形化语言的基础内核,是从高级语言中高度抽象出来的最底层、最基础、最实用的图形化代码,是构成性能强大的虚拟仪器的基础“零部件”。内置函 数的功能越丰富对待解问题的处理能力就越强。 如果要想学习、使用好LabVIEW最重要的基础就是充分了解内置函数的基本特性和使用方法。只有这样,才能充分发挥出图形化语言的特点,设计出满足用户需求的自动化应 用程序。 对于内置函数的学

4、习,最重要的是详细解读LabVIEW Help文档,该文档中包含了每个内置函数的详细说明。对于中文版的LabVIEW,已提供了汉化的文档。与此同时,更多看其它LabVIEW开好者设计的例程,如Op enG、MGI的开源图形化代码及NI 开发者社区中LabVIEW开好者所提供的例程等等也是受益匪浅的。在这方面花费一定的时间是非常值得的。3.3.1.2 内置函数的基本特点内置函数虽然数量众多、功能不一,但存在着许多共同的特点。下面我们对这些特点进行简单的总结:基于数据流的运行机制,内置函数至少有一个以上的连接端口。对于双端以上的内置函数通常是以输入端和输出端的形式呈现 内置函数的内部是不可见的,程

5、序的设计者或使用者是不可对其进行编辑和修改 内置函数是构成VI或子VI的最基本操作元素之一 内置函数是节点中的一部分,可通过颜色辨别(图标中的背景为浅黄色) 内置函数是直接命名的 内置函数通常没有公共线程(错误簇) 有时候总会有些例外的事情发生,它的最后这个特点就存在着例外的现象,请看下面的例子:加、减、乘、除这些内置函数当它们的输入数据为波形数据时,它们会自动生成公共线 程连接端错误簇(做时域的加、减、乘、除)。参见下图。图 3.3.1.2-1 内置函数加、减、乘、除作时域运算时自动生成的错误簇 这是一个极为有趣且很有用的功能,在功率测量的项目中,利用这个特点实现了有功功率的时域乘法计算。并

6、且,这种时域相乘的方法反映出的的功率和功率因数特性也非常准确和 直观,是一个非常简单、线性度又非常好的时域乘法器(性能取决于数据采集卡),前提是必须使用同步采集模块。 千万不要小看这个特点,这里表现出一些很可贵的时域特征。 以“乘”内置函数为例,我们知道,乘法器是比较常用的模拟运算单元电路。在模拟集成电路中,集成乘法器ICAD536就很具有代表性。但是,它的四象限乘法特性很难 做到优于0.2,并且输入信号带宽很有限。 在分立元件电路中,时分割乘法器很有代表性。为获得0.02的时分割乘法器,其所付出的代价是极其昂贵的,并且输入信号带宽很有限。 采用数据采集方法,数字乘法器(用“乘”内置函数)几乎

7、没有任何局限性。它配合628x系列数据采集卡可以获得多路0.01%数字乘法器,带宽可达10KHz以上。它的 角差特性更是其它类型的乘法器所无法比拟的。实际上,采取适当的方法或合理的技术方案,采用非同步数据采集卡也是可行的,这点我们已经做过技术上的验证。 数字乘法器(数字采样技术)不仅具有准确度高使用简单的特点,同时它也从测量原理上简化了测量电路和数据分析处理方法。事实上,目前世界上高准确度的功率电能表都采用了 这一原理。本书的第一章对此有具体描述。 还有一个例外发生就是:通过函数的前景色和背景色的色彩来划分函数的方法并非是很准确的,因为我们已经发现了几个例外:比如在NI LabVIEW 201

8、0的Functions选板中ProgrammingFile I/OFile Constants 中的“Application Directory”和“Default Dada”都是vi,因为对它们双击后可以被打开,并且它们的标签是以.vi为后缀的。 参见下图。图 3.3.1.2-2 颜色并不是确定内置函数的唯一方法 人们会注意到,它们也有淡黄色的背景,但它们确是vi。这样的例子还有多少?好像真的没见过更多类似这样的情况。而前者在LabVIEW 7.1.1中就已经出现了。所以仅仅通过色彩来判定是否是内置函数可能是不准确的。尽管如此,通过颜色来区分内置函数也不失为是一种便捷的方法。3.3.1.3

9、内置函数的数据流运行机制 这里我们所说的内置函数的数据流运行机制是指它所构成的图形化代码的数据流运行机制,而非是内置函数内部的运行机制。也就是说,数据流运行机制是针对图形化程序自身的特 点,由于内置函数的内部我们无法查看到,所以它的内部运行机制我们是不得而知的(也就是说,内部不一定是基于数据流运行机制的)。 如:有些内置函数放置到程序框图上时,依据数据流的运行机制,需要对它的输入端进行赋值,否则开发环境会在即时编译之后给出有错误发生的提示,并显示“运行箭头”断裂。 参见下图。 图 3.3.1.3-1 开发环境提示:输入端没有赋值,数据流不通 点击断裂的“箭头”就会弹出错误提示列表。其实质就是数

10、据不流通,破坏了数据流的关系,从而导致程序无法运行系统给出“出现错误”的提示。 图 3.3.1.3-2 修复错误(给输入端赋值) 当你“修复”这些错误时,“运行”箭头马上恢复正常。在这里所谓“修复”错误就是给它们赋值。所以在图形化程序设计中我们几乎不必担心会遗漏什么,内置在开发环境中的即 时编辑器会帮助我们洞察这一切。这也是 LabVIEW开发环境中的一个优异性能,它会直观、明确的告诉我们不处理好这些问题甭想正确运行程序。 并不是所有的内置函数都是这样的,按下图将函数放到程序框图上时,即时编译器并没有什么反映。对于随机数发生器当然不会出现任何问题,因为它没有输入端。 图 3.3.1.3-3 对

11、于输出类的内置函数也必须接到指定的端口 对于随机数下面的内置函数,当你放到程序框图上的时候是没有问题的,可是你运行它们时系统会要求你给出指定的参数设定,否者就会弹出一个错误对话框进行提示。这表明即便 是输出类型的内置函数也必须配置连接有效的端口,这同样也是基于数据流运行机制的要求。 所以,根据Help文件仔细的配置函数的输入对象是十分必要的。由于内置函数间的对象是依赖于连线来连接的,所以内置函数间的数据流关系是比较明显的。在图形化程序设计 中一定要按数据流原则进行设计。这也是LabVIEW图形化语言必须掌握的设计原则。 最后我们来看一个例子,使用LabVIEW内置函数创建一个实用的VI。例 3

12、.3.1.3-1 计算数组的平均值(MGI) 该例子来自MGIAverage.vi。 图 3.3.1.3-4 计算数组的平均值 该实例用了四个内置函数实现了对数组平均值的计算,并以vi的形式提供给公司内部或其它使用者使用。 实际上,对于任何LabVIEW的开发者,都可以根据自己的需求利用内置函数设计专用或常用的vi,这是具有创新力和很美妙、很令人赏心悦目的工作,甚至说不定还可以为 你带来财富,如OpenG(JKI)。3.3.2 内置VI的数据流运行机制3.3.2.1 内置VI节点 在前面的例 3.3.1.3-1中,已经展示了一个使用内置函数创建VI的实例。这是由使用者所创建的VI,属于用户开发

13、的VI。 在LabVIEW开发环境中,为了降低工程师和科学家的程序设计难度、提高图形化语言的开发效率,特别提供了数千种测控专用、功能丰富、性能各异的VI。特别是一些满足 工程应用和自动化设计所需的VI。这些VI在函数选板上同样可以看到(参见下图)。它们图标的背景颜色为白色或其它颜色,可以通过颜色来区分出来。 图 3.3.2.1-1 函数选板中的内置VI 为了区别这两种不同来源的VI,将LabVIEW开发环境所提供的VI称为:内置VI(built-in VIs)。 对于内置函数我们无法看到内部结构的,而内置VI用鼠标双击后可以打开。内置VI是从许多“待解问题”中高度抽象出来的。为我们解决实际测量

14、问题提供了极大的帮助,也是 提高虚拟仪器程序设计效率的主要因素。 内置VI也是节点的一部分。通常安装好LabVIEW后在函数选板上就可以看到,但是有些内置VI,需要安装其它软件获得。如DAQ或VISA或相应的工具包等等。 我们经常看到有些初学者安装好LabVIEW后,发现找不到DAQ助手或I/O助手。实际上就是没有安装相应的驱动所致。 内置VI与我们所创建的VI不同,由于内置VI来自于LabVIEW开发环境中的底层库,所以建议使用者轻易不要对它进行改动后保存,避免其它使用者找不到原来的VI。 若需要改动请另创建一个新的子VI或使用新的名字,保存到使用者库中。3.3.2.2 内置VI的基本特点

15、内置VI虽然数量众多、功能不一,但存在着许多共同的特点。下面我们对这些特点进行简单的总结:内置VI来自于LabVIEW开发环境,是由NI公司设计、开发的 内置VI有自己独特的前面版、程序框图和图标、连接器 内置VI的内部构成具有多样性 关于最后一点,所指的是内置VI内部代码的多样性。下面我们来看看。由内置函数构成的内置VI 该内置VI在ProgrammingSignal ProcessingWaveform GenerationSine Waveform.vi。 图 3.3.2.2-1 由内置函数构成的内置VI(LabVIEW2010) 从上图我们可以清楚的看出该内置VI完全是由内置函数等图形

16、化代码构成。应该说是纯图形化代码的。 有意思的是,在LabVIEW2009中,该vi是与上图中的vi不同的,参见下图。 图 3.3.2.2-1A 由内置函数构成的内置VI(LabVIEW2009) 不同之处在于在LabVIEW2009中,波形合成后是直接输出的。而在LabVIEW2010中,波形经过一个“in place element structure”内置函数进行了数据存储的优化。由此可见,对于内置函数NI也是在不断地进行优化处理,尽管这是一个一直用于各个版本、比较传统的内置函数。2. 由属性节点构成的内置VI 该内置VI在ProgrammingInstrumen I/OSerialVI

17、SA Configure Serial Port.vi。 图 3.3.2.2-2 由属性节点构成的内置VI3. 由公式节点构成的内置VI 该内置VI在ProgrammingNumericScalingConvert RTD Reading.vi。 图 3.3.2.2-3 由公式节点构成的内置VI4. 由动态链接库(CLN)节点构成的内置VI 该内置VI在ProgrammingSignal ProcessingSignal GenerationSine Pattern.vi。 图 3.3.2.2-4 由动态链接库(CLN)节点构成的内置VI5. 由CIN节点构成的内置VI在Mac版的LabVIE

18、W2009中还可以看到CIN节点,而在Mac版的LabVIEW2010中,已经看不到CIN节点了。想必已经被CLN所代替了。6. 由LabVIEW Scripting 节点构成的内置VI 现在LabVIEW Scripting已经添加到LabVIEW2010中。可是在刚刚安装完Mac版的LabVIEW2010时并没有看到LabVIEW Scripting的内置函数。当时感觉很奇怪,但当时也没有多想。直到安装OpenG工具包时,需要设置VI Server时才发现,选择其中的选项既可看到LabVIEW Scripting的内置函数。 在LabVIEW开发环境下,选择ToolsOptionVI Se

19、rver即可看到下图所示的界面。勾选VI Scripting中的选项即可。 图 3.3.2.2-6 在VI Server中设定LabVIEW Scripting VI Scripting是LabVIEW中一项非常重要和强大的功能。简而言之,就是使用LabVIEW图形化编程语言来创建LabVIEW中的程序元素。这些程序元素当然 包含一般的node, wire, structure等等。有个不太恰当的比方,比如众所周知,Eclipse是一套开发Java程序语言的工具,但是Eclipse本身也是用Java编写的,也就意味 着在使用Java开发Java。VI Scripting也类似,我们可以用Lab

20、VIEW开发LabVIEW。 一种比较准确的定义是:VI Scripting是LabVIEW提供的一种基于VI Server技术,让用户创建、修改以及了解VI信息的强大功能。使用VI Scripting可以得到VI的属性和行为,此外,我们还可以用VI Scripting改变VI的属性和行为。VI Scripting包含了一个接受指令的引擎,这些指令可以通过VI Server得到翻译,用来传给LabVIEW本身。VI中的所有东西都可以被认为是一种VI对象(object),包括FP/BD上的任何对象、 Connect Panel、Icon以及几乎所有保存在VI中信息。所有对VI对象的修改都可以在编

21、辑时期利用Property Node和Invoke Node完成。比如,VI接线柱的位置、颜色、接线情况都可以在编辑时期得到或修改。 下图是LabVIEW爱好者使用VI Scripting技术设计的vi。其中包括了我们现在使用的绝大多数内置函数。 图 3.3.2.2-7 Scripting vi 工具包 下面我们看一个具体的例子,就是使用VI Scripting技术实现的“加法”函数的程序框图。显然使用VI Scripting 技术来实现“加法”功能是复杂得多!尽管如此,由于VI Scripting技术还是受到LabVIEW爱好者的钟爱。如:Scripting vi 工具包就是由LabVIEW

22、爱好者设计的,它来自LVAV网站。 图 3.3.2.2-8 采用VI Scripting技术实现的“加法”函数这里尽可能的整理出各种样式的内置VI来展示。显而易见,构成VI的方式很多,至于采用哪种方式设计VI,最终取决于你的习惯和熟悉程度。 这里还要提醒注意的是:在程序设计中要尽可能的使用内置vi,以减少节点的数量近而提高程序的运行效率。 我们还注意到,在LabVIEW编程样式一书中作者定义出了一个模块化指标的计算公式。 公式 1.1 模块化(用户VI数节点总数)x100 作者给出了如何确定“用户VI和节点总数“的具体方法,并推荐模块化指标大于3.0的设计。并在试例中称模块化指标为1.9%的程

23、序不算做一个模块。 至于公式 1.1如何得来或者是如何确定,作者没有做任何说明。3.3.2.3 内置VI的数据流运行机制 现在我们已经看到了内置VI的多种构成方式,可以直观的理解为除了CLN和CIN外其它内置VI都应该是基于数据流的运行机制,因为它们基本上都是由图形化代码实现的。 到目前为止,我们还不能充分理解图形化代码的数据流运行机制。这是因为还有一些图形化代码我们还没有完整解读,如:结构节点。 下面我们将开始介绍这部分的内容。3.3.3 结构的数据流运行机制我们知道,基于文本的编程语言的程序流程的控制是基于流程控制语句。流程控制语句选择和判断并决定程序当前的执行顺序。 对于任何计算机编程语

24、言来讲,流程控制语句的基本功能都是重叠的,只是语法功能上存在着一些差异。LabVIEW也不利外,它也具备控制程序流程的基本功能,但它是用图 形化代码来表述的,而这些实现控制程序流程的图形化代码被称为:结构节点。3.3.3.1 结构节点 在VI中,结构被用来控制图形化程序的执行顺序。由于图形化代码是基于数据流的,所以结构也会满足数据流运行机制的要求。 事实上,在LabVIEW诞生之初,图形化的结构代码就已经被创建,Kodosky为此还申请了两个美国专利。 结构节点在函数选板ProgrammingStructions,参见下图。 图 3.3.3.1-1 函数选板上的结构节点 从上图中可以看出,结构

25、子选板中包含了许多特殊的结构节点,如循环、事件等,它们被用来处理不同的程序控制流程。也可以说:灵活、正确的使用它们是实现图形化程序设计的 关键点之一。3.3.3.2 结构节点的基本特点 结构是是现代结构化语言的基本功能,图形化的结构节点基本上满足了对结构要求的基本功能。但同时它还保留着自身图形化代码包括数据流运行机制的一些特点,这在学习使用时 要给以必要的注意。1、结构节点内外都可以放置图形化代码 下图中的结构节点都是以可伸缩的方框图形呈现在程序框图中的,它们的内部和外部都可以放置图形化代码(公式节点仅外部可以放置图形化代码)。图 3.3.3.2-1 方框的外部和内部都可以放置图形化代码 图形

26、化结构节点的这个特点太好了,它可以直观的了解结构内部程序代码的确切含义(大量的代码还可以用子vi化简)。 注意:图形化语言具有自动多线程功能,随意放置代码可能会导致程序的不正常运行。2、变量本身破坏了数据流运行机制 前面我们谈到过,控件本身不可以直接作为变量来使用。但是通过设置本地变量或全局变量控件也可以作为变量来使用。由于图形化代码是基于数据流的运行机制,而变量的不恰当 使用恰好破坏了数据流的运行机制,主要问题涉及到数据竞争的问题。所以,会有更多的说法强调在LabVIEW中慎用变量。这是在使用中需要格外注意的地方。这里给出一个例 子来简要说明。例 3.3.3.2-1 全局变量引起的数据竞争

27、假设我们有A、B、C、3个While循环在同时运行(它们也可能不在同一个VI中),其中两个循环都试图将不同的值写入一个全局变量,而另外一个循环恰好同时正在试图 读取这个全局变量中的值。问题是:C循环到底读出的是那个值呢?到底是A循环的值,还是B循环的值呢? 图 3.3.3.2-2 引起全局变量竞争的例子 请注意,这是一个十分不确定的状态。此时出现了全局变量的数据竞争,如果你连续运行这个vi,就会发现,Numeric 3指示器会不断闪动出现 Numeric控件和 Numeric 2控件中的不同数值。 在程序设计中,要避免这种事情发生。最好的办法就是经过对全局变量初始化后,仅在一个地方写入全局变量

28、,然后完全可以在不同的地方同时读这个全局变量。 顺便说一下,尽管使用局部变量或全局变量可以实现基于文本中变量的功能。但是相比之下,图形化代码会使用更多的内存空间。这也是图形化语言的特点之一。参见下图会看得更 清楚。图 3.3.3.2-3 变量的内存分配(注意那些小黑点)3.3.3.3 结构节点的数据流运行机制 既然图形化语言的运行机制是基于数据流的,那么结构节点的外特性(内特性我们不得而知)也应该是基于数据流的运行机制。下面我们就对结构节点的数据流特性进行讨论。1、定序结构 我们知道,文本式编程语言的基本运行机制是基于控制流的。换句话说,程序的运行是基于程序的书写步骤,基本上是按顺序执行的(这

29、里暂不考虑控制语句的作用)。 LabVIEW是基于数据流编程的图形化语言,图形化代码无法直接做到这一点。但是程序的运行有时往往必须要作顺序执行,如在仪器控制程序中或需要测量一段程序代码的执 行时间。为解决此类问题,LabVIEW提供了独特的定序结构节点。 定序结构节点共有两种,平铺顺序节点(Flat Sequence structure)和层叠顺序节点(Stacket Sequence structure)。平铺顺序结构参见下图。图 3.3.3.3-1 平铺顺序结构(Flat Sequence structure)用于代码执行时间测试 这种平铺顺序结构把程序运行分成一帧一帧的执行,从而实现了数

30、据流程序的强制定序运行。这种平铺顺序结构的数据流特点被人们称为:强制数据流关系。 平铺顺序结构的优点是:程序代码直观、清晰且便于理解。 问题是:当程序的定序代码较多时,依据图形化的特点,必然占据巨大的屏幕空间从而导致程序的可读性下降。 解决这个问题的简单办法是:使用LabVIEW提供的另一种定序结构节点层叠顺序节点(Stacket Sequence structure)。 创建层叠顺序很简单,用右键点击图 3.3.3.3-1中平铺顺序的边框,从弹出的下拉菜单中选择:Replace with Stacket structure即可。参见下图。图 3.3.3.3-2 层叠顺序结构(从图 3.3.3

31、.3-1直接转换过来)右上图可见,层叠顺序结构将图 3.3.3.3-1中平铺的3帧层叠的放置起来。呈现给我们的只有1帧(00.2)。如果展开看见下图。 第0帧 第1帧 第3帧 图 3.3.3.3-24 层叠结构展开图 叠层顺序结构似乎只有一个优点,程序结构简单、清晰(程序内容并不清晰)、占用屏幕空间小。 叠层顺序结构的缺点可是不少:隐藏了程序的某些部分 因为是叠层顺序结构,所以通常我们只能看到一帧的程序框图内容,从而降低了程序的直观性和可读性。 平铺式顺序结构没有这个问题。 注意:Case结构也存在相同的问题。影响从左到右的可视流习惯 因为是叠层顺序结构,所以我们不得不象扫描一样来回查找程序框

32、图中的对应关系。 平铺式顺序结构没有这个问题。数据流中断,破坏了数据流所倡导的并行性 LabVIEW天生就具备并行的特点,使用叠层顺序结构禁止了并行操作,因为只有当程序全部执行完后,数据才能输出。 关于这个概念LabVIEW Help中给出了这样一个例子,不可更新顺序结构的多个帧的显示控件,如下例图所示。 图 3.3.3.3-5 层叠结构的错误应用 某个用于测试应用程序的VI含有一个状态显示控件,用于显示测试过程中当前测试的名称。如果每个测试都是从不同帧调用的子VI,则不能从每一帧中更新该显示控件。层叠式 顺序结构中断开的连线便说明了这一点。由于层叠式顺序结构中的所有帧都在任何数据输出该结构之

33、前执行,因此只能由其中某一帧将值传递给状态显示控件。 解决这个问题可以采用While循环加Case结构,见下面的例图。 图 3.3.3.3-6 使用Case结构和While循环就可以解决这个问题 这个例子也说明,尽管Case结构和层叠顺序结构在程序框图上都相近(叠放在一起),但是二者间还是存在着本质上不同的。顺序结构局部变量可能导致程序的可读性进一步下降甚至发生错误 顺序结构局部变量用来传递帧之间的数据,而且是有的帧使用,有的帧不使用,使得程序可读性下降。 平铺式顺序结构没有这个问题。 上面列举了顺序结构的一些缺点,正是因为这些缺点以至于好多有关LabVIEW的书籍都发出了这样的警句“慎用顺序

34、结构”。 其实顺序结构挺好的,在出现了平铺顺序结构后,上面所罗列的它的缺点基本上荡然无存。 现在计算机的屏幕分辨率基本上是1280x800,高的已达到1920x1080(高清标准),相比那时800x600已经大很多了,特别是导航条、格式刷等新操作功能 的出现,使用顺序结构并不会产生太大的问题。 另外要记住LabVIEW是层次化结构的,我们还可以将其作为子vi来使用。或者干脆采用平铺式顺序结构来设计,然后转换程层叠顺序结构(点击右键在快捷菜单中选择转换 )。 现在是改变传统观念的时候了,需要的地方就放心的使用平铺式顺序结构吧! 顺便说一下,顺序结构不消耗系统资源。关于这一点,在LabVIEW图形

35、编程一书中作者页曾经谈到过:顺序结构本身不增加节点或者执行程序的系统开销。 在定序程序的程序设计中,最好的方法我还是倾向于状态机的使用。关于状态机的介绍后面会谈到。2、循环结构节点 任何程序语言都基本离不开循环处理。LabVIEW也不例外,它提供了两种图形化的循环结构节点。一种定量循环(8.5以后也可以使用条件控制)For循环;一种是 条件循环While循环。下面分别介绍。For循环 For循环可以控制程序在循环体内重复执行的次数,具体循环次数由循环体边框外的计数端子的数值来确定。在LabVIEW8.5之前,For循环没有条件停止功能。现在 已经增添了这个功能。 For循环的数据流运行机制是:

36、首先执行循环体外的代码,并纪录准备进入循环体的所有数据值。然后For循环在执行前首先检查计数端子的数值是否设置正确,并根据这个数 值决定执行循环体的次数。要注意这个数值是长整数值,不符合这个规定的将会自动转换到长整数值。 这里我们仅举例讨论容易忽略的某些细节问题。例 3.3.3.3-1 For 循环不运行图 3.3.3.3-7 计数端子的数值0,循环不执行 另外一个For 不执行的例子是输入数组为空数组时,参见下图。图 3.3.3.3-8 输入数组为空时,循环不执行,与计数端子的数值无关 此时如果将数组赋值,循环将会执行。参见下图。图 3.3.3.3-9 为输入数组赋值,循环执行对话呈现,循环

37、次数与计数端子数值有关例 3.3.3.3-2 应用For循环的例子 该例子来自于NI Developer Community的Dan_K提供的例子。图 3.3.3.3-10 Simple Progress Bar for a For Loop 图 3.3.3.3-11 Progress Bar运行图例例 3.3.3.3-3 应用For循环自动索引数组 For循环具有自动索引数组的功能。参见下图。图 3.3.3.3-12 利用For循环自动索引数组,数组大小取决于计数端子的数值图 3.3.3.3-13 数组索引进取最小个数的数组(5),与计数端子值无关 图 3.3.3.3-14 For 循环应用

38、实例 这是我的一个简单的测量应用项目中的部分程序框图。用For循环实现6个虚拟通道的创建,在多通道测量时采用这种方法可以使得程序框图简单、直观、可读性强。例 3.3.3.3-4 For循环的条件停止 现在For循环的条件也可以有条件的停止。参见下图。图 3.3.3.3-15 根据条件确定运行次数(注意上面的小红点)尽管计数端值是100例 3.3.3.3-5 使用For循环提取3D数组的数据 LabVIEW中有一些内置VI来对一维和二维数组进行操作。但是没有任何一个可对三维数组进行操作的内置VI。这是因为我们可以使用这些内置VI来对三维数组进行操作 。下面这个例子显示了使用这些内置VI实现对3D

39、数组的操作。该VI是多态的,因此它可以处理双精度,布尔量或字符串。 该vi在图像数据处理中很有用。 该例子同样来自于NI Developer Community,作者是:ScottW 图 3.3.3.3-16 3D数组的操作 上图中的子vi,如下图所示。 图 3.3.3.3-17 子vi程序代码While循环 While循环也是通用程序语言中必不可少的控制语句。在LabVIEW中它也是必不可少的程序控制结构。 相对于For循环而言,While循环的使用率更高。可以说,几乎在绝大部分程序中都可以发现它的存在。如:事件结构、状态机、连续数据采集等等。 While循环结构的数据流关系是这样的。在程序

40、执行时,首先执行循环的外部代码(如果存在)然后执行循环体内的程序代码,执行完毕后查看条件端子的布尔值,如果该数值 为T,退出;如果该值为F,继续进行循环,直到再次查看到条件端的值为T时才停止循环。下面我们看几个简单的例子来更多的了解While循环。例 3.3.3.3-6 While循环的几个例子1、While循环仅运行1次图 3.3.3.3-18 While循环仅运行1次 上图所示的While循环,程序仅仅运行1次便停止下来。程序的运行结果 x+1指示器显示的数值为1。下图所示的例子与此相同,差别是条件端标识不同。图 3.3.3.3-19 While循环也仅运行1次 在LabVIEW图形编程一书中,许多例子用这种形式的地方很多。实际上,在这两个图中有没有这个While循环都一样,程序的运行和结果都是一致的。那这个Whi le循环到底有什么用呢?猜想是为了使程序代码放置的更规范、更清晰。所付出的代价是多了个结构和2个节点。2、合理的控制While循环运行 如果我们将停止控制开关放在While循环的外部会发生什么现象呢?我们来看下面这个例子。图 3.3.3.3-20 这个While循环如何运行? 通过实际运行,我们会看到While循环要么执行一次(开关T),要么就无限期执行下去(开关F)。 这里再次展现了数据流的概念,因为依据数据流的工作原理,所有输入到While循环的数

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服