Я разрабатываю конечный автомат, используя диаграммы состояний UML2.
Имеется встроенный конечный автомат «контроллер», который в состоянии WAITING_FOR_CONNECTION ожидает установления онлайн-соединения. Вся обработка соединения выполняется во втором конечном автомате «коммуникации».
Когда контроллер переходит в состояние WAITING_FOR_CONNECTION, а соединение еще не установлено, он просто ждет, пока триггер «connectionEstablished» инициирует соответствующий переход состояния. Но что, если онлайн-соединение уже доступно? Не будет срабатывания триггера, и защита состояния соединения не поможет, поскольку защита оценивается только один раз для триггера.
Одно из решений, которое я могу придумать, состоит в том, чтобы иметь два перехода в одно и то же целевое состояние: один переход по умолчанию без явного триггера, но с защитой «isOnline», и один переход с триггером «connectionEstablished». По-моему, довольно неуклюжее решение.
То, что я ищу, - это «триггер уровня» вместо обычной семантики «триггера края». Предусматривает ли спецификация диаграммы состояний UML2 такой тип триггера? Сравнимо, например, с условием "когда" в Modelica. Контроллер переходил в состояние WAITING_FOR_CONNECTION и переходил когда онлайн-соединение становилось доступным.