Step 7 Datenbausteine - unbekannte Anzahl von Variabeln

jule

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle miteinander,

ich bin derzeit dabei, mein Wissen über das (vor über einem Jahr mal in der Ausbildung behandelte) Step7 für meinen neuen Job aufzufrischen. Hatte schon häufiger Aufgaben gehabt, bei denen ich hier Hilfe gesucht hatte, aber hatte noch nie die Notwendigkeit mich mal direkt an euch zu wenden. Aber nun hab ich ein Problem, welches ich nach zeitreicher Recherche immer noch nicht gelöst habe.

Kann sein, dass ihr mich vlt hauen werdet, aber in der Ausbildung habe ich mich schon teilweise recht schwer damit getan und in diesem einem Jahr habe ich das ganze eigentlich erfolgreich verdrängt :lol:


Ich habe folgende Aufgabe:
"Schreiben Sie einen Baustein der irgendwo in ein Programm eingebunden werden kann und einen Wert (z.B. ein Rechenergebnis das in einem MW steht) in einen eigenen DB mitprotokolliert, so dass die Werte des MW der letzten Zyklen zur Verfügung stehen"

Gesagt, getan, es läuft auch (mithilfe von Pointern)... Aber nur solange ich die Anzahl der im DB deklarierten Variablen nicht überschreite. Dh ich habe in meinem DB 3 Variablen vom Typ INT deklariert, sobald ich aber mein Rechenprogramm, ein 4. mal durchläuft und somit das Rechenergebnis zum 4. Mal in den DB geschrieben werden soll, geht die CPU auf Stop mit der Fehlermeldung "Bereichslängenfehler beim Schreiben", da ich ja zuvor keine 4. Variable im DB deklariert habe.

Nun meine Frage: wie kann man dies umgehen, wenn ich nicht weiß, wie oft das Rechenprogramm durchlaufen soll. Ich kann ja schlecht die maximale Anzahl Variablen deklarieren, nur weil ich nicht weiß, wie viele Variablen es werden können... Muss man im DB irgendetwas besonderes einstellen oder gibt es da einen Befehl?

Ich danke euch schon einmal und bitte nicht hauen ;)

Viele Grüße, Jule
 
Hai, als erstes mal genau klären WIEVIEL werte mitgeloggt werden.

Den DB dann ein paar einträge länger machen.

Und dann würde ich die Sache als Ringspeicher anlegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider funktioniert das bei Siemens etwas anders als in einigen Hochsprachen.
Die Anzahl/Größe muss deklariert und (leider) auch eingehalten werden.
Möglicher Workaround: Du legst Dich auf eine Anzahl von benötigten Variablen fest und schreibst die Daten nach dem FIFO-Prinzip in den DB.
 
Du weißt doch aber wieviel Platz Du in dem DB hast, sprich wie groß das Merk-Array ist. Den mußt Du auf die gewünschte "Archiv"-Größe festlegen.

Immer wenn die Routine einen neuen Wert zum Merk-Array hinzufügt, dann muß sie den ältesten Wert entfernen - dann kann das Merk-Array auch nicht "überlaufen".
Damit man weiß welcher Wert der älteste ist (wo die Merkliste angefangen hat)
- kann man festlegen, daß das der erste Wert in der Liste ist (der erste Array-Platz), muß dann aber vor dem Hinzufügen des neuen Wertes die gesamte Liste um 1 Element umspeichern
- oder das ganze elegant als Ringpuffer realisieren (ein neu hinzugekommendes Element überschreibt einfach das älteste Element. Es wird nur ein Pointer auf den ältesten Wert benötigt, der nach jedem Hinzufügen weitergestellt wird).

Harald
 
Danke für den Tipp mit dem Ringpuffer! Was ich bisher gesehen habe, sollte das eigentlich die Lösung für mein Denk-Problem sein!
Werd mich mal darüber belesen müssen!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Habs mittlerweile mal umprogrammiert. Läuft super!

Komm mir ein bisschen doof vor, hatte bei Suche nach der Lösung auch etwas von Ringpuffer gelesen, aber habe dem keine Beachtung geschenkt weil ich den Zusammenhang nicht verstand... Hätte ich mal nachgeschaut was dahinter steckt, dann hätte ich hier noch extra fragen müssen. :oops:
 
Zuletzt bearbeitet:
Zurück
Oben