首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

LabVIEW编程技巧:手把手教你实现基于状态机的程序框架

在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中一种通用的编程框架结构,当我们编写大型的复杂测试程序时,是必须掌握的一种编程模式。在这个例子的基础上,如果再加上队列的内容,可以实现功能更为强大的基于状态机的生产者/消费者模式的程序框架结构。

如果你觉得这篇文章对你有用的话,关注+收藏+点赞吧。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190215A0TQW100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券