Подсистема потока управления выполняет один или несколько раз в текущий временной шаг, когда активируется блоком потока управления. Блок потока управления реализует логику управления, подобную той, которая выражена операторами потока управления языков программирования (например if-then
, while-do
, switch
, и for
).
Можно использовать блоки для моделирования логики потока управления, эквивалентной следующим операторам языка программирования на C:
for
if-else
switch
while
Можно использовать следующие блоки для выполнения условной логики потока управления.
Оператор C | Эквивалентные блоки |
---|---|
| |
|
Следующая схема представляет if-else
управляйте потоком.
Создайте if-else
управляйте блок-схемой следующим образом:
Предоставьте входы данных блоку If для построения условий if-else.
В диалоговом окне If параметры блоков установите входы в блок If. Внутренне входы обозначаются как u1, u2,..., un
и используются для построения выходных условий.
В диалоговом окне If параметров блоков установите выходной порт if-else условий для блока If.
В диалоговом окне If параметры блоков установите Output ports. Используйте входные значения u1, u2, ..., un
для выражения условий для полей условий if, elseif и other в диалоговом окне. Из них требуется только поле if. Можно ввести несколько условий elseif и установить флажок, чтобы включить условие else.
Соедините каждый выходной порт условия с подсистемой Action.
Соедините каждый выходной порт if, elseif и другое условие блока If с подсистемой, которая будет выполнена, если случай порта равен true.
Создайте эти подсистемы путем размещения блока Action Port в подсистеме. Это создает атомарную подсистему Action с портом Action, который затем соединяется с условием на блоке If.
После подключения подсистема принимает тождества условия, к которому она подключена, и ведет себя как включенная подсистема.
Для получения дополнительной информации смотрите блоки If и Action Port.
Примечание
Все блоки в подсистеме Action, управляемые блоком If или Switch Case, должны запускаться с той же скоростью, что и ведущий блок.
Следующая схема представляет switch
управляйте потоком.
Создайте switch
управляйте оператором потока следующим образом:
Предоставьте вход данных для аргумента блока Switch Case.
Вход в блок Switch Case является аргументом в switch
управляйте оператором потока. Это значение определяет соответствующий случай для выполнения. Нецелочисленные входы этого порта усечены.
Добавьте случаи к блоку Switch Case на основе числового значения входного параметра аргумента.
Используя диалоговое окно параметров блока Switch Case, добавьте кейсы к блоку Switch Case. Случаи могут быть одинарными или многозначными. Можно также добавить необязательный случай по умолчанию, который равен true, если никакие другие случаи не имеют значения true. После добавления эти случаи появляются как выходные порты на блоке Switch Case.
Соедините каждый выходной порт блока Switch Case с подсистемой Action.
Каждый выход случая блока Switch Case соединяется с подсистемой, которая должна выполняться, если случай порта равен true. Эти подсистемы создаются путем размещения блока Action Port в подсистеме. Это создает атомарную подсистему с портом Action, который затем соединяется с условием на блоке Switch Case. После подключения подсистема принимает тождества условия и ведет себя как включенная подсистема. Поместите все блоки, выполненные для этого случая, в эту подсистему.
Для получения дополнительной информации см. документацию по блокам Switch Case и Action Port.
Примечание
После выполнения подсистемы для конкретной ситуации выполняется подразумеваемый пропуск, который выходит из switch
управляйте оператором потока в целом. Simulink®
switch
реализации оператора потока управления не показывают «сквозное» поведение C switch
операторы.
Используйте следующие блоки для выполнения while
и for
циклы.
Оператор C | Эквивалентные блоки |
---|---|
| |
| |
|
Следующая схема иллюстрирует while
цикл.
В этом примере Simulink неоднократно выполняет содержимое подсистемы While на каждом временном шаге, пока не будет удовлетворено условие, заданное блоком Итератор. В частности, для каждой итерации цикла, заданного блоком Итератор, Simulink вызывает методы обновления и выхода всех блоков в подсистеме While в том же порядке, в котором методы были бы активированы, если бы они находились в неуправляемой атомарной подсистеме.
Примечание
Время симуляции не продвигается во время выполнения итераций подсистемы While. Тем не менее, блоки в подсистеме While рассматривают каждую итерацию как временной шаг. В результате в подсистеме While выход блока с состояниями (то есть блок, выход которого зависит от его предыдущего входа), отражает значение его входа при предыдущей итерации while
цикл. Этот выход не отражает вход этого блока на предыдущем временном шаге симуляции. Для примера блок Unit Delay в подсистеме While выводит значение своего входа при предыдущей итерации while
цикл, а не значение на предыдущем временном шаге симуляции.
Создайте while
цикл следующим образом:
Поместите блок Итератор в подсистему.
Метка подсистемы хоста изменяется на while {...}
, чтобы указать, что это моделирование цикла while. Эти подсистемы ведут себя как триггируемые подсистемы. Эта подсистема является хостом блочного программирования, которое вы хотите итератировать с помощью блока While Iterator.
Предоставьте вход данных для входного порта данных начальных условий блока Итератор.
Блок Итератор требует входных данных начальных условий (маркированных IC
) для его первой итерации. Это должно происходить вне подсистемы While. Если это значение ненулевое, происходит первая итерация.
Предоставьте входы для порта условий блока While Iterator.
Условия для остальных итераций передаются к указанному входному порту данных cond
. Вход для этого порта должен начинаться внутри подсистемы While.
(Необязательно) Установите блок While Iterator, чтобы вывести его значение итератора в диалоговом окне свойств.
Значение итератора является 1 для первой итерации и увеличивается на 1 для каждой последующей итерации.
(Необязательно) Измените итерацию блока Итератор на do-while
через диалоговое окно его свойств.
Это меняет метку подсистемы хоста на do {...} while
. С do-while
итерация, блок While Iteration больше не имеет порта начального условия (IC), потому что все блоки подсистемы выполняются один раз перед портом условия (маркирован cond
) проверяется.
Создайте в подсистеме блока схему, которая определяет выходы подсистемы.
Примечание
Схема не должна содержать блоки с непрерывными состояниями (для примера, блоки из Непрерывной библиотеки блоков). Шаги расчета всех блоков должны быть унаследованы (-1
) или постоянная (inf)
.
Для получения дополнительной информации см. While Iterator блок.
Следующая схема представляет for
цикл:
В этом примере Simulink выполняет содержимое подсистемы For, умноженное на каждый временной шаг. Вход в блок For Iterator задает количество итераций. Для каждой итерации for
цикл, Simulink вызывает методы обновления и выхода всех блоков в подсистеме For в том же порядке, в котором он вызывает методы, если они находятся в неуправляемой атомарной подсистеме.
Примечание
Время симуляции не продвигается во время выполнения итераций For подсистемы. Тем не менее, блоки в подсистеме For рассматривают каждую итерацию как временной шаг. В результате в подсистеме For выход блока с состояниями (то есть блок, выход которого зависит от его предыдущего входа) отражает значение его входа при предыдущей итерации for
цикл. Этот выход не отражает вход этого блока на предыдущем временном шаге симуляции. Для примера блок Unit Delay в подсистеме For выводит значение своего входа при предыдущей итерации for
цикл, а не значение на предыдущем временном шаге симуляции.
Создайте for
цикл следующим образом:
Перетащите блок Подсистема для итератора из браузера библиотеки или окна библиотеки в модель.
(Необязательно) Установите блок For Iterator, чтобы взять внешний или внутренний вход для количества итераций, которые он выполняет.
Через диалоговое окно свойств блока For Iterator можно задать для него вход для количества итераций через порт, маркированный N
. Этот вход должен поступать вне Подсистемы For Iterator.
Можно также задать количество итераций непосредственно в диалоговом окне свойств.
(Необязательно) Установите блок For Iterator, чтобы вывести его значение итератора для использования в блочном программировании Подсистемы For Iterator.
Значение итератора является 1 для первой итерации и увеличивается на 1 для каждой последующей итерации.
Создайте в подсистеме блока схему, которая определяет выходы подсистемы.
Примечание
Схема не должна содержать блоки с непрерывными состояниями (для примера, блоки из Непрерывной библиотеки блоков). Шаги расчета всех блоков должны быть унаследованы (-1
) или постоянная (inf)
.
Блок 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.
Assignment | For Iterator | For Iterator Subsystem | While Iterator | While Iterator Subsystem | While Iterator Subsystem