DB auslesen

Zuviel Werbung?
-> Hier kostenlos registrieren
1. Dein Schreibzeiger setzt sich selbstständig zurück, warum dann die zusätzlichen Eingangsvariablen #DS-Reset und #DS_Add?
Mein FC70 aus Beitrag #7 realisiert einen Ringpuffer/Archiv für 10000 Datensätze je 24 Byte.
Da diese 10000 Datensätze nicht in einen DB passen, ist der Puffer auf 4 DB je 2500 Datensätze aufgeteilt.
Im ersten DB ist der Schreibzeiger, er merkt sich die Nummer des zuletzt geschriebenen Datensatzes 0 bis 9999.
Damit beim Start auf den ersten Datensatz Nummer 0 geschrieben wird, ist der Schreibzeiger mit -1 initialisiert
(könnte auch 9999 sein).

Immer wenn ein Datensatz hinzugefügt werden soll, dann ist der Baustein-Eingang DS_Add für 1 Zyklus zu aktivieren.
Ist das Ende des Ringpuffers bei Datensatz Nummer 9999 erreicht, dann beginnt der FC70, die Datensätze ab Datensatz
Nummer 0 zu überschreiben. Der Schreibzeiger setzt sich genaugenommen nicht zurück, sondern schließt den Ringpuffer,
indem am linearen Ende des Puffers auf den Anfang des Puffers weitergeschaltet wird (Überlauf, Wrap). Das macht das MOD.

Wenn der Puffer explizit von vorn bei Datensatz Nummer 0 beginnen soll, dann ist der Baustein-Eingang DS_Reset zu aktivieren.
Das stellt den Schreibzeiger so, daß der nächste Datensatz in den ersten Datensatz des Ringpuffers geschrieben wird.

2. Wie kommt die Datensatz-Nr. zustande? Die DB Auswahl kann ich noch nachvollziehen, oder rechne ich falsch?
Der Schreibzeiger zählt die Datensatznummern 0 bis 9999. Der Ringpuffer ist aber "physikalisch" auf 4 DB aufgeteilt.
Deshalb wird berechnet, in welchem DB sich der zu schreibende Datensatz befindet und der wievielte Datensatz innerhalb
dieses DB das ist. Das macht die Division der Datensatznummer durch die Kapazität der Teil-DB = 2500 Datensätze.
Code:
// Schreibzeiger "zuletzt geschriebener Datensatz" 1 Datensatz weiter stellen
      L     "A-Puffer1".DS_Pointer ;    // -1..0..9999
      +     1 ;                         // nächster -> 0..1..10000
      L     10000 ;                     // max Anzahl Datensätze
      MOD   ;                           // auf 0..9999 begrenzen, ggf. Wrap
      T     "A-Puffer1".DS_Pointer ;    // und merken

// Anfangsadresse neuer Datensatz im Aufzeichnungspuffer berechnen
[COLOR="Red"]// hier ist die Nummer des aktuell zu schreibenden Datensatzes noch im AKKU1[/COLOR]
      L     2500                        // 2500 Datensätze je Teil-DB
      /I                                // 0..9999 -> 0..3 / AKKU1-H -> 0..2499
// AKKU1-L: Quotient 0..3 = DB-Selector -> Nr Datensatz-DB DB71..DB74
// AKKU1-H: Div.Rest 0..2499 = Datensatz-Nr im Puffer-Teil-DB
Beispiel: Datensatz 5203 soll geschrieben werden
5203 / 2500 = 2 Rest 203
Im AKKU1-L-Word steht nach der Division der Quotient 2 und im AKKU1-H-Word steht der Divisionsrest 203.
(siehe auch die Step7-Hilfe zu /I).
AKKU1-L (Quotient) wählt nun den DB: DB71 + 2 = DB73
AKKU1-H (Divisionsrest) ergibt die Datensatznummer innerhalb dieses DB73: Datensatz 203

3. Und zu guter letzt, wozu ist der Schiebe rechts Befehl gut? Da komm ich nicht hinter.
SRD 16 schiebt den Divisionsrest (203) vom AKKU1-H-Word (Bits 16 bis 31) in das AKKU1-L-Word (Bits 0 bis 15).

Gruß
Harald
 
Zurück
Oben