Подсистема, которая повторяет выполнение на каждом элементе или подрешетке входных сигналов или параметров маски и конкатенирует результаты
Simulink/Порты и подсистемы
HDL-кодер/порты и подсистемы
Блок 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.
Блок 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. | Используйте один из следующих подходов:
|
Вы не можете зарегистрировать сигнал внутри ссылочной модели, который находится внутри подсистемы For Each, если существует одно из следующих условий:
| Для первого условия используйте режим 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
класс памяти.
Генерация кода ПЛК
Типы данных |
|
Прямое сквозное соединение |
|
Многомерные сигналы |
|
Сигналы переменного размера |
|
Обнаружение пересечения нулем |
|
[a] Фактический тип данных или поддержка возможностей зависит от реализации блоков. |