Executable-state-machines——EA官方资料——中文版
可执行状态机
可执行状态机提供了快速生成、执行和仿真一个复杂状态模型的有效方法;
与使用EA仿真模型的状态图表的动态仿真相反,可执行状态机提供了一个完全的“特定语言”的实现,可以为在多种平台上的多种软件产品形成行为引擎。
执行的可视化使用并与仿真功能无缝集成。
模型的发展现在带来了更少的编码挑战,代码生成、编译和执行由EA负责。
对于有着具体需求的开发人们,EA提供每个语言时,都伴着一组代码模板。
模板也可以被个人定制,用于以您认为合适的任何方式定制生成代码。
这些主题向你介绍可执行状态机建模的基础,告诉你如何生成和运行它们。
可执行状态机的创建和使用以及从状态机生成代码的活动,都由EA的统一版和终极版支持。
构建和执行状态机的综述
建立和执行可执行状态机十分直接,但是需要一些规划和一些关于如何连接不同组件从而建立一个高效的可执行模型的知识。
幸运的是,在开始可视化您的设计之前,你不必花费数小时来获得正确的模型并修复编译错误。
当你已经为你的模型勾勒出广泛的机制,你可以生成代码来驱动它,编译、执行和可视化这个模型只需要几分钟。
下表总结了开始执行和仿真状态机需要什么:
可执行状态机工件
一个可执行状态机工件是生成可以互相交互的状态机的关键。
它指定了将会在一次仿真中包含的对象、它们的状态以及它们如何连接。使用可执行状态机的一个很大的优势就是 一个工件中的多个部分代表了状态机的一个实例,因此你可以使用每个状态机中的多个实例来建立仿真,观察它们如何通信,《可执行状态机范例》中提供了一个例子。
创造可执行状态机的属性(property)
每个可执行状态机常见都包含一个或者多个状态机,包含的状态机由UML属性元素具体说明,每个属性将会有一个UML分类词(类),用于确定该类型包含的状态机。多种包含的类型作为多元属性,可以最终包含在多个状态机中,这些将会在代码中创建,在执行时初始化。
为属性定义初始状态
由一个可执行状态机工件运行的状态机将会在他们自己的类实例上下文中运行,一个可执行状态机允许你通过给多个类属性赋予属性值的方式去定义每个属性的初始状态。例如你也许会具体说明一个运动员的年龄、身高、体重或者和运行的场景有关联的类似属性值。通过做这个,建立将会影响场景运行效果的详细的初始化条件将会成为可能。
定义属性之间的关系
除了描述分配给每个属性所拥有的变量的值外,可执行状态机还使您可以定义每个属性如何基于它们作为实例的类模型来引用其他属性。
可执行状态机建模
建立可执行状态机模型的大多数工作是基于类和状态模型建模的标准UML。必须遵守一些惯例,以确保一个结构良好的代码基础。唯一新颖的构造是使用原型工件(stereotyped工件)元素来形成可执行状态机的实例或场景的配置。工件用于指定详细信息,例如:
- 代码语言(JavaScript,C#,Java,包括C的C ++)
- 场景中涉及的类和状态机
- 实例规范包括运行状态;请注意,这可能包括同一状态机的多个实例,例如,在“网球比赛”模拟中两次使用“ Player”类
可执行状态机的基本建模工具和对象
下面介绍一些构建可执行状态机时使用的主要建模元素。
状态机支持的构建
下表详细列出了受支持的状态机构造以及与每种类型相关的任何限制或一般约束。
在其他上下文/类中对行为的引用
如果子机状态引用了当前上下文或类之外的行为元素,则必须从当前上下文类向容器上下文类添加<< import >>连接器。例如:
类1(Class1)中的子机状态(Submachine State)S1引用类2(Class2)中的状态机(状态机 )ST2
因此,我们从Class1到Class2添加了<< import >>连接器,以便可执行状态机代码正确生成子机状态(Submachine State) S1的代码。(在Class 1上,单击Quick Linker箭头并拖到Class 2,然后从连接器类型菜单中选择“导入”[import]。)
重用可执行状态机器工件
您可以使用单个可执行工件来创建一个组件的多个模型或版本。例如,一个工件表示一个电阻,可以重用它来创建箔电阻和绕线电阻。对于由相同分类器表示却通常表现出不同运行状态的相似对象来说,情况很可能如此。从建模的角度来看,可能只需要一个名为“ resistorType”的属性,而该属性的取值为“ wire”而不是“ foil”。然后可以重复使用相同的状态机s,以测试由于运行状态变化而可能导致的行为更改。步骤如下:
可执行状态机的代码生成
可执行状态机的代码生成基于它的语言属性。这可能是Java,C,C ++,C#或JavaScript。无论使用哪种语言,EA将会生成合适的代码,并立即准备好进行构建和运行。在运行它之前,不需要任何手动干预。实际上,在最初的生成之后,只要单击一下按钮,任何的可执行状态机都可以生成、构建和执行。
语言支持
可执行状态机支持以下平台语言的代码生成:
·Microsoft本机C / C ++
·Microsoft .NET(C#)
·Scripting(JavaScript)
·Oracle Java(Java)
从EA版本14.1开始,代码生成无需依赖于仿真环境即可被支持。例如,如果您没有安装Visual Studio,您仍然可以从模型中生成代码并在您自己的项目中使用它。如果要在EA模拟模型,仍然需要编译器。
仿真环境(编译器设置)
如果要在EA中模拟可执行状态机模型,则这些语言需要以下平台或编译器:
访问
生成代码
“模拟>可执行状态>状态机”功能区选项提供用于生成状态机代码的命令。首先选择可执行状态机工件,然后使用功能区选项生成代码。显示的“可执行状态机代码生成”对话框取决于代码语言。
生成代码(Windows上的Java)
生成代码(Linux上的Java)
略
生成代码(其他语言)
略
同时,“系统输出”(System Output)窗口在“可执行状态机输出”页面上打开,在代码生成过程中会在其上显示进度消息、警告或错误。
在“可执行状态机代码生成”(executable 状态机 code generation)对话框中,“工件”(artifact)字段和“语言”(language)字段显示元素名称和在元素“属性”对话框中定义的编码语言。
生成
单击此按钮以生成状态机代码。代码生成将覆盖项目输出目录中的所有现有文件。文件集将包括所有必需的文件,包括状态机引用的每个类的文件。
生成的每个可执行状态机还将生成一个执行分析器脚本(execution Analyzer script),该脚本是用于构建、运行和调试(debugging)可执行状态机的配置脚本
代码构建
由可执行状态机生成的代码可以由EA以以下三种方式之一来构建:
利用现有代码
EA生成和执行的可执行状态机可以利用不存在于任何类模型的现有代码。为此,您将创建一个抽象的Class元素,仅命名要在外部代码库中调用的操作。然后,您将在此接口(interface)与状态机类之间创建通用化(generalization),并在分析脚本(analyzer script)中手动添加所需的链接。对于Java,您可以将.jar文件添加到Class路径。对于本机代码,您可以在链接中添加.dll。
调试可执行状态机的执行
即使在生成代码之后,创建可执行状态机也会带来好处。使用执行分析器, EA可以连接到生成的代码。结果就是你可以直观地调试和验证代码的正确行为。由状态机生成的完全相同的代码,由仿真演示,并最终并入现实系统中。
调试状态机
能够调试可执行状态机具有其他好处,例如能够:
- 中断模拟的执行以及所有正在执行的状态机
- 查看模拟中涉及的每个状态机实例的原始状态
- 在任何时间查点看源代码和调用堆栈(call stack)
- 通过在源代码行上放置跟踪点来跟踪有关执行状态的其他信息
- 通过使用动作点(actionpoint)和断点(例如,出错时中断)来控制执行
- 诊断由于代码或建模更改引起的行为更改
如果成功生成、构建并运行了一个可执行状态机,则可以对其进行调试!在生成过程中创建的分析器脚本已经配置为提供调试。要开始调试,只需使用仿真控制(simulation control)来运行可执行状态机。但是,根据所调试行为的性质,我们可能会首先设置一些断点。
在状态过渡时中断执行
像任何调试器一样,我们可以使用断点在代码的某个点检查执行中的状态机。在图表或浏览器窗口中找到感兴趣的类,然后按F12键查看源代码。根据生成期间使用的命名约定,很容易找到用于状态转换的代码。如果要在特定的过渡处中断,请在编辑器中找到过渡功能,并通过单击函数中某行的左空白处来放置断点标记。当您运行可执行状态机时,调试器将在此过渡时停止,您将能够查看所涉及的任何状态机的变量的原始状态。
有条件地中断执行
每个断点可以包含一个条件和一个跟踪语句。当遇到断点并且条件评估为True时,执行将停止。否则,执行将照常继续。您可以使用原始变量的名称组成条件,并使用标准的关系操作数对其进行比较:<> => = <=。例如:
(this.m_nCount> 100)和(this.m_ntype == 1)
要将条件添加到已设置的断点,请在断点上单击鼠标右键,然后选择“属性”。或者通过在按住Ctrl键的同时单击断点,可以快速编辑属性。
追踪辅助信息
可以在例如效果(effect)中使用TRACE子句从状态机自身中跟踪信息。调试还提供了称为跟踪点的跟踪功能。这些只是断点,遇到断点时不会打印中断语句,而不会中断它们。输出显示在“模拟控制”(simulation control)窗口中。它们可以用作诊断辅助工具,以显示和证明事件的顺序以及实例更改状态的顺序。
查看呼叫堆栈
每当遇到断点时,都可以从分析器菜单中使用“调用堆栈”。使用它来确定执行的顺序。
可执行状态机的执行与仿真
EA的众多功能之一是其执行仿真的能力。在EA生成和构建的可执行状态机可以连接到仿真设备中,以可视化的方式式演示状态机工件的实时执行。
开始模拟
仿真控制工具栏提供了一个Search按钮,可用于选择要运行的Executable 状态机工件。该控件维护着一个最新的可执行状态机s的下拉列表,供您选择。您还可以使用可执行状态机工件本身上的上下文菜单来启动仿真。
控制速度
模拟控件提供速度设置。您可以使用它来调整模拟执行的速率。速度表示为介于0到100之间的值(值越大,速度越快)。零值将导致仿真在每一步后停止;这需要使用工具栏控件来手动完成仿真。
活动状态的表示法
当可执行状态机执行时,将显示相关的状态机图,显示将会在每个完成步骤的循环末尾更新。您会注意到,只有实例完成步骤的活动状态被突出显示。其他状态仍然黯淡。
容易确定哪个实例在哪个状态中,因为这些状态已被标记为当前处于该特定状态的任何实例的名称。如果两个或更多个相同类型的工件属性共享相同的状态,则该状态将为每个属性名称具有单独的标签。
生成时序图
完成对可执行状态机的仿真后,您可以从输出中生成一个时序图。操作步骤如下:
在“模拟”窗口工具栏中,单击“工具|生成时序图”(Tools|Generate Timing Diagram)。
(之后就是各类示例,有时间再翻译吧