S7 Global DB an FB anbinden durch UDT mit Data_And_Time

Andi_

Level-1
Beiträge
75
Reaktionspunkte
2
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
 
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 ; [COLOR="#008080"]//zum zusammenbasteln eines ANY-Pointers[/COLOR]
  result : INT ;
END_VAR

  [COLOR="#008080"]//Beispiele: den DATE_AND_TIME von IN_OUT kopieren // xx Byte Codegröße der Zeile bei SCL V5.3 SP5[/COLOR]
  "DB1".Dest_DT := IO_Struct.DT1; [COLOR="#008080"]// 64 Byte[/COLOR]
  result := BLKMOV(SRCBLK := IO_Struct.DT1, DSTBLK := "DB1".Dest_DT); [COLOR="#008080"]// 92 Byte[/COLOR]
  MyFunc(IN := IO_Struct.DT1); [COLOR="#008080"]// 50 Byte[/COLOR]

  [COLOR="#008080"]//explizit mit TEMP-Variablen arbeiten[/COLOR]
  tempDT1 := IO_Struct.DT1; [COLOR="#008080"]// 40 Byte[/COLOR]

  "DB1".Dest_DT := tempDT1; [COLOR="#008080"]// 18 Byte[/COLOR]
  result := BLKMOV(SRCBLK := TempDT1, DSTBLK := tempANY); [COLOR="#008080"]//(tempANY vorher zusammenbasteln)[/COLOR] [COLOR="#008080"]// 84 Byte[/COLOR]
  MyFunc(IN := TempDT1); [COLOR="#008080"]// 46 Byte[/COLOR]

  [COLOR="#008080"]//ganzen Struct von IN_OUT in TEMP kopieren, dann den DATE_AND_TIME irgendwohin kopieren[/COLOR]
  Temp_Struct := IO_Struct; [COLOR="#008080"]// 48 Byte[/COLOR]

  "DB1".Dest_DT := Temp_Struct.DT1; [COLOR="#008080"]// 18 Byte[/COLOR]
  result := BLKMOV(SRCBLK := Temp_Struct.DT1, DSTBLK := "DB1".Dest_DT); [COLOR="#008080"]// 88 Byte[/COLOR]
  MyFunc(IN := Temp_Struct.DT1); [COLOR="#008080"]// 46 Byte[/COLOR]

END_FUNCTION_BLOCK

PS: vom SCL-Compiler erzeugte Code-Größen je Zeile nachgetragen

Harald
 
Zuletzt bearbeitet:
Zurück
Oben