# FIFO Baustein für Array´s



## Juergena (3 Juli 2012)

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


----------



## Beckx-net (3 Juli 2012)

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.


----------



## Juergena (3 Juli 2012)

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.?


----------



## Beckx-net (3 Juli 2012)

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.


----------



## volker (4 Juli 2012)

schau mal hier http://lischis-home.dyndns.org/files/SPS/S7_Bausteine/dirindex.php
FiLo_LiFo.zip. da ist unter anderem auch ein fifo für datenblöcke drin


----------



## hucki (4 Juli 2012)

Beckx-net schrieb:


> ...
> 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 *F*irst *I*n *F*irst *O*ut 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 *L*ast *I*n *F*irst *O*ut, wo die neuesten Daten als Erstes wieder herausgenommen werden.


----------

