В этом примере показано, как создать приложение инструментальной панели 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];
endfunction 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');