For Each Subsystem

Примените алгоритм к отдельным элементам или подрешеткам параметров маски или входных сигналов

  • Библиотека:
  • Simulink / Ports & Subsystems

    HDL Coder / Ports & Subsystems

  • For Each Subsystem block

Описание

Блок For Each Subsystem является блоком Subsystem, предварительно сконфигурированным как начальная точка для создания подсистемы, которая повторяет выполнение во время шага времени симуляции на каждом элементе или подрешетке массива параметров маски или входного сигнала.

For Each Subsystem block icon, displayed alongside contents of For Each subsystem, consisting of a For Each block, an Inport block, and an Outport block.

Набор блоков в подсистеме представляет алгоритм, применился к одному элементу или подрешетке исходного сигнала или массива параметров маски. В подсистеме каждый блок, который имеет состояния, обеспечивает отдельные наборы состояний для каждого элемента или подрешетки, которую это обрабатывает. Следовательно, операция этой подсистемы похожа в поведении на копирование содержимого подсистемы для каждого элемента в исходном входном сигнале или массиве параметров маски и затем обработке каждого элемента с помощью его соответствующей копии подсистемы. Когда набор блоков в подсистеме обрабатывает элементы или подрешетки, подсистема конкатенирует результаты сформировать выходные сигналы.

Конфигурирование подсистемы

Блок For Each Subsystem содержит блок For Each, который действует как блок управления для подсистемы. Задайте параметры блока For Each, чтобы сконфигурировать разложение входных параметров подсистемы или параметров маски в элементы или подрешетки и сконфигурировать конкатенацию отдельных результатов в выходные сигналы. Partition Dimension параметров блоков и Partition Width задают размерность, через которую можно нарезать входной сигнал или массив параметров маски и ширину каждого среза, соответственно. Чтобы разделить вектор-строку, задайте Partition Dimension как 2. Чтобы разделить вектор-столбец, задайте Partition Dimension как 1. Используйте параметр Partition Offset, чтобы задать разрыв или перекрытие между разделами. Задайте Number of iterations, чтобы ограничить обработку подмножеством данных. Чтобы узнать больше о параметрах блоков, смотрите For Each.

Входные сигналы раздела к подсистеме

Чтобы задать который входные сигналы к разделу для каждой итерации в Для Каждой подсистемы, используйте вкладку Input Partition в диалоговом окне блока For Each. При определении сигнала, который будет разделен, задайте Partition Dimension, Partition Width и параметры Partition Offset.

Параметры маски раздела подсистемы

Можно разделить параметры маски блока For Each Subsystem. Разделение полезно для систем, которые имеют идентичные структуры в каждой итерации, но различных значениях параметров. В этом случае изменение модели, чтобы разделить дополнительные входные сигналы для каждого параметра является громоздким. Вместо этого добавьте параметр маски в Для Каждой подсистемы. Для получения дополнительной информации смотрите, Создают Простую Маску. Чтобы выбрать параметр маски для разделения, используйте вкладку Parameter Partition диалогового окна блока For Each. Для получения дополнительной информации смотрите, Выбирают Partition Parameters, ниже.

Конкатенация Выхода

Задайте размерность, по которой можно конкатенировать результаты путем определения Concatenation Dimension во вкладке Output Concatenation.

Результаты, сгенерированные блоком для каждой подрешетки, сложены по измерению конкатенации. По умолчанию размерность 1 (y - ось) используется, означая, что результаты сложены вертикально. Однако, если вы задаете размерность конкатенации 2, результаты конкатенируют вдоль горизонтального направления (x - ось). Таким образом, если процесс генерирует векторы-строки, то конкатенированным результатом является матрица в первом случае и вектор-строка во втором случае.

Выберите Partition Parameters

При выборе входного сигнала или параметра маски подсистемы для разделения, необходимо задать, как разложить его на элементы или подрешетки для каждой итерации. Установите целочисленные значения для Partition Dimension, Partition Width и параметров Partition Offset.

Как рисунок, считайте матрицу входного сигнала A из формы:

A 3-by-3 matrix A with all nine elements displayed, showing d1 as the vertical dimension and d2 as the horizontal dimension

Маркирует d 1, и d 2 задают размерности 1 и 2, соответственно. Если вы сохраняете настройку по умолчанию 1 и для размерности раздела и для ширины раздела и 0 для смещения раздела, затем Simulink® перпендикуляр срезов, чтобы разделить размерность 1 в ширине равняется ширине раздела, которая является одним элементом:

A 3-by-3 matrix A, with all nine elements showing, partitioned into rows

Матрица А разлагается в эти три вектора-строки:

A 3-by-3 matrix A, decomposed into three 3-element row vectors

Если вы задаете 2 как размерность раздела вместо этого, перпендикуляр срезов Simulink, чтобы определить размеры 2, чтобы сформировать три вектор-столбца:

A 3-by-3 matrix A, decomposed into three 3-element column vectors

В дополнение к установке Partition Dimension к 2, если вы устанавливаете Partition Width на 2 и Partition Offset к -1, Simulink использует два наложения 3 2 разделы для обработки.

A 3-by-3 matrix A, decomposed into two overlapping 3-by-2 matrices

Для примера с помощью параметра Partition Offset откройте модель slexForEachOverlapExample.

По умолчанию все разделы входного сигнала или параметра маски обрабатываются. Чтобы обработать подмножество разделов, введите номер разделов к процессу как Number of iterations. В матричных примерах выше, если Partition Offset установлен в 0 (значение по умолчанию), и Number of iterations установлен в 2, только первые 2 строки или столбцы входной матрицы A обрабатываются.

Примечание

Только сигналы рассматриваются одномерными в Simulink. Параметры маски являются строкой или вектор-столбцами, согласно их ориентации. Чтобы разделить вектор-строку, задайте размерность раздела как 2 вдоль столбцов. Чтобы разделить вектор-столбец, задайте размерность раздела как 1 вдоль строк.

Поддержка повторного использования кода

Для определенных моделей блок For Each Subsystem улучшает повторное использование кода в сгенерированном коде Simulink Coder™. Полагайте, что модель, содержащая два допускающих повторное использование блока Atomic Subsystem с тем же скалярным алгоритмом, применилась к каждому элементу сигнала. Если размерности входного сигнала этих подсистем отличаются, сгенерированный код Simulink Coder включает две отличных функции. Можно заменить эти две подсистемы на два идентичных блока For Each Subsystem, которые сконфигурированы, чтобы обработать каждый элемент их соответствующих входных параметров с помощью того же алгоритма. В этом случае сгенерированный код Simulink Coder состоит из одной функции, параметрированной количеством элементов входного сигнала. Эта функция вызывается дважды, однажды для каждого уникального экземпляра блока For Each Subsystem в модели. Для каждого из этих случаев элементы входного сигнала имеют различные значения.

Многожильная поддержка выполнения

Когда вы симулируете свою модель в быстром режиме Accelerator, Simulink использует многожильное выполнение для более быстрой симуляции Для Каждого подсистемы. Simulink автоматически профилирует каждого имеющего право На Каждую подсистему первые два временных шага, которые это запускает в быстром режиме Accelerator, чтобы сравнить параллельные и последовательные времена выполнения. Simulink затем определяет Для Каждой подсистемы для параллельного, многожильного выполнения в последующих временных шагах симуляции запущенный, если выполнение так ускорило бы время выполнения. Для вложенного Для Каждого подсистемы многожильное выполнение применяется только к подсистеме верхнего уровня. Многожильное выполнение не применяется За Каждого к подсистемам, содержащим непрерывные состояния или блоки Function Caller.

Чтобы подавить многожильное выполнение для данного Для Каждой подсистемы, установите MultithreadedSim параметр блока For Each в подсистеме к 'off'.

set_param(ForEachBlockName,'MultithreadedSim','off')

Обратите внимание на то, что это - параметр блока For Each в подсистеме, не самого блока For Each Subsystem. Чтобы подавить многожильное выполнение для всех Для Каждого подсистемы в модели, установите MultithreadedSim параметр модели к 'off'.

set_param(ModelName,'MultithreadedSim','off')

Чтобы повторно включить многожильное выполнение, установите соответствующий MultithreadedSim параметр к его значению по умолчанию 'auto'.

Для примера смотрите, что Многопоточная Симуляция использует Для Каждой Подсистемы.

Примечание

Если вы симулируете свою модель в быстром режиме Accelerator или генерируете код из вашей модели, и вы делите параметры маски в Для Каждой подсистемы, то любое выражение в Для Каждой подсистемы, которая ссылается на разделенный параметр, должно быть настраиваемым выражением. Смотрите Настраиваемые Ограничения Выражения (Simulink Coder).

Поддержка S-функции

Блок For Each Subsystem поддерживает и S-функции C-MEX и Уровень 2 MATLAB® S-функции, при условии, что S-функция поддерживает несколько экземпляров выполнения с помощью одного из этих методов:

  • S-функция C-MEX должна объявить ssSupportsMultipleExecInstances(S, true) в mdlSetWorkWidths метод.

  • Уровень 2 S-функция MATLAB должен объявить block.SupportsMultipleExecInstances = true в методе настройки.

Если вы используете эти технические требования:

  • Не кэшируйте данные во время выполнения, такие как DWork и ввод-вывод Блока с помощью глобальных или персистентных переменных или в пользовательских данных S-функции.

  • В блоке For Each Subsystem, каждом методе выполнения S-функции от mdlStart до mdlTerminate называется однажды для каждого элемента, обработанного S-функцией. Следовательно, необходимо убедиться, что не освободили ту же память на повторных вызовах mdlTerminate. Например, рассмотрите S-функцию C-MEX, которая выделяет память для параметра периода выполнения в mdlSetWorkWidths. Память только должна быть освобождена однажды в mdlTerminate. Как решение, набор указатель, чтобы быть пустым после первого вызова mdlTerminate.

Ограничения

Для получения информации относительно ограничений блока For Each Subsystem, смотрите Ограничения Для Каждой Подсистемы.

Порты

Входной параметр

развернуть все

Вход сигнала с блоком Subsystem в виде скаляра, вектора или матрицы. Размещение блока Inport в блоке Subsystem добавляет внешний входной порт в блок. Метка порта совпадает с именем блока Inport.

Используйте блоки Inport, чтобы получить сигналы от окружения.

Типы данных: half | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus

Вывод

развернуть все

Выход сигнала от блока Subsystem, возвращенного как скаляр, вектор или матрица. Размещение блока Outport в блоке Subsystem добавляет внешний выходной порт в блок. Метка порта совпадает с именем блока Outport.

Используйте блоки Outport, чтобы отправить сигналы в окружение.

Типы данных: half | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus

Примеры модели

Характеристики блока

Типы данных

Boolean[a] | шина[a] | дважды[a] | перечислимый[a] | фиксированная точка[a] | половина[a] | целое число[a] | один[a]

Прямое сквозное соединение

no

Многомерные сигналы

ограниченный[a]

Сигналы переменного размера

no

Обнаружение пересечения нулем

no

[a] Фактическая поддержка типа данных или возможности зависит от реализации блока.

Расширенные возможности

Введен в R2010a