Menu:

第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来使用。或者干脆采用平铺式顺序结构来设计,然后转换程层叠顺序结构(点击右键在快捷菜单中选择转换)。
      别忘了,顺序结构不增加节点,不消耗系统资源。
      现在是改变传统观念的时候了,需要的地方就放心的使用平铺式顺序结构吧!