exponenta event banner

Создание кода повторного ввода из лучших моделей

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

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

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

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

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

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

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

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

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

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

    При установке для упаковки интерфейса кода значения Reusable functionгенератор кода упаковывает данные модели (такие как блок ввода-вывода, Dwork и параметры) в структуру данных модели в реальном времени и передает структуру модели сгенерированным функциям точки входа модели. Если для параметра Pass root-level I/O установлено значение (Embedded Coder) Part of model data structureгенератор кода также упаковывает входные и выходные данные модели корневого уровня в структуру данных модели в реальном времени.

  • Чтобы уменьшить использование памяти за счет исключения поля состояния ошибки из структуры данных модели в реальном времени (требуется Embedded Coder), выберите параметр конфигурации модели Удалить поле состояния ошибки в структуре данных модели в реальном времени.

  • Включение функции в созданный файл model.c который использует malloc для динамического выделения памяти для данных экземпляра модели (требуется Embedded Coder) выберите параметр конфигурации модели Использовать динамическое выделение памяти для инициализации модели. Если этот параметр не выбран, созданный код статически распределяет память для структур данных модели.

Создать повторно вводимый многоинстанционный код

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

Открытие модели

Открытие модели 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 target file), можно создать код повторного ввода. grt.tlc, целевые системные файлы на основе ERT и ERT обеспечивают больший контроль над тем, как код проходит корневой уровень ввода-вывода.

4. Откройте панель Создание кода (Code Generation) > Интерфейс (Interface) и изучите соответствующие настройки параметров конфигурации модели.

  • Для упаковки интерфейса кода установлено значение Reusable function. Эта настройка параметров дает генератору кода команду на создание многоэкземплярного многоэкземплярного кода.

  • Настройка Reusable function отображает параметр Диагностика ошибок кода нескольких экземпляров. Этот параметр имеет значение 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. Запись входных данных в созданный код для блоков ввода модели.

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 = 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)

Совместное использование данных экземплярами

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

  • Чтобы разделить часть данных параметров между экземплярами (например, для совместного использования уставки для многократно используемого алгоритма управления PID), используйте объект параметра, такой как Simulink.Parameter. Затем настройте параметр с классом хранения, отличным от Auto или в редакторе сопоставлений кодов задайте класс хранения по умолчанию для соответствующей категории данных параметров Default (значение по умолчанию) для Model default. Объект параметра отображается в коде как глобальный символ, например, глобальная переменная, к которой функция обращается напрямую. Дополнительные сведения см. в разделе Конфигурация генерации кода C для элементов интерфейса модели.

  • Для совместного использования части непараметрических данных между экземплярами (например, для совместного использования индикации неисправности или накопителя) используйте хранилище данных. Хранилище данных можно настроить так, чтобы оно отображалось в коде как глобальный символ, например, глобальная переменная, к которой функция обращается напрямую. Создание глобального хранилища данных с помощью Simulink.Signal объект или используйте блок памяти хранилища данных и выберите параметр блока Общий доступ для экземпляров модели. Дополнительные сведения см. в разделе Моделирование глобальных данных путем создания хранилищ данных и памяти хранилища данных.

Связанные темы