1 单过程对象状态转换图
首先,来看一个简单的单过程对象的例子。在洗衣机的工作过程中,一般要经过以下几个过程:
①接通电源,洗衣机按“启动”按钮后开始供水;
②当水满到“水满传感器”时就停止供水;
③水满之后,洗衣机开始执行漂洗过程,正转5 s,然后倒转5 s,执行此循环动作10 min;
④漂洗结束之后,出水阀开始放水;
⑤放水30 s后结束放水;
⑥开始脱水操作,脱水持续5 min;
⑦脱水结束后发出“光报警器”报警,叫工作人员来取衣服;
⑧按“停止”按扭(或10 s报警超时到),声光报警器停止,并结束整个工作过程。
按照该洗衣机的工作流程,可用有穷自动机(DFA)中的状态图来描述其状态转化过程,如图1所示。
了解了该洗衣机的状态转化过程后,根据其状态转化图就可以很容易地为其进行软件设计,并写出相应的程序实现代码。
2 单过程对象状态转换图的程序代码实现
下面就根据该洗衣机工作状态转换图,对洗衣机工作过程进行软件设计和编程(使用C语言来描述):
首先,该状态图只涉及一个对象,那就是洗衣机,因此只需要定义一个状态变量,用该状态变量来表示洗衣机的状态。该变量定义为:
最后,再定义一个时间变量wDelayTime来表示对洗衣机工作过程中的时间控制。至此,通过洗衣机工作过程中的状态转换图,就可以很容易地写出该洗衣机工作过程的程序实现代码(函数StateControl(),其中有些函数的具体实现代码没有给出,主要目的是要了解该状态转换的设计思想和方法)。
3 多过程对象状态转换图
再来看一个相对比较复杂的问题,在程控电话交换机中,一台程控电话交换机可接有上百、上千,甚至上万部电话机。其中,每一部电话机对应于程控电话交换机中的一个物理及逻辑端口,程控电话交换机就是通过对这些物理及逻辑端口的工作状态进行控制,进而实现对这些电话机工作状态的控制。一部正常工作的电话机一般具有以下几种主要状态:空闲态、拨号态、回铃音态、振铃态、通话态和忙音态。程控电话交换机的工作过程主要就是实现电话机在这些状态之间的转换与迁移。
由于连接在一台程控电话交换机上的所有电话机都具有上述6个相同的状态转换过程,因此,可用一个状态数组来表示一台程控电话交换机上所有电话机的工作状态。图2为程控电话交换机中电话机工作时的状态转换图。
4 多过程对象状态转换图的程序代码实现
为在软件设计及程序代码上实现上述程控电话交换机中电话机状态的转移,首先需要定义6种工作状态(用C语言实现):
还要注意到,在拨号状态,还存在2种子状态:听拨号音拨首位号状态和听静音拨非首位号状态。
也就是说,在拨首位号时是处于听拨号音状态的拨号,而在拨非首位号时则是处于听静音状态的拨号,这两种状态是要进行区分的。当然,首位号在程控电话交换机中还有其他更为重要的作用,这里就不多讲了。
为此,需为拨号态再定义2种子状态,定义如下:
假设该程控电话交换机最多可接有1 000部电话机,由于这些电话机都具有上述6种状态,并且都具有相同的状态转移过程,因此,可用一个状态数组来表示所有电话机的状态。其定义如下:
至此,可写出该程控电话交换机电话机状态转移程序代码(函数PhoneStateControl()),该程序代码在主程序中100 ms被定时调用(其具体实现代码略——编者注)。
5 结 论
以上两个例子简洁、明了地实现了各自所要的功能。该状态转换的设计思想具有化繁为简的功效,同时也具有简单、易学、易用等特点。通过上述两个例子的说明及描述,相信大家对该状态转换思想有所了解。这种状态转换思想的关键与核心是,要能够清楚地将问题的状态抽象并分解出来,并且对于所有状态的分解与描述争取做到不遗漏、不冗余、层次分明。这样,就能够很好地理解并运用这种思想为我们服务了。