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

Средства управления вариантом Define

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

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

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

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

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

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

    • Define

    • ImportedDefine(Custom)

    • CompilerFlag(Custom)

    • Класс памяти создал использование Custom Storage Class Designer. Ваш класс памяти должен иметь набор параметров Data initialization к Macro и набор параметров Data scope к Imported. Смотрите Представление данных Управления Configuring Storage Class Properties для получения дополнительной информации.

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

    1. Задайте параметр Header File как внешний заголовочный файл в разделе Custom Attributes 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. Откройте диалоговое окно Configuration Parameters.

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

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

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

  5. В Различной Подсистеме Различный Источник или Различные диалоговые окна параметров блоков Приемника, установил параметр Variant activation time на code compile.

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

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

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

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

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

  • Если вы комментируете дочерние подсистемы, перечисленные в таблице Variant Choices в Различном диалоговом окне параметра блока 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'));

Модель содержит два Различных блока Subsystem.

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

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

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

Поменяйте имя сгенерированного заголовочного файла через Model Data Editor

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

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

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

Нажмите кнопку дополнительной информации Show/refresh.

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

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

Выберите обе строки. Затем для одной из строк используйте столбец Заголовочного файла, чтобы изменить название заголовочного файла от 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.

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

Определите имя к VariantControlVar.

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

Нажмите Apply, Save и OK.

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

Похожие темы