Эта модель иллюстрирует подсистемы варианта Simulink ®. Варианты подсистем позволяют вам предоставить несколько реализаций для подсистемы, где только одна реализация активна во время симуляции. Можно программно обменять активную реализацию и заменить ее одной из других реализаций, не изменяя модель.
Блок Variant Subsystem содержит две или более дочерних подсистем, где один дочерний элемент активен во время выполнения модели. Активная дочерняя подсистема называется активным вариантом. Можно программно переключить активный вариант блока Variant Subsystem путем изменения значений переменных в глобальной рабочей области или путем переопределения выбора варианта вручную с помощью диалогового окна Variant Subsystem block. Активный вариант программно соединяется с блоками Inport и Outport Подсистемы вариантов Simulink во время компиляции модели.
Чтобы программно управлять выбором варианта, a Simulink.Variant
связывается с каждой дочерней подсистемой в диалоговом окне блока «Variant Subsystem». Simulink.Variant
объекты создаются в глобальной рабочей области MATLAB ®. Эти объекты имеют свойство с именем Condition
, которое является выражением, которое вычисляет логическое значение и используется для определения активной дочерней подсистемы варианта.
Примечание. Можно задать элементы управления варианта в глобальной рабочей области MATLAB ®, рабочем пространстве модели, рабочей области маски или словаре данных.
Для примера, определения VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');
в глобальной рабочей области создает Simulink.Variant
объект, где аргумент конструктора ('VSS_MODE==1')
определяет, когда вариант активен. Используя диалоговое окно Variant Subsystem, вы соединяете VSS_LINEAR_CONTROLLER
с одной из дочерних подсистем в пределах Подсистемы вариантов. Определение
VSS_MODE=1
в глобальной рабочей области активирует VSS_LINEAR_CONTROLLER
вариант. Аргументом условия может быть простое выражение, состоящее из скалярных переменных, перечислений, равенств, неравенства, & &, и ~. Круглые скобки () могут использоваться для группирования приоритетов.
Модель в этом примере использует следующие объекты исполнения и переменную управления вариантом, которые определены в глобальной рабочей области MATLAB:
VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');
VSS_NONLINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==2');
VSS_MODE=2;
Открытие примера модели sldemo_variant_subsystems
запускает PreLoadFcn, заданный в File -> ModelProperties -> Callbacks
. Это заполняет глобальную рабочую область переменными для блока Variant Subsystem с именем Controller:
open_system('sldemo_variant_subsystems')
Фигура 1: Пример модели, sldemo_variant_subsystems
Чтобы задать Simulink.Variant
ассоциация объектов для Подсистемы Контроллера, щелкните правой кнопкой мыши по Подсистеме Контроллера и выберите Subsystem Parameters
, который откроет диалоговое окно блока подсистемы контроллера.
Диалоговое окно блока подсистемы контроллера задает два потенциальных варианта. Два варианта, в свою очередь, связаны с этими двумя Simulink.Variant
объекты VSS_LINEAR_CONTROLLER
и VSS_NONLINEAR_CONTROLLER
, которые существуют в глобальной рабочей области. Эти объекты имеют свойство с именем Условия, выражение, которое вычисляет до логического и которое определяет, какой вариант является активным. Условие также показано в диалоговом окне «Варианты Подсистемы». В этом примере свойства Condition VSS_LINEAR_CONTROLLER
и VSS_NONLINEAR_CONTROLLER
являются VSS_MODE == 1
и VSS_MODE == 2
, соответственно. Переменная VSS_MODE
находится в глобальной рабочей области и может быть стандартным переменным MATLAB или Simulink.Parameter
.
Если нет связанного объекта варианта или символ '%' (комментарий) префиксирует объект варианта в диалоговом окне Параметры Исполнительной Подсистемы, дочерняя подсистема считается закомментированной и не используется во время выполнения модели.
open_system('sldemo_variant_subsystems/Controller');
Фигура 2. Содержимое блока Подсистемы Контроллера
В блоке Variant Subsystem можно разместить блоки Inport, Outport и Subsystem. В этом примере Linear Controller
Блок Subsystem связан с вариантом объекта, VSS_LINEAR_CONTROLLER
, и Nonlinear Controller
Блок Subsystem связан с вариантом объекта, VSS_NONLINEAR_CONTROLLER
.
Сигнальные соединения не разрешены в Подсистеме Вариантов. Simulink программно соединяет блоки Inport и Outport с активным вариантом при симуляции модели.
Чтобы симулировать с использованием Linear Controller
вариант, задайте:
VSS_MODE=1
в глобальной рабочей области, а затем моделируйте модель.
open_system('sldemo_variant_subsystems/Controller','parameter'); close_system('sldemo_variant_subsystems/Controller') VSS_MODE=1; %#ok (used by sldemo_variant_subsystems) sim sldemo_variant_subsystems;
Фигура 3: Симуляция с использованием Linear Controller
вариант
Чтобы симулировать с использованием Nonlinear Controller
, задайте
VSS_MODE=2
в глобальной рабочей области, а затем моделируйте модель.
VSS_MODE=2; % (used by sldemo_variant_subsystems) sim sldemo_variant_subsystems;
Фигура 4: Симуляция с использованием Nonlinear Controller
вариант
The sldemo_variant_subsystems_enum
модель иллюстрирует следующее Simulink.Variant
возможности:
1. Перечисления: классы перечисления MATLAB могут использоваться для улучшения читаемости в условиях варианта объекта.
2. Повторное использование: Simulink.Variant
объекты могут быть повторно использованы в различных блоках Подсистемы Вариантов.
В этом примере используются следующие переменные, которые определены в глобальной рабочей области MATLAB:
VSSE_LINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.LINEAR')
VSSE_NONLINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.NONLINEAR')
VSSE_MODE=sldemo_vss_CONTROLLER_TYPE.LINEAR
VSSE_PROTOTYPE=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PROTOTYPE')
VSSE_PRODUCTION=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PRODUCTION')
VSSE_MODE_BUILD=sldemo_vss_BUILD_TYPE.PRODUCTION
В этих Simulink.Variant
объекты, мы используем классы, sldemo_vss_BUILD_TYPE.m и sldemo_vss_CONTROLLER_TYPE.m перечисления, чтобы задать Simulink.Variant
Параметры условия, которые улучшают читаемость.
Все три блока Variant Subsystems, Filter1, Filter2 и Filter3 фильтра используют VSSE_PROTOTYPE
и VSSE_PRODUCTION
Simulink.Variant
объекты.
Примечание.Имя класса перечисления должно быть уникальным среди имен типов данных и имен переменных глобальной рабочей области и учитывать регистр.
Открытие примера модели sldemo_variant_subsystems_enum
запускает PreLoadFcn, заданный в File -> ModelProperties -> Callbacks
. Это заполняет глобальную рабочую область переменными для блоков Variant Subsystem:
open_system('sldemo_variant_subsystems_enum')
Фигура 5: Пример модели, sldemo_variant_subsystems_enum
Можно использовать перечисленные типы, чтобы задать значимые имена целым числам, используемым в качестве вариантов значений управления.
Рассмотрим модель rtwdemo_preprocessor_subsys
.
В редакторе MATLAB задайте классы, которые сопоставляют перечисленные значения со значимыми именами.
Если перечисленные типы определены неправильно, отобразится ошибка. Вот пара сценариев, которые приводят к ошибке.
Недопустимое определение1: В этом случае Simulink.IntEnumType
не определен.
Недопустимое определение2: В этом случае переменные не инициализируются.
Введите выражение управления вариантом, как показано в следующем примере:
Фигура 6: Параметры блоков
Задайте значение V в глобальной рабочей области. Например, V = 2;. Значение может быть нормальным переменным MATLAB или Simulink.Parameter
объект. Однако значение не может быть перечисленным типом.
Теперь сгенерируйте код со временем активации Variant, установленным на code compile
. Пример кода показан ниже.
Фигура 7: Сгенерированный код
Для получения информации об использовании Simulink.Variant
или Simulink.Parameter
объект или переменный MATLAB как переменная управления вариантом, см. Раздел «Подходы к определению элементов управления вариантом» в разделе «Введение в элементы управления вариантом».
Для получения дополнительной информации о генерации кода для вариантных подсистем см. документацию Embedded Coder.