Come estensione dello standard IEC 61131-3, è possibile utilizzare i puntatori.
I puntatori salvano gli indirizzi durante l'esecuzione di un programma applicativo. Un puntatore può puntare a una variabile di qualsiasi tipo di dati o a un'istanza di blocco di funzione. La possibilità di utilizzare una funzione di monitoraggio di un puntatore implicito è descritta più avanti, nel paragrafo Funzione CheckPointer.
<identifier>: POINTER TO <data type>;
Dereferenziare un puntatore significa ottenere il valore correntemente memorizzato nell'indirizzo al quale punta. È possibile dereferenziare un puntatore aggiungendo l'operatore contenuto ^ (carattere ASCII accento circonflesso) dopo l'identificativo del puntatore. Vedere pt^
nell'esempio che segue.
È possibile utilizzare l'address operator ADR
per assegnare l'indirizzo di una variabile a un puntatore.
'<pointer name >' is not a valid assignment target
quando viene generato il codice.
Esempio: pwInput := ADR(wInput);
Per evitare che il compilatore rilevi tale errore, copiare il valore di ingresso (wInput) in una variabile con accesso in scrittura.
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; *)
In modalità online è possibile passare da un puntatore al percorso di dichiarazione della variabile referenziata eseguendo il comando .
EcoStruxure Machine Expert supporta anche i puntatori funzione. Questi puntatori possono essere passati alle librerie esterne, ma non è possibile chiamare un puntatore funzione in un'applicazione nel sistema di programmazione. La funzione di runtime per la registrazione delle funzioni di richiamo (funzione libreria di sistema) prevede il puntatore funzione e, a seconda del richiamo per il quale era richiesta la registrazione, verrà chiamata implicitamente la rispettiva funzione dal sistema di runtime (ad esempio, allo STOP). Per poter abilitare tale chiamata di sistema (sistema runtime), impostare le rispettive proprietà (per impostazione predefinita in ) per l'oggetto della funzione.
È possibile utilizzare l'operatore ADR
su nomi funzione, nomi di programma, nomi dei blocchi funzione e nomi di metodi. Dato che le funzioni possono spostarsi dopo una modifica in linea, il risultato non è l'indirizzo della funzione, ma l'indirizzo di un puntatore a tale funzione. Questo indirizzo è valido a condizione che la funzione esista nella destinazione.
L'esecuzione del comando
può modificare il contenuto degli indirizzi.ATTENZIONE | |
---|---|
Come estensione dello standard IEC 61131-3, è consentito l'accesso tramite indice []
alle variabili del tipo POINTER, STRING e WSTRING.
[i]
restituisce il tipo di dati di base.
L'accesso tramite indice è aritmetico:
Se su una variabile di tipo puntatore è utilizzato l'accesso tramite indice, l'offset pint[i]
è uguale a (pint + i * SIZEOF(base type))^
. L'accesso tramite indice esegue anche un dereferenziamento implicito sul puntatore. Il tipo di risultato è il tipo di base del puntatore.
Notare che pint[7] does not equate to (pint + 7)^
.
Se si utilizza l'accesso tramite indice su una variabile di tipo STRING, il risultato è il carattere all'offset index-expr
. Il risultato è di tipo BYTE. [i]
restituirà il carattere i-esimo della stringa come SINT (ASCII).
Se si utilizza l'accesso tramite indice su una variabile di tipo WSTRING, il risultato è il carattere all'offset index-expr
. Il risultato è di tipo WORD. [i]
restituirà il carattere i-esimo della stringa come INT (Unicode).
CheckPointer
Per monitorare l'accesso del puntatore al runtime, è possibile utilizzare la funzione di monitoraggio implicito CheckPointer. Se necessario, è possibile adattarla. Per questo scopo, aggiungere l'oggetto nell'applicazione. Attivare la casella di controllo relativa alla categoria .
CheckPointer monitora le variabili di tipo REFERENCE TO in modo analogo.
THIS
.
Modello:
Parte dichiarazione:
// 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
Quando viene chiamata la funzione, vengono forniti i seguenti parametri di ingresso:
ptToTest
: indirizzo di destinazione del puntatore
iSize
: dimensione della variabile referenziata; il tipo di dati di iSize
deve essere compatibile con i numeri interi e coprire le dimensioni dati massime potenziali memorizzate nell'indirizzo puntatore.
iGran
: la granularità dell'accesso, ossia il tipo di dati non strutturato più grande utilizzato nella variabile referenziata; il tipo di dati di iGran
deve essere compatibile con i numeri interi
bWrite
: tipo di accesso (TRUE= accesso in scrittura, FALSE= accesso in lettura); il tipo di dati di bWrite
deve essere BOOL.
CheckPointer
per controller PacDrive
L'implementazione della funzione CheckPointer per controller PacDrive (PacDrive LMC Eco / PacDrive LMC Pro/Pro2) consiste nel generare un'eccezione runtime di sistema e nello scrivere uno stack di chiamata nel registro messaggi quando l'allineamento o l'indirizzo di memoria non è valido.
Parte implementazione:
CheckPointer := ptToTest;
IF ptToTest = 0 THEN
FC_DiagMsgWrite(4, 'CP = 0');
FC_SysUserCallStack(0);
ELSE
CheckPointer := ptToTest;
END_IF
CheckPointer
per controller ottimizzati
L'implementazione della funzione CheckPointer per controller ottimizzati (ad esempio, Modicon M241 Logic Controller) consiste nel restituire il puntatore passato.
Parte di implementazione (incompleta):
// No standard way of implementation. Fill your own code here
CheckPointer := ptToTest;
In caso di risultato positivo del controllo, verrà restituito il puntatore di ingresso non modificato (ptToTest
).