Elemente einer Struktur initialisieren

Tigerente1974

Level-3
Beiträge
1.826
Reaktionspunkte
293
Zuviel Werbung?
-> Hier kostenlos registrieren
S7-300, Step7 V5.5, SCL

Folgende Aufgabenstellung:

Ich habe immer wieder Anwendungen, in denen eine unterschiedliche Struktur (UDT) in einem Global-DB als Array abgelegt ist.
Z.B. werden da Daten von einem Platz zum anderen übergeben. Das klappt auch problemlos. Jetzt möchte ich aber die Daten an bestimmten Feldelementen des Arrays auch mal löschen / initialisieren.
Für meine Zwecke genügt es, wenn alle Strukturelemente = 0 bzw. FALSE sind.
Aktuell löse ich das so, dass ich das Array mit dem Index 0 verwende, in dem auch alle Strukturelemente 0 / FALSE sind:

Code:
Status_SFC20:=BLKMOV(SRCBLK :="Daten".Platz[0],DSTBLK :="Daten".Platz[4]);

Die Daten an Platz 4 werden so z.B. initialisiert. Das funktioniert auch, birgt aber die Gefahr, dass jemand mal versehentlich irgendwas in das Array[0] reinschreibt.

Falls es da etwas "Fertiges" gibt, wäre mir wichtig, dass ich die Länge des "Löschbereichs" nicht handisch anpassen muss, wenn die Struktur verändert wird. Ich strebe also keine Lösung an, bei der ich schreiben muss an welcher Adresse im DB der zu löschende Bereich beginnt und wie lang dieser ist.

Jemand eine Idee für mich?
 
Hallo,

so, wie du es machst ist es m.E. eine von 2 Möglichkeiten, es zu realisieren - ich mache es auch aus Bequemlichkeit schon so dann und wann so ... ;)

Die andere Möglichkeit wäre, auf den zu löschenden Bereich eine gleich große AT-Sicht zu legen, die aus z.B. einem Array of DINT's besteht, denen du dann "0" zuweisst.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Daten an Platz 4 werden so z.B. initialisiert. Das funktioniert auch, birgt aber die Gefahr, dass jemand mal versehentlich irgendwas in das Array[0] reinschreibt.

Falls es da etwas "Fertiges" gibt, wäre mir wichtig, dass ich die Länge des "Löschbereichs" nicht handisch anpassen muss, wenn die Struktur verändert wird. Ich strebe also keine Lösung an, bei der ich schreiben muss an welcher Adresse im DB der zu löschende Bereich beginnt und wie lang dieser ist.
Hallo Tigerente,
genau dafür gibt es den SFC21 (Fill).
Als Eingangsparameter sagst du mit was dein Struct gefüllt werden soll, in deinem Fall "0"
Als Ausgang legst du den Struct an.
Nun werden genau so viele Byte wie der Ausgang Struct lang ist, mit dem Wert vom Eingang überschrieben.
 
Klingt nach der von mir gesuchten Lösung. :)

Wie muss der Bausteinaufruf aussehen? Habe keine Lösung gefunden, die sauber durch den compiler läuft.
 
Klingt nach der von mir gesuchten Lösung. :)

Wie muss der Bausteinaufruf aussehen? Habe keine Lösung gefunden, die sauber durch den compiler läuft.
Code:
Status_SFC21 := FILL(BVAL := MB2, BLK :="Daten".Platz[4]);
So ungefähr.
Die Ein-/Ausgangsbezeichnung des SFC21 (???) weiß ich jetzt nicht auswendig. Für das MB2 kannst du einfach eine Temp vom Typ Byte nehmen und dieser "0" zuweisen.
Einfach in SCL unter Bausteinaufrufe den SFC21 reinholen.

Edit: Schnell nachgeschaut wie die Parameter heißen
 
Zuletzt bearbeitet:
Zurück
Oben