Варианты подсистем

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

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

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

Чтобы программно управлять выбором варианта, a Simulink.Variant связывается с каждой дочерней подсистемой в диалоговом окне блока «Variant Subsystem». Simulink.Variant объекты создаются в базовом рабочем пространстве MATLAB ®. Эти объекты имеют свойство с именем Condition, которое является выражением, которое вычисляет логическое значение и используется для определения активной дочерней подсистемы варианта. Для примера, определения

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:

Фигура 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.

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

Фигура 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

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

Фигура 3: Симуляция с использованием Linear Controller вариант

Чтобы симулировать с использованием Nonlinear Controller, задайте

VSS_MODE=2

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

Фигура 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:

Фигура 5: Пример модели, sldemo_variant_subsystems_enum

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

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

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

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

  1. Цель Embedded Coder выбрана на панели Генерация кода (Code Generation) диалогового окна Параметры конфигурации (Configuration Parameters).

  2. В диалоговом окне параметра блока «Подсистема вариантов исполнения» не выбран вариант Переопределить условия и использование следующего варианта.

Когда генерация кода условий препроцессора активна, сгенерированный код содержит все дочерние подсистемы блоков Variant Subsystem, защищенных условиями препроцессора C. В этом случае выбор активных вариантов откладывается до времени компиляции сгенерированного кода. Только один объект варианта, закодированный в макросах C, должен иметь значение true (быть активным).

В сложение переменные управления вариантом (такие как VSS_MODE и VSSE_MODE выше) должны быть Simulink.Parameter объекты, которые определяют, как #defineдля переменных управления вариантом управляются в сгенерированном коде. Для sldemo_variant_subsystems, можно очистить VSS_MODE double из базового рабочего пространства. Использование 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.

См. также

| |

Похожие темы

Внешние веб-сайты