ANY Pointer als In Parameter...

H

haraldign

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, Ich möchte in einem FB einen Any Pointer als In Parameter verwenden, und die daten daraus dann mit blockmove (also die daten auf die der anypointer zeigt) in einen block im fb kopieren... Wie kann Ich das bewerkstelligen?? Wenn Ich den eingangs anypointer an blockmove hänge, dann bleibt er immer rot!
 
Suche mal in der Step7-Hilfe unter 'Any-Pointer' und dann 'Beispiel zum Datentyp Any'.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
umkopieren...

sehe ich das richtig, dass wenn ich einen any als in habe und diesen mit blkmov verwenden möchte ich diesen mit

LAR1 P##DATEN_ANY

L D [AR1,P#0.0]
T LD 0
L D [AR1,P#4.0]
T LD 4
L D [AR1,P#8.0]
T LW 8

in einen any in den lokaldaten umkopieren muss???
 
Nein nicht in ein Array, in einen anderen Pointer.
Vielleicht hat jemand noch einen besseren Vorschlag.
Hast du es mal mit dem Parametertyp 'Pointer' probiert, der ist eigentlich zur Übergabe von Pointern an andere Funktions-Inputs gedacht, ein Versuch ist es wert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zeiger auf Zeiger geht nicht

Hi;
was Du vorhast geht nicht bei Siemens. Siemens kann maximal 32bit handeln, dh. Siemens setzt einen Zeiger auf deinen IN-Operanden vom Typ ANY. Dann möchtest Du den ANY Zeiger dem BlockMove weitergeben, wieder ein Zeiger auf eine Anfangsadresse. Zeiger auf Zeiger, dass kann Onkel Siemens nicht.

Dein Ansatz ist richtig, Zeiger lokal ablegen und dann mit diesem den BlockMove beschalten.

Wenn Du ein Beispiel brauchst, melde Dich.

Gruss Nils
 
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.
 
Zurück
Oben