Эта модель иллюстрирует подсистемы варианта Simulink®. Различные подсистемы позволяют вам обеспечить несколько реализаций для подсистемы, где только одна реализация активна в процессе моделирования. Можно программно выгрузить активную реализацию и заменить ее на одну из других реализаций, не изменяя модель.
Различный блок Subsystem содержит две или больше дочерних подсистемы, где один дочерний элемент активен во время выполнения модели. Активная дочерняя подсистема упоминается как активный вариант. Можно программно переключить активный вариант Различного блока Subsystem путем изменения значений переменных в базовом рабочем пространстве, или вручную переопределяющим различным выбором с помощью Различного диалогового окна блока Subsystem. Активный вариант программно соединен с блоками Inport и Outport Различной Подсистемы Simulink во время компиляции модели.
Программно управлять различным выбором, Simulink.Variant
объект сопоставлен с каждой дочерней подсистемой в Различном диалоговом окне блока Subsystem. Simulink.Variant
объекты создаются в базовом рабочем пространстве MATLAB®. Эти объекты имеют свойство под названием Condition
, который является выражением, которое оценивает к булеву значению и используется, чтобы определить активную различную дочернюю подсистему. Например, определение
VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');
в базовом рабочем пространстве создает Simulink.Variant
возразите где аргумент ('VSS_MODE==1')
конструктора задает, когда вариант активен. Используя Различное диалоговое окно Подсистемы, вы затем сопоставляете
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
. Это заполняет базовое рабочее пространство с переменными для Различного блока Subsystem под названием Контроллер:
Рисунок 1: модель в качестве примера, sldemo_variant_subsystems
Задавать Simulink.Variant
ассоциация объектов для Подсистемы контроллера, щелкните правой кнопкой по Подсистеме контроллера и выберите Subsystem Parameters
, который откроется, Подсистема контроллера блокируют диалоговое окно.
Диалоговое окно блока Подсистемы контроллера задает два потенциальных варианта. Эти два варианта в свою очередь сопоставлены с двумя Simulink.Variant
объекты VSS_LINEAR_CONTROLLER
и VSS_NONLINEAR_CONTROLLER
, которые существуют в базовом рабочем пространстве. Эти объекты имеют свойство под названием Условие, выражение, которое оценивает к булевской переменной и это определяет, какой вариант активен. Условие также показывают в Различном диалоговом окне блока Subsystem. В этом примере, свойствах Condition VSS_LINEAR_CONTROLLER
и VSS_NONLINEAR_CONTROLLER
VSS_MODE == 1
и VSS_MODE == 2
, соответственно. Переменная VSS_MODE
находится в базовом рабочем пространстве и может быть стандартная переменная MATLAB или Simulink.Parameter
.
Если нет никакого связанного различного объекта или '%' (комментарий) префиксы символа различный объект в Различном диалоговом окне параметров Подсистемы, то дочерняя подсистема рассматривается прокомментированной и не используется во время выполнения модели.
Рисунок 2: Содержимое блока Подсистемы контроллера
В Различном блоке Subsystem можно разместить Inport, Выходной порт и блоки Subsystem. В этом примере, Linear Controller
Блок Subsystem сопоставлен с различным объектом, VSS_LINEAR_CONTROLLER
, и Nonlinear Controller
Блок Subsystem сопоставлен с различным объектом, VSS_NONLINEAR_CONTROLLER
.
Связи сигнала не позволены в Различной Подсистеме. Simulink программно обеспечивает электричеством блоки Inport и Outport к активному варианту при симуляции модели.
Симулировать использование Linear Controller
вариант, задайте:
VSS_MODE=1
в базовом рабочем пространстве и затем симулируют модель.
Рисунок 3: Симуляция с помощью Linear Controller
вариант
Симулировать использование Nonlinear Controller
Define
VSS_MODE=2
в базовом рабочем пространстве и затем симулируют модель.
Рисунок 4: Симуляция с помощью Nonlinear Controller
вариант
sldemo_variant_subsystems_enum
модель иллюстрирует следующий Simulink.Variant
возможности:
1. Перечисления: классы перечисления MATLAB могут использоваться, чтобы улучшить удобочитаемость в условиях различного объекта.
2. Повторное использование: Simulink.Variant
объекты могут быть снова использованы в различных Различных блоках Subsystem.
Этот пример использует следующие переменные, которые заданы в базовом рабочем пространстве 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
Параметры условия, который улучшает удобочитаемость.
Три блока Подсистем Варианта фильтра, Filter1, Filter2 и Filter3 все использование VSSE_PROTOTYPE
и VSSE_PRODUCTION
Simulink.Variant
объекты.
Открытие модели sldemo_variant_subsystems_enum
в качестве примера запускает PreLoadFcn, заданный в
File -> ModelProperties -> Callbacks
. Это заполняет базовое рабочее пространство с переменными для Различных блоков Subsystem:
Рисунок 5: модель в качестве примера, sldemo_variant_subsystems_enum
Можно использовать Simulink® Coder™, чтобы сгенерировать код из модели, содержащей Различные блоки Subsystem. По умолчанию сгенерированный код содержит только активный вариант. В качестве альтернативы можно сгенерировать код для всех вариантов, которые охраняют условные выражения препроцессора C (#if
, #elif
, #endif
) при использовании Embedded Coder™.
Чтобы сгенерировать условные выражения препроцессора, типы блоков, которые можно поместить в дочерних подсистемах Различного блока Subsystem, ограничиваются. Во время процесса генерации кода один блок Merge помещается во вход каждого блока Outport в различной подсистеме и соединяется с дочерними подсистемами в различной подсистеме. Таким образом ограничения, установленные для блоков Слияния, применяются к содержимому Различных блоков Subsystem. Проверки ограничения только выполнены при генерации кода. Кроме того, дочерними подсистемами Различного блока Subsystem должны быть Атомарные подсистемы, которые создаются путем выбора Treat как атомарного модульного параметра диалогового окна параметров Подсистемы.
Генерация кода условных выражений препроцессора активна когда
Цель Embedded Coder является выбранным On панели Генерации кода диалогового окна Configuration Parameters.
Условиями варианта Override и использованием после варианта не является выбранный On Различного диалогового окна параметра блока Subsystem.
Когда генерация кода условных выражений препроцессора активна, сгенерированный код содержит все дочерние подсистемы Различных блоков Subsystem, защищенных условными выражениями препроцессора C. В этом случае выбор активных вариантов задерживается до времени компиляции сгенерированного кода. Только один различный объект, который закодирован в макросах C, должен оценить к истинному (быть активным).
Кроме того, различные контрольные переменные (такие как VSS_MODE
и VSSE_MODE
выше), должен быть Simulink.Parameter
объекты, которые задают как #define
поскольку различные контрольные переменные управляемы в сгенерированном коде. Для sldemo_variant_subsystems
, можно очистить VSS_MODE
дважды от базового рабочего пространства. Используйте Model Explorer -> Simulink Root -> Base Workspace
добавить новый Simulink.Parameter
названный VSS_MODE
. Задайте значение параметров как 1
или 2
, тип данных как int32
, и Класс памяти как ImportedDefine
с Заголовочным файлом Пользовательских атрибутов как sldemo_variant_subsystems_vdef.h
. Необходимо затем создать этот заголовок в текущей рабочей директории:
/* File: sldemo_variant_subsystems_vdef.h */ #ifndef SLDEMO_VARIANT_SUBSYSTEM_VDEF_H #define SLDEMO_VARIANT_SUBSYSTEM_VDEF_H #define VSS_MODE 1 #endif
См. документацию Embedded Coder для получения дополнительной информации о генерации кода для различных подсистем.