Узел памяти
Страница в процессе разработки. |
Узел памяти (History Junction) — это элемент конечного автомата Engee, который фиксирует состояние дочерних состояний
внутри родительского состояния, чтобы при повторной активации возвращаться к последнему активному состоянию.
Подробнее про родительские и дочерние состояния читайте в статье. |
Узел памяти может быть расположен только внутри состояний. Некорректное расположение выдаст ошибку: |
Узел памяти записывает активность дочерних состояний внутри родительского состояния. Когда родительское состояние становится активным впервые, то конечный автомат использует переход по умолчанию для определения, какое дочернее состояние становится активным. Однако, если родительское состояние становится неактивным, а затем активируется повторно, то узел памяти позволяет вернуться к последнему активному дочернему состоянию, минуя переход по умолчанию.
Например, есть автоматическая дверь, у которой возможно лишь два дочерних состояния — открыто (Open) и закрыто (Closed). Родительским состоянием будет состояние «активность двери» (Door_Activity), общее для дочерних состояний. Получаем следующую модель конечного автомата:
-
Когда конечный автомат впервые переходит в состояние Door_Activity, то по умолчанию активируется состояние Closed (дверь закрыта);
-
Если дверь открывается (Open), а затем система временно отключается (переход в состояние "неактивности" — т.е. родительское состояние Door_Activity перестанет быть активным), то узел памяти запоминает состояние Open;
-
При повторной активации состояния Door_Activity дверь автоматически возвращается в состояние Open, а не в Closed, как это было бы без узла памяти.
Узел памяти как внутренний переход
Узел памяти может использоваться как внутренний переход.
Внутренний переход — это механизм в иерархии состояний конечного автомата, который позволяет переходить из текущего состояния в одно из его дочерних состояний без выхода на уровень выше. Такой переход выполняется автоматически при активации родительского состояния и может быть как безусловным, так и зависеть от определенных условий.
Внутренний переход создается от рамки родительского состояния до дочернего, но в нашем случае он будет идти в узел памяти:
Такой переход работает как цикл (self-loop) для каждого дочернего состояния. Когда условие внутреннего перехода выполняется, то конечный автомат временно выходит из активного дочернего состояния, а затем сразу возвращается в него. Это позволяет повторно активировать состояние, выполняя все связанные с ним действия (например, группы операторов during
и on
). Следовательно, узел памяти как внутренний переход помогает управлять переходами, сохраняя текущее состояние системы.
Рассмотрим, как работает внутренний переход в узел памяти. Для этого представим следующую модель с родительским состоянием A и двумя дочерними состояниями — A1 и A2. В модели не будет узла памяти и условия на внутреннем переходе:
Внутренний переход из состояния A в A1 выполняется безусловно, то есть каждый раз, когда состояние A активируется. Это делает состояние A2 недостижимым без применения узла памяти. Такая модель конечного автомата будет работать по следующей логике:
Логика работы конечного автомата в модели без узла памяти и условия
-
Активация блока Chart, запуск работы конечного автомата модели:
-
1. Переход в состояние A;
-
2. Активация состояния A;
-
3. Переход в состояние A1;
-
4. Активация состояния A1;
-
5. Chart и состояния A, A1 засыпают.
-
-
Chart и активное состояние A просыпаются:
-
1. Выполняются группы операторов
during
иon
(если есть);
-
2. Деактивация состояния A1;
-
3. Активация состояния A1;
-
4. Блок Chart и состояния A, A1 засыпают.
-
-
Возвращение к пункту 2, повтор цикла.
Теперь добавим условие (оператор темпоральной логики every) на внутренний переход:
После добавления условия переход из состояния A в A1 будет выполняться только при каждом втором пробуждении состояния A. При нечетных пробуждениях происходит переход A1 → A2, а при четных — переход A2 → A1. Следовательно, модель будет работать по следующей логике:
Логика работы конечного автомата в модели без узла памяти с условием
-
Активация блока Chart, запуск работы конечного автомата модели:
-
1. Переход в состояние A;
-
2. Активация состояния A;
-
3. Переход в состояние A1;
-
4. Активация состояния A1;
-
5. Chart и состояния A, A1 засыпают.
-
-
Блок Chart и активное состояние A просыпаются (пробуждение № 1, 3, 5… состояния A):
-
1. Выполняется переход A1→A2;
-
2. Деактивация состояния A1;
-
3. Активация состояния A2;
-
4. Блок Chart и состояния A, A2 засыпают.
-
-
Блок Chart и активное состояние A просыпаются (пробуждение № 2, 4, 6… состояния A):
-
1. Выполняются группы операторов
during
иon
(если есть);
-
2. Срабатывает условие внутреннего перехода (пробуждение — четное), и он выполняется;
-
3. Деактивация состояния A2;
-
4. Активация состояния A1;
-
5. Chart и состояния A, A1 засыпают.
-
-
Возвращение к пункту 2, повтор цикла.
Теперь рассмотрим модель с узлом памяти на внутреннем переходе. Дополнительно добавим оператор темпоральной логики after и еще одно внешнее состояние, как показано на рисунке:
Напомним, что задача узла памяти на внутреннем переходе — запоминать последнее активное дочернее состояние и возвращаться к нему при выполнении условий. Тогда модель будет работать по следующей логике:
Логика работы конечного автомата в модели с узлом памяти и условием
-
Активация блока Chart, запуск работы конечного автомата модели:
-
1. Переход в состояние A;
-
2. Активация состояния A;
-
3. Переход в состояние A1;
-
4. Активация состояния A1;
-
5. Chart и состояния A, A1 засыпают.
-
-
Chart и активное состояние A просыпаются (первое пробуждение состояния A):
-
1. Выполняется переход A1→A2;
-
2. Деактивация состояния A1;
-
3. Активация состояния A2;
-
4. Узел памяти запоминает состояние A2;
-
5. Chart и состояния A, A2 засыпают.
-
-
Chart и активное состояние A просыпаются (второе пробуждение состояния A):
-
1. Выполняются группы операторов
during
иon
(если есть);
-
2. Срабатывает условие внутреннего перехода в узел памяти, и он выполняется в запомненное состояние A2;
-
3. Деактивация состояния A2;
-
4. Активация состояния A2;
-
5. Узел памяти запоминает состояние A2;
-
6. Chart и состояния A, A2 засыпают.
-
-
Chart просыпается (третье пробуждение состояния A):
-
1. Срабатывает условие перехода A→B, и он выполняется;
-
2. Деактивация состояния A2;
-
3. Деактивация состояния A;
-
4. Активация состояния B;
-
5. Chart и состояние B засыпают.
-
-
Chart просыпается:
-
1. Выполняется безусловный переход B→A;
-
2. Активация состояния A;
-
3. Активация запомненного состояния A2;
-
4. Узел памяти запоминает состояние A2;
-
5. Chart и состояния A, A2 засыпают.
-
-
Chart, A и A2 просыпаются (первое пробуждение A):
-
1. Узел памяти запоминает состояние A2;
-
2. Chart, A и A2 засыпают.
-
-
Возвращение к пункту 3, повтор цикла.
Таким образом, внутренний переход в узел памяти позволяет временно выйти из текущего дочернего состояния и вернуться в него, если условие перехода выполнено. Это происходит сразу после выполнения групп операторов during
и on
родительского состояния. Узел памяти запоминает последнее активное дочернее состояние, помогая в управлении переходами.
Основные различия между узлом памяти с внутренним переходом и без него заключаются в следующем:
|