Step 7 UDT in einem FB verwenden

Harry_99

Level-1
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe mich mit dem UDT beschäftigt, und verstanden welche 2 Kernaufgaben er hat. Zum einen als Stempel bzw. Vorlage oder Makro für DBs (habe ich auch ohne weitere Probleme in Step7 umgesetzt, da es jetzt auch nicht so schwer ist..)

Jedoch habe ich mit der anderen Aufgabe von UDTs noch Probleme bei der Anwendung. Im Siemens Handbuch wird geschrieben „UDTs können wie elementare Datentypen oder zusammengesetzte Datentypen in der Variablendeklaration von Codebausteinen (FC, FB, OB) werden“. Leider finde ich hierzu keine Beispiele anhand man diese Aussage nachvollziehen kann. Ich habe mal einen UDT erstellt der wie im angehängten Bild 1 aussieht. Nun dachte ich mir, dass ich jetzt diesen UDT für Variablen in einem FB verwenden kann. Hierzu habe ich diesen UDT1 als „IN“ Parameter (für die Eingänge) und als „IN_OUT“ Parameter (für die Schütze) definiert und die Formalparameter des UDT1 bei der einfachen Wendeschützschaltung verwendet. Wenn ich diesen FB jetzt jedoch in einem OB1 aufrufe, so kann ich nicht wie ich es mir dachte jedem dieser UDT1 Parameter die eigendlichen Formalparameter zuweisen (zB –S0 = e0.0), sondern es steht da nur „IN0“ und „IN_OUT0“.


Wie wird denn jetzt zB. ein UDT sinnvoll bei einem FB eingesetzt? Habe auch schon im Forum danach gesucht jedoch hat es nicht wirklich weitergeholfen, da dies doch eine ziemliche Anfängerfrage ist und die anderen Fragen doch meist tiefgründiger sind..
Ich hoffe ihr könnt mir so kompetent helfen wie bei meinen anderen Fragen!

Mfg Harry
 

Anhänge

  • udt deklarierung.jpg
    udt deklarierung.jpg
    140,1 KB · Aufrufe: 89
  • fb.jpg
    fb.jpg
    346,7 KB · Aufrufe: 90
  • ob1.jpg
    ob1.jpg
    213,7 KB · Aufrufe: 87
Im FB hast du deinen IN-Parameter "IN0" getauft, insofern ist die Anzeige des FB richtig.

Wenn du in deinen Instanz-DB (DB1) schaust, wird du auch sehen dass die Struktur mit IN0.Motor_Ein_Rechtslauf etc. aufgelöst ist.

Wenn du dem FB jetzt allerdings was übergeben willst musst du auch eine Variable vom Typ UDT1, die dem FB dann übergeben kannst, erstellen.
Du kannst z.B. in einem GlobalDB ein Variable "Motor1" vom Typ anlegen und diese an den IN0 des FB als DB2.Motor1 dranschreiben.

Insofern funktioniert das gleich als würdest du einen Integer übergeben.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Zum Beispiel kannst du in einem DB mit der UDT Speicherbereiche erzeugen (hast du ja anscheinen auch schon wie oben geschrieben gemacht) und diesen Speicherbereich dann am INOUT eines FB aufrufen. Damit kann dieser dann arbeiten. Benutz ich unter anderem, wenn ich für einen FB Parameter habe, die ich auch über die Visu einstellen muss...


Gruß Andres
 

Anhänge

  • UDT.JPG
    UDT.JPG
    177,3 KB · Aufrufe: 80
Erstmal danke für eure Antworten, hat auch funktioniert mit der Lösung von RONIN. Jedoch ergeben sich mir hierzu zwei Fragen:

1.:
Ist das eine sehr umständliche Methode. Ich verstehe zwar den Sinn dahinter, dass man dadurch viele weitere Steuerungen aufgrund dieser Vorlage aufbauen kann, jedoch würde das komplett gleiche Beispiel anhand von einer Multiinstanz weniger Bausteine benötigen und auch übersichtlicher sein, da ich da dann ja nur 3 Bausteine verwende.. Verwendet man UDTs in FBs überhaupt so wie ich es hier verwendet habe, und wenn nein wie werden die denn dann sinnvoll eingesetzt? Habe schon in diversen Unterlagen von Siemens und der Hilfe nachgeblättert, jedoch wird fast ausschließlich auf die Verwendung von UDTs als Vorlage für DBs angegeben.

2.:
Ich habe in diesem Thread ( http://www.sps-forum.de/simatic/2973-udt-praktischer-umgang.html#post80267 ) gesehen, dass in den UDTs Ein- und Ausgänge definiert worden sind, und in den FBs jedoch diese ganzen UDTs nur im "STAT" Bereich verwendet bzw. aufgerufen worden sind. Was ist hier denn jetzt der Unterschied bzw. welche Methode ist denn da jetzt besser?

Danke im Voraus, mfg
 
Das kommt halt drauf an was du machen willst.
Ich verwende UDTs z.B. vorwiegend dazu um Objekte mit einer schmalen Schnittstelle auszurüsten.

z.b. ich habe ein Objekt klappe. Dem will ich Datenpunkte über geben z.B.
befehl öffnen, Befehl schliessen, Störung von der Klappe zurückmelden, Sollposition anfahren, LWL Ring zustand zurückmelden, Betriebsart melden etc.

Das kann 20 Variablen an der Schnittstelle pro Klappe bedeuten. Wenn ich jetzt 100 Klappen habe, ist das n haufen Arbeit die Schnittstelle für jede Klappe neu abzufüllen. Mit UDT hängt man dann nur eine Variable vom typ des UDTs an, anstatt 20 Variablen anzuschliessen.
Wenn der UDT dann an IN_OUT hängt kann ich sowohl variablen entgegen nehmen und verarbeiten als auch ausgeben für das aufrufende Programm.

Man muss im Objekt auch nicht zwingend den ganzen UDT verwenden. Man hat zwar alle Strukturbestandteile drin, das sind aber nur verweise die nicht beschrieben oder gelesen werden müssen.

Es spart also arbeit ganze Strukturen zu übergeben.
Wenn man jetzt eine weitere Variable braucht, dann ändert man halt den UDT. Generiert die Konsistenz übers Programm und hat automatisch die Variable überall drin.

Wichtig zu wissen ist noch. Ein UDT wird an der Schnittstelle nicht im Instanzdb landet. Will heissen im gegensatz zu einfachen Typen muss an einem UDT zwingend was angehängt werden, schnittstelle unbelegt lassen ist böse.

mfG René
 
Zuletzt bearbeitet:
Zurück
Oben