В этом примере показано, как m-скрипт MATLAB может создать инструментальную панель для приложения Simulink Real-Time, которое вы создаете из модели xpctank
. Инструментальная панель содержит эти компоненты пользовательского интерфейса:
Ползунок — Чтобы настроить необходимый уровень бака (Заданное значение).
Линейный Прибор — Чтобы отобразить фактический уровень бака (TankLevel).
Полукруглый Прибор — Чтобы отобразить насос управляет состоянием (ControlValue).
Оси — Чтобы отобразить вывод сигнала для SetPoint, TankLevel и ControlValue.
Этот пример также показывает, как передать потоком сигнал и данные о параметре между приложением реального времени и инструментальной панелью при помощи объекта инструментирования.
Пример пользовательский интерфейс и код коллбэка демонстрирует тонкие различия в синтаксисе между применением объекта инструментирования в m-скрипте по сравнению с применением объекта инструментирования в приложении App Designer. Для версии App Designer этого примера смотрите, Добавляет Приложение Инструментальной панели App Designer к Модели Бака.
open_system(docpath(fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','xpctank')));
Эти операции генерируют приложение реального времени что потоковые данные к приложению инструментальной панели.
Запустите целевой компьютер.
Откройте модель 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
Приложение инструментальной панели tankAppScript
обеспечивает средства управления, чтобы запуститься и взаимодействовать с приложением реального времени xpctank
.
Выполнение приложения. Щелкните правой кнопкой по tankAppScript.m
файл и нажимает Run. Или в Командном окне введите: tankAppScript
Запустите потоковые данные и приложение реального времени. В приложении инструментальной панели нажмите Start. Запуски приложения реального времени и потоковые данные к приложению. Оси отображают изменения в значениях сигналов.
Настройте ползунок SetPoint. Сигналы приложения реального времени реагируют на изменение сетбола.
Чтобы остановить приложение, нажмите Stop.
Чтобы обеспечить интерактивное отображение инструментальной панели для симуляции, создайте приложение инструментальной панели как UIFigure. Скройте приложение, пока все компоненты пользовательского интерфейса не будут созданы.
hf = uifigure('Visible', 'off', ... 'Position', [100 100 640 504], ... 'CloseRequestFcn', @closeRequest);
Примечание: настройки Position являются дополнительными. Эта информация предоставляется, если вы хотите, чтобы ваше размещение инструментальной панели точно совпадало с панелью в качестве примера.
Добавьте топор графика при помощи команды UIAxes. Эти оси используют анимацию, чтобы отобразить данные сигнала что потоки из приложения реального времени.
ha = uiaxes(hf, 'Position', [197 94 424 396]); xlabel(ha, 'time')
Добавьте линейный прибор при помощи команды UIGauge и 'linear'
аргумент. Этот прибор отображает данные сигнала уровня бака.
tlGauge = uigauge(hf, 'linear', ... 'Limits', [0 10], ... 'Orientation', 'vertical', ... 'Position', [110 168 32 270]);
Добавьте метку для прибора уровня бака.
uilabel(hf, ... 'HorizontalAlignment', 'center', ... 'Position', [110 136 63 22], ... 'Text', 'Tank Level');
Добавьте ползунок при помощи команды UISlider. Этот ползунок включает изменения в значении параметров сетбола.
spSlider = uislider(hf, ... 'Limits', [0 10], ... 'Orientation', 'vertical', ... 'Position', [58 172 3 259], ... 'ValueChangedFcn', @SetPointSliderValueChanged);
Обновите ползунок от значения параметров сетбола.
value = tg.getparam('SetPoint','Value'); spSlider.Value = value;
Добавьте метку в ползунок сетбола.
uilabel(hf, ... 'HorizontalAlignment', 'right', ... 'Position', [41 136 54 22], ... 'Text', 'Set Point');
Добавьте полукруглый прибор при помощи команды UIGauge и 'semicircular'
аргумент. Этот прибор отображает значение управления как 'Off'
или 'On'
.
cvGauge = uigauge(hf, 'semicircular', ... 'Limits', [-2 12], ... 'MajorTicks', [0 10], ... 'MajorTickLabels', {'Off', 'On'}, ... 'MinorTicks', [], ... 'Position', [55 55 92 50]);
Добавьте метку в прибор значения управления.
uilabel(hf, ... 'HorizontalAlignment', 'center', ... 'Position', [79 12 44 28], ... 'Text', {'Control'; 'Value'});
Добавьте запуск или кнопку остановки при помощи команды UIButton. Эта кнопка запускает приложение реального времени и начинает передавать данные потоком к инструментальной панели. Эта кнопка также останавливает приложение реального времени.
ssButton = uibutton(hf, 'push', ... 'Icon', 'run_24.png', ... 'Position', [18 449 171 41], ... 'Text', 'Start', ... 'ButtonPushedFcn', @StartStopButtonPushed);
После того, как все инструменты пользовательского интерфейса создаются, отображают инструментальную панель.
hf.Visible = 'on';
Создает объект инструментирования для приложения реального времени:
hInst = SimulinkRealTime.prototype.Instrumentation(mdl);
connectLine
команды соединяют сигналы с графиками, которые построены на осях.
[~,line1] = hInst.connectLine(ha,[mdl '/SetPoint'] ,1,'MaximumNumPoints',10000); [~,line2] = hInst.connectLine(ha,[mdl '/TankLevel'] ,1,'MaximumNumPoints',10000); [~,line3] = hInst.connectLine(ha,[mdl '/ControlValue'],1,'MaximumNumPoints',10000);
При использовании connectLine
функционируйте, чтобы соединить выходные сигналы от приложения реального времени до объекта инструментирования, Simulink Real-Time Explorer обеспечивает полезное представление сигналов и их номеров портов. Чтобы открыть Проводник и просмотреть сигналы, в Окне Команды MATLAB, введите:
SimulinkRealTime.prototype.Explorer
Команда легенды помечает каждую линию в легенде с именем сигнала.
legend(ha,{line1{1},line2{1},line3{1}})
connectScalar
команды соединяют значения параметров со скалярными отображениями. HistoryFlag
установлен в '1', потому что эти сигналы были уже добавлены к объекту инструментирования как линии. Их история должна присутствовать даже при том, что скалярное отображение только использует последнее значение.
hInst.connectScalar(tlGauge,[mdl '/TankLevel'] ,1,'HistoryFlag',1); hInst.connectScalar(cvGauge,[mdl '/ControlValue'],1,'HistoryFlag',1);
Этот connectCallback
команда помогает анимировать сигналы графического вывода на осях. Команда переносит отображение данных сигнала путем изменения x значения источника, чтобы сохранить данные сигнала в рамках графика пользовательским интерфейсом.
hInst.connectCallback(@(instObj,eventData)handleAxes(instObj,eventData,ha)); ha.XLim = [0 10]; ha.YLim = [-1 13];
Добавьте указатели на объект для объекта пользовательского интерфейса. Эти указатели позволяют добавить коллбэки, чтобы обработать объектные события.
handle.ha = ha; handle.tlGauge = tlGauge; handle.spSlider = spSlider; handle.cvGauge = cvGauge; handle.ssButton = ssButton; handle.tg = tg; handle.hInst = hInst; handle.startIcon = 'run_24.png'; handle.stopIcon = 'stop_24.png'; hf.UserData = handle;
handleAxes
данные сигнала процессов коллбэка, который строит сигналы на осях.
function handleAxes(instObj, eventData, ha) currTime = eventData.ExecTime; if max(currTime)<max(ha.XLim) % do nothing else ha.XLim = max(ha.XLim) + [0 10]; end end
closeRequest
процессы коллбэка пользовательский интерфейс закрывают запросы, включая остановку приложения реального времени. Объект инструментирования использует коллбэки, чтобы добавить данные о потоковой передаче в ваш UIAxes. Если вы удаляете UIAxes путем удаления и закрытия UIFigure без первого удаления объекта инструментирования, состояние коллбэка может произвести ошибки или предупреждения. Это - лучшая практика добавить близкий коллбэк запроса в ваше приложение, которое останавливается, инструментирование возражают, и удаляет его.
function closeRequest(hfigure, event) handle = hfigure.UserData; if ~isempty(handle.hInst) handle.hInst.stop; delete(handle.hInst) end if ~isempty(handle.tg) handle.tg.stop; end delete(hfigure) end
SetPointSliderValueChanged
процессы коллбэка превращаются в значение ползунка путем потоковой передачи данных о значении параметров к приложению реального времени.
function SetPointSliderValueChanged(hslider, event) hfigure = hslider.Parent; handle = hfigure.UserData; if ~isempty(handle.tg) value = handle.spSlider.Value; handle.tg.setparam('SetPoint','Value',value); end end
StartStopButtonPushed
события нажатия кнопки процессов коллбэка. Для нажатия Кнопки запуска коллбэк запускает приложение реального времени и переключает название кнопки, чтобы Остановиться. Для нажатия кнопки Stop коллбэк останавливает приложение реального времени и переключает название кнопки, чтобы Запуститься.
function StartStopButtonPushed(hbutton, event) hfigure = hbutton.Parent; handle = hfigure.UserData; if strcmp(handle.ssButton.Icon, handle.startIcon) % START handle.hInst.clearData; % clear old data handle.hInst.start(handle.tg); % start instrumentation and target handle.ssButton.Icon = handle.stopIcon; % change the icon handle.ssButton.Text = 'Stop'; else % STOP handle.hInst.stop; handle.tg.stop; handle.ssButton.Icon = handle.startIcon; % change the icon handle.ssButton.Text = 'Start'; end end
bdclose('all')