Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Page 1 of 2 12 LastLast
Results 1 to 10 of 13

Thread: Struktur als Parameter von FB zu FB weiterreichen

  1. #1
    Join Date
    28.11.2007
    Posts
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Default


    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
    Last edited by Isha; 21.01.2009 at 16:29.
    Reply With Quote Reply With Quote Struktur als Parameter von FB zu FB weiterreichen  

  2. #2
    Join Date
    11.05.2005
    Location
    Baden-Württemberg
    Posts
    727
    Danke
    114
    Erhielt 159 Danke für 129 Beiträge

    Default

    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
    "arbeite klug, nicht hart" - deutsches Sprichwort

  3. #3
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default

    eine möglichkeit, die eigentlich gar nicht soviele probleme mit sich führt (weiß auch nicht, was der micha da wieder hat ) 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!
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. #4
    Join Date
    08.08.2007
    Location
    Dresden
    Posts
    9,882
    Danke
    1,064
    Erhielt 2,056 Danke für 1,632 Beiträge

    Default

    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!
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    SPSKILLER (21.01.2009)

  6. #5
    Join Date
    11.05.2005
    Location
    Baden-Württemberg
    Posts
    727
    Danke
    114
    Erhielt 159 Danke für 129 Beiträge

    Default

    Quote Originally Posted by vierlagig View Post
    ... mach des net!
    aus dir wird mal noch n Schwabe - es werden keine Daten doppelt gespeichert!

    Kostet Speicher...
    "arbeite klug, nicht hart" - deutsches Sprichwort

  7. #6
    Join Date
    28.11.2007
    Posts
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Default

    Hallo

    Vielen Dank für die Antworten.

    Quote Originally Posted by SPSKILLER:
    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

  8. #7
    Join Date
    06.10.2003
    Posts
    4,747
    Danke
    681
    Erhielt 845 Danke für 662 Beiträge

    Default

    Quote Originally Posted by Isha View Post
    ...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
    Last edited by Onkel Dagobert; 21.01.2009 at 23:52.
    Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
    John Ruskin

  9. #8
    Join Date
    28.11.2007
    Posts
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Default

    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.

    Quote Originally Posted by Onkel Dagobert:
    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

  10. #9
    Join Date
    22.03.2007
    Location
    Detmold (im Lipperland)
    Posts
    12,737
    Danke
    442
    Erhielt 2,631 Danke für 2,173 Beiträge

    Default

    Quote Originally Posted by Isha View Post
    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

  11. #10
    Join Date
    28.11.2007
    Posts
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Larry

    Wie wird die Übergabe in SCL programmiert.
    Hast Du ein kleines Beispiel?

    Gruss
    ISha

Similar Threads

  1. Step 7 SCL - ANY als Out-Parameter
    By Löwensenft in forum Simatic
    Replies: 13
    Last Post: 01.04.2015, 10:25
  2. Struktur als Propertie
    By SY50 in forum CODESYS und IEC61131
    Replies: 18
    Last Post: 13.03.2013, 10:44
  3. Array als IN Parameter
    By RON_87 in forum Simatic
    Replies: 1
    Last Post: 20.01.2013, 14:13
  4. UDT als FC-Parameter
    By Reinhard.Steinbrueck in forum Simatic
    Replies: 13
    Last Post: 15.07.2011, 18:01
  5. Struktur als Übergabeparameter bei Aktionsaufrufen
    By vpcoder in forum CODESYS und IEC61131
    Replies: 6
    Last Post: 18.06.2009, 08:19

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •