Comparaison et déplacement — CMP, MOVE, MOVE_BLK
Les briques les plus utilisées de tout programme automate — et les plus invisibles, parce qu'on ne les remarque que lorsqu'elles manquent.
À quoi ça sert
Contrairement aux temporisateurs ou aux compteurs, ces instructions n'ont pas d'instance : ce sont des opérations sans mémoire, exécutées à chaque cycle sur les valeurs présentes à leurs entrées. En SCL, la comparaison est même un opérateur du langage plutôt qu'un bloc séparé.
CMP (==, <>, <, >, <=, >=) — Comparaison de deux valeurs
Compare IN1 et IN2 (de même type) selon la relation choisie et renvoie un booléen. En CONT, c'est un contact à part entière, câblable comme n'importe quel autre. En SCL, ce n'est pas un bloc à appeler : c'est directement un opérateur dans une expression (IF x > seuil THEN …).
| Paramètre | Type | Rôle |
|---|---|---|
| IN1 | selon type | Première valeur à comparer |
| IN2 | selon type | Seconde valeur à comparer, même type que IN1 |
| sortie | BOOL | VRAI si la relation choisie est vérifiée |
MOVE — Transfert d'une valeur
Copie la valeur de IN vers OUT1. Le type de destination doit être compatible ; TIA effectue certaines conversions implicites (par exemple INT vers DINT) mais pas toutes — une conversion explicite (CONV) reste nécessaire dans les cas ambigus, comme vers REAL.
| Paramètre | Type | Rôle |
|---|---|---|
| IN | selon type | Valeur source |
| OUT1 | selon type | Variable de destination |
MOVE_BLK — Transfert d'un bloc de données (tableau)
Copie COUNT éléments consécutifs du tableau IN vers le tableau OUT, à partir du premier élément de chacun. Utile pour dupliquer un tableau entier sans écrire une boucle FOR élément par élément.
| Paramètre | Type | Rôle |
|---|---|---|
| IN | ARRAY | Tableau source |
| COUNT | UDINT | Nombre d'éléments à copier |
| OUT | ARRAY | Tableau destination |
Programmation
Réseau 1 — Comparaison de seuil ┌──────────────┐ │ > │ ──────┤ Real ├──────────────┬───( depassement ) │IN1 valeur│ │ │IN2 seuilHaut │ │ └──────────────┘ │ │ Réseau 2 — Recopie de la valeur au moment du dépassement depassement ┌──────────────┐ ────────┤ ├──────┤ MOVE │ IN─┤ valeur ├───[ valeurAuDepassement ] └──────────────┘
// Seuil haut sur une valeur de process, avec recopie de la valeur // courante dans une variable de travail au moment du dépassement. FUNCTION_BLOCK "FB_SeuilHaut" VAR_INPUT valeur : REAL; seuilHaut : REAL := 80.0; END_VAR VAR_OUTPUT depassement : BOOL; valeurAuDepassement : REAL; END_VAR BEGIN #depassement := #valeur > #seuilHaut; IF #depassement THEN #valeurAuDepassement := #valeur; // équivalent d'un MOVE END_IF; END_FUNCTION_BLOCK
Les pièges
| Une plage se teste avec deux comparateurs, pas un seul | Vérifier qu'une valeur reste « entre min et max » demande deux contacts CMP en série (x >= min ET x <= max), pas un bloc dédié à la plage — ce bloc n'existe pas nativement. |
|---|---|
| MOVE ne vérifie pas le dépassement de type | Copier un DINT trop grand vers un INT tronque silencieusement la valeur sans erreur visible. Vérifier la compatibilité des plages avant de câbler un MOVE entre deux types de tailles différentes. |
Sources
Documentation TIA Portal — instructions de comparaison et de déplacement (SIMATIC S7-1200/S7-1500), aide en ligne Siemens.
