Opérations de Comparaison
Logique de décision & Plages
La comparaison de valeurs est le moteur de la logique décisionnelle industrielle. Maîtrisez les comparateurs standard, les tests de plage et les vérifications de validité.
Que sont les opérations de comparaison dans TIA Portal ?
Les opérations de comparaison permettent de comparer deux valeurs de même type de données (Entiers, Réels, Temps, etc.) ou de vérifier si une valeur se situe à l'intérieur ou à l'extérieur d'une plage définie. Elles sont fondamentales pour créer des seuils d'alarme, des conditions de transition et des boucles de régulation.
TIA Portal propose des comparateurs standard (==, <>, >=, etc.), des instructions de plage (IN_Range, OUT_Range), des tests de validité pour les nombres flottants et des instructions avancées pour les types de données Variant et les pointeurs DB.
Comparateurs Standard
Évaluation de l'égalité et des inégalités entre deux opérandes
CMP == — Égal (Equal)
==Ce qu'il fait
Compare deux opérandes (IN1 et IN2). Si IN1 est égal à IN2, l'instruction renvoie TRUE. Elle supporte presque tous les types de données simples.
Quand l'utiliser
Vérifier si un compteur a atteint sa cible, si une consigne IHM correspond à la valeur actuelle, ou si un état machine spécifique est actif.
Conseils Pro
Attention avec les types Real : l'égalité stricte peut échouer à cause de la précision. Préférez une marge ou une plage.
En SCL : IF value1 = value2 THEN ...
Vous pouvez comparer des chaînes de caractères (String) pour vérifier des codes d'identification.
CMP <> — Inégal (Not equal)
<>Ce qu'il fait
Renvoie TRUE si les deux opérandes IN1 et IN2 sont différents. C'est l'inverse de l'égalité.
Quand l'utiliser
Détecter un changement de valeur, s'assurer qu'un capteur ne renvoie pas 0, ou vérifier qu'un mode de marche n'est pas celui interdit.
Conseils Pro
Souvent utilisé pour déclencher une action dès qu'une valeur s'écarte de sa consigne.
En SCL : IF value1 <> value2 THEN ...
Peut être utilisé pour comparer des horodatages (DTL) afin de voir si une date a changé.
CMP >= — Supérieur ou égal
>=Ce qu'il fait
Renvoie TRUE si la première valeur (IN1) est supérieure ou égale à la seconde (IN2).
Quand l'utiliser
Déclencher une alarme de niveau haut, autoriser une chauffe tant qu'une température n'est pas atteinte.
Conseils Pro
Idéal pour les seuils de sécurité où la valeur limite doit être incluse dans la condition.
En SCL : IF level >= setpoint THEN ...
Peut être utilisé avec des types Time pour vérifier si une durée minimale est écoulée.
CMP <= — Inférieur ou égal
<=Ce qu'il fait
Renvoie TRUE si IN1 est inférieur ou égal à IN2.
Quand l'utiliser
Surveillance de niveau bas, arrêt d'une pompe, validation d'une pression minimale.
Conseils Pro
Souvent couplé à une hystérésis pour éviter les battements de sortie.
Fonctionne nativement avec les types Date et Time.
En SCL : IF pressure <= min_limit THEN ...
CMP > — Supérieur (Greater than)
>Ce qu'il fait
Renvoie TRUE si IN1 est strictement supérieur à IN2.
Quand l'utiliser
Comparaison stricte ne devant pas inclure la valeur cible.
Conseils Pro
Moins utilisé que >= en automatisme, mais utile pour les algorithmes mathématiques.
En SCL : IF current > max THEN ...
Préférable pour les comparaisons d'index de boucles (FOR).
CMP < — Inférieur (Less than)
<Ce qu'il fait
Renvoie TRUE si IN1 est strictement inférieur à IN2.
Quand l'utiliser
Tests de bornes inférieures strictes.
Conseils Pro
Utile pour vérifier si une valeur est 'dans le négatif' (val < 0).
En SCL : IF val < 0 THEN ...
Fonctionne avec les caractères (tri alphabétique).
Opérations de Plage
Vérification de l'appartenance à un intervalle [MIN..MAX]
IN_Range — Dans la plage
IN_RangeCe qu'il fait
Vérifie si une valeur (VAL) se trouve entre une borne minimale (MIN) et une borne maximale (MAX). L'intervalle est fermé : MIN <= VAL <= MAX.
Quand l'utiliser
Surveillance de fenêtre de fonctionnement (ex: pression entre 2 et 5 bars), validation de vitesse machine.
Conseils Pro
Remplace avantageusement deux comparateurs mis en série, rendant le réseau plus lisible.
Si MIN > MAX, l'instruction renvoie toujours FALSE.
Très utile pour les 'Ready to Run' qui exigent plusieurs conditions analogiques.
OUT_Range — Hors plage
OUT_RangeCe qu'il fait
Renvoie TRUE si la valeur (VAL) est à l'extérieur de l'intervalle défini par MIN et MAX. Soit VAL < MIN, soit VAL > MAX.
Quand l'utiliser
Détection d'anomalie ou de dépassement de seuils extrêmes (alarme de plage).
Conseils Pro
C'est l'inverse exact de IN_Range.
Utilisez-le pour simplifier la logique d'alarme de process.
En SCL : res := (val < min) OR (val > max);
Tests de Validité
Vérification de l'intégrité des nombres à virgule flottante
|OK| — Vérifier validité
|OK|Ce qu'il fait
Vérifie si une valeur flottante (Real ou LReal) est un nombre valide. Renvoie FALSE si la valeur est NaN (Not a Number) ou Inf (Infini).
Quand l'utiliser
Après des calculs complexes (divisions, racines carrées, log) pour éviter de propager des erreurs mathématiques qui pourraient arrêter le PLC.
Conseils Pro
Indispensable avant d'envoyer une valeur Real vers une sortie analogique ou un variateur.
Permet de détecter une division par zéro indirecte.
Pratique pour filtrer les retours de capteurs défaillants.
|NOT_OK| — Vérifier invalidité
|NOT_OK|Ce qu'il fait
Renvoie TRUE si la valeur flottante est invalide (NaN ou Inf).
Quand l'utiliser
Déclencher un bit de défaut de calcul ou forcer une valeur de repli.
Conseils Pro
Utilisez-le pour mettre votre machine en sécurité si un calcul de trajectoire échoue.
C'est l'équivalent de IS_NAN dans d'autres langages.
En SCL : IF NOT OK(value) THEN ...
Comparaisons avancées (Variant)
Instructions pour la programmation dynamique et les types complexes
EQ_Type / NE_Type
Ce qu'il fait
Compare le type de données d'une variable de type Variant avec celui d'une autre variable ou d'un type défini.
Quand l'utiliser
Dans des blocs génériques qui doivent traiter différents types de données (ex: un bloc de log acceptant Int ou Real).
Conseils Pro
Essentiel pour la programmation orientée objet et les bibliothèques réutilisables.
Permet de sécuriser les accès mémoire dynamiques.
Utilisé avec l'instruction VariantGet.
IS_NULL / NOT_NULL
Ce qu'il fait
Vérifie si un pointeur (Variant ou DB_ANY) est nul (ne pointe vers rien).
Quand l'utiliser
Éviter les erreurs d'accès lors de l'utilisation de DB adressés indirectement.
Conseils Pro
Toujours tester NOT_NULL avant d'appeler une méthode ou de lire une donnée via un pointeur.
Équivalent de l'objet 'Nothing' ou 'null' en C#/Java.
Indispensable pour la gestion de listes chaînées ou de structures dynamiques en PLC.
IS_ARRAY
Ce qu'il fait
Vérifie si une variable Variant pointe vers un tableau (Array).
Quand l'utiliser
Programmation de fonctions de traitement par lots ou de buffers de données.
Conseils Pro
Couplez-le avec CountOfElements pour connaître la taille du tableau.
Permet de créer des fonctions de tri universelles.
Fonctionne aussi pour les tableaux de structures (UDT).
Comparaison des comparateurs — Lequel utiliser ?
Choisir la bonne instruction pour votre logique PLC
| Vous voulez... | Utilisez ceci | Exemple |
|---|---|---|
| Tester l'égalité exacte | CMP == | Code produit correct |
| Seuil de sécurité haut | CMP >= | Pression > 10 bar |
| Maintenir dans une zone | IN_Range | Température entre 18 et 24°C |
| Surveiller les erreurs Real | |OK| | Vérifier résultat division |
| Vérifier un pointeur DB | NOT_NULL | DB de recette chargé |
| Vérifier un type Variant | EQ_Type | L'entrée est bien de l'Int |
Foire Aux Questions
Pourquoi ma comparaison == échoue-t-il parfois avec des nombres Real ?
Les nombres Real (flottants) ont une précision limitée. Un calcul peut donner 10.000001 au lieu de 10.0. Utilisez toujours IN_Range avec une petite tolérance (ex: entre 9.99 et 10.01) pour comparer des valeurs flottantes.
Quelle est la différence entre IN_Range et deux comparateurs mis en série ?
Fonctionnellement, c'est identique. Cependant, IN_Range est plus compact graphiquement, plus facile à lire et plus performant car le PLC traite l'instruction en une seule étape.
À quoi servent les instructions |OK| et |NOT_OK| ?
Elles servent à détecter les erreurs 'silencieuses' des calculs Real. Si vous faites une racine carrée d'un nombre négatif, le résultat est NaN. Sans le test |OK|, ce NaN va polluer tous vos autres calculs et peut provoquer un arrêt du CPU.
Peut-on comparer des structures complètes (UDT) ?
L'instruction CMP == ne permet pas de comparer directement deux structures. Vous devez comparer chaque membre individuellement ou utiliser un bloc spécifique qui compare les zones mémoire.