主要内容

使用原子子图建模电梯系统

这个例子展示了如何使用Stateflow®中的链接原子子图来建模一个两厢电梯系统。电梯系统由Simulink®模型和用户界面(UI)组成。该模型包含两个状态流程图:

  • Elevator System对核心逻辑建模,该逻辑将来自UI的传入请求委托给最近的可用电梯轿厢。此图表包含一对原子子图表,为汽车实现相同的逻辑。

  • UI控制器处理来自电梯系统图表的信息并更新UI显示。在这个图表中,每个原子子图表决定何时移动电梯厢,何时打开电梯门。

在模拟开始时,模型打开UI。用户界面显示了两个可以停在九层楼的电梯车厢。在UI的底部,两个黄色矩形表示电梯轿厢的内部。在运行示例时,您呼叫电梯轿厢,请求在某一楼层停车,或者通过单击每一楼层走廊和电梯轿厢内的按钮来触发火灾警报。UI通过修改输入值和触发Elevator System图表的输入事件进行响应。

管理来自用户界面的请求

电梯系统图由三个平行子图组成。每个子图都管理来自UI的请求队列:

  • Elevator_Manager子图实现了电梯系统的主控逻辑。此子图管理大厅队列,其中包含当您单击某个楼层走廊中的按钮时生成的所有请求。子图处理这些请求,并将它们委托给其中一个电梯轿厢,具体取决于是否可用以及与请求的距离。

  • Elevator_A而且Elevator_B表示两个电梯轿厢的逻辑。每节车厢都有自己的队列,用于保存其所有的楼层请求。楼层请求是在您单击电梯轿厢内的按钮时生成的Elevator_Manager将大厅队列中的请求委托给汽车。

使用原子子图重用逻辑模式

电梯轿厢使用相同的逻辑来处理它们各自的请求队列。电梯系统图通过使用链接的原子子图对它们的行为进行建模库模型

在图书馆模型中,图表电梯实现通用电梯轿厢的逻辑。对子图表进行编程Elevator_A而且Elevator_B为了控制适当的汽车,您可以将每个子图中的数据和事件映射到主图中的相应数据和事件。例如,对于Elevator_B:

  • 子图输入floor_request映射到图表输入CarB_floor_request

  • 子图输出位置映射到图表输出B_position

  • 子图输出doorOpen映射到图表输出doorBOpen

  • 子图事件CAR_CALL映射到图表事件CAR_CALL_B

要查看每个原子子图的映射,右键单击子图并选择子图表映射

为了控制每个电梯轿厢的UI显示,UI Controller图使用了两个原子子图库模型

有关使用原子子图封装和重用逻辑的详细信息,请参见使用原子子图创建可重用的子组件

在你的设计中加入原子子图

类的重新设计版本旧的模型它不使用原子子图。原始模型使用单独的子图来管理楼层请求(子图)Elevator_A而且Elevator_B的电梯系统图)和控制电梯轿厢的UI显示(子图)CarA_Controller而且CarB_Controller的UI控制器图表)。在每种情况下,子图表几乎是彼此相同的副本。它们的区别仅仅在于所使用的数据和事件的名称。

要将重复子图转换为原子子图,首先要从其中一个子图生成一个库原子子图。然后使用此库的链接实例替换重复的子图。例如,考虑电梯系统图的重复电梯轿厢子图。类中定义的几个函数和局部变量Elevator_Manager子图表。在创建原子子图之前,必须使这些子图成为独立和自包含的单元。

1.将这些函数从Elevator_Manager子图进入父图:

  • exists_in_queue

  • 取消

  • 出列

重命名这些函数,以将它们与电梯轿厢子图中的函数区分开来。

2.使用模型资源管理器,将这些变量从Elevator_Manager子图进入父图:

  • hall_call_queue

  • hall_call_status

3.在“电梯系统”图表中,设置导出图表级别函数图表属性到真正的.有关更多信息,请参见导出状态流函数以供重用

4.修改Elevator_Manager而且Elevator_A子图表来使用迁移的函数和变量。

5.类创建库原子子图Elevator_A子图表,如中所述在图表中多次重用一个状态

6.要使原子子图能够将电梯轿厢的位置传递给包含的图,请更改范围子图数据的位置当地的输出

7.用链接的原子子图替换两个电梯子图。对于每个链接的原子子图,将数据和事件映射到父图。有关更多信息,请参见原子子图和框的映射变量

相关的话题

Baidu
map