6.2 状态机
顺序结构的程序,我们可以采用顺序结构程序的编写方法:

一个更为有效的方法是把测试任务序列作为测试程序的输入,程序根据用户每次指定的测试任务顺序来调用测试任务。这个程序可以使用循环条件结构来完成:

单状态传递的状态机

程序开始时,首先指定一个初始任务。条件结构处理完初始任务后,根据当前结果设定下一个任务。由于不能预期循环需要迭代几次,所以需要使用 while 循环。并且,条件结构还多了一个“结束测试”分支,这个分支用于退出 while 循环,它负责把“真”值传递给循环停止条件接线端。
改进后的这个程序结构模式也被称为状态机。
状态机中具有一定个数的状态,它在某一时刻仅处于一个状态,在收到某事件或数据后跳转到另一状态。在程序中,每个条件结构中的分支表示一个状态,循环下一次迭代,就跳转到另一个状态中去了。

多状态传递的状态机
队列是一种数据结构,队列中可存放多个类型相同的数据。
有时执行完一个分支的代码,就可以根据当前数据,确定后两次迭代中需要执行的分支。完成这种功能需要用到队列。
使用队列对状态机进行改进后程序如下

状态机也有它的不足之处;核心是一个条件结构;条件结构、事件结构和层叠式顺序结构都有一个共同的缺点:每次只能显示一个分支中的代码,不利于程序阅读。
程序规模庞大,需要处理几十甚至上百中状态,表示它的状态图会变得非常混乱。
分支过多,也会大大降低程序的可读性和可维护性。
如,用生产一个产品为例,顶层的程序在“设计”、“生产”、“测试”等几个状态之间跳转,“测试”这个大状态中可能又包含很多分支状态,比如“测试键盘”、“测试屏幕”等分支状态。不同级别的状态,在不同的 VI 中处理,这就避免了某个 VI 的程序过于复杂难懂。
程序要求
首先,明确一下程序的限定和需求。假设我们需要编写一个可以计算字符串形式表达的四则运算公式的程序,它有如下一些要求:
- 输入是一个字符串,只包含数字(0~9)和四个基本运算符(+-*/),遇到任何其它字符则报错
- 输入中的所有数值都是正整数,否则报错。运算的结果可能会是个实数,因为有除法
- 乘除法的优先级高于加减法
- 作为演示,不能使用高级的字符串处理函数,比如查找搜索等。从字符串转换至数值,每次只能转换一个字符。
比如计算“1+2*3-4/5-6”结果应为 0.2
数据结构设计
LabVIEW 中没有专门的堆栈数据结构,但是 LabVIEW 中的队列可以从两个方向放入数据。
练习
- 编写一个 VI, VI 前面板上有红黄绿三盏灯,模拟交通信号灯的切换。三盏灯共有4个状态:只有绿灯亮,绿灯亮同时黄灯闪烁,只有黄灯亮,只有红灯亮。信号灯在每个状态停留几秒钟然后切换至下一状态,循环往复。
![]()


浙公网安备 33010602011771号