labview程序讲解:跟我学如何实现简单的状态机程序框架
labview程序讲解:跟我学如何实现简单的状态机程序框架事件结构的功能是,根据前面板产生的事件,组合对应的状态,切换执行对应的代码。条件结构中根据不同的状态实现相应的功能代码。在上图中,点击按钮“执行任务1”或“执行任务2”时可执行对应的任务,同时在右侧“系统运行记录”控件中显示了当前任务执行中的各个状态情况。此外,点击“清空记录”按钮可清空右侧“系统运行记录”控件的内容。程序主框架使用while循环、条件结构、事件结构及移位寄存器的的组合方式。While循环维持状态机的运行,同时,配合使用移位寄存器实现一个或多个状态的选择,进而执行相应的代码。
在LabVIEW高级编程技巧中,基于状态机的架构是一种常用的程序框架结构之一,也是一种通用的设计模式。
在状态机程序架构中包含了有限个运行状态,这些运行状态可通过一定的条件进行组合反复执行,或者在状态之间进行任意切换执行。
下面通过一个例子,基于while循环、条件结构、事件结构及移位寄存器等基本编程知识点,演示在LabVIEW中如何实现状态机的程序框架架构。
实例说明为演示状态机的编程实现,这儿模拟了某个工作场景,在这个场景中需要执行2个任务,这2个任务可由5个子任务(分别为子任务1、子任务2、子任务3、子任务4、子任务5)完成,在状态机结构中可将这5个子任务理解为5个不同的状态。其中,执行任务1时需要依次执行子任务1、子任务2、子任务4完成,执行任务2时需要依次执行子任务2、子任务3、子任务5完成,其前面板运行界面如下图所示:
在上图中,点击按钮“执行任务1”或“执行任务2”时可执行对应的任务,同时在右侧“系统运行记录”控件中显示了当前任务执行中的各个状态情况。此外,点击“清空记录”按钮可清空右侧“系统运行记录”控件的内容。
编程思路程序主框架使用while循环、条件结构、事件结构及移位寄存器的的组合方式。
While循环维持状态机的运行,同时,配合使用移位寄存器实现一个或多个状态的选择,进而执行相应的代码。
条件结构中根据不同的状态实现相应的功能代码。
事件结构的功能是,根据前面板产生的事件,组合对应的状态,切换执行对应的代码。
下面看下具体的程序框图代码实现。
程序框图设计( 1 ) 程序框图主代码
程序框图主代码使用了while循环、条件结构、事件结构及移位寄存器,如下图所示:
在while循环上使用了2个移位寄存器,其中,上面一个存储完成某任务时需要执行的所有状态;下面一个的目的是显示当前系统运行状态的记录情况,用来存储前面已有的记录,与状态机无关。
由于状态寄存器中存储了多个运行状态,是一个字符串类型,包含了多行字符串内容,每一行字符串对应了一个具体的运行状态,因此,这儿使用了“匹配模式”函数来解析每个运行状态,其函数原型说明如下图所示:
正则表达式参数输入“[\r\n] ”即根据回车换行符匹配出第一行的内容,作为当前要执行的状态输入到选择结构中,然后执行具体的代码。输出参数“子字符串之后”即为剩下的还未执行的所有状态,然后继续在状态机中解析直到执行完所有的状态即可。
( 2 ) 条件结构框图代码
条件结构中负责每个状态的具体功能代码实现。本例中,共包含如下条件分支:
其中,分支“Init”是程序初始化的状态代码,在移位寄存器中初始值为“Init”,所以程序刚开始执行时会执行此代码,其程序框图如下图所示:
分支“子任务1-5”是每个功能状态的实现代码。由于5个分支代码完全类似,这儿给出“子任务1”的程序框图:
在条件分支中,每次执行完后会根据第2个移位寄存器的值更新前面板的运行记录情况。
当“匹配模式”函数返回的剩余状态为空即执行完了所有的状态时,程序会返回到“默认”分支,在“默认”分支里包含了一个事件结构,通过事件结构实现整个程序运行状态的主控制。
( 3 ) 事件结构框图代码
在事件结构里,主要负责前面板中4个按钮的值改变事件实现。其中,“执行任务1”和“执行任务2”值改变事件代码中,负责对应任务所需的所有状态的产生,如执行任务2时,在状态字符串中给出了3个状态的组合,分别为“子任务2”、“子任务3”、“子任务5”,送到第1个移位寄存器中进而依次执行相应的代码,程序框图如下图所示。
这样就实现了执行某个任务时,可以选择多个状态的组合依次执行的目的。
清空记录的功能实现比较简单,直接给第2个移位寄存器赋值空字符串即可,代码如下图所示:
总结状态机结构是LabVIEW中一种通用的编程框架结构,当我们编写大型的复杂测试程序时,是必须掌握的一种编程模式。在这个例子的基础上,如果再加上队列的内容,可以实现功能更为强大的基于状态机的生产者/消费者模式的程序框架结构。
如果你觉得这篇文章对你有用的话,关注 收藏 点赞吧。