exponenta event banner

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

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

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

Пример модели и библиотеки

Чтобы показать, как использовать функциональные интерфейсы и создание кода на основе библиотеки, в этом примере используется модель rtwdemo_libcodegen_mdl и библиотеки rtwdemo_libcodegen_lib. Модель содержит два экземпляра повторно используемой библиотечной подсистемы Atomic_Controller. Для Atomic_Controller_Single, тип данных входного сигнала single. Для Atomic_Controller_Double, тип данных входного сигнала double. Для открытия файлов модели и библиотеки в командной строке MATLAB введите:

rtwdemo_libcodegen_mdl
rtwdemo_libcodegen_lib

Настройка повторно используемых библиотечных подсистем

Для создания библиотечного кода необходимо настроить библиотечную подсистему как повторно используемую.

  1. В диалоговом окне «Параметры блока подсистемы» выберите «Считать атомной единицей».

  2. В диалоговом окне «Параметры блока подсистемы» на вкладке «Создание кода» задайте для параметра упаковки функции значение Reusable function.

Укажите уникальные имена интерфейсов функций

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

  1. В диалоговом окне «Параметры блока подсистемы» на вкладке «Создание кода» задайте для параметра «Параметры имени функции» значение User specified.

  2. Для параметра Имя функции (Function name) укажите $R и $N токены. $R token представляет имя интерфейса функции. $N token представляет имя подсистемы.

  3. В диалоговом окне «Создание интерфейса функции» для параметра «Имя» укажите имя, описывающее контекст.

  4. Задайте для параметра «Имя файла» значение Auto или Use function name.

Настройка функциональных интерфейсов и управление ими

Модель rtwdemo_libcodegen_mdl содержит два экземпляра повторно используемой библиотечной подсистемы Atomic_Controller. Каждый экземпляр представляет интерфейс функции. В библиотеке rtwdemo_libcodegen_lib, щелкните правой кнопкой мыши значок в правой нижней части повторно используемой библиотечной подсистемы Atomic_Controller. Выберите Управление функциональными интерфейсами. Два функциональных интерфейса имеют имена Single и Double потому что Atomic_Controller берет single и double типы данных.

Для создания функциональных интерфейсов в библиотеке щелкните правой кнопкой мыши подсистему и выберите C/C + + Function Interfaces > Create Function Interface. Укажите имя интерфейса функции .

Затем для конфигурирования функциональных интерфейсов выберите один из следующих методов.

Определение интерфейса функции из модели

Для создания функциональных интерфейсов из связанных экземпляров повторно используемой библиотечной подсистемы:

  1. В библиотеке щелкните правой кнопкой мыши значок в правой нижней части библиотеки и выберите «Создать функциональный интерфейс». В диалоговом окне выберите экземпляр блока библиотеки для создания параметра интерфейса функции.

  2. Для модели Simulink с параметром экземпляра выберите модель, содержащую подсистему.

  3. Для параметра Имя экземпляра блока библиотеки выберите подсистему.

  4. Нажмите кнопку OK и закройте диалоговое окно Create Function Interface (Создание интерфейса функций).

  5. Для каждого функционального интерфейса повторите предыдущие шаги.

Примечание

Интерфейс функции можно создать из модели, содержащей экземпляр связанной повторно используемой библиотечной подсистемы. Вы должны быть в ракурсе кода. Чтобы открыть ракурс «Код», в меню приложений выберите «Внедренный кодер». Если подсистема имеет функциональные интерфейсы, в правом нижнем углу подсистемы появляется значок. Щелкните значок правой кнопкой мыши и выберите «Создать интерфейс функции». Если подсистема не имеет функциональных интерфейсов, щелкните правой кнопкой мыши подсистему и выберите C/C + + Function Interfaces > Create Function Interface.

Экспорт и настройка существующего функционального интерфейса

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

  1. В библиотеке щелкните правой кнопкой мыши значок в правой нижней части повторно используемой библиотечной подсистемы и выберите «Управление функциональными интерфейсами».

  2. Выберите функциональные интерфейсы, которые требуется изменить.

  3. Щелкните Экспорт (Export).

  4. В окне Сохранить как укажите текущую рабочую папку. Экспортированный функциональный интерфейс - это файл .slx с именем функционального интерфейса и приложением. _export.

  5. Откройте экспортированную модель. Внесите изменения в параметры входных и выходных блоков подсистемы и параметры конфигурации модели. Сохраните модель.

  6. В библиотеке щелкните правой кнопкой мыши повторно используемую библиотечную подсистему и выберите C/C + + Function Interfaces > Create Function Interface. Укажите имя интерфейса функции.

  7. Для параметра Simulink model with instance выберите экспортируемую модель, находящуюся в текущей рабочей папке.

  8. Для параметра Имя экземпляра блока библиотеки выберите подсистему.

  9. Нажмите кнопку OK и закройте диалоговое окно Create Function Interface (Создание интерфейса функций).

Настройка функциональных интерфейсов из библиотеки

  1. В библиотеке щелкните правой кнопкой мыши значок в правой нижней части подсистемы и выберите «Настройка функционального интерфейса».

  2. В диалоговом окне «Настройка функционального интерфейса» для входов и выходов подсистемы задайте значения параметров «Тип данных», «Размеры» и «Тип сигнала». Для изменения параметров ввода и вывода других подсистем используйте метод экспорта, описанный в предыдущем разделе.

  3. Чтобы изменить параметры конфигурации модели, нажмите кнопку зубчатого колеса и внесите изменения. Нажмите кнопку «Применить». Закройте диалоговое окно «Параметры конфигурации».

  4. Чтобы заменить интерфейс функции существующим интерфейсом из модели экземпляра, выберите Регенерировать с помощью экземпляра (Regenerate Using Instance).

  5. Задайте значения для модели Simulink с параметрами экземпляра и имени экземпляра блока библиотеки. Щелкните Регенерировать (Regenerate).

  6. Нажмите кнопку Apply и закройте диалоговое окно Configure Function Interface.

Создание библиотеки

После определения функциональных интерфейсов для подсистем в библиотеке создайте код для библиотеки. Перед созданием кода для модели необходимо создать код для библиотеки. Генератор кода упаковывает код библиотеки в отдельную библиотеку C. Созданный код для библиотеки находится в папке, соответствующей вашим настройкам оборудования (например, "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " Папка кода библиотеки имеет то же имя, что и библиотека, и должна иметь тот же иерархический уровень, что и библиотека.

Чтобы создать код, убедитесь, что библиотека разблокирована. Откройте приложение Embedded Coder и щелкните Построить библиотеку.

При создании кода для rtwdemo_libcodegen_lib библиотека, rtwdemo_libcodegen_lib папка содержит .c и .h файлы:

  • Atomic_Controller_Single.h

  • Atomic_Controller_Single.c

  • Atomic_Controller_Double.h

  • Atomic_Controller_Double.c

Имена этих функций являются репрезентативными для $N$R спецификация для параметров Имя функции (Function name options) и Имя функции (Function name parameters) в диалоговом окне Параметры блока подсистемы (Subsystem block parameters)

A _shared содержит код для общих утилит (например, утилит с фиксированной точкой и функциональных блоков таблицы поиска и MATLAB), дополнительных файлов, а также экспортированных параметров и типов.

При создании кода для модели, содержащей экземпляр повторно используемой библиотечной подсистемы, которая может использовать предварительно созданный библиотечный код, модель связывается с библиотечным кодом. Генератор кода использует контрольную сумму для определения возможности повторного использования. Созданный код модели должен находиться в той же папке, что и библиотека. В командной строке MATLAB введите:

Simulink.fileGenControl('set', 'CodeGenFolderStructure',...
 Simulink.filegen.CodeGenFolderStructure.TargetEnvironmentSubfolder);
Дополнительные сведения см. в разделе Simulink.fileGenControl.

Если модель не может использовать код библиотеки, можно указать, выдаст ли Embedded Coder предупреждение или ошибку во время создания кода. В диалоговом окне «Параметры конфигурации» установите параметр «Поведение при отсутствии кода предварительно созданной библиотечной подсистемы».

Можно создать код для библиотеки, но не выполнять make-файл, введя следующие команды:

library='rtwdemo_libcodegen_lib'
set_param(library, 'GenCodeOnly', 'on')
slbuild(library)

Примечание

Можно создать код для библиотеки, состоящей из повторно используемых подсистем, содержащих S-функции. Чтобы избежать некомпилируемого кода, в функции TLC, соответствующей S-функции, избегайте направления генератора кода на взаимодействие с файлами модели, такими как model.c, model.h, и model_types.h.

Создание кода из модели, содержащей экземпляр повторно используемой библиотечной подсистемы

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

  1. Задайте для параметра конфигурации модели Shared code placement значение Shared location.

  2. Укажите параметр для параметра Поведение, если отсутствует код предварительно созданной библиотечной подсистемы, или оставьте значение по умолчанию, которое является предупреждением.

  3. В диалоговом окне «Параметры конфигурации» все параметры на панелях создания кода должны быть идентичны друг другу. Если параметры отличаются, может появиться предупреждение, ошибка или ни одна из них в зависимости от параметра Поведение, если отсутствует код предварительно созданной библиотечной подсистемы.

  4. Если повторно используемая библиотечная подсистема использует общее локальное хранилище данных и настраивается сопоставление по умолчанию для элементов данных модели, оставьте для категории Общие локальные хранилища данных значение По умолчанию.

Вот сгенерированный код C для rtwdemo_libcodegen_mdl.

/* Model step function */
void rtwdemo_libcodegen_mdl_step(void)
{
  /* Outputs for Atomic SubSystem: '<Root>/Atomic_Controller_Double' */

  /* Inport: '<Root>/pos_rqst' incorporates:
   *  Inport: '<Root>/fbk_1'
   *  Outport: '<Root>/pos_cmd_one'
   */
  Atomic_Controller_Double(pos_rqst1, rtU.fbk_1, &rtY.pos_cmd_one,
    &rtDW.Atomic_Controller_Double);

  /* End of Outputs for SubSystem: '<Root>/Atomic_Controller_Double' */

  /* Outputs for Atomic SubSystem: '<Root>/Atomic_Controller_Single' */

  /* Inport: '<Root>/pos_rqst1' incorporates:
   *  Inport: '<Root>/fbk_2'
   *  Outport: '<Root>/pos_cmd_two'
   */
  Atomic_Controller_Single(pos_rqst2, rtU.fbk_2, &rtY.pos_cmd_two,
    &rtDW.Atomic_Controller_Single);

  /* End of Outputs for SubSystem: '<Root>/Atomic_Controller_Single' */
}

Код содержит вызовы Atomic_Controller_Single и Atomic_Controller_Double функции. Созданный код извлекает определения функций из предварительно созданного кода библиотеки.

Проверка кода, созданного из повторно используемых библиотечных подсистем

Поток операций проверки

При наличии программного обеспечения Simulink ® Test™ можно проверить код, генерируемый из повторно используемых библиотечных подсистем. Используйте этот рабочий процесс:

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

  2. С помощью менеджера SIL/PIL:

    1. Выполните моделирование подсистемы в обычном режиме и программном обеспечении в цикле (SIL) или процессоре в цикле (PIL).

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

    3. Просмотр отчета об анализе Simulink Coverage™.

Дополнительные сведения см. в разделе Блоки библиотеки тестов (Simulink Test).

Ограничения потока операций проверки

Рабочий процесс проверки не поддерживает:

  • Блоки подсистемы Function-Call.

  • Блоки или подсистемы инициированной подсистемы, использующие события пересечения нулей.

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

  • Параметры, использующие ExportToFile класс хранения.

  • Подсистемы с блоками Outport, которые питаются блоками Mux или Demux.

  • Виртуальные шины, передаваемые как блоки Inport.

  • Блоки памяти хранилища данных, использующие ExportedGlobal класс хранения.

  • Блоки, в которых данные инициализируются вне кода подсистемы, например, блок Width.

  • Подсветка и аннотация покрытия кода.

  • Регистрация сигналов и данных состояния.

Для таких случаев можно создать модель, содержащую экземпляр повторно используемой библиотечной подсистемы, и использовать SIL/PIL Manager для запуска моделирования SIL или PIL.

Ограничения

Поскольку генератор кода использует контрольную сумму для определения возможности повторного использования, те же ограничения, которые применяются к созданию кода для моделей, совместно использующих многоразовые библиотечные подсистемы, применяются к созданию кода на основе библиотеки. См. раздел Ограничения. Эти ограничения также применяются:

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

  • Только целевые файлы системы, полученные из ERT и ERT, поддерживают генерацию кода на основе библиотеки.

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

  • На платформе Windows избегайте именования библиотеки lib.slx это может повлиять на процесс компиляции статической библиотеки.

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

  • Библиотечная подсистема не может повторно использовать код, если он находится внутри блока включенной подсистемы с параметром Enable block, Stations when enabling, set to reset.

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