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.
<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.
'<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.
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 .
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 ) 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
peut modifier le contenu des adresses.ATTENTION | |
---|---|
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).
Le résultat de la différence entre deux pointeurs est une valeur de type DWORD.
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 à l'application. Cochez également la case correspondant à la catégorie .
CheckPointer permet de surveiller les variables de type REFERENCE TO de manière identique.
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.
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
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
).