Формула вычисляемого параметра или возникновения события/аварии является математическим выражением в привычном понимании этого слова. В формуле допускаются арифметические и булевы операторы, скобки произвольной вложенности и функции. Допускается любое количество пробелов вокруг операторов, скобок и запятых. Исключения - не допускаются пробелы после имени функции и перед ее открывающей скобкой, например, в выражении abs(dM). Так же не допускаются пробелы внутри описания параметров, например, в выражении plc123.n2.integ(M1) пробелы не допускаются нигде.
Операндами являются вещественные константы и другие параметры с соблюдением формата написания. Так же для удобства введены константы "true" (равняется 1), "false" (равняется 0), "null" (равняется null). При задании числовых констант допускается шестнадцатеричная запись (удобно при работе с побитовыми операциями), например "0xFF".
Следует отличать null от 0 (число ноль). Число 0 является чётким конкретным нулевым значением. В то время как null отражает неизвестность значения. Как правило, null при вычислений формул возникает вследствие ссылки на устаревший параметр, но может возникнуть и по причине отсутствия данных в самом устройстве, о чём устройство явно сообщает во время сеанса связи.
Смысл null значений - их неизвестность. Если к неизвестности прибавить 1, то мы снова получим неизвестность. Т.е. null плюс что угодно тоже будет null. Все базовые арифметические операции (+, -, *, /) возвращают null, если хотя бы один из их операндов равняется null. Таким образом, параметр dt = t1 - t2 будет принимать значение null, пока t1 или t2 равны null (то есть устарели). Только когда и t1, и t2 примут какое-то конкретное значение (с учетом их 2х-часового устаревания), параметр dt примет значение их разности.
Описание операторов «Редактора формул»
Арифметические операторы
+, -, *, / Если любой из операндов null, результат будет null. Деление на ноль так же вернет null. Плюс и минус могут быть как бинарными (к примеру, t1+t2), так и унарными (к примеру, +Q или -M1). |
Операторы сравнения
<, <=, >, >=, =, ==, <>, != = и == означают проверку на равенство. <> и != означают проверку на неравенство. Если любой из операндов null, результат будет null. В частности, code = null или code <> null всегда вернут null, чему бы ни равнялся code. Операторы сравнения делают поправку на приближенность арифметики с плавающей точкой, используемой в приборах и на сервере. Поправка заключается в том, что значения, находящиеся в пределах 10-8 друг от друга, считаются равными. |
Логические операторы
AND, OR, XOR, NOT, !, &&, ||, ^^ AND, && - логическое И. Возвращает 1, когда оба операнда не равны 0 и не являются null. Если один из операндов равен 0, возвращает 0, даже если другой операнд является null. OR, || - логическое ИЛИ. Возвращает 1, когда хотя бы один из операндов (или оба) не равны 0 и не являются null. Если один из операндов равен 1, возвращает 1 даже если другой операнд является null. XOR, ^^ - логическое исключающее ИЛИ. Возвращает 1, когда один операнд равен 0, а другой не равен 0. Возвращает null, когда хотя бы один операнд является null. NOT, ! - логическое отрицание. Возвращает 1, когда операнд равен 0 и возвращает 0, когда операнд не равен 0. Если операнд является null, возвращает null. Неравенство/равенство операндов нулю так же проверяется с учетом возможных люфтов на ±10-8. То есть величина -3*10-9 во всех логических операциях будет считаться равной нулю. |
Побитовые операторы
&, |, ^, <<, >>, ~ Все побитовые операции округляют свои аргументы до 64-битного целого. & - побитовое "И". Например, проверка на то, что в третьем бите параметра status находится |
Условные операторы
a ? b : c Тернарный оператор со смыслом аналогичным функции if(a, b, c). Выражение a должно принимать значение true или false. |
Приоритет операторов
not, !, +, - (унарные) *, / +, - (бинарные) <, <=, >, >=, >, =, ==, <>, != and, &, &&, xor, ^, ^^ or, |, || ?: Чем выше, тем раньше вычисляется. Операторы на одной строке вычисляются слева направо в порядке их следования в выражении. |
Описание функций, используемых в «Редакторе формул»
abs(x) if(a, b, c) zn(x) isn(x) zn_sum(x1, x2, ...., xn) zn_avg(x1, x2, ..., xn) round(a, b) date_part(ts, part) pow(a, b) min(x1, x2, ..., xn) max(x1, x2, ..., xn) int(x, bytes) uint(x, bytes) select(a, x1, y1, x2, y2, ..., xn, yn) lerp(x, x1, y1, x2, y2, ..., xn, yn) |
Использование параметров времени в формулах описано в разделе Параметры времени в формулах данного руководства.
Данный раздел руководства необходимо читать совместно с разделом Составные параметры.