Подсистема, повторяющая выполнение на каждом элементе или подматрице входных сигналов или параметров маски и объединяющая результаты
Simulink/Порты и подсистемы
Кодер HDL/Порты и подсистемы
Блок For Each Subsystem является блоком Subsystem, предварительно сконфигурированным в качестве начальной точки для создания подсистемы, которая повторяет выполнение в течение временного шага моделирования каждого элемента или подрешетки входного сигнала или массива параметров маски.

Набор блоков в подсистеме представляет алгоритм, применяемый к одному элементу или подматрице исходного сигнала или массива параметров маски. Блок For Each в подсистеме позволяет сконфигурировать разложение входных данных подсистемы или параметров маски на элементы или подрешетки, а также сконфигурировать конкатенацию отдельных результатов в выходные сигналы. Параметры блока «Размер секции» и «Ширина секции» определяют размер, через который будет разделяться массив входных сигналов или параметров маски, и ширину каждого фрагмента соответственно. Для секционирования вектора строки задайте значение параметра «Размер секции» как 2. Для секционирования вектора столбца задайте значение параметра «Размер секционирования» как 1. Используйте параметр Смещение секции (Partition Offset), чтобы задать промежуток или перекрытие между секциями. Укажите число итераций, чтобы ограничить обработку подмножеством данных. Дополнительные сведения о параметрах блока см. в разделе Для каждого.
Внутри этой подсистемы каждый блок, имеющий состояния, поддерживает отдельные наборы состояний для каждого элемента или подчисток, которые он обрабатывает. Следовательно, работа этой подсистемы аналогична по поведению копированию содержимого подсистемы для каждого элемента в массиве исходных входных сигналов или параметров маски и последующей обработке каждого элемента с использованием его соответствующей копии подсистемы.
Для некоторых моделей блок «Для каждой подсистемы» также улучшает повторное использование кода в коде, сгенерированном Simulink ® Coder™. Рассмотрим модель, содержащую два повторно используемых блока атомной подсистемы с одинаковым скалярным алгоритмом, применяемым к каждому элементу сигнала. Если размеры входного сигнала этих подсистем различны, генерируемый Simulink Coder код включает в себя две различные функции. Эти две подсистемы можно заменить двумя идентичными блоками для каждой подсистемы, которые сконфигурированы для обработки каждого элемента их соответствующих входов с использованием одного и того же алгоритма. В этом случае сгенерированный код Simulink Coder состоит из одной функции, параметризованной количеством элементов входного сигнала. Эта функция вызывается дважды, один раз для каждого уникального экземпляра блока «Для каждой подсистемы» в модели. Для каждого из этих случаев элементы входного сигнала имеют различные значения.
При моделировании модели в режиме ускорителя Simulink использует многоядерное выполнение для более быстрого моделирования подсистем «Для каждой». Simulink автоматически настраивает каждую подходящую подсистему на первые два шага, которые она выполняет в режиме Rapid Accelerator для сравнения времени параллельного и последовательного выполнения. Затем Simulink назначает подсистему For Each для параллельного многоядерного выполнения на последующих временных этапах выполнения моделирования, если это ускорит время выполнения. Для вложенных подсистем «Для каждой» многоядерное выполнение применяется только к подсистеме верхнего уровня. Многоядерное выполнение не применяется к подсистемам For Each, содержащим непрерывные состояния или блоки вызывающего абонента функции.
Для подавления многоядерного выполнения для данной подсистемы For Each установите значение MultithreadedSim параметр блока For Each в подсистеме (а не сам блок For Each Subsystem) для 'off'.
set_param(ForEachBlockName,'MultithreadedSim','off')
Чтобы подавить многоядерное выполнение для всех подсистем Для каждой подсистемы в модели, задайте параметр конфигурации модели. MultithreadedSim кому 'off'.
set_param(ModelName,'MultithreadedSim','off')
Для повторного включения многоядерного выполнения установите соответствующий параметр. MultithreadedSim возвращают параметр к его значению по умолчанию 'auto'.
Пример см. в разделе Многопоточное моделирование с использованием каждой подсистемы.
Для Каждого блока Подсистемы поддерживает и S-функции C-MEX и S-функции Level 2 MATLAB®, при условии, что S-функция поддерживает случаи массовой казни, используя один из следующих методов:
S-функция C-MEX должна объявлять ssSupportsMultipleExecInstances(S, true) в mdlSetWorkWidths способ.
Level-2 S-функция MATLAB должна объявлять block.SupportsMultipleExecInstances = true в методе установки.
При использовании вышеуказанных спецификаций:
Не кэшируйте данные времени выполнения, такие как DWork и Block I/O, используя глобальные или постоянные переменные или в пользовательских данных S-функции.
В блоке для каждой подсистемы каждый метод выполнения S-функции из mdlStart до mdlTerminate вызывается один раз для каждого элемента, обрабатываемого S-функцией. Следовательно, необходимо быть осторожным, чтобы не освобождать одну и ту же память при повторных звонках в mdlTerminate. Например, рассмотрим S-функцию C-MEX, которая распределяет память для параметра времени выполнения в пределах mdlSetWorkWidths. Память нужно освободить только один раз в mdlTerminate. В качестве решения установите пустой указатель после первого вызова на mdlTerminate.
Блок «Для каждой подсистемы» имеет следующие ограничения и обходные пути.
| Ограничение | Работа |
|---|---|
Нельзя регистрировать сигналы шины или массива шин непосредственно в подсистеме For Each. | Используйте один из следующих подходов:
|
Невозможно зарегистрировать сигнал в ссылочной модели, которая находится в подсистеме Для каждого (For Each), если существует одно из следующих условий:
| Для первого условия используйте режим ускорителя. Для второго условия используйте режим Обычный (Normal) или Быстрый ускоритель (Rapid Accelerator). |
Нельзя регистрировать состояния блоков в подсистеме For Each. | Сохраните и восстановите состояние моделирования. |
Для моделирования блока модели в подсистеме «Для каждой» нельзя использовать обычный режим. | Используйте режим «Ускоритель» или «Ускоритель». |
Код многократного использования генерируется для двух подсистем для каждой с идентичным содержимым, если их входные и выходные сигналы являются векторами (1-D или 2-D вектор строки или столбца). Для n-D входных и выходных сигналов повторно используемый код генерируется только тогда, когда размер, вдоль которого разделен сигнал, является наибольшим размером. | Перестановка размеров сигнала для преобразования размера разбиения и размера конкатенации в самый высокий размер nonsingleton для n-D сигналов. |
Блок «Для каждой подсистемы» не поддерживает следующие функции:
Нельзя включать следующие блоки или S-функции в подсистему для каждой подсистемы:
Блоки записи памяти хранилища данных, чтения хранилища данных или хранилища данных
Блок «Из рабочей области», если вводом является Structure with Time которое имеет пустое поле времени
Блоки сохранения данных «В рабочую область» и «В файл»
Перейти к блокам и блокам из, пересекающим границу подсистемы
Ссылочная модель с режимом моделирования «Нормальный» (Normal)
Теневые входы
S-функции ERT
Для получения полного списка блоков, поддерживающих функцию «Для каждой подсистемы», введите showblockdatatypetable в командной строке MATLAB.
Нельзя использовать сигналы следующих типов:
Сигналы с внешним классом хранения внутри системы
Кадровые сигналы на входных и выходных границах подсистемы
Сигналы переменного размера
Создание точки линеаризации внутри подсистемы
Распространение флага якобиана для блоков внутри подсистемы. Проверить это условие в MATLAB можно с помощью J.Mi.BlockAnalyticFlags.jacobian, где J является якобинским объектом. Для проверки правильности Jacobian блока для каждой подсистемы:
Посмотрите на тег для каждой подсистемы Jacobian. Если это так “not_supported”, тогда якобиан неверен.
Переместите каждый блок из «Для каждой подсистемы» и рассчитайте его якобиан. Если какой-либо блок является «not_supported» или имеет предупреждающий тег, неправильный параметр Для каждой подсистемы Jacobian.
Невозможно выполнить следующие типы генерации кода:
Создание цели S-функции кодера Simulink
Создание кода Simulink Coder при обоих следующих условиях:
В подсистеме находится функциональный блок Stateflow ® или MATLAB.
Этот блок пытается получить доступ к глобальным данным вне подсистемы, таким как блоки памяти хранилища данных или Simulink.Signal объекты ExportedGlobal класс хранения.
Формирование кода ПЛК