Dann will ich Euch mal etwas Starthilfe geben und erklären, was mein Programm im Einzelnen macht:
1. Ihr habt schon ergründet, das man irgendwie Zustände speichern muss. Dazu werden oft Selbsthalterelais bzw. RS-Flipflops verwendet. R steht für Rücksetzen bzw. Reset und S für Setzen bzw. Set. Das R steht bei dieser Bezeichnung vorne, also ist das Rücksetzen dominant, wenn beide Eingangssignale gleichzeitig anliegen. (Viele andere Möglichkeiten zum Speichern hat die Logo! leider nicht und diese scheint hier die Beste für das Gewünschte zu sein.)
Ihr habt selbst schon 'raus gefunden, dass der Speicher immer zurückgesetzt werden soll, wenn der Ausgang aus ist und nur unter bestimmten Bedingungen eingeschaltet werden darf.
Daraus entsteht folgende grundlegende Speicherzelle (I1 ist der jeweilige Eingang, I2 simuliert die Bedingung für's Setzen):
2. Es müssen für jeden Eingang immer 2 Sachen gespeichert werden:
-> 1. Ist der Eingang unter den ersten 3, damit der Ausgang als Nächstes zum Einschalten dran ist
-> 2. Ist der Eingang unter den ersten 2, die eingeschaltet wurden, damit der Ausgang eingeschaltet wird
Sind schon 3 Eingänge aktiv, kommt das Eingangssignal nicht zum ersten Speicher. Hat es diesen Speicher passiert, kann es den nächsten nur erreichen, wenn keine 2 Ausgänge aktiv sind.
Der Eingang muss also beide Speicher
nacheinander passieren, damit der Ausgang eingeschaltet wird.
3. Es hat sich also ergeben, das Ihr 2 Bedingungen feststellen müsst: "Wieviele Eingänge und wieviele Ausgänge sind aktiv?"
Das kann man natürlich auch über digitale Verknüpfungen machen, allerdings wird das aber mit jedem Ein-/Ausgang immer aufwendiger. Deshalb zähle ich sowas gern analog.
Hier bietet sich dafür der Analog-Multiplexer an. In Abhängigkeit der aktiven Eingänge S1 und S2 gibt dieser einen von 4 parametrierbaren analogen Werten aus. Diese Werte stellt man entsprechend auf 0, 1 oder 2 (aktive Eingänge). Damit der Analog-Mux arbeitet, muss der EN-Eingang auf 1 sein.
Außerdem wird der Analogausgang nicht direkt verarbeitet. Deshalb muss er auf einen analogen Merker geführt werden, da unbenutzte Bausteinausgänge bei der realen Logo! nicht zulässig sind (der Simulation ist das egal). Das Ganze kann man dann mal so ausprobieren:
4. Ihr wisst jetzt also als analogen Wert, wieviele der 2 Eingänge eingeschaltet sind. Allerdings habt Ihr nicht nur 2 sondern 4 Eingänge. Die nächsten 2 Eingänge kann man wieder auf einen Analog-Mux (wie unter 3.) führen. Nun braucht man noch die Summe der beiden Multiplexer - also eine arithmetische Anweisung, bei der man durch Verweise den Wert des Analog-Mux 1 zu dem des Analog-Mux 2 addiert. Die anderen Rechnungen der arithmetischen Anweisung werden nicht benötigt, deshalb werden sie bei jeweils +0 belassen und haben somit keine Auswirkung. Und auch die arithmetische Anweisung arbeitet nur, wenn der EN-Eingang auf 1 ist:
5. Nachdem Ihr nun wißt, wieviele von den Eingängen aktiviert sind, wollt Ihr das auch noch von den Ausgängen wissen. :idea:
6. Unter 1. haben wir festgestellt, das die Anzahl der aktiven Ein- bzw. Ausgänge die Bedingung für die Freigabe der nächsten Speicherzellen darstellen. Dafür wird der analoge Schwellwertschalter benutzt. In Abhängigkeit des Analogwertes an seinem Eingang wird der Ausgang ein- oder ausgeschaltet:
Ihr solltet mit dieser Schaltung etwas herum experimentieren. Was passiert, wenn der Wert für's Ein- unter dem für's Ausschalten liegt, was, wenn beide gleich sind und was, wenn er größer ist? Manchmal führen auch verschiedene Methoden zum Ziel (wie hier), manchmal ist man auf ein bestimmtes Verhalten angewiesen.
7. Jetzt solltet Ihr je Eingang 2 Speicherzellen und für diese 2 ausgewertete Bedingungen haben. An dieser Stelle mußte ich feststellen, daß wenn ein Signal vor der ersten Speicherzelle wartet (also als 4. eingeschaltet) und die 2. Bedingung wieder freigegeben wird, dies natürlich auch die 1. Bedingung wieder freigibt und so das wartende Signal gleich über beide Speicherzellen "durchrast". Das war so natürlich nicht gewollt, sondern es sollte ja von Stelle 4 erstmal nur auf Stelle 3 vorrücken. Man muss deshalb also entweder den Signalfluss von der 1. zur 2. Speicherzelle ganz geringzügig (etwas länger als die Zykluszeit, 10ms sollten reichen) verzögern oder die Freigabe der Bedingung 1. Ich persönlich hab' mich für Ersteres entschieden. Wie die Verzögerung programmiert wird, überlasse ich mal Euren Überlegungen.
8. Außerdem hängt das Zählen der Ein- und Ausgänge auch etwas von der Lage im Schaltplan ab. Wenn Ihr auf mein obiges Programm schaut, werden die Eingänge direkt nach diesen und vor Erreichen der Speicherzellen gezählt, während das bei den Ausgängen erst nach dem Einschalten also im nächsten Zyklus passiert. Deshalb ist da die Bedingung "Sind denn schon 3 Eingänge aktiv" beim 3. eingeschalteten Eingang schon wahr, wenn die erste Speicherzelle des gerade eingeschalteten Eingangs erst noch aktiviert werden muss. Es gilt also den Schwellwertschalter entsprechend anzupassen.
9. Was oben noch fehlt: "Was ist, wenn beim Einschalten schon mehr als 2 Eingänge an sind? Welche davon sollen eingeschaltet werden?"
Ich hab' mich dafür entschieden, solange die Speicherzellen komplett zu sperren und die Schaltung erst freizugeben, wenn nur noch max. 2 Eingänge aktiv sind.
Zum Erkennen des 1. Zyklusses hat die Logo den Anlaufmerker M8. Den nutze ich zum Rücksetzen eines Selbsthalterelais. Dieses Relais darf erst dann gesetzt werden, wenn nur max. 2 Eingänge noch an sind. Wie Ihr das feststellt, sollte ja jetzt klar sein, oder?
Dies wäre dann eine 2. Bedingung für die 1. Speicherzellen.
(Am UND-Gatter müssten noch Eingänge frei sein.
)
10. Und noch etwas wird bisher noch nicht beachtet (was gar nicht auffällt, wenn man nur simuliert): "Was passiert, wenn mehrere Eingänge gleichzeitig eingeschaltet werden?"
Wie soll die Logo! entscheiden, wer an welche Stelle gehört. Bei 'ner größeren SPS ist sowas relativ einfach, aber die Logo! gerät da an Ihre Grenzen. Eine Möglichkeit wäre das Ein- und Ausschalten der Eingänge über Taster mit Stromstoßschalter plus Flankenerkennung. Die Flanke kann man dann nur generieren, wenn nicht mehrere Taster gleichzeitig betätigt werden.
(Eventuell kann dadurch auch Punkt 9 entfallen. Ist ja im Prinzip das gleiche Problem nur beim Einschalten.)
Ihr seht, das ist aufwendig aber nicht unmöglich.
Ihr könnt' Euch ja ganz zum Abschluß auch da noch einen Kopf drüber machen.
Bis hierher funktioniert noch alles mit dem Logo!-Typ 0BA6.
Möglichkeit ab Logo!-Typ 0BA7:
11. Da sich die Speicherzellenlogik von Eingang 1 bis 4 immer wiederholt, hab' ich sie für den Eingang 1 einmal in ein UDF (eigene Logikbausteine) ausgelagert, kann sie so 4 mal wieder benutzen und hab' sichergestellt, das zum Einen alle 4 Eingänge sich der gleichen Logik unterziehen und zum Anderen, das ich jede Änderung an dieser Logik nur einmal durchführen muss und dies immer automatisch auf alle 4 Stränge übertragen wird.
Außerdem kann ich Euch so (hoffentlich) animieren, Eure Köpfe noch etwas anzustrengen, da Ihr auf dem Screenshot ja die Logik innerhalb der UDFs nicht sehen könnt. Ihr wollt schließlich auch was lernen.
Morgen fahre ich nach Dänemark, werde also nichts posten können. Ich denke aber eh', dass Ihr mindestens über's WE Zeit braucht, um über alles in Ruhe nach zu denken und auch mit den einzelnen Steps zu experimentieren.
Und wie Ihr seht, führen meist auch mehrere Wege nach Rom. Also gilt auch hier -> experimentieren, um zu lernen.
Bleibt mir vorerst nur noch:
Viel Spaß dabei!