По умолчанию для топовых моделей генератор кода производит код, который не перевходящий. Функции точки входа имеют пустой интерфейс. Код связывается с другим кодом путем совместного доступа к глобальным данным структурам, которые находятся в общей памяти.
Для приложений, которые могут быть полезны от повторного использования и требуют, чтобы каждое использование или образец кода поддерживал свои собственные уникальные данные, сконфигурируйте модель, так что генератор кода производит повторяющийся код. Чтобы сгенерировать повторный код, установите параметр конфигурации модели Упаковка интерфейса кода на Reusable function
. Если вы используете Embedded Coder® и генерация кода С++, также можно задать параметр равным C++ class
. В обоих случаях генератор кода:
Пакеты данных моделей, такие как блочные вводы-выводы, векторы DWork и параметры, в структуре модели реального времени данных (rtModel
) .
Передает структуру модели реального времени данных как входной параметр, по ссылке, сгенерированным функциям точки входа модели.
Передает входные и выходные аргументы корневого уровня в сгенерированные функции точки входа модели как отдельные аргументы.
Статическое выделение памяти для структур данных моделей.
Экспортирует структуру данных модели реального времени в сгенерированный заголовочный файл
.model
.h
Примените дополнительную диагностику и управление генерацией кода путем установки этих параметров конфигурации модели:
Чтобы выбрать уровень серьезности для диагностических сообщений, которые отображает генератор кода, когда модель не соответствует требованиям к коду с мультиобразцами, установите параметр Диагностика ошибок кода с мультиобразцами на None
, Warning
, или Error
. Установите параметр равным Error
если вам не нужно изменить уровень серьезности для диагностики, отображаемой, когда модель нарушает требования к генерации кода мультиобразцов.
Чтобы контролировать, как сгенерированный код передает входные входы и выходы модели корневого уровня в переиспользуемую функцию выполнения (шаг) (требует Embedded Coder), установите параметр Pass root-level ввод-вывод как Individual arguments
, Structure reference
, или Part of model data structure
.
Когда вы устанавливаете упаковку интерфейса кода в Reusable function
генератор кода упаковывает данные модели (такие как блок ввод-вывод, Dwork и параметры) в структуру данных модели реального времени и передает структуру модели в сгенерированные функции точки входа модели. Если вы задаете Pass root-level ввод-вывод как 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
. Хотя можно сгенерировать входящий код для модели, сконфигурированной с заданным целевым файлом System grt.tlc
ERT и основанные на ERT системные целевые файлы обеспечивают больший контроль над тем, как код проходит ввод-вывод корневого уровня.
4. Откройте панель Генерация Кода > Interface и исследуйте соответствующие настройки параметров конфигурации модели.
Для упаковки интерфейса кода задано значение Reusable function
. Эта установка параметра предписывает генератору кода создать повторно используемый, мультиобразец код.
Настройка Reusable function
отображает параметр Multi-instance code error diagnostic. Этот параметр установлен в Error
, что указывает, что генератор кода прекращает работать, если модель нарушает требования для генерации кода с мультиобразцами.
Передайте ввод-вывод корневого уровня, так как установлено в Part of model data structure
. Эта настройка упаковывает входные входы и выходы модели корневого уровня в структуру данных модели реального времени (rtModel
), которая является оптимизированной структурой данных, которая заменяет SimStruct
как структуру данных верхнего уровня для модели.
Выберите поле состояния ошибки в структуре данных модели реального времени. Эта настройка параметра уменьшает использование памяти путем опускания поля состояния ошибки из сгенерированной структуры данных модели реального времени.
Сгенерируйте и проверьте код
slbuild(model);
### Starting build procedure for: rtwdemo_reusable ### Successful completion of build procedure for: rtwdemo_reusable Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================= rtwdemo_reusable Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.3529s
Проверьте сгенерированный код.
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
Исследуйте функцию Step
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 = 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
функция как часть структуры данных модели реального времени. Попробуйте другие настройки параметров конфигурации модели Упаковка интерфейса кода и Проход ввода-вывода корневого уровня и перегенерируйте код. Наблюдайте, как меняется прототип функции.
Закройте модель и отчет
Закройте модель и отчет о генерации кода.
bdclose(model) rtwdemoclean; cd(currentDir)
Когда ваш код вызывает повторяющуюся функцию точки входа модели несколько раз, каждый вызов представляет образец модели. По умолчанию генератор кода генерирует код, который предполагает, что каждый образец читает и записывает в отдельную копию сигналов, состояний блока и параметров в модели.
Чтобы поделиться частью данных параметра между образцами (для примера, чтобы поделиться уставкой для алгоритма переиспользуемого ПИД управления), используйте объект параметра, такой как Simulink.Parameter
. Затем сконфигурируйте параметр с классом памяти, отличным от Auto
или в редакторе Отображения установите класс памяти по умолчанию для соответствующей категории данных параметра Default
(настройка по умолчанию), чтобы Model default
. Объект параметра появляется в коде как глобальный символ, такой как глобальная переменная, к которой функция обращается непосредственно. Для получения дополнительной информации смотрите Строение Генерации кода C для Элементов Интерфейса Модели.
Чтобы поделиться частью данных непараметра между образцами (для примера, чтобы поделиться индикацией отказа или аккумулятором), используйте хранилище данных. Можно сконфигурировать хранилище данных, чтобы оно отображалось в коде как глобальный символ, такой как глобальная переменная, к которой функция обращается непосредственно. Создайте глобальные данные магазин с помощью Simulink.Signal
объект или используйте блок Data Store Memory и выберите параметры блоков Share across model instances. Для получения дополнительной информации смотрите Моделирование глобальных данных путем Создания Хранилищ данных и Data Store Memory.