Конечные автоматы
Потоковые диаграммы
Понятие потоковой диаграммы
Конечные автоматы также могут использоваться для построения потоковых диаграмм – моделей логических конструкций, не использующих состояния. Это могут быть, например, деревья решений или итерационные циклы. Потоковые диаграммы могут наглядно представлять сложные алгоритмы в удобном для чтения формате, а конечный автомат позволяет создавать и запускать потоковые диаграммы без необходимости перевода их в текстовый код. Кроме того, вы можете использовать потоковые диаграммы для описания расширенных правил перехода между состояниями.
Для создания потоковых диаграмм используются два вида графических элементов: переходы и узлы. Вы уже знакомы с переходами – условными путями, представленными стрелками. Узлы делят пути на сегменты и представлены кружками. С их помощью можно создавать дополнительные ответвления на пути принятия решения. Например, переходы и узлы могут быть использованы для моделирования оператора if-else:
Если диаграмма состояний является потоковой диаграммой, то она должна:
- иметь один переход по умолчанию,
- сходиться в одном конечном узле.
Потоковые диаграммы также можно использовать как части конечных автоматов для моделирования более сложных переходов или действий с состояниям.
Практическая часть
В практической части вы построите модель итератора, который возвращается к единице, когда индекс достигает максимального значения. Диаграмма состояний будет иметь два входа: предыдущее и максимальное значения индекса.
Например, если макисимальное значение индекса равно 3, а начальное значение равно 1, то входы и выходы конечного автомата будут следующими:
| Вход | Выход |
|---|---|
| 1 (начальное значение) | 2 |
| 2 | 3 |
| 3 | 1 |
| 1 | 2 |
| ... | ... |
Управляющая логка имеет вид:
index = prevIndex + 1;
if index > maxIndex
index = 1;
end
✏️Задание 1
- Откройте модель
Модель 7_Начало.ngscript.
- Войдите внутрь блока Chart. С помощью узлов и переходов соберите логическую конструкцию
if, как показано на рисунке ниже. - Добавьте на переходе от первого узла ко второму условие
ifв видеindex > maxIndex, а на переходе от второго узла к третьему – действиеifв видеindex = 1;.
- В окне настроек диаграммы состояний создайте переменную
indexв качестве выходного сигнала и переменнуюmaxIndexв качестве входного сигнала.
Решение
✏️Задание 2
Модифицируйте модель следующим образом:
- Добавьте действие
index = prevIndex + 1;на переход по умолчанию, находящийся перед операторомif. Напомним, что действие заключается в фигурные скобки. - В окне настроек диаграммы состояний созадайте переменную
prevIndexв качестве входного сигнала.
Решение
✏️Задание 3
Завершите построение модели.
- Выйдите из блока Chart в основную модель. Соедините входные и выходные порты блоков:
- Соедините выход блока Константа со входом
maxIndexблока Chart; - Соедините выход блока Запаздывание на шаг со входом
prevIndexблока Chart; - Соедините выход блока Chart со входом блока Выход1 и залогируйте выходной сигнал.
- Сделайте ответвление выходного сигнала и соедините его со входом блока Запаздывание на шаг.
- Запустите симуляцию модели и постройте график выходного сигнала.
Решение
Модель:
Результаты моделирования: