For Each Subsystem

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

  • Библиотека:
  • Simulink/Порты и подсистемы

    HDL-кодер/порты и подсистемы

  • For Each Subsystem block

Описание

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

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

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

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

Поддержка многоядерного выполнения

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

Чтобы подавить многоядерное выполнение для заданной подсистемы For Each, установите MultithreadedSim параметр блока For Each в подсистеме (не сам блок For Each Subsystem), чтобы 'off'.

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

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

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

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

Для получения примера смотрите Многопоточные Симуляции, использующие For Each Subsystem.

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

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

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

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

Если вы используете вышеописанные спецификации:

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

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

Ограничения

Блок For Each Subsystem имеет следующие ограничения и обходные пути.

ОграничениеРабота

Вы не можете логгировать шину или массив шинных сигналов непосредственно в подсистеме For Each.

Используйте один из следующих подходов:

  • Используйте блок Bus Selector, чтобы выбрать сигналы, которые вы хотите записать и отметить эти сигналы для логгирования сигналов.

  • Присоедините сигнал к блоку Outport и зарегистрируйте сигнал вне подсистемы For Each.

Вы не можете зарегистрировать сигнал внутри ссылочной модели, который находится внутри подсистемы For Each, если существует одно из следующих условий:

  • Подсистема For Each находится в модели, симулирующей в режиме Rapid Accelerator.

  • Сама подсистема For Each находится в модели, на которую ссылается блок Model в режиме Accelerator.

Для первого условия используйте режим Accelerator.

Для второго условия используйте режим Normal или Rapid Accelerator.

Вы не можете регистрировать состояния блоков в подсистеме For Each.

Сохраните и восстановите состояние симуляции.

Вы не можете использовать Режим normal mode, чтобы симулировать блок Model внутри подсистемы For Each.

Используйте режим Accelerator или Rapid Accelerator.

Переиспользуемый код генерируется для двух For Each Subsystems с идентичным содержимым, если их вход и выходные сигналы являются векторами (1-D или 2-D строки или вектор-столбец). Для n-D входных и выходных сигналов переиспользуемый код генерируется только, когда величина, по которой распределяется сигнал, является самой высокой размерностью.

Передайте размерности сигнала, чтобы преобразовать размерность разбиения и размерность конкатенации в самую высокую размерность несинглтона для сигналов n-D.

Блок For Each Subsystem не поддерживает следующие функции:

  • Вы не можете включать эти блоки или S-функции в Подсистему For Each:

    • Data Store Memory, Data Store Read или Data Store Write блоки

    • Блок From Workspace, если вход Structure with Time который имеет пустое поле времени

    • Блоки To Workspace и To File сохранения данных

    • Goto и From блоки, которые пересекают контур подсистемы

    • Ссылка на модель с установленным режимом симуляции Normal

    • Теневые входные порты

    • ERT S-функции

    Полный список блоков, поддерживающих Каждую Подсистему, можно ввести showblockdatatypetable в командной строке MATLAB.

  • Вы не можете использовать следующие типы сигналов:

    • Сигналы с внешнего класса памяти в системе

    • Кадровые сигналы на входных и выходных контурах подсистемы

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

  • Создание точки линеаризации внутри подсистемы

  • Распространение якобианского флага для блоков внутри подсистемы. Это условие можно проверить в MATLAB с помощью J.Mi.BlockAnalyticFlags.jacobian, где J - якобианский объект. Чтобы проверить правильность якобиана блока For Each Subsystem:

    • Посмотрите на тег For Each Subsystem Jacobian. Если это “not_supported”, тогда якобиан неправильен.

    • Уведите каждый блок из For Each Subsystem и вычислите его якобиан. Если какой-либо блок является «not_supported» или имеет предупреждающий тег, то значение For Each Subsystem Jacobian неверно.

  • Вы не можете выполнить следующие типы генерации кода:

    • Генерация цели S-функции Simulink Coder

    • Генерация кода Simulink Coder при обоих следующих условиях:

      • Stateflow® или MATLAB Function блок находится в подсистеме.

      • Этот блок пытается получить доступ к глобальным данным за пределами подсистемы, таким как блоки памяти хранилища данных или Simulink.Signal объекты ExportedGlobal класс памяти.

    • Генерация кода ПЛК

Порты

Вход

расширить все

Сигнал, входящий в блок 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

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

Temperature Control System Communicating with Messages

Система регулирования температуры, связывающаяся с сообщениями

Используйте передачу сообщений в распределенной системе, где контроллер управляет несколькими входящими сообщениями от различных отправителей итеративным способом и отправляет сообщения для передачи команд различным приемникам. В примере используется модель системы управления, управляющей температурами в двух разных помещениях с отдельными термостатами. Алгоритмическое моделирование компонентов в основном следует примеру Stateflow Model Bang-Bang Temperature Control System (Stateflow), в то время как связь между компонентами моделируется с помощью сообщений Simulink ® и блоков SimEvents ®. Модели Controller и Thermometer, окрашенные в синий цвет, являются компонентами программного обеспечения, которые, как ожидается, сгенерируют автономный код, в то время как другие компоненты моделируют окружение.

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

Типы данных

Булев[a] | шина[a] | double[a] | перечисленные[a] | фиксированную точку[a] | половину[a] | целое число[a] | сингл[a]

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

no

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

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

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

no

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

no

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

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

.
Введенный в R2010a