前页 后页

建模可执行状态机

建模可执行状态机所需的大部分工作是基于标准UML的类和状态模型建模。为了确保格式良好的代码库,必须遵守两个约定。唯一新颖的构造是使用原型Artifact元素来形成Executable StateMachine实例或场景的配置。工件用于指定详细信息,例如:

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

可执行StateMachines的基本建模工具和对象

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

目的

细节

类和类图

类定义与要建模的StateMachine相关的对象类型。例如,在简单的“网球比赛”场景中,您可以为“运动员”,“比赛”,“命中”和“裁判”中的每一个定义一个类。每个实体都有自己的StateMachine,并且在运行时将由每个涉及实体的对象实例表示。有关类和类图的更多信息,请参见UML建模指南

状态机

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

可执行状态机器工件

这种原型化工件是用于指定可执行StateMachine的参与者,配置和开始条件的核心元素。从方案的角度来看,它用于确定涉及哪些(类)实例,它们可能触发并相互发送的事件以及它们在什么条件下运行。

从配置方面来看,工件用于建立到分析器脚本的链接,该脚本将确定输出目录,代码语言,编译脚本等。右键单击工件,将允许您生成,构建,编译和可视化StateMachines的实时执行。

StateMachine构建受支持

下表详细列出了受支持的StateMachine构造以及与每种类型相关的任何限制或一般约束。

构造

描述

状态机

  • 简单的StateMachine:StateMachine具有一个区域
  • 正交StateMachine:StateMachine包含多个区域
顶级区域(由StateMachine拥有)激活语义:

默认激活: StateMachine开始执行时。

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

  • 注意1:在拥有入口点的StateMachine的每个区域中,从入口点到该区域内的顶点最多只有一个过渡
  • 注意2:此StateMachine可以由Submachine State引用-连接点引用应在Submachine State中定义为转换的源/目标;连接点引用表示在StateMachine中定义并由Submachine State引用的入口/出口点的用法
不支持
  • 协议状态机
  • 状态机重新定义

状态

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

复合状态输入

  • 默认输入
  • 显式输入
  • 浅历史记录
  • 深度历史录入
  • 入口点入口

子状态

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

过渡支持

  • 外部过渡
  • 本地过渡
  • 内部过渡(绘制自我过渡并将过渡类型更改为内部)
  • 完成过渡和完成事件
  • 过渡卫队
  • 复合过渡
  • 触发优先级和选择算法
有关更多详细信息,请参阅UML规范

触发和事件

可执行StateMachine仅支持对信号进行事件处理。

要使用“呼叫”,“计时”或“更改事件”类型,您必须定义外部机制以根据这些事件生成信号。

信号

可以在信号中定义属性;属性的值可用作过渡保护和效果中的事件参数。

例如,这是在C ++过渡效果中设置的代码:

if(signal-> signalEnum == ENUM_SIGNAL2)

{

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

}

Signal2生成为以下代码:

Signal2类:公共Signal {

上市:

Signal2(){};

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

int myVal;

};

注意:可以通过生成可执行状态机并引用生成的“ EventProxy”文件来找到更多详细信息。

初始

初始伪状态表示区域的起点。它最多是一次过渡的源泉;一个区域中最多可以有一个初始顶点。

地区

默认激活和显式激活:

过渡在包含国终止:

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

选择

当复合转换遍历到达此伪状态时,将动态评估所有传出转换上的保护约束。

交界处

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

叉/连接

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

EntryPoint / ExitPoint节点

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

历史节点

  • DeepHistory:表示其所属国家的最新活动状态配置
  • ShallowHistory:代表其包含状态的最新活动子状态,但不代表该子状态的子状态

延期活动

绘制一个自我过渡,并将过渡类型更改为内部。输入“ defer();”在“效果”字段中进行过渡。

连接点参考

连接点引用表示在由子机状态引用的StateMachine中定义的进入/退出点的用法(作为子机状态的一部分)。子机状态的连接点引用可用作转换的源和目标。它们代表进入或退出由Submachine State引用的StateMachine。

国家行为

状态“进入”,“ doActivity”和“退出”行为定义为对状态的操作。默认情况下,您将用于每种行为的代码输入到  “行为”操作的“属性”窗口的“代码”面板。请注意,您可以更改此设置,以通过自定义生成模板将代码键入“行为”面板。

生成的“ doActivity”行为将在继续操作之前运行完毕。该代码不能与其他输入行为并发。 “ doActivity”行为被实现为“进入后顺序执行”行为。

在其他上下文/类中对行为的引用

如果Submachine State引用了当前上下文或类之外的行为元素,则必须从当前上下文类向容器上下文类添加<< import >>连接器。例如:

Class1中的Submachine State S1引用Class2中的StateMachine ST2

因此,我们从Class1到Class2添加了<< import >>连接器,以便生成可执行StateMachine代码以正确生成Submachine State S1的代码。 (在Class 1上,单击Quick Linker箭头并拖到Class 2,然后从连接器类型菜单中选择“导入”。)

重用可执行状态机器工件

您可以使用单个可执行工件来创建组件的多个模型或版本。例如,可以重新使用代表电阻的伪像来创建箔电阻和绕线电阻。对于尽管由相同分类器表示但通常表现出不同运行状态的相似对象,情况很可能如此。从建模的角度来看,可能只需要一个名为“ resistorType”的属性,而该属性的取值为“ wire”而不是“ foil”。然后可以重复使用相同的StateMachines,以测试由于运行状态变化而可能导致的行为更改。步骤如下:

行动

创建或打开组件图

打开一个组件图进行操作。这可能是包含原始工件的图。

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

现在,在“浏览器”窗口中找到原始的可执行状态机工件。

创建新组件

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

第一个是对象 ,第二个是全部。重命名工件以使其与原始工件区别开,然后继续更改其属性值。