第5章 控制程序流(2)
定序和数据流
所谓“定序”就是强制程序按一定的顺序关系执行。在LabVIEW图形化编程语言中,可以采取以下几种方法实现程序的“定序”功能。
定序和数据流之一:顺序结构(Sequence structure)
从LabVIEW7开始我们就看到了两种顺序结构,叠层顺序结构和单层(平铺)顺序结构。在LabVIEW8.0中,我们就已经看到了带有定时的单层(平铺)顺序结构。
好多书中都使用了“单层”顺序结构叫法(包括LabVIEW大学实用教程),而NI的帮助文件中的叫法为“平铺”顺序结构,为了表述的一致性,所以这里还是采用NI的帮助文件中的叫法:平铺顺序结构。
而在大师写作此书时,仅有上面第一个图片所展示的叠层顺序结构。所以书中所涉及的内容都是有关叠层顺序结构的。
叠层顺序结构似乎只有一个优点,程序结构简单、清晰(程序内容并不清晰)、占用屏幕空间小。
其实它还有一个优点就是大师在书中谈到的:叠层顺序结构本身不增加节点或者执行程序的系统开销。关于这一点,csxcs_366先生在它的博客(与非网)中已经探讨过,平铺顺序结构并不增加节点开销。
叠层顺序结构的缺点可是不少:
1、隐藏了程序的某些部分
因为是叠层顺序结构,所以通常我们只能看到一帧的程序框图内容,从而降低了程序的直观性和可读性。
平铺式顺序结构没有这个问题。
注意:Case结构也存在相同的问题。
2、影响从左到右的可视流
因为是叠层顺序结构,所以我们不得不象扫描一样来回查找程序框图中的对应关系。
平铺式顺序结构没有这个问题。
3、数据流中断,破坏了数据流所倡导的并行性
LabVIEW天生就具备并行的特点,使用叠层顺序结构禁止了并行操作,因为只有当程序全部执行完后,数据才能输出。
关于这个概念LabVIEW Help中给出了这样一个例子,不可更新顺序结构的多个帧的显示控件,如下例图所示。
某个用于测试应用程序的VI含有一个状态显示控件,用于显示测试过程中当前测试的名称。如果每个测试都是从不同帧调用的子VI,则不能从每一帧中更新该显示控件。层叠式顺序结构中断开的连线便说明了这一点。由于层叠式顺序结构中的所有帧都在任何数据输出该结构之前执行,因此只能由其中某一帧将值传递给状态显示控件。
解决这个问题可以采用While循环加Case结构,见下面的例图。
使用Case结构和While循环就可以解决这个问题。这个例子也说明,尽管Case结构和层叠顺序结构在程序框图上都相近(叠放在一起),但是二者间还是存在着本质上不同的。
4、顺序结构局部变量可能导致程序的可读性进一步下降甚至发生错误
顺序结构局部变量用来传递帧之间的数据,而且是有的帧使用,有的帧不使用,使得程序可读性下降。
平铺式顺序结构没有这个问题。
其实顺序结构挺好的
上面列举了顺序结构的一些缺点,正是因为这些缺点以至于好多有关LabVIEW的书籍都发出了这样的警句“慎用顺序结构”。
其实顺序结构挺好的,在出现了平铺顺序结构后,上面所罗列的它的缺点基本上荡然无存(除了第3点之外)。
现在计算机的屏幕分辨率基本上是1280x800,高的已达到1920x1080(高清标准),相比那时800x600已经大很多了,特别是导航条、格式刷等新操作功能的出现,使用顺序结构并不会产生太大的问题。
另外要记住LabVIEW是层次化结构的,我们还可以将其作为子vi来使用。或者干脆采用平铺式顺序结构来设计,然后转换程层叠顺序结构(点击右键在快捷菜单中选择转换)。
别忘了,顺序结构不增加节点,不消耗系统资源。
现在是改变传统观念的时候了,需要的地方就放心的使用平铺式顺序结构吧!