IN OUT Variable UDT

slma

Level-1
Beiträge
82
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich habe einen FB (FB22) und darin habe ich als IN-OUT Variable einen Datentyp vom Typ UDT3 und UDT2 definiert. Das funktioniert soweit...
Dann im FB5 rufe ich den FB22 auf und möchte bei dem IN-OUT Anschluss nocheimal eine IN-OUT Variable angeben, die wieder vom Typ UDT3 ist bzw. UDT2. Und das funktioniert nicht in Step7!

Als Fehler steht da: Unzulässige Parameterversorgung für Daten

Wie muss man das machen?

mfg
 
Zuletzt bearbeitet:
Variable IN_OUT vom Datentyp UDT können nicht initialisiert werden, da in diesem Fall im Instanz-Datenbaustein nur eine Adresse liegt.
 
OK werde es mit dem Temp Bereich versuchen...

Meinst du da: Am Bausteinbeginn speichere ich meine IN variable auf eine TEMP und am Bausteinende die TEMP wieder auf eine OUT oder???

mfg
 
OK werde es mit dem Temp Bereich versuchen...

Meinst du da: Am Bausteinbeginn speichere ich meine IN variable auf eine TEMP und am Bausteinende die TEMP wieder auf eine OUT oder???

Das hatte ich gemeint ... und die TEMP-Var kannst du dann auch dem nächsten FB übergeben ...

Achtung mit den UDT's bei IN-OUT-Variablen. Der Aufruf ist ziemlich speicherintensiv. (warum auch immer :confused: )

Das ist in SCL so, weil indirekt eine Art Block-Move durchgeführt wird,
... musst du aber in AWL per Hand auch machen ...
 
Achtung mit den UDT's bei IN-OUT-Variablen. Der Aufruf ist ziemlich speicherintensiv. (warum auch immer :confused: )

Eine UDT als In/Out-Parameter hat immer 6 Byte. Das ist genau die Länge eines Pointers.
Leider kann man im FB mit den UDTs nicht genauso arbeiten, wie schon geschrieben muss man die am Anfang des Bausteins in den Temp-Bereich und am Ende wieder zurückkopieren.

Ich bin mittlerweile von den UDTs wieder abgegangen. Es wäre schön gewesen, wenn Siemens die UDTs wie in einer Hochsprache als typedef (in C) umgesetzt hätte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thomas,
das ist in SCL so. Da kannst du programmieren :
Var1_UDT1 := Var2_UDT1 ;
Der Code-Umsetzr kümmert sich dann selber darum, den ganzen UDT von der einen in die andere Variable zu schaufeln.
 
habe das jetzt so gemacht mit TEMP Variable als Zwischenspeicher aber irgendwie funktioniert das gar nicht.
In meine Array Eintäge werden keine Werte mehr geschrieben...

was könnte da falsch sein?

mfg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ok kann ich machen...nur wird sich niemand auskennen aber versuchen wirs mal

also ich stell ihn so mit vorher-nachher hinein

Vorher habe ich FB4 und FB5 verwendet, da hatte ich das Problem nicht aber jetzt soll ich es eben nur mit einem (FB5) machen und daher musste ich die IN-OUT var. in einem FB durchgeben und das funktioniert ja nicht mit IN-OUT

Kurze Erklärung:

E2.0 zum starten
im DB10 (altes Programm) bzw. DB11 sieht man an den Variablen TEMP1..4 dass hinaufgezählt wird! Die daten/nummer werden von einem Array ins nächste geschoben (siehe DB50)

Im neuen Programm mit Temp var. sollte das genauso sein (DB10)..nur hört es beim ersten auf und es wird nichts weitergeschoben...

Vielleicht hat jemand Zeit zum ansehen...

Danke!
 

Anhänge

  • Testprojekt_250707-13_10_geht_gar_nicht.zip
    280,9 KB · Aufrufe: 9
  • Kopie von Testprojekt_240707-15_40_ALT.zip
    277,9 KB · Aufrufe: 3
[/quote =LL]
Das ist in SCL so, weil indirekt eine Art Block-Move durchgeführt wird,
... musst du aber in AWL per Hand auch machen ...[/quote]

Wie auch immer, ich vermeide sie seit dem an den IN_OUT Schnittstellen. Der Effekt ist übrigens auch, wenn der Aufruf aus einem KOP / FUP -FC kommt.
 
Hallo,
ich habe mir mal dein Testprojekt_geht_gar_nicht angesehen. Ich muss sagen, dass ich nicht schlau daraus geworden bin. Was möchtest du bewirken und wie geschieht das ?
Du musst, glaube ich, noch ein bisschen mehr dazu schreiben ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK...

Ich möchte eine Anlage simulieren mit 2 Grundsystemen (FB5 bzw FB4) und jeweils 4 Modulen (FB22-führen die eigentliche Arbeit aus).
Es werden die Arbeitszeit, Störung, IO,NIO (In Ordnung,nicht in Ordnung) simulieren.
Die Anzahl der Durchläufe wird gezählt, damit werden die Vorgaben wann ein NIO Teil, Störung lang,... anfällt. Das sind die Zahlen beim FB5.
Wenn ein Teil nicht NIO ist durchläuft es die ganze Anlage.
Wenn es NIO ist wird es schon bei der ersten ausgeschieden und ein neues Teil kommt vorne herein. (Siehe Temp1-Temp4 in den jeweiligen InstanzDBs)

Dann war meine Vorgabe dass die Grundsysteme (FB5-FB4) Multiinstanzbausteine sein sollen. Also habe ich den FB5 hergenommen und musste die IN-OUT Variablen auf IN-TEMP-OUT ändern, da das sonst nicht funktionier.
Jetzt gebe ich die Nummern der Arrays einen Baustein darüber an.
Und das funktioniert nicht mehr.
Siehe das neuere Programm.

mfg
 
Die IN_OUT Variable ist wie schon gesagt ja nur ein Pointer mit 6 Byte! Es steht somit nicht der Inhalt des UDT in der Variablen. Wenn Du nun über indirekte Adressierung den Inhalt dieses Pointers in den Pointer des FB22 kopierst dann funzt das. Weil dann dieser Pointer genau auf die Adresse schaut wie der umhüllende Baustein. Ist halt ein bisschen tricki!

Du kannst Dir ja mal die Inhalt der Variablen anschauen! Vom der Variablen des Hüllbausteins und vom FB22. Da muss das selbe drin stehen. Zum testen kannst Du die FB22 Variable über Steuern Variablen so setzten wie Du es am Hüllbaustein siehst. Damit kannst Du prüfen ob das funktionieren würde! Die interen Beschreibung der Variable vom FB22 muss Du natürlich auskommentieren.

Gruss Ligatschow
 
Zurück
Oben