Применение формул
Формула преобразования — это математическое выражение, которое применяется к данным, полученным с датчика.
Зачем применять формулу:
-
Для корректировки показаний датчика, например, формула позволяет исправить неточности в показаниях датчиков
-
Для приведения сырых данных датчика к реальным физическим величинам. Например, датчик выдаёт числа от 0 до 1000, а формула преобразует их в реальные литры топлива в баке
-
Для преобразования единиц измерения, например, перевод километров в мили или литров в галлоны
-
Для комбинирования данных, например, формула может применять значения из разных датчиков для новых показателей
В окне настройки датчика формулу применяют в специальном поле.
Формула применяется к данным сразу после их получения с датчика, до использования тарировочной таблицы.
|
Формула должна начинаться с одного из следующих знаков:
• арифметические знаки: +, -, *, /
• знак равенства: =
В формуле можно использовать:
• математические операции: сложение (+), вычитание (-), умножение (*), деление (/)
• круглые скобки ( ) для указания порядка действий
Простые формулы
Используются для простых операций, таких как умножение, деление, сложение и вычитание. Исходное значение датчика автоматически подставляется в формулу.
Рассмотрим пример применения формулы
Допустим, у нас есть датчик заряда батареи, который передаёт значение в милливольтах. В сырых точках найдём значение датчика: 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)
Например, нам нужно заменить запятые на точки в числах
=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))
|
Преобразование последовательности байт
(little endian в big endian)
|
=strtoupper(substr(unpack('H*',strrev(hex2bin(%value%)))[1],2,12)) — 1500000124286b01 → 6B2824010000
|
Деление на ноль
Когда в формуле присутствует деление, будьте внимательны с делителем — числом, на которое делят. Если делитель равен нулю, возникнет ошибка, так как деление на ноль математически невозможно.
Например, формула =1000/%DIN1% вызовет ошибку, если значение датчика DIN1 равно 0 или не определено.
В таком случае используйте условный оператор для проверки делителя: =(%DIN1%==0) ? 0 : 1000/%DIN1%. Система проверит условие: %DIN1% == 0 (равно ли значение DIN1 нулю). Если условие верно, результат будет 0. Если условие неверно, выполнятся деление 1000 на значение DIN1.
Когда применяете формулу, убедитесь, что формула корректно преобразует данные.
|
Проверяем работу формулы через кнопку «Тест»:
-
Нажмите на кнопку «Тест» в поле «Формула»
-
Система покажет значения, которые можно использовать для проверки формулы, указанной в обработчике. Вы можете выбрать готовые значения или ввести свои3. После этого нажмите кнопку «Тест» ещё раз, и система покажет результат применения формулы: правильный или неправильный

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