POU : CheckBounds
La tâche de cette fonction de surveillance est de gérer de manière appropriée les violations de limites. Des exemples de réactions aux violations incluent la définition d'indicateurs d'erreur et la modification de la valeur de l'index de tableau. La vérification n'est effectuée que pour un index de tableau de variables. Un index de tableau constant incorrect provoque une erreur du compilateur. CODESYS appelle implicitement la fonction lorsque des valeurs sont affectées à un DÉPLOYER
variable.
Pour plus d'informations, consultez : Utiliser des blocs de construction pour les vérifications implicites, Utiliser des blocs de construction pour les vérifications implicites
Après avoir inséré la fonction, vous recevez le code généré automatiquement dans les parties de déclaration et d'implémentation. Voir ci-dessous.
Attention
Pour obtenir la fonctionnalité de surveillance des fonctions, ne modifiez pas la partie déclaration. Cependant, vous êtes autorisé à ajouter des variables locales.
Partie déclaration
// Automatisch erzeugter Code : NICHT EDITIEREN FUNCTION CheckBounds : DINT VAR_INPUT index, lower, upper: DINT; END_VAR
Mise en œuvre
// Automatisch erzeugter Code: Es handelt sich hierbei um einen Implementierungsvorschlag. IF index < lower THEN CheckBounds := lower; ELSIF index > upper THEN CheckBounds := upper; ELSE CheckBounds := index; END_IF (* It is also possible to set a breakpoint, log messages or e.g. to halt on an exception: Add CmpApp.library, SysExcept.library and SysTypes2_Itf as newest. Declaration: VAR _pApp : POINTER TO CmpApp.APPLICATION; _result : SysTypes.RTS_IEC_RESULT; END_VAR Implementation: _pApp := AppGetCurrent(pResult:=_result); IF index < lower THEN CheckBounds := lower; IF _pApp <> 0 THEN AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS); END_IF ELSIF index > upper THEN CheckBounds := upper; IF _pApp <> 0 THEN AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS); END_IF ELSE CheckBounds := index; END_IF *)
Quand le CheckBounds fonction est appelée, elle reçoit les paramètres d'entrée suivants :
index
: Index de l'élément du tableaulower
: Limite inférieure de la plage du tableauupper
: Limite supérieure de la plage du tableau
La valeur de retour est l'indice de l'élément du tableau, tant qu'il se trouve dans une plage valide. Si non, alors le CODESYS renvoie la limite supérieure ou inférieure, selon le seuil qui a été dépassé.
Dans l'exemple de programme ci-dessous, l'indice n'atteint pas la limite inférieure définie du a
déployer.
PROGRAM PLC_PRG VAR a: ARRAY[0..7] OF BOOL; b: INT:=10; END_VAR a[b]:=TRUE;
Dans cet exemple, le CheckBounds
la fonction provoque a
pour changer la limite supérieure de l'index de plage du tableau en 10
. La valeur TRUE
est alors affecté à l'élément a[7]
. De cette manière, la fonction corrige l'accès au tableau en dehors de la plage de tableau valide.
Ajoutez les bibliothèques suivantes dans le gestionnaire de bibliothèques de l'application :
CmpApp.library
etSysExcept.library
en tant que bibliothèques d'espace réservéSysTypes2_Itfs.library
avec La dernière version toujours
Ajouter un CheckBounds sous l'application et modifiez le code spécifié comme indiqué ci-dessous.
Partie déclaration
FUNCTION CheckBounds : DINT VAR_INPUT index, lower, upper: DINT; END_VAR VAR _pApp : POINTER TO CmpApp.APPLICATION; _Result : ISystypes2.RTS_IEC_RESULT; END_VAR
Partie mise en œuvre
// Automatisch erzeugter Code: Es handelt sich hierbei um einen Implementierungsvorschlag. _pApp := AppGetCurrent(pResult := _Result); IF index < lower THEN CheckBounds := lower; IF _pApp <> 0 THEN AppGenerateException(pApp := _pApp, ulException := RtsExceptions.RTSEXCPT_ARRAYBOUNDS); END_IF ELSIF index > upper THEN CheckBounds := upper; IF _pApp <> 0 THEN AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS); END_IF ELSE CheckBounds := index; END_IF
programmer un MAIN_PRG objet sous l'application avec le contenu indiqué ci-dessous.
PROGRAM MAIN_PRG VAR xInit : BOOL; arData : ARRAY[0..7] OF BYTE; i : INT; dwAdr : DWORD; END_VAR IF NOT xInit THEN // Erforderlich für CheckBounds xInit := TRUE; END_IF // Setze i auf einen Wert > 7 oder < 0 // Generiert eine Exception in CheckBounds, Benutzerdefiniert arData[i] := 11;
Lorsque vous chargez et démarrez cette application, une "exception" sera levée lorsque les limites du tableau sont violées. Le traitement s'arrête dans CheckBounds afin que le type d'erreur puisse être détecté.