Этот пример показывает вам, как сконфигурировать модель для повторно используемого, генерации кода мультиэкземпляра. Несколько программ могут использовать повторно используемый код одновременно. Когда вы конфигурируете модель для повторной входимости, выполнение (шаг) аргументы ввода и вывода корневого уровня использования функции точки входа вместо структур глобальных данных. После исследования параметров конфигурации сгенерируйте и рассмотрите сгенерированный код.
Откройте модель rtwdemo_reusable
. Модель содержит два корневых блока Inport и корневой блок Outport.
model='rtwdemo_reusable';
open_system(model);
В вашей рабочей папке создайте временную папку для генерации и рассмотрения кода.
currentDir=pwd; [~,cgDir] = rtwdemodir();
1. Откройте диалоговое окно Model Configuration Parameters.
2. Системный конечный файл установлен в ert.tlc
. Несмотря на то, что можно сгенерировать повторно используемый код для модели, сконфигурированной с Системным набором конечного файла к grt.tlc
, ERT и основанные на ERT системные конечные файлы обеспечивают больше управления тем, как код передает ввод-вывод корневого уровня.
3. Откройте Генерацию кода>, Интерфейс разделяет на области и исследует соответствующие установки параметров.
Упаковка интерфейса кода установлена в 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.
Входные порты:
<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 и параметры ввода-вывода корневого уровня Передачи и регенерируйте код. Наблюдайте, как функциональная подпись для rtwdemo_reusable_step
функционирует изменения.
Закройте модель и отчет генерации кода.
bdclose(model) rtwdemoclean; cd(currentDir)