В этом примере показано, как создать приложение инструментальной панели App Designer для приложения Simulink Real-Time, которое вы создаете от xpctank
модель. Инструментальная панель содержит эти компоненты App Designer:
Ползунок — Чтобы настроить необходимый уровень бака (Заданное значение).
Линейный Прибор — Чтобы отобразить фактический уровень бака (TankLevel).
Полукруглый Прибор — Чтобы отобразить насос управляет состоянием (ControlValue).
Оси — Чтобы отобразить вывод сигнала для SetPoint, TankLevel и ControlValue.
Этот пример также показывает, как передать потоком сигнал и данные о параметре между приложением реального времени и приложением инструментальной панели при помощи объекта инструментирования.
open_system(docpath(fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','xpctank')));
Эти операции генерируют приложение реального времени что потоковые данные к приложению инструментальной панели App Designer.
Запустите целевой компьютер.
Откройте модель xpctank
.
Соедините компьютер разработчика с целевым компьютером. Создайте xpctank
модель. Разверните приложение реального времени в целевой компьютер. В Командном Окне MATLAB введите:
set_param('xpctank', 'RTWVerbose', 'off'); tg = slrt('TargetPC1'); rtwbuild('xpctank'); load(tg,'xpctank');
### Starting Simulink Real-Time build procedure for model: xpctank ### Generated code for 'xpctank' is up to date because no structural, parameter or code replacement library changes were found. ### Successful completion of build procedure for model: xpctank ### Created MLDATX ..\xpctank.mldatx
Приложение инструментальной панели App Designer tankApp
обеспечивает средства управления, чтобы запуститься и взаимодействовать с приложением реального времени xpctank
.
Выполнение приложения. Щелкните правой кнопкой по tankApp.mlapp
файл и нажимает Run. Или в Командном окне введите: tankApp
Запустите потоковые данные и приложение реального времени. В приложении инструментальной панели нажмите Start. Запуски приложения реального времени и потоковые данные к приложению. Оси отображают изменения в значениях сигналов.
Настройте ползунок SetPoint. Сигналы приложения реального времени реагируют на изменение сетбола.
Чтобы остановить приложение, нажмите Stop.
Чтобы обеспечить интерактивное отображение инструментальной панели для симуляции, создайте и сохраните приложение инструментальной панели App Designer для xpctank
приложение реального времени.
Создать инструментальную панель в App Designer:
От вкладки MATLAB Home выберите New> App.
В начальной странице App Designer нажмите Blank App. Сохраните приложение App Designer как my_tankApp.mlapp
.
От Режима конструктора App Designer кликните по холсту приложения. В Component Browser расширьте вкладку Position и установите положение холста на 100 100 640 504
.
Примечание: настройки положения являются дополнительными. Эта информация предоставляется, если вы хотите, чтобы ваше размещение инструментальной панели точно совпадало с панелью в качестве примера.
Добавьте управление ползунком из библиотеки компонентов. Пометьте ползунок как Set Point
. Восток ползунок как вертикальный. Установите Предел ползунка как 0 10
.
С меткой ползунка выбранный On холста, в Component Browser, расширяет вкладку Position и установил положение метки ползунка на 41 136 54 22
. С выбранной линейкой ползунка, в Component Browser, расширяют вкладку Position и устанавливают положение ползунка на 58 172 3 259
.
С программированием вы соединяете управление ползунком SetPoint с параметром SetPoint в приложении реального времени. Смотрите Добавляют Функции обратного вызова к Приложению.
Добавьте полукруглый прибор из библиотеки компонентов. Пометьте прибор как Control Value
(с переводом строки между словами). Установите Предел прибора как -2 12
. Установите MajorTicks как 0 10
.
Чтобы пометить две метки деления как Прочь и На, установите MajorTicksMode, MajorTickLabelsMode и MinoTicksMode к manual
. Затем установите MajorTickLabels на Off On
(с переводом строки между словами).
С выбранной меткой прибора, в Component Browser, расширяют вкладку Position и устанавливают положение метки на 79 12 44 28
. С выбранным набором прибора, в Component Browser, расширяют вкладку Position и устанавливают положение прибора на 55 55 92 50
.
С программированием вы соединяете прибор ControlValue с сигналом ControlValue в приложении реального времени. Смотрите Добавляют Функции обратного вызова к Приложению.
Добавьте линейный прибор из библиотеки компонентов. Пометьте прибор как Tank Level
. Восток прибор как вертикальный. Установите Предел прибора как 0 10
.
С выбранной меткой прибора, в Component Browser, расширяют вкладку Position и устанавливают положение метки на 110 136 63 22
. С выбранной линейкой прибора, в Component Browser, расширяют вкладку Position и устанавливают положение прибора на 110 168 32 270
.
С программированием вы соединяете прибор TankLevel с сигналом TankLevel в приложении реального времени. Смотрите Добавляют Функции обратного вызова к Приложению.
Добавьте оси графика из библиотеки компонентов. Удалите Title
. Установите строку XLable на time
, и затем удалите строку YLable. Установите XLim на 0 10
и YLim к -1 13
.
С выбранными осями, в Component Browser, расширяют вкладку Position и устанавливают положение осей на 197 94 424 396
.
Добавьте кнопку из библиотеки компонентов. Пометьте кнопку как StartStop
. Эта кнопка запускает и останавливает приложение реального времени на целевом компьютере.
С нажатой кнопкой, в Component Browser, расширяют вкладку Position и устанавливают положение кнопки на 18 449 171 41
.
С программированием вы направляете приложение, чтобы ответить на события нажатия кнопки. Смотрите Добавляют Функции обратного вызова к Приложению.
App Designer добавляет код пользовательского интерфейса для каждого компонента, что вы добавляете в приложение инструментальной панели App Designer my_tankApp
. Код пользовательского интерфейса задает внешний вид компонента.
Чтобы добавить функциональность в компоненты пользовательского интерфейса, вы добавляете свойства, методы и коллбэки в Представлении кода App Designer.
Переключитесь на Представление кода. В Браузере Кода нажмите Properties, и затем выберите Add> Private Property.
Замените Property % Description
с этими свойствами. Эти свойства идентифицируют целевой компьютер, модель, объект инструментирования и запустить/остановить значки кнопки.
tg mdl = 'xpctank'; hInst stopIcon = 'stop_24.png'; startIcon = 'run_24.png';
В Браузере Кода нажмите Functions, и затем выберите Add> Private Function.
Замените функцию результатов:
function results = func(app)
end
с этими функциями. Эти функции настраивают объект инструментирования и коллбэк, чтобы анимировать оси графика.
Для прибора уровня бака и прибора значения управления, HistoryFlag
установлен в '1', потому что эти сигналы были уже добавлены к объекту инструментирования как линии. Их история должна присутствовать даже при том, что скалярное отображение использует только последнее значение.
function setupInstrumentation(app) % create the instrumentation object app.hInst = SimulinkRealTime.prototype.Instrumentation(app.mdl); % connect signals to the axes [~,line1] = app.hInst.connectLine(app.UIAxes,[app.mdl '/SetPoint'] ,1,'MaximumNumPoints',10000); [~,line2] = app.hInst.connectLine(app.UIAxes,[app.mdl '/TankLevel'] ,1,'MaximumNumPoints',10000); [~,line3] = app.hInst.connectLine(app.UIAxes,[app.mdl '/ControlValue'],1,'MaximumNumPoints',10000); % add a legend legend(app.UIAxes,{line1{1},line2{1},line3{1}}) % connect signals to the scalar displays app.hInst.connectScalar(app.TankLevelGauge ,[app.mdl '/TankLevel'] ,1,'HistoryFlag',1); app.hInst.connectScalar(app.ControlValueGauge,[app.mdl '/ControlValue'],1,'HistoryFlag',1); % add a callback to wrap the x axis app.hInst.connectCallback(@app.updateUIAxes); app.UIAxes.XLim = [0 10]; app.UIAxes.YLim = [-1 13]; end
function updateUIAxes(app,instObj,eventData) % this callback updates XLim so that the axis wrap currTime = eventData.ExecTime; if max(currTime)<max(app.UIAxes.XLim) % do nothing else app.UIAxes.XLim = max(app.UIAxes.XLim) + [0 10]; end end
При использовании connectLine
функционируйте, чтобы соединить выходные сигналы от приложения реального времени до объекта инструментирования, Simulink Real-Time Explorer обеспечивает полезное представление сигналов и их номеров портов. Чтобы открыть Проводник и просмотреть сигналы, в Окне Команды MATLAB, введите:
SimulinkRealTime.prototype.Explorer
Функции обратного вызова в приложении отвечают на события. События, которые обслуживаются функциями обратного вызова, включают запуск приложения, нажатие кнопки, новые данные сигнала и изменение значения параметров.
Добавьте функцию запуска
Функция запуска startupFcn
в выполнении приложения после создания компонента.
Переключитесь на Режим конструктора и нажмите на холст приложения. В Component Browser, во вкладке Callbacks, выбирают add StartupFcn callback
. Добавьте этот код в startupFcn
функция.
% get target object app.tg = slrt; % if the target is running stop it if strcmp(app.tg.status,'running') app.tg.stop; end % load the model on to the target app.tg.load(app.mdl);
% update the slider based on the target value value = app.tg.getparam('SetPoint','Value'); app.SetPointSlider.Value = value;
% setup the instrumentation object app.setupInstrumentation;
Добавьте, что интерфейс закрывает функцию запроса
Близкий запрос функционирует UIFigureCloseRequest
в выполнении приложения, когда приложение закрывается. Объект инструментирования использует коллбэки, чтобы добавить данные о потоковой передаче в ваш UIAxes. Если вы удаляете UIAxes путем удаления и закрытия UIFigure без первого удаления объекта инструментирования, состояние коллбэков приводит к ошибкам или предупреждениям. Лучшая практика состоит в том, чтобы добавить близкий коллбэк запроса в приложение, которое останавливается, инструментирование возражают, и удаляет его.
Переключитесь на вкладку Design View и кликните по холсту приложения. В Component Browser, во вкладке Callbacks, выбирают add CloseRequestFcn callback
. В UIFigureCloseRequest
функция, замена delete(app)
с этим кодом:
app.hInst.stop; app.tg.stop; delete(app.hInst) delete(app)
Добавьте функцию значения изменения сетбола
Изменение заданного значения функционирует SetPointSliderValueChanged
в выполнении приложения, когда значение ползунка сетбола изменяется.
Переключитесь на вкладку Design View и кликните на съемочной площадке по ползунку точки. В Component Browser, во вкладке Callbacks, выбирают add ValueChangedFcn callback
. В SetPointSliderValueChanged
функция, замена value = app.SetPointSlider.Value;
с этим кодом:
value = app.SetPointSlider.Value; app.tg.setparam('SetPoint','Value',value);
Добавьте стартстопную функцию события нажатия кнопки
Коллбэк, который вы добавляете в определение кнопки, переключает текст и значок на этой кнопке, в зависимости от состояния приложения. Нажмите Start, чтобы запустить приложение реального времени на целевом компьютере и потоковых данных к приложению инструментальной панели. Нажмите Stop, чтобы остановить приложение реального времени.
С нажатой кнопкой, в Component Browser, нажимают Callbacks. Выберите StartStopButtonPushed
и кликните по курсору Перемещения к функциональной клавише. Добавьте этот код в StartStopButtonPushed
функция.
if strcmp(app.StartStopButton.Icon, app.startIcon) % START % clear old data app.hInst.clearData; % start instrumentation and target app.hInst.start(app.tg); % change the icon app.StartStopButton.Icon = app.stopIcon; app.StartStopButton.Text = 'Stop';
else % STOP app.hInst.stop; app.tg.stop; % change the icon app.StartStopButton.Icon = app.startIcon; app.StartStopButton.Text = 'Start'; end
Приложение my_tankApp
приложение завершено. Ползунок, полукруглый прибор, линейный прибор, оси, и Запускаются - *Stop*, кнопка имеет код коллбэка, который отвечает на их события. Приложение соединяет с приложением реального времени xpctank
при помощи инструментирования возражают, чтобы передать данные потоком к приложению.
В App Designer сохраните приложение my_tankApp
.
Запустите приложение реального времени xpctank
и запустите приложение App Designer my_tankApp
. Для инструкций смотрите, Запускают Приложение реального времени Целевого компьютера и Сборки и Запуск Приложение Инструментальной панели App Designer.
bdclose ('all');