В этом примере показано, как создать интерфейс между графиком Stateflow ®, которая использует C в качестве языка действий, и приложением MATLAB ®, созданным в App Designer. Для получения дополнительной информации о соединении диаграммы Stateflow, которая использует MATLAB в качестве языка действий с приложением MATLAB, смотрите Модель Контроллера Степени.
В этом примере приложение MATLAB моделирует передний конец медиаплеера. Во время симуляции можно выбрать между компонентами AM-радио, FM-радио и CD-проигрывателем медиаплеера. Когда проигрыватель CD включен, можно также выбрать режим воспроизведения.
Диаграмма Stateflow App Interface
обеспечивает двунаправленное соединение между приложением MATLAB и системами управления и объекта в модели Simulink ®. При взаимодействии с виджетами в приложении график отправляет соответствующую команду на другие графики в модели. Эти графики используют строки, чтобы контролировать поведение медиаплеера и предоставлять сообщения на естественном языке выхода, которые указывают на его состояние. При изменении статуса медиаплеера график изменяет цвет кнопок и обновляет текстовое поле в нижней части приложения.
Откройте модель Simulink и нажатие кнопки Запуска. Откроется приложение Media Player Helper. Текстовое поле в нижней части приложения показывает состояние медиаплеера, Standby (OFF)
.
В разделе Radio Request нажмите CD. Состояние медиаплеера изменяется на CD Player: Empty
.
Нажмите Insert Disc.Краткое описание состояния медиаплеера Reading: Handel's Greatest Hits
перед переходом на CD Player: Stopped
.
В разделе Запрос компакт-диска нажмите кнопку ВОСПРОИЗВЕДЕНИЕ. Состояние медиаплеера изменяется на Playing: Handel's Greatest Hits
и музыка начинает играть.
В разделе Запросе нажмите FF. Музыка останавливается и начинается щебет звуков. Состояние носителя изменяется на Forward >> Handel's Greatest Hits
. Имя альбома в этом сообщении прокручивается по отображению.
Используйте приложение Media Player Helper, чтобы выбрать другие режимы работы или ввести другое имя альбома. Например, попробуйте сыграть на альбомы Training Deep Networks
или Fun With State Machines
. Чтобы остановить симуляцию, закройте приложение Media Player Helper.
График App Interface
уже настроен для связи с приложением MATLAB sf_mediaplayer_app
. Чтобы создать двунаправленное соединение между приложением MATLAB и диаграммой Stateflow, которая использует C в качестве языка действий, выполните следующие шаги. В приложении MATLAB:
Создайте пользовательское свойство для взаимодействия с графиком во время симуляции. Приложение использует это свойство для доступа к входам графика, выходам графика и локальным данным. Для получения дополнительной информации см. раздел «Обмен данными в приложениях App Designer».
Измените startupFcn
коллбэк для приложения путем добавления нового входного параметра и хранения его значения в качестве свойства, которое вы создали на предыдущем шаге. Для получения дополнительной информации см. Раздел «Запись коллбэков в App Designer».
На диаграмме Stateflow:
Создайте локальный объект данных для интерфейса с приложением. График использует этот локальный объект данных в качестве аргумента при вызове вспомогательных функций в приложении.
Установите тип локального объекта данных, созданный вами на предыдущем шаге, равным ml
. Для получения дополнительной информации см. Раздел «Задание типа данных Stateflow».
Запустите приложение с помощью ml
оператор пространства имен, чтобы указать, что приложение является внешним кодом MATLAB. Передайте ключевое слово this
как аргумент, чтобы предоставить приложению доступ к графику во время симуляции. Сохраните значение, возвращенное вызовом функции в приложение, как локальный объект данных, который вы создали для взаимодействия с приложением. для получения дополнительной информации смотрите Доступ к функциям MATLAB и данным рабочей области в графиках С.
В этом примере приложение Media Player Helper использует свойство под названием chart
для взаимодействия с графиком App Interface
. Коллбэки приложения используют это свойство для записи в выходы графика:
Когда вы вставляете или выталкиваете диск, EjectButtonPushed
коллбэк устанавливает значения insert
, eject
, и Album
.
При нажатии кнопки в разделе Radio Request приложения соответствующие коллбэки устанавливают значение RadioReq
.
При нажатии кнопки в разделе Запросе приложения соответствующие коллбэки устанавливают значение CDReq
.
Когда вы закрываете приложение, UIFigureCloseRequest
коллбэк устанавливает значение Stop
на true
.
И наоборот, на графике, действия входа в InterfaceWithApp
состояние запуска приложения sf_mediaplayer_app
и сохраните возвращенное значение как локальный объект данных app
. График использует этот локальный объект данных, когда вызывает вспомогательные функции updateButtons
и updateStatus
. В приложении эти вспомогательные функции изменяют цвет кнопок и обновляют текстовое поле в нижней части приложения на основе значения входов графика RadioMode
, CDMode
, и CDStatus
.
The Mode Manager
график активирует соответствующий подкомпонент медиаплеера (AM-радио, FM-радио или CD-проигрыватель) в зависимости от входов, полученных от App Interface
график. Входные входы графика RadioReq
и CDReq
содержат строковые данные, которые управляют поведением графика. Чтобы вычислить строковые данные, график использует строковый оператор strcmp
и его эквивалентная стенографическая форма ==
. Выходные данные графика CurrentRadioMode
обеспечивает выход данных на естественном языке для приложения, в то время как MechCmd
управляет поведением подкомпонента проигрывателя компакт-дисков. Чтобы присвоить значения этим выходам, график использует строковый оператор strcpy
и его эквивалентная стенографическая форма =
.
В начале симуляции NormalOperation
состояние становится активным. Если логические данные DiscEject
является true
, переход к Eject
происходит состояние, за которым следует переход назад в NormalOperation
состояние.
Когда NormalOperation
активно, ранее активное подсостояние (Standby
или ON
), записанный историческим соединением, становится активным. Последующие переходы между Standby
и ON
подсостояния зависят от значения выражения strcmp(RadioReq,"OFF")
:
Если strcmp
возвращает значение нуля, затем RadioReq
является "OFF"
и Standby
подсостояние активируется.
Если strcmp
возвращает ненулевое значение, затем RadioReq
не является «|OFF|» и ON
подсостояние активируется.
В ON
substate, три подсостояния представляют рабочие режимы медиаплеера: CD-проигрыватель, AM-радио и FM-радио. Каждое подсостояние соответствует другому значению входного RadioReq
. Внутренний переход внутри ON
состояние использует оператор hasChanged
постоянно сканировать на изменения в значении RadioReq
.
Если значение RadioReq
является "CD"
, затем substate CDMode
становится активным, и медиаплеер переходит в режим CD-проигрывателя. The Mode Manager
выходы графика "PLAY"
, "REW"
, "FF"
, и "STOP"
команды к CD Player
график через строковые данные MechCmd
.
Если значение RadioReq
является "AM"
, затем substate AMMode
становится активным, и медиаплеер переключается в режим радиосвязи AM. The Mode Manager
график выводит "STOP"
команда на CD Player
график через строковые данные MechCmd
.
Если значение RadioReq
является "FM"
, затем substate FMMode
становится активным, и медиаплеер переключается в режим FM-радио. The Mode Manager
график выводит "STOP"
команда на CD Player
график через строковые данные MechCmd
.
The CD Player
график активирует соответствующий режим работы проигрывателя компакт-дисков в зависимости от входов, полученных от App Interface
и Mode Manager
чарты. Входные входы графика Cmd
и Album
содержат строковые данные, которые управляют поведением графика. Выходные данные графика AlbumName
обеспечивает выход на естественный язык приложения. Чтобы назначить и сравнить значения строковых данных, график использует краткие операции =
(см. strcpy) и ==
(см. strcmp). Чтобы создать текст в выход строке CDStatus
график использует строковые операторы strcat
, strlen
, и substr
.
В начале симуляции Empty
состояние активировано.
Если логические данные DiscInsert
является true
, переход к Inserting
происходит состояние. После короткой задержки переход к DiscPresent
происходит состояние. The DiscPresent
состояние остается активным до тех пор, пока данные не Cmd
становится "EJECT"
. На этой точке переход к Ejecting
происходит состояние. После короткой задержки переход к Empty
происходит состояние. Оператор временной логики after
управляет синхронизацией переходов во время вставки и выталкивания диска.
Когда происходит переход состояния, действие входа в новом состоянии изменяет значение CDStatus
для отражения статуса проигрывателя компакт-диска. В FF
или REW
подсостояния, во время действия постоянно изменяют значение CDStatus
для создания эффекта прокрутки движения.
Когда активное состояние Empty
, значение CDStatus
является "CD Player: Empty"
.
Когда активное состояние Inserting
, значение CDStatus
является "Reading: AlbumName"
.
Когда активное состояние Ejecting
, значение CDStatus
является "Ejecting: AlbumName"
.
Когда активное состояние DiscPresent.STOP
, значение CDStatus
является "CD Player: Stopped"
.
Когда активное состояние DiscPresent.PLAY
, значение CDStatus
является "Playing: AlbumName"
.
Когда активное состояние DiscPresent.REW
, значение CDStatus
является "Reverse << AlbumName"
, где AlbumName
прокрутка назад по отображению.
Когда активное состояние DiscPresent.FF
, значение CDStatus
является "Forward >> AlbumName"
, где AlbumName
прокрутка по отображению.
after | hasChanged | strcat | strcmp | strcpy | strlen | substr