Passa al contenuto principale

Esempio 12 - Scalatura non lineare dei valori

Compito​

Un valore di un sensore deve essere elaborato all'interno di diversi intervalli di valori con scalature e offset diversi. In Python l'elaborazione può essere realizzata, ad esempio, come segue:

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

Soluzione​

1. Creazione di una tabella​

Si supponga che la seguente tabella sia creata con il tag di risorsa "Tabelle":

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

2. Implementazione nel testo della formula​

_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;

Funzioni utilizzate​

Spiegazione​

La tabella viene letta riga per riga. Le righe vuote o quelle che iniziano con 3 caratteri "linea" uguali (qui ad es. '---') vengono saltate. Le righe vengono suddivise in corrispondenza del separatore definito (vedere colSep), private degli spazi superflui all'inizio e alla fine e interpretate come Variant. La prima riga fornisce i nomi delle colonne (= campi). Tutte le righe successive contengono gli elementi di dati da confrontare o leggere.

Questa preparazione avviene una sola volta con una funzione selectRow() nel testo della formula; successivamente la tabella è disponibile con il nome indicato a tutte le altre funzioni. L'indicazione del separatore di colonna colSep: ';' è opzionale. Per impostazione predefinita vengono accettati, come espressione regolare, una singola virgola, un punto e virgola, una tabulazione o '|'. Anche l'indicazione di anyKey è opzionale e designa una voce della tabella (testo) che corrisponde a qualsiasi valore chiave fornito.

Con selectRow() viene ora cercata nella tabella una riga adatta e il suo indice viene restituito come valore di risultato. A tale scopo il valore chiave (qui _sensor) viene cercato nel campo definito tramite key. Poiché in caso di variazione dei valori chiave la ricerca avviene riga per riga dall'alto verso il basso, le voci devono essere ordinate in modo crescente.

Con la funzione getField() vengono letti dalla stessa tabella i valori corrispondenti dalla colonna indicata (field).