微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > LabVIEW程序设计模式(四)—状态机和事件结构的结合

LabVIEW程序设计模式(四)—状态机和事件结构的结合

时间:01-09 来源:互联网 点击:
上两节分别解决了基本状态机的第(1~5)个问题,但是是否具备一种模式能够综合队列型状态机模式和用户界面事件型模式的优点呢?这样可以同时避免基本状态机的第(1~5)个问题。答案是肯定的,本节将介绍如何将状态机与事件结构结合起来形成一种新的、稳定的模式。
状态机模式的基本构成元素是while循环和case结构,而事件结构模式的基本构成元素是while循环和event结构,因此新的模式应该由while循环、case结构和event结构组成。而while循环的目的是为了保证程序的持续运行,因此必须在最外层,这样就只剩下了图 20所示的两种组合方式。
在第一种方式中,每次循环的运行需要经过一个事件结构才能够实现case中各个分支的运行,那么到底需要多少个分支呢?一般而言不同的事件都会有不同的事件处理函数(这些函数可以在case结构中共用),显示这是无法满足要求的,它从本质上而言仍然是一种事件结构。
在第二种方式中,程序的主体是一个状态机结构,不同的是在某一个状态分子中有一个事件结构。我们可以回忆状态机模式中的“空闲Idle”状态,这正是长时间占用CPU资源的源头,如果在Idle中加入一个事件结构后就有效地规避了这个问题。


图 20 三种结构的组合方式
因此图 20中的第二种结构综合了状态机和事件结构的优点,有效地克服了基本状态机的第(1~5)个问题。此外,在例程中,按钮1USD、2USD和5USD的作用是相同的,唯一不同的是它们的代表的币值不同。如果我们希望系统共用“币值相加”这个功能,即当这三个按钮任何一个被按下后都调用同一个函数(该函数的功能是将系统中原来的货币值与新加入的币值相加得到新的值)。这样,需要有一种途径把1USD、2USD和5USD代表的币值作为参数传递给函数。
图 21所示为带参数的状态机结构,在消息队列的状态机模式中,加入了一个变体型的变量作为状态传递的参数。实际上,可以把红色的部分做成子vi,不仅节省了背面板空间而且能够进行错误处理。程序中应该设置一个专门的错误处理状态,当任何一个状态运行后如果发生错误将直接转到错误处理状态。当然,也可以在图 21的基础上做一些改进和变形,假定参数的数据类型为string型,这样就把Data参数和State合并起来,中间使用特殊符号(如@)隔开。


图 21 带参数的状态机结构

本节的例程将使用Multicolumn Listbox控件处理2维数组排序问题,前面板如图 22所示。该Listbox用于显示系统中的各种采集数据值,分为5列。程序的功能是当单击Listbox的列头时,对数据以该列的升序/降序进行排序。单击Stop按钮或×按钮则停止程序运行。



图 22 2D数组排序_前面板
系统使用状态机和事件结构相结合的模式,如图 23所示。程序分为8个状态,共有4类。各个状态的功能与消息队列型的状态机模式类似,程序加入了错误处理部分。在背面板的循环中共享同一个“错误簇”结构的移位寄存器,当存在错误时程序将暂时停止运行其它的状态而优先进入错误状态(这里是Error分支)。


图 23 2D数组排序_背面板
在Idle状态中,事件结构可以防止CPU资源的长时间占用,也可以响应各种前面板事件,如图 24所示。


图 24 状态机中的事件结构
本例中引入了4个变量以供不同的状态分支调用,如图 25所示。其中的意义如下所述。
  1. Index:当前排序的列号,表示Listbox以哪一列为依据进行排序。
  2. ASC:表示当前排序的方式,true表示升序,而false表示降序。
  3. Column Header:表示Listbox的列头数据。
  4. Data:表示Listbox的内容数据。


图 25 数据变量
在图 26中,事件结构处理的是Listbox的事件,此时只需要对内部的变量赋值即可,并且当该单击是有效单击时进入“DSort”状态进行排序操作。


图 26 排序事件
在图 27所示的DSort状态中,根据内部变量的值对Listbox赋值并更新列头的显示。


图 27 DSort状态
图 27调用了2D数组的排序函数,该函数的实现过程如图 28所示。LabVIEW并没有提供2D数组的排序方式,只提供了1D数组的排序函数。本例充分利用了LabVIEW提供的排序函数功能,当然并不是唯一的,也可以使用LabVIEW实现常用的排序算法。


图 28 2D数组排序

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top