FIFO Baustein für Array´s

Juergena

Level-2
Beiträge
120
Reaktionspunkte
14
Hallo zusammen,

ich habe ein Problem und komme einfach nicht richtig auf die Lösung. Ich habe mir die verscheidenen Beiträge im Forum bzgl. FIFO angeschaut und habe auch einen FiFO mit DINT am laufen nur für die benötigte Array Fifo Problematik steh ich auf dem Schlauch. Ich speichere in einen Db402 eine errechnete Umrüstzeit in TOD und eine Systemzeit mit Datum im Format Date_and_Time. Nun will ich mittels Fifo das Array immer durchschieben sobald der neue Umrüstvorgang beendet wurde und neue Daten vorliegen. Hat jemand einen FIFO Baustein der dies als Array macht oder kann mir hier bei der Lösung helfen?

Gruß

Jürgen
 

Anhänge

  • Db402.JPG
    Db402.JPG
    17,8 KB · Aufrufe: 63
  • UDT402.JPG
    UDT402.JPG
    24,5 KB · Aufrufe: 55
Hallo Jürgen,

wie ich dein Problem verstehe möchtest du immer einen Zeitstempel zu deinen Array hinzufügen. Sobald 101 Zeitstempel gespeichert wurden, soll der letzte einfach "rausfallen". Ist das richtig? Wenn ja benötigst du kein FIFO, da du ja keine Daten löschen möchtest.

Ich würde da eher eine Art Ringbuffer verwenden und darauf verzichten immer alle Daten "durchzuschieben". Dies könntest du mit einer Index Variablen im ersten DB realisieren, welche dir immer den Index des letzten Elements anzeigt, was zum Array hinzugefügt wurde.
 
Hallo,

genau richtig. Irgendwie seh ich vor lauter Bäumen grade den Wald nicht mehr. Du willst also wenn bei z.b. 100 anfangen die Werte rein schreiben und sobald die drin sind die Zählvariable z.b. -1 machen usw.?
 
Hi,

ich stelle es mir so vor, dass du einen DB mit einer Index Variablen (INT) und einem Array mit X Elementen hast. Die Index Variable gibt an, an welcher Stelle du dein Zeitstempel in das Array schreibst (Array[Index]). Das Array wird also von oben nach unten gefüllt. Ist das Array zu ende überschreibst du einfach wieder das erste Element und setzt den Index zurück.

Diese Lösung erspart dir das umkopieren aller Arrayelemente! Du kannst einfach anhand des Indices auf den zuletzt gespeicherten Zeitstempel zugreifen. Der Implementierungsaufwand ist nicht allzu groß und ist mittels indirekter Adressierung lösbar.

Ich habe vor langer Zeit mal einen "Logger" geschrieben, ich werde morgen mal schauen, ob ich ihn noch irgendwo finde.
 
...
Sobald 101 Zeitstempel gespeichert wurden, soll der letzte einfach "rausfallen". Ist das richtig? Wenn ja benötigst du kein FIFO, da du ja keine Daten löschen möchtest.

Ich würde da eher eine Art Ringbuffer verwenden und darauf verzichten immer alle Daten "durchzuschieben". Dies könntest du mit einer Index Variablen im ersten DB realisieren, welche dir immer den Index des letzten Elements anzeigt, was zum Array hinzugefügt wurde.
@Beckx-net,
genau das, was Du da beschreibst, ist ein First In First Out Speicher.
Ob dabei die Daten in den Speicherzellen durchgeschoben werden oder nur der Index reihum indiziert wird, spielt keine Rolle, denn Fakt ist, das die ältesten Daten (zuerst rein) bei vollem Speicher als Erstes überschrieben (zuerst raus) werden bzw. "rausfallen".


Das Gegenteil wäre dann der Last In First Out, wo die neuesten Daten als Erstes wieder herausgenommen werden.
 
Zurück
Oben