Werte dynamisch in ein DB schreiben ("Umlaufarchiv")

DerMatze

Well-known member
Beiträge
525
Punkte Reaktionen
21
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Zusammen,

im Rahmen meiner Hausautomatisierung mit einer S7 300 lese ich von einem Stromzähler (S0 Schnittstelle) die Impulse ein. Das funktionert auch tadellos. Nun möchte ich das Programm erweitern:
- am Ende eines jeden Monats soll der aktuelle "kWh Stand" des Zählers gespeichert werden
- es soll eine Art Umlaufarchiv entstehen

Im Idealfall möchte ich mir einen FB erstellen der das macht, jedoch müsste dieser Baustein in einen DB "dynamisch" schreiben. Soll heißen:
Januar = DBW0
Februar = DBW2
März = DBW4
usw
Es sollen insgesamt 24 Monate in dem DB abgebildet werden, erst dann kann der DB wieder von vorn überschrieben werden.
Das Monatsende kann ich schon erfassen, lediglich das "dynamische transferieren" bereitet mir Probleme:confused:.

Mit Arrays/Schieberegister/FIFO oder ähnliches hatte ich noch nix zu tun, dies bitte ich zu berücksichtigen.

Ich verwende Step7 v5.5, die CPU ist eine 315 2DP (alte Bauform).

Vielen Dank im Voraus!

Gruß
DerMatze
 

Pinky

Well-known member
Beiträge
59
Punkte Reaktionen
9
Zuviel Werbung?
->Hier kostenlos registrieren
Ginge vielleicht auch folgendes:
letzter Monat = DBW 0
vorlezterMonat = DBW 2
vorvorletzter Monat = DBW 4
... etc.....????
dann schau dir doch mal den SFC20 (BLKMOV) an.
Damit würde ich dann immer am Ende des Monats die DBW 0 bis 46 verschieben in die DBW 2 bis 48.
Danach nur letzten Monat wieder im DBW 0 speichern und fertig.
 

Thomas_v2.1

Well-known member
Beiträge
8.811
Punkte Reaktionen
2.700
Fifo oder Schieberegister braucht man nicht unbedingt
Eine einfache Variante wäre es die Adresse direkt aus dem Jahr und Monat zu berechnen:

Adresse = Jahr MOD 2 * 12 + Monat

Direkt kommt dabei ein Arrayindex raus der von 1-24 durchzählt. Die ersten 12 Monatswerte sind dann für gerade Jahreszahlen, die letzten 12 für die ungeraden.
Für indirekte Adressierung muss man diese Adresse noch mit der Datentypgröße multiplizieren.
 
OP
D

DerMatze

Well-known member
Beiträge
525
Punkte Reaktionen
21
Ginge vielleicht auch folgendes:
letzter Monat = DBW 0
vorlezterMonat = DBW 2
vorvorletzter Monat = DBW 4
... etc.....????
dann schau dir doch mal den SFC20 (BLKMOV) an.
Damit würde ich dann immer am Ende des Monats die DBW 0 bis 46 verschieben in die DBW 2 bis 48.
Danach nur letzten Monat wieder im DBW 0 speichern und fertig.
Hallo,
diese Variante habe ich noch gar nicht betrachtet, die ist natürlich auch denkbar.
Ich werde an Hand der Anreitze die ich hier bekommen habe mal etwas versuchen.
Rückmeldung folgt...
Vielen Dank.

Gruß
DerMatze
 
OP
D

DerMatze

Well-known member
Beiträge
525
Punkte Reaktionen
21
Zuviel Werbung?
->Hier kostenlos registrieren
Adresse = Jahr MOD 2 * 12 + Monat

Direkt kommt dabei ein Arrayindex raus der von 1-24 durchzählt. Die ersten 12 Monatswerte sind dann für gerade Jahreszahlen, die letzten 12 für die ungeraden.
Für indirekte Adressierung muss man diese Adresse noch mit der Datentypgröße multiplizieren.

Das hört sich schon recht dynamisch an, aber indirekte Adressierung beherrsche ich nicht...

Ich habe es nun so gelöst:
- ich ermittle das Monatsende eines jeden Monats (Schaltjahr ist berücksichtigt)
- wenn Monatsende, dann wird kurz vor 0Uhr ein Impuls erzeugt, dieser schiebt dann den jeweiligen Zählerstand in ein zum Monat definiertes Datenwort

realisiert ist es ersteinmal für 12 Monate, ist ja erweiterbar ;-)
Außerdem weiß ich welches Datenwort für welchen Monat ist, da der Inhalt nicht immer weiter geschoben wird - wie ich es erst wollte.
Das Datenwort wird dann erst übertschrieben wenn der Monat wieder "dran" ist, somit stehen die Daten jeweils für ein Jahr zur Verfügung.

MfG
DerMatze
 

hucki

User des Jahres 2014
Beiträge
5.957
Punkte Reaktionen
1.855
Kannst Du den Code nicht vlt. hier als Basis für andere Häuslebauer mit ähnlichen Wünschen posten?
 
Oben