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

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

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

  1. Откройте Model Explorer. Выберите base workspace. В качестве альтернативы можно создать Simulink.Parameter в словаре данных.

  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, генератор кода не генерирует код для закомментированного подсистемы.

  • Для различных подсистем, 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, в базовом рабочем пространстве.

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

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

В этом примере поменяйте имя сгенерированного заголовочного файла от macros.h к variant_controls.h.

На вкладке Modeling выберите Model Explorer.

В панели Иерархии модели расширьте Simulink Root и выберите Base Workspace. Панель Содержимого отображает все объекты в базовом рабочем пространстве.

Выберите VSSMODE и затем в панели Simulink.Parameter:VSSMODE, кликните по вкладке Code Generation.

В параметре HeaderFile задайте имя файла как variant_controls.h.

В качестве альтернативы можно изменить имя файла программно, при помощи этой команды. Для получения дополнительной информации о Simulink.CoderInfo, смотрите Simulink.CoderInfo.

Simulink.CoderInfo.CustomAttributes.HeaderFile = 'variant_controls.h';

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

Чтобы изменить название заголовочного файла, необходимо изменить настройку каждого объекта параметра. Можно использовать 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 объект VSSMODE с 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.

Похожие темы

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