La versione 1.1 di EcoStruxure Machine Expert non supporta i controllori M258, LMC058 e LMC078.

Puntatori

Panoramica

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. La possibilità di utilizzare una funzione di monitoraggio di un puntatore implicito è descritta più avanti, nel paragrafo Funzione CheckPointer.

Sintassi di una dichiarazione puntatore

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

Esempio

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; *)

Puntatori funzione

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 Visualizza > Proprietà... > Compila) 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 Modifica in linea può modificare il contenuto degli indirizzi.

Caution_Color.gifATTENZIONE

PUNTATORE NON VALIDO

Verificare la validità del puntatore quando si utilizzano i puntatori sugli indirizzi e durante l'esecuzione del comando Modifica in linea.

Il mancato rispetto di queste istruzioni può provocare infortuni o danni alle apparecchiature.

Accesso tramite indice ai puntatori

Come estensione dello standard IEC 61131-3, è consentito l'accesso tramite indice [] alle variabili del tipo POINTER, STRING e WSTRING.

opint[i] restituisce il tipo di dati di base.

oL'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.

Considerare che pint[7] does not equate to (pint + 7)^.

oSe 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. str[i] restituirà il carattere i-esimo della stringa come SINT (ASCII).

oSe 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. wstr[i] restituirà il carattere i-esimo della stringa come INT (Unicode).

NOTA: È anche possibile utilizzare i Riferimenti. A differenza di un puntatore, i riferimenti influenzano direttamente un valore.

Funzione 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 POU per controlli impliciti nell'applicazione. Attivare la casella di controllo relativa alla categoria Pointer Checks.

NOTA: Occorre implementare la funzione CheckPointer durante la messa in servizio della macchina per verificare se il puntatore passato fa riferimento a un indirizzo di memoria valido e se l'allineamento dell'area di memoria referenziata è adatto al tipo di dati della variabile a cui punta il puntatore.

CheckPointer monitora le variabili di tipo REFERENCE TO in modo analogo.

NOTA: Non esiste una chiamata implicita della funzione di controllo per il puntatore 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:

optToTest: indirizzo di destinazione del puntatore

oiSize: 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.

oiGran: 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

obWrite: tipo di accesso (TRUE= accesso in scrittura, FALSE= accesso in lettura); il tipo di dati di bWrite deve essere BOOL.

Implementazione della funzione 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

Implementazione della funzione 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).