Struktur als Parameter von FB zu FB weiterreichen

Isha

Level-1
Beiträge
55
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Es wurde zwar im Forum schon einiges über Stukturen, Any und co. geschrieben, trotzdem habe ich nichts gefunden was zu meinem Problem passt.

Ich habe in einem DB Strukturn vom Typ UDT1
"DB100".Heizung1 Datentyp: UDT1
"DB100".Heizung2 Datentyp: UDT1
etc.

Diese Struktur übergebe ich einem FB:
CALL #FB_Heizung
HeizDat:="DB100".Heizung1 // INOUT vom Typ UDT1

Nun habe ich die Daten im "FB_Heizung" und kann symbolisch darauf zugreifen.

Nun möchte ich die INOUT Daten "HeizDat" vom "FB_Heizung" nochmals an einen FB als INOUT-Parameter weiterreichen und auch da symbolisch auf die Daten zugreifen.
Nun ist aber der Datentyp des INOUT-Parameters nicht mehr vom Typ UDT1 sondern vom TYP UDT2. Die Länge der UDTs ist aber gleich. Auch der Aufbau ist gleich. Nur die Bezeichnung der Daten ist unterschiedlich.

Wie mache ich das?

Gruss
Isha
 
Zuletzt bearbeitet:
Nun möchte ich die INOUT Daten "HeizDat" vom "FB_Heizung" nochmals an einen FB als INOUT-Parameter weiterreichen und auch da symbolisch auf die Daten zugreifen.
Nun ist aber der Datentyp des INOUT-Parameters nicht mehr vom Typ UDT1 sondern vom TYP UDT2. Die Länge der UDTs ist aber gleich. Auch der Aufbau ist gleich. Nur die Bezeichnung der Daten ist unterschiedlich.

Wie mache ich das?

Den INOUT Parameter des 2. FBs auch auf UDT1 trimmen...

Anders geht das nicht.
Du könntest zwar UDT1 auf UDT2 kopieren, das macht aber nur Probleme, und du hebelst die Funktionalitäten, die dir ein INOUT bietet mehr oder weniger aus.

Gruß Micha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
eine möglichkeit, die eigentlich gar nicht soviele probleme mit sich führt (weiß auch nicht, was der micha da wieder hat :ROFLMAO:) ist das verwenden von struct.

du legst in der UDT1 und in der UDT2 eine struct an, über alle daten und den inout deiner bausteine definierst du auch als struct ... schon kannst du das struct in der UDT1 in den baustein mit dem struct der UDT2 schubsen.

gleiche länge ist natürlich vorrausgesetzt!
 
irgendwie hatte ich mir das erst komfortabler vorgestellt, in ausführung würde sowas, wie das hier raus kommen:

Code:
*
TYPE "_udt1"
VERSION : 0.1

  STRUCT  
   _struct_udt1 : STRUCT  
    bit00 : BOOL ; 
    bit01 : BOOL ; 
    bit02 : BOOL ; 
    bit03 : BOOL ; 
    bit04 : BOOL ; 
    bit05 : BOOL ; 
    bit06 : BOOL ; 
    bit07 : BOOL ; 
   END_STRUCT ; 
  END_STRUCT ; 
END_TYPE
TYPE "_udt2"
VERSION : 0.1

  STRUCT  
   _struct_udt2 : STRUCT  
    bit00 : BOOL ; 
    bit01 : BOOL ; 
    bit02 : BOOL ; 
    bit03 : BOOL ; 
    bit04 : BOOL ; 
    bit05 : BOOL ; 
    bit06 : BOOL ; 
    bit07 : BOOL ; 
   END_STRUCT ; 
  END_STRUCT ; 
END_TYPE
DATA_BLOCK "datenbaustein mit udt1"
TITLE =
VERSION : 0.1

  STRUCT  
   _udt1_00 : "_udt1"; 
   _udt1_01 : "_udt1"; 
   _udt1_02 : "_udt1"; 
   _udt1_03 : "_udt1"; 
   _udt1_04 : "_udt1"; 
  END_STRUCT ; 
BEGIN
   _udt1_00._struct_udt1.bit00 := FALSE; 
   _udt1_00._struct_udt1.bit01 := FALSE; 
   _udt1_00._struct_udt1.bit02 := FALSE; 
   _udt1_00._struct_udt1.bit03 := FALSE; 
   _udt1_00._struct_udt1.bit04 := FALSE; 
   _udt1_00._struct_udt1.bit05 := FALSE; 
   _udt1_00._struct_udt1.bit06 := FALSE; 
   _udt1_00._struct_udt1.bit07 := FALSE; 
   _udt1_01._struct_udt1.bit00 := FALSE; 
   _udt1_01._struct_udt1.bit01 := FALSE; 
   _udt1_01._struct_udt1.bit02 := FALSE; 
   _udt1_01._struct_udt1.bit03 := FALSE; 
   _udt1_01._struct_udt1.bit04 := FALSE; 
   _udt1_01._struct_udt1.bit05 := FALSE; 
   _udt1_01._struct_udt1.bit06 := FALSE; 
   _udt1_01._struct_udt1.bit07 := FALSE; 
   _udt1_02._struct_udt1.bit00 := FALSE; 
   _udt1_02._struct_udt1.bit01 := FALSE; 
   _udt1_02._struct_udt1.bit02 := FALSE; 
   _udt1_02._struct_udt1.bit03 := FALSE; 
   _udt1_02._struct_udt1.bit04 := FALSE; 
   _udt1_02._struct_udt1.bit05 := FALSE; 
   _udt1_02._struct_udt1.bit06 := FALSE; 
   _udt1_02._struct_udt1.bit07 := FALSE; 
   _udt1_03._struct_udt1.bit00 := FALSE; 
   _udt1_03._struct_udt1.bit01 := FALSE; 
   _udt1_03._struct_udt1.bit02 := FALSE; 
   _udt1_03._struct_udt1.bit03 := FALSE; 
   _udt1_03._struct_udt1.bit04 := FALSE; 
   _udt1_03._struct_udt1.bit05 := FALSE; 
   _udt1_03._struct_udt1.bit06 := FALSE; 
   _udt1_03._struct_udt1.bit07 := FALSE; 
   _udt1_04._struct_udt1.bit00 := FALSE; 
   _udt1_04._struct_udt1.bit01 := FALSE; 
   _udt1_04._struct_udt1.bit02 := FALSE; 
   _udt1_04._struct_udt1.bit03 := FALSE; 
   _udt1_04._struct_udt1.bit04 := FALSE; 
   _udt1_04._struct_udt1.bit05 := FALSE; 
   _udt1_04._struct_udt1.bit06 := FALSE; 
   _udt1_04._struct_udt1.bit07 := FALSE; 
END_DATA_BLOCK
FUNCTION_BLOCK "erster FB"
TITLE =
VERSION : 0.1

VAR_IN_OUT
  _udt1 : "_udt1"; 
END_VAR
BEGIN
NETWORK
TITLE =
 
END_FUNCTION_BLOCK
DATA_BLOCK DB 10
TITLE =
VERSION : 0.0
"erster FB"
BEGIN
END_DATA_BLOCK
FUNCTION_BLOCK "zweiter FB"
TITLE =
VERSION : 0.1

VAR_IN_OUT
  _struct : STRUCT  
   _0_0 : BOOL ; 
   _0_1 : BOOL ; 
   _0_2 : BOOL ; 
   _0_3 : BOOL ; 
   _0_4 : BOOL ; 
   _0_5 : BOOL ; 
   _0_6 : BOOL ; 
   _0_7 : BOOL ; 
  END_STRUCT ; 
END_VAR
BEGIN
NETWORK
TITLE =
 
END_FUNCTION_BLOCK
DATA_BLOCK DB 11
TITLE =
VERSION : 0.0
"zweiter FB"
BEGIN
END_DATA_BLOCK
ORGANIZATION_BLOCK "CYCL_EXC"
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1

VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =
      CALL "erster FB" , DB    10 (
           _udt1                    := "datenbaustein mit udt1"._udt1_00);
      CALL "zweiter FB" , DB    11 (
           _struct                  := "datenbaustein mit udt1"._udt1_00._struct_udt1);

END_ORGANIZATION_BLOCK

da halt ichs wie micha ... mach des net!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Vielen Dank für die Antworten.

SPSKILLER: schrieb:
aus dir wird mal noch n Schwabe - es werden keine Daten doppelt gespeichert!

Keine Daten doppelt halten ist ein gutes Stichwort.
Meine Daten sind global im DB100, da sie im ganzen Programm benötigt werden.
Nun muss ich aber in 2 FB's die Daten spezifisch bearbeiten.

"DB100".Heizung1 Typ:UDT1
"DB100".Heizung2 Typ:UDT1
etc.

Nun Rufe ich den FB1 auf und will darin die Daten "DB100".Heizung1 bearbeiten.
Vom FB1 rufe ich den FB2 auf und will auch die Daten "DB100".Heizung1 bearbeiten.

Das gleiche dann mit den andern Daten.

Wie würdet Ihr sowas elegant realisieren?

Gruss
Isha
 
...Wie würdet Ihr sowas elegant realisieren?...
Elegant ist zwar etwas anderes, aber ich würde es wahrscheinlich über einen Any-Pointer versuchen, der auf dein UDT zeigt. Das spart dann auch den Resourcenfraß mit den IN_OUTs.

Natürlich geht das auch nicht so ohne weiteres. Eine Möglichkeit wäre, den gesamten Datensatz über den Any in die temporären Lokaldaten zu kopieren (wo dein UDT liegen kann), zu bearbeiten, und am Ende wieder über den Any zurück kopieren. Den zweiten FB könntest du dann mit einem Any-Pointer versorgen, der auf die Kopie in deine Lokaldaten zeigt. In diesem FB dann das gleiche Spiel mit dem Kopieren. Dort kann dann der UDT in den Lokaldaten auch ein anderer sein, so wie du es wolltest. Das wäre vielleicht noch akzeptabel. Wie groß sind denn deine Daten?

Eine weitere Möglichkeit wäre noch, mittels Pointer indirekt auf die Daten zu zu greifen. Das wird jedoch sehr leicht unübersichtlich, da keine Symbolik möglich ist und müsste auf jeden Fall sehr akribisch kommentiert werden.

Deine Datenstruktur könnte so bleiben. Du kannst sogar deine UDTs symbolisch an die Bausteinparameter anlegen. Step7 macht daraus automatisch einen Any-Pointer.


Gruß, Onkel
 
Zuletzt bearbeitet:
Hallo Dagobert

Meine Daten sind 100 Bytes lang und Symbolik im Programm sollte schon vorhanden sein.
Die Möglichkeit mit Pointer kenne ich. Nur ist das Programm dann nicht mehr lesbar.

Onkel Dagobert: schrieb:
Dort kann dann der UDT in den Lokaldaten auch ein anderer sein, so wie du es wolltest.

Ich weiss im Moment nicht wie ich das programmieren sollte. Hast Du ein kleines Beispiel oder einen Ansatz?

Gruss
Isha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun Rufe ich den FB1 auf und will darin die Daten "DB100".Heizung1 bearbeiten.
Vom FB1 rufe ich den FB2 auf und will auch die Daten "DB100".Heizung1 bearbeiten.

Hallo,
ich würde diese Problematik mittels SCL realisieren.
Hier kannst du dir sehr komfortabel den UDT1 in den Temp- (oder Stat-)Bereich des FB1 kopieren und dann an den FB2 weitergeben und sogar nach dem Verlassen des FB2 dessen Manipulationen am UDT im FB1 wieder weiterverabeiten.
Das wäre der "eleganteste" Weg ...
Ansonsten, wenn es AWL sein soll, dann im Prinzip auf gleiche Weise - nur das du hier alles selber schreiben musst ...

Gruß
LL
 
Hallo,
das kann ich dir auch beschreiben :
Code:
du hast einen IN_OUT-Parameter vom Typ UDT1 mit dem Namen IN_Heizung.
du hast einen TEMP-Parameter vom Typ UDT1 mit dem Namen temp_Heizung.
du hast eine VAR vom Typ FB2 mit dem Namen Berechnung
 
im Code steht dann :
 
Temp_Heizung := IN_Heizung ;
 
Berechnung (Par:=temp_Heizung) ;
den Rest macht dann SCL ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Larry

Danke für die Antwort.
Mit SCL einen FB zu realisieren mit vielen Bitverknüpfungen ist allerdings auch nicht sehr toll.

Kann ich die Daten irgendwie als Pointer übergeben und trozdem in den FB's mit Symbolik programmieren?

Gruss
Isha
 
:confused: ... du arbeitest hier sowieso schon mit Pointern ...

SCL stellt bei diesen Dingen m.E. eine nicht unerhebliche Arbeits-Erleichterung dar.
BOOL-Verknüpfungen kann man in SCL übrigens auch sehr schön machen - du mußt halt wissen, was dir wichtiger ist ...

Gruß
LL
 
Zurück
Oben