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.
À 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ètre | Type | Rôle |
|---|---|---|
| IN | type source | Valeur à convertir |
| OUT | type destination | Résultat converti |
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ètre | Type | Rôle |
|---|---|---|
| IN1 | entier | Dividende |
| IN2 | entier | Diviseur |
| OUT | entier | Reste de la division IN1 / IN2 |
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ètre | Type | Rôle |
|---|---|---|
| IN1…INn | selon type | Opérandes |
| OUT | selon type | Résultat |
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
Les pièges
| DIV par zéro arrête le programme, pas seulement le calcul | Une 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 mixte | Mé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.
