SysML实践指南第二版(中文翻译:刘亚龙)第11章 状态机

  1. 建模基于事件的行为使用状态机

本章描述如何使用状态机来建模模块的行为,以及状态机对内部和外部事件的响应。

    1. 概述

状态机典型的被使用在SysML中,描述一个模块的状态依赖行为,贯穿它的生命周期根据它的状态和它们之间的转变。模块的状态机可以被启动,例如,当模块的状态机启动时,随后在响应不同的激励多个状态之间转变,在状态机完成关机时终止。在每个状态中,模块可以执行不同的动作集。状态机定义了模块的行为如何随着它的不同状态变化。SysML状态机可以用来描述很广泛范围的状态相关的行为,从简单的灯开关的行为,到先进复杂的飞机模型。

状态机通常由模块拥有,并执行该模块的一个实例语境中(一个包有一个状态机是可能的,但这种情形有很多限制,所以这种特别的使用不包含在这里)。状态机的行为指定通过一组区域集,每个区域定义了它自己的一组状态。在任何区域内部状态是唯一的;即当区域是激活的时,它的一个子状态也是激活的。一个区域通常有一个初始伪状态,当该区域开始执行时,它首先被执行。当进入一个状态时,一个(可选的)entry行为(例如,一个活动)被执行。同样在退出一个状态时,可选的exit行为被执行。处于状态中时,状态机可以执行do行为。区域通常也有一个最终状态,当这个最终状态处于激活时,标志着该区域执行完成。状态的变更通过原始状态连接到目标状态的转变实现的。转变由触发器(triggers)、看门狗(guards)和影响(effects)定义。触发器表示一个引起源状态转变的事件,看门狗进行评估测试转变是否是有效的,和影响是一个转变触发后执行的一个行为。触发器可以基于各种事件,诸如,定时器的到期,或接收到状态机的拥有对象的一个信号。

连接(Junction)选项(choice)伪状态,支持在状态之间使用多个看门狗和多个影响构建组合转变(compound transitions)。在拥有的模块上的操作调用也是转变的有效触发事件。

不同模块的状态机可以通过发送信号或调用操作相互交互。例如,某个模块的状态机可以发送信号给另外一个模块,作为转变影响或状态行为的一部分。事件对应这个信号的接收通过接收模块可以触发一个状态转变在它的状态机中。类似地,模块的状态机可以调用另一个模块上的操作,导致触发一个转变的事件。

当一个状态包含区域时,状态层次会出现。一个状态仅在一个区域内是最常见的情形并被称为一个状态。一个状态处于超过一个区域被称为一个正交组合状态。最后,一种状态类型称为一个子状态机可以引用另外一个状态机。为了建模状态层次的有效性,附加的构件被需要。fork(分叉)join(结合)伪状态,被需要来指定转变到正交组合状态和它的外部。入口点出口点伪状态使用来添加连接点对应转变在状态或状态机的边界上。

状态机也可以被用来定义持续的行为,在这种情形下,一个模块的一组分离状态集,并在那个状态中的变更,被定义根据持续变量的值,诸如,热和压力。

状态机可以被使用结合其它行为。状态机可以使用另外一种行为(例,一个活动)来指定,或当一个转变开始时,什么发生在状态的入口店和出口点。状态机也使用在交互(参考第10.7.3节)和活动中(参考第9.11.3节)来约束它们行为的一些方面。不同类型行为的语义整合有时比较复杂,所以应该仔细使用。

    1. 状态机图

状态机图有时称为状态图表或状态图,但在SysML中,实际的名称显示状态机图。状态机图的标题如下:

stm [State Machine] state machine name [diagram name]

  • 对应一个状态机图的图的类型:stm
  • 模型元素类型常常是状态机。由于这一点,模型元素类型在方括号中通常省略。

图11.1显示许多描述状态机的基础符号元素。它描述一个状态机对应ACME Surveillance System。开始处于Idel(空闲)状态;在它的生命周期内运行穿过一系列状态后;并最后再次终止于Idel状态,当它接收一个Turn Off(关闭)信号,引起它来关闭。状态机图的符号被显示在附录表A.21到A.23。

    1. 在一个状态机中指定状态

状态机是一个潜在的可重用的一些依赖状态行为的定义。状态机典型的执行在一个模块的语境种,并且所经历的事件可以引起模块实例的状态变化。

      1. 区域

状态机可以包含一个或多个区域,描述状态机状态相关行为。每个区域被定义根据状态和伪状态,统称为顶点,和这些顶点之间的转变。激活的区域精确的有一个激活状态在它内部。状态和伪状态之间区别是:区域不可能永远停留在伪状态,它仅存在来帮助确定下一步的活动状态。

11.1 一个状态机

带有多个区域的状态机可以描述一些发生在状态机模块内部的并发行为。这可以是一个模块内部的不同组成部分的行为的一种抽象,讨论在第7.5.1节。例如,一个工厂中的一个车间可以来存储来料,另外一个车间转变毛料到产品,和另一个车间发送完成的产品。状态机也可以包含并发行为,诸如,一个摄像头同时平移和转动,被执行通过多个组成部分。如果组成部分行为被指定,状态机之间的关系对应父模块和它的组成部分的行为应该被也被指定。状态也可以包含多个区域,正如描述在第11.6.2节,但本节仅描述简单状态即,状态没有区域和因此没有内嵌的状态

区域的初始和完成描述分别使用初始和最终伪状态。初始伪状态(initial pseudostate)使用来指定区域的初始伪状态。离开初始伪状态的转变可能包含一个影响(effect)(参考第11.4.1节获取一个转变影响的详细讨论)。此类影响被常常用来设置状态机使用的数值属性的初始值。当一个区域的激活状态是最终状态(final state)时,区域已经完成并且不需要更多转变发生在它内部。因此,最终状态可以没有持续的转变。

最终伪状态(terminate pseudostate)常常与一个完整的状态机的状态的相关。如果状态到达一个最终伪状态,随后状态机行为被终止。最终伪状态对到达所有状态机区域的最终状态有相同的影响。状态机的终止不暗示它拥有的对象销毁,但它意味着,那个对象将不再响应来自它的状态机的事件。

状态机或状态包含一个单一区域,它典型的没有名称,但如果它有多个区域,它们必须被命名。单一区域被表示通过在状态机图的框架区域内部。符号对应概念介绍如下:

  • 初始伪状态标志是一个填充的圆。
  • 最终状态标志是一个靶心标志;也即是,一个填充的圆被一个更大的中空的圆包围。
  • 最终伪状态标志显示作为一个X。
      1. 状态

状态在一个模块的生命周期中表示一些明显的条件,在一个模块的生命周期中,典型的由于它表示模块如何响应事件的一些变更,和它执行什么行为。这个条件可以是指定通过选择模块的属性的值,但典型的条件被表达通过对应它的区域的一个隐式的状态变量。使用比喻,模块被控制通过一个开关,在其中每个状态对应模块的一个开关位置,和模块可以展示一些特定的行为在每个开关位置。状态机定义所有有效的开关位置(即,状态)和开关位置之间的转变(即,状态转变)。如果有多个区域,每个区域被都由它自己的开关控制,它的开关位置对应它的嵌套状态。开关位置可以被指定通过一种格式的事实表,类似于逻辑门如何可以被指定,在它的当前状态和转变定义下一个状态。

每个状态可以有进入(entry)和退出(exit)行为,分别被执行无论何时进入或退出状态。此外,状态可以执行do行为,entry行为完成后它执行do行为持续来执行直到它完成或状态被退出。尽管任何SysML行为可以被使用,典型的entryexitdo行为是活动或不透明的行为。

状态被表示通过一个圆角的盒子包含它的名称。entry和和exitdo行为被描述为前面的关键字的文本表达式entry、exitdo和一个‘/’。文本表达的内容有一定的灵活性。行为是不透明的行为,文本表达典型的是行为的名称,可以使用不透明的行为体来代替(参考第7.5节获取一个描述关于一个不透明的行为)。

图11.2显示一个简单的状态机对应Surveillance System, 在它的区域有一个单一的operating状态。从区域的初始伪状态到operating状态的转变。在entry时,监控系统显示所有操作员控制台的操作事实,在exit上,它显示一个关闭状态。而监测系统处于操作状态,它执行,通过一个do活动,它是监控站点的标准功能;也即是,监控建筑,在它被安装的对应任何没有授权的进入。当处于operating状态时,一个Turn Off信号触发一个转变到最终状态,由于仅有一个单个区域,状态机将终止。

11.2 状态机包含一个单个状态

    1. 状态之间的转变

状态有一个变更发生在一个状态机内部时,一个转变被指定。状态机一直运行直到一个转变被触发,这意味着,它们不能消耗另外一个触发器事件直到状态机完成处理当前的事件。

      1. 转变基础

转变可以包含一个或多个触发器(trigger)一个看门狗(guard)、和一个影响(effect)描述在下面。

        1. 触发器

触发器标识可能的激励,其引起一个转变发生。四个主要类型的触发事件是:

  • 信号事件:说明一个新的异步消息对应一个信号已经到达。信号事件可以伴随许多参数,其可以使用在转变影响中。
  • 时间事件:说明或一个给定的时间间隔,传递由于当前的状态被进入(相对的),或一个给定的时间常量已经达到(绝对的)。
  • 变更事件:说明一些条件被满足(正常情形下持有一组特定的属性值集合)。变更事件被讨论在第11.7节。
  • 调用事件:说明一个操作在状态机占有的模块已经被请求。调用事件也可以被陪伴通过许多参数。调用事件被讨论在第11.5节。

一旦一个状态的entry行为已经完成, 无论在状态内发生了什么转变可以被触发通过事件。例如,一个转变可以被触发,而同时一个do活动正在执行,在这种情形下,do活动被终止。

默认情况下,事件必须被消耗,当它们提交到状态机时,即使它们不能触发转变。然而,事件可以被明确的推延,而在一个特定的状态对应的随后处理。延迟事件没有消耗,只要状态机保持在那种状态。一旦状态机进入一个状态,在其中事件不被延迟,在任何其它之前事件必须被消耗。事件触发一个转变或它被消耗没有任何影响的任何方式。

转变也可被触发通过内部生成完整事件completion events)。对于一个简单的状态, 当entry行为和do行为已经完成时,一个完整事件被生成。

        1. 看门狗(guard)

转变的看门狗包含一个表达式,必须评估为true时转变才发生。看门狗被指定使用一个约束,介绍在第8章,其包含一个文本表达式来表示看门狗条件。当一个事件满足一个触发时,如果在转变存在看门狗,被评估。如果看门狗评估为true,转变被触发,如果看门狗评估为false,随后事件被消耗并没有影响。看门狗可以测试状态机的状态使用操作符in(stae x)not in(state x)

        1. 影响(Effect)

转变的第三个部分是转变影响。影响是一个行为,正常情形下一个活动或一个不透明的行为,执行转变从一个状态到另外一个。对应一个信号或调用事件,相应信号或操作的变量可以是直接使用在转变影响内部,或变量可以被赋值到占有状态机的模块的属性。转变影响可以是一个任意的复杂行为,其可以包含发送信号动作或操作调用用来与其它模块交互。

如果转变被触发,随后首先当前状态(源)的exit行为被执行,随后转变的影响被执行,和最后目标的entry行为被执行。

状态机可以包含转变,称为内部转变,其不影响一个变更在状态中。内部转变有相同的源和目的,如果被触发,简单执行转变影响。相反的,外部转变使用相同的源和目标状态有时称为一个“转变到自身”触发执行,状态entryexit行为以及转变影响内部转变的一个经常被忽视的结果是那个,由于状态不是退出和进入,计时器对应的相对时间事件没有重设置。

        1. 转变符号

两个状态之间的转变被显示作为一个箭头,箭头指向目标状态。转变到自身的箭头显示两个终点附着到相同的状态。内部转变没有显示作为预先路径,但被列举在分离的行内部使用状态标志,正如显示在图11.9。

转变行为的定义被显示在一个格式化的字符串在转变上首先使用触发列表,跟随一个看门狗在方括号中,和最后转变影响预先通过一个‘/’。第11.4.3节描述一个备用的图形化语法对应转变。

文本对应一个触发器依赖于事件,如下:

  • 信号和调用事件:信号或操作的名称随后可选的通过属性分配在括号中的一个列表。典型的,调用事件被区分通过包含括号,即使当没有属性赋值。尽管这是一个有用的约定,它不是标准符号的部分
  • 时间事件:术语afterat跟随通过时间;after说明时间是相对到时刻,当进入状态之后;at说明时间是一个绝对的时间。
  • 变更事件术语when紧随通过条件,其不得不适合在括号中。像其它约束表达,条件被表达在文本使用表达式语言可选的在括号中。

影响表达式可以或是调用行为的名称或可以包含一个不透明的行为的文本

当一个事件被延迟在一个状态中,事件被显示在状态标志额一侧对应状态使用文本对应触发紧随通过一个“/”和关键字defer。参考图11.12对应的一个例子。

转变也可被命名为,在这种情形名称可以出现沿着转变代替转变表达式。名称有时是一个有用的沙漏对应一个非常长的转换表达。

图11.3 显示一个比图11.2更复杂的监测系统的状态机,带有所有的主要状态和它们之间的转变。与图11.2相比,初始伪状态说明区域开始处于idle状态。从空闲状态触发通过接收一个Turn Off信号到达最终状态。一旦处理被完成在initializing状态(参考图11.14来查看initializing状态的内部),对应initializing的一个完整的事件将被生成,其触发两个持续的转变。如果条件变量的init OK状态为true,系统进入operating状态。否则,系统进入diagnosing状态在一个操作者将查看错误日志并试图手手工初始系统。尽在一些事情发生的和测试过程没有完成情形下,系统有一个时间-输出在60秒后,其返回系统的idle状态。

diagnosing状态,操作者说明成功使用System OK信号,其允许系统进入操作状态。System KO信号表明,系统处于操作者维修中并引起一个转变返回到idle状态。从operating状态,一个Shutdown信号将引起转变到shutting down状态,只要操作状态处于logged on子状态(参考图11.9对应一个视图在operating状态内部)。作为关闭的部分,系统请求一个确认和将仅退出shutting down状态,当它接收一个Shutdown确认信号, 其中除了它执行关闭摄像机活动。

11.3 状态之间的转变

除非图形化符号对应转变被正在使用(参考第11.4.3节),转变影响,带有不透明行为的异常,被指定在独立的图上对应行为的类型。图11.4显示Shut Down Cameras活动图。

当调用作为一个转变影响时, Shut Down Cameras循环所有已知的摄像头并对每个发送Shutdown信号。注:活动不包含一个接收事件动作; 这将使调用状态机处于一个不明确的一个中间转变(mid-transition)状态,等待新的事件发生。

      1. 路由转变使用伪状态

多种情况下,直接表示两个状态之间的转变语义是不充分的时,需要附加语义说明。SysML提供多种伪状态类型来支持这些附加语义的表示。本节介绍连接(junction)选项choice)伪状态,它们支持转变状态之间的组合。

11.4 使用一个活动定义一个转变影响

连接伪状态(junction)被使用来构建状态之间的一个组合转变路径。组合转变对比使用一个简单的转变通过允许状态之间有超过一个可选的转变路径被指定,尽管仅一条路径可以被采用响应任何单个事件。多个转变或可以收敛到或偏离连接伪状态。从一个连接伪状态有多个传出的转变,所选的转变将是那些在触发事件被送达处理时进行评估为‘true’的那些中的一个。如果超过一个看门狗评估为true,SysML不定义一个有效的转变被选择对应执行。如果一个特定的组合转变路径在两个状态之间包含超过一个连接伪状态,在组合转变发生前所有看门狗沿着路径必须评估为true

选项伪状态(choice)也有多个输入转变和输出转变类似连接伪状态是状态之间的一个组合转变的部分。选择伪状态行为被区分与一个连接伪状态,那个看门狗在它的持续流出转变不被评估直到选项伪状态已经到达。这允许影响执行优先于转变到影响选项伪状态的持续流出。当选项伪状态被达到在一个状态机的执行时,必须一致至少一个有效的持续流出转变。如果不是,状态机是无效的。一种技术常常被使用来确保一个选项伪状态的有效性是来使用一个全方位的看门狗在多数一个输出转变上。这被指定使用关键字else。是否一个组合转变包含连接伪状态选项伪状态,或两者,任何可能的组合转变必须仅包含一个触发器,正常情形下在路径中的第一个转变。

多个路由伪状态被表示如下:

  • 连接伪状态像一个初始伪状态显示,作为一个填充的圆。
  • 选项伪状态显示作为一个钻石。

图11.5完整的状态机对应监控系统显示在图 11.3。处理关闭已经被提高来描述什么发生如果操作符不实际需要关闭系统总之。Confirmation Response信号的变量,其使用Yes或No,被映射到属性r。转变触发通过Confirmation Response信号现在终止在一个连接伪状态,带有带个即将离开的转变使用不同的看门狗。如果r=="yes" ,随后系统关机处理;如果r=="No" ,随后系统返回到操作状态。

转变从关闭到空闲/操作能被指定使用一个连接伪状态在图11.5中,根据r的值,需要来确定完整的转变路径,可用作为转变触发的部分。然而,图11.6显示另外一种方法到系统关闭不需要一个shutting down状态。在这里,确认请求是作为转变的operating状态的输出,所以r的值是不知道,直到组合转变的第一回合后已采取。在这种情况下,选项伪状态是需要让r值返回确认关机,用于看门狗在它自己的退出转变上。如前所述,建模者必须确保总是有一个选项伪状态一直至少有一个有效的路径,所以在转变上的看门狗已经被变更为[else]为了处理任何其它值而不是Yes。随后,即使Confirm Shutdown不期望的返回一个值,而不是Yes或No,状态机将一直运行。

11.5 路由转变

11.6 指定关闭使用一个选择伪状态

      1. 图形化显示转变

一些建模者更喜欢图形化的显示转变在状态机图。SysML引入一组特定标志集其允许一个建模者图形化的描写触发器,带有发送信号动作,和其它动作;它们的图形化语法如下:

  • 一边有一个三角形的缺口的矩形表示所有转变的触发器, 在标志内部带有触发事件的描述和转变看门狗。
  • 一个矩形带有一个三角形附着到一侧表示一个发送信号动作。信号的名称,连同被发送的任何参数,都显示在符号中。有许多发送信号动作在一个单个转变影响中,每个有它们自己的标志。信号是非常重要的,当状态机之间进行通信时,因此对这个动作的单独处理。
  • 任何其它动作在转变影响中被表示通过一个矩形,包含描述将被采用的动作文本。有许多动作作为一个转变影响的部分, 每个有它们自己的标志。

图11.7显示转变符号的使用来提供一个转变的等效定义在操作、空闲,和关闭,原始的显示在图11.5。

11.7 面向转变的符号

    1. 状态机和操作调用

状态机可以响应在它们的父模块上的操作调用通过调用事件。一个调用事件可以或者被处理以一个同步的方式—也即是,调用者被模块化同时等待一个响应—或异步地,其导致类似的一个信号的接收的行为。状态机执行所有动作触发通过调用事件指导它达到另外一个状态,和随后返回任何输出生成通过动作到调用者。

通过监控系统的操作者使用的一个组件是一个视频播放器,其允许它们查看记录的监控数据。Video Player模块显示在图11.8,提供一组操作在它的接口中来控制回放。尽管许多操作不返回数据,它适合任何视频播放器的客户端来等待直到一个请求对应这些操作已经被处理;因此, 它是有意义的,它的接口定义使用操作。模块的响应到模块的请求从这些操作被定义使用状态机显示在图11.8,在其调用的事件关联到操作被使用作为在转变上的触发器。调用来play、stop、pauseresume操作引起调用事件,其触发多个Video Player状态之间的转变在。调用来操作 next chapter、previous chapterget play time引起调用事件,触发内部转变到状态playing。为了简化例子,图11.8不显示转变的许多影响,但它显示一个请求get play time,获得它返回的变量。

11.8 一个状态机驱动通过调用事件对应操作在它拥有的模块上

    1. 状态层次

正如状态机可以有区域,区域可以有状态;此类状态被称为组合或状态层次。这些允许状态机来缩放表示任意复杂的基于状态的行为。本节讨论组合状态使用单个和多个区域,和一个已经存在状态机的重用来描述一个状态的行为。

      1. 组合状态与一个单个区域

可以认为最常见的情况是一个组合状态有一个单一区域。状态的封闭区域被激活时,一个状态内嵌在一个区域内部仅被激活。因此,开关位置模拟描述在第11.3.2节可以应用到内嵌的状态通过请求,对应封闭状态的开关位置被启用,以便使开关位置对应于它的任何一个内嵌的状态可以被启用。

正如前面陈述的,一个区域将典型的包含一个初始伪状态和最终状态、一组伪状态集和子状态,它们自身可以是组合状态。如果区域有一个最终状态, 当那个状态被到达时,随后一个完整的事件被生成。

当一个初始伪状态丢失在一个组合状态的一个区域,那个区域没定义初始状态,尽管添加它们自身的语义扩展到SysML是免费的。然而,一个组合的状态可以是多孔的;也即是,转变可以交叉在状态边界上,开始或终止在状态上在它的区域内部(参考图11.10)。在一个转变终止在一个内嵌的状态的情形下,组合状态的entry行为,如果有的话,执行在转变影响之后和转变的目标状态的entry行为之前。想反的情形,组合状态的exit行为被执行在源状态的exit行为之后和转变影响之前。在更深入的内嵌的状态层次结构的情况下,相同的规则可以被递归到所有组合状态,它们的边界已经交叉。

图11.9显示自图11.5的operating状态的分解来到它的子状态。在进入到操作状态上,2个entry 行为被执行:operatingentry行为,Display “Operating” status;logged in=0 ;和logged offentry行为, Display “Logged Off.”。这是由于在entry上,正如说明通过初始伪状态,operating的初始子状态是logged off

11.9 状态内嵌在一个组合状态内部

当处于状态logged off,一个Login信号将引起一个转变到logged on状态和将增加logged in的值。当处于logged on状态时,重复LoginLogout信号将增加和减少logged in的值,常常作为内部转变不需要状态的一个变更。然而,如果一个Logout信号被接收,当logged in的值是1时,随后信号将触发一个转变返回到logged offlogged onentry为记录登录时间在变量time on中,和它的exit行为一起使用显示会话的长度。

operating状态没有一个最终状态,和所以正如上面描述的,一个完整的事件没有被生成。正如可以被查看在图11.5,这个状态被退出当一个Shutdown信号被表示。

只要监测系统的状态机处于operating状态,执行活动Monitor Site,或直达它达到自己的活动最终点。正如可以查看在图11.5,当一个Shutdown信号生成时,操作状态退出。

      1. 组合状态与多个(正交)区域

一个组合状态可以有许多区域,每个区域可以包含子状态。这些区域相互之间是正交的,所以一个组合状态带有超过一个区域有时称为一个正交组合状态(orthogonal composite state)。当一个正交的组合状态是激活的,每个区域有它拥有不依赖其它状态的激活状态,并且任何任何输入事件在每个区域中被独立分析。一个转变终止在组合状态上,将触发来自每个区域的初始伪状态的转变, 因此,必须每个区域的初始伪状态的这种转变是有效的。同样, 当所有区域处于它们的最终状态时,组合状态的一个完整事件将发生。

除了转变,开始于或终止在组合状态上,转变来自组合状态的外部可以启动或终止它的区域的内嵌状态。在这种情况下,一个状态在每个区域必须是一套协调的转变集中的一个开始或终止。这套协调被执行在输入转变的情况下通过一个分叉(fork)伪状态,输出转变的情况下通过一个联结(join)伪状态

当目标状态处于正交区域时,分叉伪状态有一个单一的传入的转变并有多个传出的转变正如。不像连接和选项伪状态,分叉伪状态的所有传出的转变是组合转变的部分。当一个传入的转变被传输到分叉伪状态,所有传出的转变变化了。由于分叉伪状态的所有传出转变不得不被采用,它们可以没有触发器或看门狗,但可以有影响。

来自一个正交组合状态协调的传出转变被执行使用一个联结伪状态,其有多个持续传入的的转变和一个传出的转变。对应联结伪状态的触发器和看门狗与那些分叉伪状态方向是相反的。联结伪状态的输入转变可以没有触发器或一个看门狗,但可以有一个影响。传出的转变可以有触发器,一个看门狗,和一个影响。当所有传入的转变被采用时,联结伪状态的传出是有效的,组合转变可以发生。输入转变被首先采用并随后采用输出转变。这个的一个例子可以被查看在图11.10,其显示一个操作状态来自图11.5的可能分解。

11.10 进入和离开一个并发区域集

注:转变不能交叉在相同的组合状态的两个区域的边界上。因此一个转变, 如果被触发,将会离开一个没有活动状态的区域,其不被允许。

当一个事件与多个正交区域中的触发器关联,事件可以触发在每个区域中的一个转变,假设转变根据其它通用的准则是有效的。这个场景的一个简单例子被显示随后在图11.11。

组合状态内部的多个区域被表示通过状态标志内部分离通过虚线的多个舱段。区域可以选择的被命名,在这种情形名称出现在相应舱段的顶部。所有顶点在如此的一个舱段中是相同区域的部分。当一个正交组合状态没有其它舱段,宁愿来使用一个可选的符号对应一个状态,在其中状态的名称被放置在一个标签上附着到状态标志的外部。这个的一个例子可以被查看在图11.11。

分叉和联结伪状态被描述通过一个垂直的或水平的条,转变的边或在条的开始或终止。

11.11 转变发生顺序说明

图11.10显示一个operating状态的详细说明先前的图11.9。在这张图中,logged on 状态有2个正交的区域。一个区域为alert management,指定normalalerted操作模式的状态和转变;另外一个区域为route maintenance, 指定用于更新系统的自动监视功能时更新路由的状态和转换 (即,平移-和旋转的角度)。正如先前描述的,处于状态logged off,一个Login信号的接收触发转变到logged on状态。基于两个区域中的初始伪状态,logged on的两个初始的子状态:idle对应区域route maintenancenormal对应alert management。一个Alert信号接收触发转变从normalalertedalert management中。相似的,一个Edit Routes的接收信号触发转变从idlemaintainingroute management中。

为了确保合适的操作者监控系统,最后的操作符可以退出登录,如果logged on状态处于idlenormal子状态。这个约束被指定使用一个连接伪状态,它的传出转变被触发通过一个Logout信号带有一个logged in==1 门狗。2个即将传入的的转变到联结伪状态开始处于idlenormal,所以即使有一个Logout信号和logged on操作者的数字是1,传出转变来自联结伪状态将是有效的仅如果两个激活logged on子状态idlenormal。由于转变从idlenormal交叉在状态logged on的边界上,它的退出行为被执行在任何转变的影响上。执行的顺序触发通过一个有效的Logout 信号是因为:

  • logged onExit行为—Display “Session Length:”, now-time on
  • 传入的转变影响到联结伪状态—Display “Alerts:,” alert count
  • 传出转变影响来自联结伪状态—logged in=logged in-1
  • logged off的Entry 行为—Display “Logged Off”

已经详细说明了operating状态,它出现转变Logout [logged in > 1]Login是合适的内部转变而不是转变到自身。转变到自身常常退出和重新进入状态,它处于这种情形将重设route maintenancealert management的子状态;明显的在入侵者警报中这不是期望的!

      1. 在内嵌的状态层次中转变的发生次序

可能相同的事件可以触发转变在在一个状态层次中的一些级别,并使用并发区域的异常, 在同一时刻仅一个转变可以发生。优先权被给定到转变,源状态在状态层次中是最深层的。

考虑状态机 Machine 1,显示在图11.11,它的初始状态(即,在state1.1.1state1.2.1)。信号sig1关联到三个转变的触发器,每个使用基于变量x值的看门狗。注:在这种情况下,转变有一个名称和一个转变表达式,其中作为一个转变边通常会显示一个或另外一个。这已经执行来帮助解释状态机的行为。下面的列表显示转变,其将发生基于x的值从-1到1:

  • x等于-1:转变t1将被触发,因为它是唯一有效的看门狗的转变
  • x等于0:转变t2将被触发,因为虽然转变t1也具有有效的看门狗评估,state 1.1.1是两个源状态中最深层的。
  • x等于1:转变t2t3都将被触发,由于两个它们的看门狗都是有效的评估

exit行为执行应用常规规则,所以在转变从state 1state 2之前可以被进行, 任何state 1的激活内嵌的状态exit行为,以及状态机的exit行为,可以被执行。

例子在图11.11是相对简单的。评估转变优先权是很复杂的,当组合转变和转变来自正交的组合状态内部被使用。然而,相同的规则被应用。

      1. 返回先前的状态使用历史伪状态

在一些设计场景中,期望来处理一个异常事件通过中断当前状态、响应事件并返回到系统先前的状态。这被达到通过使用历史伪状态(history pseudostate)。历史伪状态表示它占有区域的最后的激活子状态,和一个转变终止在一个历史伪状态返回的那个区域状态有影响。来自历史伪状态的一个传出转变设计一个默认的历史伪状态。这被使用当区域没有先前的历史或它最后激活的子状态是一个最终状态。

历史伪状态有两种类型分别为:深度的和浅显的。深度历史伪状态(deep history pseudostate)记录状态层次下面的所有区域的状态和拥有深度历史伪状态的区域。浅显历史伪状态(shallow history pseudostate)仅记录它拥有的区域的顶层状态。作为一个结果,深度历史伪状态将使能一个返回到一个内嵌的状态,而一个浅显历史伪状态将仅能返回到顶层状态。

历史伪状态标志被描绘通过环绕圆圈的字母‘H’。深度历史伪状态在历史伪状态标志在圆的右上角添加一个小的星号。

监控系统支持一个紧急覆盖机制,正如显示在图11.12。在一个来自图11.10变更中,一个Override信号的接收,使用一个有效的密码,将一直引起一个转变从logged onlogged off状态,即使有一个持续的警报。这种转变被路由出封闭的operating状态通过一个退出点伪状态到emergency override activated状态(参考第11.6.5节的最后获取关于这一点的讨论)。然而, 一旦紧急情况结束,通过一个Resume Operation信号需要来恢复operating状态完整到它先前的状态,使系统可以继续其中断的活动。为了获得这一点,转变触发通过Resume Operation信号结束(通过一个入口点伪状态)在一个深度历史伪状态,将恢复完整的先前的状态包含operating的子状态。通过对比,如果一个浅显历史伪状态被使用,并且先前的操作的子状态是logged on,随后状态机会返回到初始的logged on状态而不是先前激活的logged on的子状态。

11.12 恢复从一个中断使用一个历史伪状态

Alert事件被延迟在emergency override activated状态,所以它们可以被处理,如果适当的,处于挂起operating状态。

      1. 状态机重用

状态机可以被重用通过一种类型的状态称为子机状态(submachine state)。终止在子机状态的转变将启动它引用的状态机,类似的,当引用的状态机完成时,完成事件触发源是子机状态的转变。建模者受益于两个附加的伪状态类型分别为入口点伪状态(entry-point pseudostates)出口点伪状态(exit-point pseudostates),其允许状态机来定义附加的入口和出口点,其可以被获取从一个子机状态。

        1. 状态机的入口点和出口点伪状态

对于一个单一区域的状态机,入口和出口点伪状态类似于连接伪状态;也即是,它们是一个组合转变的组成部分。它们流出看门狗不得不评估,在组合转变被触发前,并仅一个持续的转变将被采用。在状态机上,入口点伪状态仅可以有传出的转变和出口点伪状态仅可以有传入的转变。

入口和出口点伪状态被描绘通过小的圆,其重叠在一个状态机或组合状态的边界上。一个入口点标志是中空的,作为一个出口点的标志包含一个X。

图11.13显示一个状态机对应测试摄像头,称为Test Camera,它使用图形化的方式指定转变的形式。来自入口点的伪状态,第一个转变简单设置failures变量为0,并终止在一个选项伪状态上。在第一个入口上,状态机将一直采用[else]转变,其将导致发送一个Test Camera信号使用当前的摄像头数目(ccount)作为它的变量。状态机随后处于await test result状态直到一个Test Complete信号使用变量test result已经被接收。转变触发通过一个Test Complete信号终止在一个连接为状态,其或者导致pass出口点伪状态,如果测试通过, 或返回到初始的选项伪状态,如果测试失败, failures变量的值将增加。如果摄像头已经有自检测超过三次失败,随后转变使用看门狗[failures>3]评估将被采用到fail出口点伪状态。

11.13 一个状态机带有入口和出口点

        1. 子机状态

子机状态包含一个引用到另外一个状态机,其被执行作为子机状态的父的部分。引用的状态机的入口和出口点伪状态被表示在子机状态的边界上,通过指定特定的顶点称为连接点(connection points)。连接点可以是转变的源或目标连接到子机状态的外部状态。一个转变它的源或目标是一个连接点形成一个组合状态的部分,其包含转变到或来自相应的入口和出口点伪状态在引用的状态机中。这样的一个例子可以被查看在图11.14。在任何给定的一个状态机的使用中通过一个子机状态,仅入口和出口点伪状态的子集可以需要将被外部的连接。

子机状态被表示通过一个状态标志显示状态的名称,伴随引用的状态机的名称,分隔通过一个冒号。一个子机状态也包含一个图标显示在右下角描绘一个状态机中。连接点可以被放置在子机状态标志的边界上。这些标志被识别到入口和出口点伪状态标志使用在引用的状态机。注:仅那些连接点需要来被附着到转变边,需要被显示在图上。

图11.14显示监测系统的initializing状态。在入口处,ccoun (即,占有模块的一个属性,其计数正在测试的摄像头数目)和passed (即,一个属性,其计数通过自检的摄像头)分别被初始化为1和0。一个连接伪状态,其允许算法来测试作为正如需要的许多摄像头。为了测试每个摄像头,testing状态使用Test Camera状态机。转变离开pass出口点伪状态有一个影响,其添加一个到passed变量;转变离开fail出口点伪状态。两个转变终止在一个连接伪状态,它的输出转变增量计数正在测试的摄像头的数目。这种转变终止在一个选项伪状态上,带有一个输出的转变循环回到测试,一个摄像头if[ccount≤total camera 和另外一个到达initializing的最终状态。在转变到最终状态时,转变的影响设置init OK变量为true,如果至少一个摄像头通过它的自检测,和否则false

正如前面陈述,入口和出口点伪状态构成组合转变的部分,在子状态机的情形,合并转变(和它们的触发器、看门狗、和影响)来自包含的和引用的状态机。查看图11.13和图11.14,它可以被查看,组合转变来自initializing状态的初始伪状态将如下:

    1. 区域(单个)初始伪状态占有通过initializing状态
    2. 转变标签使用影响ccount=1  passed=0
    3. 转变命名为:t1
    4. 转变带有影响failures=0
    5. 转变带有看门狗[else](至少这个时刻)
    6. (图形化)转变影响发送Test Camera信号使用变量ccount
    7. 状态await test result

11.14 调用一个子状态机

        1. 入口点和出口点伪状态在组合状态上

入口点和出口点伪状态可以被使用在组合状态的边界上。如果组合状态有一个单一区域,它们属性像连接伪状态。如果组合状态有多个区域,它们的属性像分叉的入口点为状态的情况中,和联结在出口点伪状态的情形中。对于入口点伪状态,它们输出的影响转变执行在组合状态的entry行为之后。对于出口点伪状态,它们输入转变执行在组合状态的exit行为之前。入口点和出口点伪状态的一个例子可以被插件在图11.12。

    1. 对比离散和连续状态

到目前为止显示在本章中的例子都是基于离散语义的,具体的说,状态机中的触发事件是一个特定的激励(即,一个信号、一个操作调用、或一个时间的期望)。SysML状态机也可以被使用来描述系统使用转变,其被驱动通过分离的值或持续的数值属性。此类转变被触发通过变更事件。

一个触发器在一个转变上可以与一个变更事件相关,它变更地表达状态条件,典型的根据属性的值,其引起事件发生并因此触发转变。变更表达式有一个体包含表达式,并一个语言的使用的说明,其允许各种各样可能的表达式。

图11.15显示一个非常简单的状态机,称为Lamp Switch,对应控制一盏灯带有一个虚掩的按钮。它开始处于状态off,其有一个entry行为,其关闭灯和一个do活动,其反复轮询一个输入行,并将输入的值输入到变量button value中。一个变更事件, when (button value==1 ),触发一个转变到状态on,所以一旦投票的值变更到1,off状态被退出和do活动被终止。在进入到on状态时,灯被打开和状态机反复轮询输入线。状态on的输出转变到off被再次触发通过变更事件when(button value==1 )。这种类型的解决方案适合描述数字系统,其执行持续性监控输入和写输出。

状态之间的转变在Lamp Switch状态机中被触发通过一个变更到一个分离属性的值, button value。这是相反的对比一个系统的持续状态表示根据持续的状态变量(表达作为数值属性)。

11.15  一个分离的状态机驱动通过变更事件

状态机对应H2O,显示在图11.16,定义在它的solid、liquidgas状态之间的转变。这些表示H2O的分离状态,而它的属性的值,诸如,温度和压力,表示持续的状态变量。特定的对对应变量temp,加其它条件(例,撤回或能量的增加),定义表达式对应变更事件和看门狗在转变上。所以隐含地,它的状态变量的值被使用来确定H2O的分离状态和转变在那些状态之间。相似的,其它的分离状态持续系统可以被定义根据系统的选择的持续属性的值。

11.16 状态机对应H2O

    1. 小结

一个状态机被使用来描述一个模块的行为,根据它的状态和它们之间的转变。状态机可以是组合的层次,像其它SysML行为构件,使能基于状态的行为任意复杂的表示。

明确的状态机概念涵盖在本章中包含下面的:

  • 一个状态机被使用来描述一个模块的行为,根据它的状态和它们之间的转变。状态机可以是组合的层次,像其它SysML行为构件,使能基于状态的行为任意复杂的表示。

    明确的状态机概念涵盖在本章中包含下面的:

  • 状态机描述一个潜在可重用的模块依赖行为的定义。每个状态机图描述一个状态机。
  • 每个状态机包含至少一个区域,自身可以包含许多子状态和伪状态(称为收集性顶点),和转变在那些顶点之间,在一个状态机的执行过程中,它的区域中的而每个有一个单一的激活的状态,其确定转变是当前可视的在那个区域。区域可以有一个初始伪状态和最终状态,其分别对应于它的开始和完成。
  • 状态是一个模块在生命周期的一些明显条件的一个抽象,和进入和离开那个条件的特定的影响,和什么模块执行,而它处于那种条件,使用行为,诸如,活动。
  • 转变描述有效状态的变更,和处于什么条件那些变更将发生。一个转变有一个或多个触发器、一个看门狗、和一个影响。一个触发器与一个时间相关,其可以对应或到一个信号的接收(信号事件)或操作调用(调用事件)通过占有的模块;一个时间的期望(时间事件);或一个条件指定根据模块的属性模块和它的环境(变更事件)被满足。一个转变也可被触发通过一个完整的事件,当前的激活状态已经完成时,它出现。
  • 看门狗表示任何附加的约束,其需要来被满足,如果转变被触发。如果一个有效的事件出现,看门狗被评估,和如果是true,转变被触发;否则,事件被消耗使用没有变更在状态上。一个转变可以包含一个转变影响也即是描述通过一个行为诸如,一个活动。如果转变被触发,转变影响被执行。
  • 状态可以指定一定的事件可以被延迟,在这种情形下,它们仅被消耗如果它们触发一个转变。延迟事件被消耗在转变到一个状态,其不详细延迟它们。
  • 有许多环境,当简单的转变状态之间不是充分的来指定需要的行为连接和选项伪状态允许一些转变将被组合进一个组合转变。尽管组合转变可以包含进一个转变使用触发器,它可以有多个转变使用看门狗和影响。连接和选项伪状态可以有多个输入的转变和持续流出的转变。它们被使用来构建复杂的转变,有超过一个转变路径,每个潜在的使用它自己的看门狗和影响。历史伪状态允许一个状态将被中断和随后,后续挂起它的先前的激活的状态或状态。
  • 状态可以被组合使用内嵌的状态在一个或多个区域。仅像状态机,在一个激活状态的执行过程中,一个激活状态将有一个激活的子状态每个区域。组合状态是多孔的;也即是,转变可以交叉在它们的边界上。特定的伪状态称为分叉和联结伪状态允许转变到和来自状态在多个区域立刻。一个给定的事件可以触发转变在多个激活的区域中。
  • 状态机可以被重用通过子机状态。交互使用重用的状态机发生通过转变到和来自相应子机状态的边界,或直接或通过入口和出口点伪状态。
  • 变更事件被驱动通过状态机的变量它占有的模块的值或属性。除了分离的系统,变更事件可以触发转变在持续系统中,在其系统之间的转变中分离状态被触发通过变更在持续状态变量的值。
    1. 问题

 

状态机描述模块的行为,但所以执行活动, 通过活动划分使用。讨论方法来确保行为的两种描述是协调的,当两个被使用来描述相同的模块的行为。

 

 

状态机图的图的类型是什么? 那种类型的模型元素可以包含在一个状态机区域? 状态和伪状态区别是什么? 状态机有2个状态,S1S2;您如何来显示初始的状态对应这个状态机是S1? 最终状态和最终伪状态区别是什么? 状态有三种行为与它相关;它们被称为什么和何时它们被调用? 转变的三个组件是什么? 在什么情形下,一个完整的事件获得生成对应一个状态使用一个单一的区域? 行为在一个内部转变和一个外部转变使用相同的源和目标状态之间的区别是什么? 什么会转变字符串对应一个转变看起来像,如果触发通过一个信号事件对应信号S1,带有看门狗“a > 1”和一个影响“a <= 1”? 绘制相同的转变使用图形化符号对应转变。 哪里和如何一个延迟事件被表示? 连接和选项伪状态之间的区别是什么? 如果一个状态有一些正交区域,它们如何被显示? 深度和浅显的历史伪状态之间的区别是什么? 状态机如何被重用在另外一个状态机内部? 入口和出口点伪状态如何被表示在一个状态机上? 在什么条件下一个给定的变更事件将发生?

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值