Hallo Leute,
erst mal vielen Dank für die zahlreichen Beiträge, schlaft oder esst ihr eigentlich auch mal?
Ich möchte direkt in die Antwort von Zottel einhaken, da hier ja schon das Problem fast gelöst ist. Also noch etwas genauer: Die beiden Eingangsweichen E1 und E2 öffnen im nicht periodischen Wechsel und lassen jeweils vier Produkte vor der entspechenden Bahn passieren, dabei wird das Signal ensprechend 1sek. lang am Eingang log. 1 sein.
Da ist schon die erste Frage: wenn ich bei relativ kurzer Zykluszeit die Eingänge abfrage um den Wert in M1.0 oder 1.1 zu schreiben, könnte es doch in dieser 1 sek. mehrfach passieren, oder?
Ich hatte bereits geschrieben, daß das beschriebe Programm nicht in jedem Zyklus, sondern nur bei einem "Schrittwechsel" ausgeführt werden darf.
Schauen wir mal, was ein Schrittwechsel sein könnte:
Du förderst Postpakete (alle verschieden groß) auf einem Band. Zwischen den Paketen sind verschiedene Abstände. Pakete kommen aus Quelle (Weiche) 1 oder 2. wobei sie durch eine Lichschranke laufen, die dadurch ca 1 sek. lang unterbrochen wird. Der Eingang sei mit Licht "0" und ohne (unterbrochen) "1". Die SPS möge für einen Programmzyklus 20 Millisekunden benötigen, das ist ein gängiger Wert. Sie "sieht" also viele Zyklen lang 0, dan ca 50 Zyklen lang 1, dann wieder 0. Das heißt natürlich nicht, daß 50 Pakete gekommen sind. Was hier aber nur EINMAL passiert, ist der Wechsel (die Flanke) von 1 nach 0 in dem Moment, in dem das Paket die Lichtschranke verläßt. Das könnte man als "Trigger" nehmen.
Um diese Ereignis zu Erkennen, speichert man den Zustand des Eingangs für einen Zyklus, so daß man im nächsten Zyklus vergleichen kann, ob sich etwas geändert hat:
Das Speichern:
LD E1.0
= M100.0
M 100.0 hat also immer deselben Wert wie E1.0
Deshalb ist diese Abfrage HIER sinnlos:
LD E1.0
UN M100.0
die können ja gar keinen verschiedenen Wert haben.
ABER
LD E1.0
UN M100.0
= M102.0
LD E1.0
= M100.0
Hier wird zuerst verglichen, ob E1.0 1 und M100.0 0 ist. Das ist genau dann der Fall, wenn E1.0 im vorigen Zyklus 0 war und in diesem zum ersten Mal 1 ist.
Für unsere Lichtschranke brauchen wir aber genau das Gegenteil:
LDN E1.0
U M100.0
= M102.0
LD E1.0
= M100.0
Der Merker M102.0 ist genau dann 1 (einen Zyklus lang), wenn ein Paket die Weiche 1 verlassen hat.
Dasselbe für Weiche 2
LDN E1.1
U M100.1
= M102.1
LD E1.1
= M100.1
Der Merker M102.1 ist genau dann 1 (einen Zyklus lang), wenn ein Paket die Weiche 2 verlassen hat.
Wann immer ein Paket eine der Weichen verläßt, geht die "Eimerkette" eine Position weiter:
LD M102.0
O M102.1
CALL Eimerkette
Ein neues Problemchen:
Da die Lichtschranken gerade frei geworden sind, können sie uns nicht mehr sagen, aus welcher das Paket kam.
LD E0.0
= M1.0 würde immer 0 ergeben. Aber wir wissen, daß der Merker 102.0 1 ist, wenn das Paket aus Weiche 1 kam, während der Merker 102.1 anzeigt, daß das Paket aus Weiche 2 kam. Wir ersetzen daher in meinem Eimerketten programm E1.0 durch M102.0 und E1.1 durch M102.1.
Damit zu deiner Frage, den Takt gibt also das erneute Öffnen einer der beiden Eingangsweichen an.
Müßte jetzt so gehen
Ausgelesen wird die Kette später im Prozess an einer Ausgangsweiche, die genau vier Produkte zählt und dann wissen muß, von welcher Eingangsweiche diese Produkte kamen. Da es dazwischen einen weiteren Prozeß gibt, der mal mehr und mal weniger schnell abläuft, kann es also sein, dass die Kette länger oder kürzer wird, das hast du ja auch super gelöst.
Nochmal zum "Länger oder Kürzer": Stellt da jemand an einem Schalter ein, ob mit einer 4,5,6,7,8-stufigen Kette gearbeitet wird, oder ändert sich das dynamisch?
Aber wie kann ich die Kette hinten abfragen, ob z.B. im M6, M7 oder M8.0 oder 8.1 eine 1 steht oder nicht und diese nach erfolgtem Öffnen der Ausgansweiche auf 0 setzen.
Für den scheinbar komplizierteren Fall der "dynamischen Kettenlänge":
Das Prinzip: Wenn wir 5 Pakete aufs Band fördern, sind 5 drauf. Unsere Kette ist 5 lang. Wenn wir eins entnehmen, sind noch 4 da. Unsere Kette ist 4 lang. Wir zählen also Pakete, vorwärts beim fördern und rückwärts beim entnehmen. Den Zählerstand halten wir einem Wort im V-Speicherbereich, hier z.B. VW100:
LD M102.0
O M102.1
ADDW 1,VW100
Die beiden Merker sagen uns ja, daß ein neues Paket da ist. Ich nehme mal an, daß wir auch einen Merker M110.0 haben, der genau für einen Zyklus 1 ist, wenn die Entnahme erfolgt ist:
LD M110.0
ADDW -1,VW100
VW100 sagt uns nun, wie lang die Kette ist.
Ich tu mal so, als ob die Ausgangsweiche so funktioniert:
A0.0 fördert nach links, A0.1 fördert nach rechts, Pakete aus Weiche 1 sollen nach links. Ferner haben wir eine Lichtschranke E1.2, die uns sagt, daß ein Paket ankommt. Wenn das Paket in die Lichtschranke einläuft, ist es Zeit die Weiche zu stellen. Wenn das Paket die Lichtschranke verläßt, kann die Weiche wieder in Mittelstellung zurückkehren oder so etwas (beide Ausgänge aus) und die Entnahme ist beendet.
Wir verschaffen uns jetzt den Merker 110.0 (Entnahme in diesem Zyklus beendet):
LDN E1.2
U M100.2
= M110.0
LD E1.2
= M100.2
Und nun die Entnahme. Ich nehme mal an, daß grundsätzlich nicht mehr als 8 Pakete da sind.
Wenn es genau 8 sind, sagen uns die Merker 8.0 oder 8.1 wo das Paket hin muß, Sind es genau 7, so sagen es uns die Merker 7.0 oder 7.1 usw. Ich nehme mal an wir hätten einen Merker 8.2, der gesetzt ist, wenn es 8 Pakete sind, einen Merker 7.2, der gesetzt ist, wenn es 7 Pakete sind usw.
LD M8.2 // es sind 8 Pakete
U M8.0 // und Merker 8.0 sagt, es muß nach links
= M 10.0 // Bedeutung: Paket nach links
LD M8.2 // es sind 8 Pakete
U M8.1 // und Merker 8.1 sagt, es muß nach rechts
= M 10.1 // Bedeutung: Paket nach rechts
LD M7.2 // es sind 7 Pakete
U M7.0 // und Merker 7.0 sagt, es muß nach links
O M 10.0 // Paket nach links (aus der vorhergehenden Verknüpfung)
= M 10.0 // Bedeutung: Paket nach links
LD M7.2 // es sind 7 Pakete
U M7.1 // und Merker 7.1 sagt, es muß nach rechts
O M 10.1 // Paket nach rechts (aus der vorhergehenden Verknüpfung)
= M 10.1 // Bedeutung: Paket nach rechts
LD M6.2 // es sind 6 Pakete
U M6.0 // und Merker 6.0 sagt, es muß nach links
O M 10.0 // Paket nach links (aus der vorhergehenden Verknüpfung)
= M 10.0 // Bedeutung: Paket nach links
LD M6.2 // es sind 6 Pakete
U M6.1 // und Merker 6.1 sagt, es muß nach rechts
O M 10.1 // Paket nach rechts (aus der vorhergehenden Verknüpfung)
= M 10.1 // Bedeutung: Paket nach rechts
Und so weiter bis zu einem Paket.
Wir werten nun die Merker 10.0 und 10.1 aus und stellen die Weiche:
LD E1.2 // Solange Paket in der Lichtschranke der Weiche
U M10.0 // Bedeutung: Paket nach links
UN M 10.1 // Widerspruch erkennen!
= A0.0 // Weiche nach links
LD E1.2 // Solange Paket in der Lichtschranke der Weiche
U M10.1 // Bedeutung: Paket nach rechts
UN M 10.0 // Widerspruch erkennen!
= A0.1 // Weiche nach rechts
So jetzt fehlen noch die Merker 1.2...6.2, 7.2, 8.2, die bei einer gewissen Paketzahl 1 sein sollen:
LDW= 1,VW100
= M1.2
LDW= 2,VW100
= M2.2
LDW= 3,VW100
= M3.2
LDW= 4,VW100
= M4.2
LDW= 5,VW100
= M5.2
LDW= 6,VW100
= M6.2
LDW= 7,VW100
= M7.2
LDW= 8,VW100
= M8.2
Fertig!
Was nun, wenn "Kettenlänge" fest und nicht dynamisch sein soll? Einfach die Zählbefehle raus und stattdessen:
VW100 auf die Kettenlänge einstellen, z.B. mit einem Bedienpanel.
Oder Zählbefehle und Vergleiche Zahl mit VW100 raus und statt der Merker 1.2 bis 8.2 Eingänge von einem Wahlschalter benutzen: