FSM与State模式在某试验台测控系统中的应用研究

2018-08-21 06:55夏京川段从武宋国堃赵世平
机械制造与自动化 2018年4期
关键词:试验台测控逻辑

夏京川,段从武,宋国堃,赵世平

(四川大学 制造科学与工程学院,四川 成都 610065)

0 引言

在某试验台测控系统中,根据试验要求,存在多个中间状态并且相互之间有复杂的转换关系,确定不同输入条件下测控系统状态迁移过程以及内部切换模式,是设计该系统软件的关键。本文根据FSM原理,对系统中对象的控制和顺序视图进行了建模,并且采用State模式,将状态转换显示化,与不同状态的行为进行隔离,极大地提高了软件设计的可靠性与复用性。

1 FSM与State模式简介

1.1 FSM原理

FSM(finitestatemachine)是包含有限状态的概念化机器,状态机在某一个时刻只有一个状态,通常由输入事件引起状态的改变,而下一个状态则依赖于当前状态和输入事件[1]。其中,状态表示一种可识别、存在于一段时间间隔内的情况;事件是在某一个时间点发生的事情,具有原子性且在概念上无持续;动作是与状态转换相关的可选输出,动作执行计算,作为状态转换的结果;警戒条件是值为真或假的布尔表达式,可以对事件进行验证[2]。一个典型的微波炉有限状态机系统如图1所示[3]。

图1 微波炉系统FSMUML图示例

1.2 State模式

简单的FSM可以使用switch/case语句来实现,然而此时FSM的逻辑和实现动作的代码之间没有分离,难以达到代码的复用和有效维护。状态迁移表是实现FSM的另一种途径,通过一个处理事件的引擎,查找与事件匹配的转换,调用相应的动作,并更改状态[4]。但对于大型FSM,状态迁移表的查找会耗费大量时间,导致效率低下。使用State模式,能够既具有嵌套switch/case语句的效率又具有解释迁移表的灵活性。

State模式允许对象在内部状态改变时改变其行为,此时对象对外表现为类已经被修改[5]。State模式参与者通常包括Context(环境),定义客户感兴趣的接口,提供对外表现的事件,并维护一个ConcreteState的实例以定义当前状态;IState(状态抽象接口),用以封装与Context特定状态相关的行为;ConcreteState(具体状态子类),实现一个与Context的一个状态相关的行为[6]。

其中,Context将与状态相关的请求委托给Concrete对象处理,并可将自身作为参数传递给状态对象。Context或ConcreteState子类都可决定当前状态的后继者以及在何种条件下进行状态转换。

2 测控系统应用实例

2.1 基本试验

在某试验台测控系统中,其上锁试验状态图如图2所示。

图2 上锁试验状态图

根据系统要求,试验的开始状态为零位,最终状态回到零位或处于出错状态。试验被设置为自动进行,因而对外的接口表现均为Auto事件。在状态的切换中,会根据前一个状态与目标状态而执行相应动作;在某些状态迁移间,还涉及条件的判断,通常条件不满足直接进入出错状态。

根据试验的状态图,可创建其状态模式的UML表示,如图3所示。

图3 上锁实验State模式类图

其中,ExperimentContext继承IAction接口,并实现其中定义的动作;同时,其关联一个IMachineState对象,以标识当前的状态并指明将执行的操作;具体的状态继承于IMachineState接口,持有回指向上下文类的引用,以调用实现于IAction的动作,并决定状态的后继者。

通过状态模式的使用,将FSM中的动作、事件与状态分离开来,状态被封装为单独的类,以便不同的实验对相同的状态进行复用,也减少了增加、删除状态以及切换状态模式的复杂性。

2.2 添加试验状态

在试验台系统中,不同的试验模式通常是在基本试验的基础上,添加相应的行为以及状态,此时已存在的状态无需改变,可以有效地复用。

在加载试验中,需要在上锁保持状态加载至一定的力,并保持一段时间。如图4所示,此时只需要将上锁保持状态的后继者指向加载状态,并创建加载、加载保持状态,已经存在的状态不需改变,并且基本试验的逻辑不用更改。

此外,仍需要添加属于加载试验特定的动作、条件以及状态切换:

public class LoadContext:ExperimentContext, ILoadingAction//继承ILoadingAction,以实现要求的动作{

public override void SetMachineState(ExpState state){

base.SetMachineState(state);

if(state==ExpState.StateLockedHolding)

图4 加载试验状态图

SetMachineState(ExpState.StateLoading); //截断某个状态,并重新指定后继者

if(state==ExpState.StateLoading) ...

if(state==ExpState.StateLoadKeeping) ...

}

public async TaskIsLockLoadingCondition(){...}

public void LockLoadingAction(){...}

public async Task LoadingKeepingAction(){...}//实现相应的条件与动作

}

2.3 添加事件接口

对于自动试验,FSM的最终状态必然为零位或者出错,同时对外表现事件只有AutoStartEvent。而对于某些试验模式,通常还需要人工的干预,此时可提供额外的手动事件,并拦截某一试验状态:

public void Task AutoStartEvent(ExpState? interrupt=null){

while(CurrentState!=ExpState.OriginalPos&&CurrentState!=ExpState.Error){

if(interrupt!=null&&CurrentState==interrupt.Value) break;//在指定的拦截状态停止自动执行

State.ToNextState(this);

}

}

在开锁试验中,卸载压力与加载压力的工作需要由人工进行,应用程序可为操作者提供ManualUnLoadEvent与MannualLoadEvent,并提供AutoEndEvent事件(图5),以便于操作者选择在某一时刻回到自动试验,完成其他操作。

图5 开锁试验状态图

同样,对应于开锁试验,需要添加试验相关特定的动作、条件与切换逻辑,而这些并没有改变基本试验的业务逻辑,却能够复用已存在的状态,极大地提高了应用程序的可维护性与可扩展性。

3 结语

FSM是一种对系统或对象的控制和顺序视图进行建模的重要工具。采用FSM实现试验台测控系统,能够简化应用程序的逻辑,更清晰地理解系统的复杂性,并提高了实时控制的可靠性、准确性。而采取State模式来实现FSM,最大化分隔其逻辑与动作实现,提升了程序代码的复用性,为构建可维护、可扩展测控系统软件奠定了基础。

猜你喜欢
试验台测控逻辑
刑事印证证明准确达成的逻辑反思
血管吻合试验台的研制及试用
逻辑
创新的逻辑
GATRI18CF型侧翻试验台的静态载荷分析
昆山祺迈测控设备有限公司
悬架性能匹配试验台设计
滚动直线导轨副静刚度试验台设计
女人买买买的神逻辑
基于现代测控技术及其应用分析