Labview状态机.docx

上传人:b****8 文档编号:29946977 上传时间:2023-08-03 格式:DOCX 页数:26 大小:777.68KB
下载 相关 举报
Labview状态机.docx_第1页
第1页 / 共26页
Labview状态机.docx_第2页
第2页 / 共26页
Labview状态机.docx_第3页
第3页 / 共26页
Labview状态机.docx_第4页
第4页 / 共26页
Labview状态机.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

Labview状态机.docx

《Labview状态机.docx》由会员分享,可在线阅读,更多相关《Labview状态机.docx(26页珍藏版)》请在冰豆网上搜索。

Labview状态机.docx

Labview状态机

当前正在审批

5.4LabVIEW设计模式——标准状态机(LabVIEWdesignpatterns-standardstatemachine)

版本7 

创建于:

2011-2-3下午8:

07作者jwdz-最后修改:

 2011-2-8下午9:

06作者jwdz

      我们进行计算机程序设计的真正目的就是命令计算机按照我们的目的和要求来为我们工作。

我们可以通过对工作任务的高度抽象处理来将任务划分为不同的工作状态,并且对每种状态采用相对应、合适的的处理方法来解决不同的问题。

对于计算机程序设计来讲也是如此,工程师和科学家将待解问题抽象为不同的工作状态,并对每个工作状态编写相适应的计算机处理程序,这样我们就能够游刃有余的指挥计算机按我们的要求完成工作。

 

      本节中所要介绍的状态机架构就可以使我们轻松的完成计算机程序的设计任务,并可以根据任务的变化实现很方便的改动。

 

      为了更好的理解状态机架构,首先介绍一些与状态机相关的基础知识。

 

 

5.4.1状态机架构基础知识

 

5.4.1.1状态和状态机

 

状态

 

      人或事物表现出来的形态。

 

      对于状态我们可以这样来理解:

在竞技领域,相对于高水平的运动员而言,其某一场比赛的失利被称之为状态不好。

在技术领域,它又被指物质系统所处的状况(状态由某些物理量来表征)。

其实,无论对人还是对事物而言,时间是表征状态的最基本物理量。

 

      在LabVIEW图形化编程语言中,数据流的运行机制最有效的诠释了数据与节点间状态的变迁。

      对于同一时刻所发生的事情被称之为:

同步。

      对于同一时刻所需要处理的事情被称之为:

实时处理。

      对于同一时段所需要处理的不同事情被称之为:

多线程(或多核)。

      Case结构在执行时,根据输入端条件只能执行所限定Case中的程序代码。

      For循环结构在执行时,根据输入端配置(N、数组的大小、强制停止等)只能执行有限次循环。

      While循环结构在执行时,只要不强制停止可以执行任意次循环。

 

      这些基本概念对我们来讲再熟悉不过了。

但是,最直观的状态变迁还应当属图形化代码中的顺序结构。

 

      顺序结构有序(定序)的控制了程序的执行流程。

参见下图。

 

                                                           图5.4.1.1-1顺序结构状态的变迁

 

      顺序结构可以确定性的控制程序状态的变迁,或者说是:

顺序结构定序的控制了程序段的运行流程。

比如上图中:

从status_1到status_2在到status_3直至status_4。

这种按部就班的、一件一件的处理事情的方式通常是被用来处理常规状态下发生的事情。

 

存在的问题:

对于一些依据某些条件控制状态改变的状况,因为存在着不确定性,定序控制方式就无法使用了。

 

      比如上图中:

正常的情况下程序执行是从status_1到status_2再到status_3直至status_4,但是,有时因某些条件发生了变化,需要从status_1到status_4再到status_3直至status_2的执行顺序。

定序结构就不行了,因为它无法自行变更程序的执行顺序。

 

      状态机的出现为解决这类问题提供了灵活的、有效的控制方式。

 

状态机

 

      状态机是一种具有指定数目的状态的概念机(有限状态机),它在某个指定时刻仅处于一个状态。

状态转变是由输入事件引起的状态变化。

作为对输入事件的响应,系统可能转变到相同或不同的状态,而输出的的事件可能是任意产生的。

[]

 

      此时,状态间的描绘或表述最好使用状态图来进行。

 

状态图

 

      状态图的英文是statediagram;它是指用一组图形来描绘一个系统或组件可能假设的状态,并且显示引起或导致一个状态切换到另一个状态的事件或环境。

       状态图是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的时间做出反应的。

       状态图用于显示状态机(它指定对象所在的状态序列)、使对象达到这些状态的事件和条件、以及达到这些状态时所发生的操作。

 

      对应于前面所提出的问题,使用状态图的表示方法参见下图。

 

                                                 图5.4.1.1-2复杂状态的图形表示——状态图

 

      那么如何使用图形化的代码来表现复杂的状态机呢?

 

       

5.4.1.2状态机的图形化代码基本知识

 

      在LabVIEW中图形化的状态机被用基本结构等来这样表示:

      状态机,程序运行的运行的一种方式。

在这种方式中每项任务都作为独立分支嵌入在带有移位寄存器的While循环所包围的Case结构中。

程序的执行顺序由分支字符串数组指定。

[LV大学实用教程]

 

      其实,这里我们是借用LabVIEW所提供的设计模式之一队列消息处理器(QueuedMassageHandler)来做进一步的说明。

参见下图。

                                                     图5.4.1.2-1创建新的设计模式

 

      在上图中双击“QueuedMassageHandler”选项,系统会自动创建一个QueuedMassageHandler设计模式模版。

参见下图。

                         图5.4.1.2-2队列消息处理器(QueuedMassageHandler)模版

 

      该状态机采用队列消息处理的方式运行。

该状态机的图形化代码包括了以下几个部分:

 

带有移位寄存器的While循环

 

      带有寄存器的While循环是该模式的主框架,控制该模式的开始运行和停止运行。

而移位寄存器用来纪录存储队列消息,程序的执行顺序由分支字符串数组指定。

 

Case结构

 

      Case结构为程序执行状态构架,程序有多少个状态就应该包含有多少个Caes分支,每个包含该状态下的图形化程序代码。

 

函数

      

      While循环和Case结构中间的DeleteFromArray函数用来纪录队列中的信息。

Case结构中的BuildArray函数用来插入下个运行状态的字符串,状态变更通过修改该字符串即可。

 

      上面的所提到的问题现在就可以自行设计解决了。

参见下图。

                                                         图5.4.1.2-3队列状态机基本结构

 

      如果想在Initialize后执行status_4状态,那就将上图中的字符串常量(status_1)修改为:

status_4,并且在status_4的Case结构中编写执行代码即可。

 

      其实还有更好的状态机架构,那就是——标准状态机。

 

 

5.4.2LabVIEW设计模式——标准状态机

 

      标准状态机也是LabVIEW的设计模式之一,参见下图。

                                                    图5.4.2-1LabVIEW设计模式模版

 

      用鼠标双击该设计模式,系统会自动导入该设计模式的模版,参见下图。

                                         图5.4.2-2LabVIEW设计模式——标准状态机

 

      标准状态机与上面所谈到的队列状态机运行机制上没有本质的区别,仅仅是在构成上有所不同。

      在标准状态机中,使用了枚举常数代替了队列状态机中的字符串数组。

这种变化体现出了状态修改和变更等更大的灵活性。

因为,可以将所涉及的运行状态都一次性写入枚举常数中,在使用中直接修改、选取其中所需的状态即可。

 

      使用枚举常数还有以下几个好处:

 

∙枚举常数可以一次性写入Case结构中的SelectorLable中。

      比如,我们在前面版上放置一个Case结构和一个枚举常量,并将这个枚举常量连接到Case结构的条件端。

同时,将枚举常量设置添加为多个参数项,参见下图。

                                  图5.4.2-3多选择项的枚举常数

 

      此时,用鼠标右键单击Case结构框,在快捷菜单中选择》AddCaseforEveryValue就可以将所有项一次自动的添加到Case结构中的SelectorLable中。

这是枚举常数与Case结构相配和的一个特点,也是很简便的操作方法之一。

 

∙枚举常数选择自定义的严格类型

      也就是说,创建一个枚举类型的自定义控件。

这样作的好处是修改任意一个枚举常量其它的枚举常量都将发生改变。

这将大大的简化了设计时的工作量。

关于自定义控件的设计这里就不在具体说明了。

 

      有了标准状态机的设计模式,我们就可以随心所欲的用来创建、修改应用程序的基本运行模式。

实际上,人们当然期望更简单、更直观的设计、使用状态机模式。

为此,NI提供了一个很方便、很直观的状态机设计的工具包(目前被状态图工具包所替代)。

 

 

5.4.3状态机工具包(StateMachineToolkit)

 

      我们这里所谈到的状态机工具包是NI早期发布的产品,并且仅适用于Windows操作系统下使用的LabVIEW(所以下面的设计都是使用Windows版的LabVIEW2009SP1完成)。

      在早期的NIDeveloperSuite(开发者套件)中包含这个状态机工具包(StateMachineToolkit)。

现在,这个工具包已经被状态图工具包所替代(因条件所限我没有使用过状态图工具包)。

      状态机工具包的使用具有简单、直观、修改方便等特点,所以这里还是介绍它的基本使用方法。

 

5.4.3.1状态机工具包简介

 

      状态机工具包提供了状态图编辑器,用来预先设计状态图,并根据所设计完成的状态图自动转换成状态机图形化代码。

 

状态图编辑器

 

      如果已经安装好了状态机工具包,在函数选板下选择》附加工具包》StateDiagramEditor,参见下图。

                             图5.4.3.1-1状态机工具包中的状态图编辑器

 

      用鼠标双击上图中的状态图编辑器的图标,系统会自动弹出状态图编辑器。

参见下图。

                                图5.4.3.1-2状态图编辑器的初始状态

 

      使用这个状态图编辑器就可以编辑、设计程序的状态机的架构。

现在我们所看到的状态图编辑器中仅包含一个名称为:

Init的绿色状态椭圆的图标和一个名称为:

default的自封闭的线段。

      对于状态机架构一般都必须有一个初始化状态,所以状态机编辑器自动提供了这个初始状态,而状态机的其它运行状态必须由设计者来进行编辑。

那么如何编辑状态图呢?

 

      首先,你必须清楚初始化状态结束后的下一个状态应该是一个什么状态?

我们还是采用图5.4.1.1-1顺序结构状态变迁的例子来说明状态机编辑器的使用方法。

按图5.4.1.1-1所示显然,下个状态就应该是:

status_1,然后到status_2、status_3直至status_4。

下面我们使用状态图编辑器完成这个设计。

 

      用鼠标单击图5.4.3.1-2状态图编辑器的空白处,编辑器会自动弹出一个快捷菜单,参见下图。

                                         图5.4.3.1-3创建新的状态

 

      用鼠标点击这个快捷菜单就可以实现创建一个新的状态(还是用状态椭圆表示)。

参见下图。

                                          图5.4.3.1-4修改新状态名称

 

      此时,我们可以修改新状态的名称。

按我们的要求,新状态应该是:

status_1。

修改名称后,调节状态椭圆的相对位置,并将Init上的连线拖拽到status_1的状态椭圆上。

表示完成初始化后即进入status_1状态。

然后将其它所需的状态一并设计完成,参见下图。

                                         图5.4.3.1-5完成多个状态的设计

 

      由于这是一个顺序状态机的设计,所以每个状态之间的转换使用的是default连接的方式。

也就是说,无须我们的干预,执行完成状态椭圆中的任务后,将自动转换到下一个执行状态,直至执行完全部状态。

 

      事实上,状态图编辑器还需要有一个结束状态的标记(类似初始化状态)表示状态最终结束。

该状态也是首先创建一个新的状态,然后鼠标右键单击这个新的状态椭圆,在弹出的快捷菜单中,选择MakeTerminal后,状态椭圆将会变成红色。

参见下图。

                                       图5.4.3.1-6创建最终状态的设计

 

      调整最后的连接线和将最终状态名修改为Exit后。

就完成了用状态机编辑器设计的状态机架构。

如下图所示。

                                            图5.4.3.1-7最终的状态机编辑器

 

      如果关闭这个状态机编辑器,系统会按编辑器的设计将状态图自动转换为图形化状态机代码。

参见下图。

                                   图5.4.3.1-8根据状态图生成的状态机图形化代码

 

      通过这个最简单的设计,我们基本上了解了状态机编辑器的使用。

实际上,这是一个最简单的状态机的应用。

 

      如果需要重新编排状态机的运行次序,只要用鼠标右击状态机框架(While循环的外框),就可以看到下图所示的快捷菜单。

                                        图5.4.3.1-9重新编排状态机执行顺序

 

      在上图中,选择[编辑状态图]就可以重新导入状态图编辑器进行重新编辑状态机的执行顺序。

 

注意:

慎用[从状态图解锁代码],因为此操作完成从状态图解锁代码后,将无法再使用状态图编辑器进行状态图编辑。

除非你的程序设计完好不会再发生任何修改,可以采用[从状态图解锁代码]。

 

 

5.4.3.2复杂状态机架构

 

      所谓复杂状态机架构就是指带有GUI控制和连续数据采集、分析、处理以及报告生成的较为复杂的vi。

      这个vi通常是一个通用类型的vi,可以通过动态调用导入,并完成一个相对独立的数据采集、分析、处理任务。

 

      下面我们来看这样一个例子,我们将创建一个新的项目,名字为:

StateMachineProj,参见下图。

 

                                                      图5.4.3.2-1复杂状态机项目

 

      在这个项目中,我们创建了两个文件夹,即GlobalVariable和Controls文件夹。

用来放置一个状态机全局变量(为简化程序设计)和若干个自定义的严格类型控件(为在其它测试程序中重复使用),创建这些为了都是满足下面程序设计的需要。

同时还设计了一个StateMachine.vi,它相当于本项目中的TopVI,参见下图。

                                                         图5.4.3.2-2项目中的全部内容

 

      在StateMachine.vi前面版的下部,我们设计使用了一个簇结构,将全部按键开关放置在这个簇中(也是便于在程序中重复使用),参见下图。

 

                                                          图5.4.3.2-3程序运行控制开关簇

 

      我们的目的是结合状态机架构,通过开关进行人机对话的运行控制。

下面解释这些开关的基本作用:

 

      程序运行后首先完成“初始化状态”,然后进入“等待状态”。

在等待状态下,通过属性节点控制按键开关是否有效。

比如在等待状态下,应该只有[Starting]、[ContextHelp]和[Exit]按键有效,其它的按键被灰化表示无效使用状态。

参见下图。

                                                               图5.4.3.2-4测量等待状态

 

      这很好理解,还没有开始测量,当然就不会有停止测量或数据保存,所以只有退出和显示即时帮助两项可供选择。

 

按下[ContextHelp]按键——会在显示器上弹出ContextHelp的对话框,再次按动该开关对话框消失。

相当于在开发环境下选择“显示即时帮助窗口”的功能。

 

按下[Starting]按键——程序从等待状态进入开始测量状态(程序在运行初始化状态后自动进入一个等待状态)。

      此时,程序开始进行测量并显示测量结果。

很显然,此时仅有[Stop]和[ContextHelp]按键有效。

参见下图。

                                                         图5.4.3.2-5测量进行状态

 

按下[Stop]按键——程序测量状态进入结束测量状态。

显然这时将有[Starting]和[Word]及[Exit]和[ContextHelp]按键有效。

用户可以选择任一有效状态进行下步的任务。

参见下图。

                                               图5.4.3.2-6测量结束状态(停止测量)

 

按下[Word]按键——结束测量并将当前的测量结果保存到Word文档中(并没有这部分程序代码),然后清除所有的显示器,返回到图5.4.3.2-4测量等待状态,准备新的测量开始或退出测量。

 

按下[Exit]按键——完成测量

 

      下面就给出状态机的状态图所编辑的状态图。

参见下图。

                                     图5.4.3.2-7StateMachine.vi的状态图

 

      其它程序的前面版图和程序框图这里就不给了,因为我们给出了这个项目的全部演示代码,可自行下载查看解读。

 

      根据我们所提供的演示程序,现在你自己完全可以设计控制程序的运行。

如果你还做不到这一点,那就意味着还要继续努力学习。

 

      到此为止,LabVIEW所提供的设计模式基本上都介绍完了,下面的内容我们想探讨一些来自第三方的LabVIEW开好者或设计者所提供的设计模式。

 

 

 

 

 

 

 

 

 

 

                                  

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1