数据流运行机制中的节点.docx
- 文档编号:10505417
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:47
- 大小:929.91KB
数据流运行机制中的节点.docx
《数据流运行机制中的节点.docx》由会员分享,可在线阅读,更多相关《数据流运行机制中的节点.docx(47页珍藏版)》请在冰点文库上搜索。
数据流运行机制中的节点
3.3 数据流运行机制中的节点(Thedataflownodeintheoperationalmechanism)
版本8
创建于:
2010-9-30下午8:
16作者jwdz-最后修改:
2010-10-29下午8:
21作者jwdz
前面已经介绍过图形化语言中端子、连线的基本作用和数据流运行机制下的特点。
本节将介绍图形化语言中其它的节点类型基本作用和数据流运行机制下的特点。
节点包括:
内置函数、内置VI和结构。
节点类似于文本编程语言中的语句、函数、和子程序。
下面我们分别进行讨论。
3.3.1 内置函数的数据流运行机制
3.3.1.1内置函数节点
我们之所以称LabVIEW开发环境所提供的函数为内置函数是想表明这些函数是开发环境中所特有的,并内置在开发环境中提供给图形化程序设计者使用。
内置函数包含在开发环境的程序框图中的“函数Functions”选项板上。
它是构成图形化语言VI中最小的、最基本的可操作元素,是图形化程序执行基本操作的内部节点。
作为图形化语言中的最小可执行元素,内置函数不仅具备了最基本的函数功能如:
加、减、乘、除、常数、常量等等外,同时还具备处理更复杂事物的函数功能如:
数组处理、字符串处理等等。
如此众多、功能强大的内置函数保证了LabVIEW基本上具备了通用编程语言的基本特征。
内置函数图标的背景颜色为浅黄色,很容易分辨。
它不同于VI,它没有前面版和程序框图,只有简单的连接端口,所以我们无法查看它的内部程序代码。
下面给出进行数组操作用的一些内置函数。
图3.3.1.1-1数组操作内置函数
内置函数是LabVIEW图形化语言的基础内核,是从高级语言中高度抽象出来的最底层、最基础、最实用的图形化代码,是构成性能强大的虚拟仪器的基础“零部件”。
内置函数的功能越丰富对待解问题的处理能力就越强。
如果要想学习、使用好LabVIEW最重要的基础就是充分了解内置函数的基本特性和使用方法。
只有这样,才能充分发挥出图形化语言的特点,设计出满足用户需求的自动化应用程序。
对于内置函数的学习,最重要的是详细解读LabVIEWHelp文档,该文档中包含了每个内置函数的详细说明。
对于中文版的LabVIEW,已提供了汉化的文档。
与此同时,更多看其它LabVIEW开好者设计的例程,如OpenG、MGI的开源图形化代码及NI开发者社区中LabVIEW开好者所提供的例程等等也是受益匪浅的。
在这方面花费一定的时间是非常值得的。
3.3.1.2内置函数的基本特点
内置函数虽然数量众多、功能不一,但存在着许多共同的特点。
下面我们对这些特点进行简单的总结:
基于数据流的运行机制,内置函数至少有一个以上的连接端口。
对于双端以上的内置函数通常是以输入端和输出端的形式呈现
内置函数的内部是不可见的,程序的设计者或使用者是不可对其进行编辑和修改
内置函数是构成VI或子VI的最基本操作元素之一
内置函数是节点中的一部分,可通过颜色辨别(图标中的背景为浅黄色)
内置函数是直接命名的
内置函数通常没有公共线程(错误簇)
有时候总会有些例外的事情发生,它的最后这个特点就存在着例外的现象,请看下面的例子:
加、减、乘、除这些内置函数当它们的输入数据为波形数据时,它们会自动生成公共线程连接端——错误簇(做时域的加、减、乘、除)。
参见下图。
图3.3.1.2-1内置函数加、减、乘、除作时域运算时自动生成的错误簇
这是一个极为有趣且很有用的功能,在功率测量的项目中,利用这个特点实现了有功功率的时域乘法计算。
并且,这种时域相乘的方法反映出的的功率和功率因数特性也非常准确和直观,是一个非常简单、线性度又非常好的时域乘法器(性能取决于数据采集卡),前提是必须使用同步采集模块。
千万不要小看这个特点,这里表现出一些很可贵的时域特征。
以“乘”内置函数为例,我们知道,乘法器是比较常用的模拟运算单元电路。
在模拟集成电路中,集成乘法器IC——AD536就很具有代表性。
但是,它的四象限乘法特性很难做到优于0.2%,并且输入信号带宽很有限。
在分立元件电路中,时分割乘法器很有代表性。
为获得0.02%的时分割乘法器,其所付出的代价是极其昂贵的,并且输入信号带宽很有限。
采用数据采集方法,数字乘法器(用“乘”内置函数)几乎没有任何局限性。
它配合628x系列数据采集卡可以获得多路0.01%数字乘法器,带宽可达10KHz以上。
它的角差特性更是其它类型的乘法器所无法比拟的。
实际上,采取适当的方法或合理的技术方案,采用非同步数据采集卡也是可行的,这点我们已经做过技术上的验证。
数字乘法器(数字采样技术)不仅具有准确度高使用简单的特点,同时它也从测量原理上简化了测量电路和数据分析处理方法。
事实上,目前世界上高准确度的功率电能表都采用了这一原理。
本书的第一章对此有具体描述。
还有一个例外发生就是:
通过函数的前景色和背景色的色彩来划分函数的方法并非是很准确的,因为我们已经发现了几个例外:
比如在NILabVIEW2010的Functions选板中》Programming》》中的“ApplicationDirectory”和“DefaultDada”都是vi,因为对它们双击后可以被打开,并且它们的标签是以.vi为后缀的。
参见下图。
图3.3.1.2-2颜色并不是确定内置函数的唯一方法
人们会注意到,它们也有淡黄色的背景,但它们确是vi。
这样的例子还有多少?
好像真的没见过更多类似这样的情况。
而前者在LabVIEW7.1.1中就已经出现了。
所以仅仅通过色彩来判定是否是内置函数可能是不准确的。
尽管如此,通过颜色来区分内置函数也不失为是一种便捷的方法。
3.3.1.3内置函数的数据流运行机制
这里我们所说的内置函数的数据流运行机制是指它所构成的图形化代码的数据流运行机制,而非是内置函数内部的运行机制。
也就是说,数据流运行机制是针对图形化程序自身的特点,由于内置函数的内部我们无法查看到,所以它的内部运行机制我们是不得而知的(也就是说,内部不一定是基于数据流运行机制的)。
如:
有些内置函数放置到程序框图上时,依据数据流的运行机制,需要对它的输入端进行赋值,否则开发环境会在即时编译之后给出有错误发生的提示,并显示“运行箭头”断裂。
参见下图。
图3.3.1.3-1开发环境提示:
输入端没有赋值,数据流不通
点击断裂的“箭头”就会弹出错误提示列表。
其实质就是数据不流通,破坏了数据流的关系,从而导致程序无法运行系统给出“出现错误”的提示。
图3.3.1.3-2修复错误(给输入端赋值)
当你“修复”这些错误时,“运行”箭头马上恢复正常。
在这里所谓“修复”错误就是给它们赋值。
所以在图形化程序设计中我们几乎不必担心会遗漏什么,内置在开发环境中的即时编辑器会帮助我们洞察这一切。
这也是LabVIEW开发环境中的一个优异性能,它会直观、明确的告诉我们不处理好这些问题甭想正确运行程序。
并不是所有的内置函数都是这样的,按下图将函数放到程序框图上时,即时编译器并没有什么反映。
对于随机数发生器当然不会出现任何问题,因为它没有输入端。
图3.3.1.3-3对于输出类的内置函数也必须接到指定的端口
对于随机数下面的内置函数,当你放到程序框图上的时候是没有问题的,可是你运行它们时系统会要求你给出指定的参数设定,否者就会弹出一个错误对话框进行提示。
这表明即便是输出类型的内置函数也必须配置连接有效的端口,这同样也是基于数据流运行机制的要求。
所以,根据Help文件仔细的配置函数的输入对象是十分必要的。
由于内置函数间的对象是依赖于连线来连接的,所以内置函数间的数据流关系是比较明显的。
在图形化程序设计中一定要按数据流原则进行设计。
这也是LabVIEW图形化语言必须掌握的设计原则。
最后我们来看一个例子,使用LabVIEW内置函数创建一个实用的VI。
例3.3.1.3-1计算数组的平均值(MGI)
该例子来自MGI——Average.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,属于用户开发的VI。
在LabVIEW开发环境中,为了降低工程师和科学家的程序设计难度、提高图形化语言的开发效率,特别提供了数千种测控专用、功能丰富、性能各异的VI。
特别是一些满足工程应用和自动化设计所需的VI。
这些VI在函数选板上同样可以看到(参见下图)。
它们图标的背景颜色为白色或其它颜色,可以通过颜色来区分出来。
图3.3.2.1-1函数选板中的内置VI
为了区别这两种不同来源的VI,将LabVIEW开发环境所提供的VI称为:
内置VI(built-inVIs)。
对于内置函数我们无法看到内部结构的,而内置VI用鼠标双击后可以打开。
内置VI是从许多“待解问题”中高度抽象出来的。
为我们解决实际测量问题提供了极大的帮助,也是提高虚拟仪器程序设计效率的主要因素。
内置VI也是节点的一部分。
通常安装好LabVIEW后在函数选板上就可以看到,但是有些内置VI,需要安装其它软件获得。
如DAQ或VISA或相应的工具包等等。
我们经常看到有些初学者安装好LabVIEW后,发现找不到DAQ助手或I/O助手。
实际上就是没有安装相应的驱动所致。
内置VI与我们所创建的VI不同,由于内置VI来自于LabVIEW开发环境中的底层库,所以建议使用者轻易不要对它进行改动后保存,避免其它使用者找不到原来的VI。
若需要改动请另创建一个新的子VI或使用新的名字,保存到使用者库中。
3.3.2.2内置VI的基本特点
内置VI虽然数量众多、功能不一,但存在着许多共同的特点。
下面我们对这些特点进行简单的总结:
内置VI来自于LabVIEW开发环境,是由NI公司设计、开发的
内置VI有自己独特的前面版、程序框图和图标、连接器
内置VI的内部构成具有多样性
关于最后一点,所指的是内置VI内部代码的多样性。
下面我们来看看。
由内置函数构成的内置VI
该内置VI在》Programming》SignalProcessing》WaveformGeneration》SineWaveform.vi。
图3.3.2.2-1由内置函数构成的内置VI(LabVIEW2010)
从上图我们可以清楚的看出该内置VI完全是由内置函数等图形化代码构成。
应该说是纯图形化代码的。
有意思的是,在LabVIEW2009中,该vi是与上图中的vi不同的,参见下图。
图3.3.2.2-1A由内置函数构成的内置VI(LabVIEW2009)
不同之处在于在LabVIEW2009中,波形合成后是直接输出的。
而在LabVIEW2010中,波形经过一个“inplaceelementstructure”内置函数进行了数据存储的优化。
由此可见,对于内置函数NI也是在不断地进行优化处理,尽管这是一个一直用于各个版本、比较传统的内置函数。
2. 由属性节点构成的内置VI
该内置VI在》Programming》InstrumenI/O》Serial》VISAConfigureSerialPort.vi。
图3.3.2.2-2由属性节点构成的内置VI
3. 由公式节点构成的内置VI
该内置VI在》Programming》Numeric》Scaling》ConvertRTDReading.vi。
图3.3.2.2-3由公式节点构成的内置VI
4. 由动态链接库(CLN)节点构成的内置VI
该内置VI在》Programming》SignalProcessing》SignalGeneration》SinePattern.vi。
图3.3.2.2-4由动态链接库(CLN)节点构成的内置VI
5. 由CIN节点构成的内置VI
在Mac版的LabVIEW2009中还可以看到CIN节点,而在Mac版的LabVIEW2010中,已经看不到CIN节点了。
想必已经被CLN所代替了。
6. 由LabVIEWScripting节点构成的内置VI
现在LabVIEWScripting已经添加到LabVIEW2010中。
可是在刚刚安装完Mac版的LabVIEW2010时并没有看到LabVIEWScripting的内置函数。
当时感觉很奇怪,但当时也没有多想。
直到安装OpenG工具包时,需要设置VIServer时才发现,选择其中的选项既可看到LabVIEWScripting的内置函数。
在LabVIEW开发环境下,选择》Tools》Option》VIServer即可看到下图所示的界面。
勾选VIScripting中的选项即可。
图3.3.2.2-6在VIServer中设定LabVIEWScripting
VIScripting是LabVIEW中一项非常重要和强大的功能。
简而言之,就是使用LabVIEW图形化编程语言来创建LabVIEW中的程序元素。
这些程序元素当然包含一般的node,wire,structure等等。
有个不太恰当的比方,比如众所周知,Eclipse是一套开发Java程序语言的工具,但是Eclipse本身也是用Java编写的,也就意味着在使用Java开发Java。
VIScripting也类似,我们可以用LabVIEW开发LabVIEW。
一种比较准确的定义是:
VIScripting是LabVIEW提供的一种基于VIServer技术,让用户创建、修改以及了解VI信息的强大功能。
使用VIScripting可以得到VI的属性和行为,此外,我们还可以用VIScripting改变VI的属性和行为。
VIScripting包含了一个接受指令的引擎,这些指令可以通过VIServer得到翻译,用来传给LabVIEW本身。
VI中的所有东西都可以被认为是一种VI对象(object),包括FP/BD上的任何对象、ConnectPanel、Icon以及几乎所有保存在VI中信息。
所有对VI对象的修改都可以在编辑时期利用PropertyNode和InvokeNode完成。
比如,VI接线柱的位置、颜色、接线情况都可以在编辑时期得到或修改。
下图是LabVIEW爱好者使用VIScripting技术设计的vi。
其中包括了我们现在使用的绝大多数内置函数。
图3.3.2.2-7Scriptingvi工具包
下面我们看一个具体的例子,就是使用VIScripting技术实现的“加法”函数的程序框图。
显然使用VIScripting技术来实现“加法”功能是复杂得多!
尽管如此,由于VIScripting技术还是受到LabVIEW爱好者的钟爱。
如:
Scriptingvi工具包就是由LabVIEW爱好者设计的,它来自LVAV网站。
图3.3.2.2-8采用VIScripting技术实现的“加法”函数
这里尽可能的整理出各种样式的内置VI来展示。
显而易见,构成VI的方式很多,至于采用哪种方式设计VI,最终取决于你的习惯和熟悉程度。
这里还要提醒注意的是:
在程序设计中要尽可能的使用内置vi,以减少节点的数量近而提高程序的运行效率。
我们还注意到,在《LabVIEW编程样式》一书中作者定义出了一个模块化指标的计算公式。
公式1.1
模块化=(用户VI数/节点总数)x100
作者给出了如何确定“用户VI和节点总数“的具体方法,并推荐模块化指标大于3.0的设计。
并在试例中称模块化指标为1.9%的程序不算做一个模块。
至于公式1.1如何得来或者是如何确定,作者没有做任何说明。
3.3.2.3内置VI的数据流运行机制
现在我们已经看到了内置VI的多种构成方式,可以直观的理解为除了CLN和CIN外其它内置VI都应该是基于数据流的运行机制,因为它们基本上都是由图形化代码实现的。
到目前为止,我们还不能充分理解图形化代码的数据流运行机制。
这是因为还有一些图形化代码我们还没有完整解读,如:
结构节点。
下面我们将开始介绍这部分的内容。
3.3.3 结构的数据流运行机制
我们知道,基于文本的编程语言的程序流程的控制是基于流程控制语句。
流程控制语句选择和判断并决定程序当前的执行顺序。
对于任何计算机编程语言来讲,流程控制语句的基本功能都是重叠的,只是语法功能上存在着一些差异。
LabVIEW也不利外,它也具备控制程序流程的基本功能,但它是用图形化代码来表述的,而这些实现控制程序流程的图形化代码被称为:
结构节点。
3.3.3.1 结构节点
在VI中,结构被用来控制图形化程序的执行顺序。
由于图形化代码是基于数据流的,所以结构也会满足数据流运行机制的要求。
事实上,在LabVIEW诞生之初,图形化的结构代码就已经被创建,Kodosky为此还申请了两个美国专利。
结构节点在函数选板》Programming》Structions,参见下图。
图3.3.3.1-1函数选板上的结构节点
从上图中可以看出,结构子选板中包含了许多特殊的结构节点,如循环、事件等,它们被用来处理不同的程序控制流程。
也可以说:
灵活、正确的使用它们是实现图形化程序设计的关键点之一。
3.3.3.2 结构节点的基本特点
结构是是现代结构化语言的基本功能,图形化的结构节点基本上满足了对结构要求的基本功能。
但同时它还保留着自身图形化代码包括数据流运行机制的一些特点,这在学习使用时要给以必要的注意。
1、结构节点内外都可以放置图形化代码
下图中的结构节点都是以可伸缩的方框图形呈现在程序框图中的,它们的内部和外部都可以放置图形化代码(公式节点仅外部可以放置图形化代码)。
图3.3.3.2-1方框的外部和内部都可以放置图形化代码
图形化结构节点的这个特点太好了,它可以直观的了解结构内部程序代码的确切含义(大量的代码还可以用子vi化简)。
注意:
图形化语言具有自动多线程功能,随意放置代码可能会导致程序的不正常运行。
2、变量本身破坏了数据流运行机制
前面我们谈到过,控件本身不可以直接作为变量来使用。
但是通过设置本地变量或全局变量控件也可以作为变量来使用。
由于图形化代码是基于数据流的运行机制,而变量的不恰当使用恰好破坏了数据流的运行机制,主要问题涉及到数据竞争的问题。
所以,会有更多的说法强调在LabVIEW中慎用变量。
这是在使用中需要格外注意的地方。
这里给出一个例子来简要说明。
例3.3.3.2-1全局变量引起的数据竞争
假设我们有A、B、C、3个While循环在同时运行(它们也可能不在同一个VI中),其中两个循环都试图将不同的值写入一个全局变量,而另外一个循环恰好同时正在试图读取这个全局变量中的值。
问题是:
C循环到底读出的是那个值呢?
到底是A循环的值,还是B循环的值呢?
图3.3.3.2-2引起全局变量竞争的例子
请注意,这是一个十分不确定的状态。
此时出现了全局变量的数据竞争,如果你连续运行这个vi,就会发现,Numeric3指示器会不断闪动出现Numeric控件和Numeric2控件中的不同数值。
在程序设计中,要避免这种事情发生。
最好的办法就是经过对全局变量初始化后,仅在一个地方写入全局变量,然后完全可以在不同的地方同时读这个全局变量。
顺便说一下,尽管使用局部变量或全局变量可以实现基于文本中变量的功能。
但是相比之下,图形化代码会使用更多的内存空间。
这也是图形化语言的特点之一。
参见下图会看得更清楚。
图3.3.3.2-3变量的内存分配(注意那些小黑点)
3.3.3.3 结构节点的数据流运行机制
既然图形化语言的运行机制是基于数据流的,那么结构节点的外特性(内特性我们不得而知)也应该是基于数据流的运行机制。
下面我们就对结构节点的数据流特性进行讨论。
1、定序结构
我们知道,文本式编程语言的基本运行机制是基于控制流的。
换句话说,程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据流 运行机制 中的 节点