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