使用原子子图建模电梯系统
这个例子展示了如何使用Stateflow®中的链接原子子图来建模一个双车厢电梯系统。电梯系统由Simulink®模型和用户界面(UI)组成。该模型包含两个状态流图:
电梯系统对核心逻辑进行建模,该逻辑将来自UI的传入请求委托给最近的可用电梯车厢。这个图表包含一对原子子图表,它们为汽车实现了相同的逻辑。
UI Controller处理来自电梯系统图表的信息并更新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.使用Model Explorer,将这些变量从Elevator_Manager
子图放入父图:
hall_call_queue
hall_call_status
3.在“电梯系统”图表中,设置导出图表级别功能图表属性为真正的
.有关更多信息,请参见导出状态流函数以供重用.
4.修改Elevator_Manager
而且Elevator_A
子图使用迁移的函数和变量。
5.控件创建库原子子图Elevator_A
子图表,如在图表中多次重用某个状态.
6.要使原子子图能够将电梯车厢的位置传递给包含的图,请更改范围的子图数据位置
从当地的
来输出
.
7.用链接的原子子图替换两个电梯子图。对于每个链接原子子图,将数据和事件映射到父图。有关更多信息,请参见原子子图和框的映射变量.