В этом примере мы используем приложение с функциональностью LiveIO, которая подготовлена в App Designer. Можно затем развернуть его с Simulink® Compiler™.
Этот пример использует проект Simulink, который содержит все файлы, требуемые запускать этот пример. Проект содержит модель Simulink массы springer система демпфера. Модель массового пружинного демпфера состоит из дискретных массовых узлов, распределенных в объекте и соединенных через сеть пружин и демпферов. Эта модель является подходящей для моделирования объекта с комплексными свойствами материала, такими как нелинейность и эластичность. В этом примере мы используем массовую пружинную систему демпфера. Система параметризована массой (m), пружинная жесткость (k), ослабив (b) и исходное положение (x0). Вход к системе является приложенной силой.
Чтобы исследовать эту модель с различными значениями настраиваемых параметров, создайте следующие переменные рабочего пространства модели:
Масса - m.
Жесткость Spring - k.
Затухание - b.
Исходное положение - xo.
Чтобы создать переменные рабочего пространства модели, перейдите к вкладке Modelling и выберите Model Workspace в Репозиториях данных в разделе Design. Используйте Добавить значок переменных MATLAB, чтобы добавить вышеупомянутые четыре переменные. Добавьте соответствующие начальные значения, например, 3, 128, 2 и 0.5 соответственно.
simulink.compiler.example.MassSpringDamperWithLiveIO
se App Designer MATLAB, чтобы создать приложение, чтобы симулировать модель с различными значениями параметров и входными сигналами. Чтобы узнать больше, как создать приложение с помощью App Designer, смотрите, Создают и Запуск Простое приложение Используя Использование App Designer MassSpringDamperAppWithLiveIO.mlapp
файл, чтобы использовать приложение.
MassSpringDamperAppWithLiveIO
Детали приложения
Открытый theMassSpringDamperAppWithLiveIO.mlapp
файл. Можно просмотреть код, записанный, чтобы создать это приложение в разделе Code View App Designer. Основная часть этого приложения является поведением Кнопки запуска. Это имеет следующие существенные части: создание SimulationInput
объект, конфигурируя его для развертывания, с помощью коллбэков симуляции, чтобы считать данные о выходном порте и отобразить данные на графике на каждом временном шаге. Эти три функции позволяют вам видеть живые результаты симуляции в развертываемом приложении.
Создание Simulink.SimulationInput
Объект
Функциональный createSimulationInput
задает пустой Simulink.SimulationInput
объект для модели. Используйте этот Simulink.SimulationInput
возразите, чтобы установить коллбэки симуляции и переменные для модели.
Функции обратного вызова симуляции используются, чтобы указать коллбэки. simulink.compiler.setPostStepFcn
функционируйте указывает коллбэк, который вызывается после каждого шага симуляции. simulink.compiler.setExternalInputsFcn
указывает коллбэк, который динамически обрабатывает значения для каждого входного порта на корневом уровне модели в процессе моделирования. simulink.compiler.setExternalOuputsFcn
указывает коллбэк, который динамически обрабатывает значения для каждого выходного порта на корневом уровне модели в процессе моделирования.
Используйте setVariable
метод Simulink.SimulationInput
объект предоставить значения параметров приложению. Значения для симуляции получены из полей редактирования пользовательского интерфейса приложения. Чтобы развернуть приложение, используйте simulink.compiler.configureForDeployment
функция. (Прокомментируйте строку кода, которая вызывает simulink.compiler.configureForDeployment
функция для более быстрой отладки.)
function simInp = createSimulationInput(app) % Create an empty SimulationInput object simInp = Simulink.SimulationInput(app.modelName); % Specify the simulation callbacks simInp = simulink.compiler.setPostStepFcn(simInp, @app.postStepFcn); simInp = simulink.compiler.setExternalInputsFcn(simInp, @app.getInputs); simInp = simulink.compiler.setExternalOutputsFcn(simInp, @app.processOutputs); %-------------------------------------------------------------- % Load the parameters values from the ui edit fields simInp = simInp.setVariable('k',app.StiffnessUIC.Value); simInp = simInp.setVariable('m',app.MassUIC.Value); simInp = simInp.setVariable('b',app.DampingUIC.Value); simInp = simInp.setVariable('x0',app.X0UIC.Value); % Since sim will run forever, turn off (or limit) data logging simInp = simInp.setModelParameter('StopTime','inf'); simInp = simInp.setModelParameter('SaveOutput','off'); %-------------------------------------------------------------- % Configure simInp for deployment % DEBUG TIP: Comment out the line below for % faster/easier debugging when runnng in MATLAB simInp = simulink.compiler.configureForDeployment(simInp); end % createSimulationInput
Функции обратного вызова симуляции
Функции обратного вызова симуляции указывают коллбэки, которые позволяют вам читать значения из выходных портов и к wrtie значениям к корневым входным портам. Эти функции указывают коллбэки на каждом шаге времени симуляции, который позволяет вам просматривать живые результаты симуляции.
getInputs
'callback'
getInputs
функция обратного вызова используется, чтобы получить входные параметры от корневых портов импорта.
function data = getInputs(app, ipIdx, time) %-------------------------------------------------------------- data = 0; if app.inputSignalGenerator.count == 0 % generate uniform random value between [0, 1] ur01 = rand(app.inputSignalGenerator.randStream); % input force data = 1/(2*(0.5-ur01)); if abs(data) > app.MaxMagnitudeSpinner.Value data = sign(data)*app.MaxMagnitudeSpinner.Value; end app.inputSignalGenerator.value = data; % Use Rayleigh distribution initialize the count for how % long to hold the input at this value sigma = sqrt(2/pi)*app.MeanTimeBetweenImpulsesSpinner.Value; app.inputSignalGenerator.count = ceil(sigma*sqrt(-2*log(ur01))); else app.inputSignalGenerator.count = app.inputSignalGenerator.count - 1; end %-------------------------------------------------------------- tag = string(['ip', num2str(ipIdx)]); app.updateSignalTrace(tag,time,data,'stair'); end % getInputs
processOutputs
'callback'
simulink.compiler.setExternalOutputsFcn
линия относится к функциональному procressOuputs
. procressOuputs
функция обратного вызова, которая обрабатывает значения для каждого корневого блока выходного порта модели в процессе моделирования. postprocressOuputs
функция вызвана однажды на порт и на шаг расчета порта. Когда procressOuputs
функция вызвана, она читает значения для каждого корневого блока выходного порта и кэширует те значения. postStepFcn
получает кэшируемые значения, чтобы обновить график.
function processOutputs(app, opIdx, time, data) % Called during sim to process the external output port data, % will be called once per port per its sample hit. tag = string(['op', num2str(opIdx)]); app.updateSignalTrace(tag,time,data,''); end % processOutputs
postStepFcn
'callback'
postStepFcn
функция обратного вызова вызывается после каждого шага симуляции. time
аргумент является временем для предыдущего шага симуляции. postStepFcn
функция получает кэшируемые значения блока выходного порта для каждого time
и передачи те значения к clipSignalTrace
функционируйте, чтобы построить кэшируемые значения во времени симуляции.
function postStepFcn(app, time) % Called during sim after each simulation time step app.updateSimStats(time); if app.status == AppStatus.Starting % Switch status to running after the first step, enables stop button app.switchStatus(AppStatus.Running); app.simStats.WallClockTimeAfterFirstStep = tic; end if app.processPendingParameterChanges vars(1) = Simulink.Simulation.Variable('m', app.MassUIC.Value); vars(2) = Simulink.Simulation.Variable('b',app.DampingUIC.Value); vars(3) = Simulink.Simulation.Variable('k',app.StiffnessUIC.Value); simulink.compiler.modifyParameters(app.modelName, vars); app.processPendingParameterChanges = false; end app.clipSignalTraces(); drawnow limitrate; end % postStepFcn
Прежде, чем развернуть приложение, гарантируйте что выполнение приложения в App Designer. Нажмите Start, чтобы проверить, что приложение работает путем симуляции модели для различных значений.
Можно использовать App Designer, чтобы скомпилировать и развернуть приложение. Можно также использовать deploytool
. Для получения дополнительной информации о компиляции и развертывании с App Designer, смотрите, Разрабатывают Приложения Используя App Designer, Веб-приложения и Application Compiler.
Чтобы скомпилировать приложение в этом примере, используйте mcc
команда сопровождается именем приложения.
mcc -m MassSpringDamperAppWithLiveIO
configureForDeployment
| Simulink.SimulationInput
| mcc
| deploytool
| sim
| simulink.compiler.setExternalInputsFcn
| simulink.compiler.setExternalOutputsFcn
| simulink.compiler.setPostStepFcn
| simulink.compiler.genapp