预订演示
前页 后页

建模可执行状态机

可执行状态机模型和计算机模型所需的大部分工作是基于标准 UML 的类状态建模,尽管必须遵守一些约定以确保形成良好的代码库。唯一新奇的构造工件就是用元素来构成可执行状态机实例或场景的配置。工件:用于指定详细信息

  • 代码语言( JavaScript 、C#、 Java 、C++ 包括 C)
  • 场景中涉及的类和状态机
  • 包括运行状态的实例规范;注记这可能包括同一状态机的多个实例,例如在网球比赛模拟中使用了两次“球员”类

可执行状态机基本建模工具和对象

这些是构建可执行状态机时使用的主要建模元素。

元素类型

描述

类和类图表

类定义了与被建模的状态机相关的object类型。例如,在一个简单的网球比赛场景中,您可以为球员、比赛、击球和裁判中的每一个定义一个类。每个都有自己的状态机,并且在运行时将由每个相关实体的object实例表示。有关类和类图的更多信息,请参阅UML建模指南

状态机

对于您定义的将在场景中具有动态行为的每个类,您通常会定义一个或多个UML状态机。每个状态机将确定适用于拥有类的一个方面的合法的基于状态的行为。例如,可以有一个状态机代表玩家的情绪状态,一个跟踪他当前的健康和能量水平,一个代表他的输赢状态。所有这些状态机都会在状态机场景开始执行时被初始化并启动。

可执行状态机工件

这种刻板工件是用来指定可执行状态机的参与者、配置的核心元素和启动条件。从场景的角度来看,它用于确定涉及哪些(类)实例,它们可能会触发器发送和发送什么事件,以及它们在什么启动条件下运行。

从配置方面工件,你可以用来建立一个分析器脚本的链接,该分析器脚本将确定输出目录、代码语言、编译脚本等。右键单击工件设备将允许您生成、构建、编译和可视化您的机器的状态机执行。

状态机支持的构造

此表详细说明了支持的状态机造以及与每种类型相关的任何限制或一般约束。

构建

描述

状态机

  • 简单状态机:状态机有一个区域
  • 正交状态机:状态机包含多个区域
顶级区域(状态机所有)激活语义:

默认激活:状态机开始执行时。

入口入口:从入口过渡到包含区域中的顶点。

  • 注记1 :每个拥有区域的状态机,入口只有一个转移
    从入口点到该区域内的区域
  • 注记2:这个状态机可以被一个子机状态引用——连接点引用应该在子机中状态为转换的源/目标;连接点引用表示在状态机中定义并由子机状态引用的Entry/出口的用法
多状态机:浏览器窗口中的列出顺序决定执行顺序。
  • 当涉及到一个子机状态时,类下可能有多个状态机
  • 使用浏览器窗口工具栏中的上移或下移箭头调整状态机的顺序;置顶的将设置为主状态机
不支持
  • 协议状态机
  • 状态机重新定义

状态

  • 简单状态:没有内部顶点或过渡
  • 复合状态:只包含一个区域
  • 正交状态:包含多个区域
  • 子机状态:指整个状态机

复合状态Entry

  • 默认条目
  • 显式输入
  • 浅历史条目
  • 深度历史条目
  • 入口

子状态

  • 子状态和嵌套子状态
进入和退出语义,其中转换包括多个嵌套级别的状态,将服从嵌套行为(例如 OnEntry 和 OnExit)的正确执行。

过渡支持

  • 外部转移
  • 本地转移
  • 内部转移
    (画一个自我转移
    并改变转移
    对内部友好)
  • 完成转移
    和完成事件
  • 转移
    警卫
  • 复合过渡
  • 触发优先级和选择算法
有关更多详细信息,请参阅OMG UML规范

触发器的事件

可执行状态机仅支持 Signals 的事件处理。

要使用调用、计时或更改事件类型,您必须定义一个外部机制以基于这些事件生成信号。

信号

属性可以在 Signals 中定义;属性的值可以用作转移

中的事件参数转移

防护条件。

例如,这是 C++ 中转换效果中的代码集:

如果(信号->signalEnum == ENUM_SIGNAL2)

{

int xVal = ((Signal2*)signal)->myVal;

}

Signal2 生成如下代码:

类 Signal2:公共信号{

上市:

信号2(){};

Signal2(std::vector<String>& lstArguments);

int myVal;

};

注记:更多细节可以通过生成一个可执行状态机并参考生成的“EventProxy”文件找到。

最初的

Initial Pseudostate 表示区域的起点。最多是一个转移

的源转移

;在一个区域中最多可以有一个 Initial Vertex。

区域

默认激活和显式激活:

转换终止于包含状态:

  • 如果在区域中定义了初始伪状态:默认激活
  • 如果没有定义初始 Pseudostate,则区域将保持非活动状态,并且包含状态被视为简单状态
  • 如果转换终止于区域包含的顶点之一:显式激活,导致其所有正交区域的默认激活,除非这些区域也显式输入(多个正交区域可以通过源自的转换显式并行显式输入同分叉伪态)
例如,如果为正交状态定义了三个区域,并且RegionARegionB具有 Initial Pseudostate,则明确激活RegionC 。默认激活适用于RegionARegionB ;包含状态将具有三个活动区域。

选择

当复合转换遍历达到此伪状态时,动态评估所有传出转换的守卫条件约束。

连接点

静态条件分支:在执行任何复合转换之前评估保护约束。

分叉/汇合

非线程,每个活动区域交替移动一步,基于完成事件池机制。

入口点/出口点节点

非线程用于正交状态或正交状态机;每个活动区域交替移动一个步骤,基于完成事件池机制。

历史节点

  • 状态:代表其所属状态的最近活动状态配置
  • ShallowHistory:代表其包含状态的最近活跃的子态状态,而不是那个子状态的子态

延期事件

划一个自我转移

, 并改变转移

kind to类型();'在过渡的“影响”字段中。

连接点参考

A点参考表示子机状态引用的状态机中定义的条目/出口的使用(作为子机状态的一部分)。子机状态的连接点引用可以作为Transitions的源和目标。它们代表进入或退出子机状态所引用的状态机。

状态行为

状态“entry”、“状态”和“exit”行为被定义为对状态的操作。默认情况下,您将用于每个行为的代码键入到 行为操作的属性窗口的“代码”面板。请注记,您可以通过自定义生成模板将其更改为将代码键入“行为”面板。

生成的“运行”行为将在继续之前运行完成。代码与其他入口行为不并发; 'doActivity' 行为被实现为 'execute in order序列entry' 行为。

对其它/类中的行为的引用

如果子机状态引用了当前上下文或类之外的行为元素,则必须在当前上下文类中添加一个<<import>>连接器到容器上下文类。例如:

Class1中的子机状态S1指Class2中的状态机ST2

因此,我们将 <<import>> 连接器从 Class1 添加到 Class2,以便可执行状态机生成代码以正确生成子机状态S1 的代码。 (在类1上,单击快速链接箭头并拖动到类2,然后从连接器类型菜单中选择“导入”。)

再可执行状态机工件

您可以使用单个工件文件创建组件的多个模型或版本。工件一个电阻器,举例来说,可以重复使用箔电阻器和绕线电阻器这很可能是相似对象的情况,尽管它们由相同的分类器表示,但通常表现出不同的运行状态。从建模的角度来看, A名为“resistorType”的属性取值“wire”而不是“foil”可能是所需的全部。然后可以重新使用相同的状态机来测试可能由于运行状态的变化而导致的行为变化。这是过程:

行动

创建或打开部件图

打开要处理的部件图。这可能是包含您的原始工件。

选择要复制的可执行状态机

现在在浏览器窗口中找到工件可执行状态机。

创建新部件

在按住 Ctrl 键的同时,将原始工件拖到您的图表上。系统将提示您两个问题。

第一个答案是物件,第二个答案是全部。重工件属性并将其与原始属性区分开来,然后继续更改其属性。