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

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

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

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

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

Примечание: можно задать различные средства управления в глобальной рабочей области MATLAB® или словаре данных.

Например, определение 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 под названием Контроллер:

open_system('sldemo_variant_subsystems')

Рисунок 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.

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

open_system('sldemo_variant_subsystems/Controller');

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

В Различном блоке Subsystem можно разместить Inport, Выходной порт и блоки Subsystem. В этом примере блок Subsystem Linear Controller сопоставлен с различным объектом, VSS_LINEAR_CONTROLLER, и блок Subsystem Nonlinear Controller сопоставлен с различным объектом, VSS_NONLINEAR_CONTROLLER.

Связи сигнала не позволены в Различной Подсистеме. Simulink программно обеспечивает электричеством блоки Inport и Outport к активному варианту при симуляции модели.

Переключение активных вариантов

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

VSS_MODE=1

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

open_system('sldemo_variant_subsystems/Controller','parameter');
close_system('sldemo_variant_subsystems/Controller')
VSS_MODE=1; %#ok (used by sldemo_variant_subsystems)
sim sldemo_variant_subsystems;

Рисунок 3: Симуляция с помощью варианта Linear Controller

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

VSS_MODE=2

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

VSS_MODE=2; %#ok (used by sldemo_variant_subsystems)
sim sldemo_variant_subsystems;

Рисунок 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:

open_system('sldemo_variant_subsystems_enum')

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

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

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

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

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

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

  2. Условия варианта Переопределения и использование после варианта не выбраны на Различном диалоговом окне параметра блока Subsystem.

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

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

Для просмотра документации необходимо авторизоваться на сайте