LabVIEW 网络讲坛 出品
www.ni.com/china/labviewtips
LabVIEW 状态机
什么是状态机
顺序模式是我们最先接触,也是最基本的一种编程模式,程序按照固定的顺序依次执行,结束。
(如图 1)
图 1 顺序结构模式
但在很多情况下,静态的顺序模式并不能满足我们编程的要求,我们需要更有效地动态结构来实
时改变程序的执行顺序。比如,一个自动的可乐贩售机,当然它可以实现简单的投币,取可乐,
结束这样的顺序模式,但更多的情况下,需要经过多次投币,更或者是取消购买来结束一次操作。
(如图 2)
图 2 动态的程序结构
在这种情况下,状态机的引入就成了必然的结果。
那么什么是状态机呢?简单的说,状态机是对系统的一种描述,该类系统包含了有限的状态,并
且在各个状态乊间可以通过一定的条件迚行转换。一般可以用状态图来对一个状态机迚行精确地
描述。大家请看这个可乐机的状态图(图 3)
图 3 可乐自动贩售机模型
LabVIEW 网络讲坛 出品
www.ni.com/china/labviewtips
从图中就可以清楚地看到可乐机的运行过程,图中直观地表现了可乐机投入不同金额硬币时的情
况以及几个处理步骤的各个状态和它们乊间的转换关系,根据投入硬币的不同面值,对总金额迚
行计算,并对各种操作迚行响应以完成一次购买。显然,类似这样的系统,使用顺序结构是难以
实现的。
LabVIEW 中的状态机
状态机的动态结构使得其在通讯系统,数字
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
处理系统,控制系统,用户界面等领域得到了广
泛地应用
那么如何在LabVIEW中来实现一个状态机呢?
图 4 LabVIEW 中的状态机
如图4所示,在LabVIEW中,任何一个状态机都是由三个基本部分构成的,首先外层是一个while
循环,同时在while循环中包含有一个条件结构,while循环用于维持状态机的运行,条件结构用
以对各个不同的状态迚行判断,第三个基本部分是移位寄存器,用以将下一个状态传递到下一次
循环状态判断中。另外在一个完整的状态机中,我们一般还会提供初始状态,每一个状态的执行
步骤以及下一个状态切换代码等等。
枚举常量
除了前面提到的三个基本部分以外,状态机的构建还有一个技巧,就是使用枚举型常量来作为状
态变量,相对于其它数据类型来说,枚举常量表示了两组成对的数据,一组是字符串,一组是数
值,两者一一对应,在前面板上,能直观地看到字符串,在程序面板上则简单地表示为数值型数
据,整个枚举型数据的值可以是预定义的多个数据中的任何一个值。
图 5 枚举常量与条件结构
LabVIEW 网络讲坛 出品
www.ni.com/china/labviewtips
为什么要使用枚举型数据来作为状态变量呢,因为枚举型数据和条件结构配合使用时相当方便。
第一,在条件结构的条件判断框中,我们看到的将不是单纯的数值,而是我们定义好的字符串,
这样直观的表现形式给不同状态的管理带来了方便,另外,我们在条件结构上通过右键单击,选
择为每个值添加分支,就能够自动地将条件结构根据枚举数据迚行展开,从而保证每个状态的完
整性。
此外,考虑到以后对状态机修改及维护的方便,通常,我们将该枚举常量保存为一个自定义控件,
将该自定义控件作为枚举常量引入状态机中,当我们需要对状态变量迚行修改的时候,只需要对
这个自定义控件迚行一次修改,更新,就能对该状态机中任何位置的状态变量迚行统一的管理了。
图 6 自定义枚举常量
状态机中的状态转换
在实际的工程状态机中,很多时候会遇到一个状态可能往多个状态转换的情况,在这个时候,我
们能够使用LabVIEW提供的附加的逻辑功能来实现下一个状态的判断。
如图7所示的例子,在状态框图中有一个子VI,利用该子VI来对选择哪一个分支为下一状态迚行
判断。这个功能的实现分为两个子功能,一是子VI实现的逻辑运算,这一部分,大家可以根据程
序实际的需要自行编写,第二部分就是状态变量的选择。一般来说,实现状态变量的选择有4个
基本的方法。
图 7 状态机的逻辑状态转换
一般来说,实现状态变量的选择有4个基本的方法:
默认转换
这就是上一课中我们所运用的状态转换方法,无论这个状态执行的情况怎么样,都会无条件地转
换下指定的下一个状态中。
LabVIEW 网络讲坛 出品
www.ni.com/china/labviewtips
图 8 默认状态转换
选择转换
利用真假选择函数来实现,在逻辑子 VI 输出为真时,跳入真分支的状态,迚行 State1,为假时,
跳入假分支的状态,迚行 State2,这个方式在两个可能状态的情况下非常简单和好用,但如果
下一个状态的有可能是三个或三个以上的状态呢?
后两种方式就是处理这个情况的
图 9 选择转换
条件结构转换
条件结构的多个分支分别对应了不同的下一状态值,根据逻辑判断子 VI 输出的结果,跳入不同
的分支以选择不同的状态,当子 VI 输出 1 是,跳入 State1,
图 10 条件结构转换
LabVIEW 网络讲坛 出品
www.ni.com/china/labviewtips
转换数组转换
条件结构虽然解决了多个状态选择的问题,但从结构上来看不太直观,管理不够方便,我们可以
把所有待选择的状态放入数组中,通过逻辑判断子 VI 输出不同的索引值直接从数组中索引出下
一个状态输出到移位寄存器
图 11 转换数组转换
状态机的维护
由于我们引入了枚举常量这一有效的状态变量,在后期对状态机的维护中我们会非常轻松,只需
要对已经存在的自定义枚举常量迚行相应的修改,添加,删除等操作,就能方便地完成状态机中
所有状态变量的更新,再对程序框图作必要的修改,就能高效并准确地完成状态机的维护。