Saltar al contenido principal

Ejemplo 12 - Escalado no lineal de valores

Tarea​

Un valor de sensor debe procesarse dentro de distintos rangos de valores con distintos escalados y offsets. En Python, el procesamiento puede realizarse, por ejemplo, de la siguiente manera:

if raw <= 51:
processed = raw * 0.5
elif raw <= 66:
processed = raw * 1 + 0.33
elif raw <= 101:
processed = raw * 3 + 2.5
else:
processed = 0.0

Solución​

1. Creación de una tabla​

Supongamos que la siguiente tabla está creada con la etiqueta de recurso "Tabelle":

raw scale offset
0 2 0
51 0.5 0
66 1 0.33
101 3 2.5
999 1 0

2. Implementación en el texto de fórmulas​

_sensor = $'Your.Channel';

// select first row, where input value _sensor is less or equal value in key 'raw'
_idx = selectRow(_sensor, {table:'Tabelle', colSep:'[ \\t]+', key:'<=raw'});
_scale = getField(_idx, {table:'Tabelle', field:'scale'});
_offset = getField(_idx, {table:'Tabelle', field:'offset'});

processed = _sensor * _scale + _offset;

Funciones utilizadas​

Explicación​

La tabla se lee línea por línea. Se omiten las líneas vacías y las que comienzan con 3 caracteres de "línea" iguales (aquí, p. ej., '---'). Las líneas se dividen en el carácter separador definido (véase colSep), se les eliminan los espacios sobrantes al principio y al final y se interpretan como Variant. La primera línea proporciona los nombres de las columnas (= campos). Todas las demás líneas proporcionan los elementos de datos para comparar o leer.

Esta preparación se realiza una sola vez con una función selectRow() en el texto de fórmulas; después, la tabla queda disponible con el nombre dado para todas las demás funciones. La indicación del separador de columnas colSep: ';' es opcional. Por defecto se aceptan como expresión regular una única coma, punto y coma, tabulador o '|'. La indicación de anyKey es igualmente opcional y designa una entrada de la tabla (texto) que coincide con cualquier valor de clave ofrecido.

Con selectRow() se busca ahora en la tabla una línea adecuada y se devuelve su índice como valor de resultado. Para ello se busca el valor de clave (aquí _sensor) en el campo definido mediante key. Como la búsqueda, cuando cambian los valores de clave, se realiza línea por línea de arriba abajo, las entradas deben ordenarse de forma ascendente.

Con la función getField() se leen de la misma tabla las entradas correspondientes de la columna indicada (field).