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

Задайте различные средства управления

Для вариантных систем названные различные средства управления условных выражений определяют, какой вариант активен. Можно задать различное управление как выражение условия, объект 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. Объекты параметра (Simulink).

  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 Custom 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 очистите Игнорировать пользовательские классы памяти (Simulink Coder) параметр. В порядке сгенерировать условные выражения препроцессора, необходимо использовать пользовательские классы памяти.

  5. В Различной Подсистеме Различный Источник или Различные диалоговые окна параметров блоков Приемника, выбирает опцию Analyze all choices during update diagram and generate preprocessor conditionals.

  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. Необходимо изменить имя файла в каждом объекте параметра.

В модели выберите View> 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.

Похожие темы