Skip to Content

Режим Expression (Выражения)

В редакторе шаблонов миссий некоторые ноды поддерживают режим Expression. Этот режим позволяет не просто вводить статические значения, а использовать гибкий язык выражений для динамического вычисления параметров, выполнения арифметических действий и манипуляций с данными в реальном времени.

1. Как включить режим Expression

В окне настроек ноды (например, Log, Error, If) рядом с полем ввода параметра находится переключатель Expression. При его активации появляется иконка с функцией и система начинает интерпретировать введенный текст как программный код.

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 %}