Для вариантных систем названные различные средства управления условных выражений определяют, какой вариант активен. Можно задать различное управление как выражение условия, Simulink.Variant
объект, задающий выражение условия, переменную MATLAB® или Simulink.Parameter
объект. В этом примере показано, как к варианту define управляет как Simulink.Parameter
объекты.
Откройте Model Explorer. Выберите base workspace.
В Model Explorer выберите Add> Simulink Parameter. Задайте имя для нового параметра.
Используйте функциональный Simulink.VariantManager.findVariantControlVars
найти и преобразовать переменные MATLAB, используемые в различных выражениях управления в Simulink.Parameter
объекты. Для примера смотрите, Преобразуют Различные Контрольные переменные в Simulink. Объекты параметра (Simulink).
На Simulink.Parameter
диалоговое окно свойства, задайте Value и Data type.
Выберите одно из этих значений Storage class.
Define
ImportedDefine(Custom)
CompilerFlag(Custom)
Класс памяти создал использование Custom Storage Class Designer. Вашему классу памяти нужно было установить параметр Data initialization на Macro
и набор параметра Data scope к Imported
. Смотрите Представление данных Управления Configuring Storage Class Properties для получения дополнительной информации.
Задайте значение различного управления. Если классом памяти является ImportedDefine(Custom)
, сделайте следующее:
Задайте параметр Header File как внешний заголовочный файл в разделе Custom Attributes 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
объект перечислимого типа. Этот подход обеспечивает понятные имена и улучшает удобочитаемость условий. Сгенерированный код включает условные выражения препроцессора, чтобы проверять, что различное условие содержит допустимые значения перечислимого типа.
Откройте диалоговое окно Configuration Parameters.
Выберите панель Code Generation и установите System target file как ert.tlc
.
В панели Report выберите Create code generation report.
В диалоговом окне Configuration Parameters очистите Игнорировать пользовательские классы памяти (Simulink Coder) параметр. Для того, чтобы сгенерировать условные выражения препроцессора, необходимо использовать пользовательские классы памяти.
В Различной Подсистеме Различный Источник или Различные диалоговые окна параметров блоков Приемника, выбирает опцию Analyze all choices during update diagram and generate preprocessor conditionals.
Сгенерируйте код.
Номера портов и имена для каждой дочерней различной подсистемы должны принадлежать подмножеству номеров портов и именам родительского Различного блока 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.