状态机作为对事物运行规则的一种抽象方法,在实际工作开发中应用非常广泛,它是一种用来进行对象行为建模的工具,相对于常规建模来说,状态机和流程图本身具有使用性强、可读和易理解的特点,可以将复杂的逻辑问题变得清晰与简单。
本文主要介绍Modelica标准库v3.2.1中的StateGraph库及其应用。本文所有的操作都是在MWorks.Sysplorer操作下进行,其他支持Modelica的软件也可完成本文中的操作建模部分。
状态机基础概念
在第一次听到“状态机”的时候,相信大家都是有点模糊的,因此在本文开始需要首先介绍一个知识点“什么叫状态机?”。
简单来说,状态机不是一个实际的机器设备,而是一种数学模型,它的全称为有限状态自动机(Finite State Machine,简写FSM)。
FSM是指一个对象有有限个状态,每一时刻该对象都处在其提前定义好的一种或多种状态中,同时每个状态都需要去完成某些特定的事情,在完成特定时动作后或在外界的控制下转移到另外一种对象。生活中有很多状态机例子,下图为开关门例子,门开着的时候说Welcome,关门的时候说thank you。
图1:开关门例子
状态机有两大特点,一是离散的,二是有限的,而描述事物的有限状态机模型的元素由以下组成:
-
状态(State):一个状态机中至少需要包含2个状态,如上述例子包含“Opened”和 “Closed”两个状态
-
事件(Event):事件就是执行某个动作/操作的指令或条件,上述例子中读取到“开门”和“关门”信号就是事件
-
动作(Action):动作是事件发生后要执行的动作/指令,如事件是开门信号,则动作为开门和说welcome
-
转移(Transition):转移为从一个状态变化为另外一个状态,如开门的过程,即从“Closed”到“Opened”过程即为一种转移
相信大家也对状态机的基础知识有了一些了解,那么接下去我们来了解下MWorks/Modelica中的StateGraph标准库。
Modelica的StateGraph
下图为Modelica中的StateGraph标准库,其模型库结构层次较为直观,从上到下依次为:
图2:StateGraph模型库结构
-
UsersGuide:包含用户指导书和版本说明
-
Examples:模型例子,建议从这一层开始学习这个模型库
-
Interfaces:包含状态接口
-
InitialStep:初始化步骤,即在仿真开始时其状态为true
-
InitialStepWithSignal:带输入信号的初始化步骤,这个模块与InitialStep的区别在于,初始化步骤仅在输入信号为true时,其模块才为true
-
Step:该模块可用于代表状态
-
StepWithSignal:该模块与Step类似,与Step的区别在于该模块带有用来描述模块的激活状态的输出
-
Transition:转移模块,该模块可根据设置的等待时间,将状态转移至下一状态,如等待时间设置为3s,则在上一个状态持续3s后,转移至下一个状态,若设置为0s,则直接转移状态
-
TransitionWithSignal:带有输入信号的转移模块,与Transition模块相比,其多了一个判断条件,当且仅当等待时间达到规定时间和输入信号为true时,状态转移至下一状态
-
Alternative:该模块表示同一时刻,相连的状态有且仅只有一个为true
-
Parallel:并行事件模块,该模块可以允许2个或者2个以上的状态同时处于激活
-
StateGraphRoot:状态终端,可记录模型每时刻的状态激活个数等
-
Temporary:包含一些例子中使用的其他组件,如函数anyTrue,allTrue以及显示数字组件
Examples
下面将结合几个StateGraph自带的例子加深模型的认识,如下为FirstExample:
图3:左图:模型示意图 右图:仿真结果
该状态机包含2个状态,1个初始化状态,1个执行状态。包含2个转移,能够让状态在initialStep和step之间转移,initialStep状态转移为step状态的条件为等待时间达到1s,从step通过transition2转移为initialStep状态的条件为等待时间达到1s。
因此该状态机周期为2s,initialStep和step各会处于激活状态1s。
► 各状态的激活情况如下图
图4:initialStep和step状态激活仿真结果
如前介绍,转移模块(transition)除了只根据状态持续时间外,也可以根据输入信号的true/false来激活状态的转移,比如将上述模型的transition2改为带有输入信号接口的transitionWithSignal:
图5:上图:仿真模型 下图:仿真结果
将输入信号改为false,也就是说当状态到step后,不会再转移为initialStep,如此设置后仿真结果为在1s后,一直处于step状态。
图6:图5模型的模型的仿真结果
同时可以在这模型基础上做一些扩展,如在step激活的情况下,x开始积分, 同时将状态转移的条件改为当x大于等于0.5时,从step转移为initialStep。
在文本区域输入以下内容,前面部分表示step激活下,x进行积分,否则不积分,同时step不激活后x重新等于。
图7:左图:StateGraph模型 右图:文本区域增加部分
完成上述操作后则进行再一次仿真,仿真结果为
图8:仿真结果
图9:step激活状态和x大小
在实际应用过程中,在某一状态激活中,执行的操作非常的复杂,可以根据自己的应用场景进行试验。
Parallel和Alternative
另外再介绍组件功能Parallel和Alternative,Parallel为同时激活若干个状态,Alternative同一时刻仅激活1个状态,以StateGraph中的例子ExecutionPaths进行介绍。
该模型包含8个状态(从step0至step6),1个Parallel组件和1个Alternative组件,step3、step4和step4a通过Alternative组件连接,step1和step2-step5通过Parallel连接:
图10
图 10:仿真结果可以观测step1、step2、step3和step5
图11:step1、step2、step3和step5激活结果
在step2、step3和step5相互转移的时候,由于step1与这几个状态是并行,因此step1一直处于激活状态,并跟step5一起通过transition2转移至step6。
实例应用
上章节通过结合Examples中的例子简单的介绍了StateGraph组件和功能,但是这些例子都是别人做的,那么接下我们自己来做一个简单的例子。
在日常生活中,其实有很多类似的逻辑应用,比如开头介绍的开关门,这里将根据生活中的十字路口红绿灯进行搭建一个简单的模型例子。
► 场景为某十字路口交通灯转移,周期为20秒
-
南北向禁行时,红灯亮起并保持10秒,同时东西向通行,绿灯亮起,并只保持7秒,7秒后,黄灯亮起保持3秒
-
东西向禁行时,红灯亮起并保持10秒,同时南北向通行,绿灯亮起,并只保持7秒,7秒后,黄灯亮起保持3秒
-
车辆在看到绿灯时,以1m/s的速度行驶,在看到黄灯和红灯后立马停止(假设不考虑减速过程和反应时间)
首先确认需要确认的是需要描述两个方向上的交通灯状态,那么就需要6个状态,分别描述2个交通灯的红黄绿状态。为了描述南北方向红灯与东西方向的黄绿同时亮起以及转移为东西方向红灯与南北方向的黄绿状态,则需要2个Parallel模块和1个Alternative。一个方向的交通灯的模型如下所示(也有其他建模的方法,这里仅作为例子)。
图12:红绿灯组件结构
需要注意的是这里的yellow和green属于同一方向交通灯,red为另外方向的交通灯。为了使得跟实际的交通灯颜色一致,因此在文本区域引入3个布尔变量,其表征对应颜色的状态是否亮起,同时在文本区域最下方annotation加入颜色转移选项。
图13:引入三色的布尔变量 图14:增加组件的颜色变化部分
将上面建好的红绿灯模型以拖拽连接方式连成下图,其中NS和WE是上述建立的红绿灯模型(见图11)。
图15:交通灯模型
这里需要在文本区域对t进行设置,t为跟时间相关的变量,值域为0-20,因此需要在文本区域对t进行描述。
仿真结果如下图动画,在0-7秒时,南北通行,东西禁行,7-10秒南北的绿灯变为黄灯,车辆停止,10秒-17秒东西通行,南北禁行。
总结
本文简单介绍了StateGraph模型库,同时以StateGraph为基础做了十字路口红绿灯交通的例子。感兴趣可以下载MWorks或者其他Modelica语言软件进行相关操作。
StateGraph模型库还有很多内容没有深入讲解,比如接口定义、组件的具体实现原理等,这些大家可以在其他时间进行研究StateGraph,也可以与我们进行沟通交流。