В этом примере показано, как смоделировать систему лифтов с двумя автомобилями с помощью связанных атомарных субдиаграмм в Stateflow ®. Лифтовая система состоит из модели Simulink ® и пользовательского интерфейса (UI). Модель содержит две диаграммы Stateflow:
Система лифтов моделирует логику ядра, которая делегирует входящие запросы от UI к ближайшему доступному вагону лифта. Этот график содержит пару атомарных субдиаграмм, которые реализуют идентичную логику для автомобилей.
UI Controller обрабатывает информацию из графика системы лифтов и обновляет отображение пользовательского интерфейса. На этом графике каждая атомарная субдиаграмма определяет, когда перемещать вагон лифта и когда открывать его двери.
В начале симуляции модель открывает пользовательский интерфейс. UI показывает две машины лифта, которые могут остановиться на девяти этажах. В нижней части UI два желтых прямоугольника представляют интерьер вагонов лифта. В то время как пример бежит, вы вызываете автомобиль лифта, запрашиваете остановку на полу, или запускаете пожарную сигнализацию, нажимая кнопки на каждом этажном коридоре и внутри вагонов лифта. Пользовательский интерфейс реагирует, изменяя входные значения и вызывая входные события для графика системы лифта.
Система лифтов графика состоит из трёх параллельных субдиаграмм. Каждая из этих субдиаграмм управляет очередью запросов от пользовательского интерфейса:
The Elevator_Manager
субдиаграмма реализует основную логику управления для системы лифта. Эта субдиаграмма управляет очередью залов, которая содержит все запросы, генерируемые при нажатии кнопки в одном из коридоров этажа. Субдиаграмма обрабатывает эти запросы и делегирует их одному из вагонов лифта, в зависимости от наличия и близости к запросу.
Elevator_A
и Elevator_B
представляют логику для двух вагонов лифта. У каждого автомобиля есть своя очередь, в которой хранятся все запросы этажа. Запросы этажа генерируются при нажатии кнопки внутри автомобиля лифта или когда Elevator_Manager
делегирует запрос из очереди зала в машину.
Вагоны лифта используют идентичную логику, чтобы обработать свои индивидуальные очереди запросов. График системы лифта моделирует их поведение с помощью связанных атомарных субдиаграмм из библиотечной модели.
В модели библиотеки график Elevator
реализует логику типового автомобиля лифта. Для программирования субдиаграмм Elevator_A
и Elevator_B
чтобы они управляли соответствующим автомобилем, вы сопоставляете данные и события в каждой субдиаграмме с соответствующими данными и событиями в основном графике. Для образца, для Elevator_B
:
Входной параметр субдиаграммы floor_request
преобразуется в входной параметр графика CarB_floor_request
.
Выходные данные субдиаграммы position
преобразуется в выходные данные графика B_position
.
Выходные данные субдиаграммы doorOpen
преобразуется в выходные данные графика doorBOpen
.
Событие субдиаграммы CAR_CALL
сопоставляется с событием графика CAR_CALL_B
.
Чтобы просмотреть преобразования для каждого атомарного подграфика, щелкните правой кнопкой мыши подграфик и выберите Сопоставления подграфика.
Чтобы управлять отображением пользовательского интерфейса каждого вагона лифта, на графике UI Controller используются две атомарные субдиаграммы, соединенные из библиотечной модели.
Для получения дополнительной информации об использовании атомарных субдиаграмм для инкапсуляции и повторного использования логики, смотрите, Создают переиспользуемые подкомпоненты при помощи атомарных субдиаграмм.
Модель в этом примере является переработанной версией старой модели, которая не использует атомарные субдиаграммы. Исходная модель использует отдельные субдиаграммы, чтобы управлять запросами этажа (субдиаграмм Elevator_A
и Elevator_B
системы лифтов графика) и для управления UI-дисплеем лифтовых вагонов (субдиаграммы CarA_Controller
и CarB_Controller
графика Контроллер). В каждом случае субдиаграмм являются почти идентичными копиями друг друга. Они отличаются только именами данных и событий, которые они используют.
Чтобы преобразовать повторяющиеся субдиаграммы в атомарные субдиаграммы, сначала сделайте библиотечную атомарную субдиаграмму из одной из субдиаграмм. Затем используйте связанные образцы этой библиотеки, чтобы заменить повторяющиеся субдиаграммы. Для примера рассмотрим повторяющиеся субдиаграммы вагона лифта графика лифта. Эти субдиаграммы вызывают несколько функций и локальных переменных, которые определены в Elevator_Manager
субдиаграмма. Перед созданием атомарной субдиаграммы необходимо сделать эти субдиаграммы независимыми и автономными модулями.
1. Миграция этих функций из Elevator_Manager
субдиаграмма в родительский график:
exists_in_queue
deregister
dequeue
Переименуйте эти функции, чтобы отличить их от функций внутри субдиаграмм автомобиля лифта.
2. Используя Model Explorer, миграция этих переменных из Elevator_Manager
субдиаграмма в родительский график:
hall_call_queue
hall_call_status
3. На графике системы лифтов задайте значение свойства диаграммы Экспортировать функции уровня диаграммы true
. Для получения дополнительной информации смотрите Экспорт функций Stateflow для повторного использования.
4. Измените Elevator_Manager
и Elevator_A
субдиаграммы для использования перенесенных функций и переменных.
5. Создайте библиотечную атомарную субдиаграмму из Elevator_A
субдиаграмма, как описано в Reuse a State Multiple Times in a Chart.
6. Чтобы позволить атомарной субдиаграмме передать положение кабины лифта на содержащий график, измените возможности данных субдиаграммы position
от Local
на Output
.
7. Замените две субдиаграммы лифтов на связанные атомарные субдиаграммы. Для каждой связанной атомарной субдиаграммы сопоставьте данные и события с родительским графиком. Для получения дополнительной информации смотрите Map Переменных для Atomic Субдиаграмм и Boxes.