Types de sous-zone

Présentation

Un type de sous-zone est un type défini par l'utilisateur dont la plage de valeurs correspond à un sous-ensemble du type de données de base. Vous pouvez aussi prévoir des vérifications implicites des limites de plage.

Vous pouvez soit effectuer la déclaration dans un objet DUT, soit déclarer une variable directement avec un type de sous-zone.

Syntaxe

Syntaxe de déclaration en tant qu'objet DUT :

TYPE <name>: <Inttype> (<ug>..<og>) END_TYPE;

<name>

identificateur IEC valide

<inttype>

type de données, parmi les suivants : SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD)

<ug>

constante, compatible avec le type de base, qui définit la limite inférieure des types de sous-zone

Cette limite inférieure est comprise dans la plage.

<og>

constante, compatible avec le type de base, qui définit la limite supérieure des types de sous-zone

Cette limite supérieure est comprise dans la plage.

Exemple

TYPE
 SubInt : INT (-4095..4095);
END_TYPE

Déclaration directe d'une variable avec un type de sous-zone

VAR
 i : INT (-4095..4095);
 ui : UINT (0..10000);
END_VAR

Un message s'affiche lorsqu'une valeur attribuée à un type de sous-zone (dans la déclaration ou l'implémentation) n'appartient pas à cette plage (i:=5000 dans l'exemple de déclaration ci-dessus, par exemple).

Fonctions de vérification des limites de plage

Pour surveiller les limites de plage des valeurs de type de sous-zone en cours d'exécution, vous devez ajouter les fonctions CheckRangeSigned, CheckLRangeSigned ou CheckRangeUnsigned, CheckLRangeUnsigned à l'application. Pour plus d'informations sur l'insertion de la fonction, consultez la description de la fonction POU pour vérifications implicites.

Cette fonction de vérification vise à traiter correctement les dépassements de sous-zone, en définissant un indicateur d'erreur ou en changeant la valeur, par exemple. La fonction est appelée implicitement après l'attribution d'une variable de type de sous-zone.

 AVERTISSEMENT
FONCTIONNEMENT INATTENDU DE L'ÉQUIPEMENT
Ne modifiez pas la partie déclaration d'une fonction de vérification implicite.
Le non-respect de ces instructions peut provoquer la mort, des blessures graves ou des dommages matériels.

Exemple

L'attribution d'une variable appartenant à un type de sous-zone signé implique d'appeler implicitement CheckRangeSigned. Cette fonction qui sert à limiter une valeur à la plage admise est implémentée par défaut comme suit :

Partie déclaration :

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
value, lower, upper: DINT;
END_VAR

Partie implémentation :

// Implicitly generated code : Only an Implementation suggestion
IF (value < lower) THEN
CheckRangeSigned := lower;
ELSIF(value > upper) THEN
CheckRangeSigned := upper;
ELSE
CheckRangeSigned := value;
END_IF

Sur appel, la fonction reçoit les paramètres d'entrée suivants :

  • value : valeur à attribuer au type de plage

  • lower : limite inférieure de la plage

  • upper : limite supérieure de la plage

Tant qu'elle appartient à la plage valide, la valeur attribuée est renvoyée par la fonction. Dans le cas contraire, c'est la limite supérieure ou inférieure de la plage qui est renvoyée, selon le dépassement détecté.

L'attribution i:=10*y est désormais remplacée implicitement par :

i := CheckRangeSigned(10*y, -4095, 4095);

Admettons que y soit égal à 1000. La variable i ne sera pas attribuée à 10*1 000=10 000 (comme avec l'implémentation d'origine), mais à la limite supérieure de la plage, soit 4 095.

Il en va de même pour la fonction CheckRangeUnsigned.

NOTE : si aucune des deux fonctions n'est présente, les types de sous-zone ne sont pas vérifiés en cours d'exécution. Vous pouvez alors attribuer la valeur DINT/UDINT de votre choix à une variable de type de sous-zone DINT/UDINT. Une valeur LINT/ULINT peut être attribuée à une variable de type de sous-zone LINT/ULINT.