По умолчанию, для топ-моделей, генератор кода производит код, который не повторно используем. Функции точки входа имеют пустой пустотой интерфейс. Код связывается с другим кодом путем совместного использования доступа к структурам глобальных данных, которые находятся в общей памяти.
Для приложений, которые могут извлечь выгоду из повторного использования и потребовать, чтобы каждое использование или экземпляр кода поддержали свои собственные уникальные данные, сконфигурируйте модель, таким образом, что генератор кода производит повторно используемый код. Чтобы сгенерировать повторно используемый код, установите образцовую упаковку интерфейса Code параметра конфигурации на Reusable function
. Если вы используете Embedded Coder® и генерируете Код С++, альтернативно, можно установить параметр на C++ class
. В обоих случаях, генератор кода:
Данные модели пакетов, такие как блок I/O, векторы DWork и параметры, в структуре данных модели реального времени (rtModel
).
Передает структуру данных модели реального времени как входной параметр, ссылкой, к сгенерированным образцовым функциям точки входа.
Аргументы ввода и вывода корневого уровня передач к сгенерированной образцовой точке входа функционируют как отдельные аргументы.
Выделяет память для структур данных модели статически.
Экспортирует структуру данных модели реального времени в сгенерированном заголовочном файле
.model.h
Примените дополнительную диагностику и управление генерации кода путем установки этих образцовых параметров конфигурации:
Выбрать уровень серьезности для диагностических сообщений, что генератор кода отображается, когда модель не удовлетворяет требования для кода мультиэкземпляра, диагностики ошибки в коде Мультиэкземпляра параметра набора к None
, Warning
или Error
. Установите параметр на Error
, если вы не должны изменять уровень серьезности для диагностики, отображенной, когда модель нарушает требования для генерации кода мультиэкземпляра.
Управлять, как сгенерированный код передает вход и выход модели корневого уровня допускающему повторное использование выполнению (шаг) функция (требует Embedded Coder), ввод-вывод корневого уровня Передачи параметра набора относительно Individual arguments
, Structure reference
или Part of model data structure
.
Когда вы устанавливаете упаковку интерфейса Code на Reusable function
, данные модели пакетов генератора кода (такие как блок I/O, Dwork и параметры) в структуру данных модели реального времени, и передает образцовую структуру сгенерированным образцовым функциям точки входа. Если вы устанавливаете ввод-вывод корневого уровня Передачи относительно Part of model data structure
, входа и выхода модели корневого уровня пакетов генератора кода в структуру данных модели реального времени также.
Чтобы уменьшать использование памяти путем исключения ошибочного поля состояния от структуры данных модели реального времени (требует Embedded Coder), выберите параметр Remove error status field in real-time model data structure.
Чтобы включать функцию в сгенерированный файл
, который использует model.c
malloc
, чтобы динамически выделить память для образцовых данных об экземпляре (требует Embedded Coder), выберите Use dynamic memory allocation for model initialization. Если вы не выбираете этот параметр, сгенерированный код статически выделяет память для структур данных модели.
Этот пример показывает вам, как сконфигурировать модель для повторно используемого, генерации кода мультиэкземпляра. Несколько программ могут использовать повторно используемый код одновременно. Когда вы конфигурируете модель для повторной входимости, выполнение (шаг) аргументы ввода и вывода корневого уровня использования функции точки входа вместо структур глобальных данных. После исследования параметров конфигурации сгенерируйте и рассмотрите сгенерированный код.
Откройте модель
Откройте модель 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)
Когда ваш код вызывает повторно используемую образцовую функцию точки входа многократно, каждый вызов представляет экземпляр модели. По умолчанию генератор кода генерирует код, который принимает каждый экземпляр чтения от и пишет в отдельную копию сигналов, состояний блока и параметров в модели.
Совместно использовать часть данных о параметре между экземплярами (например, чтобы совместно использовать заданное значение для допускающего повторное использование алгоритма управления ПИДа), используют объект параметра, такой как Simulink.Parameter
. Затем сконфигурируйте параметр с классом памяти кроме Auto
или в редакторе Отображений Кода, установите класс памяти по умолчанию для соответствующей категории данных о параметре Default
(настройка по умолчанию) к Model default
. Объект параметра появляется в коде как глобальный символ, такой как глобальная переменная, что функциональные доступы непосредственно. Для получения дополнительной информации смотрите, Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.
Совместно использовать часть данных о непараметре между экземплярами (например, чтобы совместно использовать индикацию отказа или аккумулятор), используют хранилище данных. Можно сконфигурировать хранилище данных, чтобы появиться в коде как глобальный символ, такой как глобальная переменная, что функциональные доступы непосредственно. Создайте хранилище глобальных данных при помощи объекта Simulink.Signal
или используйте Блок памяти Хранилища данных и выберите параметр Share across model instances. Для получения дополнительной информации смотрите Образцовые Глобальные данные путем Создания Хранилищ данных Память Хранилища данных и (Simulink).