Skip to main content

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 tableau

  • lower: Limite inférieure de la plage du tableau

  • upper: 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é.

Exemple 527. Exemple : Correction de l'accès à un tableau en dehors des limites définies du tableau

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.



Exemple 528. Exemple : sortie d'une exception lorsque les limites du tableau sont dépassées.

Ajoutez les bibliothèques suivantes dans le gestionnaire de bibliothèques de l'application :

  • CmpApp.library et SysExcept.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é.