Различные подсистемы

Эта модель иллюстрирует подсистемы варианта 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 ControllerDefine

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 как атомарного модульного параметра диалогового окна параметров Подсистемы.

Генерация кода условных выражений препроцессора активна когда

  1. Цель Embedded Coder является выбранным On панели Генерации кода диалогового окна Configuration Parameters.

  2. Условиями варианта 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 для получения дополнительной информации о генерации кода для различных подсистем.