Abfragen Schieberegister

DirkG

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Da dies mein erster Post hier bei Euch ist, möchte ich mich kurz vorstellen. Mein Name ist Dirk, vor 2 Jahren habe ich meine Ausbildung zum Mechatroniker beendet, bei der mir die Grundlagenausbildung für SPS sehr viel Spass gemacht hat. Seitdem arbeite ich als Wartungtechniker an einer vollautomatisierten Produktionslinie. Mit SPS-Programmierung habe ich bisher leider kaum zu tun. Trotzdem würde ich gern mein Wissen vertiefen. Dazu habe ich mich mit der Simulation 'ITS PLC' beschäftigt und die erste Anlage (Paketsortierung) progammiertechnisch zum Laufen gebraucht. Mir erscheint mein Lösungsansatz allerdings als umständlich und denke, daß hierfür noch sauebere Lösungen zu finden sind.

Kurz zur Erklärung:

Über ein Förderband werden hohe und niedrige Pakete an einer Erkennung ( 2 Sensoren - Typenerkennung) vorbei gefahren und erreichen etwas später, einzeln einen Drehtisch, welcher je nach Typ (Höhe) die Pakete in die entsprechenede Richtung befördert.

Bis jetzt füttert die Typerkennung ein Schieberegister (nach links). Das funktioniert soweit auch tadellos. Nun zu meinem ungelösten Problem. Da die Abstände zwischen den ersten Paketen immer wieder mal variieren, kommt es zuweilen vor, daß unterschiedlich viele Pakete zwischen der Typerkennung und dem Drehtisch unterwegs sind. Also mal 2, mal 3 oder mal 4 Bits verschoben worden sind. Diesem konnte ich mit meinen bisherigen Mitteln nicht begegnen und habe eine Notlösung gewählt.
Es werden stets die gleich Anzahl an Paketen zwischen Typerkennung und Drehtisch zugelassen (bei mir sind es 3) und am Drehtisch jeweils das 3. Bit ausgelesen. Das kommt mir umständlich vor, ist es bestimmt auch.

Gern würde ich die Pakete zwischen Typerkennung und Drehtisch zählen, und entsprechend das dazu gehörige Bit abfragen. Besteht dafür überhaupt eine Möglichkeit oder muss dafür ein Array her?

Vielen Dank im Voraus!!!
Dirk

PS. Benutze Simatic Manager, Step 7 mit Kop/FUP/Grundwissen AWL/Grundwissen SCL
 
Nimm ein Array und arbeite mit zwei verschiedenen Indizes: Einer zum Schreiben (wird erhöht, wenn das Paket gescannt wird) und einer zum Lesen (wird erhöht, wenn ein Paket den Tisch erreicht hat) - sozusagen ein Ringpuffer
Dann muss das Array nur noch groß genug sein, um die maximal mögliche Menge an Paketen zu beherbergen.
 
Ein Schieberegister ist für einen derart asynchronen Zugriff wie du es hier haben möchtest (mal schneller lesen als schreiben, mal schneller schreiben als lesen) prinzipbedingt ungeeignet. Du kannst natürlich ein Schieberegister mit einem Puffer kombinieren, der die Asynchronität abfängt, aber dann musst du entweder den Puffer mit 0-Elementen füllen und mehrmals schieben, falls das ausgegebene Element 0 ist, oder du gehst auf ein Array als Puffer - und dann könntest du auch gleich dein komplettes Register über einen Arrayzugriff abwickeln.
 
Moin Dirk!
SchiebeRegister (SR) finde ich gar nicht so übel. Allerdings würde ich die Pakete nach rechts rausschieben.
Auf das LinksSchieben musst Du aber nicht ganz verzichten - dazu später.
Du machst Dir einen Zähler, der dort eins raufzählt, wo Du prüfst, ob ein hohes oder ein niedriges Paket vorbei kommt.
Wenn sich ein Paket - egal welchen Typs - dem DrehTisch nähert, verminderst Du den Zählerstand um eins.
Vorsichtshalber verhinderst Du, dass der Zähler weiter runter zählen kann, wenn er bereits auf Null steht.
Der Zähler weiss dann ständig, wie viele Pakete zwischen den beiden Positionen noch unterwegs sind.
Um den Typ der Pakete kümmert er sich nicht - dafür kommt jetzt die Schieberei.
Sagen wir, Typ 1 soll als eine 1 in das SchiebeRegister "eingespeist" werden und Typ 0 als eine 0.
Jetzt kommt die spannende Frage, WO speisen wir den Typ in das SR ein? Das weiss nur der Zähler!
Wir setzen den Typ an einer variablen Stelle in das SR, abhängig vom aktuellen ZählerStand.
Das SR ist der Akku, in dem wir das enthaltene "BitMuster" aktualisieren, wenn wir an der dem ZählerStand entsprechenden BitPosition den PaketTyp hinzufügen.
Kurz bevor wir den Zähler um 1 erhöhen, laden wir den PaketTyp in den Akku und schieben den AkkuInhalt um x (=ZählerStand) Positionen nach links.
Dann laden wir das SR-Wort bzw. Doppelwort in den Akku und "verodern" Akku2 (mit dem neu einzuspeisenden PaketTyp) und Akku1 (mit dem vorherigen SR-Inhalt) und haben dann den neuen SR-Inhalt in Akku1, den wir abspeichern.
Jetzt erst holen wir das Erhöhen des Zählers um 1 nach.
Die BitPositionen des SR - von rechts mit 0 beginnend nach links bis 15 (Wort) bzw. 31 (DoppelWort) durchnumeriert - können somit alle benutzt werden, entsprechend den Zählerständen von 1 bis 16 bzw. 32.
Das Einspeisen der 0 ins SR können wir uns von der Logik her eigentlich sparen, aber diese Einsparung wäre mit einem zusätzlichen ProgrammierAufwand verbunden.
Kurz vor Erreichen des DrehTisches fragen wir Bit 0 des SR ab und haben den PaketTyp, schieben um 1 Position nach rechts und vermindern den Zähler um 1.
Einschränkungen:
- max. 16 bzw. 32 Pakete können zwischen den beiden Stationen unterwegs sein und
- max. 2 PaketTypen können unterschieden werden.
Gruss, Heinileini
 
Zuletzt bearbeitet:
Zurück
Oben