For Each Subsystem

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

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

    HDL Coder / Ports & Subsystems

  • 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 в модели. Для каждого из этих случаев элементы входного сигнала имеют различные значения.

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

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

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

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

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

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

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

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

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

Блок For Each Subsystem поддерживает и S-функции C-MEX и S-функции Level 2 MATLAB®, при условии, что 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 имеет нижеследующие ограничения и обходные решения.

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

Вы не можете регистрировать шину, или массив шины сигнализирует непосредственно в Для Каждой подсистемы.

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

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

  • Присоедините сигнал к блоку Outport и регистрируйте сигнал вне Для Каждой подсистемы.

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

  • Для Каждой подсистемы находится в симуляции модели в Быстром Режиме Accelerator.

  • Для Каждой подсистемы самой находится в модели, на которую ссылается блок Model в Режиме Accelerator.

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

Для второго условия используйте Нормальный или Быстрый Режим Accelerator.

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

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

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

Используйте Акселератор или Быстрый Режим Accelerator.

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

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

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

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

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

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

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

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

    • Модель, на которую ссылаются, с набором режима симуляции к Нормальному

    • Теневой Inports

    • S-функции ERT

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

  • Вы не можете использовать эти типы сигналов:

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

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

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

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

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

    • Посмотрите на тег Для Каждого якобиана Подсистемы. Если это - “not_supported”, затем якобиан является неправильным.

    • Переместите каждый блок из For Each Subsystem и вычислите его якобиан. Если какой-либо блок является "not_supported" или имеет тег предупреждения, Для Каждого якобиана Подсистемы является неправильным.

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

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

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

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

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

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

Порты

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

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

Вход сигнала к блоку 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 в качестве примера (Stateflow), в то время как связь между компонентами моделируется с помощью сообщений Simulink® и блоков SimEvents®. Модели Controller и Thermometer, на которые ссылаются, раскрашенные синий, являются компонентами программного обеспечения, которые, как ожидают, сгенерируют автономный код, в то время как другие компоненты моделируют среду.

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

Типы данных

Boolean[a] | bus[a] | double[a] | enumerated[a] | fixed point[a] | half[a] | integer[a] | single[a]

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

no

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

limited[a]

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

no

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

no

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

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

Введен в R2010a