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

Задайте элементы управления варианта

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

  1. Откройте Model Explorer. Выберите base workspace.

  2. В Model Explorer выберите Add > Simulink Parameter. Задайте имя для нового параметра.

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

  4. На Simulink.Parameter Свойство диалоговом окне задайте Value и Data type.

  5. Выберите одно из следующих Storage class значений.

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

    1. Задайте параметр Header File как внешний файл заголовка в разделе Пользовательские атрибуты Simulink.Parameter диалоговое окно свойств.

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

      Примечание

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

      Если управление вариантом является CompilerFlag пользовательский класс памяти, значение элемента управления варианта задается во время компиляции. Используйте параметр Configuration Parameters Code Generation > Custom Code > Additional build information > Defines >, чтобы добавить список элементов управления вариантов (определения макросов) в командную строку компилятора. Для примера, для варианта управления VSSMODE, в текстовом поле для параметра Defines введите:

      -DVSSMODE=1

      Если вы хотите изменить значение элемента управления варианта после генерации файла make-файла, используйте опцию make-файла при компиляции кода. Для примера в командной строке за пределами MATLAB введите:

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

Примечание

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

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

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

  2. Выберите панель Code Generation и установите System target file следующим образом ert.tlc.

  3. На панели Report выберите Create code generation report.

  4. В диалоговом окне Configuration Parameters очистите параметр Ignore custom storage classes. В порядок генерации условий препроцессора необходимо использовать пользовательские классы памяти.

  5. В диалоговых окнах Variant Subsystem, Variant Source или Варианте Sink параметров блоков установите значение параметра Variant activation time code compile.

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

Особые факторы для генерации предварительных условий процессора

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

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

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

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

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

  • Для исполнительных подсистем, model_private.h файл содержит условные определения параметров. Для примера, если значение блока Constant является Simulink.Parameter с ImportedDefine пользовательский класс памяти, и блок Constant находится в Подсистеме Вариантов, условном определении 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 и сконфигурированы, чтобы появляться в сгенерированном коде как макросы кода С в macros.h.

Изменение имени сгенерированного файла заголовка с помощью Model Data Editor

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

В модели выберите Моделирование > Model Data Editor.

В Model Data Editor выберите вкладку Параметры.

Нажмите кнопку Показать/обновить дополнительные сведения.

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

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

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

Уменьшите усилия по техническому обслуживанию, создав пользовательский класс памяти

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

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

Установите текущую папку в место с возможностью записи.

В командной строке скопируйте встроенную 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.

Откройте Custom Storage Class Designer.

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. Чтобы изменить имя файла заголовка, используйте Custom Storage Class Designer.

Похожие темы