Этот пример показывает вам, как сконфигурировать модель для повторно используемого, генерации кода мультиэкземпляра. Несколько программ могут использовать повторно используемый код одновременно. Когда вы конфигурируете модель для повторной входимости, выполнение (шаг) аргументы ввода и вывода корневого уровня использования функции точки входа вместо структур глобальных данных. После исследования параметров конфигурации сгенерируйте и рассмотрите сгенерированный код.
Откройте модель rtwdemo_reusable
. Модель содержит два корневых блока Inport и корневой блок Outport.
model='rtwdemo_reusable';
open_system(model);
Сохраните копию модели к перезаписываемому местоположению.
currentDir=pwd; [~,cgDir] = rtwdemodir();
1. Откройте приложение Embedded Coder.
2. Откройте диалоговое окно Model Configuration Parameters.
3. Системный конечный файл параметра конфигурации модели установлен в ert.tlc
. Несмотря на то, что можно сгенерировать повторно используемый код для модели, сконфигурированной с Системным набором конечного файла к grt.tlc
, ERT и основанные на ERT системные конечные файлы обеспечивают больше управления тем, как код передает ввод-вывод корневого уровня.
4. Откройте Генерацию кода>, Интерфейс разделяет на области и исследует соответствующие настройки параметра конфигурации модели.
Упаковка интерфейса кода установлена в Reusable function
. Эта установка параметра дает генератору кода команду производить допускающий повторное использование, код мультиэкземпляра.
Установка Reusable function
диагностика ошибки в коде Мультиэкземпляра параметра отображений. Тот параметр устанавливается на Error
, указание, что аварийное прекращение работы генератора кода, если модель нарушает требования для генерации кода мультиэкземпляра.
Передайте ввод-вывод корневого уровня, как установлен в Part of model data structure
. Этот вход и выход модели корневого уровня пакетов установки в структуру данных модели реального времени (rtModel
), который является оптимизированной структурой данных, которая заменяет SimStruct
как структура данных верхнего уровня для модели.
Удалите ошибочное поле состояния в режиме реального времени, структура данных модели выбрана. Эта установка параметра уменьшает использование памяти путем исключения ошибочного поля состояния от сгенерированной структуры данных модели реального времени.
rtwbuild(model);
### Starting build procedure for model: rtwdemo_reusable ### Successful completion of build procedure for model: rtwdemo_reusable
ert_main.c
пример основная программа (среда выполнения) для модели. Этот код управляет выполнением типового кодекса путем вызывания функции точки входа rtwdemo_reusable_step
. Используйте этот файл в качестве начальной точки для кодирования вашей среды выполнения.
rtwdemo_reusable.c
содержит точки входа для кода, который реализует алгоритм модели. Этот файл включает код планирования уровня.
rtwdemo_reusable.h
объявите структуры данных модели и открытый интерфейс к точкам входа модели и структурам данных.
rtwtypes.h
задает типы данных, структуры и макросы, которых требует сгенерированный код.
Откройте и рассмотрите Отчет Интерфейса Кода. Используйте информацию в том отчете записать интерфейсный код для вашей среды выполнения.
1. Включайте сгенерированный заголовочный файл путем добавления направляющего #include rtwdemo_reusable.h
.
2. Запишите входные данные в сгенерированный код для блоков модели Inport.
3. Вызовите сгенерированные функции точки входа.
4. Считайте данные из сгенерированного кода для блока модели Outport.
Input port:
<Root>/In1
из данных real_T
с размерностью 1
<Root>/In2
из данных real_T
с размерностью 1
Функции точки входа:
Функция точки входа инициализации, void rtwdemo_reusable_initialize(RT_MODEL *const rtM)
. При запуске вызовите эту функцию однажды.
Выведите и обновитесь (продвигаются) функция точки входа, void rtwdemo_reusable_step(RT_MODEL *const rtM)
. Вызывайте эту функцию периодически на самом быстром уровне в модели. Для этой модели вызывайте функцию каждую секунду. Чтобы достигнуть выполнения в реальном времени, присоедините эту функцию к таймеру.
Выходной порт:
<Root>/Out1
из типа данных real_T
с размерностью 1
Examine the |rtwdemo_reusable_step| function code in |rtwdemo_reusable.c|.
cfile = fullfile(cgDir,'rtwdemo_reusable_ert_rtw','rtwdemo_reusable.c'); rtwdemodbtype(cfile,'/* Model step function', '/* Model initialize function ', 1, 0);
/* Model step function */ void rtwdemo_reusable_step(RT_MODEL *const rtM) { D_Work *rtDWork = ((D_Work *) rtM->dwork); ExternalInputs *rtU = (ExternalInputs *) rtM->inputs; ExternalOutputs *rtY = (ExternalOutputs *) rtM->outputs; /* Outport: '<Root>/Out1' incorporates: * UnitDelay: '<Root>/Delay' */ rtY->Out1 = rtDWork->Delay_DSTATE; /* Gain: '<Root>/Gain' incorporates: * Inport: '<Root>/In1' * Inport: '<Root>/In2' * Sum: '<Root>/Sum' * UnitDelay: '<Root>/Delay' */ rtDWork->Delay_DSTATE = (rtU->In1 + rtU->In2) * rtP.k1; }
Генератор кода передает данные модели rtwdemo_reusable_step
функционируйте как часть структуры данных модели реального времени. Попробуйте различные настройки за упаковку интерфейса Code параметров конфигурации модели и ввод-вывод корневого уровня Передачи и регенерируйте код. Наблюдайте, как прототип функции изменяется.
Закройте модель и отчет генерации кода.
bdclose(model) rtwdemoclean; cd(currentDir)