Aller au contenu principal

Exemple 12 - Mise à l'échelle non linéaire des valeurs

Tâche​

Une valeur de capteur doit être traitée dans différentes plages de valeurs avec différentes mises à l'échelle et différents décalages. En Python, le traitement peut par exemple être réalisé comme suit :

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

Solution​

1. Création d'un tableau​

Le tableau suivant est supposé créé sous le tag de ressource « Tabelle » :

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

2. Implémentation dans la formule​

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

Fonctions utilisées​

Explication​

Le tableau est lu ligne par ligne. Les lignes vides ou celles qui commencent par 3 caractères de « ligne » identiques (ici par exemple '---') sont ignorées. Les lignes sont découpées au séparateur défini (voir colSep), débarrassées des espaces superflus au début et à la fin, et interprétées comme Variant. La première ligne fournit les désignations des colonnes (= champs). Toutes les autres lignes fournissent les éléments de données à comparer ou à lire.

Cette préparation n'a lieu qu'une seule fois, avec une fonction selectRow() dans la formule ; ensuite, le tableau est disponible sous le nom donné pour toutes les autres fonctions. L'indication du séparateur de colonnes colSep: ';' est facultative. Par défaut, une expression régulière accepte une virgule, un point-virgule, une tabulation ou '|' isolés. L'indication de anyKey est elle aussi facultative et désigne une entrée de tableau (texte) qui correspond à n'importe quelle valeur de clé proposée.

Avec selectRow(), une ligne correspondante est maintenant recherchée dans le tableau et son index est renvoyé comme valeur de résultat. Pour cela, la valeur de clé (ici _sensor) est recherchée dans le champ défini au moyen de key. Comme la recherche s'effectue ligne par ligne, de haut en bas, lorsque les valeurs de clé changent, les entrées doivent être classées par ordre croissant.

Au moyen de la fonction getField(), les entrées correspondantes de la colonne désignée (field) sont lues dans le même tableau.