exponenta event banner

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

Определение элементов управления исполнениями

Для исполнительных систем условные выражения, называемые элементами управления исполнениями, определяют, какой вариант является активным. Можно указать элемент управления исполнения в качестве выражения условия, Simulink.Variant объект, определяющий выражение условия, переменную MATLAB ® или Simulink.Parameter объект. В этом примере показано, как определить элементы управления исполнения как Simulink.Parameter объекты.

  1. Откройте обозреватель моделей. Выберите базовое рабочее пространство.

  2. В обозревателе моделей выберите «Добавить» > «Simulink Parameter». Укажите имя нового параметра.

  3. Используйте функцию Simulink.VariantManager.findVariantControlVars поиск и преобразование переменных MATLAB, используемых в выражениях управления вариантами, в Simulink.Parameter объекты. Пример см. в разделе Преобразование переменных управления вариантами в объекты Simulink.Parameter.

  4. На Simulink.Parameter задайте значение и тип данных.

  5. Выберите одно из этих значений класса Storage.

  6. Укажите значение элемента управления исполнения. Если класс хранения данных ImportedDefine(Custom), выполните следующие действия:

    1. Укажите параметр Header File в качестве внешнего файла заголовка в разделе Custom Attributes Simulink.Parameter диалоговое окно свойств.

    2. Введите значения элементов управления вариантов во внешний файл заголовка.

      Примечание

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

      Если элементом управления исполнения является CompilerFlag пользовательский класс хранения, значение элемента управления исполнения устанавливается во время компиляции. Используйте Параметры конфигурации > Создание кода > Пользовательский код > Дополнительные сведения о построении > Определяет параметр для добавления списка элементов управления исполнения (определений макросов) в командную строку компилятора. Например, для управления вариантами VSSMODE, в текстовом поле параметра Defines введите:

      -DVSSMODE=1

      Если требуется изменить значение элемента управления исполнения после создания makefile, используйте параметр makefile при компиляции кода. Например, в командной строке за пределами MATLAB введите:

      makecommand -f model.mk DEFINES_CUSTOM="-DVSSMODE=1"

Примечание

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

Настройка модели для генерации условных директив препроцессора

  1. Откройте диалоговое окно «Параметры конфигурации».

  2. Выберите панель «Создание кода» и задайте для параметра «Системный целевой файл» значение ert.tlc.

  3. На панели «Отчет» выберите Создать отчет о создании кода.

  4. В диалоговом окне Параметры конфигурации снимите флажок Игнорировать пользовательские классы хранения. Для создания условий препроцессора необходимо использовать пользовательские классы хранения.

  5. В диалоговых окнах «Variant Subsystem», «Variant Source» или «Variant Sink block» задайте для параметра «Variant activation time» значение code compile.

  6. Создать код.

Особые соображения по созданию условий препроцессора

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

  • Процесс создания кода проверяет наличие по крайней мере одного активного варианта с помощью управляющих значений вариантов, сохраненных в базовой рабочей области. Элемент управления исполнениями, который вычисляет true становится активным вариантом. Если ни один из элементов управления исполнениями не вычисляется как trueвариант по умолчанию, если он указан, становится активным вариантом. Процесс создания кода выдает ошибку, если активный вариант не существует.

  • Реализуйте выражения условий для объектов исполнения таким образом, чтобы только одно из них равнялось true. Созданный код включает проверку объектов вариантов для определения наличия только одного активного варианта. Если тест завершится неуспешно, ваш код не будет скомпилирован.

  • Если вы прокомментируете дочерние подсистемы, перечисленные в таблице Варианты выбора (Variant Choices) в диалоговом окне Параметр блока подсистема исполнения (Variant Subsystem block parameter), генератор кода не создает код для подсистем с комментариями.

  • Если время выборки для варианта по умолчанию отличается от времени выборки для других вариантов, #else условие препроцессора не создается для варианта по умолчанию. Вместо этого #if !(<variant conditions>) генерируется.

  • Для исполнительных подсистем: model_private.h содержит определения условных параметров. Например, если значение блока Constant равно Simulink.Parameter с ImportedDefine пользовательский класс хранения, а блок Constant находится в Variant Subsystem, условное определение Simulink.Parameter находится в model_private.h файл.

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

В этом примере показано, как агрегировать несколько макросов управления вариантами (#define) в том же созданном файле заголовка. Эта агрегация упрощает управление сложностями, присущими системе с несколькими взаимодействующими условиями вариантов.

Изучение примера модели

Запустить сценарий prepare_rtwdemo_preproc_subsys, которая открывает модель rtwdemo_preprocessor_subsys и готовит его для этого примера.

run(fullfile(matlabroot,'examples','ecoder','main','prepare_rtwdemo_preproc_subsys'));

Модель содержит два блока Variant Subsystem.

Выполните навигацию внутри подсистем вариантов. Каждая из подсистем имеет линейный и нелинейный вариант алгоритма.

На корневом уровне модели откройте диалоговое окно блока подсистемы исполнения с меткой LeftController. Варианты алгоритма в подсистеме активизируются на основе состояний двух Simulink.Variant объекты, LINEAR и NONLINEAR, в базовом рабочем пространстве.

Состояние каждого объекта зависит от значений двух переменных управления вариантами, MODE_A и MODE_B, которые являются Simulink.Parameter объектов в базовом рабочем пространстве. Объекты параметров используют пользовательский класс хранения Define и сконфигурированы для отображения в сгенерированном коде в виде макросов C-кода в macros.h.

Изменение имени созданного файла заголовка с помощью редактора данных модели

В этом примере измените имя созданного файла заголовка с macros.h кому variant_controls.h. Необходимо изменить имя файла в каждом объекте параметра.

В модели выберите меню «Моделирование» > «Редактор данных модели».

В Редакторе данных модели (Model Data Editor) выберите вкладку Параметры (Parameters).

Нажмите кнопку Показать/обновить дополнительную информацию.

Установите в раскрывающемся списке Изменить представление значение Code.

В поле Содержимое фильтра введите MODE. Редактор данных модели показывает две строки, которые соответствуют объектам параметров.

Выделите обе строки. Затем, для одной из строк, используйте столбец Header File, чтобы изменить имя файла заголовка с macros.h кому variant_controls.h. Редактор данных модели применяет изменение к обеим строкам.

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

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

Вместо этого можно создать пользовательский класс хранения и указать имя файла заголовка только один раз: в определении пользовательского класса хранения.

Установите текущую папку в доступное для записи расположение.

В командной строке скопируйте встроенный SimulinkDemos пакет в текущую папку как myPackage.

copyfile(fullfile(matlabroot,...
    'toolbox','simulink','simdemos','dataclasses','+SimulinkDemos'),...
    '+myPackage','f')

Навигация внутри +myPackage папка в файл Parameter.m и откройте файл.

Раскомментируйте methods раздел, определяющий метод setupCoderInfo. В вызове функции useLocalCustomStorageClasses, заменить 'packageName' с 'myPackage'. По завершении раздел выглядит следующим образом:

  methods
    function setupCoderInfo(h)
      % Use custom storage classes from this package
      useLocalCustomStorageClasses(h, 'myPackage');
    end
  end % methods

Сохраните и закройте файл.

Установите текущую папку в папку, содержащую пакет myPackage.

Откройте конструктор классов настраиваемых хранилищ.

cscdesigner('myPackage')

Выберите пользовательский класс хранения Define.

Нажмите кнопку Копировать. Новый пользовательский класс хранения, Define_1, появляется. Выберите новый пользовательский класс хранения.

Задать для имени значение VariantControlVar.

Задать для файла заголовка значение Specify. В текстовом поле введите variant_controls.h.

Нажмите «Применить», «Сохранить» и «ОК».

В командной строке замените Simulink.Parameter объекты MODE_A и MODE_B с myPackage.Parameter объекты. Применить новый пользовательский класс хранения VariantControlVar.

MODE_A = myPackage.Parameter;
MODE_A.Value = 1;
MODE_A.DataType = 'int32';
MODE_A.CoderInfo.StorageClass = 'Custom';
MODE_A.CoderInfo.CustomStorageClass = 'VariantControlVar';

MODE_B = myPackage.Parameter;
MODE_B.Value = 1;
MODE_B.DataType = 'int32';
MODE_B.CoderInfo.StorageClass = 'Custom';
MODE_B.CoderInfo.CustomStorageClass = 'VariantControlVar';

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

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