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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Struktur als Parameter von FB zu FB weiterreichen

  1. #1
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Geändert von Isha (21.01.2009 um 16:29 Uhr)
    Zitieren Zitieren Struktur als Parameter von FB zu FB weiterreichen  

  2. #2
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    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
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    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
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    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
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    ... 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
    Isha ist offline Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo

    Vielen Dank für die Antworten.

    Zitat Zitat von 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
    Registriert seit
    06.10.2003
    Beiträge
    3.406
    Danke
    448
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Zitat Zitat von Isha Beitrag anzeigen
    ...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
    Geändert von Onkel Dagobert (21.01.2009 um 23:52 Uhr)
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  9. #8
    Isha ist offline Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

    Zitat Zitat von 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
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Zitat Zitat von Isha Beitrag anzeigen
    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
    Isha ist offline Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    51
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Larry

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

    Gruss
    ISha

Ähnliche Themen

  1. Pointer (nicht Any!) weiterreichen
    Von sisplc im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 13.10.2011, 13:22
  2. Struktur mehrfachzugriff?
    Von hoT im Forum Simatic
    Antworten: 22
    Letzter Beitrag: 22.04.2010, 08:41
  3. Struktur am Bildbaustein
    Von Neesen im Forum HMI
    Antworten: 4
    Letzter Beitrag: 21.09.2007, 22:06
  4. Block_DB über zwei funktionen weiterreichen
    Von plant1 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 13.08.2006, 15:17
  5. DB-struktur
    Von Pimsti im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 13.06.2006, 12:48

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •