meine ausgelesene Gesamtmenge möchte ich jeden Tag um 24:00 Uhr abspeichern. Vieleicht mit einem Schieberegister!
Die Gesamtmenge setzt sich aus 3 real Zahlen zusammen (Hunderter, Tausender, Mill.) die ich alle in einem DB haben möchte. Das aktuelle Datum sollte auch noch hinzu kommen. Am besten alle hintereinander.
Dann gehe ich davon aus, dass du n mal die oben aufgezeichnete Struktur in einem Datenbaustein abspeichern willst, wobei mir aber nicht klar ist, warum du das REAL-Format wählst, aber das wird schließlich deine Sache sein.
Für die Problemlösung gibt es zwei prinzipielle Möglichkeiten:
a) du schiebst die Werte tatsächlich durch den Datenbaustein hindurch, oder
b) du verwendest den Mechanismus des Ringspeichers, dabei werden die Daten nach der Ablage im Datenbaustein nicht mehr bewegt.
Ich persönlich bevorzuge die zweite Art, da dies einem Grundsatz entspricht, die Daten nur zu bewegen, wenn es sich nicht vermeiden lässt.
1. Wenn man eine Struktur mit Elementen hat, die auf unterschiedlichen Datenformaten basieren, legt man zweckmäßig ein UDT-Definition der gewünschten Struktur an.
2. Es wird ein Datenbaustein eingerichtet, dessen erstes Element einen Index vom Typ INT aufnehmen soll.
3. Hiernach werden n mal die Struktur gemäß Punkt 1 (AWL-Lösung) oder besser gleich ein Array mit n Elementen der Struktur gemäß Punkt 1 (SCL-Lösung)eingetragen.
4. Der Index muss zum gegebenen Zeitpunkt mit n oder n-1 initialisiert werden. Warum, das hängt ganz von persönlichen Vorlieben ab. Die nachfolgende Beschreibung stellt darauf ab, dass der Index gemäß Punkt 2 von 1 bis n läuft.
Wenn man weiter in AWL programmieren will, sollte man die Anwendung der Adressregister AR1 oder AR2 beherrschen, es geht auch ohne, ist aber weniger elegant. Der Wert des Indexregisters wird immer mit dem zuletzt geschriebenen Datensatz assoziiert. Soll um 24:00 Uhr ein neuer Datensatz gespeichert werden, so muss zunächst der Index um 1 inkrementiert werden. Ist dabei der Wert größer als n, so wird der Wert des Index auf 1 gesetzt. Über den Index wird dann die Adresse (Pointer) des Speicherortes bestimmt, der den neuen Datensatz aufnehmen soll, diese wird dann in das Adressregister AR1 eingetragen. Jetzt kann man bequem mit simplen Lade und Transferbefehlen die Daten übernehmen:
L Hunderter
T DBR [AR1, P#0.0]
L Tausender
T DBR [AR1, P#4.0]
usw.usf.
Wenn man mit SCL programmieren will, ergeben sich elegantere Möglichkeiten. Aber aufpassen beim Wert des Indexes für die Indizierung eines Arrayelementes, die laufen dann von 0 bis n-1!!! In meinem Beispiel läuft der Index "neu" von 1 bis n.
neu := neu + 1; // neu ist der Index auf den nächsten Datensatz
IF (neu > n) THEN neu := 1; END_IF;
Für das Speichern in das 0-te Element hat also "neu" den Wert 1!
Mengendaten.Satz[neu - 1].Hunderter := Hunderter;
Mengendaten.Satz[neu - 1].Tausender := Tausender;
That's all! Zum Lesen der Daten kann man ähnlich verfahren.
Die Klammerung in der IF-Abfrage ist nicht vorgeschrieben, sie macht aber ein Programm lesbarer, in der Hochsprache C ist dagegen die Klammer strikt vorgeschrieben, was auch einen Sinn ergibt. Für mich ist es jedenfalls unverständlich, warum man in einer modernen Zeit das SCL in Anlehnung an Pascal entwickelt hat, C würde ein besseres Konzept ergeben und insgesamt weniger Tipparbeit bedeuten. Na ja, wer auch immer das verbrochen hat! Interessant ist es jedenfalls sehr oft, was der SCL-Compiler an MC7-Code zusammenbastelt, mit ein paar Tricks kann man sich den Code in AWL anschauen und sehr oft ergreift mich das Grausen - aber das steht auf einem anderen Blatt.
Zum Abschluß: das war nur der Anriß von möglichen Lösungswegen und wie immer, es führen viele Wege nach R.... ;-)
Gruß Barnee