TDASTag.Formula

TDASTag = class (TObject)Interface de TDASTagExemples de TDASTag

Qubes Expert v5 Formule de calcul en notation RPN (Reverse Polish Notation) appliquée au tag

Syntaxe

property Formula: String read FFormula

Remarques

La propriété Formula permet de définir une formule de calcul en notation polonaise inverse (RPN - Reverse Polish Notation). En RPN, les opérandes sont placés avant l'opérateur.

Les éléments de la formule sont séparés par des points-virgules (;) sans espace.

Notation infixe vs RPN

Expression classique (infixe)Formule RPN
DI1 + DI2TAG:DI1;TAG:DI2;ADD
DI1 * 2TAG:DI1;VAL:2;MUL
(DI1 + DI2) / 2TAG:DI1;TAG:DI2;ADD;VAL:2;DIV

Opérandes

Référence à un tag (valeur courante)

TAG:NomDuTag

Empile la valeur courante du tag. Si le tag n'est pas trouvé ou si sa qualité est mauvaise, le résultat de la formule sera marqué comme invalide.

Référence à la valeur précédente d'un tag

TAGOV:NomDuTag

Empile la valeur précédente (Old Value) du tag, c'est-à-dire la valeur qu'il avait au cycle de calcul précédent. Si la valeur précédente n'existe pas, la valeur 0 est utilisée par défaut.

Constante numérique

VAL:nombre

Empile une valeur numérique littérale. Le séparateur décimal est le point.

OpérandeDescription
TAG:DI1Valeur courante du tag DI1
TAG:DI2Valeur courante du tag DI2
TAGOV:DI1Valeur précédente du tag DI1
VAL:100La constante 100
VAL:3.14La constante 3.14
VAL:0La constante 0

Opérateurs arithmétiques

OpérateurDescriptionOpérandesRésultat
ADDAddition (a + b)2Numérique
SUBSoustraction (a - b)2Numérique
MULMultiplication (a * b)2Numérique
DIVDivision (a / b)2Numérique
MINMinimum de deux valeurs2Numérique
MAXMaximum de deux valeurs2Numérique

Opérateurs d'agrégation

OpérateurDescriptionOpérandesRésultat
SUMSomme de toutes les valeurs restantes sur la pileToute la pileNumérique
AVGMoyenne de toutes les valeurs restantes sur la pileToute la pileNumérique

Opérateurs de comparaison

OpérateurDescriptionOpérandesRésultat
EQEgal (a = b)2Booléen
SUPSupérieur (a > b)2Booléen
SUPEQSupérieur ou égal (a >= b)2Booléen
INFInférieur (a < b)2Booléen
INFEQInférieur ou égal (a <= b)2Booléen

Opérateurs logiques (booléens)

OpérateurDescriptionOpérandesRésultat
ANDET logique (a ET b)2Booléen
OROU logique (a OU b)2Booléen
NOTNON logique (NON a)1Booléen

Priorité entre Formula et Address

Un tag DAS possède deux propriétés pour déterminer sa valeur : TagAddress (adresse matérielle lue par le driver) et Formula (formule RPN de calcul). Ces deux mécanismes sont exclusifs :

Configuration du tagComportement
Adresse seule (Formula vide)Valeur lue depuis le driver (hardware, MQTT, OPC...)
Formule seule (Address vide)Valeur calculée par la formule RPN
Adresse + FormuleSeule la formule est utilisée, l'adresse est ignorée
Ni l'un ni l'autreTag inactif (aucune valeur produite)

L'ordre d'évaluation à chaque cycle est :

  1. Le driver lit les valeurs de tous les tags qui n'ont pas de formule (tags adresse)
  2. Les formules sont ensuite évaluées : elles peuvent référencer les valeurs lues à l'étape 1 via TAG:NomDuTag

Ainsi, les tags "formule" servent à produire des valeurs dérivées à partir des tags "adresse" (données brutes du terrain).

Qualité des données

Le système propage automatiquement la qualité des données :

  • Si un tag référencé par TAG: a une qualité mauvaise (ex : capteur en défaut), le résultat de la formule entière est marqué comme invalide.
  • Si un tag référencé par TAGOV: n'a pas de valeur précédente, la valeur 0 est utilisée par défaut (le résultat reste valide).

Résumé rapide

Opérandes :
  TAG:nom      -> valeur courante du tag
  TAGOV:nom    -> valeur précédente du tag
  VAL:nombre   -> constante numérique

Arithmétique : ADD  SUB  MUL  DIV  MIN  MAX
Agrégation   : SUM  AVG
Comparaison  : EQ  SUP  SUPEQ  INF  INFEQ
Logique      : AND  OR  NOT

Séparateur   : ;  (point-virgule, sans espace)

Exemples

1. Différence entre valeur courante et valeur précédente

Calculer la variation d'un tag entre deux cycles (utile pour les compteurs) :

TAG:DI1;TAGOV:DI1;SUB
Résultat = DI1(courant) - DI1(précédent)

2. Multiplier un tag par une constante

Appliquer un facteur d'échelle (ex : convertir des mV en V en divisant par 1000) :

TAG:DI1;VAL:1000;DIV
Résultat = DI1 / 1000

Multiplier par un coefficient :

TAG:DI1;VAL:2.5;MUL
Résultat = DI1 * 2.5

3. Somme de deux tags

TAG:DI1;TAG:DI2;ADD
Résultat = DI1 + DI2

4. Moyenne de plusieurs tags

TAG:DI1;TAG:DI2;TAG:DI3;AVG
Résultat = (DI1 + DI2 + DI3) / 3

L'opérateur AVG consomme toutes les valeurs présentes sur la pile et retourne leur moyenne.

5. Somme de plusieurs tags

TAG:DI1;TAG:DI2;TAG:DI3;TAG:DI4;SUM
Résultat = DI1 + DI2 + DI3 + DI4

L'opérateur SUM consomme toutes les valeurs présentes sur la pile.

6. Minimum / Maximum entre deux tags

TAG:DI1;TAG:DI2;MIN
Résultat = le plus petit entre DI1 et DI2
TAG:DI1;TAG:DI2;MAX
Résultat = le plus grand entre DI1 et DI2

7. Seuil / comparaison (résultat booléen)

Tester si DI1 dépasse 100 :

TAG:DI1;VAL:100;SUP
Résultat = vrai si DI1 > 100, faux sinon

Tester si DI1 est égal à DI2 :

TAG:DI1;TAG:DI2;EQ
Résultat = vrai si DI1 = DI2

8. Combinaison de conditions logiques

Tester si DI1 > 50 ET DI2 < 100 :

TAG:DI1;VAL:50;SUP;TAG:DI2;VAL:100;INF;AND

Déroulé pas à pas :

EtapeInstructionPile
1TAG:DI1DI1
2VAL:50DI1, 50
3SUPvrai/faux
4TAG:DI2vrai/faux, DI2
5VAL:100vrai/faux, DI2, 100
6INFvrai/faux, vrai/faux
7ANDrésultat

9. Inverser un booléen

TAG:DI1;VAL:0;SUP;NOT
Résultat = NON (DI1 > 0), c'est-à-dire vrai si DI1 <= 0

10. Transformation linéaire (mise à l'échelle avec offset)

Appliquer y = a * x + b (ex : a=2.5, b=10) :

TAG:DI1;VAL:2.5;MUL;VAL:10;ADD
Résultat = DI1 * 2.5 + 10

11. Pourcentage d'une valeur par rapport à un total

Calculer DI1 en pourcentage de DI2 :

TAG:DI1;TAG:DI2;DIV;VAL:100;MUL
Résultat = (DI1 / DI2) * 100

12. Taux de variation (%)

Calculer le taux de variation du tag DI1 entre deux cycles :

TAG:DI1;TAGOV:DI1;SUB;TAGOV:DI1;DIV;VAL:100;MUL
Résultat = ((DI1_courant - DI1_précédent) / DI1_précédent) * 100

13. Consommation entre deux relevés (compteur)

Calculer la consommation = compteur actuel - compteur précédent :

TAG:DI1;TAGOV:DI1;SUB
Résultat = la quantité consommée depuis le dernier relevé

14. Somme pondérée

Calculer DI1 * 0.7 + DI2 * 0.3 :

TAG:DI1;VAL:0.7;MUL;TAG:DI2;VAL:0.3;MUL;ADD

Déroulé :

EtapeInstructionPile
1TAG:DI1DI1
2VAL:0.7DI1, 0.7
3MULDI1*0.7
4TAG:DI2DI1*0.7, DI2
5VAL:0.3DI1*0.7, DI2, 0.3
6MULDI1*0.7, DI2*0.3
7ADDDI1*0.7 + DI2*0.3

15. Condition logique complexe (OU)

Tester si DI1 > 100 OU DI2 < 0 :

TAG:DI1;VAL:100;SUP;TAG:DI2;VAL:0;INF;OR
Résultat = vrai si DI1 > 100 ou DI2 < 0

Classification

Qubes Expert Qubes Expert DAS DAS.Kernel TDASTag