Pointeurs

Présentation

Les pointeurs sont disponibles en tant qu'extension de la norme IEC 61131-3.

Les pointeurs permettent d'enregistrer des adresses tandis qu'un programme d'application est en cours d'exécution. Un pointeur peut désigner une variable de n'importe quel type de données ou une instance de bloc fonction. Vous avez à disposition une fonction de surveillance implicite des pointeurs, comme expliqué ci-dessous au paragraphe Fonction CheckPointer.

Syntaxe d'une déclaration de pointeur

<identifier>: POINTER TO <data type>;

Le déréférencement d'un pointeur revient à obtenir la valeur actuellement enregistrée à l'adresse indiquée. Pour ce faire, vous devez ajouter l'opérateur de contenu ^ (caret ASCII ou accent circonflexe) après l'identificateur du pointeur (pt^ dans l'exemple ci-dessous).

L'opérateur d'adresse (address operator ADR) permet d'attribuer l'adresse d'une variable à un pointeur.

NOTE : Les pointeurs désignant une adresse d'entrée nécessitent un accès en écriture. Le compilateur affiche le message '<pointer name >' is not a valid assignment target, une fois le code généré.

Exemple : pwInput := ADR(wInput);

Pour éviter que le compilateur détecte une telle erreur, copiez la valeur d'entrée (wInput) dans une variable accessible en écriture.

Exemple

VAR
  pt:POINTER TO INT;  (* of pointer pt *)
var_int1:INT := 5;  (* declaration of variables var_int1 and var_int2 *)
  var_int2:INT;
END_VAR
pt := ADR(var_int1); (* address of var_int1 is assigned to pointer pt *)
var_int2:= pt^;      (* value 5 of var_int1 gets assigned to var_int2 via dereferencing of pointer pt; *)

En mode en ligne, vous pouvez accéder depuis un pointeur à l'emplacement de la déclaration de la variable référencée, en exécutant la commande Aller à la référence.

Pointeurs de fonction

EcoStruxure Machine Expert prend aussi en charge les pointeurs de fonction. Ces derniers peuvent être transmis à des bibliothèques externes. En revanche, il est impossible d'appeler un pointeur de fonction dans une application du système de programmation. Ce pointeur est attendu par la fonction permettant d'exécuter l'enregistrement des fonctions Callback (fonction de bibliothèque système). Selon le rappel à enregistrer, la fonction correspondante est appelée implicitement par le système d'exécution (sur un arrêt, par exemple). Pour effectuer un appel système (système d'exécution) de ce type, définissez les propriétés correspondantes (disponibles par défaut sous Affichage > Propriétés… > Compiler) de l'objet fonction.

L'opérateur ADR est applicable aux noms de fonctions, de programmes, de blocs fonction et de méthodes. Dans la mesure où un changement en ligne peut déplacer des fonctions, le résultat ne correspond non pas à l'adresse de la fonction, mais à celle d'un pointeur indiquant la fonction. Cette adresse reste valide tant que la fonction existe sur la cible.

L'exécution de la commande Changement en ligne peut modifier le contenu des adresses.

 ATTENTION
POINTEUR NON VALIDE
Vérifiez la validité des pointeurs lors de leur utilisation sur les adresses et de l'exécution de la commande Changement en ligne.
Le non-respect de ces instructions peut provoquer des blessures ou des dommages matériels.

Accès par index aux pointeurs

L'accès par index [] aux variables de type POINTER, STRING et WSTRING est autorisé. Il s'agit d'une extension de la norme IEC 61131-3.

  • [i] renvoie le type de données de base.

  • L'accès par index aux pointeurs correspond à une opération arithmétique :

    Lorsque l'accès par index est appliqué à une variable de type pointeur, le décalage pint[i] est égal à (pint + i * SIZEOF(base type))^. L'accès par index entraîne également le déréférencement implicite du pointeur. Le résultat correspond au type de base du pointeur.

    Remarquez que pint[7] does not equate to (pint + 7)^.

  • Lorsque l'accès par index est appliqué à une variable de type STRING, le caractère situé au décalage index-expr est renvoyé. Le résultat est de type BYTE. [i] renvoie l'i-ème caractère de la chaîne au format SINT (ASCII).

  • Lorsque l'accès par index est appliqué à une variable de type WSTRING, le caractère situé au décalage index-expr est renvoyé. Le résultat est de type WORD. [i] renvoie le i-ème caractère de la chaîne au format INT (Unicode).

NOTE : vous pouvez aussi utiliser des références. Contrairement aux pointeurs, celles-ci affectent directement une valeur.

Soustraction de pointeurs

Le résultat de la différence entre deux pointeurs est une valeur de type DWORD.

Fonction CheckPointer

La fonction de surveillance implicite CheckPointer permet de surveiller l'accès aux pointeurs en cours d'exécution. Vous pouvez l'adapter si besoin. La procédure consiste à ajouter l'objet POU pour vérifications implicites à l'application. Cochez également la case correspondant à la catégorie Contrôles pointeur.

NOTE : l'implémentation de la fonction CheckPointer lors de la mise en service permet de vérifier si le pointeur transmis fait référence à une adresse valide dans la mémoire et si la zone de mémoire référencée correspond bien au type de données de la variable indiquée par le pointeur.

CheckPointer permet de surveiller les variables de type REFERENCE TO de manière identique.

NOTE : aucun appel implicite de la fonction de vérification n'est disponible pour le pointeur THIS.

Modèle :

Partie déclaration :

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckPointer : POINTER TO BYTE
VAR_INPUT
ptToTest : POINTER TO BYTE;
iSize : DINT;
iGran : DINT;
bWrite: BOOL;
END_VAR

Sur appel, les paramètres d'entrée suivants sont transmis à la fonction :

  • ptToTest : adresse cible du pointeur

  • iSize : taille de la variable référencée. iSize correspond à un type compatible avec les entiers et doit être suffisamment élevé pour inclure la taille maximale pouvant être enregistrée à cette adresse de pointeur.

  • iGran : granularité de l'accès, soit le type de données non structuré de taille la plus élevée dans la variable référencée. iGran correspond à un type compatible avec les entiers.

  • bWrite : type d'accès (TRUE= accès en écriture, FALSE= accès en lecture). bWrite doit être de type BOOL.

Implémentation de la fonction CheckPointer pour les contrôleurs PacDrive

La procédure d'implémentation de la fonction CheckPointer pour les contrôleurs PacDrive (PacDrive LMC Eco / PacDrive LMC Pro/Pro2) consiste à générer une exception d'exécution du système et à écrire une pile d'appels dans le journaliseur de messages en cas d'erreur au niveau de l'adresse ou de l'alignement de la mémoire.

Partie implémentation :

CheckPointer := ptToTest;
IF ptToTest = 0 THEN
        FC_DiagMsgWrite(4, 'CP = 0');
        FC_SysUserCallStack(0);
ELSE
        CheckPointer := ptToTest;
END_IF

Implémentation de la fonction CheckPointer pour les contrôleurs optimisés

La procédure d'implémentation de la fonction CheckPointer pour les contrôleurs optimisés (tels que Modicon M241 Logic Controller) consiste à renvoyer le pointeur qui a été transmis.

Partie implémentation (incomplète) :

// No standard way of implementation. Fill your own code here
CheckPointer := ptToTest;

En cas de résultat positif, la vérification renvoie le pointeur d'entrée non modifié (ptToTest).