Коллбэки симуляции для развертываемых приложений

С определенными функциями в Simulink Compiler можно указать коллбэки в процессе моделирования. simulink.compiler.setExternalInputsFcn и simulink.compiler.setExternalOutputsFcn функции позволяют вам установить значения в корневых блоках импорта и получить значения в корневых блоках выходного порта в каждом шаге симуляции. С simulink.compiler.setPostStepFcn функция, можно указать коллбэк, который вызывается после каждого шага симуляции таким образом с помощью нее, чтобы отправить обрабатывает выходные параметры.

Следующий пример использует simulink.compiler.setExternalOutputsFcn и simulink.compiler.setPostStepFcn, обеспечить продолжающуюся трассировку симуляции выходные параметры.

Разверните приложение с живыми результатами симуляции системы Лоренца

Этот пример показывает приложение, что коллбэки использования для вводов и выводов симуляции, чтобы просмотреть симуляцию модели Simulink Лоренца Зистема, и затем развертываются с Simulink Compiler

Откройте и исследуйте файл проекта

В этом примере мы используем Проект Simulink, который содержит все файлы, требуемые запускать этот пример. Проект содержит Модель Simulink Лоренца Зистема и Приложение MATLAB, созданное в App Designer, который симулирует модель с различными значениями ввода и вывода. Чтобы узнать больше, как создать приложение с помощью App Designer, смотрите, Создают и Запуск Простое приложение Используя App Designer.

simulink.compiler.example.LorenzSystem

Детали приложения

Откройте mlapp файл. Можно просмотреть код, записанный, чтобы создать это приложение в разделе Code View дизайнера приложений. Основная часть этого приложения является поведением кнопки Simulate. Это имеет следующие существенные части: создание SimulationInput объект, конфигурируя его для развертывания, с помощью коллбэков симуляции, чтобы считать данные о выходном порте и отобразить данные на графике на каждом временном шаге. Следующий раздел объясняет, как эти три функции используются, чтобы видеть живые результаты симуляции в развертываемом приложении

Создание Simulink.SimulationInput объект

В функциональном createSimulationInput, мы задаем пустой Simulink.SimulationInput объект для модели. Мы используем этот Simulink.SimulationInput возразите, чтобы установить коллбэки симуляции и переменные для модели симулировать с.

Функции обратного вызова симуляции используются, чтобы указать коллбэки. simulink.compiler.setPostStepFcn функционируйте указывает коллбэк, который вызывается после каждого шага симуляции. simulink.compiler.setExternalOuputsFcn указывает коллбэк, который динамически обрабатывает значения для каждого выходного порта на корневом уровне модели в процессе моделирования.

Мы используем setVariable метод Simulink.SimulationInput объект предоставить значения параметров приложению. Эти значения для симуляции получены из полей редактирования пользовательского интерфейса приложения. Чтобы включить развертывание приложения, мы используем simulink.compiler.configureForDeployment функция. (Прокомментируйте строку кода, которая вызывает simulink.compiler.configureForDeployment функция для более быстрой отладки)

function simInp = createSimulationInput(app)
            % Create an empty SimulationInput object
            simInp = Simulink.SimulationInput('LorenzSystemModel');
            
            % Specify the simulation callbacks
            simInp = simulink.compiler.setPostStepFcn(simInp, @app.postStepFcn);
            simInp = simulink.compiler.setExternalOutputsFcn(simInp, @app.processOutputs);

            % Load the parameters values from the ui edit fields
            simInp = simInp.setVariable('rho',app.rhoUIC.Value);
            simInp = simInp.setVariable('beta',app.betaUIC.Value);
            simInp = simInp.setVariable('sigma',app.sigmaUIC.Value);
            simInp = simInp.setVariable('x0',app.x0UIC.Value);
            simInp = simInp.setVariable('y0',app.y0UIC.Value);
            simInp = simInp.setVariable('z0',app.z0UIC.Value);
            
            % 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 значениям к корневым входным портам. Эти функции указывают коллбэки на каждом шаге времени симуляции, таким образом разрешающем вам просмотреть живые результаты симуляции.

processOutputs Коллбэк

simulink.compiler.setExternalOutputsFcn линия относится к функциональному postprocressOuputs. Это - функция обратного вызова, которая обрабатывает значения для каждого корневого блока выходного порта модели в процессе моделирования. postprocressOuputs функция вызвана однажды на порт, и на шаг расчета порта. Когда postprocressOuputs функция вызвана, она читает значения для каждого корневого блока выходного порта и кэшей далеко те значения. postStepFcn получает кэшируемые значения, чтобы обновить график.

  function processOutputs(app, opIdx, ~, data)
            % Called during sim to process the external output port data,
            % will be called once per port per its sample hit.
            switch opIdx
                case 1
                    app.txyzBuffer.x = data;
                case 2
                    app.txyzBuffer.y = data;
                case 3
                    app.txyzBuffer.z = data;
                otherwise
                    error(['Invalid port index: ', num2str(opIdx)]);
            end            
  end

Коллбэк PostStepFcn

postStepFcn функция обратного вызова, которая вызывается после каждого шага симуляции. Аргумент времени является временем для предыдущего шага симуляции. Эта функция получает кэшируемые значения блока выходного порта для каждого time, и передачи те значения к updateTrace функционируйте, чтобы построить кэшируемые значения во времени симуляции.

function postStepFcn(app, time)
            % Called during sim after each simulation time step
            app.updateSimStats(time);
            if app.status == AppStatus.Starting
                app.switchStatus(AppStatus.Running);
                app.simStats.WallClockTimeAfterFirstStep = tic;
            end
            if app.stopRequested
                app.switchStatus(AppStatus.Stopping);
                stopRequestedID = [mfilename('class'), ':StopRequested'];
                throw(MException(stopRequestedID, 'Stop requested'));
            end
            %--------------------------------------------------------------
            app.txyzBuffer.t = time;
            x = [app.txyzBuffer.x];
            y = [app.txyzBuffer.y];
            z = [app.txyzBuffer.z];
            app.updateTrace(x, y, z);
            app.updateMarker('head', x, y, z);
            %--------------------------------------------------------------
            drawnow limitrate;
        end % postStepFcn

Проверьте приложение в App Designer

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

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

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

В этом примере мы компилируем приложение с mcc команда сопровождается именем приложения.

mcc -m LorenzSystemApp

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

| | | | | | | |

Похожие темы