Сгенерируйте код повторного входа, 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)

Похожие темы