В этом примере показано, как смоделировать логику графического пользовательского интерфейса в автономном графике Stateflow ®. Автономные диаграммы реализуют классическую семантику графика с MATLAB ® в качестве языка действий. Можно запрограммировать график, используя полную функциональность MATLAB, включая те функции, которые ограничены для генерации кода в Simulink ®. Для получения дополнительной информации смотрите Создание диаграмм Stateflow для выполнения в качестве объектов MATLAB.
Можно выполнить автономную диаграмму Stateflow, вызвав ее входные события и используя темпоральные операторы. Рабочий процесс выполнения, управляемый событиями и таймером, подходит для разработки логических базовых интерфейсов (HMI) и графических пользовательских интерфейсов (UI).
При использовании MATLAB App Designer функции обратного вызова из виджетов интерфейса активируют события на графике.
На диаграмме Stateflow темпоральные операторы и локальные данные управляют свойствами пользовательского интерфейса.
Дополнительные сведения о том, как использовать MATLAB для создания графических пользовательских интерфейсов, см. в разделе Разработка приложений с использованием App Designer.
Этот пользовательский интерфейс содержит выключатель, который управляет лампой. Когда переключатель находится в положении On, лампа загорается в одном из двух режимов, сплошном или мигающем, в зависимости от положения кнопки опция. Вы управляете скоростью мигания, перемещая ползунок Blink Rate.
Файл sf_lamp_logic.sfx
задает автономную диаграмму Stateflow, которая реализует логику для пользовательского интерфейса. График имеет входные события (ON
, OFF
, BLINKING
, и SOLID
) и локальные данные (delay
и app
). Действия на графике определяют, какие виджеты доступны из каждого состояния. Для образца действия в Off
состояние заставляет виджет Lamp, кнопки Mode и ползунок Blink Rate в пользовательском интерфейсе выглядеть затемненным.
В On
состояние, подсостояния Solid
и Blinking
обозначает два режима работы. Чтобы реализовать мигающую лампу, график опирается на оператор временной логики after
. Когда график входит в состояние Blinking.Off
, выражение after(delay,sec)
на исходящем переходе создает объект-таймер MATLAB, который выполняет график через несколько секунд. График затем переходит в состояние Blinking.On
и создает другой объект-таймер, чтобы запустить переход назад к Blinking.Off
. В то время как график постоянно переходит между двумя состояниями, можно настроить скорость мигания, изменив значение локальной задержки данных или перехода из мигающего режима путем вызова входа событий SOLID
или OFF
.
Историческое соединение в On
состояние сохраняет информацию о самом последнем активном подсостоянии, так что пользовательский интерфейс возвращается к предыдущему режиму работы, когда вы включаете лампу.
Выполнить автономную диаграмму можно путем вызова функций входных событий в Командном окне MATLAB. Редактор Stateflow показывает эффекты каждой из этих команд, подсвечивая активные состояния и переходы через анимацию на графике.
1. Откройте автономную диаграмму в редакторе Stateflow.
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
функция обратного вызова для виджета Switch:
function SwitchValueChanged(app,event) value = app.Switch.Value; switch lower(value) case 'off' OFF(app.lampLogic); case 'on' ON(app.lampLogic); end end
SelectionChangedFcn
функция обратного вызова для виджета Mode Button:
function ModeButtonGroupSelectionChanged(app,event) selectedButton = app.ModeButtonGroup.SelectedObject; if app.SolidButton == selectedButton SOLID(app.lampLogic); else BLINKING(app.lampLogic); end end
ValueChangedFcn
функция обратного вызова для виджета Blink Rate Slider:
function BlinkRateSliderValueChanged(app,event) app.lampLogic.delay = round(0.5/app.BlinkRateSlider.Value,2); end
При запуске пользовательского интерфейса можно наблюдать эффекты регулировки виджетов управления на холсте графика и на виджете лампы.