Step 7 Any Pointer in SCL bearbeiten unterschied FC/FB

vollmi

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

Ich möchte einen Any an einen FC übergeben und ihn auf eine UDT struktur mappen. Das funktioniert in einem FB wunderbar aber nicht im FC.
Im FC nehme ich ja den Any vom INPUT und speichere ihn IM TEMP um eine AT Sicht draufzulegen.


so sieht mein FC aus.

Code:
VAR_INPUT    [COLOR=#ff0000]LS_ZLV_GW [/COLOR]: ANY;// Hier wird das Erste Wort aus dem LS DB aufgelegt
END_VAR


VAR_OUTPUT
    LS_ZLV_GW_OUT : LS_ZLV_GW;
END_VAR
VAR_TEMP
    [COLOR=#ff0000]tLS_ZLV_GW [/COLOR]: ANY;  // hier wird der Pointer für die Lokaldaten gespeichert um den Any draufzulegen
      pLS_ZLV_GW AT tLS_ZLV_GW : ANY_POINTER; 
   para : LS_ZLV_GW; // temporäre Variablen vom UDT Typ
   Ret : INT;
END_VAR


                    
(*Pointer auf UDT schreiben zum arbeiten*) // Ventilator allgemein
  [COLOR=#ff0000]tLS_ZLV_GW := LS_ZLV_GW[/COLOR]; // Pointer aus schnittstelle in Temporärbereich holen.
  pLS_ZLV_GW.Bereichstyp := 2;   // Typ des Bereichs soll Byte sein (INT = 2)
  pLS_ZLV_GW.Anzahl_Werte := 42; // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
                               // Muss so lange sein wie der UDT der angezeigt werden soll.


  Ret :=  BLKMOV(SRCBLK := pLS_ZLV_GW ,DSTBLK := para); // Kopieren in die Temporäre Variable.

Leider scheint der Pointer an LS_ZLV_GW irgendwie nicht richtig übergeben zu werden . Oder mein BLKMOV macht blödsinn.

Das kommt dabei raus:
screenshot.37.jpg


an erster stelle sollte DB141.dbw112 stehen und das mit dem Blockmove kopiert werden nach LS_ZLV_GW_OUT

der 1. Wert im DBW112 hat 100 die anderen 0 bis dbw 126


mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
An der Ersten speicherstelle steht eigentlich 100 drin, nicht 4098. an der ersten speicherstelle ist db141.dbw112. sind alles int
bis zu para_08, da steht dann eine 9 drin.

Es sieht also so aus als würde der blockmove irgend ein blödsinn machen. denn der Pointer scheint ja richtig zu sein, oder?

mfG René
 
Soweit ich das sehe, beschreibst du die Variable para.para.para_01 nicht in der FC und da die temporär ist steht da noch irgendwas drin, oder?

Wenn du das dann einem DB141.dbw112 zuweist ist es eben irgendwas....
 
Mir fällt grad auf, dass in para_02 die Zahl 42 steht, also die Anzahl der Bytes und in Para_03 die DB-Nummer...
Versteckt sich da der ganze Any?
 
Deinem letzten Post mit dem hinweis auf den Pointerinhalt ist es mir wie dachziegel von den Augen gefallen. Ich bin so ein DEPP. Danke funktioniert :)

Ich hab jetzt echt ne Stunde an dem ding Rumstudiert den Pointer auseinandergenommen etc. aber das ich garnicht den Pointer am Blockmove habe ist mir jetzt erst aufgefallen.

mfG René
 
Hallo Rene,
in deinem Fall würden es für den Blockmove Vor-Vorgänger-Lokaldaten werden.
Die kann der Baustein nicht mehr adressieren ...

Kannst du mir das näher erläutern?

Ich kopiere ja den ANY inhalt vom FC eingang in den Lokaldatenbereich. dort mach ich eine AT sicht auf den Temporären ANY. damit kann ich ihn dann symbolisch adressieren und diesen dann auch am Blockmove anhängen? Muss ich da unvorhergesehene Konsequenzen befürchten? Jetzt funktioniert der Baustein wenn ich als source tLS_ZLV_GW verwende.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Rene,
Da ich gerade kein Step7 zur Hand habe sind dem Ganzen Grenzen gesetzt ...
Schau dir doch einfach mal an, was dein im FC umkopierter ANY adressiert ... und was du eigentlich adressiert haben wolltest ...

Gruß
Larry
 
Das passt, weil im temporären Any das selbe liegt wie im anparametrierten Any und der BLKMOV somit mit den auf die Vorigen Lokaldaten (von ihm aus gesehen) ganz normal zugreifen kann.
 
Sorry ... ich hatte mich von dem Drum-Herum Code verwirren lassen.
Dann übergibt doch dem Blockmove mal den umkopierter ANY an Stelle der AT-Sicht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Versuch mal
Code:
 Ret :=  BLKMOV(SRCBLK := [COLOR=#ff0000]t[/COLOR]LS_ZLV_GW ,DSTBLK := para); // Kopieren in die Temporäre Variablen

Deinem letzten Post mit dem hinweis auf den Pointerinhalt ist es mir wie dachziegel von den Augen gefallen. Ich bin so ein DEPP. Danke funktioniert :)

Ich hab jetzt echt ne Stunde an dem ding Rumstudiert den Pointer auseinandergenommen etc. aber das ich garnicht den Pointer am Blockmove habe ist mir jetzt erst aufgefallen.

mfG René

Macht er ja jetzt... ;)
 
Mit den Lokaldaten das passt schon, dem BLKMOV kann man einen ANY auf die eigenen Lokaldaten übergeben, das sind für den BLKMOV Vorgänger-Lokaldaten, damit kann der umgehen.

Das eigentliche Problem von Vollmi:
  • BLKMOV.SRCBLK erwartet ein ANY
  • pLS_ZLV_GW ist eine Struktur vom Typ ANY_POINTER, der SCL-Compiler übergibt dem BLKMOV einen ANY auf die Struktur (einen ANY auf den selbstgebastelten ANY) --> es wird der selbstgebastelte ANY kopiert
  • tLS_ZLV_GW ist ein ANY, der SCL-Compiler übergibt dem BLKMOV den ANY direkt --> es wird von der Quelle kopiert, auf die der selbstgebastelte ANY zeigt

Harald
 
Zurück
Oben