Разверните определения генерации кода

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

В крупной организации с многоуровневыми моделями и пользователями, можно совместно использовать определения генерации кода путем хранения их во взаимно доступном месте. Процесс совместного использования определений кода называется deployment.

Совместно используйте определения генерации кода между многоуровневыми моделями и пользователями

Когда вы создаете определения генерации пользовательского кода, чтобы совместно использовать определения между моделями и другими пользователями:

  • Когда вы создаете определения в пакете при помощи Custom Storage Class Designer, для каждого пользователя, помещаете папку, содержащую папку пакета на пути MATLAB®. Для получения дополнительной информации смотрите то, Что Путь поиска файлов MATLAB? MATLAB.

  • Когда вы создаете определения в Словаре Embedded Coder, храните определения в словаре данных Simulink®. Затем соедините каждую модель с отдельным словарем данных. Сконфигурируйте каждый отдельный словарь, чтобы обратиться к словарю, который содержит определения генерации кода. Для примера см. Словарное определение Embedded Coder Доли Между Моделями.

Использование словаря для моделей, созданных с различными версиями Simulink

Simulink обеспечивает версионность для Словарей Embedded Coder®. Когда эти события имеют место, Simulink синхронизирует данные в словаре данных, включая Словари Embedded Coder, поскольку использование с моделью независимо от версии Simulink раньше создавало модель.

  • Вы соединяете модель со словарем данных, который был сохранен в предыдущей версии Simulink (например, вы соединяете модель, которую вы разрабатываете в R2018b со словарем, сохраненным в R2018a).

  • Вы открываете модель, которая имеет локальный Словарь Embedded Coder в версии Simulink, который является более старым, чем текущая версия (например, вы разработали модель, которая использует локальный словарь в R2018a, и вы открываете ту модель в R2018b, чтобы продолжить разработку).

У вас также есть опция, чтобы экспортировать (сохраняют) Словарь Embedded Coder для использования с моделями, созданными с различной версией (предыдущий или более старый) генератора кода.

Для получения дополнительной информации смотрите Использование Словаря для Моделей, Созданных с Различными Версиями Simulink (Simulink).

Сконфигурируйте отображение кода по умолчанию в разделяемом словаре

В то время как подготовка Словаря Embedded Coder намеревалась быть совместно использованной многоуровневыми моделями, можно сопоставить определения кода по умолчанию для категорий данных модели и функций. В этом примере вы сопоставляете определения кода по умолчанию для Словаря Embedded Coder в exSharedCodeDefs.sldd.

  1. Если не уже заданный, задайте определения кода (классы памяти, функциональные шаблоны настройки и разделы памяти) в словаре данных. В данном примере вы задаете определения кода в словаре данных exSharedCodeDefs.sldd. Поместите копию этого файла в writeable месте.

  2. В панели Current Folder Окна Команды MATLAB дважды кликните имя файла своей копии exSharedCodeDefs.sldd.

  3. В панели Model Hierarchy Model Explorer щелкните правой кнопкой по узлу словаря и выберите Show Empty Sections. Model Explorer перечисляет узлы для Design Data, Configurations, Embedded Coder Dictionary и Other data.

  4. Откройте Словарь Embedded Coder. В панели Model Hierarchy нажмите Embedded Coder Dictionary. Затем на правой панели нажмите Open Embedded Coder Dictionary.

  5. На панели инструментов Embedded Coder Dictionary нажмите Configure Defaults.

  6. В диалоговом окне Configure Dictionary Defaults сконфигурируйте определения кода по умолчанию для категорий данных и функций.

    • На вкладке Data Defaults сконфигурируйте класс памяти и, если применимо, раздел memory, для этих категорий данных,

      Категория элемента моделиОписание
      InportsВходные порты корневого уровня модели.
      Выходные портыВыходные порты корневого уровня модели.
      Глобальные параметрыПараметры, которые заданы в базовом рабочем пространстве или в словаре данных. Многоуровневые модели в приложении могут использовать эти параметры.
      Локальные параметрыПараметры, которые заданы в модели, такой как параметры в рабочем пространстве модели. Исключает образцовые аргументы.
      Аргументы параметраПараметры блоков в рабочем пространстве модели, которые сконфигурированы в качестве образцовых аргументов. Эти параметры представлены в блоке модели, чтобы позволить каждому образцовому экземпляру обеспечивать свое собственное значение. Чтобы задать параметр в качестве образцового аргумента, установите флажок Argument на вкладке Parameters в Model Data Editor.
      Разделяемые локальные хранилища данныхБлоки памяти Хранилища данных с параметрами блоков Share across model instances установлены. Эти хранилища данных доступны только в модели, где они заданы. Значение хранилища данных совместно используется через экземпляры модели.
      Хранилища глобальных данныхХранилища данных, которые заданы объектом сигнала в базовом рабочем пространстве или в словаре данных. Многоуровневые модели в приложении могут использовать эти хранилища данных.
      Внутренние данныеЛокальные данные, такие как хранилища данных, дискретные состояния блока, блокируют выходные сигналы и сигналы пересечения нулем.
      КонстантыБлок постоянного значения вывод и постоянные параметры в модели.
    • На вкладке Function Defaults сконфигурируйте функциональный шаблон настройки и, если применимо, раздел memory, для этих категорий функций:

      Образцовая функциональная категорияОписание
      Инициализировать/ОтключитьТочка входа функционирует для инициализации и завершения
      ВыполнениеТочка входа функционирует для того, чтобы инициировать выполнение и сброс
      Разделяемая утилитаРазделяемые служебные функции

    Отображение значения по умолчанию для категории применяется к элементам в категории в модели.

    В данном примере установите класс памяти для категорий данных Inports, Outports и Global data stores к ExportedGlobal.

  7. Примените свои изменения и закройте диалоговое окно. Нажмите Apply. Затем нажмите OK.

  8. Закройте словарь Embedded Coder и Model Explorer.

Совместно используйте словарное определение Embedded Coder между моделями

Этот пример показывает, как создать класс памяти, который приводит к отдельным глобальным переменным в сгенерированном коде, и совместно используйте класс памяти между двумя моделями, rtwdemo_roll и rtwdemo_advsc. Затем вы конфигурируете каждую модель, чтобы использовать класс памяти в качестве настройки генерации кода по умолчанию для внутренних данных, которые включают состояния блока.

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

Данные показывают иерархию словаря в качестве примера. В фигуре:

  • modelOne.slx и modelTwo.slx являются различными образцовыми файлами.

  • dataForModelOne.sldd и dataForModelTwo.sldd являются словарями данных. Каждый словарь хранит данные проектирования, такие как числовые переменные MATLAB, для одной из моделей.

  • coderDefs.sldd является словарем разделяемых данных, который хранит определения генерации кода для обеих моделей. Другая ссылка словарей coderDefs.sldd.

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

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

  1. В командной строке откройте Model Explorer.

    daexplr

  2. В Model Explorer выберите File> New> Data Dictionary.

  3. Назовите словарь coderDefs.sldd.

  4. В панели Model Hierarchy Model Explorer щелкните правой кнопкой по coderDefs и выберите Show Empty Sections.

  5. В панели Model Hierarchy выберите узел Embedded Coder Dictionary.

  6. В Диалоговой панели (правая панель), нажмите Open Embedded Coder Dictionary.

  7. В диалоговом окне Embedded Coder Dictionary нажмите Add.

  8. Для нового класса памяти, в панели Property Inspector, устанавливает Name на internalsInFile.

  9. В панели Model Hierarchy Model Explorer щелкните правой кнопкой по coderDefs и выберите Save Changes.

Соедините модели со словарями данных

Соедините каждую модель с отдельным словарем данных. Сконфигурируйте каждый словарь, чтобы обратиться к автономному словарю (coderDefs.sldd).

  1. Откройте модели.

    rtwdemo_advsc
    rtwdemo_roll

  2. В rtwdemo_roll выберите File> Model Properties> Link to Data Dictionary.

  3. В диалоговом окне Model Properties нажмите New.

  4. Создайте словарь под названием rtwdemo_roll_data.sldd при помощи Создавания нового диалогового окна Data Dictionary.

  5. В диалоговом окне Model Properties нажмите OK.

    Simulink соединяет модель с новым словарем. Словарь не содержит данных, потому что модель не использует данные в базовом рабочем пространстве.

  6. В нижнем левом углу модели кликните по значку словаря данных, который открывает словарь в Model Explorer.

  7. В Диалоговой панели, под Referenced Dictionaries, нажимают Add.

  8. В диалоговом окне Open Data Dictionary дважды кликните coderDefs.sldd.

  9. Используйте панель Model Hierarchy, чтобы сохранить изменения, которые вы внесли в rtwdemo_roll_data.sldd.

  10. Соедините rtwdemo_advsc со словарем под названием rtwdemo_advsc_data.sldd.

    rtwdemo_advsc использует переменную в базовом рабочем пространстве. Чтобы переместить переменную в словарь, в диалоговом окне Model Properties, нажимают Migrate data. Затем следуйте инструкциям, чтобы соединить модель со словарем и скопировать переменные, на которые ссылаются.

  11. Сконфигурируйте rtwdemo_advsc_data.sldd, чтобы относиться к coderDefs.sldd.

Примените определение генерации кода в моделях

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

  1. В rtwdemo_roll выберите Code> C/C++ Code> Configure Model in Code Perspective.

  2. Под Code Mappings> Data Defaults, для строки Internal data, установил Storage Class на internalsInFile.

  3. В rtwdemo_advsc используйте перспективу Кода, чтобы установить Storage Class на internalsInFile для строки Internal data.

  4. Сгенерируйте код от rtwdemo_roll.

  5. В представлении 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;

  6. Опционально, сгенерируйте код от rtwdemo_advsc и подтвердите, что код появляется как ожидалось.

Переместите определения от образцового файла до словаря разделяемых данных

Если вы создаете определения генерации кода в Словаре Embedded Coder модели, определения хранятся в образцовом файле. Если вы хотите совместно использовать определения между моделями:

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

  2. Используйте функцию coder.dictionary.move, чтобы переместить определения от файла исходной модели до словаря разделяемых данных.

  3. Опционально, скопируйте редактор Отображений Кода настройки от исходной модели до других моделей при помощи программируемого интерфейса редактора Отображений Кода (см., Конфигурируют Данные По умолчанию и Функциональную Генерацию кода Программно).

В этом примере вы создаете класс памяти в Словаре Embedded Coder модели и используете класс памяти в редакторе Отображений Кода. Затем вы преобразовываете подсистему в модель, на которую ссылаются. Чтобы использовать тот же редактор Отображений Кода настройки для первой модели и для модели, на которую ссылаются, необходимо извлечь класс памяти в словарь разделяемых данных (.sldd).

Создайте и примените класс памяти

  1. Откройте модель rtwdemo_roll в качестве примера.

    rtwdemo_roll

  2. В модели выберите Code> C/C++ Code> Configure Model in Code Perspective.

  3. Под блок-схемой, в редакторе Отображений Кода, нажимают кнопку Embedded Coder Dictionary.

  4. В диалоговом окне Embedded Coder Dictionary, на вкладке Storage Classes, нажимают Add.

  5. Для нового класса памяти, набор эти значения свойств:

    • Name к internalsInFile.

    • Header File к $R_internal.h.

    • Definition File к $R_internal.c.

  6. В модели, в редакторе Отображений Кода, для Data Defaults> строка Internal data, устанавливает Storage Class на internalsInFile.

Создайте модель, на которую ссылаются,

  1. В модели щелкните правой кнопкой по подсистеме BasicRollMode и выберите Subsystem & Model Reference> Convert to> Referenced Model.

  2. В Советнике по вопросам Преобразования Модели - ссылки нажмите Convert.

    Новая модель, на которую ссылаются, BasicRollMode, открывается. Образцовый файл находится в вашей текущей папке.

По умолчанию модель, на которую ссылаются, не может получить доступ к определениям генерации кода в Словаре Embedded Coder родительской модели. Теперь, переместите класс памяти из родительской модели и в словарь разделяемых данных.

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

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

Соединять модели, чтобы разделить словари:

  1. В модели rtwdemo_roll выберите File> Model Properties> Link to Data Dictionary.

  2. В диалоговом окне Model Properties нажмите New.

  3. Используйте Создавание нового диалогового окна Data Dictionary, чтобы создать словарь под названием rtwdemo_roll_data.sldd.

  4. В диалоговом окне Model Properties нажмите OK.

  5. В диалоговом окне Link Model to Data Dictionary нажмите Change this model only.

  6. В модели BasicRollMode используйте диалоговое окно Model Properties, чтобы соединить модель с новым словарем данных под названием basicRollMode_data.sldd.

  7. Нажатие кнопки, OK.

Создать разделяемый, автономный словарь и сохранить определение генерации кода в нем:

  1. В обеих моделях, в нижнем левом углу блок-схемы, кликают по значку словаря данных, чтобы открыть каждый словарь в Model Explorer.

  2. В Model Explorer выберите File> New> Data Dictionary.

  3. Создайте словарь данных под названием coderDefs.sldd.

  4. В панели Model Hierarchy Model Explorer выберите узел rtwdemo_roll_data.

  5. В Диалоговой панели (правая панель), под Referenced Dictionaries, нажимают Add.

  6. Добавьте ссылку на coderDefs.sldd.

  7. Сконфигурируйте basicRollMode_data.sldd, чтобы относиться к coderDefs.sldd.

  8. В панели Model Hierarchy щелкните правой кнопкой по узлу rtwdemo_roll_data и выберите Save Changes.

  9. В командной строке переместите определения генерации кода от файла модели rtwdemo_roll до словаря данных coderDefs.sldd.

    coder.dictionary.move('rtwdemo_roll','coderDefs.sldd')

Теперь, обе модели имеют доступ к классу памяти internalsInFile.

Скопируйте редактор отображений кода настройки от родительской модели до модели, на которую ссылаются,

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

В командной строке скопируйте установку класса памяти для Internal data от rtwdemo_roll до BasicRollMode.

roll_sc = coder.mapping.defaults.get('rtwdemo_roll','InternalData','StorageClass');

coder.mapping.create('BasicRollMode');
coder.mapping.defaults.set('BasicRollMode','InternalData','StorageClass',roll_sc);

Теперь, обе модели используют тот же редактор Отображений Кода настройки. Для получения дополнительной информации о программируемом интерфейсе редактора Отображений Кода, смотрите, Конфигурируют Данные По умолчанию и Функциональную Генерацию кода Программно.

Сделайте разделяемые определения в словаре данных доступными новым моделям

Модель, которую вы создаете из начальной страницы Simulink или при помощи функции new_system, не соединена со словарем данных Simulink. Новая модель не может определения генерации кода доступа, которые вы храните в словаре данных.

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

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

  • Если вы используете проект, рассматриваете создание ярлыка проекта, который создает модель и сразу соединяет новую модель со словарем данных. Для получения информации о проектах и ярлыках проекта, смотрите то, Что Проекты? (Simulink).

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

Словарь данных Simulink может сохранить данные проектирования, такие как переменные MATLAB и объекты Simulink.AliasType (см. Глобальную переменную и Разделяемые данные: Словарь Данных (Simulink)). Однако миграция данных проектирования большой модели или многоуровневых моделей от базового рабочего пространства до словаря данных может занять время и тщательное планирование.

Если вы хотите сохранить совместно использованные определения генерации кода в словаре данных, но не хотите перемещать данные проектирования модели, в диалоговом окне Model Properties, на вкладке Data, выберите свойство Enable access to base workspace. Модель может использовать данные проектирования от базового рабочего пространства и определения генерации кода из словаря или из словаря, на который ссылаются. Для получения дополнительной информации смотрите, Продолжают Использовать Разделяемые данные в Базовом рабочем пространстве (Simulink).

Вводная перспектива кода генерирует ошибку

В иерархии словарей справочных данных (см., что Словарь Ссылается (Simulink)), только один словарь может сохранить определения генерации кода в Словаре Embedded Coder. Когда вы открываете перспективу Кода в модели, которая имеет доступ к нескольким Словарям Embedded Coder через словари справочных данных, Simulink генерирует ошибку. Чтобы разрешить ошибку, используйте coder.dictionary.move и coder.dictionary.remove, чтобы передать и удалить Словари Embedded Coder, пока только один не будет существовать в иерархии словаря. При необходимости сохраните Словарь Embedded Coder в автономном, словарь разделяемых данных, как описано в Словарном определении Embedded Coder Доли Между Моделями.

Смотрите также

Похожие темы