Wenn Zeiger als IN-Parameter als ANY deklariert ist, so zeigt die Variable nicht auf die als Parmeter angebene Adresse, sondern nur auf die Adresse in den vorherigen Lokaldaten (also während des Funktionsaufrufes). Einfach LAR1 P##Zeiger zu schreiben, geht aber leider nicht, auch kann man Zeiger nicht direkt an SFC20 parametrieren. Auf folgende Weise lässt sich das Problem lösen.
FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
Zeiger : ANY ;
END_VAR
VAR_TEMP
temp_Zeiger : ANY ;
temp_int : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
L P##Zeiger;
LAR1 ;
L P##temp_Zeiger;
LAR2 ;
L W [AR1,P#0.0];
T W [AR2,P#0.0];
L D [AR1,P#2.0];
T D [AR2,P#2.0];
L D [AR1,P#6.0];
T D [AR2,P#6.0];
CALL SFC 20 (
SRCBLK := #temp_Zeiger,
RET_VAL := #temp_int,
DSTBLK := MD 0);
END_FUNCTION
Man lädt sich also den Zeiger auf die alten Lokaldaten in AR1 und den Zeiger auf die aktuellen Lokaldaten in AR2 und kopiert den den Inhalt der ANY-Pointer (10 Byte). Klappt auch mit normalen Pointern (6 Byte). Da im Adresseregister immer nur die Blockanfangsadresse steht, kann man auf diese Weise gut bereichsübergreifend arbeiten, also z.B. mal bitweise U [AR1,P#1.0] und mal wortweise L W [AR1,P#0.0] verwenden.