Этот пример показывает приложение, которое использует коллбэки для входных и выходных входов симуляции, чтобы просмотреть симуляцию модели 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
Функции обратного вызова симуляции регистрируют коллбэки, чтобы вы могли считать значения из выходных портов и записать значения в корневые входные порты. Эти функции регистрируют коллбэки на каждом временном шаге симуляции, таким образом, позволяя вам просмотреть живые результаты симуляции.
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
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. Нажмите Simulate, чтобы убедиться, что приложение работает, симулируя модель для различных значений.
. Для компиляции и развертывания приложения можно использовать MATLAB App Designer. Можно также использовать deploytool. Дополнительные сведения о компиляции и развертывании с помощью App Designer см. в разделе Разработка приложений с использованием App Designer, Веб-приложений и Application Compiler.
В этом примере мы компилируем приложение с mcc команда, за которой следует имя приложения.
mcc -m LorenzSystemApp