Режим Expression (Выражения)
В редакторе шаблонов миссий некоторые ноды поддерживают режим Expression. Этот режим позволяет не просто вводить статические значения, а использовать гибкий язык выражений для динамического вычисления параметров, выполнения арифметических действий и манипуляций с данными в реальном времени.
1. Как включить режим Expression
В окне настроек ноды (например, Log, Error, If) рядом с полем ввода параметра находится переключатель Expression. При его активации появляется иконка с функцией и система начинает интерпретировать введенный текст как программный код.
.png)
2. Основы синтаксиса
Expr — это простой язык выражений, предназначенный для вычисления динамических значений.
Литералы и базовые типы
- Комментарии:
/* многострочный */или// однострочный - Логические (Boolean):
true,false - Целые числа (Integer):
42,0x2A(hex),0o52(octal),0b101010(binary) - Числа с плавающей точкой (Float):
0.5,.5 - Строки (String):
"foo",'bar' - Массив (Array):
[1, 2, 3] - Карта (Map):
{a: 1, b: 2, c: 3} - Пустое значение (Nil):
nil - Байты (Bytes):
b"hello",b'\xff\x00'
{% hint style=“info” %}
Пример: > Настройка переменной в узле Set Vars: let is_active = true; let retry_count = 3; let prefix = "ROBOT_"
{% endhint %}
Строки (Strings)
Строки могут быть заключены в одинарные или двойные кавычки. Поддерживаются escape-последовательности, такие как \n (новая строка), \t (табуляция), \uXXXX (символы Unicode). Для многострочных строк используются обратные кавычки (бекстики): Hello World Строки в обратных кавычках являются «сырыми» (raw) и не поддерживают escape-последовательности.
{% hint style=“info” %}
Пример: > Формирование сообщения для лога: "Выполнение задачи для точки:\n" + $env.target_point
{% endhint %}
Байты (Bytes)
Байтовые литералы представлены строковыми литералами с префиксом b или B. Возвращают значение типа []byte. Символы не из таблицы ASCII кодируются в UTF-8. Поддерживают escape-последовательности для произвольных байтовых значений (\xNN — hex, \NNN — octal).
{% hint style=“info” %}
Пример: > Подготовка команды для отправки в Modbus регистр: b"\x01\x06\x00\x01\x00\x01"
{% endhint %}
Операторы
- Арифметика:
+,-,*,/,%(остаток),^или**(возведение в степень) - Сравнение:
==,!=,<,>,<=, >=` - Логика:
notили!,andили&&,orили|| - Условные:
?:(тернарный),??(слияние с nil),if else(многострочный) - Доступ:
[],.,?.(опциональный),in(вхождение) - Строковые:
+(конкатенация),contains,startsWith,endsWith - Прочие:
matches(регулярные выражения),..(диапазон),[:](срез),|(пайп/конвейер)
Операторы доступа и Membership
К полям структур и элементам карт можно обращаться через . или []. Отрицательные индексы в массивах (например, -1) позволяют обращаться к элементам с конца. Оператор in проверяет наличие элемента в списке или ключа в карте.
{% hint style=“info” %}
Пример: > Проверка, входит ли робот в список разрешенных: $env.robot_id in ["AGV_01", "AGV_02", "AGV_05"]
{% endhint %}
Опциональная цепочка и Nil-слияние
Оператор ?. позволяет безопасно обращаться к полям объекта, который может быть nil. Оператор ?? задает значение по умолчанию.
{% hint style=“info” %}
Пример: > Получение имени пользователя с подстраховкой: $env.user?.name ?? "Система"
{% endhint %}
Срезы (Slice Operator)
Используется для получения подмножества массива. array[1:4] — элементы со второго по четвертый.
{% hint style=“info” %}
Пример: > Взять первые три задачи из очереди: $env.task_queue[:3]
{% endhint %}
Пайп (Pipe Operator)
Передает результат выполнения функции слева в качестве первого аргумента функции справа.
{% hint style=“info” %}
Пример: > Обработка ID точки: $env.point_id | upper() | replace("ZONE", "AREA")
{% endhint %}
Переменные и $env
Объявляются ключевым словом let. Переменная $env — это глобальная карта всех данных миссии.
{% hint style=“info” %}
Пример: > Расчет итоговой дистанции: let base = 100; let offset = $env.extra_dist; base + offset
{% endhint %}
Предикаты
Используются в функциях обработки массивов. Символ # — текущий элемент.
{% hint style=“info” %}
Пример: > Фильтрация роботов с низким зарядом: filter($env.robots, #.battery < 20)
{% endhint %}
Функции
Строковые (String Functions)
trim,upper,lower,split,replace,hasPrefix,hasSuffix,indexOf,repeat.
{% hint style=“info” %}
Пример: > Проверка расширения файла в объекте данных: hasSuffix($env.filename, ".json")
{% endhint %}
Даты (Date Functions)
now(),duration(),date(). Поддерживает арифметику дат (вычитание дат дает длительность).
{% hint style=“info” %}
Пример: > Проверка, что робот не обновлял статус более 5 минут: now() - $env.last_seen > duration("5m")
{% endhint %}
Числовые (Number Functions)
max,min,abs,ceil,floor,round.
{% hint style=“info” %}
Пример: > Ограничение максимальной скорости: min($env.speed_limit, 2.0)
{% endhint %}
Массивы (Array Functions)
all,any,one,none,map,filter,find,count,sum,mean,sort,reverse,join.
{% hint style=“info” %}
Пример: > Подсчет среднего уровня заряда по флоту: mean(map($env.robots, .battery))
{% endhint %}
Преобразование типов и JSON
type(),int(),float(),string(),toJSON(),fromJSON(),toBase64().
{% hint style=“info” %}
Пример: > Парсинг строкового параметра из внешней системы: int($env.payload_str) * 10
{% endhint %}
Битовые функции
bitand,bitor,bitxor,bitnot,bitshl,bitshr.
{% hint style=“info” %}
Пример: > Проверка 3-го бита (ошибка двигателя) в статусном слове: bitand($env.status_word, 0b100) != 0
{% endhint %}
Разное
len(v)— длина.get(v, index)— безопасное извлечение.
{% hint style=“info” %}
Пример: > Проверка наличия данных перед выполнением: len($env.orders) > 0 ? "Обработка" : "Ожидание"
{% endhint %}