在状态区分明显的应用程序中可采用状态机。每一个状态都会导致另一个或多个状态,或者结束处理流程。状态机通过计算用户输入和内部状态来决定下一状态。许多应用程序都需要一个初始状态,后面接着一个默认状态,以执行各种不同的操作。具体执行什么操作要依据以前和当前的输入及状态。停止状态通常用来执行清除操作。
图8-7 标准状态机设计模式
状态机常用来创建用户界面。用户界面中,不同的用户操作会让用户界面进入不同的处理程序段。每一个处理程序段都相当于状态机里的一个状态。每一个处理程序段都会引起下一步的处理或者等待另一个用户操作。该例中,状态机持续监控用户下一个将采取的操作。
过程测试是状态机设计模型的另一个常见应用。过程测试中,一个状态表示程序中的一段。根据每一个状态的测试结果,相应地调用不同的状态。这个过程可不断地执行,从而对整个过程有一个彻底、全面的分析。
使用状态机的好处是一旦创建了状态转移图,就可以简单地创建出LabVIEW VI。
1.状态机基本结构
将状态转移图转化为LabVIEW程序框图需要以下基本结构。
①While循环,不断地执行各个状态。
②条件结构,包括对应于每一个状态的条件分支和执行代码。
③移位寄存器,包括状态转移信息。
④状态功能代码,实现状态的功能。
⑤状态转换代码,判定下一个状态。
图8-8显示了LabVIEW中实现温度数据采集系统的状态机的基本结构。
状态转移图的流程由While循环实现。每一个状态对应于条件结构中的每一个条件分支。While循环上的移位寄存器保存当前状态,并将当前状态传递给条件结构的输入。
图8-8 LabVIEW状态机的基本结构
1—While循环;2—移位寄存器;3—条件结构
2.控制状态机
控制状态机的初始化和状态转换的最佳方法是使用枚举型输入控件。枚举型输入控件在状态机中被广泛用作条件选择器。但是,如果用户从枚举型输入控件添加或删除状态时,原本与这个枚举型输入控件的副本相连接的连线就断开了。这是使用枚举型输入控件实现状态机的最主要的缺点之一。该问题的解决办法之一是可以自定义枚举型输入控件。创建一个自定义类型的枚举型输入控件,使得添加或删除状态时所有的枚举型输入控件副本自动更新。
3.状态转换状态机
有多种方法可以控制状态机执行条件结构的哪一个条件分支。选择一种与状态机功能性和复杂度最匹配的方法。
状态机中最常用、最简单的实现状态转移的方法是使用单个条件结构的转换代码,它可实现在任意状态间转换状态。这种方法最适用于扩展性强、可读性强、维护性强的状态机结构。在某些特定情况下,可使用其他方法。
4.默认转换
使用默认转换时无须用代码判定下一状态,因为下一状态只有一种可能性,如图8-9所示。
图8-9 显示了一个使用默认转换的温度数据采集系统的设计模型
5.两个状态之间的转换
下面的方法用于判定两个状态之间的转换。有许多模型可用于判定两个状态之间的转换。图8-10显示了一个用选择函数完成两个状态之间转换的范例。
图8-10 选择函数转换代码
该方法非常适用于状态转换只可能发生在两个状态之间的情况。但是,该方法限制了应用程序的可扩展性。如需修改状态使其可在多于两个状态之间转换,这种方法将完全失效,这将导致不得不对转换代码做出非常大的改动。
6.两个或更多个状态之间的转换
使用以下方法可创建一个状态转换的更易于扩展的结构,即条件结构,用条件结构代替选择函数完成转换代码。图8-11显示了一个用条件结构完成转换的温度数据采集系统。
图8-11 条件结构转换代码
使用条件结构的一个优点是代码的可读性强,易于理解。因为条件结构中的每一个条件分支都对应于枚举型输入控件中的某一项,这就使得代码易于阅读和理解。条件结构也易于扩展。当应用要求增加时,可通过为条件结构添加更多的条件分支来为某一特定的状态添加更多的转换。使用条件结构的一个缺点是所有的代码不是同时可见的。条件结构的自身特性决定了转换代码的全部功能不可能一目了然。
转换数组,在需要同时可见比条件结构时,能显示更多的代码,可为转换代码中可能发生的所有转换创建一个转换数组。
图8-12显示了一个用转换数组完成转换的温度数据采集系统。
该例中,判定代码为下一状态提供了索引。例如,如果代码下一步需跳至“错误处理”状态,判决代码就输出数字1到索引函数的索引输入端。该设计模型增强了转换代码的可扩展性和可读性。该设计模型的一个缺点是开发转换代码时必须使用警告,因为该数组的索引是从零开始的。
图8-12 转换数组转换代码
状态图工具包是另一个用于实现转换代码的设计模型,同时也用于NILabVIEW状态图工具包。该模型使用一个较大条件结构对应每一个状态,较小的While循环结构不断地循环以转换状态直到发生合适的状态转换。
图8-13显示了一个用LabVIEW状态图工具包完成转换的温度数据采集系统。
图8-13 状态图工具包状态机
LabVIEW状态图工具包为LabVIEW添加了一个状态图编辑器函数,直观地描绘应用程序的逻辑。创建这种直观的逻辑表达之后,状态图编辑器依此生成应用程序最基本的LabVIEW代码。
LabVIEW状态图工具包不包括在LabVIEW专业版开发系统中,它需要单独购买。
状态图工具包的状态机必须满足以下条件。
①必须指定一个默认转换。
②默认转换的优先权必须最低。
③默认转换的条件值必须一直为True。可以将一个布尔常量连接到默认转换的条件输出上。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。