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

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

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

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

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

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

В этом примере мы используем Simulink Project, который содержит все файлы, необходимые для запуска этого примера. Проект содержит Simulink Model of Lorenz System и Приложение MATLAB, созданное в App Designer, которое моделирует модель с различными входными и выходными значениями. Дополнительные сведения о том, как создать приложение с помощью App Designer, см. в разделе Создание и запуск простого приложения с использованием App Designer.

simulink.compiler.example.LorenzSystem

Сведения о приложении

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

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

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

Функции обратного вызова симуляции используются для регистрации коллбэков. The simulink.compiler.setPostStepFcn функция регистрирует коллбэк, который вызывается после каждого шага симуляции. The 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

Функции обратного вызова симуляции

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

ProcessOutputs коллбэк

The simulink.compiler.setExternalOutputsFcn линия относится к функции postprocressOuputs. Это функция обратного вызова, которая обрабатывает значения для каждого корневого блока выходного порта модели во время симуляции. The postprocressOuputs функция вызывается один раз на порт и по шагу расчета порта. Когда postprocressOuputs вызывается функция, она считывает значения для каждого корневого блока исходящего порта и кэширует эти значения. The 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

The 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, чтобы убедиться, что приложение работает, симулируя модель для различных значений.

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

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

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

mcc -m LorenzSystemApp

См. также

| | | | | | | |

Похожие темы