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

Ergebnis 1 bis 2 von 2

Thema: S7 Global DB an FB anbinden durch UDT mit Data_And_Time

  1. #1
    Registriert seit
    20.02.2014
    Beiträge
    75
    Danke
    13
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Forum,

    Problemstellung:
    Siemens Touchpanel mit WinCC flexible an eine S7 300 anbinden, dabei will ich die Bereichszeiger ausnutzen. Für die Option, dass ich mehrere Panels an die CPU hängen möchte habe ich mir einen UDT erstellt, in der alles Wichtige zum allgemeinen Datenaustausch + Bereichszeiger integriert ist. Dieser UDT packe ich in einen globalen Datenbaustein und an einen FB, der mir dieses Panel verwaltet. Der UDT ist als IN_OUT deklariert. Im Panel spreche ich den Globaldatenbaustein nicht direkt an, sondern durch Multiplexen der DB-Nummer (für mehrere Panels...).
    Das große Problem ist der Datentyp Data_And_Time, da dieser sich nicht in dem FB verarbeiten lässt, zum Beispiel bei der Übergabe an SFC`s....
    Wie bekomme ich nun dies (am besten Vollsymbolisch) hin?

    Software: Step7 classic + WinCC flexible


    Vielen Dank schon mal im Voraus.

    Mit freundlichen Grüßen

    Andreas
    Zitieren Zitieren S7 Global DB an FB anbinden durch UDT mit Data_And_Time  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.329 Danke für 2.688 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zusammengesetzte Datentypen kann man nicht direkt von den Bausteinparametern an aufzurufende Bausteine durchreichen. Sie müssen zunächst in TEMP-Variablen umkopiert werden, welche dann als Aktualparameter an die aufzurufenden Bausteine gegeben werden können.

    Zum Umkopieren von zusammengesetzten Datentypen aus Bausteinparametern kann man in AWL nicht BLKMOV verwenden (weil man ja den zusammengesetzten Datentyp nicht an die SFC weiterreichen kann), sondern man muß mit elementaren Operationen zwischen Speicher-Adressen kopieren. In AWL ist die vollsymbolische Referenzierung von Strukturmembern nicht möglich, man kann nur die Anfangsadresse der Struktur referenzieren und muß dann die Adress-Offsets der Strukturmember absolut hinzuaddieren. Zusätzlich ist die Adressberechnung in FB-Multiinstanzen nicht ganz einfach. Die Adressberechnung ist sehr fehlerträchtig und relativ unverständlich. Deshalb überläßt man die korrekte Adressberechnung am besten einem Compiler und schreibt den Quellcode z.B. in SCL. Der Compiler übersetzt das dann fehlerfrei (in mehr oder weniger effizienten Code).

    Bei SCL hat man sogar noch den "Vorteil", daß man sich um das Umkopieren von den Bausteinparametern über TEMP nicht kümmern muß, das erledigt der SCL-Compiler im Hintergrund automatisch mit. Damit allerdings nicht zuviel Code-Overhead für mehrere Zugriff auf Member von Strukturen von der Baustein-Schnittstelle entsteht, ist es oft am effizientesten, am Anfang des Bausteins die komplette Struktur von INOUT zu TEMP umzukopieren, dann mit der Kopie zu arbeiten und am Ende des Bausteins zu INOUT zurückzukopieren.
    Code:
    TYPE "MyUDT_mit_DT"
      STRUCT
        Dummy1 : INT ;
        DT1 : DATE_AND_TIME ;
      END_STRUCT
    END_TYPE
    
    FUNCTION_BLOCK FB3
    VAR_IN_OUT
      IO_Struct : "MyUDT_mit_DT" ;
    END_VAR
    
    VAR_TEMP
      Temp_Struct : "MyUDT_mit_DT" ;
      tempDT1 : DATE_AND_TIME ;
      tempANY : ANY ; //zum zusammenbasteln eines ANY-Pointers
      result : INT ;
    END_VAR
    
      //Beispiele: den DATE_AND_TIME von IN_OUT kopieren // xx Byte Codegröße der Zeile bei SCL V5.3 SP5
      "DB1".Dest_DT := IO_Struct.DT1; // 64 Byte
      result := BLKMOV(SRCBLK := IO_Struct.DT1, DSTBLK := "DB1".Dest_DT); // 92 Byte
      MyFunc(IN := IO_Struct.DT1); // 50 Byte
    
      //explizit mit TEMP-Variablen arbeiten
      tempDT1 := IO_Struct.DT1; // 40 Byte
    
      "DB1".Dest_DT := tempDT1; // 18 Byte
      result := BLKMOV(SRCBLK := TempDT1, DSTBLK := tempANY); //(tempANY vorher zusammenbasteln) // 84 Byte
      MyFunc(IN := TempDT1); // 46 Byte
    
      //ganzen Struct von IN_OUT in TEMP kopieren, dann den DATE_AND_TIME irgendwohin kopieren
      Temp_Struct := IO_Struct; // 48 Byte
    
      "DB1".Dest_DT := Temp_Struct.DT1; // 18 Byte
      result := BLKMOV(SRCBLK := Temp_Struct.DT1, DSTBLK := "DB1".Dest_DT); // 88 Byte
      MyFunc(IN := Temp_Struct.DT1); // 46 Byte
    
    END_FUNCTION_BLOCK
    PS: vom SCL-Compiler erzeugte Code-Größen je Zeile nachgetragen

    Harald
    Geändert von PN/DP (08.02.2016 um 14:05 Uhr) Grund: Code-Größe Compiler nachgetragen
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Andi_ (09.02.2016)

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 20.04.2015, 15:30
  2. Step 7 UDT Datenbausteine in Global Datenbausteine umwandeln
    Von Vogelfrei im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 30.05.2013, 00:18
  3. Global-DB mit Nullen vollschreiben
    Von Wagginator im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 16.05.2012, 09:05
  4. Erste schritte mit Global DB
    Von rabit im Forum Simatic
    Antworten: 26
    Letzter Beitrag: 31.03.2010, 00:17
  5. Antworten: 0
    Letzter Beitrag: 28.11.2005, 17:12

Lesezeichen

Berechtigungen

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