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

Эта модель иллюстрирует подсистемы варианта Simulink®. Различные подсистемы позволяют вам обеспечить несколько реализаций для подсистемы, где только одна реализация активна во время моделирования. Можно программно выгрузить активную реализацию и заменить ее на одну из других реализаций, не изменяя модель.

Обзор различных подсистем

Блок Variant Subsystem содержит две или больше дочерних подсистемы, где один дочерний элемент активен во время образцового выполнения. Активная дочерняя подсистема упоминается как активный вариант. Можно программно переключить активный вариант блока Variant Subsystem путем изменения значений переменных в базовом рабочем пространстве, или вручную переопределяющим различным выбором с помощью диалогового окна блока Variant Subsystem. Активный вариант программно соединен проводом к блокам Inport и Outport Различной Подсистемы Simulink во время образцовой компиляции.

Чтобы программно управлять различным выбором, объект Simulink.Variant сопоставлен с каждой дочерней подсистемой в диалоговом окне блока 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. Это заполняет базовое рабочее пространство с переменными для блока Variant Subsystem под названием Контроллер:

Рисунок 1: модель в качестве примера, sldemo_variant_subsystems

Чтобы задать ассоциацию объектов Simulink.Variant для Подсистемы контроллера, щелкните правой кнопкой по Подсистеме контроллера и выберите Subsystem Parameters, который откроется, Подсистема контроллера блокируют диалоговое окно.

Блочное диалоговое окно Подсистемы контроллера задает два потенциальных варианта. Эти два варианта в свою очередь сопоставлены с двумя объектами Simulink.Variant VSS_LINEAR_CONTROLLER и VSS_NONLINEAR_CONTROLLER, которые существуют в базовом рабочем пространстве. Эти объекты имеют свойство под названием Условие, выражение, которое оценивает к булевской переменной и это определяет, какой вариант активен. Условие также показывают в диалоговом окне блока Variant Subsystem. В этом примере свойствами Condition VSS_LINEAR_CONTROLLER и VSS_NONLINEAR_CONTROLLER является VSS_MODE == 1 и VSS_MODE == 2, соответственно. Переменный VSS_MODE находится в базовом рабочем пространстве и может быть стандартной переменной MATLAB или Simulink.Parameter.

Если нет никакого связанного различного объекта или '%' (комментарий) префиксы символа различный объект в Различном диалоговом окне параметров Подсистемы, то дочерняя подсистема рассматривается прокомментированной и не используется во время образцового выполнения.

Рисунок 2: Содержимое блока Подсистемы контроллера

В блоке Variant Subsystem можно разместить Inport, Выходной порт и блоки Подсистемы. В этом примере блок 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, задать

VSS_MODE=2

в базовом рабочем пространстве и затем моделируют модель.

Рисунок 4: Моделирование с помощью варианта Nonlinear Controller

Перечисления и повторное использование

Модель 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, который улучшает удобочитаемость.

Три блока Подсистем Варианта фильтра, Filter1, Filter2 и Filter3 все использование VSSE_PROTOTYPE и VSSE_PRODUCTION объекты Simulink.Variant.

При открытии модели в качестве примера sldemo_variant_subsystems_enum запускает PreLoadFcn, заданный в File -> ModelProperties -> Callbacks. Это заполняет базовое рабочее пространство с переменными для Различных блоков Подсистемы:

Рисунок 5: модель в качестве примера, sldemo_variant_subsystems_enum

Генерация кода

Можно использовать Simulink® Coder™, чтобы сгенерировать код от модели, содержащей Различные блоки Подсистемы. По умолчанию сгенерированный код содержит только активный вариант. Также можно сгенерировать код для всех вариантов, которые охраняют условные выражения препроцессора C (#if, #elif, #endif) при использовании Embedded Coder™.

Чтобы сгенерировать условные выражения препроцессора, типы блоков, которые можно поместить в дочерних подсистемах блока Variant Subsystem, ограничиваются. Во время процесса генерации кода один блок Merge помещается во входной параметр каждого блока Outport в различной подсистеме и соединяется с дочерними подсистемами в различной подсистеме. Таким образом ограничения, установленные для блоков Слияния, применяются к содержимому Различных блоков Подсистемы. Проверки ограничения только выполнены при генерации кода. Кроме того, дочерними подсистемами блока Variant Subsystem должны быть Атомарные подсистемы, которые создаются путем выбора Treat как атомарного модульного параметра диалогового окна параметров Подсистемы.

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

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

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

Была ли эта тема полезной?