TIA Inhalt DB (effizient) auf Ausgangsbereich kopieren (vllt. MOVE_BLK(_VARIANT), SERIALIZE, FOR, ...), aber wie?

Need4Speed

Level-2
Beiträge
32
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

(TIA V17, S7-1500; wenn möglich auch V15 noch)

ich versuche gerade den Inhalt eines DB (kann für meine Zwecke sowohl Instanz- als auch GlobalDB sein; ist recht groß/lang (1344 Bytes)) auf den Ausgangsbereich zu kopieren. SERIALIZE klingt ja wie gemacht dafür, habe aber nur Beispiele dafür mit Datenbausteinen gefunden. Kennt ihr eine Möglichkeit, wie man SERIALIZE (bzw. DESERIALZE) dazu bringen könnte, "statStore" auf den Ausgangsbereich zu kopieren? Vielleicht indem man den ein Struct/UDT verwendet?

Hier im Forum habe ich https://www.sps-forum.de/threads/ti...r-nach-array-of-byte.84169/page-2#post-633238 gefunden; dort wird auf https://support.industry.siemens.com/cs/document/57132240/wie-programmieren-sie-in-step-7-(tia-portal)-die-überlagerung-von-variablen-mit-dem-schlüsselwort-at-?dti=0&lc=de-DE verlinkt. Dort:

Die Überlagerung von Variablen ist für Codebausteine mitStandardzugriff und für Codebausteine mit optimiertem Zugriff möglich, wobeiSie bei Codebausteinen mit optimiertem Zugriff die Remanenzeinstellung “Im IDBsetzen“ wählen müssen.

Mal so versucht und es geht auch (man muss nur wirklich im Deklarationsteil des FB das "retain" im "idb" aktivieren).

Code:
#RetVal := Serialize(SRC_VARIABLE:="DB_Array_1344", DEST_ARRAY=>#LocalStaticArrayRetainInIDB, POS:=#SerPos);

Klingt augenscheinlich vielversprechend, aber jetzt fehlt mir noch der Schritt, "#LocalStaticArrayRetainInIDB" auf den Ausgangsbereich zu kopieren. (Wirkt aber irgendwie alles zu kompliziert; früher (S7 Classic) war alles noch so einfach :p)

Eine Idee wäre noch, einen Array-DB anzulegen mit derselben Länge (also z.B. Array 0..1343 OF Byte) anzulegen, und dann mit einer FOR Schleife zu kopieren. Dieser naive Ansatz geht leider nicht (klingt auch nicht sinnvoll, da manuell mit einer Schleife drüber zu gehen):

Code:
#offset_ausgang := 444;
FOR #i := 0 TO 1343 DO
  %QB[#offset_ausgang + #i] := MeinArrayDB.data[#i];
END_FOR;

Wäre es mit MOVE_BLK oder MOVE_BLK_VARIANT vielleicht möglich? Hat jemand noch Ideen? Vielen Dank vorab!!

Viele Grüße, Jürgen
 
Wenn du einen UDT mit der Struktur erstellst und im DB eine Variable mit dem UDT anlegst und eine PLC-Variable auf die Ausgangsadresse mit dem UDT deklarierst, dann kannst du einfach schreiben: Ausgangsbereich := MyDB.DBbereich;

PS: indirekt adressiertes Schreiben auf Ausgangsadressen ist eher schlechter Programmierstil und bei manchen Kunden auch explizit verboten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sind das 1344 Bytes für 1 Gerät, und ist das 1 Transferbereich ?
Die max Anzahl Bytes für ein Profinet Gerät ist 1440, aber wenn es um ein Profinet I-Device handelt, dann ist die grösste einstellbare Transferbereich in TIA 1024 Bytes.
Ich vermute das die 1344 Bytes in mehrere Transferbereiche aufgeteilt werden müssen. Und dann muss man sich um die Datenkonsistenz kümmern, wenn sämtliche 1344 Bytes konstent übertragen werden müssen.

Handelt es sich hier um Daten die eigentlich nicht Realtime sind ?
 
Zurück
Oben