Временны́е.
Например, лимит времени на исполнение задачи или конкретное действие в конкретный временной отрезок.
Пространственные.
Например, добавление регионов («Старт», «Финиш») или запрет / принуждение робота, его датчика или какого-то подвижного предмета находиться в определенные промежутки времени в определенном месте.
Ограничения на устройства.
Например, ограничение на набор датчиков или на поведение устройств.
Структура написания ограничений
Для описания ограничений используется главный тег <constraints>…</constraints>, в который вписываются все ограничения. Используется как контейнер. Ограничения описываются внутри тега, каждый дочерний тег должен быть одним из четырех:
<constraints>...</constraints>
Основной тег, в который вписываются все ограничения. Используется как контейнер.
<constraints>
<!-- Временное ограничение -->
<timelimit value="30000"/>
<!-- Ограничение с условием. При нарушении условия будет выдана ошибка -->
<constraint checkOnce="true" failMessage="Робот должен находиться на старте перед запуском!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint>
<!-- Инициализация переменной x со значением 2 -->
<init>
<setter name="x">
<int value="2"/>
</setter>
</init>
</constraints>
<timelimit/>
Временное ограничение. Является обязательным.
Атрибуты
Синтаксис
<timelimit value="35000"/>
<constraint>...</constraint>
Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. Может использоваться как контейнер. Имеет один дочерний тег: <conditions>...</conditions>.
Атрибуты
Синтаксис
<constraint checkOnce="true" failMessage="Робот должен находиться на старте перед запуском!">
<!-- Проверяет при запуске, что на порту А1 установлен инфракрасный датчик расстояния -->
<constraint checkOnce="true" failMessage="У робота должен быть установлен инфракрасный датчик расстояния на порту А1">
<equals>
<typeOf objectId="robot1.A1"/>
<string value="twoDModel::robotModel::parts::RangeSensor"/>
</equals>
</constraint>
<!-- Проверяет, что робот находится в допустимом регионе на протяжении всего времени выполнения программы -->
<constraint failMessage="Робот покинул допустимую зону!">
<inside objectId="robot1" regionId="warzone"/>
</constraint>
<event>...</event>
Основной инструмент задания динамических ограничений. Используется как контейнер.
Безусловное событие, выполняющееся перед началом выполнения программы.
Пример
<!-- Перед началом выполнения программы заводим переменную "my_value" со значением два -->
<init>
<setter name="my_value">
<int value="2"/>
</setter>
</init>
Условия
Теперь обсудим, какими могут быть условия в элементах <constraint> и <event>. Условия задаются с помощью тега <condition> в случае, если проверяется только одно из атомарных условий, или тега <conditions>, если проверяется составное условие.
<condition>...</condition>
Внутри этого тега описывается проверяемое условие.
Пример
<condition>
<!-- Внутри тега описано условие равенства двух значений -->
<equals>
<objectState object="robot1.display.smiles"/>
<bool value="true"/>
</equals>
</condition>
<conditions>...</conditions>
Используется для создания составных условий. Обязательным атрибутом должна быть указана логическая связка. Связкой может быть and или or. Отрицание выражения задается тегом <not> без атрибутов. Среди подвыражений могут также встречаться другие элементы <conditions>.
<!-- Задаем ограничение на то, что объект робот находится в регионе с id=”start” -->
<inside objectId="robot1" regionId="start"/>
<settedUp/> и <dropped/>
Позволяет проверить, взведено событие или нет.
Атрибуты
Синтаксис
<!-- Условие, что событие с id=”event1” взведено -->
<condition>
<settedUp id="event1"/>
</condition>
<!-- Условие, что событие с id=”event2” опущено -->
<condition>
<dropped id="event2"/>
</condition>
Пример
В условиях события “check event” проверяется, что другое событие с id=”Try move” находится во взведенном состоянии, а событие с id=”Go back” опущено и не выполняется. Если оба эти условия после проверки возвращают значение true, то программа успешно завершается.
Рассмотрим использование <timer/> c различными значениями атрибута forceDropOnTimeout .
В событии “check region” проверяются временное и пространственное ограничения. Первое условие (timer) становится истинным спустя 1000мс, а до этого момента ложно. После этого его значение больше не изменяется. Второе условие (inside) проверяет, что робот находится в регионе с id=”start_zone”. В тот момент, когда оба этих условия будут выполнены одновременно, программа будет выполнена успешно.
1. Т. к. атрибут forceDropOnTimeout равен "false", то после заданного количества времени событие будет продолжать оставаться взведенным и ждать выполнения второго условия.
2. Т. к. атрибут forceDropOnTimeout равен "true", то после заданного количества миллисекунд событие будет опущено, несмотря на наличие .другого условия. Таким образом, если в момент времени 1000 мс робот не находится в нужном регионе, то сообщение об успешном выполнении не будет выведено даже в случае, если робот окажется там спустя некоторое время.
Возможно взятие свойства какой-либо переменной, для этого используется точка. Например, значение rect.width вернет ширину прямоугольника, сохраненного в переменной rect.