Как в диаграмме состояний UML2 смоделировать условие, которое уже может быть активным или запущенным?

Я разрабатываю конечный автомат, используя диаграммы состояний UML2.

Имеется встроенный конечный автомат «контроллер», который в состоянии WAITING_FOR_CONNECTION ожидает установления онлайн-соединения. Вся обработка соединения выполняется во втором конечном автомате «коммуникации».

Когда контроллер переходит в состояние WAITING_FOR_CONNECTION, а соединение еще не установлено, он просто ждет, пока триггер «connectionEstablished» инициирует соответствующий переход состояния. Но что, если онлайн-соединение уже доступно? Не будет срабатывания триггера, и защита состояния соединения не поможет, поскольку защита оценивается только один раз для триггера.

Одно из решений, которое я могу придумать, состоит в том, чтобы иметь два перехода в одно и то же целевое состояние: один переход по умолчанию без явного триггера, но с защитой «isOnline», и один переход с триггером «connectionEstablished». По-моему, довольно неуклюжее решение.

То, что я ищу, - это «триггер уровня» вместо обычной семантики «триггера края». Предусматривает ли спецификация диаграммы состояний UML2 такой тип триггера? Сравнимо, например, с условием "когда" в Modelica. Контроллер переходил в состояние WAITING_FOR_CONNECTION и переходил когда онлайн-соединение становилось доступным.


person Ulrich Schuster    schedule 23.11.2014    source источник


Ответы (2)


Вы можете использовать нулевой переход. Это переход без триггера и только с защитой, в данном случае с защитой "[isConnected]". Семантика такова:

Переходы с нулевым запуском запускаются сразу после завершения любых действий при входе.

Брюс Пауэлл-Дуглас

Обратите внимание, что триггер оценивается только при входе, для изменения состояния необходим второй переход завершения или явное подключение/переход. В качестве примера см. слайд 72 по ссылке Брюс Пауэлл-Дуглас выше.

В качестве альтернативы вы можете иметь псевдосостояние choice перед состоянием ожидания, которое обходит его, если оно уже подключено. Он отличается от нулевого триггера тем, что не выполняются действия входа, но если у вас их нет, в любом случае он будет вести себя точно так же.

person Clifford    schedule 23.11.2014

Если для перехода не определен триггер, он представляет завершение перехода. Завершение перехода автоматически запускается объектом, который владеет конечным автоматом, после активного состояния, из которого начинается переход, завершен. Ваша проблема будет решена с помощью охранников при переходе. Вы можете использовать два перехода с одним и тем же триггером, но обеспечить защиту для них обоих. Переход запускается, если триггер соответствует событию И выполнено условие. Второе решение может использовать элемент CHOOSE (аналогично решению в действии). Входящий переход для выбора должен иметь триггер (если он не определен, это снова завершающий переход), а два или более исходящих перехода обеспечивают защиту для направления правильного состояния. Исходящие переходы не должны иметь триггеров! Например, исходящий переход с охраной [isOnline == false] направляет в состояние WAITING_FOR_CONNECTION. и т. д.

См. схему ниже:

введите здесь описание изображения

person Vladimir    schedule 23.11.2014