Блок logically executed subsystem запускается один или несколько раз в текущий временной шаг, когда включен control block. Блок управления реализует логику управления, подобную той, которая выражена оператором языка программирования (например, если-то, switch, while, for).
Подсистемы итератора являются одним из типов логически выполненных подсистем, которые выполняются один или несколько раз в течение временного шага в ответ на блок управления, внутренний блоку подсистемы.
Примечание
Блоки While Iterator Subsystem и For Iterator Subsystem не должны содержать блоки с непрерывными состояниями (для примера, блоки из Непрерывной библиотеки блоков). Шаги расчета всех блоков в подсистеме должны быть унаследованы (-1
) или постоянная (inf)
.
Блок While Iterator Subsystem является Subsystem блоком, предварительно сконфигурированным как начальная точка для создания подсистемы, которая повторяет выполнение во время временного шага симуляции, в то время как логическое (логическое) выражение имеет значение true.
Рассмотрим следующую модель. Чтобы открыть модель, смотрите ex_while_iterator_block
.
Входной вход 1
(true
) к блоку While Iterator активирует подсистему. На каждом временном шаге текущее итеративное число добавляется к бегущей сумме до достижения максимальной суммы.
Структура while в модели может быть представлена следующими псевдослучайными кодами.
maximum_sum = 10; sum = 0; iteration_number = 0 condition = (maximum_sum > 0) WHILE condition NOT EQUAL 0 iteration_number = iteration_number + 1 sum = sum + iteration_number IF (sum > maximum_sum OR iteration_number > maximum_iterations) THEN condition = 0 END WHILE
Чтобы создать модель примера, используйте следующую процедуру.
Поместите While Iterator Subsystem блок в Simulink® Редактор. Дважды кликните блок подсистемы, чтобы отобразить его содержимое.
Дважды кликните While Iterator блок, чтобы открыть диалоговое окно параметров блоков. Установите Maximum number of iterations равным 20
и States when starting к reset
. Установите флажок Show iteration number port.
Добавьте Memory, Relational Operator и Sum блоки. Соедините блоки как показано на рисунке. Для блока Memory установите флажок Inherit sample time.
Число итерации из выхода блока While Iterator складывается к его предыдущему значению до тех пор, пока сумма не станет больше или равной максимальной сумме из блока 1 Inport.
Перейдите к верхнему уровню модели.
Подключите блок Constant к входному порту 2. Этот блок предоставляет начальное логическое значение условия для блока While Iterator. Установите Constant value любое ненулевое число.
Блок While Iterator требует начального логического условия (маркированный входной порт IC
) для его первой итерации. Этот сигнал включает блок While Iterator Subsystem и должен исходить из-за пределов подсистемы. Если это значение ненулевое, происходит первая итерация.
Подключите блок Constant ко входному порту 1. Этот блок предоставляет максимальное значение для итерационного алгоритма. Алгоритм добавляет последующие целые числа до достижения максимального значения.
Соедините блок Display с выходным портом 1. Этот блок показывает количество итераций от выходного порта блока While Integrator.
Запустите симуляцию.
За один временной шаг первые четыре номера итерации складываются для общей суммы (10
). С пятой итерацией сумма (15
) больше максимальной суммы (10
), итерации прекращаются, и блок ожидает следующего временного шага.
Примечание
Время симуляции не продвигается во время итерационных выполнений блока While Iteration Subsystem. Тем не менее, блоки в подсистеме рассматривают каждую итерацию как временной шаг. В результате в While Iterator Subsystem блоке выход блока с состояниями (то есть блок, выход которого зависит от его предыдущего входа), отражает значение его входа при предыдущей итерации while
цикл. Этот выход не отражает вход блока на предыдущем временном шаге симуляции. Для примера блок Unit Delay в подсистеме While выводит значение своего входа при предыдущей итерации while
цикл, а не значение на предыдущем временном шаге симуляции.
Блок For Iterator Subsystem является блоком Subsystem, предварительно сконфигурированным как начальная точка для создания подсистемы, которая повторяет выполнение во время временного шага симуляции для заданного количества итераций.
Рассмотрим следующую модель. Чтобы открыть модель, смотрите ex_for_iterator_block
.
Вход в блок For Iterator задает количество итераций. На каждом временном шаге текущее итеративное число добавляется к текущей сумме для 5
итераций.
Структура for в модели может быть представлена следующими псевдослучайными кодами.
number_of_iterations = 5 sum = 0; iteration_number = 0 FOR iteration_number = 0 TO number_of_iterations iteration_number = iteration_number + 1 sum = sum + iteration_number END FOR
Чтобы создать модель примера, используйте следующую процедуру.
Поместите блок For Iterator Subsystem в Редактор Simulink. Дважды кликните блок подсистемы, чтобы отобразить его содержимое.
Дважды кликните For Iterator блок, чтобы открыть диалоговое окно параметров блоков. Установите States when starting значение reset
и Iteration limit source к external
.
Добавьте Memory, Sum и Outport блоки. Соедините блоки как показано на рисунке. Для блока Memory установите флажок Inherit sample time.
Число итерации из выхода блока For Iterator складывается к его предыдущему значению для заданного количества итераций из Inport блока 1.
Перейдите к верхнему уровню модели.
Соедините блок Constant с входным портом 1. Этот блок предоставляет количество итераций для блока For Iterator. Установите Constant value равным 5
.
Соедините Display блоки с выходными портами 1 и 2. Эти блоки показывают количество итераций от выходного порта For Integrator блока и сумму от блока Memory.
Запустите симуляцию.
В течение каждого временного шага первые пять чисел итерации складываются для общей суммы (15
).
Блок For Iterator хорошо работает с блоком Assignment, чтобы переназначить значения в векторе или матрице. В следующем примере показано использование блока For Iterator. Обратите внимание на матричные размерности в передающихся данных.
Пример выводит синусоидальное значение входной матрицы 2 на 5 (2 строки, 5 столбцов) с помощью подсистемы For, содержащей блок Assignment. Процесс следующий.
Матрица 2 на 5 введена в блок Selector и блок Assignment.
Блок Selector отделяет матрицу 2 на 1 от матрицы входа от значения столбца, обозначенного текущим значением итерации блока For Итератора.
Синус матрицы 2 на 1 взят.
Матрица значения 2 на 1 передается в блок Assignment.
Блок Assignment, который принимает исходную матрицу 2 на 5 в качестве одного из входов, присваивает матрицу 2 на 1 назад в исходную матрицу в местоположении столбца, обозначенном значением итерации.
Строки, заданные для переназначения в диалоговом окне параметра для блока Assignment в примере, являются [1,2]. Поскольку в исходной матрице только две строки, вы также могли задать -1 для строк (то есть все строки).
Примечание
Блок Тригонометрическая Функция уже способен взять синус матрицы. Пример использует блок Trigonometric Function только в качестве примера для изменения каждого элемента массива матрицы при совместной работе блока Assignment и блока For Iterator.