Con i puntatori si può accedere a qualsiasi parte della memoria del sistema, ma in caso di errore si può accedere a qualsiasi variabile senza alcun controllo creando anche problemi gravi di funzionalità del programma. E proprio per questa loro pericolosità che l’uso dei puntatori è deprecato nella programmazione IEC61131.
In LogicLab esiste la possibilità di utilizzare i puntatori, in linguaggio ST, un puntatore si identifica con il simbolo @ posto davanti al tipo di variabile a cui il puntatore si riferisce. Quindi avremo dei puntatori di tipo @USINT, @INT, @REAL ecc. uno per ogni tipo di variabile gestita.
L’operando ADR (Utilizzabile in tutti i linguaggi) ritorna l’indirizzo di una variabile, in linguaggio ST si può anche utilizzare il simbolo ? davanti al nome della variabile. Quindi la definizione ADR(%MX100.10) ritornerà l’indirizzo della variabile MX100.10. La definizione ADR(MiaVar) o ?MiaVar ritornerà l’indirizzo della variabile MiaVar.
Ho realizzato un semplice programma con implementata la funzione eMemCpy che esegue copia tra due aree di memoria. Ecco la stampa del programma ed il programma sorgente, di seguito il codice della funzione eMemCpy.
WHILE (Size > 0) DO
@DestBf:=@SrcBf; (* Trasferisco dato in memoria *)
Size:=Size-1; (* Buffer size *)
SrcBf:=SrcBf+1; (* Source buffer address *)
DestBf:=DestBf+1; (* Destination buffer address *)
END_WHILE;