Сгенерируйте входящий код из верхних моделей

По умолчанию для топовых моделей генератор кода производит код, который не перевходящий. Функции точки входа имеют пустой интерфейс. Код связывается с другим кодом путем совместного доступа к глобальным данным структурам, которые находятся в общей памяти.

Для приложений, которые могут быть полезны от повторного использования и требуют, чтобы каждое использование или образец кода поддерживал свои собственные уникальные данные, сконфигурируйте модель, так что генератор кода производит повторяющийся код. Чтобы сгенерировать повторный код, установите параметр конфигурации модели Упаковка интерфейса кода на Reusable function. Если вы используете Embedded Coder® и генерация кода С++, также можно задать параметр равным C++ class. В обоих случаях генератор кода:

  • Пакеты данных моделей, такие как блочные вводы-выводы, векторы DWork и параметры, в структуре модели реального времени данных (rtModel) .

  • Передает структуру модели реального времени данных как входной параметр, по ссылке, сгенерированным функциям точки входа модели.

  • Передает входные и выходные аргументы корневого уровня в сгенерированные функции точки входа модели как отдельные аргументы.

  • Статическое выделение памяти для структур данных моделей.

  • Экспортирует структуру данных модели реального времени в сгенерированный заголовочный файл model.h.

Примените дополнительную диагностику и управление генерацией кода путем установки этих параметров конфигурации модели:

  • Чтобы выбрать уровень серьезности для диагностических сообщений, которые отображает генератор кода, когда модель не соответствует требованиям к коду с мультиобразцами, установите параметр Диагностика ошибок кода с мультиобразцами на None, Warning, или Error. Установите параметр равным Error если вам не нужно изменить уровень серьезности для диагностики, отображаемой, когда модель нарушает требования к генерации кода мультиобразцов.

  • Чтобы контролировать, как сгенерированный код передает входные входы и выходы модели корневого уровня в переиспользуемую функцию выполнения (step) (требует Embedded Coder), установите параметр Pass root-level ввод-вывод as (Embedded Coder) в Individual arguments, Structure reference, или Part of model data structure.

    Когда вы устанавливаете упаковку интерфейса кода в Reusable functionгенератор кода упаковывает данные модели (такие как блок ввод-вывод, Dwork и параметры) в структуру данных модели реального времени и передает структуру модели в сгенерированные функции точки входа модели. Если для параметра Pass root-level ввод-вывод задано значение (Embedded Coder) 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 параметра конфигурации модели. Если вы не выбираете этот параметр, сгенерированный код статически выделяет память для структур данных моделей.

Сгенерируйте код повторного входа, Multi-Instance Code

В этом примере показано, как сконфигурировать модель для генерации кода из мультиобразцов. Несколько программ могут использовать входящий код одновременно. Когда вы конфигурируете модель для перенаправления, функция точки входа выполнения (шаг) использует входные и выходные аргументы корневого уровня вместо глобальных структур данных. Изучив настройки строения, сгенерируйте и проверьте сгенерированный код.

Откройте модель

Откройте модель 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.tlcERT и основанные на 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.

Похожие темы