Добавьте Приложение Инструментальной панели m-скрипта, чтобы Заправить Модель

В этом примере показано, как 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')));

Запустите целевой компьютер и создайте приложение реального времени

Эти операции генерируют приложение реального времени что потоковые данные к приложению инструментальной панели.

  1. Запустите целевой компьютер.

  2. Откройте модель xpctank.

  3. Соедините компьютер разработчика с целевым компьютером. Создайте 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.

  1. Выполнение приложения. Щелкните правой кнопкой по tankAppScript.m файл и нажимает Run. Или в Командном окне введите: tankAppScript

  2. Запустите потоковые данные и приложение реального времени. В приложении инструментальной панели нажмите Start. Запуски приложения реального времени и потоковые данные к приложению. Оси отображают изменения в значениях сигналов.

  3. Настройте ползунок SetPoint. Сигналы приложения реального времени реагируют на изменение сетбола.

  4. Чтобы остановить приложение, нажмите 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);

Добавьте Коллбэк, чтобы Перенести ось X

Этот 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;

Добавьте, что коллбэк, чтобы обновить XLim и предотвратить ось переносится

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')