Schieberegister per SCL?

SEAL

Level-1
Beiträge
80
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Folgende Situation ist gegeben:

  • Transportband
  • Kamera(für inspektion von Objekten)
  • Drehgeber
  • Pusher( für schlecht erkannte Objekte)
  • Trigger LS vor der Kamera
  • falls benötigt auch Trigger LS vor dem Pusher und nach dem Pusher

Nun bin ich am überlegen wie ich ein saubere Ausschleusung der Objekte hinbekomme. Problem ist das sich mehrere Objekte auf der Prüfstrecke ( Sensor vor Kamera und Sensor nach Pusher) befinden können.
Wie überwache ich am besten das ganze, so das Schlecht erkannte Objekte auch aussortiert werden?
Das Transportband kann mit unterschiedlichen Geschwindigkeiten gefahren werden. Mit nur einem Objekt auf der Stecke wäre ja kein Problem. Wie aber überwache ich mehrere Objekte, zb. wenn ein Objekt vom Band fällt oder jemand ausversehen in die Trigger LS fasst bzw. wie resete ich das ganze dann wieder.
Lösungen im AWL habe ich schon gesehen, wie lässt sich sowas mit SCL lösen?
Da es unterschiedliche Grosse Objekte gibt passen mal mehr oder weniger Objekte auf die Prüfstrecke. Rezepte gibt es nicht.

Bin für jeden Tipp dankbar.
 
Lösungen im AWL habe ich schon gesehen, wie lässt sich sowas mit SCL lösen?

1. Stellt sich die Frage, muss es unbedingt SCL sein wenn es mit AWL ne Lösung geben würde?

2. Man(n) kann auch einen AWL Code (bzw. die enthaltene Funktion) in SCL übertragen und dort nachbilden!
Du musst halt Sinnvoll den AWL Code in SCL nachprogrammieren ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Boxy,

Ich würde mich auch erstmal mit einer AWL Lösung zufrieden geben. Mir geht es aber auch darum das ich zwar grundlegend weiss wie ein schiebe Register funktioniert aber ich nicht so recht verstanden habe wie ich es auswerte.
Ich stelle mir das so vor: wenn z.b 8 Objekte auf die Strecke passen und das 1te den trigger durchläuft setzte ich beispielsweise im MB 100 das erste Bit auf 1 und so fortlaufend. Dann kopiere ich das MB 100 immer auf das MB 200 also bei jeder triggerung, und wenn die letzte lichtschranke ein Signal bekommt vergleiche ich beide MBs und wenn diese nicht gleich sind gibt's einen Fehler?
habe ich das mit den schieberegister so richtig verstanden?
Da in Scl manche Lösungen übersichtlicher sind und ich neugierig bin wie sowas im scl gelöst wird.Vielleicht gibt es auch ne lösung ohne schieberegisterl.
 
Also wenn du das in SCL machen willst, dann nimmst du einen DB (es geht auch eine statische Variable bei einem FB, wenn du das Schieberegister nur intern nutzen willst), legst dort eine Variable "Schieberegister Array[1..10] of Int;" an und nutzt dann für den Zugriff eine Indexvariable auf das Array.

Nun kannst du jederzeit über eine Schleife die Daten im Array schieben, indem du z.Bsp. schreibst

Code:
Output_Element := Schieberegister[10];
FOR I := 1 to 9 do
   Schieberegister[11-I] := Schieberegister[10-I];
END_FOR;
Schieberegister[1] := Input_Element;

Output_Element = Schieberegister[10]
Schieberegister[10] = Schieberegister[9]
Schieberegister[9] = Schieberegister[8]
Schieberegister[8] = Schieberegister[7]
Schieberegister[7] = Schieberegister[6]
Schieberegister[6] = Schieberegister[5]
Schieberegister[5] = Schieberegister[4]
Schieberegister[4] = Schieberegister[3]
Schieberegister[3] = Schieberegister[2]
Schieberegister[2] = Schieberegister[1]
Schieberegister[1] = Input_Element

Wenn ich deine Beschreibung so lese, dann denke ich aber, du wirst nicht alle Fehlerfälle ausschließen können. Das herunterfallen von Objekten bekommst du so gar nicht mit, bzw. deine Zählung stimmt nicht mehr, faßt einer in die Triggerlichtschranke, ist die Zählung ebenfalls nicht mehr korrekt.
Eine Möglichkeit wäre evtl. eine Wegmessung und das Berechnen und Abspeichern der Auswerfposition für NIO-Elemente, aber dafür fehlt hier die Hardware.
Bleibt also nur, abzusichern, dass nichts herunterfallen kann und niemand in die Triggerlichtschranke faßt.
 
Zuletzt bearbeitet:
Es gibt ja 2 Möglichkeiten, das Schieberegister als FIFO zu gestalten:

1. Die Werte verschieben:
Mal angenommen, Dein Register ist 10 Plätze groß. Wenn jetzt ein neues Teil reinkommt, kommt der Wert auf Platz 1. Kommt das nächste Teil, wird der Wert von Teil 1 auf Platz 2 geschoben und der neue Wert wieder auf die 1. Nachdem der Wert bis Platz 10 durchgeschoben wurde, fällt er raus.
Bei dieser Version arbeitet man dann meist mit Pointern auf feste Plätze, z.B. ankommende Teile 1. Platz und weggehende Teile letzter Platz.

2. Den Pointer verschieben:
Hier bleiben die Werte immer auf einem festen Platz stehen und der Zeiger, an welche Stelle geschrieben (bzw. gelesen) wird, wird verändert.
Also wieder 1. Teil 1. Platz. Kommt das 2. Teil, kommt dessen Wert diesmal auf den 2. Platz und der 1. Wert bleibt, wo er ist. Sind die 10 Plätze voll, wird wieder von vorn begonnen und der 1. Wert überschrieben.
An diesem FIFO kann man mit mehreren Pointern, die auf bewegliche Plätze zeigen, arbeiten. Eventuell muss das Register etwas größer gestaltet werden, um den Versatz zwischen reinkommen und weiter verarbeiten auszugleichen.


Jetzt mußt Du schauen, welche Variante auf Deine Situation besser paßt. Ich vermute mal, die 2. Version, da einkommende Teile zwar hintereinander weg ins Register eingetragen werden, aber bei der Weiterverarbeitung der zugehörige Pointer eventuell durch heruntergefallene oder ausgeschleuste Teile um 2 oder mehrere Stellen verschoben werden muss.


Um den Index-Zeiger in SCL zu erhöhen oder zu erniedrigen, brauchst Du sicher keine Hilfe, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich würde hier im Grundsatz so vorgehen :
Es gibt ja eine maximale Anzahl von Teilen, die gleichzeitig auf deinem Förderband sein können.
Für diese Anzahl (+ einen Aufschlag) würde ich einen Positionen-Speicher (Array of DINT) und einen Bewertungs-Speicher (Array of Bool z.B.) und einen Belegt-Speicher (Array of Bool) definieren.
Legst du ein neues Teil auf das Band und es läuft über den Eingangs-Ini dann suchst du dir einen freien Eintrag in dem Positionen-Array und trägst die aktuelle Geber-Position als Offset-Position da ein und löscht den Bewertungs-Speicher und setzt den Belegt-Speicher.

Deine Bearbeitungs-Stationen befinden sich ja an fixe Positionen, relativ zum Eingangs-Ini. Diese Positionen müssen irgendwo hinterlegt sein.

Du scannst nun zyklisch deinen Positionen-Speicher, ob die aktuelle Geber-Position - der Positionen im Positionen-Speicher im Fenster-Bereich deiner Bearbeitungs-Station liegen. Ist das so dann lösst du eine entsprechende Aktion aus. Bekommst du anschließend eine Bewertung dann ordnest du die entsprechend zu.

Überschreitet die aktuelle Geber-Position - der Positionen im Positionen-Speicher den max-Bereich der Förderstrecke dann gibst du sie wieder frei.

Selbstverständlich ist dies in der Realisierung nicht unbedingt trivial - aber so m.E. ganz gut machbar.
Ich würde das auch in SCL lösen.

Gruß
Larry
 
FIFO hat den Nachteil mit der Problematik von heruntergenommenen Teilen und Fehlbetätigung von Sensor. Abhängig von der maximalen Geschwindigkeit könntest Du auch eine oder mehrere Nocken auf die Drehgeberposition programmieren. Mit dieser Nocke dann ein richtiges Schieberegister (8, 16 oder 32 Bit) schieben. Für jedes Ereignis wird ein Bit zugeordnet (Sensor hat erkannt, Kamera hat schlecht befunden...). Für den Zylinder wird dann eine bestimmter Index im Register abgefragt , ggf. auch mehrere Stellen im Schieberegister.
Die Version von Larry funktioniert sofern ich es richtig verstanden habe nur dann wenn der Geber nicht mehrere Umdrehungen wärend des ganzen Durchlaufs macht, zumindest bei einem Singleturn-Geber.
 
Ach so, jetzt habe ich es verstanden.

Würde es dann auch in der Art wie Larry es beschrieben hat machen!
Außer du kannst sicherstellen, da da nix während des Transportes (ausserhalb der Regel) hinzugelegt oder entfernt wird.

Wenn es machbar ist, würde ich mir den GEdanken darüber machen ob ich nicht jedes Objekt selbst verwalten würde ...
Also nicht wie z.B. bei einem Rundtisch bei dem ja alle Plätze immer gemeinsam sich drehen.
Evtl auch schauen ob Du während des Transportes immer auf Plausibilität kontrollieren kannst um somit manuelle änderungen entgegen zu wirken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Version von Larry funktioniert sofern ich es richtig verstanden habe nur dann wenn der Geber nicht mehrere Umdrehungen wärend des ganzen Durchlaufs macht, zumindest bei einem Singleturn-Geber.

:p Stimmt genau ... das muß man dabei beachten ... sehe ich aber nicht als das Problem an ... (Spielregeln gibt es immer)
Für die Bestimmung der realtiven Position kann man dann aber gut mit einem Modulo arbeiten ...

Nachsatz:
Die abgegebene Antwort basiert natürlich auf der Verwendung eines Absolutwertgebers.
Mit einem Inkrementalgeber und einer Zählerkarte würde es das dargestellte Problem warscheinlich gar nicht geben (Auflösung und Länge - wie oben)

Gruß
Larry
 
Zuletzt bearbeitet:
Irgendwie hatte ich den Geber überlesen, dann würde ich natürlich auch über die Geberposition gehen. Aber das ist nicht ganz trivial, genau wie Larry schon schreibt. Schöne Aufgabe, würde ich aber sagen, da kann man auch richtig etwas lernen dabei.
 
Zurück
Oben