前页 | 后页 |
代码生成 -状态机
状态机说明了A object (由一个类表示)如何改变状态,每个状态的改变都是由事件引起的触发器发起的转换,通常在定义为守卫的条件或约束下。当您模型object如何更改状态时,您可以使用适当的软件语言生成和构建(编译)代码并执行代码,通过模型模拟器将执行可视化。
在Enterprise Architect中,还可以组合独立但相关对象的状态机,以查看它们如何交互(通过广播事件),并从模型的变体快速创建和生成代码。例如,您可能会模型以下行为:
- 后轮驱动和前轮驱动模式下车辆的后轮外轮(一个状态机)
- 四轮驱动模式下车辆的方向盘和所有四个驱动轮(五状态机)
- 跑车的车轮和越野车的车轮(两个工件状态机、一个组合的实例)
您不使用此方法为硬件定义语言生成代码,但您也可以使用Enterprise Architect中的通用代码生成功能从状态机生成 HDL 代码和软件代码(请参阅生成源代码过程)。
先决条件
- 选择“设置>模型>选项>源代码工程”,对于适当的软件编码语言( Java 、C、C#或ANSI C++),将“使用新的状态机模板”选项设置为“ True ”
- 如果在 C++ 中工作,请选择“设置 >模型> 选项 >源代码工程 > C++”并将“C++版本”选项设置为“ANSI”
访问
将工具图表工具页面中的“图表仿真工具箱”可执行状态机工件中。可以使用本表中列出的任何方法访问工具箱图表“仿真”页面。
功能区 |
设计>图表>工具箱>仿真 |
键盘快捷键 |
>仿真 |
其它 |
您可以通过单击 图表工具箱显示或隐藏图形图表视图。 |
准备你的状态机图
节 |
行动 |
也见 |
---|---|---|
1 |
为每个想要模型的状态机创建一个类图。 |
加新图表 |
2 |
从工具箱的“类”页面中,将“类”图标图表图表上并给元素起一个合适的名称。 |
创建元素 |
3 |
右键单击类元素并选择“新子图表|状态机”上下文菜单选项。 给状态机图一个合适的名字。 |
|
4 |
创建状态机模型以反映状态之间的适当转换。 |
状态机 |
设置可执行状态机工件
节 |
行动 |
也见 |
---|---|---|
1 |
创建一个新的类图以包含您打算从中生成代码的建模状态机。 |
加新图表 |
2 |
从名称“元素图表工具箱”页面,将“仿真可执行状态机”图表图表上,以创建工具元素并放大其工件。 |
工件 |
3 |
从窗口中,首先将包含浏览器的元素状态机图类工件元素的浏览器窗口上。 '粘贴<元素名称>' 对话框显示。在“放下成”字段中,单击下拉箭头并选择值“属性”。 (如果对话框未显示,请在从浏览器窗口拖动类元素时按 Ctrl。) |
从浏览器窗口中删除元素 |
4 |
点击确定按钮。工件在组件内部的类元素是一个部件。 |
部件 |
5 |
对您想要组合并为其生成代码的任何其他具有状态机的类重复步骤 3 和 4。这些可能是:
|
|
6 |
右键单击工件元素>属性属性选项,展开“高级”类别,在“语言”字段中,单击下拉箭头并将代码语言设置为与当前语言相同的语言为类元素定义。 您可以将可执行状态机从浏览器工件现在元素部件模型上,并用不同的编程语言将部件修改为任何数量的系统或过程的变体或相同的过程。 |
生成工件
节 |
行动 |
也见 |
---|---|---|
1 |
单击可执行状态机工件并选择“元素> 可执行状态仿真状态机 >生成”功能区选项。 将显示“可执行状态机代码生成”对话框。 |
|
2 |
在“项目输出目录”字段中,键入或浏览要在其下创建输出文件的目录路径。 在代码生成期间,此目录中的所有现有文件都将被删除。 |
|
3 |
选择目标系统。如果您在窗口上运行,请选择“本地”选项。如果您在 Linux 上工作,请选择“远程”选项。该选择会影响为支持仿真而生成的脚本。 |
|
4 |
在“<compiler> 安装目录位置”字段中,键入或浏览编译器安装目录的路径,以自动映射到本地路径(显示在字段左侧)。对于每种编程语言,路径可能类似于以下示例:
|
|
5 |
点击生成按钮。代码文件是根据编程语言创建的。 系统输出显示“可执行状态机输出”选项卡,显示生成的进度和状态。 在代码生成期间,执行自动验证函数以根据UML约束检查图表或模型错误。任何错误都由“可执行状态机输出”选项卡上的错误消息标识。 双击错误信息可以显示发生错误的建模结构,并在重新生成代码之前更正错误。 |
|
6 |
当出现错误时,点击工件生成组件> 无仿真元素> 选择“可执行状态状态机>编译”功能区选项进行编译。 系统输出窗口显示一个“编译”选项卡,显示编译的进度和状态。请注意,编译包括模拟操作的配置。 |
代码生成宏
您还可以在状态机的代码生成中使用两个宏。
宏名称 |
描述 |
---|---|
SEND_EVENT |
将事件发送到接收器(部件)。例如: %SEND_EVENT("event1", "Part1")% |
BROADCAST_EVENT |
向所有接收者广播一个事件。例如: %BROADCAST_EVENT("event2")% |
执行/仿真工件
节 |
行动 |
也见 |
---|---|---|
1 |
选择功能区选项“仿真>动态仿真仿真>模拟器>应用工作空间”,将仿真窗口和仿真事件窗口一起显示 将两个窗口停靠在屏幕的方便区域。 |
仿真窗口 仿真事件窗口 |
2 |
在图表窗口上,单击工件浏览器元素选择“仿真>运行状态> 状态机>”功能区选项。 该系列中的第一个状态机图显示了已经开始的过程模拟。在仿真窗口中,处理步骤以这种格式表示: [03516677] Part1[Class1].Initial_367_TO_State4_142影响 [03516683] Part1[Class1].StateMachine_State4 ENTRY [03516684] Part1[Class1].StateMachine_State4 DO [03518375] 被封锁 |
|
3 |
单击相应的仿真窗口工具栏按钮,按照您的喜好逐步完成仿真。 当仿真在退出或终止元素结束时,单击仿真窗口工具栏中的停止按钮。 |
运行模型仿真 |
4 |
在跟踪显示 Blocked 的情况下,模拟已达到必须发生触发器事件才能继续处理的点。在仿真事件窗口的“等待触发器”栏中,双击相应的“触发器”。 当触发器触发时,模拟继续到下一个暂停点,触发器或退出。 |
触发器 等待触发器 |
注记
- 如果您对现有状态机模型进行小幅更改,您可以通过选择“仿真> 可执行状态 > 状态机 >生成、构建和运行”功能区选项来组合代码生成、构建和运行操作
- 您还可以在JavaScript中生成代码