Переиспользуемая подсистема библиотеки является подсистемой, включенной в библиотеку, которая сконфигурирована для повторного использования. Необходимо определить подсистему в библиотеке и сконфигурировать ее для повторного использования, чтобы повторно использовать подсистему между моделями.
Чтобы повторно использовать общие функциональные возможности, можно включать несколько образцы подсистемы:
В рамках одной модели, которая является верхней частью моделью или частью модели-ссылки иерархии
Через несколько ссылок на модели в иерархии модели-ссылки
Через несколько моделей верхнего уровня, которые содержат блоки Model
Через несколько верхних моделей, которые не включают блоки Model
Генератор кода использует контрольные суммы, чтобы определить переиспользуемость. Бывают случаи, когда генератор кода не может повторно использовать код подсистемы.
Для инкрементальной генерации кода, если изменяется переиспользуемая подсистема библиотеки, происходит перестройка себя и ее родительских элементов. Во время сборки, если совпадающая функция не найдена, в папку общих утилит генерируется новый образец переиспользуемой функции. Если из предыдущих сборок найдена другая функция соответствия, эта функция используется, и новая переиспользуемая функция не излучается.
Для последующих сборок неиспользованные файлы не заменяются и не удаляются из папки. Во время разработки модели, когда в папке общих утилит существует много устаревших общих функций, можно удалить папку и перегенерировать код. Если все образцы переиспользуемой подсистемы библиотеки удаляются из иерархии модели-ссылки и вы регенерируете код, устаревшие общие функции остаются в общей папке утилит до тех пор, пока вы не удалите их.
Если модель изменяется таким образом, что изменение может вызвать различный сгенерированный код для подсистемы, генерируется новая переиспользуемая функция. Например, параметры конфигурации модели, которые изменяют комментарии кода, могут вызвать различный сгенерированный код для подсистемы, даже если повторно используемая подсистема библиотеки не изменилась.
Пользователи Embedded Coder могут генерировать код из библиотеки, содержащей подсистемы, настроенные для повторного использования. Для получения дополнительной информации см. «Библиотечная Генерация кода для переиспользуемых библиотечных подсистем».
Сгенерированный код переиспользуемой библиотечной подсистемы не зависит от сгенерированного кода модели. Код для переиспользуемой подсистемы библиотеки генерируется в общую папку утилиты, slprj/
, вместо папок иерархии модели-ссылки. Сгенерированный код для вспомогательных типов, которые генерируются в target
/ _sharedutils.h
файл также находятся в общей папке утилит.
Для уникального именования, переиспользуемые имена функции имеют контрольную сумму, добавленную к имени переиспользуемой подсистемы библиотеки. Например, код и файлы для подсистемы, SS1
, которая ссылается на переиспользуемую подсистему библиотеки, RLS
, может быть:
Имя функции: RLS_mgdjlngd
Имя файла: RLS_mgdjlnd.c
и RLS_mgdjlnd.h
Установите следующие параметры Подсистемы:
Выберите Treat as an atomic unit.
На вкладке Code Generation:
Установите Function packaging значение Reusable function
.
Установите Function name options
и File name options параметры в одну из следующих комбинаций:
Установите Function name options и File name options равными Auto
.
Установите Function name options значение Use subsystem name
и File name options к Use function name
.
Установите Function name options значение User specified
и File name options к Auto
или Use function name
.
Установите Function name options значение User specified
и File name options к User specified
. Установите то же значение для параметров Function name и File name .
В иерархии модели-ссылки, если образец переиспользуемой подсистемы библиотеки находится в модели верхней части, то на панели Model Referencing диалогового окна Параметры конфигурации (Configuration Parameters) необходимо выбрать параметр Pass fixed-size scalar root input by value for code generation. Если вы не выбираете параметр, генерируется отдельная общая функция для переиспользуемой подсистемы библиотеки, образца в модели верхней части, и генерируется переиспользуемая функция для образцов в ссылочных моделях.
Если переиспользуемая подсистема библиотеки соединена с корневым Outport, повторное использование не происходит с идентичными подсистемами, которые не подключены к корневому Outport. Однако можно задать Pass reusable system outputs as значение Individual arguments
на панели Optimizations, чтобы убедиться, что повторное использование происходит между этими подсистемами. Этот параметр требует Embedded Coder® лицензия.
Дополнительные сведения о создании библиотеки см. в разделе «Пользовательские библиотеки». Пример создания переиспользуемой библиотечной подсистемы см. в разделе «Генерация переиспользуемого кода для подсистем, общих для всех Моделей».
Чтобы модель использовала переиспользуемую библиотечную подсистему, вы должны сконфигурировать модель по-разному в зависимости от того, является ли модель образца модели или верхней части моделью. Если подсистема находится в иерархии модели-ссылки, установите параметр конфигурации Shared code placement на Auto
. В противном случае для каждой модели, которая использует подсистему, установите параметр конфигурации модели Shared code placement равным Shared location
.
Если переиспользуемая подсистема библиотеки использует общее локальное хранилище данных и вы конфигурируете отображение по умолчанию для элементов данных моделей, оставьте отображение классов памяти по умолчанию для категории Shared local data stores установленной на Default.
В этом примере показов, как сконфигурировать переиспользуемую библиотечную подсистему и сгенерировать переиспользуемую функцию для подсистемы, общей для ссылочных моделей. Результатом является переиспользуемый код для подсистемы, который генерируется в общую папку утилиты (slprj/
).target
/ _sharedutils
В редакторе Simulink Editor на вкладке Simulation выберите New > Library. Выберите Blank Library в окне Начальная страница. Откройте rtwdemo_ssreuse
для копирования и вставки подсистемы SS1
в Редактор библиотек. Это действие загружает переменные для SS1
в базовое рабочее пространство. Переименуйте блок подсистемы в RLS
.
Щелкните блок Subsystem и нажмите Ctrl+U, чтобы просмотреть содержимое подсистемы RLS
.
Чтобы сконфигурировать подсистему, в редакторе Library щелкните правой кнопкой мыши RLS
. В контекстном меню выберите Block Parameters (Subsystem). В диалоговом окне «Параметры подсистемы» выберите следующие опции:
Выберите Treat as an atomic unit.
На вкладке Code Generation:
Установите Function packaging значение Reusable function
.
Установите Function name options значение User specified
и проверьте, что для Function name задано значение myfun
.
Установите File name options значение Auto
.
Нажмите Apply и OK.
Сохраните переиспользуемую подсистему библиотеки следующим ssreuselib
, который создает файл, ssreuselib.slx
.
Создайте модель, которая включает один образец RLS
от ssreuselib
. Назовите эту подсистему SS1
. Добавьте другую подсистему и назовите ее SS2
. Назовите модель ex_model1
.
Создайте другую модель, которая включает один образец RLS
от ssreuselib
. Назовите эту подсистему SS1
. Добавьте другую подсистему и назовите ее SS3
. Назовите модель ex_model2
.
Создайте верхнюю часть с двумя блоками модели, которые ссылаются на ex_model1
и ex_model2
. Сохраните верхнюю часть как ex_mdlref_ssreuse
.
С ex_mdlref_ssreuse модели
откройте в редакторе Simulink, на вкладке C Code, нажмите Settings, чтобы открыть диалоговое окно Параметры конфигурации.
На панели Solver задайте Type следующим образом Fixed-step
.
На панели Model Referencing выберите Pass fixed-size scalar root inputs by value for code generation.
На панели Code Generation > Report выберите Create code generation report и Open report automatically.
На панели Code Generation > Interface установите значение размещения общего кода Shared location
.
На панели Code Generation > Identifiers установите значение Maximum identifier length 256
. Этот шаг является необязательным.
Нажмите Apply и OK.
В редакторе Simulink, на вкладке Modeling, нажмите Model Explorer, чтобы открыть Model Explorer. В левом навигационном столбце Model Explorer разверните ex_mdlref_ssreuse
узел.
Выберите узел Configurations под ex_mdlref_ssreuse
узел. На панели Contents щелкните правой кнопкой мыши Configuration и выберите Convert to Configuration Reference
.
В диалоговом окне «Преобразование активного строения в ссылку» нажмите кнопку OK. Это действие преобразует набор конфигурации модели в ссылку строения, Simulink.ConfigSetRef
, и создает строение ссылки объекта, configSetObj
, в базовом рабочем пространстве.
В левом навигационном столбце щелкните правой кнопкой мыши Reference (Active) и выберите Propagate to Referenced Models
.
В диалоговом окне Строения Распространение ссылки на ссылку Моделей выберите ссылку на модели в списке. Нажмите Propagate.
Теперь в верхней модели и ссылочных моделях используется одна и та же ссылка на строение, Reference (Active)
, который указывает на модель, строение ссылки объекта, configSetObj
, в базовом рабочем пространстве. Когда вы сохраняете модель, вам также нужно экспортировать configSetObj
в MAT-файл.
Чтобы сгенерировать код, в редакторе Simulink Editor нажмите Ctrl+B. После генерации кода откроется отчет генерации кода.
Чтобы просмотреть отчет генерации кода для ссылочной модели, на левой панели навигации, в разделе Referenced Models, выберите ex_model1
. В отчете о генерации кода отображаются сгенерированные файлы для ex_model1
.
На левой панели навигации разверните Shared files. Генератор кода использует переиспользуемое имя подсистемы библиотеки. Код для подсистемы SS1
находится в myfun.c
и myfun.h
.
Нажмите Back и перейдите к ex_model2
отчет генерации кода. ex_model2
использует тот же исходный код, myfun.c
и myfun.h
, как код для ex_model1
. Ваша функция подсистемы и имена файлов будут различными.