Разверните массовое приложение демпфера Spring с LiveIO

В этом примере мы используем приложение с функциональностью 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

Создайте приложение в App Designer

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

Прежде, чем развернуть приложение, гарантируйте что выполнение приложения в App Designer. Нажмите Start, чтобы проверить, что приложение работает путем симуляции модели для различных значений.

Скомпилируйте приложение для развертывания

Можно использовать App Designer, чтобы скомпилировать и развернуть приложение. Можно также использовать deploytool. Для получения дополнительной информации о компиляции и развертывании с App Designer, смотрите, Разрабатывают Приложения Используя App Designer, Веб-приложения и Application Compiler.

Чтобы скомпилировать приложение в этом примере, используйте mcc команда сопровождается именем приложения.

mcc -m MassSpringDamperAppWithLiveIO

Смотрите также

| | | | | | | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте