Как описано в разделе «Определение классов памяти», «Разделы памяти» и «Шаблоны функций для программной архитектуры», можно создать определения генерации кода, которые можно применять к элементам модели, таким как данные и функции. Определения кода управляют внешним видом этих элементов в сгенерированном коде.
В большой организации с несколькими моделями и пользователями можно делиться определениями генерации кода, храня их во взаимодоступном месте. Процесс совместного использования определений кода называется deployment.
Когда вы создаете пользовательские определения генерации кода, чтобы поделиться определениями между моделями и другими пользователями:
Когда вы создаете определения в пакете с помощью Custom Storage Class Designer, для каждого пользователя поместите папку, содержащую папку пакета, в MATLAB® путь. Для получения дополнительной информации смотрите Что такой Путь поиска файлов MATLAB?.
Когда вы создаете определения в словаре Embedded Coder, храните определения в Simulink® словарь данных. Затем соедините каждую модель с отдельным словарем данных. Сконфигурируйте каждый отдельный словарь для обращения к словарю, который содержит определения генерации кода. Для получения примера смотрите Совместное определение словаря встраиваемого кодера между Моделями.
Simulink обеспечивает версионность для Embedded Coder® Словари. Когда эти события происходят, Simulink синхронизирует данные в словаре данных, включая словари Embedded Coder для использования с моделью независимо от версии Simulink, используемой для создания модели.
Вы связываете модель со словарем данных, который был сохранен в предыдущей версии Simulink (для примера вы связываете модель, которую вы разрабатываете в R2018b со словарем, сохраненным в R2018a).
Вы открываете модель, которая имеет локальный словарь Embedded Coder, в версии Simulink, которая старше текущей версии (для примера, вы разработали модель, которая использует локальный словарь в R2018a, и вы открываете эту модель в R2018b, чтобы продолжить разработку).
У вас также есть опция экспортировать (сохранить) словарь Embedded Coder для использования с моделями, созданными с другой версией (предыдущей или более старой) генератора кода.
Для получения дополнительной информации смотрите Использование словаря для моделей, созданных с различными версиями Simulink.
Во время настройки словаря Embedded Coder Dictionary, предназначенного для совместного использования несколькими моделями, можно сопоставить определения кода по умолчанию для категорий данных моделей и функций. В этом примере вы сопоставляете определения кода по умолчанию для словаря Embedded Coder в exSharedCodeDefs.sldd
.
Если еще не определено, задайте определения кода (классы памяти, шаблоны индивидуальной настройки функций и разделы памяти) в словаре данных. В данном примере вы задаете определения кода в словаре данных exSharedCodeDefs.sldd
. Поместите копию этого файла в место записи.
На Current Folder панели Командного окна MATLAB дважды кликните имя файла вашей копии exSharedCodeDefs.sldd
.
На панели Model Hierarchy Model Explorer щелкните правой кнопкой мыши узел словаря и выберите Show Empty Sections. В Model Explorer перечислены узлы для Design Data, Configurations, Embedded Coder Dictionary и Other data.
Откройте словарь Embedded Coder. На панели Model Hierarchy нажмите Embedded Coder Dictionary. Затем на правой панели нажмите Open Embedded Coder Dictionary.
В диалоговом окне Embedded Coder Dictionary нажмите Configure Defaults.
В диалоговом окне Configure Dictionary Defaults сконфигурируйте определения кода по умолчанию для категорий данных и функций.
На вкладке Data Defaults сконфигурируйте класс памяти и, если применимо, раздел памяти для данных следующих категорий:
Категория элемента модели | Описание |
---|---|
Inports | Входные порты корневого уровня модели, такие как блоки Inport и In Bus Element. |
Вспомогательные порты | Выходные порты корневого уровня модели, такие как блоки Outport и Out Bus Element. |
Сигналы, состояния и внутренние данные | Элементы данных, которые являются внутренними для модели, такие как выходные сигналы блоков, дискретные состояния блока, хранилища данных и сигналы пересечения нулем. |
Общие локальные хранилища данных | Data Store Memory блоки, которые имеют параметры блоков Share across model instances установленные. Эти хранилища данных доступны только в модели, где они определены. Значение хранилища данных разделяется между образцами модели. |
Глобальные данные | Данные хранятся, которые заданы сигнальным объектом в базовом рабочем пространстве или в словаре данных. Эти хранилища данных могут использоваться несколькими моделями в приложении. Чтобы просмотреть и сконфигурировать эти хранилища данных в редакторе Отображения, нажмите Refresh ссылка справа от имени категории. При нажатии на эту ссылку обновляется диаграмма модели. |
Аргументы параметра модели | Параметры в рабочем пространстве модели, которые вы конфигурируете как аргументы модели. Эти параметры доступны в блоке модели, чтобы позволить каждому образцу модели предоставить свое собственное значение. Чтобы задать параметр в качестве аргумента модели, установите флажок Model Data Editor Parameters > Argument >. |
Параметры модели | Параметры, которые заданы в модели, такие как параметры в рабочем пространстве модели. Исключает аргументы модели. |
Внешние параметры | Параметры, которые вы определяете как объекты в базовом рабочем пространстве или в словаре данных. Эти параметры могут использоваться несколькими моделями в приложении. Чтобы просмотреть и сконфигурировать эти параметры в редакторе Отображения, нажмите Refresh ссылка справа от имени категории. При нажатии на эту ссылку обновляется диаграмма модели. |
Константы | Выход блока с постоянными значениями и параметры, которые не могли быть встроены. Эти значения хранятся в переменных по одной из следующих причин.
|
На вкладке Function Defaults сконфигурируйте шаблон индивидуальной настройки функции и, если применимо, раздел памяти для этих категорий функций:
Категория функции модели | Описание |
---|---|
Инициализация/завершение | Функции точки входа для инициализации и завершения |
Выполнение | Функции точки входа для инициирования выполнения и сброса |
Общая утилита | Общие служебные функции |
Отображение по умолчанию для категории применяется к элементам категории в модели.
В данном примере установите класс памяти для категорий данных Inports, Outports и Global data stores равным ExportedGlobal
.
Применить изменения и закрыть диалоговое окно. Нажмите Apply. Затем нажмите OK.
Закройте словарь Embedded Coder Dictionary и Model Explorer.
В этом примере показано, как создать класс памяти, который дает отдельные глобальные переменные в сгенерированном коде и разделяет класс памяти между двумя моделями, rtwdemo_roll
и rtwdemo_configinterface
. Затем вы конфигурируете каждую модель, чтобы использовать класс памяти в качестве настройки генерации кода по умолчанию для внутренних данных, которая включает состояния блока.
Это - лучшая практика хранения общих определений генерации кода в автономном словаре данных, что означает, что никакие модели не связаны непосредственно со словарем. Затем можно связать целевые модели с одним или несколькими дополнительными промежуточными словарями, которые вы конфигурируете для ссылки на автономный словарь. С помощью этой модульной иерархии словарей каждая модель может хранить другие данные, такие как проектные данные, отдельно от определений генерации кода.
В иерархии словарей данных, на которые ссылаются (см. Ссылка на словарь), только один словарь может хранить определения генерации кода в словаре Embedded Coder. Если модель имеет доступ к нескольким словарям Embedded Coder через словари данных, на которые ссылаются, используйте функции coder.dictionary.move
и coder.dictionary.remove
передавать и удалять словари Embedded Coder до тех пор, пока в иерархии словарей не будет только одного.
Рисунок показывает пример иерархии словаря. На рисунке:
modelOne.slx
и modelTwo.slx
являются различными файлами модели.
dataForModelOne.sldd
и dataForModelTwo.sldd
являются словарями данных. Каждый словарь хранит проектные данные, такие как числовые переменный MATLAB, для одной из моделей.
coderDefs.sldd
является разделяемыми данными, который хранит определения генерации кода для обеих моделей. Другие словари ссылаются на coderDefs.sldd
.
Создайте словарь данных. Затем создайте класс памяти в словаре.
В командной строке откройте Model Explorer.
daexplr
В Model Explorer выберите File > New > Data Dictionary.
Назовите словарь coderDefs.sldd
.
На панели Model Hierarchy Model Explorer щелкните правой кнопкой мыши coderDefs
и выберите Show Empty Sections.
Выберите узел Embedded Coder Dictionary.
На панели Диалоговое окно (правая панель) нажмите кнопку Open Embedded Coder Dictionary.
В диалоговом окне Embedded Coder Dictionary нажмите Add.
Для нового класса памяти на панели Property Inspector задайте Name internalsInFile
.
На панели Model Hierarchy Model Explorer щелкните правой кнопкой мыши coderDefs
и выберите Save Changes.
Соедините каждую модель с отдельным словарем данных. Сконфигурируйте каждый словарь для ссылки на автономный словарь (coderDefs.sldd
).
Откройте модели.
rtwdemo_configinterface rtwdemo_roll
В rtwdemo_roll
на вкладке Modeling, в галерее Design, нажмите Link to Data Dictionary.
В диалоговом окне Свойств модели» нажмите кнопку New.
Создайте словарь с именем rtwdemo_roll_data.sldd
при помощи диалогового окна «Создание нового словаря данных».
В диалоговом окне Свойств модели» нажмите кнопку OK.
Simulink связывает модель с новым словарем. Словарь не содержит никаких данных, потому что модель не использует данные в базовом рабочем пространстве.
Откройте словарь в Model Explorer. В левом нижнем углу модели щелкните значок данных моделей, а затем щелкните ссылку External Data. Под узлом External Data выберите rtwdemo_roll_data.sldd
.
На панели Диалоговое окно, в разделе Referenced Dictionaries, нажмите Add.
В диалоговом окне Open Data Dictionary дважды кликните coderDefs.sldd
.
Используйте панель Model Hierarchy, чтобы сохранить изменения, которые вы внесли в rtwdemo_roll_data.sldd
.
Ссылка на rtwdemo_configinterface
в словарь с именем rtwdemo_configinterface_data.sldd
.
rtwdemo_configinterface
использует переменную в базовом рабочем пространстве. Чтобы перенести переменную в словарь, в диалоговом окне Свойства модели (Model Properties) нажмите Migrate data. Затем следуйте инструкциям, чтобы связать модель со словарем и скопировать ссылочные переменные.
Сконфигурируйте rtwdemo_configinterface_data.sldd
см. coderDefs.sldd
.
Подтвердите, что общее определение доступно для использования в моделях, применив его как настройку по умолчанию для внутренних данных и осмотрев сгенерированный код.
В rtwdemo_roll
щелкните вкладку C Code. Если панель инструментов не показывает вкладку C Code, откройте приложение Embedded Coder.
Под Code Mappings> Data Defaults, для Signals, states, and internal data строки, набор Storage Class к internalsInFile
.
В rtwdemo_configinterface
, используйте редактор Отображения, чтобы задать Storage Class значение internalsInFile
для строки Signals, states, and internal data.
Сгенерируйте код из rtwdemo_roll
.
В представлении Code проверьте сгенерированный файл rtwdemo_roll.c
. Файл задает глобальные переменные, которые соответствуют данным о состоянии в модели, такие как состояние Integrator блока в BasicRollMode
подсистема.
/* Storage class 'internalsInFile' */ real32_T rtwdemo__FixPtUnitDelay1_DSTATE; real32_T rtwdemo_roll_Integrator_DSTATE; int8_T rtwde_Integrator_PrevResetState;
Опционально сгенерируйте код из rtwdemo_configinterface
и подтвердите, что код появляется должным образом.
Если вы создаете определения генерации кода в словаре Embedded Coder Dictionary модели, определения хранятся в файле модели. Если вы хотите поделиться определениями между моделями:
Создайте разделяемые данные, как показано на разделе «Совместное определение словаря Embedded Coder между моделями». Прежде чем переходить к следующему шагу, убедитесь, что все целевые модели имеют доступ к общему словарю.
Используйте coder.dictionary.move
функция для миграции определений из исходного файла модели в разделяемые данные.
Чтобы перенести отдельные определения, в диалоговом окне Embedded Coder Dictionary используйте кнопки Cut и Paste на панели быстрого доступа.
Опционально скопируйте настройки редактора Отображения из исходной модели в другие модели с помощью программного интерфейса редактора Code Mappings (см. «Настройка программных данных по умолчанию и генерации кода функции»).
В этом примере вы преобразуете подсистему в ссылочную модель. Затем вы создаете класс памяти в словаре Embedded Coder Dictionary верхней модели и используете класс памяти в редакторе Code Mappings. Чтобы использовать те же настройки редактора Кода Отображений для модели верхней части и для модели-ссылки, необходимо извлечь класс памяти в словарь разделяемых данных (.sldd
).
Откройте пример модели rtwdemo_roll
.
rtwdemo_roll
В модели щелкните правой кнопкой мыши по BasicRollMode
и выберите Subsystem & Model Reference > Convert to > Referenced Model.
Нажмите Convert.
Новая ссылочная модель, BasicRollMode
, откроется. Файл модели находится в текущей папке.
В верхней модели rtwdemo_roll
щелкните вкладку C Code. Если панель инструментов не показывает вкладку C Code, откройте приложение Embedded Coder.
Щелкните Code Interface > Embedded Coder Dictionary.
В диалоговом окне Embedded Coder Dictionary, на вкладке Storage Classes, нажмите Add.
Для нового класса памяти задайте следующие значения свойств:
Name с internalsInFile
.
Header File с $R_internal.h
.
Definition File с $R_internal.c
.
В модели, в редакторе Отображения, для строки Data Defaults > Signals, states, and internal data установите Storage Class internalsInFile
.
Модель-ссылка не может получить доступ к определениям генерации кода в словаре Embedded Coder Dictionary родительской модели. Теперь переместите класс памяти из родительской модели в разделяемые данные.
Как лучшая практика, соедините каждую модель с отдельным словарем данных (.sldd
), создать общий, автономный словарь данных для хранения определения генерации кода (класса памяти) и сконфигурировать ссылки на словарь, чтобы все модели могли использовать определение генерации кода.
Чтобы связать модели с отдельными словарями:
В rtwdemo_roll
на вкладке Modeling, в галерее Design, нажмите Link to Data Dictionary.
В диалоговом окне Свойств модели» нажмите кнопку New.
Используйте диалоговое окно Создание нового словаря данных, чтобы создать словарь с именем rtwdemo_roll_data.sldd
.
В диалоговом окне Свойств модели» нажмите кнопку OK.
В диалоговом окне Link Model to Data Dictionary нажмите Change this model only.
В BasicRollMode
model, используйте диалоговое окно Свойства модели (Model Properties), чтобы связать модель с новым словарем данных с именем basicRollMode_data.sldd
.
Нажмите, OK.
Чтобы создать общий, автономный словарь и сохранить в нем определение генерации кода:
В обеих моделях откройте словарь в Model Explorer. В левом нижнем углу блока щелкните значок данных моделей, а затем щелкните ссылку External Data. Под узлом External Data выберите словарь.
В Model Explorer выберите File > New > Data Dictionary.
Создайте словарь данных с именем coderDefs.sldd
.
На панели Model Hierarchy Model Explorer выберите узел rtwdemo_roll_data.
На панели Диалоговое окно (правая панель), в разделе Referenced Dictionaries, нажмите Add.
Добавьте ссылку на coderDefs.sldd
.
Сконфигурируйте basicRollMode_data.sldd
см. coderDefs.sldd
.
На панели Model Hierarchy щелкните правой кнопкой мыши узел rtwdemo_roll_data и выберите Save Changes.
В командной строке переместите определения генерации кода из rtwdemo_roll
файл модели в coderDefs.sldd
словарь данных.
coder.dictionary.move('rtwdemo_roll','coderDefs.sldd');
Теперь обе модели имеют доступ к классу памяти internalsInFile
.
Новая модель-ссылка не использует настройки редактора Отображения, которые использует родительская модель. Чтобы скопировать настройки из родительской модели в модель-ссылку, используйте программный интерфейс редактора Отображения.
В командной строке скопируйте настройку класса памяти для Signals, states, and internal data из rtwdemo_roll
на BasicRollMode
.
roll_mapping = coder.mapping.api.get('rtwdemo_roll'); roll_sc = getDataDefault(roll_mapping,'InternalData','StorageClass'); mode_mapping = coder.mapping.api.get('BasicRollMode'); setDataDefault(mode_mapping,'InternalData','StorageClass',roll_sc);
Теперь обе модели используют одни и те же настройки редактора Отображения. Для получения дополнительной информации о программном интерфейсе редактора Отображения, смотрите Конфигурирование данных по умолчанию и Генерация кода функции программно.
Словарь данных Simulink может хранить конструкторские данные, такие как переменный MATLAB и Simulink.AliasType
объекты (см. раздел «Глобальные и разделяемые данные: словарь данных»). Однако миграция проектных данных большой модели или нескольких моделей из базового рабочего пространства в словарь данных может занять время и тщательное планирование.
Если вы хотите хранить определения генерации общего кода в словаре данных, но не хотите переносить проект данные модели, в диалоговом окне Свойства модели, на вкладке External Data, выберите свойство Enable model access to base workspace. Модель может использовать проектные данные из базового рабочего пространства и определения генерации кода из словаря или из ссылочного словаря. Дополнительные сведения см. в разделе Продолжение использования разделяемых данных в базовом рабочем пространстве.