Step 7 Schieberegister / Ablaufspeicher

FoodFighter

Active member
Beiträge
29
Punkte Reaktionen
2
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo allerseits,

ich stolpere immer wieder mal über folgende (exemplarische) Aufgabenstellung:
1. Mehrere Behälter werden nacheinander wahllos von einer Befüllgarnitur befüllt.
2. In den Behältern passiert irgendetwas (Kochen, Mischen, Rühren, Mahlen, ...whatever...) teilweise mit unterschiedlicher Verweildauer.
3. Die Behälter entleeren alle in einen gemeinsamen Ablassbehälter, daher müssen sie in exakt der Reihenfolge geleert werden, wie sie befüllt worden.

Die Gründe für die definierte Entnahme nach FIFO-Prinzip sind unterschiedlicher Natur. Teilweise geht es darum eine Chargen-Nummer beizubehalten, teilweise soll die Verweildauer gering gehalten oder der Prozess möglichst gleichmäßig gehalten werden, manchmal will man einfach nur wissen, wer welcher Behälter zuerst befüllt wurde und welcher als zweites. - Letztendlich tut der Grund wenig zur Sache: Es soll nach FIFO geleert werden.

Prinzipiell gibt es genau dafür fertige FIFO-Bausteine (der aus der OSCAT-Bibliothek ist mir persönlich sehr sympathisch, da er mit Arrays, statt mit DBs arbeitet).
Problem dabei ist oftmals, dass Fehler-Fälle damit schwer zu handhaben sind.
Beispiel:
- 3 Behälter werden in der Reihenfolge 2-1-3 Befüllt.
- Beim Prozess in Behälter 1 tritt ein unvorhergesehenes Ereignis ein, noch bevor Beh. 2 abgelassen hat. -> Es wird händisch eingegriffen und er wird außerhalb der Automatik-Reihenfolge im Handbetrieb geleert.
-> jetzt wird's schwierig bzw. umständlich das dem FIFO-Baustein mitzuteilen und den Array / DB anzupassen.

Lange Rede, wenig Sinn:
Ich fand nun mehrfach eine Schieberegister-Lösung nach einem ähnlichen Schema mit RS-Gliedern als Speicher.
(Das habe ich hier im Forum auch schonmal irgendwo ähnlich gesehen - finde es aber nicht mehr)

Hier mal als simples Beispiel in einem Logo-Programm (einfach, weil's kompakter ersichtlich wird, als S7-Netzwerke oder CFC-Pläne)

Screenshot 2021-11-02 22.46.32.png

Das Beispielprogramm habe ich auch mal in den Anhang gepackt.

Mit 3 "Behältern" ist das alles noch relativ kompakt und überschaubar.
Mit 6 Behältern wäre das Ganze schon doppelt so breit und doppelt so hoch.

Das Ganze funktioniert auch gut und tut was es soll.
Dennoch frage ich mich immer wieder, wenn ich vor solch einer Lösung sitze, ob das Ganze nicht "eleganter" und Ressourcensparender umsetzbar wäre.
Mir fällt tatsächlich wenig ein - daher hier die Frage in die Runde: Wie geht ihr mit solchen Aufgabenstellungen um bzw. hat jemand eine elegantere Lösung hierfür parat?

Ich bin fast geneigt mir einen fertigen FB mit 8 "Speichereingängen" zu bauen, um mir das wiederkehrende gleiche Schema zukünftig zu sparen, wenn es mal wieder der Fall wäre.
Dennoch finde ich die Aufgabenstellung auch gar nicht so unüblich, daher kann ich mir nicht vorstellen, dass es dafür nicht schon irgendwas sinnvoll nutzbares gibt.

Bin gespannt auf eure Ideen (gerne auch in CFC oder S7-FUP/KOP/AWL) :D
Danke

Grüße
Markus
 

Anhänge

  • Schieberegister.zip
    23,4 KB · Aufrufe: 1

Ralle

Supermoderator
Teammitglied
Beiträge
14.627
Punkte Reaktionen
3.482
Also ich würde mit tatsächlcih einen eigenen FIFO-Baustein bauen. Darin wird die Befüllreihenfolge gespeichert (3-2-1 ...). Wenn ein Behälter außer der Reihe geleert wird kann man einen Eingang "Clear" und einen Eingang "Behälternummer" vorsehen. Wird "Clear" betätigt durchsucht man den FIFO nach der Nummer und ersetzt diese durch -1. Wenn der FIFO geschoben wird und eine -1 erscheint am Ausgang, kann man einfach weiterschieben, denn der Behälter ist gelöscht. Man könnt auch nach dem Löschen den FIFO "zusammenschieben", aber da muß man ein wenig mehr programmieren ;-)
 

Heinileini

Well-known member
Beiträge
4.426
Punkte Reaktionen
925
Zuviel Werbung?
->Hier kostenlos registrieren
Um anderen ggfs die Fehlersuche zu ersparen - in der LOGO-Schaltung fehlen 2 Verbindungen:
B003 --> B038
B017 --> B039

Mein Ansatz wäre, in einem ArrayOfStruct mit einem Struct pro Behälter mit Information Date&Time zu speichern und Bool, ob befüllt oder leer.
- beim Befüllen und Entleeren den aktuellen Date&Time-Wert eintragen
- beim Befüllen eintragen, dass befüllt
- beim Entleeren eintragen, dass geleert
- beim Ermitteln, welcher Behälter als nächstes befüllt werden soll: ältesten "LeerEintrag" (bzw. noch nicht benutzten Eintrag) suchen
- beim Ermitteln, welcher Behälter als nächstes geleert werden soll: ältesten "VollEintrag" suchen

Sinn und Zweck in der Anwendung kann ich aber noch nicht erkennen.
Könnte mir nur vorstellen, dass man, wenn mehrere (oder alle) Behälter zum Befüllen bzw. Entleeren bereitstehen, von der Gelegenheit Gebrauch machen möchte, aus der Auswahl an Behältern - abweichend vom Schema "der n-te bleibt ewig der n-te" - freizügig den nächsten auswählen zu dürfen.

Anderer Ansatz wäre ein Array mit 1 Element pro Behälter.
Beim ersten Element die Nummer des ersten zu benutzenden Behälters eintragen u.s.w., nur damit die Reihenfolge nicht direkt an die BehälterNr gekoppelt ist.
 
Zuletzt bearbeitet:

Oje

Well-known member
Beiträge
63
Punkte Reaktionen
9
Schau dir mal das FIFO der LGF an (Siemens Beitrags-ID: 109479728). Da kann man auch Werte wieder aus dem Archiv rauslöschen.
Ob es aber genau auf deine Anwendung passt musst du prüfen. Die Lösung von Ralle solte damit aber zu 90% umgesetzt sein.
 
OP
F

FoodFighter

Active member
Beiträge
29
Punkte Reaktionen
2
Um anderen ggfs die Fehlersuche zu ersparen - in der LOGO-Schaltung fehlen 2 Verbindungen:
B003 --> B038
B017 --> B039
Oh...Tatsache - Mein Fehler, man möge es mir verzeihen.

Beides sehr interessante Ansätze, danke dafür.

Sinn und Zweck in der Anwendung kann ich aber noch nicht erkennen.
Ja...über Sinn und Zweck lässt sich bekanntlich oft streiten.
Meistens hängt es damit zusammen, dass die Automation noch mit dem Störfaktor Mensch beeinflusst wird.

Ich konkretisiere obiges Beispiel mal:

1. Ein Arbeiter nimmt eine Probe (z.B. Kartoffeln), diese bekommt eine ID zugewiesen, welche als Ausdruck vorliegt.
2. Der Arbeiter gibt die Probe in einen Zuführ-Behälter und legt die Ausgedruckte ID folgerichtig in eine Papier-Reihe
3. Der Zuführ-Behälter befüllt nach Freigabe des Arbeiters einen von 5 Wasch-Behältern, welche manuell (auch während des Programmablaufs) Vor- und abgewählt werden können sollen -> sie werden also u.U. Kreuz und quer ohne feste Reihenfolge befüllt.
2. In den Behältern wird die Probe für Zeit X gewaschen.
3. Sobald ein Behälter fertig gewaschen hat, wirft dieser auf ein Förderband aus, welches die Probe weiter zu einer nächsten Station befördert.
Dies Muss unbedingt in der Reihenfolge erfolgen, wie die Waschbehälter befüllt worden, DENN:
Die Ausdrucke mit den IDs werden regelmäßig von einem weiteren Arbeiter von der Befüllstation zur nächsten Station getragen.
Dabei wird die Sortier-Reihenfolge (Stapel) eingehalten und bei der nächsten Station werden die IDs wieder in umgekehrter Reihenfolge den Proben zur weiteren Bearbeitung zugeordnet.
Es folgen weitere Prozesse mit den Proben, die hier nicht mehr relevant sind.

Das Beispiel ist absichtlich nur wage beschrieben und macht mit Kartoffeln wohl wenig Sinn - ich hoffe der Vorgang wird dennoch klar.
(Ich bin mir momentan unsicher, inwiefern ich hier die Betriebsabläufe des Kunden schützen muss)

Klar zu erkennen sollte sein, dass es mehrere Störfaktoren gibt, die programmtechnisch schwer abfangbar sind:
1. Menschen
2. Es könnte passieren, dass eine Waschmaschine während des Waschvorgangs eine Störung hat - z.B. Bi-Auslösung, Endlagenfehler der Auswurfklappen, etc. pp.
Es Darf in diesem Fall nichts auf das Förderband ausgeworfen werden, bevor
-> 2a. die Störung beseitigt und die korrekte Reihenfolge eingehalten wurde oder
-> 2b. Die Waschmaschine manuell ausgeräumt/verworfen wurde und die zugehörige ID der Probe manuell im Papierstapel entfernt oder neu zugeordnet wurde.

Sinnhaftigkeit hin oder her, der Kunde bekommt, was der Kunde wünscht ... ich bin da auch oft anderer Ansicht, das möchte ich aber hier gar nicht großartig weiter ausdiskutieren - die Probleme kennen wir wohl alle.

Jedenfalls wäre dies nur ein konkreteres Beispiel, wo mir ein solcher Ablaufspeicher unter die Finger kam.
Ein anderes Beispiel wären einige Kochapparate, die nacheinander befüllt werden, wo ein solcher Ablaufspeicher genutzt wurde um das Niveau der darunterliegenden Ablassmaische für den weiteren Programmablauf "hochzurechnen" :

- Behälter 1 wurde zuerst befüllt -> lässt zuerst ab -> Niveau wird um 12% steigen
- als nächstes lässt Behälter 6 ab -> Niveau steigt um weitere 16%
- danach würde Behälter 3 ablassen -> Niveau würde um weitere 20% steigen
-> Summe der Niveaus + aktuelles Niveau ist größer 100% -> Behälter 3 müsste warten oder das Maischen-Niveau muss bis zum Ablass des Behälter 3 gesenkt werden


Vielleicht auch noch zu erwähnen wäre, dass es sich bei diesen Steuerungen entweder um Steinalte S5-Programme oder um PCS7-CFCs handelt.
In PCS7 bzw. CFC ist das mit den Standard-Bausteinen oft recht umständlich....gerade dann, wenn es eine klare Kundenvorgabe gibt, die sich auf eine spezielle Bibliothek beschränkt und eigene FB/FC sehr ungern gesehen werden.
Mit Arrays wird's in der Standard-CFC-Bibliothek m.W. schon schwierig.
 

Heinileini

Well-known member
Beiträge
4.426
Punkte Reaktionen
925
Zuviel Werbung?
->Hier kostenlos registrieren
(Ich bin mir momentan unsicher, inwiefern ich hier die Betriebsabläufe des Kunden schützen muss)
Nein, Du musst hier natürlich keine Geheimnisse preisgeben!
Das "Maischen-Niveau" ist wohl auch eher ein TippFehler, als ein durchgerutschter Hinweis auf die Branche. ;)

Inzwischen bin ich zu der Einsicht gelangt, dass es wohl so sein dürfte:
Alle Behälter sind geleert und nun darf eine neue Reihenfolge festgelegt werden, an der aber bis zur nächsten KomplettEntleerung festgehalten werden muss.

Ja, diese blöden StörEinflüsse, die einem in die Quere kommen können!
Und es passieren immer ausgerechnet die Dinge, die niemand voraussehen konnte.
Was tut man, wenn statt der Kartoffeln z.B. MarzipanKartoffeln gewaschen wurden?

Welche Strategien für "AusweichManöver" festgelegt werden können/müssen, das hat sicherlich Einfluss auf die geforderte Flexibilität und auf weitere, erforderliche händische Eingriffe, die dann auch andere Behälter betreffen.

Das Problem mit dem > 100% Füllstand spricht eher für eine schlechte Planung. Was soll denn beim Mischen herauskommen, wenn mittendrin Platz für weitere Zutaten geschaffen werden muss?

Ich würde weiterhin von einem ArrayOfStruct ausgehen, da pro Behälter höchstwahrscheinlich mehrere verschiedene DatenTypen zu speichern sind.
Eine Spalte der Tabelle könnte man übrigens für ein Feld "Reihenfolge" verwenden, wo eigentlich nicht die Reihenfolge drinsteht (das ist der Index des Arrays), sondern der Index des Behälters, der wegen einer abweichenden Reihenfolge "dran" ist.
Das war das, was ich als zweiten Ansatz angesprochen hatte.
Diese Zuordnung muss man aber nicht in einer eigenen Liste pflegen - man kann sie in der ohnehin vorhandenen Tabelle als eigene Spalte behandeln.
Es sind dann zwei Zugriffe auf die Tabelle erforderlich.
Erster Zugriff, um z.B. den Datensatz für den dritten Behälter in der Reihenfolge zu erhalten mit Index 3, um dann die IndexNr des tatsächlichen Behälters (z.B. 5) zu lesen.
Zweiter Zugriff auf die Tabelle mit dieser gerade gelesenen IndexNr.

Nochmal zu Deinem LOGO-SpezialSchiebeRegister:
Von ihrer Funktionalität her ist die Schaltung erheblich komplexer als ein SchiebeRegister - oder eigentlich 3 SchiebeRegister, die sich auch noch gegenseitig beeinflussen. Eine solche Schaltung mit "normalen" SchiebeRegistern umzusetzen, wäre gar nicht so unaufwändig!
Drumherum wäre recht viel zu tun, um die SchiebeRegister derart zu "vergewaltigen".

Ich habe in Deiner Schaltung noch drei ODER-Gatter (B041..B043) hinzugefügt, mit denen verriegelt wird, dass in einer Zeile [k]ein zweites bzw. drittes RS-FF gesetzt werden kann. Wenn ich die Aufgabenstellung richtig verstanden habe, dürfte diese zusätzliche Verriegelung durchaus erwünscht sein.
SpezialSchiebeRegister.jpg
 
Zuletzt bearbeitet:
OP
F

FoodFighter

Active member
Beiträge
29
Punkte Reaktionen
2
Vielen Dank für die Anregungen - sind sehr interessante Ansätze fürs nächste Mal :D

Bin gespannt, wann sich die nächste Gelegenheit ergibt.
 

Heinileini

Well-known member
Beiträge
4.426
Punkte Reaktionen
925
Nachschlag. Habe mal FoodFighters Schaltung aufgebohrt auf 4 x 4 und auch gleich umbenannt in FifoMatrix-4x4.
Wobei FIFO wohl genauso unzutreffend ist, wie SchiebeRegister.
Vielleicht kann es jemand für was auch immer gebrauchen ... und sich die mühsame "StrippenZieherei" durch diese Vorlage ersparen ...
FifoMatrix-4x4.jpg
Nach dem Herunterladen von 'FifoMatrix-4x4.lsc.pdf' einfach '.pdf' entfernen!
 

Anhänge

  • FifoMatrix-4x4.lsc.pdf
    276,6 KB · Aufrufe: 5

Heinileini

Well-known member
Beiträge
4.426
Punkte Reaktionen
925
Habe mal den HW-Stand auf 8.0 zurückgeschraubt. Vielleicht geht es damit?
 

Anhänge

  • FifoMatrix-4x4-8-0.lsc.pdf
    277 KB · Aufrufe: 1
Oben