×

Применение формул

Формула преобразования — это математическое выражение, которое применяется к данным, полученным с датчика.
Зачем применять формулу:
  • Для корректировки показаний датчика, например, формула позволяет исправить неточности в показаниях датчиков
  • Для приведения сырых данных датчика к реальным физическим величинам. Например, датчик выдаёт числа от 0 до 1000, а формула преобразует их в реальные литры топлива в баке
  • Для преобразования единиц измерения, например, перевод километров в мили или литров в галлоны
  • Для комбинирования данных, например, формула может применять значения из разных датчиков для новых показателей
В окне настройки датчика формулу применяют в специальном поле.

Применение формул

1

Формула

1. Формула
Формула применяется к данным сразу после их получения с датчика, до использования тарировочной таблицы.
Формула должна начинаться с одного из следующих знаков:
• арифметические знаки: +, -, *, /
• знак равенства: =
В формуле можно использовать:
• математические операции: сложение (+), вычитание (-), умножение (*), деление (/)
• круглые скобки ( ) для указания порядка действий

Простые формулы

Используются для простых операций, таких как умножение, деление, сложение и вычитание. Исходное значение датчика автоматически подставляется в формулу.
Рассмотрим пример применения формулы
Допустим, у нас есть датчик заряда батареи, который передаёт значение в милливольтах. В сырых точках найдём значение датчика: Vsource = 9320
Для отображения привычного значения датчика в вольтах, необработанное значение нужно разделить на 1000. В окне настройки датчика в поле «Формула» напишем формулу: /1000.
Финальное значение датчика будет вычислено по формуле Vbattery/1000:
  • Система берёт текущее значение датчика в сырых точках
2. Это значение делит на 1000
3. Полученный результат становится новым значением датчика
 
Финальное значение датчика АКБ в вольтах отобразится во всплывающей подсказке объекта — 9,28 В.

Примеры простых формул

 Формула
  Результат
   *10
  Умножить исходное значение на 10
 /1000
  Разделить исходное значение на 1000
   /25.5+7
  Разделить значение на 25.5 и к нему прибавить 7
  /100+(7*3-2)*4
  Более сложный пример с использованием скобок
В формулах десятичные дроби записываются через точку, а не через запятую. Например: 25.4, 1.75

Переменные в формуле

В формулу могут подставляться данные из полей датчиков и стандартные переменные.
Все значения для подстановки в формулу заключаются в символы %%
Стандартные переменные, которые используются в формуле:
%S% — скорость
%P% или %satsinview% — количество спутников
%ts% — время текущего пакета
%ts1% — время предыдущего пакета
Время используется в формате Unixtimestamp — количество секунд, прошедших с 1 января 1970 года.
%value% — значение текущего датчика
Все остальные значения берутся напрямую из названий в пакете данных сырых точек, который присылает датчик.
Например:
%Vbattarey% — значение датчика заряда батареи
%GSM% — значение уровня сигнала мобильной связи
%HDOP% — снижение точности в горизонтальной плоскости
Заключите нужное название параметра в %%, и оно будет заменено при расчёте в формуле соответствующим значением из пакета данных.

Примеры формул с подстановкой переменных

 Формула
  Результат
   *%GSM%
  Умножить исходное значение на данные из поля GSM
 /%HDOP%
  Разделить исходное значение на данные из поля HDOP
   %ts1%-%ts%
Получить разницу во времени между текущим и предыдущим пакетом
   %ts%/86400
  Перевести время из секунд в дни

Сложные формулы

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

Примеры сложных формул

 Формула
  Результат
   =%value%*2+10
  Текущее значение датчика умножить на 5 и прибавить 10
 =%S%*3.6+%value%
  Перевести скорость в км/ч и добавить исходное значение
   =(%DIN1%+%DIN2%)/%value%
  Разделить сумму цифровых входов на исходное значение
  =7/%value%
  Разделить число 7 на исходное значение датчика

Условные операторы

Условные операторы — это способ задать логику выбора в формуле. Они позволяют формуле принимать разные значения в зависимости от того, выполняется ли определённое условие или нет. Это похоже на запрос: «Если условие верно, сделай одно, иначе сделай другое».

Условный оператор записывается так

условие ? значение_если_да : значение_если_нет
Это выражение можно объяснить так:
— условие  — это выражение, которое проверяется , например, температура больше 30
—значение_если_да — это значение, которое возвращается, если условие верно
— значение_если_нет — это значение, которое возвращается, если условие неверно 

Операторы сравнения

В условиях можно использовать следующие операторы:
 Оператор
  Значение
  Описание
   ==
  равно
  проверяет точное равенство
   !=
  не равно
  проверяет неравенство
   >
  больше
  проверяет, является ли левое значение больше правого
   <
  меньше
  проверяет, является ли левое значение меньше правого
   >=
  больше или равно
  проверяет, больше или равно ли левое значение правому
  <=
  меньше или равно
  проверяет, меньше или равно ли левое значение правому
  &&
  и
  проверяет, что все условия истинны
   ||
  или
  проверяет, что хотя бы одно условие истинно

Пример 1

Допустим, у нас есть поле датчика цифрового входа DIN1, и мы хотим установить условие:
  • Если DIN1 равно 1, то результат будет 22
  • Если DIN1 не равно 1, то результат будет 33
Формула будет выглядеть так: =(%DIN1% == 1) ? 22 : 33
Система проверяет условие: %DIN1% == 1 (равно ли значение DIN1 числу 1). Если условие верно, возвращается 22. Если условие неверно, возвращается 33.

Пример 2

Допустим, у нас есть поле датчика температуры temp, и мы хотим установить условие:
  • Если температура больше 30, то результат будет: температура * 10
  • Если температура меньше или равна 30, то результат будет: температура * 20
Формула будет выглядеть так: =(%temp% > 30) ? %temp% * 10 : %temp% * 20
Система проверяет условие: %temp% > 30 (больше ли температура 30). Если условие верно, возвращается температура * 10. Если условие неверно, возвращается температура * 20.
 
Пример 3
Допустим, у нас есть датчик температуры с полем temp и датчик влажности humidity, и мы хотим установить следующее условие:
  • Если температура больше 25 И влажность меньше 60%, то результат будет 100
  • В противном случае результат будет 50
Формула будет выглядеть так: =(%temp% > 25 && %humidity% < 60) ? 100 : 50
%temp% > 25 — первое условие (температура больше 25), %humidity% < 60 — второе условие (влажность меньше 60%). Оператор && означает, что должны быть выполнены оба условия. Система проверяет условия и, если ба условия истинны, возвращается 100, если хотя бы одно условие неверно, возвращается 50.
 

Функции PHP

Функции PHP — это готовые инструменты языка программирования PHP для обработки, преобразования и форматирования данных.  С помощью PHP-функций применяйте сложные преобразования, просто указав название функции и значение в формулу.
Всё, что вам нужно сделать:
1. Написать название функции в формуле
2. Указать в скобках значение, которое хотите преобразовать
3. И система автоматически возьмёт ваши данные, обработает их нужным способом и покажет результат.
Например, если напишете round (45.78) в формуле, получите округлённое число 46.
 
   Функции
  Описание
   Пример
   substr
  Извлекает часть строки
   =substr('%Data%', x, y) — возвращает «y» символов из значения Data начиная с позиции «x»
   =substr('%FIELD%', 1, 2) — возвращает 2 символа из значения FIELD начиная с позиции 1
   round
  Округляет число
=round(%AIN1%/1000) — делит значение AIN1 на 1000 и округляет результат
   hexdec
  Переводит шестнадцатеричное число в десятичное
  =hexdec('%Param%), если Param=0A, тогда функция вернёт значение 10
   dechex
  Переводит десятичное число в шестнадцатеричное
  =dechex('%Param%), если Param=255, тогда функция преобразует 255 в 'FF'
   decbin
  Переводит десятичное число в двоичное
  =decbin('%Param%'), если Param=10, функция вернёт 1010 
   hex2bin
  Переводит шестнадцатеричную запись в двоичные данные
  =hex2bin ('%Param%'), если Param=4142, тогда функция вернёт двоичное представление
  'AB'
   strrev
  Переворачивает строку
=strrev('%value%'), если value=0123d848010000e5, то функция преобразует значение      
5е000010848d3210
   bytesrev
  Переворачивает шестнадцатеричные байты
  =bytesrev('%value%'), value=0123d848010000e5, то функция преобразует значение
  e500000148d82301
   explode
 
  Разделяет строку на части по указанному
разделителю и возвращает массив строк
 
=explode(',','%value%')[2]
Допустим, датчик передаёт строку значений через запятую: 90.5,3450,112,43,215
Формула =explode(',','%value%')[2] в этом случае берёт текущие показания датчика и разбивает на массив: '90.5', '3450', '112', '43', '215', а потом извлекает элемент с индексом 2 — '112'
Массив строк —  это список отдельных строк, пронумерованный с нуля.
',' — это разделитель, в этом случае запятая. По этому символу будет происходить разделение строки.
'%value%' — это строка, которую нужно разделить.
[2] — квадратные скобки используются для доступа к элементу массива. [2] означает — «дай мне третий элемент», нумерация начинается с 0.
   max
  Сравнивает несколько значений и возвращает наибольшее
=max('%value%', 90), если value=85, то функция вернёт 90
   min
  Возвращает наименьшее значение
=min('%value%', 90), если value=85, то функция вернёт 85
   abs
  Возвращает абсолютное значение числа
=abs('%value%'), если value = -15, функция возвращает 15
   str_replace
Заменяет одни символы или слова на другие
 
str_replace(search, replace, subject)
  • search — что ищем
  • replace — на что заменяем
  • subject — где ищем (строка)
 Например, нам нужно заменить запятые на точки в числах
=str_replace(",", ".",'%value%'), если value = 1,234,567, то функция выведет — 1.234.567
  sqrt
  Вычисляет квадратный корень
  =sqrt('%value%'), если value = 25 , функция возвращает значение 5
  pow
  Возводит число в степень
  =pow('%value%', 3), если value =2, то функция возвращает 8 (то есть 2³)
  sin
  Вычисляет синус угла (в радианах) 
  =cos('%value%'), если value= 1.57, то конечное значение ≈ 1
  cos
  Вычисляет косинус угла (в радианах)
  =cos('%value%'), если value = 0, то конечное значение 1
  asin
  Вычисляет арксинус (в радианах)
  =asin('%value%'), если value=1, то функция возвращает 1.57
  acos
  Вычисляет арккосинус (в радианах)
  =acos('%value%'), если value= 0, то функция возвращает 1.57
  number_format
  Форматирует число с разделителями
  =number_format(1234.56, 2, ',', ' ') функция вернёт 1 234,56
   time
  Возвращает текущее время в UNIX-формате — в секундах с 1 января1970
   =time('2023-12-20 12:00:00')
   array_sum
  Складывает все числа в массиве
   =array_sum([1,2,3,4]) — функция возвращает 10
   pack
Упаковывает данные в бинарный формат
   =pack('H*', '4142') — упаковывает в двоичные данные 'AB'
   unpack
Распаковывает бинарные данные
   =unpack('H*', 'AB')[1] — возвращает '4142'

Примеры сложных преобразований

  Описание
  Пример
Преобразование беззнакового числа в число со знаком
 =((%BLE_T1%>3000)?((%BLE_T1%-65535)/100):(%BLE_T1%/100)) 
 
  • Если число больше 3000 — вычитаем из него 65535 и делим на 100
  • Если меньше или равно 3000 — делим на 100
    Это формула часто используется для датчиков температуры, где отрицательные значения кодируются большими положительными числами
  Преобразование последовательности байт
  (little endian в big endian)
 =strtoupper(substr(unpack('H*',strrev(hex2bin(%value%)))[1],2,12)) — 1500000124286b01 → 6B2824010000
  • hex2bin(%value%) — преобразует hex-строку в бинарные данные
  • strrev(...) — переворачивает байты
  • unpack('H*', ...) — конвертирует обратно в hex
  • substr(..., 2, 12) — берет нужную часть строки
  • strtoupper(...) — преобразует в верхний регистр

Деление на ноль

Когда в формуле присутствует деление, будьте внимательны с делителем — числом, на которое делят. Если делитель равен нулю, возникнет ошибка, так как деление на ноль математически невозможно.
Например, формула =1000/%DIN1% вызовет ошибку, если значение датчика DIN1 равно 0 или не определено.
В таком случае используйте условный оператор для проверки делителя: =(%DIN1%==0) ? 0 : 1000/%DIN1%. Система проверит условие:  %DIN1% == 0 (равно ли значение DIN1 нулю). Если условие верно, результат будет 0. Если условие неверно, выполнятся деление 1000 на значение DIN1.

Как проверить работу формулы

Когда применяете формулу, убедитесь, что формула корректно преобразует данные.
Проверяем работу формулы через кнопку «Тест»:
Применение формул

1Кнопка «Тест»

1.
  • Нажмите на кнопку «Тест» в поле «Формула»
  • Система покажет значения, которые можно использовать для проверки формулы, указанной в обработчике. Вы можете выбрать готовые значения или ввести свои
    3. После этого нажмите кнопку «Тест» ещё раз, и система покажет результат применения формулы: правильный или неправильный

Где ещё применяются формулы

Формулы в PILOT можно использовать не только для обработки данных с датчиков. Применять формулы вы можете в «Карточке объекта» или при работе с модулем «Уведомления». При этом принцип их работы везде одинаковый — те же правила написания и те же математические операции.