С определенными функциями в Simulink Compiler можно регистрировать коллбэки во время симуляции. simulink.compiler.setExternalInputsFcn
и simulink.compiler.setExternalOutputsFcn
функции позволяют вам задать значения в корневых блоках входных портов и получить значения в корневых блоках выходных портов на каждом шаге симуляции. С simulink.compiler.setPostStepFcn
функция, можно зарегистрировать коллбэк, который вызывается после каждого шага симуляции, таким образом используя его для постобработки выходов.
В следующем примере используется simulink.compiler.setExternalOutputsFcn
и simulink.compiler.setPostStepFcn
, для обеспечения постоянной трассировки выходов симуляции.
Этот пример показывает приложение, которое использует коллбэки для входных и выходных входов симуляции, чтобы просмотреть симуляцию модели 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
configureForDeployment
| deploytool
| mcc
| sim
| simulink.compiler.genapp
| simulink.compiler.setExternalInputsFcn
| simulink.compiler.setExternalOutputsFcn
| simulink.compiler.setPostStepFcn
| Simulink.SimulationInput