1.3.1.1.10.10. Fórmulas en sensores.
Se pueden utilizar fórmulas para calcular los valores de los parámetros.
La fórmula puede comenzar con cualquier operando aritmético o signo "=".
Si la fórmula comienza con un operando aritmético, entonces se calcula el valor del parámetro.
En la Figura 1, la fórmula se utiliza para configurar el parámetro IN1.
El valor final del parámetro se calculará mediante la fórmula IN1 * 0,5.
Figura 1
En la Figura 2, al recibir el parámetro IN1, al sensor descrito se le asignará el valor calculado por la fórmula IN2 *+ 20.
Figura 2
• Fórmulas simples
Las fórmulas en los procesadores de datos se basan en la sintaxis del lenguaje PHP y se ejecutan en el servidor al procesar los datos para convertirlos al formato requerido.
La fórmula puede ser sencilla y comenzar directamente con el signo de la operación aritmética. Se admiten las operaciones sumar ( + ), restar ( - ), multiplicar ( * ), dividir ( / ) y también se admiten paréntesis para garantizar la secuencia correcta de operaciones.
Por ejemplo:
*10 - el valor original se multiplicará por 10
/1000 - el valor original se dividirá por 1000
/100+7: el valor original se dividirá entre 100 y se sumará 7 al resultado resultante
/100+(7*3-2)*4
Los datos de otros campos de datos, la velocidad y el número de satélites se pueden sustituir en la fórmula.
Para sustituir valores en una fórmula, deben estar encerrados entre %% caracteres de escape.
La variable utilizada para la velocidad es %S%
Para el número de satélites %P% o %satsinview%
Para la marca de tiempo Unix del paquete actual, use la variable %ts%
Para la marca de tiempo Unix del paquete anterior, la variable %ts1%. El valor del sensor de corriente se puede sustituir por la variable %valor%.
Para obtener la diferencia en segundos con respecto al paquete anterior, debe calcular %ts1%-%ts%
Para todos los demás valores, los nombres se toman del paquete del dispositivo tal como los envía el controlador.
Por ejemplo: %DIN1% %DIN2% %HDOP%
Ejemplo de fórmula con variables:
*%DIN1% - multiplica el valor original por el valor enviado en el campo DIN1
/%HDOP%: divide el valor original por el valor del campo HDOP
• Fórmulas complejas
Las fórmulas más complejas comienzan con el signo = y no utilizan el valor original. Pero se puede sustituir en la fórmula misma usando la variable %valor% o una variable con el nombre del campo.
Por ejemplo:
=(1+2) - el valor final será 3
=(7/%valor%) - el valor final será igual a 7 dividido por el valor inicial
Declaraciones condicionales
Las fórmulas pueden utilizar condiciones que proporcionan una lógica de cálculo ramificada según los valores de cualquier parámetro o resultado de las operaciones.
La notación para declaraciones condicionales se ve así: ¿condición? valor_si_yes: valor_si_no
Esta notación suele denominarse operador ternario.
Lógicamente esta expresión es idéntica a la expresión:
si la condición devuelve valor_si_sí, de lo contrario devuelve valor_si_no
Las condiciones pueden utilizar operadores de comparación igual a ( == ), mayor que ( > ), menor que ( < ), mayor o igual a ( >= ), menor o igual a ( <= ), no igual a ( != )
Por ejemplo:
- si el valor del campo DIN1 es 1 entonces el valor final será 22 en caso contrario el valor final será 33
=(%temperatura%>30)? %temp%*10: %temp%*20 - si el valor del campo temporal es mayor que 30, entonces el valor final será igual al valor del campo temporal multiplicado por 10; de lo contrario, el valor final será igual al valor del campo temporal multiplicado por 20
Funciones
Las fórmulas pueden utilizar algunas funciones PHP para transformar datos.
Estas son las funciones unpack, pack, array_sum, substr, round, hex2bin, dechex, hexdec, decbin, number_format, max, min, abs, str_replace, time, strrev, bytesrev, explode, sqrt, acos, asin, cos, sin, poder.
Los valores pasados y devueltos a estas funciones se pueden leer en la documentación de PHP
https://www.php.net/manual/ru/function.acos.php
Por ejemplo:
=substr("%FIELD%", 1, 2) - el valor final será igual a 2 caracteres de la cadena pasada al campo FIELD comenzando desde la posición 1
=redondo(%AIN1%/1000) - el valor final será igual al valor redondeado del cociente del valor del campo AIN1 dividido por 1000
División por 0
Para evitar resultados impredecibles al procesar los valores del sensor, debe evitar las variables como divisor o usar declaraciones condicionales para probar si son 0.
Por ejemplo:
=1000/%DIN1% - puede generar un error de cálculo si el valor del campo DIN1 no está definido o es igual a 0. En este caso, la fórmula debe reescribirse de la siguiente manera:
=(%DIN1%==0)? 0: 1000/%DIN1% - si el valor del campo DIN1 es 0, entonces el valor final es 0, de lo contrario el valor final es igual al cociente de 1000 dividido por el valor del campo DIN1
• Fórmula para convertir un número sin signo en un número con signo usando el ejemplo de Teltonics
Si un sensor de temperatura bluetooth conectado al Teltonika EYE Sensor envía una temperatura negativa,
entonces se puede transformar mediante la siguiente fórmula.
=((%BLE_T1%>3000)?((%BLE_T1%-65535)/100):(%BLE_T1%/100))
Ejemplo de sensor de temperatura con fórmula
• =bytesrev('%valor%')
Para invertir bytes hexadecimales, utilice la siguiente función bytesrev('%value%'):
Ejemplo
0123d848010000e5 -> e500000148d82301
• =strerev('%valor%')
Para invertir una cadena, utilice la siguiente función strrev('%value%'):
Ejemplo
0123d848010000e5 -> 5e000010848d3210
• =hexdec('%Param1%'): convierte un número de 16 dígitos a decimal.
Ejemplo:
PAram1=0A, en este caso la función devolverá el valor 10.
• =decbin('%Param1%') - convierte decimal a binario.
substr('%Data%',x,y) - busca una subcadena de longitud "y" en la cadena "Data" comenzando desde la posición "x"
Ejemplos:
Parámetro1=A6B1
substr(decbin(hexdec('%Param1%')),9,1), la fórmula devolverá el valor 0.
• =explotar(',','%valor%')[2]
explotar: divide una cadena usando un delimitador y devuelve una matriz de cadenas.
=explotar('delimitador','%valor%')[2]
delimitador - delimitador
El valor es la cadena que se va a dividir.