Skip to main content

POU : CheckBounds

La tâche de cette fonction de surveillance est de gérer les violations des limites de manière appropriée. Parmi les exemples de réactions aux violations, citons la définition d'indicateurs d'erreur et la modification de la valeur de l'index du tableau. La vérification est effectuée uniquement pour un index de tableau variable. Un index de tableau constant incorrect provoque une erreur de compilation. La fonction est appelée implicitement dès que les valeurs sont attribuées au MATRICE variables.

Pour plus d'informations, consultez les rubriques suivantes : Utiliser des blocs de construction pour les vérifications implicites et 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 de la déclaration :

Code généré automatiquement : Ne le modifiez pas !

FUNCTION CheckBounds : DINT
VAR_INPUT
      index, lower, upper: DINT;
END_VAR

Mise en œuvre :

Code généré automatiquement : il s'agit d'une implémentation suggérée.

IF  index < lower THEN
      CheckBounds := lower;
ELSIF  index > upper THEN
      CheckBounds := upper;
ELSE
      CheckBounds := index;
END_IF

Déclaration :

Vous pouvez également définir un point d'arrêt, enregistrer des messages ou arrêter une exception, par exemple. CmpApp.Library, SysExcept.Library, et SysTypes2_Itf.

(* 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.*)
VAR
    _pApp : POINTER TO CmpApp.APPLICATION;
    _result   : SysTypes.RTS_IEC_RESULT;
END_VAR

Mise en œuvre :

_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 : accès au tableau en dehors des limites du tableau

Exemple 541. 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

Mise en œuvre

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 : violation des limites du tableau

Exemple 542. Sortie d'une exception lorsque les limites du tableau sont violé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 de la 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 de mise en œuvre :

// Automatically generated code: This is an implementation suggestion.
_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

Programme à MAIN_PRG objet situé en dessous de l'application dont le contenu est 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
    // Required for CheckBounds
    xInit  := TRUE;
END_IF

// Set i to a value > 7 or < 0
// Generates an exception in CheckBounds, user-defined
arData[i] := 11;

Lorsque vous chargez et démarrez cette application, une exception est générée en cas de violation des limites du tableau. Le traitement s'arrête Vérifiez les limites afin que le type d'erreur puisse être détecté.