Bloc système

Conversion et calcul — CONV, MOD, ADD/SUB/MUL/DIV

Les blocs qu'on utilise sans les nommer — convertir un type, calculer un reste, faire une addition — présents dans presque tout réseau d'un programme, et pourtant rarement expliqués pour eux-mêmes.

CONVMODADD, SUB, MUL, DIV

À quoi ça sert

Contrairement aux blocs des autres pages, ceux-ci n'ont pas d'instance : ce sont des opérations sans mémoire, recalculées à chaque cycle. NORM_X et SCALE_X, déjà vus dans les guides de raccordement analogique de ce site, appartiennent à la même famille — mise à l'échelle mise à part, ce sont les mêmes principes de conversion et de calcul qui reviennent partout ailleurs.

CONV — Conversion de type

Convertit IN d'un type vers un autre type de sortie OUT — par exemple INT_TO_REAL, DINT_TO_REAL, WORD_TO_INT. En SCL, chaque conversion est une fonction nommée explicitement ; en CONT, une seule boîte CONV où l'on choisit les deux types dans des listes déroulantes.

ParamètreTypeRôle
INtype sourceValeur à convertir
OUTtype destinationRésultat converti
Quand l’utiliserPresque systématique avant une mise à l'échelle NORM_X/SCALE_X, ou avant un calcul en virgule flottante sur une valeur entière lue depuis une trame IO-Link.
PiègeConvertir INT → REAL ne perd jamais d'information. L'inverse, REAL → INT, tronque ou arrondit selon le bloc exact utilisé (TRUNC coupe la partie décimale, ROUND arrondit) — vérifier lequel des deux est câblé avant de lui faire confiance dans un compteur d'itérations ou un calcul cumulatif, où l'écart s'accumule cycle après cycle.

MOD — Reste de la division entière (modulo)

OUT = reste de la division entière de IN1 par IN2. Fonctionne sur les types entiers (INT, DINT…), pas sur REAL.

ParamètreTypeRôle
IN1entierDividende
IN2entierDiviseur
OUTentierReste de la division IN1 / IN2
Quand l’utiliserCadencer une action toutes les N cycles sans mobiliser un temporisateur (par exemple rafraîchir un affichage tous les 10 cycles via un compteur de cycle % 10 = 0), ou boucler un index de tableau qui doit revenir à 0 après sa dernière valeur.
PiègeMOD par zéro déclenche une erreur d'exécution, exactement comme une division normale — si IN2 peut être une variable (et non une constante fixe), il faut le sécuriser avant l'appel.

ADD, SUB, MUL, DIV — Opérations arithmétiques de base

Les quatre opérations élémentaires. ADD et MUL acceptent en général plusieurs entrées (IN1…INn) sur une seule boîte en CONT ; SUB et DIV n'en ont que deux (IN1, IN2, dans cet ordre — IN1 − IN2 et IN1 / IN2).

ParamètreTypeRôle
IN1…INnselon typeOpérandes
OUTselon typeRésultat
Quand l’utiliserLa brique la plus fondamentale de tout programme — mise à l'échelle manuelle sans NORM_X/SCALE_X, cumul de production, calcul d'une moyenne glissante.
PiègeLe type de sortie doit pouvoir contenir le résultat. Un ADD sur INT qui dépasse 32767 déborde silencieusement — la CPU ne s'arrête pas et ne signale rien par défaut, elle continue avec une valeur fausse. Le bit ENO du bloc reste à VRAI même en cas de dépassement de plage sur certaines opérations ; seul un test de plage explicite sur le résultat protège contre ce cas.

Programmation

Réseau 1 — Cumul à chaque cycle
      ┌──────────────┐    ┌──────────────┐
      │     ADD      │    │     ADD      │
──────┤     DInt     ├────┤     DInt     ├──[ somme ]
      │IN1     somme │    │IN1 nbEchant. │
      │IN2    mesure │    │IN2         1 │
      └──────────────┘    └──────────────┘

Réseau 2 — Rafraîchissement tous les 10 cycles
      ┌──────────────┐    ┌──────────────┐
      │     MOD      │    │      ==      │
──────┤     DInt     ├────┤     DInt     ├──( rafraichir )
      │IN1 cptCycle  │    │IN1       ...│
      │IN2        10 │    │IN2         0 │
      └──────────────┘    └──────────────┘

Réseau 3 — Moyenne, si rafraîchissement dû
   rafraichir     ┌──────────────┐   ┌──────────────┐
────────┤ ├───────┤     CONV     ├───┤     DIV      ├──( moyenne )
                  │DInt →  Real  │   │IN1      somme│
                  │IN      somme │   │IN2 nbEchant. │
                  └──────────────┘   └──────────────┘
// Rafraîchit un accumulateur d'affichage tous les 10 cycles
// (MOD), et calcule sa moyenne glissante depuis la dernière
// remise à zéro (ADD + DIV, avec conversion CONV vers REAL).

FUNCTION_BLOCK "FB_MoyenneCyclique"
VAR_INPUT
    mesure       : INT;
END_VAR
VAR_OUTPUT
    moyenne      : REAL;
    rafraichir   : BOOL;
END_VAR
VAR
    compteurCycle : DINT;
    somme         : DINT;
    nbEchantillons: DINT;
END_VAR

BEGIN
    #compteurCycle := #compteurCycle + 1;
    #somme         := #somme + #mesure;
    #nbEchantillons:= #nbEchantillons + 1;

    #rafraichir := (#compteurCycle MOD 10 = 0);
    IF #rafraichir AND #nbEchantillons > 0 THEN
        #moyenne := DINT_TO_REAL(#somme) / DINT_TO_REAL(#nbEchantillons);
        #somme := 0; #nbEchantillons := 0;
    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

DIV par zéro arrête le programme, pas seulement le calculUne division (ou un MOD) par une variable qui peut valoir 0 doit être testée avant l'appel — sans quoi le bloc peut passer en erreur d'exécution et, selon la configuration de traitement d'erreurs de la CPU, provoquer un arrêt (STOP) plutôt qu'un simple résultat faux.
L'ordre des types compte dans une expression mixteMélanger INT et REAL dans une même expression sans conversion explicite est refusé à la compilation en SCL — ce qui évite l'erreur, mais surprend qui vient d'un langage où la conversion est implicite. En CONT, la boîte de calcul impose un type unique pour toutes ses entrées.

Sources

Documentation TIA Portal — instructions de conversion et de calcul (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.