Для вариантных систем условные выражения, называемые элементами управления вариантом, определяют, какой вариант является активным. Можно задать элемент управления вариантом как выражение условия, Simulink.Variant
объект, задающий выражение условия, MATLAB® переменная, или Simulink.Parameter
объект. В этом примере показано, как задать варианты управления как Simulink.Parameter
объекты.
Откройте Model Explorer. Выберите base workspace.
В Model Explorer выберите Add > Simulink Parameter. Задайте имя для нового параметра.
Используйте функцию Simulink.VariantManager.findVariantControlVars
для поиска и преобразования переменного MATLAB, используемых в выражениях управления вариантами в Simulink.Parameter
объекты. Для получения примера смотрите Преобразовать Вариант Переменные в Simulink. Параметр Объекты.
На Simulink.Parameter
Свойство диалоговом окне задайте Value и Data type.
Выберите одно из следующих Storage class значений.
Define
ImportedDefine(Custom)
CompilerFlag(Custom)
Класс памяти, созданный с помощью Custom Storage Class Designer. Класс хранения должен иметь Data initialization набора параметров для Macro
и Data scope набора параметров для Imported
. Для получения дополнительной информации см. раздел «Представление управляющих данных путем настройки свойств класса памяти».
Задайте значение варианта управления. Если класс памяти ImportedDefine(Custom)
, выполните следующее:
Задайте параметр Header File как внешний файл заголовка в разделе Пользовательские атрибуты Simulink.Parameter
диалоговое окно свойств.
Введите значения элементов управления варианта во внешний заголовочный файл.
Примечание
Сгенерированный код ссылается на управление вариантом как на определяемый пользователем макрос. Сгенерированный код не содержит значение макроса. Значение управления вариантом определяет активный вариант в скомпилированном коде.
Если управление вариантом является 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
объект перечисляемого типа. Этот подход обеспечивает значимые имена и улучшает читаемость условий. Сгенерированный код включает предварительные условия процессора, чтобы проверить, что условие варианта содержит допустимые значения перечисляемого типа.
Откройте диалоговое окно Параметры конфигурации.
Выберите панель Code Generation и установите System target file следующим образом ert.tlc
.
На панели Report выберите Create code generation report.
В диалоговом окне Configuration Parameters очистите параметр Ignore custom storage classes. В порядок генерации условий препроцессора необходимо использовать пользовательские классы памяти.
В диалоговых окнах Variant Subsystem, Variant Source или Варианте Sink параметров блоков установите значение параметра Variant activation time code compile
.
Сгенерируйте код.
Номера портов и имена для каждой дочерней подсистемы варианта должны принадлежать подмножеству номеров портов и имен родительского блока 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.