Установите коллбэк считывать внешние корневые данные о блоке выходного порта после каждого шага симуляции
in = simulink.compiler.setExternalOutputsFcn(
функционируйте указывает коллбэк, чтобы динамически обработать значения для каждого выходного порта на корневом уровне модели в процессе моделирования. in
, @(id, time, data) processOutput(id, time, data)
)
В этом примере показано, как разработать приложение, которое использует коллбэки для вводов и выводов симуляции, чтобы просмотреть симуляцию модели Simulink системы Лоренца. Можно затем развернуть приложение с Simulink® Compiler™.
Откройте и исследуйте файл проекта
Этот пример использует проект Simulink, который содержит все файлы, требуемые запускать этот пример. Проект содержит модель Simulink® системы Лоренца и приложение, созданное в MATLAB ® App Designer, который симулирует модель с различными значениями ввода и вывода. Чтобы узнать больше, как создать приложение с помощью App Designer, смотрите, Создают и Запуск Простое приложение Используя App Designer.
simulink.compiler.example.LorenzSystem
Детали приложения
Откройте LorenzSystemApp
.mlapp
файл. Можно просмотреть код, записанный, чтобы создать это приложение в разделе Code View Приложения Sesigner. Основная часть создания этого приложения является поведением кнопки 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
Функции обратного вызова симуляции
Функции обратного вызова симуляции указывают коллбэки, которые позволяют вам читать значения из выходных портов и писать значения в корневые входные порты. Эти функции указывают коллбэки на каждом шаге времени симуляции, который позволяет вам просматривать живые результаты симуляции.
processOutputs
'callback'
simulink.compiler.setExternalOutputsFcn
линия относится к функциональному procressOuputs
. procressOuputs
функция обратного вызова обрабатывает значения для каждого корневого блока выходного порта модели в процессе моделирования. procressOuputs
функция вызвана однажды на порт и на шаг расчета порта. Когда procressOuputs
функция вызвана, она читает значения для каждого корневого блока выходного порта и кэширует те значения. 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
'callback'
postStepFcn
функция обратного вызова вызывается после каждого шага симуляции. time
аргумент является временем для предыдущего шага симуляции. 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, чтобы скомпилировать и развернуть приложение. Можно также использовать deploytool
функция. Для получения дополнительной информации о компиляции и развертывании с App Designer, смотрите, Разрабатывают Приложения Используя App Designer, Веб-приложения и Application Compiler.
Чтобы скомпилировать приложение в этом примере, используйте mcc
команда сопровождается именем приложения.
mcc -m LorenzSystemApp
in
— Входные параметры симуляцииSimulink.SimulationInput
объектВходные параметры симуляции и изменения в модели для симуляции в виде Simulink.SimulationInput
объект
Пример: in = Simulink.SimulationInput('vdp')
@(id, time, data) processOutput(id, time, data)
— Указатель на функцию для коллбэкаУказатель на функцию для коллбэка, чтобы обработать выходные параметры со значениями, data
для каждого блока корневого порта, заданного id
во время шага симуляции, time
.
id
– Корневой выходной порт блокирует индекс, для которого коллбэк установлен, заданный численным значением.
time
– Время, в течение которого вход с корневым блоком выходного порта требуется, заданный числовым значением.
data
– Значение для корневого блока выходного порта.
sim
| Simulink.SimulationInput
| mcc
| deploytool
| exportToFMU2CS
| simulink.compiler.configureForDeployment
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.