SysML 状态机图(State Machine Diagram)
1、状态机图介绍
SysML状态机图(State Machine Diagram,也称为状态转移图或状态图)是一种行为图, 就像活动图和序列图一样,它展示了系统的动态行为。 与活动图和序列图不同的地方在于,状态机图关注系统如何随着时间的推移响应发生的事件而改变其状态。
下图是一个简单的状态机图示例。Off状态是系统的初始状态,当系统处于Off状态时,系统会因为evOn事件的发生,从Off状态转换到On状态;当系统处于On状态时,系统会因为evOff事件的发生,从On状态转换到Off状态。
2、状态图中的主要元素
状态图中的主要建模元素包括:
- 1) 状态(State)
- 状态是指对象的生命周期中的某个条件或者状况,在此期间对象将满足某些条件、执行某些活动或者等待某些事件。所有对象都有状态,状态是对象执行了一系列活动的结果,当某个事件发生后,对象的状态将发生变化。
- 状态具有如下特征:
- a) 状态表示对象在特定时间点的条件或状况
- b) 对象(或系统)可以从一个状态移动到另一个状态
- c) 状态是对象生命周期中的一个点,它满足某些条件,其中正在执行某些特定操作或正在等待某些事件
- 2) 初始和最终状态(Initial and Final State)
- 状态机图的初始状态,称为初始伪状态,用实心圆圈表示。 此状态将转换到第一个真实状态。状态机图的最终状态显示为同心圆。
- 3) 转换(Transition)
- 转换代表的是从一种状态到另一种状态的改变。此外,它还可以表示从一种状态到其自身的改变,SysML 称之为自我转换。
- 每个转换都可以指定三种可选的信息 :触发器(Trigger) 、守卫(Guard)和动作(action)。这些信息片段会显示在一个字符串中,它会位于转换的上面或下面 。
- 字符串的格式如下 :
<trigger> [<guard>] / <action>
- 触发器必须与你在系统模型中定义的事件名称相匹配。 SysML 定义了四种类型的事件:信号事件、调用事件、时间事件和改变事件。当事件发生时,会触发状态之间的转换 。
- 守卫是一个布尔表达式,总是显示在方括号之间。那个表达式的值为真或假 。 当状态机接收一个与触发器匹配的事件发生时,只有守卫的值为真,转换才会执行。如果它的守卫在那时为假,那么转换不会执行,而事件发生就会被消费,且不会对状态产生任何改变 。
- 动作是在转换过程中执行的行为。影响可能是一个不透明表达式,也可能是你在系统模型中某处定义的行为的名称。
- 4) 事件(Event)
- 事件是在系统模型中定义的一种元素,它定义了能够在实际系统中触发行为的事件类型。在系统操作过程中,特定的事件可能会发生多次。 每次事件发生的时候 ,它的发生都可能会触发行为新的一次执行 。
- SysML 定义了如下四种类型的事件 :
- a) 信号事件(Signal Event):对应于异步消息或信号
- b) 调用事件(Call Event):对应于对操作的过程调用
- c) 时间事件(Time Event):在指定时间过去后发生的定时事件
- d) 改变事件(Change Event):每当满足指定条件时就会发生更改事件
- 5) 动作(Action)
- 动作是一个可执行的原子计算,是不可中断的,包括操作调用、对象的创建或销毁,或者向对象发送信号。动作可能会导致模型状态的改变或者一个值的返回。
- 6) 入口和出口动作(Entry and Exit Action)
- 入口动作是进入那个状态执行的第一个行为 。入口动作是一种原子行为(不可中断)。 这意味着,在状态机处理新的事件之前(可能转换到另 一种状态),要确保它执行完成 。
- 出口动作是离开那种状态之前执行的最后一个行为。当事件导致状态机转换到新的状态时,它才会发生 。 和入口动作一样,出口动作也是一种原子行为。也要确保可以执行完成;没有任何新的事件可以中断它的执行 。
- 如下图所示,当系统退出Idle状态时,将会执行出口动作enableLock();当系统进入Heating状态时,将会立即执行入口动作activateHeater()。
- 7) 复合状态(Composite State)
- 复合状态拥有子状态。当复合状态处于非活动的状态时,它所有的子状态都是非活动的。当复合状态是活动的,那么它的子状态之中会有一个状态是活动的 。
- 复合状态可能从其边界跳出,也可能从特定的内嵌子状态跳出。不管复合状态处于哪个子状态,从复合状态边界开始的转换都会在事件发生的时候触发。而从内嵌子状态开始的转换,只有在复合状态恰好处于对应的子状态的时候,事件发生时才会触发。
- 另外,需要特别注意事件触发的顺序是从内到外的。如下图所示,子状态Up和Down会受到evMove事件的触发而发生状态转换,同时复合状态Active会受到evMove事件的发生内部状态转移,同时执行动作print("Event Not Handled")。若系统处于Up(或者Down)状态时,同时事件evMove发生,evMove事件会先被内部子状态消费掉,复合状态将不受触发从而不执行任何动作。
- 8) 历史状态(History State)
- 历史状态是一个伪状态(Pseudostate),其目的是记住从组合状态中退出时所处的子状态,当再次进入组合状态,可直接进入这个子状态,而不是再次从组合状态的初态开始。
- 在下图的DoorClosed状态中,其子状态正常的顺序是:【PreWash】->【InitTime】->【Washing】->【WashTime】->【Drying】->【DryTime】。
- 当系统处于状态【Washing】时,突然开门(发生evDoorOpen时间),系统停止工作进入状态【DoorOpen】,当重新关门(发生evDoorClosed事件)时,系统将直接进入状态【Washing】。
- 9) 正交区域(Orthogonal Region)
- 和活动一样,状态机可以表示并发行为。我们可以向状态机添加多个区域,每个区域都包含自己的系列状态和转换 。 每个区域都会独立对事件发生做出响应 。因为,区域是彼此正交的 。
- 通过使用分隔状态的虚线,可以将状态分隔为多个区域。可以选择为每个区域指定名称,名称会显示为区域内某处的标签, 一般位于某个角落 。
- 当状态机拥有多个区域的时候,在系统操作的任意时刻,每个区域都会拥有一个活动状态 。 换种说法,在状态机行为的执行过程中,状态机在多个状态中并发(每个区域一种活动状态) 。
3、总结
状态机图通常用于描述对象的状态相关的行为。一个对象根据它所处的状态对事件做出相应的响应。状态机图非常适合作为详细设计的产出物(即开发的输入)。与序列图一样,状态机图是一种精确且明确的行为规范。 因此,它通常用于系统设计和仿真/代码生成。
状态机图所能够描述行为的模块,都必须真正拥有定义好的状态 。(也就是说,它们会对事件发生做出基于状态的行为)。然而,并非所有模块都拥有定义好的状态 。