2011年9月12日,第二稿
9.2 图形化语言设计模式之一——标准状态机
进行计算机程序设计的根本目的就是命令计算机按照我们的目的和要求来解决我们所面临的工作。
我们可以通过对任务的高度抽象处理将任务划分为不同的工作状态,并且对每种工作状态采用相对应、合适的的处理方法来解决不同的问题。
对于计算机程序设计来讲也是如此,工程师和科学家将待解问题高度抽象为不同的工作状态,并对每个工作状态编写相适应的计算机处理程序,这样我们就能够游刃有余的指挥计算机按我们的要求完成工作。
本节中所要介绍的标准状态机设计模式就可以使我们轻松的完成计算机程序的设计任务,并可以根据任务的变化实现很方便的改动。
我们可以通过对任务的高度抽象处理将任务划分为不同的工作状态,并且对每种工作状态采用相对应、合适的的处理方法来解决不同的问题。
对于计算机程序设计来讲也是如此,工程师和科学家将待解问题高度抽象为不同的工作状态,并对每个工作状态编写相适应的计算机处理程序,这样我们就能够游刃有余的指挥计算机按我们的要求完成工作。
本节中所要介绍的标准状态机设计模式就可以使我们轻松的完成计算机程序的设计任务,并可以根据任务的变化实现很方便的改动。
9.2.1 状态和状态机
状态
我们所说的状态是指:人或事物表现出来的某种形态。
对于状态这个概念我们还可以简单的来理解:在体育竞技领域,相对于高水平的运动员而言,其某一场比赛的失利被称之为这段时间它的状态不好。在技术领域,它又被指物质系统所处的状况(状态由某些物理量来表征)。其实,无论对人还是对事物而言,状态都可以理解为是时间的函数。
图形化语言所描述的状态
在LabVIEW图形化编程语言中,数据流运行机制已经规划出数据与节点间状态的变迁。例如:
对于同一时刻所发生的事情被称之为:同步。
对于同一时刻所需要处理的事情被称之为:实时处理。
对于同一时段所需要处理的不同事情被称之为:多线程(或多核)。
Case结构在执行时,只能根据输入端条件执行所限定Case中的程序代码。
For循环结构在执行时,根据输入端配置(N、数组的大小、强制停止等)只能执行有限次循环。
While循环结构在执行时,只要不强制停止可以执行任意次循环。
这些基本概念对我们来讲再熟悉不过了。但是,最能够直观反应出状态变迁的结构还应当属图形化代码中的顺序结构。
我们所说的状态是指:人或事物表现出来的某种形态。
对于状态这个概念我们还可以简单的来理解:在体育竞技领域,相对于高水平的运动员而言,其某一场比赛的失利被称之为这段时间它的状态不好。在技术领域,它又被指物质系统所处的状况(状态由某些物理量来表征)。其实,无论对人还是对事物而言,状态都可以理解为是时间的函数。
图形化语言所描述的状态
在LabVIEW图形化编程语言中,数据流运行机制已经规划出数据与节点间状态的变迁。例如:
对于同一时刻所发生的事情被称之为:同步。
对于同一时刻所需要处理的事情被称之为:实时处理。
对于同一时段所需要处理的不同事情被称之为:多线程(或多核)。
Case结构在执行时,只能根据输入端条件执行所限定Case中的程序代码。
For循环结构在执行时,根据输入端配置(N、数组的大小、强制停止等)只能执行有限次循环。
While循环结构在执行时,只要不强制停止可以执行任意次循环。
这些基本概念对我们来讲再熟悉不过了。但是,最能够直观反应出状态变迁的结构还应当属图形化代码中的顺序结构。
顺序结构可以确定性的控制程序状态的变迁,或者说是:顺序结构定序的控制了程序段的运行流程。比如上图中:从status_1到status_2在到status_3直至status_4。这种按部就班的、一件一件的处理事情的方式通常是被用来处理常规状态下发生的事情。
可是,世界上的事物变化规律是万分复杂的,对于一些依据某些条件控制状态改变的状况,因存在着状态执行的不确定性,所以定序控制方式就无能为力了。
比如在上图中:正常的情况下程序执行是从status_1到status_2再到status_3直至status_4,但是,有时因某些条件发生了变化,需要从status_1到status_4再到status_3直至status_2的执行顺序。定序结构就不行了,因为它无法自行变更程序的执行顺序。
状态机的出现为解决这类问题提供了灵活的、有效的控制方式。
状态机
状态机是一种具有指定数目的状态的概念机(有限状态机),它在某个指定时刻仅处于一个状态。状态转变是由输入事件引起的状态变化。作为对输入事件的响应,系统可能转变到相同或不同的状态,而输出的的事件可能是任意产生的。
此时,状态间的描绘或表述最好使用状态图来进行。
状态图
状态图的英文是state diagram;它是指用一组图形来描绘一个系统或组件可能假设的状态,并且显示引起或导致一个状态切换到另一个状态的事件或环境。
状态图是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的时间做出反应的。
状态图用于显示状态机(它指定对象所在的状态序列)、使对象达到这些状态的事件和条件、以及达到这些状态时所发生的操作。
对应于前面所提出的问题,使用状态图的表示方法参见下图。
可是,世界上的事物变化规律是万分复杂的,对于一些依据某些条件控制状态改变的状况,因存在着状态执行的不确定性,所以定序控制方式就无能为力了。
比如在上图中:正常的情况下程序执行是从status_1到status_2再到status_3直至status_4,但是,有时因某些条件发生了变化,需要从status_1到status_4再到status_3直至status_2的执行顺序。定序结构就不行了,因为它无法自行变更程序的执行顺序。
状态机的出现为解决这类问题提供了灵活的、有效的控制方式。
状态机
状态机是一种具有指定数目的状态的概念机(有限状态机),它在某个指定时刻仅处于一个状态。状态转变是由输入事件引起的状态变化。作为对输入事件的响应,系统可能转变到相同或不同的状态,而输出的的事件可能是任意产生的。
此时,状态间的描绘或表述最好使用状态图来进行。
状态图
状态图的英文是state diagram;它是指用一组图形来描绘一个系统或组件可能假设的状态,并且显示引起或导致一个状态切换到另一个状态的事件或环境。
状态图是描述一个实体基于事件反应的动态行为,显示了该实体如何根据当前所处的状态对不同的时间做出反应的。
状态图用于显示状态机(它指定对象所在的状态序列)、使对象达到这些状态的事件和条件、以及达到这些状态时所发生的操作。
对应于前面所提出的问题,使用状态图的表示方法参见下图。
那么如何使用图形化的代码来表现复杂的执行状态呢?那就是——标准状态机。
9.2.2 标准状态机
标准状态机的图形化表示方法,在LabVIEW的启动界面选择:
》基于模板的VI...或更多...
》新建
》基于模板
》框架
》设计模式
》标准状态机
参见下图。
》基于模板的VI...或更多...
》新建
》基于模板
》框架
》设计模式
》标准状态机
参见下图。
用鼠标双击该设计模式,系统会自动导入该设计模式的模版,参见下图。
标准状态机的图形化代码由这样几个部分组成:
在标准状态机中,使用了枚举常数来控制Case的分支。可以将所涉及的运行状态都一次性写入枚举常数中,在使用中选取其中所需的状态即可。
使用枚举常数还有以下几个好处:
1、枚举常数可以一次性写入Case结构中的选择器标签中。
比如,我们在前面板上放置一个Case结构和一个枚举常量,并将这个枚举常量连接到Case结构的条件端。此时,可以一次将枚举常量添加为分支页。具体操作是:用鼠标右键单击Case结构框,在快捷菜单中选择》为每个添加分支。就可以将所有项一次自动的添加到Case结构中的选择器标签中。这是枚举常数与Case结构相配和的一个特点,也是很简便的操作方法之一。
2、枚举常数选择自定义的严格类型
也就是说,我们最好创建一个枚举类型的自定义控件。这样作的好处是修改任意一个枚举常量其它的枚举常量都将发生改变。这将大大的简化了设计时的工作量。关于自定义控件的设计这里就不在具体说明了。
有了标准状态机的设计模式,我们就可以随心所欲的来创建、修改应用程序的基本运行顺序。
使用标准状态机时,最好在While循环内加入一个定时器。因为标准状态机也是通过轮询来检查状态是否变迁,这样可以避免过多的占用CPU运行时间。
实际上,我们在工程应用中更多的是使用状态机工具包。关于状态机工具包的使用方法以后有机会另行介绍。
- Case结构——由枚举常量中的内容选择Case结构的执行分支
- 带有移位寄存器的While循环——执行开始状态,利用移位寄存器指定下一个循环的分支
- 枚举常量——记录、保存所需执行的状态(目前仅有两个状态:Initialize、Stop)
在标准状态机中,使用了枚举常数来控制Case的分支。可以将所涉及的运行状态都一次性写入枚举常数中,在使用中选取其中所需的状态即可。
使用枚举常数还有以下几个好处:
1、枚举常数可以一次性写入Case结构中的选择器标签中。
比如,我们在前面板上放置一个Case结构和一个枚举常量,并将这个枚举常量连接到Case结构的条件端。此时,可以一次将枚举常量添加为分支页。具体操作是:用鼠标右键单击Case结构框,在快捷菜单中选择》为每个添加分支。就可以将所有项一次自动的添加到Case结构中的选择器标签中。这是枚举常数与Case结构相配和的一个特点,也是很简便的操作方法之一。
2、枚举常数选择自定义的严格类型
也就是说,我们最好创建一个枚举类型的自定义控件。这样作的好处是修改任意一个枚举常量其它的枚举常量都将发生改变。这将大大的简化了设计时的工作量。关于自定义控件的设计这里就不在具体说明了。
有了标准状态机的设计模式,我们就可以随心所欲的来创建、修改应用程序的基本运行顺序。
使用标准状态机时,最好在While循环内加入一个定时器。因为标准状态机也是通过轮询来检查状态是否变迁,这样可以避免过多的占用CPU运行时间。
实际上,我们在工程应用中更多的是使用状态机工具包。关于状态机工具包的使用方法以后有机会另行介绍。







