TIA FC IN/OUT Durchreichen

vollmi

Level-3
Beiträge
5.435
Reaktionspunkte
1.409
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen

Ich habe hier einen FC mit einer IN/OUT Variable vom Typ Array[0..240] of BYTE. in diesem FC wird diese Variable an einem Blkmove auf die dst Angeschlossen.

Den FC kann ich in einem FB ohne Probleme aufrufen und die IN/OUT Variable mit einer Statischen Struktur belegen.

Jetzt wollte ich diesen FC aber auch noch in einem anderen FC verwenden welcher die IN/OUT Variable einfach durchreicht.

Also FB1 ruft FC1 auf mit Array of Byte IN/OUT belegt durch eine Statische Variable (Array of Byte)
FC1 ruft wiederum FC2 auf, die IN/OUT Variable belegt mit der IN/Out Variable von FC1.
Im FC2 wiederum wird blkmove aufgerufen und mit der IN/OUT Variable belegt.

im FC1 wird aber die Variablenzuweisung abgelehnt mit "Ungültige Parameterzuweisung"

wie macht man dass dann korrekterweise?

mfG René
 
Hallo Rene,
du mußt dir in dem FC1 den Inhalt des INOUT (also den Wert des Any-Pointers) in eine eigene Variable des FC1 schreiben und die dann an den FC2 übergeben.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm mir ist noch nicht ganz klar wie genau.
Ich mache im FC1 einen InOUT
Ausgabe Array [0..256] of Byte
Dann im Temp nochmal dasselbe:
Weitergabe Array [0..256] of Byte

Weise den In/out pointer zu.
#Weitergabe := #Ausgabe;

Zeile darunter am Aufruf des FC2 lege ich dann #Weitergabe an in/out an?

Das würde klappen aber wenn ich im FC2 dann etwas auf die Struktur schreibe wird das nicht verwertet.

mfG René
 
Hallo Rene,
ich mache das jetzt ein bißchen aus der Erinnerung heraus (ich habe gerade kein PG im Zugriff um es direkt kontrollieren zu können).
Das INOUT_UDT deines FC1 müßte ein Pointer sein, der auf die Adresse zeigt an der die 10 Byte des ANY-Pointers deines Quell-Arrays stehen.
Du müßtest jetzt also in deinem FC1 eine Variable vom Typ ANY-Pointer erstellen, die du dann an den FC2 weitergibst.
Nun lädst du die 10 Byte, die an der Stelle deines o.g. Pointers stehen und schreibst die in den Speicherbereich deines lokalen ANY-Pointers herein.
ich hoffe, das es jetzt verständlicher war.
Ich kann dir aber später nachmittags auch dazu ein Beispiel erstellen ...

Gruß
Larry
 
Danke Larry. Ueber ein Beispiel wäre ich sehr froh.

Ich habe das jetzt auf diverse Arten ausprobiert, aber ich kriege die Pointerzuweisung nicht hin.

ggf. ist Tia da vielleicht auch etwas strenger dass alles passen muss.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Larry. Ueber ein Beispiel wäre ich sehr froh.

Ich habe das jetzt auf diverse Arten ausprobiert, aber ich kriege die Pointerzuweisung nicht hin.
Vermutlich nur was kleines. Aber bei SCL falle ich ab und zu eben immernoch rein.

ggf. ist Tia da vielleicht auch etwas strenger dass alles passen muss.


mfG René
mfG René
 
Hallo Rene,

ich kann dir nur mit einem AWL-Codeteil aushelfen.
In SCL ist es so eine Sache mit dem AT-Sicht auf Pointer machen.
Code:
 L     P##INOUT_Datenquelle        // der INOUT-Datensatz
 LAR1                              // Pointer darauf
 L     W [AR1,P#0.0]               // Bestandteile zerlegen
 T     #INOUT_DBNr                // TEMP - WORD
 L     D [AR1,P#2.0]
 T     #INOUT_Speicher            // TEMP - DWORD

 TAR2  #save_AR2                   // AR2 sichern

 AUF   DB [#INOUT_DBNr]            // DB des INOUT-Datensatzes öffnen
 L     #INOUT_Speicher             // Zeiger auf ursprüngliche Datenquelle
 LAR1  

 L     P##myDurchgang              // Pointer auf den neuen Übergabe-Parameter [ANY]
 LAR2  

 L     W [AR1,P#0.0]               // Inhalte übertragen
 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]

 LAR2  #save_AR2                   // AR2 zurückschreiben

// nun kann "myDurchgang" an Stelle von "INOUT_Datenquelle" weiter gegeben werden ...

Ich habe es noch nicht getestet - sollte aber korrekt sein.
Gruß
Larry
 
Zurück
Oben