MagicDraw-状态机图

什么是状态机图

状态机图是能够用于说明系统动态行为信息的三种SysML 图中的最后一种。你可以在状态机图上显示各种各样的状态,并且可以指定四种类型的事件,从而在运行的系统中触发那些状态之间的转换。Sys ML 还可以使用正交区域对基于状态的并发行为建模。

作用

状态机图是一种行为图;和活动图以及序列图一样,它是系统的一种动态视图和活动图以及序列图不同的是,状态机图关注的是系统中的结构如何根据随时间发生的事件改变状态。

状态机图显示的行为表示的往往是模块的分类行为。术语“分类行为”指的是,在模块初始化的时候就开始执行,一般在实例被销毁的时候才会完成执行的行为。

状态机图很适合作为详细设计的产出物(也就是开发的输入项) 。和序列图一样,状态机图会对行为做精确、清晰的说明。很多商业级别的建模工具可以基于状态机图所显示的行为,自动生成符合生产环境质量要求的摞代码。

状态机图的缺点在于,它所能够描述行为的模块,都必须真正拥有定义好的状态。然而, 并非所有模块都拥有定义好的状态。

什么时候创建状态机图

因为状态机行为最常用作模块的分类行为,所以你可以创建状态机图来描述系统层级关系中任何级别模块的行为(像系统本身、子系统或者单独的组件) 。因此,你可以在系统生命周期的任意时间点创建状态机图。

状态机图外框

状态机图的外框表示你已经在系统模型中某处定义的单一状态机。

状态机本身是一种模型元素。和交互以及活动一样,它是一种行为。和交互、活动、模块和包一样,状态机是一种命名空间类型。因此它可以包含模型层级关系中一系列命名的元素一一特别是定点和转换。那些被包含的元素可以显示在相关状态机图的外框中。

此处的关键是,状态机和状态机图并不是一个概念。当使用状态机这
个术语的时候,指的是一种模型元素而不是图。

显示在外框中的元素一一顶点和转换一一在模型层级关系中都包含在(内嵌在)这个状态机中。

image-20220714093316858

状态

一个系统(或者系统中的一部分)有时会拥有一系列定义好的状态,在系统操作过程中可以处于那些状态。状态的概念很难正式定义,但比较容易从现实世界的例子中推导出。最简单的一个例子就是通过拉线开关打开和关闭台灯。台灯有两种定义好的状态: On 和Off。

软件对象也一样,可以拥有定义好的一系列状态。例如, 一个文件可以处于以下状态: Open 、Closed 、Modified 、Unmodified 、Encrypted 、Unencrypted 等等。有的状态只有在其他状态的情境中才有意义。例如, Modified 和Unmodified 只有在文件处于Open 状态的时候才有意义。正式情况下,我们会把Open 叫做复合状态。Modified和Unmodified 都是Open 状态的子状态。没有任何子状态的状态叫做简单状态。

除了简单状态和复合状态之外,另一种常见的状态类型是最终状态。

简单状态

简单状态的标识法是一个圆角矩形,通俗的叫法是圆角( round-angle )。

SysML没有为状态指定任何命名规范。(而为状态起一个有意义的名称通常是创建状态机最困难的一部分工作。)

简单状态还可能会显示第二个分隔框,其中会列举它的内部行为和内部转换。SysML 定义了三种状态可以执行的内部行为: entry 、exit 和do 。

这三种内部行为都显示为状态的第二个分隔框中的字符串。每种行为都可选地处于一种特定状态。在显示的时候,字符串会以那三个关键宇开始一-e ntry 、exit 和do一一后面是一条斜线,之后或者是一个不透明表达式,或者是你在系统模型某处创建的行为的名称。

image-20220714093937161

不透明表达式是对行为的声明,它会因为语言的不同而不同。如果你指定了存在于模型中的行为的名称,那么它可以是Sy sML 中定义的三种类型之一: 活动,交互或者另一个状态机。(然而,对于entry 、ex it 或者do 行为来说,不透明表达式很少会是另一个状态机。)

如果存在的话,那么状态的entry 行为就会是进入那个状态执行的第一个行为。entry 行为是一种原子行为(不可中断) 。这意味着,在状态机处理新的事件之前(可能转换到另一种状态),要确保它执行完成。

如果存在的话,状态的exit 行为是离开那种状态之前执行的最后一个行为,当事件导致状态机转换到新的状态时,它才会发生。和entry 行为一样, exit 行为也是一种原子行为。也要确保可以执行完成;没有任何新的事件可以中断它的执行。

你要了解的重要一点是,在转换到新的状态之前,一个状态机可能会在一段不确定的时间里,停留在某种特定状态下。这意味着其他行为可以在状态的entry 和exit行为之间执行。

如果存在的话,状态的do 行为会在进入状态的时候开始执行,就在状态的entry行为之后。do 行为和entry 行为之间关键的区别在于, do 行为是非原子行为; 它的执行可能会被新的事件发生所中断,而那个事件会导致转换到新的状态。因此,do 行为在发生两件事情之前保持执行,一是被事件发生所中断(状态机转换到新的状态),二是自己结束(可能在下一个事件发生之前) 。

如果do 行为被事件发生所中断,那么do 行为就会被取消,然后针对那个状态的exit 行为就会执行(就在离开那个状态之前) 。

复合状态

复合状态的标识法和简单状态一样: 圆角矩形。和简单状态一样,复合状态拥有一个名称分隔框,还有另一个分隔框,你可以显示可选的extry 、exit 和do 行为。区别在于,符合状态拥有内嵌的子状态,可能会在第三个分隔框中显示(位于第二个分隔框之下) 。

在状态机中的复合状态和状态机总体之间有几点类似的地方。当复合状态处于非活动的状态时,它所有的子状态都是非活动的。当复合状态是活动的,那么它的子状态之中会有一个是活动的。

在活动的状态下,复合状态会对事件发生做出响应,从一种子状态转换到另一种子状态。子状态之间的转换的形式,和状态之

间的转换是同样的。

复合状态只是把子状态分类组合在一起。

下图这个复合状态拥有两个子状态: Have Comm Link 和No Comm Linko
当On-Station 活动时,它会对com.mLink:Restored 和commLinkLost 事件做出响应在两个子状态之间转换。

复合状态可能从其边界跳出,也可能从特定的内嵌子状态跳出。

image-20220714094943751

最终状态

最终状态的标识法是一个大圆圈包围小的实心圆。

如果Attitude Control 状态机处于Slew 或者On-Station 状态,发生了deorbit 事件,那么状态机就会转换到最终状态。这代表总体上状态机行为的完成;从那以后,它不会再对新的事件发生做出响应。

image-20220714095407849

转换

转换代表的是从一种状态向另一种状态的改变。此外,它还可以表示从一种状态到其自身的改变一-SysML 称之为自我转换。

转换的标识法是带有开放箭头的实线,从源顶点画向目标顶点(在此源和目标可能是同一个顶点,这会出现在自我转换的情况下) 。

最常见的情况下,源和目标顶点都是状态。然而,它们也可以是伪状态。

每个转换都可以指定三种可选的信息:触发器、守卫和影响。

<trigger> [<guard>] I <effect>

触发器必须与你在系统模型中定义的事件名称相匹配。SysML 定义了四种类型的事件:信号事件、调用事件、时间事件和改变事件。

守卫是一个布尔表达式,总是显示在方括号之间。那个表达式会在特定的时刻估值为真或假。当状态机接收一个与触发器匹配的事件发生时,只有守卫在特定时刻为真,转换才会执行。如果它的守卫在那时为假,那么转换不会执行,而事件发生就会被消费,且不会对状态产生任何改变。

影响是在转换过程中执行的行为。和entry、exit 和do 行为一样,影响或者是一个不透明表达式,或者是你在系统模型中某处定义的行为的名称。需要再次强调的是,那个行为可以是一个活动、一个交互或者另一个状态机。

下图是从Offline 状态到Online 状态的转换有一个触发器、一个守卫以及一个影响。触发器是名为startUp 的事件,它会通过参数sensorID 向状态机传人一个值。这个特定的事件恰好是一个调用事件,但是在这个部分对转换的讨论也同样适用于其他三种类型的事件。

这个转换拥有守卫isPowerAvailable == True 。当Start Up 事件发生的时候,如果这个守卫估值为假,那么StartUp 事件发生就会被消费,而状态、机仍然保持Offline状态。当StartUp 事件发生的时候,如果这个守卫的估值为真,那么转换就会执行(状态机会从Offline 状态转换为On line 状态)。

image-20220714101311781

这个转换拥有名为calibrate 的影响。这个行为可以是在系统模型中某处存在的一个活动、一个交互,或另一个状态机。遗憾的是,状态机图并没有提供方式让我们指定行为类型。关键在于,这个影响会在转换执行的时候执行(正如在上一段中所描述的) 。

转换的影响是更大的行为序列的一部分,它们会在转换触发的时候执行。我们把那个行为序列叫做执行到完成( run-to-completion )步骤。执行到完成步骤按照列举的顺序拥有以下行为:

  • 源状态的exit 行为
  • 为转换本身指定的effect
  • 目标状态的entry 行为

这整个行为序列是原子和瞬时的,它会被确保执行完成。任何新的事件发生都不会中断这个序列中任何行为。只有在整个运行到完成步骤执行完成后,状态机处于一种新的(目标)状态时,才能够接收并处理新的事件发生。

当图8.5 中的状态机从Offline 状态转换到Online 状态的时候, initialize 行为就会被执行,然后是calibrate 行为,最后是updateSensorStatus 行为。当整个执行到完成步骤都执行完成之后,状态机会维持Online 状态,并准备好接受新的事件发生。

外部转换与内部转换

有两种转换:外部转换和内部转换。在上一个部分中,我描述了外部转换,但没有那么称呼。(因为外部转换是更常见。)

简单说来,只要一个箭头从一种状态画到另一种(或者从一个状态回到本身),那就是外部转换。

内部转换的字符串格式和外部转换的一样。然而,内部转换的字符串会显示在状态( 和三种可选的内部行为一起)的另一个分隔框中;和外部转换相对比,内部转换的字符串不会显示在箭头旁边。

标识法上的区别反映了内部转换和外部转换之间概念上的区别: 当状态中的内部转换触发时,状态机并不会因为转换而脱离那种状态。这意味着内部转换和外部转换之间的另一个关键区别:当状态、中的内部转换触发时,那个状态的exit 行为和entry行为(如果存在的话)都不会执行。简而言之,当内部转换触发的时候,唯一被执行的行为就是为那个内部转换指定的effect 。

这个内部转换的触发器是一个改变事件:
when (availableMemory < dataPerOrbit)
这个转换没有任何守卫。(如果拥有的话,那么就会显示在触发器后面的方括号中,就和外部转换中一样。)因此,当特定的改变事件发生时一一也就是当括号中的布尔表达式变成真的时候一一这个内部转换就会被触发。在这样的情况下,唯一被执行的行为就是为转换所指定的影响: purgeOldestDataFiles 行为。

image-20220714102525238

事件类型

SysML 定义了四种类型的事件:信号事件、调用事件、
时间事件和改变事件。

在讨论每种类型的细节之前,重要的是要了解事件的根本:事件是在系统模型中定义的一种元素,它定义了能够在实际系统中触发行为的事件类型。在系统操作过程中,特定的事件可能会发生多次。每次事件发生的时候,它的发
生都可能会触发行为新的一次执行。

事件发生如何触发状态之间的转换。

信号事件

信号事件代表能够接受信号实例的目标结构接收它的过程; 这里的目标是执行状态机行为的结构。

如果状态机拥有具备信号事件触发器的转换,那么执行状态机的结构就必须拥有具有相同名称的接收。

image-20220714103634541

调用事件

调用事件代表接收请求的过程一一从调用结构发送的请求,以触发目标结构中的一项操作。

image-20220714104535099

调用事件触发器和信号事件触发器之间有类似之处。事实上它们完全相同。因此,看图者并没有可靠的方式,基于状态机图本身区分这两个部分。他们可能需要查询模型,以找到拥有状态机的模块,并通过查看它的操作和接收来确认。

时间事件

时间事件很直观;它代表时间中的实例。

有两种类型的时间事件:相对的和绝对的。我们很容易识别时间事件触发器,它们不像调用事件触发器和信号事件触发器那样,难以通过标识法区分。相对时间事件触发器总是以关键词after 开头。绝对时间事件触发器总是以关键词at 开头。两种类型后面都会跟着括号中的时间表达式。

绝对时间事件的时间表达式可以具体,也可以宽泛,这完全取决于你需要它们怎么样一一例如, at ( 3:00 a.m. GMT )、at ( Monday )、at ( 3:00 a.m. GM飞Monday, March 4,2013 ) 。然而,要记住的是,如果你的时间表达式足够一般化,那么时间事件就会发生多次。时间表达式at ( 3:00 a.m . GMT )会导致每次到达那个时刻都会有新的事件发生。那个时间事件每次发生都会触发状态机中的另一次转换。

相对时间事件的时间表达式总是会写成时间区间,例如: after ( I min )、after ( 50ns )、after ( 1 month ) 。经过指定量的时间之后,相对时间事件就会发生, 而那个事件的发生会触发状态机中的转换。

当状态机从Have Comm Link 状态向No Comm Link 状态转换的时候,相对时间事件计数器就会启动。如果两分钟过去,而系统处于No Comm Link状态,那么就会发生相对时间事件,向Safe Mode 状态转换的输出就会触发。

当然,那也可能不会发生。当系统处于No Comm Link 状态的时候,在两分钟结束之前,可能会发生commLinkRestored 信号事件。如果稍后状态机回到No CommLink 状态,那么相对时间事件计数器就会重置,并重新回到那种状态。

image-20220714110030583

改变事件

改变事件被定义为布尔表达式。在系统操作过程中,每当特定的布尔表达式从假切换为真的时候,定义好的改变事件就会发生。和时间事件触发器一样,改变事件触发器很容易识别;它总是以关键词when 开头,布尔表达式放在后面的括号中。

布尔表达式可以包含通过其他事件发生传入到状态机的参数,也可以是状态机本身拥有的属性,或者执行状态机的模块所拥有的属性。

image-20220714110225670

伪状态

状态机可以包含两种顶点:状态和伪状态。二者之间很好区别。状态
机可以在状态中暂停,但无法在伪状态中暂停。

你之所以向状态机添加伪状态,是为了在状态之间的转换上指定控制逻辑。

SysML 定义了丸种伪状态。然而,大部分情况下你只需要两种: 初始伪状态和连接伪状态。

初始伪状态表示状态机开始执行时的第一个状态(或者当复合状态变成活动状态时的第一个子状态) 。初始伪状态的标识法是一个小型的实心圆。它不允许拥有任何输入的转换,而输出的转换也不允许拥有触发器或者守卫。若非如此,就意味着状态机可能会在初始伪状态中暂停,等待一个事件发生,或者等待守卫成为真,而状态机是不允许在伪状态中停留的。

输出的转换则可以拥有一个影响。

当Camera Control 状态机被触发的时候, initialize 行为会被执行,而状态机会从Idle 状态开始启动。让我们回顾一下,转换影响是运行到完成步骤的一部分,它应该是原子和即时的。因此状态机应该在I dle 状态立即启动,在执行initialize 行为的过程中不会消耗任何时间。

连接伪状态可以把状态间的多个转换组合成一个(更可读)的复合转换。连接伪状态的标识法也是一个小型的实心圆一一通常要比初始伪状态更小一些。

伪状态不同的是,连接伪状态必须拥有一个或多个输入转换,以及一个或多个输出转换。事实上,单个伪状态可能同时拥有多个输入的转换和多个输出的转换。

带有多个输入转换的连接伪状态可以作为从多个游、顶点的合并转换,所有那些顶点都拥有同样的目标顶点。

带有多个输出转换的连接伪状态可以作为决定点,它会导向多个可选目标顶点中的一个。在这种情况下,每个输出转换都必须拥有一个指定的守卫。当触发事件发生的时候,守卫估值为真的转换就是将被触发的那个。如果那个时候恰好所有守卫都为假,那么状态机就会保持当前状态。可以选择在(最多)一个转换上指定守卫else,以确保每次做出决定的时候都会触发一个转换。

image-20220714112449738

区域

和活动以及交互一样,状态机可以表示并发行为。通过向状态机添加多个区域,你可以做到这一点。每个区域都包含自己的系列顶点和转换。每个区域都会独立对事件发生做出响应。因此,我们说区域是彼此正交的。

在系统操作的任意时刻,每个区域都必须只拥有一个活动状态。换种说法,在状态、机行为的执行过程中,状态机在多个状态中并发(每个区域一种状态) 。

在处于不同区域的两个顶点之间绘制转换是非法的。

image-20220714112922286

总结

状态机图可以说明系统基于状态的行为对事件发生做出的响应。并非系统中所有结构都拥有定义好的系列状态,并且带有那些状态之间的转换。对那些有状态的结构,状态机是唯一,可以用来和利益相关者沟通那些结构行为的媒介。

种说法,在状态、机行为的执行过程中,状态机在多个状态中并发(每个区域一种状态) 。

在处于不同区域的两个顶点之间绘制转换是非法的。

[外链图片转存中…(img-E6bQZhcI-1657769719072)]

总结

状态机图可以说明系统基于状态的行为对事件发生做出的响应。并非系统中所有结构都拥有定义好的系列状态,并且带有那些状态之间的转换。对那些有状态的结构,状态机是唯一,可以用来和利益相关者沟通那些结构行为的媒介。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木头人的星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值