L’errore è generato dalla istruzione:
APtr:=ADR(IValue); //Auxiliary pointer
In pratica si stà accedendo all’indirizzo di una variabile interna alla funzione.
Le variabili interne delle funzioni vengono allocate nello stack, ma il compilatore cerca quando può di ottimizzare l’impiego di memoria ed alloca alcune variabili nei registri del controllore. In questo caso la variabile IValue è allocata dal compilatore in registri del microcontrollore e quindi non è possibile ricavarne l’indirizzo.
Per soluzionare il problema basta definire 4 variabili dummy di tipo DWORD come prime variabili definite della funzione:
VAR
Dummy1 : DWORD; (* To avoid register mapping *)
Dummy2 : DWORD; (* To avoid register mapping *)
Dummy3 : DWORD; (* To avoid register mapping *)
Dummy4 : DWORD; (* To avoid register mapping *)
IValue : USINT; (* Internal value *)
APtr : @USINT; (* Auxiliary pointer *)
END_VAR
In questo caso il compilatore alloca queste prime variabili nei registri così la variabile IValue verrà allocata nello stack in memoria e quindi sarà possibile ricaverne l’indirizzo.