Bloc système

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.

CMP (==, <>, <, >, <=, >=)MOVEMOVE_BLK

À 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ètreTypeRôle
IN1selon typePremière valeur à comparer
IN2selon typeSeconde valeur à comparer, même type que IN1
sortieBOOLVRAI si la relation choisie est vérifiée
Quand l’utiliserTester le franchissement d'un seuil, valider qu'une valeur reste dans une plage (deux comparateurs combinés), déclencher une alarme de dépassement.
PiègeComparer deux REAL avec une égalité stricte (==) est risqué : les arrondis en virgule flottante font qu'un calcul censé donner exactement une valeur tombe en réalité à quelques millièmes près. Préférer un test de plage — ABS(x − cible) < tolérance — plutôt qu'une égalité exacte.

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ètreTypeRôle
INselon typeValeur source
OUT1selon typeVariable de destination
Quand l’utiliserÉcrire une consigne fixe dans une variable, recopier une valeur lue vers une variable de travail avant de la modifier, initialiser un paramètre au démarrage.

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ètreTypeRôle
INARRAYTableau source
COUNTUDINTNombre d'éléments à copier
OUTARRAYTableau destination
Quand l’utiliserCopier un tableau de mesures vers un buffer d'historique, dupliquer une recette de production dans une zone de travail avant de la modifier sans toucher à l'original.
PiègeCOUNT n'est pas vérifié par rapport à la taille réelle du tableau destination à la compilation. Un COUNT trop grand écrit au-delà de la zone allouée et peut provoquer un arrêt CPU (STOP sur erreur d'accès mémoire) à l'exécution — toujours borner COUNT à la taille du plus petit des deux tableaux.

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
CONT ou SCL ?La mise à l’échelle est plus lisible en SCL. L’usage courant est d’écrire ce bloc en SCL et de l’appeler depuis le programme CONT. La version CONT existe pour les sites où le SCL n’est pas autorisé.
Code non validé sur installationGénéré depuis la documentation. À confirmer sur matériel avant mise en production.

Les pièges

Une plage se teste avec deux comparateurs, pas un seulVé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 typeCopier 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.

À propos de cette page Cette page est générée depuis des fiches de données structurées, pas écrite à la main — voir la maquette interactive pour naviguer parmi tous les guides.