Эта модель иллюстрирует подсистемы варианта 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. В этом примере блок Subsystem Linear Controller
сопоставлен с различным объектом, VSS_LINEAR_CONTROLLER
, и блок Subsystem Nonlinear Controller
сопоставлен с различным объектом, VSS_NONLINEAR_CONTROLLER
.
Связи сигнала не позволены в Различной Подсистеме. Simulink программно обеспечивает электричеством блоки Inport и Outport к активному варианту при симуляции модели.
Чтобы моделировать использование варианта Linear Controller
, задайте:
VSS_MODE=1
в базовом рабочем пространстве и затем моделируют модель.
Рисунок 3: Симуляция с помощью варианта Linear Controller
Чтобы моделировать использование Nonlinear Controller
, задать
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 выбрана на панели Генерации кода диалогового окна Configuration Parameters.
Условия варианта Переопределения и использование после варианта не выбраны на Различном диалоговом окне параметра блока 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 для получения дополнительной информации о генерации кода для различных подсистем.