Step 7 FIFO Speicher mit Löschfunktion für beliebige Einträge

smartie

Level-1
Beiträge
298
Reaktionspunkte
22
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Kollegen,

Samstag morgen und ich sitze wieder mal in der Firma. - Der einzige Trost ist das ich damit wahrscheinlich nicht alleine bin.
Und so hoffe ich das mir vielleicht der ein oder andere von euch trotzdem helfen kann/mag.

Ich bin gerade am grübeln wie ich meine Funktion realisieren könnte, ich habe dazu verschiedene Ansätze so richtig gefallen
tut mir aber eigentlich noch keiner.

Mit einem Scanner wird am Einlauf einer Maschine je Produkt ein DatamatrixCode erfasst. Dieser soll dann in ein FIFO Register
gespeichert werden und sobald das Produkt den Auslauf ereicht wieder abgerufen werden.
- Diese Funktion habe ich so schon mal umgesetzt und sollte dank fertigem FB eigentlich kein Problem mehr sein.

Mein "Problem" besteht darin das der Kunde über die Visu die Möglichkeit haben will einzelne Datensätze des FIFO manuell zu
löschen (am besten noch mit Speicherung wann welcher Eintrag gelöscht wird).

- Wie würdet ihr diese Aufgabe lösen?

Einer meiner Ansätze sieht vor das beim manuellen Löschen eines Datensatzes der enstprechende Speicherplatz gesperrt wird.
Wird dann nach FIFO Reihenfolge ein gesperrter Speicherplatz abgefragt wird der Index direkt um Wert 1 erhöht und der darauf
folgende Datensatz wird ausgegeben.
Das würde bedeuten ich müsste doppelt so viele Speicherplätze im FIFO haben wie es Plätze auf der Fördertechnik gibt, damit
theoretisch jeder Datensatz "gelöscht" bzw. gesperrt werden kann.

Ich denke mit diesem Ansatz könnte man das ganze theoretisch lösen.

Als Problem sehe ich (wie eigentlich bei jeder Lösung) die Darstellung der Speicherplätze in der Visu. Hier sollen ja alle Einträge
in chronologischer Reihenfolge dargestellt werden.
- Im FIFO Speicher liegen die Einträge ja zwar gründsätzlich in chronoligischer Reihenfolge, aber der erste Speicherplatz im FIFO
ist nicht zwingend der erste Eintrag im FIFO (eigentlich ist er das nur nach dem ersten Schreibzugriff in den FIFO).

Wie könnte man das einfach lösen? - Hat jemand von euch eine Idee?

Zur Verfügung steht ein CPU314C-2DP und ein TP177B.

Gruß smartie
 
etwas ähnliches habe ich schon mal folgendermassen gelöst.
ein db in dem die datensätze alle intereinander stehen. es gibt keine lücken.
wird nun ein datensatz gelöscht werden alle dahinter folgenden datensätze 1 nach oben geschoben.
der letzte wird gelöscht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit dem Ansatz hatte ich auch schon gespielt. Das würde aber bedeuten das sowohl beim abrufen des aktuellen Datensatzes,
als auch beim Löschen eines Datensatzes alle anderen Datensätze nacheinander verschoben werden müssten.

Also würde ich dann zunächst den gelöschten oder zuletzt abgerufenen Speicherplatz mit SFC21 FILL initialisieren, dann den
darauf folgenden Speicherplatz dorthin kopieren und dann den Ablauf nacheindander für die weiteren Speicherplätze ausführen.

Bei, in meinem Fall 16 Plätzen mit jeweils 240 Zeichen vermute ich das die CPU ganz schön zu tun hat. - Wie siehst du das?
 
ja. genauso funktioniert es.
könnte einen augenblick dauern. in dem von mir angesprochenem beispiel ist mein db 80 mal 112 byte gross. also um einiges größer als deiner.
das läuft auf 315er cpu's zyklusprobleme hatte ich dadurch bisher nicht. wie lange es geau dauert weiss ich im mom nicht.
einen filo der datensätze verschiebt findest du auf meiner hp.
 
Mache zusätzlich zum Speicher der 16 Datensätze eine Verwaltungsliste (Array) mit 16 INT (oder BYTE), wo nur der Index der belegten Datensätze drinsteht. Dann müssen beim Entfernen von Datensätzen nur 15 INT umgespeichert werden.

Beispiel FIFO mit 3 Datensätzen in Datensatz 16, 1 und 5:
Liste (1): 16
Liste (2): 1
Liste (3): 5
Liste (4): 0

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Problem chronologische Anzeige auf der Visu ohne Umspeichern:
Du könntest den FIFO auf 16 Datenbausteine aufteilen und in der Visu die Datensätze per Adress-multiplex mit gemultiplexter/dynamischer DB-Nummer anzeigen.

Harald
 
Warum meinst Du, daß Du doppelt soviele Speicherplätze im FIFO haben mußt wie real vorhandene Plätze?
Wie lange sollen die gelöschten Datensätze noch zum lesen verfügbar bleiben? Irgendwann müssen die aus dem System entfernt werden.

Kannst Du sicherstellen, daß kein Produkt den Auslauf erreicht und dadurch den FIFO-Inhalt verändert, während der Kunde die Datensätze bearbeitet?

Harald
 
Danke für die Vorschläge. Ich schau mir im Moment die Beispiele von volker an.

Ja, durch das Programm kann ich sicherstellen das keine Datensätze in den FIFO ein- oder ausgetragen werden während
die Daten manuell bearbeitet werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde den zu löschenden Datensatz im FIFO lassen, nur ein Bit setzen und ev. Benutzer und Zeit dazuschreiben.
Wenn nun der gelöschte Datensatz aus dem FIFO kommt, den dann in einen anderen DB schieben, so hast du dann auch dein "Archiv".
 
Ich würde auch eher zu etwas wie dem Vorschlag von Winman tendieren.
Du gibst dem Datensatz entweder ein Statusbit mit. Ist das TRUE (z.B.) dann verwendest du den Datensatz - sonst nicht (sondern den nächsten danach).
In jedem Fall mußt du ja auch wenn der Kunde den Datensatz löscht und das mit einem Zeitstempel dokumentieren möchte (oder wie auch immer) das wieder irgendwo abspeichern. Sonst macht diese Maßnahme ja eigentlich gar keinen Sinn ...
Wie verfährst du generell mit deinen Datenblöcken ?

Gruß
Larry
 
Guten Morgen zusammen,

vielen Dank erst mal für die Vorschläge. Über das Wochenende (also gestern :wink:) habe ich mir jetzt folgenden Ablauf überlegt:

Davon ausgehend das der FIFO bei Beginn leer ist und mein Schreibe-Zeiger auf dem ersten Datensatz steht, wird der erste
Eintrag dorthin gespeichert. Daraufhin wird der Zeiger um 1 Datensatz (300 Byte) erhöht. Damit ist der nächste Datensatz zum
Speichern angewählt.
- Soweit nichts neues.

Sobald ein Datensatz abgefragt wird, wird der erste Eintrag aus dem FIFO ausgegeben. Anschließend kopiere ich alle darauf
folgenden Datensätze mit BLKMOV in ein temporäres ARRAY, lösche das eigentliche FIFO ab und kopiere danach das Array
wieder zurück, aber um 300 Byte (1 Datensatz) nach oben verschoben wieder zurück. Danach wird der Schreibe-Zeiger wieder
um einen Datensatz nach oben korrigiert.

Dadurch ist sichergestellt das die Reihenfolge und Adresse der Datensätze immer gleich ist. - Also Datensatz 1 - Adresse 0,
Datensatz 2 - Adresse 300 un so fort. Somit sollte die Visualisierung der Datensätze kein Problem darstellen.

Soll ein Datensatz gelöscht werden, dann wende ich den Vorschlag von winmann an und kennzeichne diesen Datensatz (mit
neuem Zeitstempel) als gelöscht. Sobald er am Ausgang ankommt kopiere ich Ihn in ein Archiv und rufe direkt im Anschluss
den nächsten folgenden Datensatz ab.

Soweit zur Theorie. - Was haltet ihr davon?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kannst du sicherlich so machen ...
Ich hatte allerdings eingangs angenommen, dass du mit 2 verschiedenen Zeigern arbeiten willst - einen, der angibt an welchem Index deines Array's der nächste Datensatz zu schreiben ist, und einer, der angibt an welchem Index deines Array's der nächste Datensatz zu lesen ist. Das würde Umkopieren sparen (und bedeutet somit weniger Arbeit für die SPS).
Aber ob nun so oder so - entscheidend ist halt, erkennen zu können, dass ein Datensatz noch relevant ist oder nicht ...

Gruß
Larry
 
Das ist schon klar, das das der SPS und mir Arbeit sparen würde wenn ich mit zwei Zeigern arbeite.
Aber dann habe ich noch immer keine Lösung wie ich die Datensätze in chronologischer Reihenfolge
am Bediengerät visualisiere.
 
Zurück
Oben