TDASTag.Formula
| TDASTagEdit = class (TDASTag) | Interface de TDASTagEdit | Exemples de TDASTagEdit |
héritée de TDASTag.Formula
| TDASTag = class (TObject) | Interface de TDASTag | Exemples de TDASTag |
Qubes Expert v5 Formule de calcul en notation RPN (Reverse Polish Notation) appliquée au tag
Syntaxe
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 + DI2 | TAG:DI1;TAG:DI2;ADD |
DI1 * 2 | TAG:DI1;VAL:2;MUL |
(DI1 + DI2) / 2 | TAG: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érande | Description |
|---|---|
TAG:DI1 | Valeur courante du tag DI1 |
TAG:DI2 | Valeur courante du tag DI2 |
TAGOV:DI1 | Valeur précédente du tag DI1 |
VAL:100 | La constante 100 |
VAL:3.14 | La constante 3.14 |
VAL:0 | La constante 0 |
Opérateurs arithmétiques
| Opérateur | Description | Opérandes | Résultat |
|---|---|---|---|
ADD | Addition (a + b) | 2 | Numérique |
SUB | Soustraction (a - b) | 2 | Numérique |
MUL | Multiplication (a * b) | 2 | Numérique |
DIV | Division (a / b) | 2 | Numérique |
MIN | Minimum de deux valeurs | 2 | Numérique |
MAX | Maximum de deux valeurs | 2 | Numérique |
Opérateurs d'agrégation
| Opérateur | Description | Opérandes | Résultat |
|---|---|---|---|
SUM | Somme de toutes les valeurs restantes sur la pile | Toute la pile | Numérique |
AVG | Moyenne de toutes les valeurs restantes sur la pile | Toute la pile | Numérique |
Opérateurs de comparaison
| Opérateur | Description | Opérandes | Résultat |
|---|---|---|---|
EQ | Egal (a = b) | 2 | Booléen |
SUP | Supérieur (a > b) | 2 | Booléen |
SUPEQ | Supérieur ou égal (a >= b) | 2 | Booléen |
INF | Inférieur (a < b) | 2 | Booléen |
INFEQ | Inférieur ou égal (a <= b) | 2 | Booléen |
Opérateurs logiques (booléens)
| Opérateur | Description | Opérandes | Résultat |
|---|---|---|---|
AND | ET logique (a ET b) | 2 | Booléen |
OR | OU logique (a OU b) | 2 | Booléen |
NOT | NON logique (NON a) | 1 | Boolé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 tag | Comportement |
|---|---|
| Adresse seule (Formula vide) | Valeur lue depuis le driver (hardware, MQTT, OPC...) |
| Formule seule (Address vide) | Valeur calculée par la formule RPN |
| Adresse + Formule | Seule la formule est utilisée, l'adresse est ignorée |
| Ni l'un ni l'autre | Tag inactif (aucune valeur produite) |
L'ordre d'évaluation à chaque cycle est :
- Le driver lit les valeurs de tous les tags qui n'ont pas de formule (tags adresse)
- 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 valeur0est utilisée par défaut (le résultat reste valide).
Résumé rapide
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) :
2. Multiplier un tag par une constante
Appliquer un facteur d'échelle (ex : convertir des mV en V en divisant par 1000) :
Multiplier par un coefficient :
3. Somme de deux tags
4. Moyenne de plusieurs tags
L'opérateur AVG consomme toutes les valeurs présentes sur la pile et retourne leur moyenne.
5. Somme de plusieurs tags
L'opérateur SUM consomme toutes les valeurs présentes sur la pile.
6. Minimum / Maximum entre deux tags
7. Seuil / comparaison (résultat booléen)
Tester si DI1 dépasse 100 :
Tester si DI1 est égal à DI2 :
8. Combinaison de conditions logiques
Tester si DI1 > 50 ET DI2 < 100 :
Déroulé pas à pas :
| Etape | Instruction | Pile |
|---|---|---|
| 1 | TAG:DI1 | DI1 |
| 2 | VAL:50 | DI1, 50 |
| 3 | SUP | vrai/faux |
| 4 | TAG:DI2 | vrai/faux, DI2 |
| 5 | VAL:100 | vrai/faux, DI2, 100 |
| 6 | INF | vrai/faux, vrai/faux |
| 7 | AND | résultat |
9. Inverser un booléen
10. Transformation linéaire (mise à l'échelle avec offset)
Appliquer y = a * x + b (ex : a=2.5, b=10) :
11. Pourcentage d'une valeur par rapport à un total
Calculer DI1 en pourcentage de DI2 :
12. Taux de variation (%)
Calculer le taux de variation du tag DI1 entre deux cycles :
13. Consommation entre deux relevés (compteur)
Calculer la consommation = compteur actuel - compteur précédent :
14. Somme pondérée
Calculer DI1 * 0.7 + DI2 * 0.3 :
Déroulé :
| Etape | Instruction | Pile |
|---|---|---|
| 1 | TAG:DI1 | DI1 |
| 2 | VAL:0.7 | DI1, 0.7 |
| 3 | MUL | DI1*0.7 |
| 4 | TAG:DI2 | DI1*0.7, DI2 |
| 5 | VAL:0.3 | DI1*0.7, DI2, 0.3 |
| 6 | MUL | DI1*0.7, DI2*0.3 |
| 7 | ADD | DI1*0.7 + DI2*0.3 |
15. Condition logique complexe (OU)
Tester si DI1 > 100 OU DI2 < 0 :