Установите коллбэк, чтобы считать данные внешних корневых блоков вывода после каждого шага симуляции
in = simulink.compiler.setExternalOutputsFcn(
функция регистрирует коллбэк, чтобы динамически обработать значения для каждого выходного порта на корневом уровне модели во время симуляции. in
, @(id, time, data) processOutput(id, time, data)
)
Этот пример показывает приложение, которое использует коллбэки для входных и выходных входов симуляции, чтобы просмотреть симуляцию модели 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
in
- входы симуляцииSimulink.SimulationInput
объектВходы симуляции и изменения в модели для симуляции, заданные как Simulink.SimulationInput
объект
Пример: in = Simulink.SimulationInput('vdp')
@(id, time, data) processOutput(id, time, data)
- Указатель на функцию для коллбэкаУказатель на функцию для коллбэка для обработки выходов со значениями, data
для каждого корневого портового блока, заданного id
во времени шага симуляции time
.
id
- корневой индекс блока исходящего порта, для которого задан коллбэк, заданный числовым значением.
time
- Время, для которого требуется вход в корневой блок вывода, заданное числовым значением.
data
- Значение для корневого блока вывода.
deploytool
| exportToFMU2CS
| mcc
| sim
| simulink.compiler.configureForDeployment
| Simulink.SimulationInput
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.