Основанная на библиотеке генерация кода обеспечивает способ сгенерировать код для набора допускающих повторное использование компонентов, которые могут совместно использовать модели. Для каждой допускающей повторное использование подсистемы библиотеки верхнего уровня вы задаете набор функциональных интерфейсов, которые блокируют вниз интерфейс подсистемы. Функциональный интерфейс состоит из настроек параметров блоков ввода и вывода подсистемы и образцовых настроек параметра конфигурации.
Функциональные интерфейсы являются независимыми моделями, которые вы сохраняете с сопроводительной библиотекой. Прежде, чем сгенерировать код для модели, содержащей экземпляры допускающей повторное использование подсистемы библиотеки, вы генерируете код для библиотеки. Основанная на библиотеке генерация кода делает библиотеку владельцем кода. Чтобы сделать отдельные модели владельцем кода, можно сгенерировать код для допускающих повторное использование подсистем библиотеки к разделяемой сервисной папке. Для получения дополнительной информации смотрите, Генерируют Повторно используемый код от Подсистем Библиотеки, Разделяемых Через Модели.
Чтобы показать, как использовать функциональные интерфейсы и основанную на библиотеке генерацию кода, этот пример использует модель rtwdemo_libcodegen_mdl
и библиотеку rtwdemo_libcodegen_lib
. Модель содержит два экземпляра допускающей повторное использование подсистемы библиотеки Atomic_Controller
. Для Atomic_Controller_Single
типом данных входного сигнала является single
. Для Atomic_Controller_Double
типом данных входного сигнала является double
. Чтобы открыть модель и файлы библиотеки, в команде MATLAB запрашивают, введите:
rtwdemo_libcodegen_mdl rtwdemo_libcodegen_lib
Чтобы выполнить основанную на библиотеке генерацию кода, необходимо сконфигурировать подсистему библиотеки как допускающую повторное использование.
В диалоговом окне параметров блока Subsystem выберите Treat как атомарный модуль (Simulink).
В диалоговом окне параметров блока Subsystem, на вкладке Code Generation, устанавливает Функцию, упаковочную (Simulink) параметр к Reusable function
.
Каждый функциональный интерфейс, соответствующий той же допускающей повторное использование подсистеме библиотеки, должен иметь уникальное имя. Чтобы задать уникальное имя, выполните эти шаги:
В диалоговом окне параметров блока Subsystem, на вкладке Code Generation, устанавливает параметр Function name options на User specified
.
Для параметра Function name задайте лексемы $N
и $R
. Лексема $R
представляет функциональное интерфейсное имя. Лексема $N
представляет имя подсистемы.
В диалоговом окне Create Function Interface, для параметра Name, задают имя, которое описывает контекст.
Установите параметр File name option на Auto
или Use function name
.
Модель rtwdemo_libcodegen_mdl
содержит два экземпляра допускающей повторное использование подсистемы библиотеки Atomic_Controller
. Каждый экземпляр представляет функциональный интерфейс. В библиотеке rtwdemo_libcodegen_lib
щелкните правой кнопкой по значку по более низкой самой правой стороне допускающей повторное использование подсистемы библиотеки Atomic_Controller
. Выберите Manage Function Interfaces. Два функциональных интерфейса имеют имена Single
и Double
, потому что Atomic_Controller
берет типы данных double
и single
.
Чтобы создать функциональные интерфейсы, в библиотеке, щелкают правой кнопкой по подсистеме и выбирают C/C++ Function Interfaces > Create Function Interface. Задайте функциональный интерфейс Name.
Затем чтобы сконфигурировать функциональные интерфейсы, выберите один из следующих методов.
Создать функциональные интерфейсы из соединенных экземпляров допускающей повторное использование подсистемы библиотеки:
В библиотеке щелкните правой кнопкой по значку по более низкой самой правой стороне допускающей повторное использование подсистемы библиотеки и выберите Create Function Interface. В диалоговом окне выберите параметр Specify library block instance to create function interface.
Для параметра Simulink model with instance выберите модель, которая содержит подсистему.
Для параметра Library block instance name выберите подсистему.
Нажмите OK и закройте диалоговое окно Create Function Interface.
Для каждого функционального интерфейса повторите предыдущие шаги.
Можно создать функциональный интерфейс из модели, которая содержит экземпляр соединенной допускающей повторное использование подсистемы библиотеки. Необходимо быть в перспективе Кода. Чтобы открыть перспективу Кода, выберите Code> C/C++ Code > Configure Code Perspective. Если подсистема имеет функциональные интерфейсы, значок появляется в нижнем правом углу подсистемы. Щелкните правой кнопкой по значку и выберите Create Function Interface. Если подсистема не имеет функциональных интерфейсов, щелкните правой кнопкой по подсистеме и выберите C/C++ Function Interfaces> Create Function Interface.
Экспортировать и конфигурировать функциональный интерфейс как независимую модель:
В библиотеке щелкните правой кнопкой по значку по более низкой самой правой стороне допускающей повторное использование подсистемы библиотеки и выберите Manage Function Interfaces.
Выберите функциональные интерфейсы, которые вы хотите изменить.
Нажмите Export.
В окне Save As задайте текущую рабочую папку. Экспортируемый функциональный интерфейс является .slx файлом, который имеет функциональное интерфейсное имя плюс приложение _export
.
Откройте экспортируемую модель. Внесите свои изменения в настройки параметров блоков ввода и вывода подсистемы и образцовые настройки параметра конфигурации. Сохраните модель.
В библиотеке щелкните правой кнопкой по допускающей повторное использование подсистеме библиотеки и выберите C/C++ Function Interfaces > Create Function Interface. Задайте функциональный интерфейс Name.
Для параметра Simulink model with instance выберите экспортируемую модель, которая находится в текущей рабочей папке.
Для параметра Library block instance name выберите подсистему.
Нажмите OK и закройте диалоговое окно Create Function Interface.
В библиотеке щелкните правой кнопкой по значку по более низкой самой правой стороне подсистемы и выберите Configure Function Interface.
В диалоговом окне Configure Function Interface, для вводов и выводов подсистемы, задают значения для Data Type, Dimensions и параметров Signal Type. Чтобы изменить другие установки параметров ввода и вывода подсистемы, следуйте методу экспорта в предыдущем разделе.
Чтобы изменить образцовые параметры конфигурации, нажмите кнопку механизма и внесите изменения. Нажмите Apply. Закройте диалоговое окно Model Configuration Parameters.
Чтобы заменить функциональный интерфейс на существующий из модели экземпляра, выберите Regenerate Using Instance.
Задайте значения для параметров Library block instance name и Simulink model with instance. Нажмите Regenerate.
Нажмите Apply и закройте диалоговое окно Configure Function Interface.
После того, как вы укажете, что функциональные интерфейсы для подсистем в вашей библиотеке, чтобы сгенерировать код, нажимают Build Library. Прежде, чем сгенерировать код для вашей модели, необходимо сгенерировать код для библиотеки. Генератор кода группирует код библиотеки как отдельную библиотеку C. Сгенерированный код для библиотеки находится в папке, соответствующей вашим аппаратным настройкам (например, IntelWin64). Папка библиотеки кода имеет то же имя как библиотека и должна быть на том же иерархическом уровне как библиотека.
Когда вы генерируете код для библиотеки rtwdemo_libcodegen_lib
, папка rtwdemo_libcodegen_lib
содержит их файлы .h
и .c
:
Atomic_Controller_Single.h
Atomic_Controller_Single.c
Atomic_Controller_Double.h
Atomic_Controller_Double.c
Эти имена функций являются представительными для спецификации $N$R
для Function name options и параметров Function name на диалоговом окне параметров блока Subsystem.
Папка _shared
содержит код для разделяемых утилит (например, утилит фиксированной точки и Интерполяционной таблицы и блоков MATLAB function), дополнительные файлы, и экспортируемые параметры и типы.
Когда вы генерируете код для модели, которая содержит экземпляр допускающей повторное использование подсистемы библиотеки, которая может использовать предсгенерированный код библиотеки, образцовые ссылки на код библиотеки. Генератор кода использует контрольную сумму, чтобы определить возможность многократного использования. Сгенерированный код для модели должен быть в той же папке как библиотека. В командной строке MATLAB, введите:
Simulink.fileGenControl('set', 'CodeGenFolderStructure',... Simulink.filegen.CodeGenFolderStructure.TargetEnvironmentSubfolder);
Simulink.fileGenControl
.Если модель не может использовать код библиотеки, можно задать, производит ли Embedded Coder предупреждение или ошибку во время генерации кода. В диалоговом окне Model Configuration Parameters, устанавливает Поведение, когда предсгенерированный код подсистемы библиотеки пропускает диагностическую установку параметра.
Можно сгенерировать код для библиотеки, но не выполнить make-файл путем ввода этих команд:
library='rtwdemo_libcodegen_lib' set_param(library, 'GenCodeOnly', 'on') rtwbuild(library)
Можно сгенерировать код для библиотеки, состоящей из допускающих повторное использование подсистем, которые содержат S-функции. Чтобы избежать некомпилируемого кода, в соответствии функции TLC S-функции, стараются не направлять генератор кода, чтобы взаимодействовать с образцовыми файлами, такими как model.c
, model.h
и model_types.h
.
Чтобы сгенерировать код из модели, которая содержит экземпляр допускающей повторное использование подсистемы библиотеки, для которой вы хотите использовать код библиотеки:
Установите образцовый параметр конфигурации Shared code placement на Shared location
.
Задайте установку для Поведения, когда предсгенерированный код подсистемы библиотеки пропускает (Simulink) параметр, или оставьте настройку по умолчанию, которая предупреждает.
В диалоговом окне Model Configuration Parameters установки параметров на панелях Code Generation должны все быть идентичны друг другу. Если настройки отличаются, вы можете получить предупреждение, ошибку или ни одного в зависимости от установки параметра Behavior when pregenerated library subsystem code is missing.
Если допускающая повторное использование подсистема библиотеки использует разделяемое локальное хранилище данных, и вы конфигурируете отображение значения по умолчанию для элементов данных модели, оставляете отображение класса памяти по умолчанию для категории набор Shared local data stores к Default.
Вот сгенерированный код 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_Double
и Atomic_Controller_Single
. Сгенерированный код вытягивает функциональные определения из предсгенерированного кода библиотеки.
Поскольку генератор кода использует контрольную сумму, чтобы определить возможность многократного использования, те же ограничения, которые применяются к генерации кода за модели, которые совместно используют допускающие повторное использование подсистемы библиотеки, применяются к основанной на библиотеке генерации кода. Смотрите Ограничения. Эти ограничения также применяются:
Вы не можете задать функциональный интерфейс на допускающей повторное использование подсистеме библиотеки, которая является в другой допускающей повторное использование подсистеме библиотеки.
Только ERT и ERT-выведенные системные конечные файлы основанная на вспомогательной библиотеке генерация кода.
Каждый функциональный интерфейс, который соответствует той же допускающей повторное использование подсистеме библиотеки, должен быть уникальным.
Только подсистемы верхнего уровня могут снова использовать код библиотеки.
На платформе Windows постарайтесь не называть библиотеку lib.slx
, когда выполнение так может вмешаться в статический процесс компиляции библиотеки.