我们的世界处于不断变化之中,事物在不同状态之间持续演变。水会结冰,冰川会发生变形并流动,冰层融化,交通灯在红、黄、绿之间循环,飞机起飞、爬升、巡航、下降和降落。SysML中的状态机用于描述结构(以模块的形式)如何在其时间限定的生命周期中改变状态。我们关注的并非模块实例的结构本身,而是其行为,而这种行为又可能反过来影响其结构。我们并不关心“事物”可能处于的每一个具体状态,而是关注其中的关键状态。例如,水分子的重要状态可能是固态、液态或气态,但通常我们对温度为67摄氏度时的液态水并不感兴趣。如果我们观察一个物体生命周期的电影胶片,状态机就会自动提取出发生重要且相关变化的关键帧。
确定哪些内容是相关的,是建模工程师的特权和责任,同一模块可以由相同或不同的工程师定义出任意数量的状态机。飞机的状态可以从乘客上下机的角度、维护计划的角度、起降角度,或从其他任何角度进行建模。
该状态机图描述了SUV汽车的运行状态。图中使用了复合状态(Composite States),即在其他状态内部嵌套多个状态。共有三个高层级状态:关闭(Off)、运行(Operate)和未命名的结束状态(End State)。运行状态包含若干子状态,分别为怠速、加速/巡航和制动。结合这些状态之间的转换,该图完整描述了车辆在启动、加速、刹车、停止以及点火开关关闭时的状态变化过程。
使用 Enterprise Architect,工程师可以创建状态机,并定义从一种状态到另一种状态的转换,包括触发状态变化的事件以及被触发的动作。除了这些标准的建模方式外,该工具还提供多种功能,有助于可视化并分析这种将结构与行为紧密结合的重要语言机制。
状态机可以在任何粒度层级定义,因为它们是表示一个模块行为的表达方式。许多SysML的新手对此感到困惑。由于一个模块可以表示非常简单的对象——例如潜艇控制面板上的开关——也可以表示复杂的对象,比如潜艇本身,因此状态机同样可以同时表示开关和潜艇的状态。尽管所建模的对象在复杂性上显然处于两端,但这两个状态机模型的复杂程度却可能相同。
状态机图对不熟悉建模的人员来说可能显得相当简单,它们是描述和分析复杂问题的高效工具,而这些问题无法通过其他方式解决。这需要不同的思维方式和方法,通常问题的核心在于选择状态机的模块级别、上下文以及视角,而非图的具体细节。许多情况下,最佳结果是通过多位工程师共同协作,借助启发式方法实现的。这可以通过 Enterprise Architect 的协作功能来完成,使分散在不同地理环境的工程师能够通过桌面客户端或智能手机、平板电脑、笔记本电脑上的浏览器进行邮件、讨论、聊天及正式评审等方式在模型中沟通交流。
状态机起源于离散事件驱动的行为,采用基于大卫·哈雷尔(David Harel)状态图形式主义的面向对象变体来构建有限状态机。
14.1 状态和行为
状态是在状态机的上下文中创建的,用于建模拥有方块的工程师定义的重要条件。需要记住的是,状态机描述的是从特定视角描述区块的生命周期,状态必须从这个角度定义——不是所有状态,而是重要的状态,如开/关、开/闭、绿/黄/红或冰/水/蒸气。形式上,状态模拟了在状态机行为执行中某一不变条件在特定持续时间内成立的情况。
一个模块通常会在特定状态中停留一段时间,这种状态可能持续纳秒或数天,具体取决于上下文;这种时间方面通常不会在模型中明确规定,但可以在仿真中设置。对于任一状态,可以定义三种行为(称为动作):
该图展示了这些状态如何在状态机图中表示。Enterprise Architect 可以有条件地在单个元素层面显示这些及其他单元,或对图中所有元素整体显示。
还需要注意的是,终点节点在形式上也是一个状态,但它的行为语义与图中以圆角矩形表示的状态不同。
状态有三种基本类型,每种类型对于建模不同类型的问题都很重要:
Enterprise Architect 允许你对这些状态类型进行建模,建模者可以在 StateMachine 图中高效地利用它们来表达现实工程问题和解决方案。
14.2 状态机图介绍
状态机图是SysML九种核心图类型之一,用于创建和可视化模块在状态变化过程中的行为。该图中的关键元素包括状态、转换和伪状态。状态代表从特定视角来看模块生命周期中的重要时间点;转换表示从一个状态到另一个状态的转换;而伪状态(如后将要介绍)则充当交通控制器,影响转换行为的运作方式。
Enterprise Architect 可帮助建模人员创建任意数量的状态机图,每个图均可包含任意数量的状态、转换和伪状态。这些图元素及连接器本身还可添加其他信息,以进一步丰富图细节。该应用程序配备了一个模式库工具,对新手非常实用,同时也欢迎有经验的建模人员使用。此截图展示了可用于创建状态机图的各种模型模式列表。
该模式可用于创建多种不同的状态机;在此示例中,我们创建了一个简单的(单区域)图示,其中所有相关细节均已添加到状态和转换上。建模人员可以在仓库的适当位置创建此图示,然后编辑状态、转换以及图示内容,以适应其自身的建模需求。根据该模式生成的初始状态机图示将如下所示:
这一便捷功能可提醒工程师填写过渡状态中的触发条件和守卫条件,或状态中的进入和退出动作等信息,这些内容他们可能原本并不了解。最终生成的图符合最佳工程实践,从而为客户带来更优的结果。
创建状态机图
可以通过用户界面的多个位置使用以下方法来创建状态机图:
我们将使用设计功能区来创建状态机图。首先,选择在浏览器窗口中您希望放置状态机图的位置。与所有图一样,该位置可以是包或元素,但通常将状态机图插入到元素(如模块)中,以描述模块生命周期中的关键阶段。在浏览器窗口中选定位置后,请选择:
功能区:设计 > 图 > 添加图
选择此选项将打开“模型构建器”对话框中的“图构建器”标签页,在该页面中,您可以选择图类型并指定图名称。默认情况下,图名称将使用包含该图的包或元素的名称,但您也可以自行更改。当选择SysML视图并选定SysML版本后,系统将显示一系列图类型供您选择,其中可选中状态机(StateMachine)图。点击“创建图”按钮后,系统将在浏览器中指定的位置创建一个新的状态机图。图画布将被打开,使您能够开始添加描述目标对象生命周期重要阶段的元素和连接器。此外,Enterprise Architect还将显示图工具箱中的状态机页面,这些页面包含由SysML规范定义的、可用于构建状态机图的元素和关系。根据需要,还可以打开任意数量的其他工具箱页面,同时“通用(元素)”和“通用关系”页面始终可用。
状态机图中使用的重要元素和连接器包括:
元素
连接器
可以通过将工具箱页面中的元素拖放到图画布上来向图中添加元素。通常建议从一个初始状态和一个或多个终止状态元素开始,并为这些元素命名,以清楚描述状态机的启动方式以及可能存在的多种结束方式。如果省略名称,或使用诸如“开始”或“结束”之类的普通名称,则无法帮助读者明确所建模的是哪个系统或系统中的哪一部分,还可能导致对图的误解。在添加并合理布置这些节点后,便可进一步添加状态和转换,从而定义被建模实体生命周期中的关键阶段。
一旦创建了基本的图,并且对领域和系统行为有了更深入的理解,就可以在状态之间的转换中添加触发器、事件和守卫,在状态中添加进入、执行和退出行为。初学者常常觉得这些图很基础,但它们能揭示出其他方式无法看到的深刻见解。
14.3 触发器和转换
在状态机图中,你看到的大多数连接器都是转换(Transitions);这些是连接一个状态到另一个状态的线条,表示所属模块(实例)可以发生改变的允许方式。它们变化的顺序以及执行的行为取决于该模块的条件和现实世界中的上下文。例如,交通信号灯可能会持续闪烁黄灯,直到维修工程师排除故障;或者飞机可能保持盘旋等待,直到目的地机场的塔台发出着陆许可。此图展示了两个方向不同的转换,实际上在两个状态之间形成了循环的可能性。
转换总是从一个状态出发,指向另一个状态,包括起始状态与目标状态相同这一特殊情况。图中的线条带有标签,可显示多种不同的选项:触发器(Trigger)、守卫(Guard)和效果(Effect)。我们将详细讨论这些选项,因为它们表达了关于转换的重要语义,包括转换是否会被执行。一个转换可能处于三种状态之一:
这些术语在系统工程师及其他人员协作工作、讨论状态机的执行及其对所属块行为的描述时将非常有用。
触发器
触发器是引发状态转换的起始点,它们被映射到那些被认为会触发事件发生的事件上。正是这些触发器及其相关事件导致状态转换被执行(触发),从而使所属的模块从一种状态转换到另一种状态。当某个状态处于激活状态时,它实际上正在等待被事件触发;只要其进入动作已完成——无论其他因素如何——它就已准备好接收并响应事件。
此屏幕截图展示了如何在 Enterprise Architect 中输入和查看触发器、守卫和效果。
该图示展示了触发器、守卫和效果在图中的显示方式。在此例中,效果被定义为一种行为,并与模块上定义的操作相关联。
守卫
守卫是过渡的“看门人”,只有当守卫的表达式评估为真时,该转换才会触发。如果表达式评估为假,则事件将被消耗,且由于触发器导致模块的状态不会发生任何可观察的变化。
守卫的表达式可以用普通英语来描述,但通常以约束形式书写,使用诸如对象约束语言(Object Constraint Language)之类的正式约束语言。在处理仿真或可执行状态机时,该条件会用其生成代码语言的语法来表示,例如 JavaScript 或 C++。这也适用于效果(Effects)。在此图中,我们可以看到一个数学表达式,它可以由人类或机器进行计算和评估。
效果
除了将所属模块从一个状态转换到另一个状态外,转换关系的重要意义还在于,它可以执行一种行为,该行为可能是在所属模块或任何其他模块上进行的操作或活动。这种行为是源状态可能已定义的退出行为以及目标状态上的进入行为之外的补充。这确保了在转换执行过程中存在一种机制来改变行为。
贝塞尔曲线
Enterprise Architect 提供了多种用于处理图的工具和功能,包括状态机图(StateMachine diagrams),这些工具可用于帮助创建和可视化状态机中编码的信息。在处理转换(Transitions)时,特别有用的是能够设置连接线路径,以使图更具视觉吸引力。在此图中,连接线的线型已设定为贝塞尔曲线,从而使转换看起来更加柔和自然。
通过将构造点拖动到新位置,可以改变曲线的形状。可使用多种线条样式中任意一种,为建模者提供丰富的图展示选项。用户可选择此上下文菜单,并单独设置每个连接器的线条样式。此外,线条的颜色和粗细也可在“布局”功能区中进行设置。
14.4 复合状态和区域
状态建模必须具有层次结构,以应对工程系统的复杂性;SysML 提供了两种机制来在状态机中实现这种层次结构:
系统及其包含的对象通常表现出并发行为,即两件事可以同时发生;这些独立的行为往往相互作用,从而产生复杂的基于状态的行为。这些行为通常体现在状态机所描述的模块中,并可能涉及具有不同生命周期的部件。此类情况可以通过区域来建模;一个状态机可以包含任意数量的区域,每个区域都有其自身的状态、伪状态以及连接它们的转换关系。
一个状态本身可能需要具有层次结构,即单个状态可以分解为多个子状态,这些子状态代表构成复合状态的部分。例如,一个机器人可能具有“运行”和“维护”状态;其中“维护”状态又可进一步分解为多个子状态,如“充电电池”、“更新环境”和“更新软件模块”。每个子状态又可以继续分解为其他多个状态。
Enterprise Architect 提供了一个良好的起点,用于建模复杂的状态行为,它提供了一系列模型模式,可用于建模状态机的各个方面,包括复合状态和区域的建模。
复合状态用“oo”(无限)符号表示,并引用其子图。点击该符号即可预览子图。双击元素或图的预览将打开该图进行编辑。
这些模式可通过模型构建器访问。
此图展示了一个基于“状态与区域”模式生成的图,该模式已直接注入模型中,作为建模人员的起始点。建模人员可根据需要,通过替换状态和转换的名称,并添加或删除区域来定制该图。
B状态的各区域在第一区和第二区中提供了并行的流程。
14.5 伪状态-路径管制员
在状态机图中连接各状态的转换关系需要进行合理规划,以确保状态机能够体现一个模块在物理世界中改变状态所拥有的自由度。伪状态是用于引导转换流程的节点,这些节点可以出现在转换路径的起点、途中或终点。伪状态的类型包括:
我们将逐一详细说明这些内容,并展示如何使用 Enterprise Architect 来创建和管理这些重要节点。需要理解的是,最终状态(Final State)虽然具有与初始伪状态类似的图标,但实际上它是一个独立的状态。
初始
初始伪状态是所有节点中最广泛使用的一种,代表一个区域的起始点。在区域内只能有一个初始伪状态,并且仅允许从该初始伪状态发出一次转换。由于它是起点,因此不应设置触发器或条件判断——当进入该区域时,伪状态会自动激活,但建模者可以定义其效果。一些系统工程师会省略这个至关重要的伪状态,认为其位置已隐含,但通常建议将其包含在图中,因为若不包含它,起始点将无法明确界定。不过,实践中普遍的做法是不为初始伪状态命名。
Enterprise Architect 还依赖于状态机结构良好,即每个区域都必须定义一个初始伪状态。当建模人员使用可执行状态机或运行仿真以可视化某个块实例在其生命周期内所经历的状态变化时,这一点尤为重要。
分叉与汇合(Fork and Join)
在状态机图中使用区域时,通常需要将指向某个状态的转换拆分为多个转换,使得每个传出的转换都指向正交区域中的特定状态。从分叉伪状态(Fork pseudostate)发出的转换受到限制,不能定义守卫条件(guard)或触发器(trigger),但可以定义效果(Effect)。这确保了多个区域可以同时拥有活动状态。
汇合以类似但相反的方式工作,以联合来自多个区域的传入转换。反向限制规定,传入转换不能定义守卫或触发器,但可以定义效果。在传出转换能够触发之前,所有传入转换的效果必须完成。
终止
终止伪状态是一种有用的节点,用于确保整个状态机被关闭。无论该节点位于状态层次结构的哪个层级,所有区域和所有层级都将被终止。它是一个最终节点,因为所属的状态机将立即停止执行。终止过程并非“优雅”终止,当前正在执行的所有行为将直接停止,不会执行任何退出行为。下图展示了一个包含单个区域的复合状态;如果出现压力泄漏,必须立即终止高压灭菌器的操作,因此会从运行状态过渡到“循环中断终止”伪状态。
Enterprise Architect允许将此节点放置在任意层级和任意区域,并会在可执行状态机仿真中遵循其语义。
连接点
连接点伪状态用于建模具有复合路径的转换。连接到连接点的有入站和出站转换,但在执行StateMachine时,只有其中一条入站转换和一条出站转换会被触发。出站转换受到守卫条件(guard)的限制,只有当条件表达式首先评估为布尔值“真”时,该转换才会被触发,并传递出站令牌。
入口点与出口点
入口点和出口点伪状态用于允许一个StateMachine在多个上下文中作为子机状态被重复使用;它们也可用于复合状态。这些伪状态以小圆圈的形式出现,位于复合状态或子机状态的边界两侧;入口点为空,而出口点则在圆圈内部有一个小的“x”标记。
它们在边界上的位置具有重要意义,因为从视觉语法的角度来看,它们能够传递元素内部与外部之间的消息。
深历史与浅历史
“历史”伪状态类似于复合状态的书签或记忆点,仅存储该区域退出时所处子状态的名称。当该区域再次被进入时,状态机将从历史中指定的子状态恢复其状态转换。由于某些原因,区域可能被重新进入,而历史无法提供上一个状态;此时可通过建模者预先创建一条从历史伪状态到目标默认子状态的转换来处理这种情况。只有在历史无法提供记忆点时,才使用该转换。
在本例中的管式离心机中,系统工程师在运行的复合状态下添加了一个浅历史状态,表示如果在某个特定状态处于激活状态时退出了该启动状态,之后再重新进入该状态,则执行将从当前活动的子状态继续进行。退出历史记录的转换意味着,如果所属状态被重新进入且机器不知道应激活哪个状态,则将选择冲洗操作。
浅历史状态和深历史状态的工作方式相同,唯一的区别在于:浅历史伪状态仅能记住所属区域中的活动子状态,而深历史则可以记住子状态层级中的任意级别。深历史在视觉上通过在 H* 后面添加一个星号来表示。
14.6 状态表-另一种视图
状态机可以通过多种不同的方式来可视化。我们已经看过状态机的图视图,但 Enterprise Architect 还提供了一种有用的工具,可将状态机以表格形式呈现。表格可视化共有三种变体:
与任何状态机图一样,交通信号灯变化的此示意图可以转换为状态表。
这种视图对某些受众来说会更具吸引力且更自然,工程师只需在不同视图之间切换即可。各状态及其子状态以表格的行和列来表示,而状态之间的转换(即路径)则以单元格中的内容呈现。
另外两个表格视图如前所述,可将状态与触发器进行对比查看。当工程师更关注因果分析,并希望查看或分析事件和触发器如何导致所属模块的状态行为时,这些视图非常有用。该图以触发器和状态的表格形式展示了相同的交通信号灯设备。
Enterprise Architect还支持导出这些表格,以便通过电子表格进行分析。这一功能非常实用,尤其是在状态机较为复杂且包含大量转换时。
14.7 通过仿真进行可视化与实现
Enterprise Architect 不仅是一个用于创建和管理状态机图的平台,还为工程师及其他利益相关者提供了先进的仿真功能,使他们能够直观地可视化状态机。这不仅让模型变得生动起来,还提供了一种可视化工具,不仅适用于开发模型的工程师,也适用于其他技术或非技术人员,帮助他们理解模型所表达的内容。这类似于作者朗读自己刚刚写完的一段文字,有助于工程师发现模型中的错误,或识别需要修正或重新设计的部分。当模型变得越来越复杂时,这种功能尤为有用,例如包含嵌套子状态、复杂的触发器与守卫条件,以及诸如分叉(Forks)和汇合(Joins)等伪状态,这些伪状态会分割并重新连接转换。
该平台对触发器、触发器集、嵌套状态、并发状态、动态效果以及其他高级仿真功能提供了广泛支持,从而构建了一个高度完善的环境,用于创建交互式且可运行的模型,帮助探索、测试并以可视化方式跟踪复杂的业务、软件和系统行为。有一个专门用于仿真的功能区,提供了多种可用于状态机动态和可执行仿真的组件。此图展示了进行动态仿真所需的核心工具。
第二张图展示了其他高级工具,包括可执行状态机(Executable StateMachine),这些工具可用于创建状态机的执行实例,直接从仿真的状态机生成可完全实现和编译的编程代码。图中还显示了多种其他功能,例如Modelica和Simulink,它们是用于运行复杂参数化仿真的高级工具。
该图展示了我们上一练习中所研究的交通信号灯系统的简单动态仿真,直观显示了动态仿真的实际运行过程。