В этом примере показано, как моделировать логику графического интерфейса пользователя в автономной диаграмме Stateflow ®. Автономные диаграммы реализуют классическую семантику диаграмм с MATLAB ® в качестве языка действий. Можно запрограммировать диаграмму с помощью всех функциональных возможностей MATLAB, включая функции, ограниченные для генерации кода в Simulink ®. Дополнительные сведения см. в разделе Создание диаграмм потока состояний для выполнения в виде объектов MATLAB.
Можно выполнить автономную диаграмму Stateflow, вызвав ее входные события и используя временные операторы. Рабочий процесс выполнения на основе событий и таймеров подходит для разработки логики, лежащей в основе человеко-машинных интерфейсов (HMI) и графических пользовательских интерфейсов (UI).
При использовании MATLAB App Designer функции обратного вызова из виджетов интерфейса вызывают события на диаграмме.
В диаграмме Stateflow свойства пользовательского интерфейса контролируются временными операторами и локальными данными.
Дополнительные сведения об использовании MATLAB для создания графических пользовательских интерфейсов см. в разделе Разработка приложений с помощью App Designer.
Этот интерфейс пользователя содержит переключатель On-Off, управляющий лампой. Если переключатель находится в положении «Включено», индикатор загорается в одном из двух режимов, сплошном или мигающем, в зависимости от положения кнопки опции «Режим». Скорость мигания можно контролировать, перемещая ползунок Скорость мигания (Blink Rate).

Файл sf_lamp_logic.sfx определяет автономную диаграмму Stateflow, реализующую логику пользовательского интерфейса. Диаграмма содержит входные события (ON, OFF, BLINKING, и SOLID) и локальные данные (delay и app). Действия в диаграмме определяют, какие виджеты доступны из каждого состояния. Например, действия в Off состояние приводит к тому, что виджет «Лампа», кнопки опций «Режим» и ползунок «Скорость мигания» в интерфейсе пользователя становятся недоступными.

В On состояние, подстанции Solid и Blinking обозначают два режима работы. Для реализации мигающей лампы диаграмма опирается на оператор временной логики after. Когда диаграмма переходит в состояние Blinking.Off, выражение after(delay,sec) при исходящем переходе создается объект таймера MATLAB, который выполняет диаграмму через несколько секунд. Затем диаграмма переходит в состояние Blinking.On и создает другой объект таймера для запуска перехода обратно в Blinking.Off. В то время как диаграмма постоянно переходит между двумя состояниями, скорость мигания можно регулировать путем изменения значения локальной задержки данных или выхода из режима мигания путем вызова входных событий. SOLID или OFF.
Исторический стык в On состояние сохраняет информацию о последнем активном подсостоянии, так что пользовательский интерфейс возвращается к предыдущему режиму работы при включении лампы.
Автономную диаграмму можно выполнить, вызвав ее входные функции событий в окне команд MATLAB. Редактор потока состояний показывает эффекты каждой из этих команд, выделяя активные состояния и переходы с помощью анимации диаграммы.
1. Откройте автономную диаграмму в редакторе Stateflow Editor.
edit sf_lamp_logic.sfx
2. Создание объекта диаграммы L и инициализировать значение delay до 0,5. Это значение соответствует скорости мигания, равной одной вспышке в секунду.
L = sf_lamp_logic('delay',0.5);
3. Включите лампу.
ON(L)
4. Переключитесь в режим мигания.
BLINKING(L)
5. Установка значения delay до 0,25. Это значение соответствует скорости мигания, равной двум вспышкам в секунду.
L.delay = 0.25;
6. Переключиться в твердотельный режим.
SOLID(L)
7. Выключи лампу.
OFF(L)
8. Удаление объекта диаграммы L из рабочей области MATLAB.
delete(L)
Чтобы установить двунаправленное соединение между интерфейсом пользователя и автономной диаграммой Stateflow, откройте окно App Designer и выберите Просмотр кода.
1. В окне App Designer создайте частное свойство lampLogic для сохранения дескриптора в объекте диаграммы Stateflow.
properties (Access = private)
lampLogic
end
2. Создать StartupFcn функция обратного вызова, которая создает объект диаграммы и устанавливает его локальные данные app к дескриптору пользовательского интерфейса. Назначить дескриптор объекта диаграммы lampLogic частная собственность.
% Code that executes after component creation function StartupFcn(app) app.lampLogic = sf_lamp_logic('delay',0.5,'app',app); end
3. Создать CloseRequestFcn функция обратного вызова, которая удаляет объект диаграммы при закрытии интерфейса пользователя.
% Close request function: UIFigure function UIFigureCloseRequest(app, event) delete(app.lampLogic); delete(app); end
4. Для каждого из виджетов интерфейса пользователя добавьте функцию обратного вызова, которая вызывает соответствующее событие на автономной диаграмме.
ValueChangedFcn функция обратного вызова для виджета коммутатора:
function SwitchValueChanged(app,event) value = app.Switch.Value; switch lower(value) case 'off' OFF(app.lampLogic); case 'on' ON(app.lampLogic); end end
SelectionChangedFcn функция обратного вызова для графического элемента «Кнопка режима»:
function ModeButtonGroupSelectionChanged(app,event) selectedButton = app.ModeButtonGroup.SelectedObject; if app.SolidButton == selectedButton SOLID(app.lampLogic); else BLINKING(app.lampLogic); end end
ValueChangedFcn функция обратного вызова для графического элемента «Регулятор скорости мигания»:
function BlinkRateSliderValueChanged(app,event) app.lampLogic.delay = round(0.5/app.BlinkRateSlider.Value,2); end
При запуске интерфейса пользователя можно наблюдать влияние настройки управляющих виджетов на холсте диаграммы и на виджете лампы.