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 de déclaration en tant qu'objet DUT :
TYPE <name>: <Inttype> (<ug>..<og>) END_TYPE;
|
identificateur IEC valide |
|
type de données, parmi les suivants : SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD) |
|
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. |
|
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. |
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).
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 .
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 | |
---|---|
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
.