LabVIEW有限状态机
顺序模式是我们最先接触,也是最基本的一种编程模式, 程序按照固定的顺序依次执行,结束(如图1)
但在很多情况下,静态的顺序模式并不能满足我们编程的要求,我们需要更有效地动态结构来实时改变程序的执行顺序 (如图2),在这种情况下,状态机的引入就成了必然的结果。
- LabVIEW中的状态机
如下图所示,在LabVIEW中,任何一个状态机都是由三个基本部分构成的,首先外层是一个while循环,同时在while循环中包含有一个条件结构, while循环用于维持状态机的运行,条件结构用以对各个不同的状态迚行判断,第三个基本部分是移位寄存器,用以将下一个状态传递到下一次循环状态判断中。另外在一个完整的状态机中,我们一般还会提供初始状态,每一个状态的执行步骤以及下一个状态切换代码等等。
除了前面提到的三个基本部分以外,状态机的构建还有一个技巧,就是使用枚举型常量来作为状态变量,相对于其它数据类型来说, 枚举常量表示了两组成对的数据,一组是字符串,一组是数值,两者一一对应,在前面板上,能直观地看到字符串。
为什么要使用枚举型数据来作为状态变量呢,因为枚举型数据和条件结构配合使用时相当方便。第一,在条件结构的条件判断框中,我们看到的将不是单纯的数值,而是我们定义好的字符串,这样直观的表现形式给不同状态的管理带来了方便,另外,我们在条件结构上通过右键单击,选择为每个值添加分支,就能够自动地将条件结构根据枚举数据迚行展开,从而保证每个状态的完整性。
下面是一个简单的例子,在前面板上添加指示灯显示现在所处状态。从初始状态Start开始每个1秒按顺序切换到下一状态,到达最终状态End时结束循环:
- 状态机中的状态转换
上面的那个例子太简单,在实际的工程状态机中, 很多时候会遇到一个状态可能往多个状态转换的情况,在这个时候,我们能够使用LabVIEW提供的附加的逻辑功能来实现下一个状态的判断。如下图所示的例子,在状态框图中有一个子VI,利用该子VI(根据程序实际的需要自行编写 )来对选择哪一个分支为下一状态进行判断。条件结构的多个分支分别对应了不同的下一状态值,根据逻辑判断子 VI 输出的结果,跳入不同的分支以选择不同的状态。
条件结构虽然解决了多个状态选择的问题,但从结构上来看不太直观,管理不够方便,我们可以把所有待选择的状态放入数组中,通过逻辑判断子 VI 输出不同的索引值直接从数组中索引出下一个状态输出到移位寄存器。