TIA Schieberegisterähnliche Verarbeitung mehrerer Teile

deraragorn

Level-2
Beiträge
24
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,

ich habe 'mal wieder ein Anliegen und zwar geht es um eine Steuerung mit folgenden Komponenten:
Ein Förderband fördert Teile.
Diese laufen zunächst über eine Lichtschranke (Teil da).
Dann wird von dort aus ein Sensor getriggert der das Teil überprüft (gibt ein Signal für IO und ein Signal für NIO aus)
Anschließend kommt ein Auswerfer mit Lichtschranke für NIO-Teile.
Letztes Teil in der Kette ist eine Lichtschranke die die IO-Teile erkennt.

Nun werden die Teile manuell aufgelegt und es kann immer mal sein dass zwei Teile sehr nah beieinander liegen - oder aber eine ganze Zeit lang gar kein Teil kommt.
Wie kann ich das programmtechnisch lösen? Ich dachte an ein Schieberegister wie es früher bei µ-Prozessoren verwendet wurde - aber da scheitere ich an der Umsetzung (sowohl SCL als auch FUP in TIA...).

Es soll letztlich so sein dass die Kamera X ms nach der Lichtschranke triggert.
Dann kommt irgendwann eine Rückmeldung von der Kamera - IO oder NIO - und das Teil welches zu dem Zeitpunkt geprüft wurde muss im Falle NIO nach X weiteren ms ausgeschleust und dort durch die Lichtschranke erfasst werden. Im Falle IO muss das Teil nach X ms die Lichtschranke im Auslauf triggern.

Bestenfalls immer so dass das richtige Teil ausgeschleust wird und nicht per Zufall... Und dass hinterher die Einlauflichtschranke genauso viele Teile gezählt hat wie die IO- und die NIO-Schranke.

Vielleicht habe ich gerade nur ein Brett vorm Kopf und sollte noch einen Kaffee trinken... Vielleicht raffe ich es aber auch einfach nicht.

Vielen Dank für etwaige Unterstützung!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe nicht soviel Ahnung von derlei Geschichten.Indem Fall wäre ich davon ausgegangen, daß man einen Stopper hat der
ein Teil kurz freigibt dann wieder hoch fährt und danach das Teil der Reihenfolge nach wegen mir aus als kleine Schrittkette abarbeitet.
Ist das Teil versorgt also ausgeschleust oder in Ordnung gibt der Stopper sofern ein Teil anliegt(Sensor) den Stopper wieder frei.
Das Teil hoppelt quasi kurz über den Stopper drüber(der nach unten fährt) und dann gleich wieder hochgeht.
 
Dann braucht man auch kein Schieberegister.
Das Problem mit dem Auflegen ist dann auch gelöst, weil einfach ein Teil am Stopper anliegen muss.
Es muss nur so eingestellt werden, daß halt nur ein Teil drüberkommt.
 
Ich habe das Problem derzeit mal mit nem virtuellen Schieberegister und nem Drehgeber gelöst.

Der aktuelle Zählerstand wird am IO Sensor gespeichert in nem FIFO nur für IO Teile.

Am Auswerfer wird die bei Belegtsignal verglichen mit oberem FIFO Wert. Nur bei übereinstimmung (toleranzen beachten) darf passieren mit FIFO auslesen. Alle Teile ohne passenden Positionswert sind automatisch NIO und werden ausgeworfen. Das betrifft dann auch z.B. manuell verschobene Teile, deren Zuordnung nicht stimmt.
Der FIFO wird natürlich auch korrigiert, wenn der obere Zählwert schon in der Vergangenheit liegt.

Hatte ich seinerzeit auf ner s7-200 so in etwa gelöst.

Das ganze kann man natürlich ungemein aufbohren - ich hab mich damals nur auf die absolut notwendige Funktionalität beschränkt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe das Problem derzeit mal mit nem virtuellen Schieberegister und nem Drehgeber gelöst.

Der aktuelle Zählerstand wird am IO Sensor gespeichert in nem FIFO nur für IO Teile.

Am Auswerfer wird die bei Belegtsignal verglichen mit oberem FIFO Wert. Nur bei übereinstimmung (toleranzen beachten) darf passieren mit FIFO auslesen. Alle Teile ohne passenden Positionswert sind automatisch NIO und werden ausgeworfen. Das betrifft dann auch z.B. manuell verschobene Teile, deren Zuordnung nicht stimmt.
Der FIFO wird natürlich auch korrigiert, wenn der obere Zählwert schon in der Vergangenheit liegt.

Hatte ich seinerzeit auf ner s7-200 so in etwa gelöst.

Das ganze kann man natürlich ungemein aufbohren - ich hab mich damals nur auf die absolut notwendige Funktionalität beschränkt.

Ein Drehgeber macht die Sache gleich mal erheblich prozesssicherer. Ich hab's einmal ohne machen müssen und hab dann mit Zeitstempel und "Band-läuft-Meldung" gearbeitet. Da programmiert man sich nen Wolf :mad:
 
Vorteil: nur gute Teile werden überhaupt gespeichert. Alles andere muss schlecht sein.
Bei mir war zwischen Kamera und Auswerfer eine beliebte Position, Teile wieder aufzulegen, die nachkontrolliert waren. Ergab nen hübschen Kreisverkehr.

Nachteil: belegungssensor an Auswerferposition notwendig.
 
Ein Drehgeber macht die Sache gleich mal erheblich prozesssicherer.
oder wie hier im Thema zwei Lichtschranken an den relevanten Stellen. Ein Drehgeber würde aber helfen zu erkennen, wenn Teile zu dicht beieinander liegen oder unerwartet auftauchen oder verschwinden. Als Drehgeber reicht oft schon ein Initiator und ein Schraubenkopf an einer Scheibe an einer Welle des Transportbandes.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Idee über Zeitstempel zu arbeiten hatte ich auch schon. Das erscheint mir gegenüber der LGF_FIFO-Funktion (Danke an @DCDCDC ) aber sehr mühselig.
Einen Drehgeber kann ich nicht nachrüsten, das gibt die vorhandene Anlage leider konstruktiv nicht ohne weiteres her.

Zur Prozesssicherheit sind an allen drei Positionen Lichtschranken vorhanden um sicherzustellen dass Teile auch wirklich ausgeschleust wurden etc., anders kriege ich das ohnehin nicht durchs Prozessaudit.
 
Wie kann ich das programmtechnisch lösen? Ich dachte an ein Schieberegister wie es früher bei µ-Prozessoren verwendet wurde - aber da scheitere ich an der Umsetzung (sowohl SCL als auch FUP in TIA...).
Ich kenn für die Teileverfolgung auf Transportbändern zwei Varianten.

Schieberegister:
Du teilst mit einem Array deine Transportstrecke in Segmente & schiebst die Array-Elemente einen Index weiter, sobald sich das Band um eine Segmentstrecke bewegt hat.
Etwa so beispielsweise:
Code:
For #i:= UPPER_BOUND(#Array) -1 TO 0 BY -1 DO
    #Array[#i+1] := #Array[#i];
END_FOR;
Die einzelnen Stationen können dann auf den ihnen zugeordneten Index schauen & entsprechend ihre Aktionen ausführen.
Hat den Nachteil, dass deine tatsächliche Teilposition nur um +/- ein Segment genau ist & die Teile mindestens eine Segemntlänge Abstand haben müssen.

Positionsregistrierung:
Hierbei registrierst du die Position eines Teils beim Eintritt in die Transportstrecke (also in deinem Fall bei der ersten Lichtschranke) und ordnest dem Teil einen freien Speicherplatz zu, Üblicherweise ein Array of UDT bei dem der UDT die Teiledaten und dessen Position enthält.
Die Istposition inkrementierst du bei jedem Bausteinaufruf um die Transportstrecke seit dem letzten Aufruf (Bei langsamen Geschwindigkeiten und REAL-Positionswerten die REAL-Genauigkeit beachten. Empfehle DINT/UDINT & dann in mm oder µm rechnen).
Das Speicherplatz-Array durchsuchst du anschließend per FOR-Schleife & triggerst die betreffende Station wenn sich eins der Teile in einem passenden Positionsfenster befindet.
Ist recht genau, musst aber mit mindestens zwei For-Schleifen arbeiten (ggf. auch mehr). Kann je nach Umfang recht viel Zykluslast produzieren.
Und das Array muss >= der maximal möglichen Teile auf der Transportstrecke sein, ansonsten wirds auch doof ¯\_(ツ)_/¯

Hier gibts ein Fifo Baustein..
Hier bitte beachten, dass der LGF-FIFO mit Umlaufzeigern arbeitet.
Die Werte sind nicht entsprechend dem Array-index sortiert.

Einen Drehgeber kann ich nicht nachrüsten, das gibt die vorhandene Anlage leider konstruktiv nicht ohne weiteres her.
Du wirst, wie bereits erwähnt, zwingend die Transportgeschwindigkeit mit für dich brauchbarer Genauigkeit erfassen müssen.
Klar kannst du auch von einem theoretischen Wert ausgehen, wird aber spätestens duch Verschleiß oder Einbau eines Ersatzmotors Schwierigkeiten geben.
Wäre ein berührungsloser Bewegungssensor eine Möglichkeit?
SICK SPEETEC 1D oder sowas in der Art?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo @Botimperator

Derzeitig habe ich eine über Variable setzbare prozentuale Geschwindigkeit (0-100%).
Die über Analogwert geschriebene resultierende Effektivgeschwindigkeit wurde bei verschiedenen Werten gemessen und eine Formel abgeleitet mit der die SPS die Zeit in ms abhängig von den eingestellten % errechnen kann.
Verschleiß oder neue Motorisierung könnte man ggf. mit einem zusätzlichen Beiwert über das HMI korrigieren.
Die Formel hat ein hohes Bestimmtheitsmaß bzgl. der Linearität der Geschwindigkeit von über 99,9% - ich denke/hoffe dass das für meine Zwecke vorerst ausreicht.
Die Teileauflage müsste für ein Schieberegister auf min. den größten Elementabstand gesichert werden, das wären ca. 14cm Distanz zwischen einzelnen Teilen, bei einem Ungeübten und hoher Bandgeschwindigkeit machbar - aber unsere Experten legen die Teile recht schnell und damit eng auf.

Gehe ich Recht in der Annahme dass ich das LGF_FIFO für jeden Schritt brauche (FIFO1 Lichtschranke Eingang - Kameramessung; FIFO 2 Kameramessung - Auswerferlichtschranke; FIFO 3 Kameramessung - Auslauflichtschranke)?
Dann muss ich jetzt nur noch die Doku des Bausteins komplett verstehen. 🙃

Gruß,
Felix
 
Verschleiß oder neue Motorisierung könnte man ggf. mit einem zusätzlichen Beiwert über das HMI korrigieren.
Die Formel hat ein hohes Bestimmtheitsmaß bzgl. der Linearität der Geschwindigkeit von über 99,9% - ich denke/hoffe dass das für meine Zwecke vorerst ausreicht.
Wenn du meinst, dass das für deine Anwendung passt...
Ich würde empfehlen das auf jeden Fall im Auge zu behalten.

Die Teileauflage müsste für ein Schieberegister auf min. den größten Elementabstand gesichert werden, das wären ca. 14cm Distanz zwischen einzelnen Teilen, bei einem Ungeübten und hoher Bandgeschwindigkeit machbar - aber unsere Experten legen die Teile recht schnell und damit eng auf.
Es empfiehlt sich eher kleiner als notwendig zu werden, evtl. sogar kleiner als die Teile selbst.
Dann bezieht sich das als "belegt" markierte Array-Segment eben die Vorderkante des Teils & nicht das komplette Teil.

Gehe ich Recht in der Annahme dass ich das LGF_FIFO für jeden Schritt brauche (FIFO1 Lichtschranke Eingang - Kameramessung; FIFO 2 Kameramessung - Auswerferlichtschranke; FIFO 3 Kameramessung - Auslauflichtschranke)?
Dann muss ich jetzt nur noch die Doku des Bausteins komplett verstehen. 🙃
Der FIFO aus der LFG-Bibliothek ist ein FIFO mit Umlaufzeiger, keiner mit Schieberegister.
Mit den Umlaufzeiger merkt sich der FIFO wo der älteste belegte und der nächste, freie Speicher-Index ist.
Das erspart es der Logik bei jeder Entnahme eines Wertes aus dem Speicher den komletten Speicher um einen Index zu verschieben.
Einen solchen Baustein als Positionserfassung zu verwenden wird nicht (gut) funktionieren.

Nimm am besten ein großes Array of Word, mit dem du dein komplettes Transportband abbildest.
Eine For-Schleife "koppelst" du dann an den Antrieb und schiebst immer das komplette Array.
Die Stationen können dann jeweils auf den ihrer Position entsprechenden Array-Index schauen und für "Teil vorhanden/gut/schlecht/" usw entsprechend Bits setzen.
 
Die über Analogwert geschriebene resultierende Effektivgeschwindigkeit wurde bei verschiedenen Werten gemessen und eine Formel abgeleitet mit der die SPS die Zeit in ms abhängig von den eingestellten % errechnen kann.
Verschleiß oder neue Motorisierung könnte man ggf. mit einem zusätzlichen Beiwert über das HMI korrigieren.
Die Formel hat ein hohes Bestimmtheitsmaß bzgl. der Linearität der Geschwindigkeit von über 99,9% - ich denke/hoffe dass das für meine Zwecke vorerst ausreicht.
Kann es vorkommen, dass das Transportband stoppt und wieder anläuft mit Teilen drauf? Hat die Superformel auch die Rampen berücksichtigt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen.

Ob das zur Anwendung passt... Ich habe keine großartig andere Möglichkeit das umzusetzen ohne das Transportband irgendwie zu modifizieren - das wäre "der letzte Schritt"... Klar, es würde die Sicherheit erhöhen aber erstmal möchte ich es anders versuchen. Falls sich das auf Dauer als unpraktikabel erweist müsste man das dann machen, aber das ist ja relativ schnell implementiert.
Ein Stop des Bandes kann nur bei absichtlichem Anhalten der Anlage über das Bedienfeld oder über das Sicherheitsrelais passieren, das bekommt die SPS aber mit und dann müsste man ohnehin alle Teile aus dem Band entnehmen und das entsprechend "leer" zum Neuanlauf freigeben.

Eine kleine Taktung die geringer wäre als das kleinste Teil ist sicher sinnvoll und vernünftig, @Botimperator .
Jedoch tue ich mich schwer das von dir abgebildete mit dem Array of Word zu verstehen und umzusetzen, dafür reichen meine Fähigkeiten dann doch noch nicht da ich mit sowas noch nie gearbeitet habe.

Ich wünsche einen guten Start in die neue Woche!
 
Oder ganz auf den "Firlefanz" verzichten, eine Lichtschranke kurz vor Ausscheiden NOK, (die verstellbar ausführen) so das wenn die Kamera NOK ausgibt + die LS unterbrochen direkt ausgeschieden wird, dann könnte man wenn das halbwegs kurze Wegstrecken sind auf alles verzichten.

Voraussetzung: Bangeschwindigkeit ist halbwegs konstant.
 
aber das ist ja relativ schnell implementiert.
Kann ich jetzt nicht nachvollziehen, warum Du trotzdem auf ne "Bastel-Schätz-Lösung" setzt.
Schon mit nem induktiven Ini auf nem Zahnrad verbesserst Du die Zielgenauigkeit um Potenzen und musst die Strecke bei Stop auch nicht ausräumen.
Aber @PN/DP hatte das schon angesprochen...
Oder ganz auf den "Firlefanz" verzichten,
Oft ist Aufgrund von Anlagen/Prozess/ Platzverhältnissen notwendig, eine Ausschleusung räumlich getrennt von der Selektion aufzubauen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun, das hat mehrere Gründe.
Der Bauraum des Förderbandes lässt das alles nicht so ohne weiteres zu und die Eingänge der SPS sind voll.
Ich prüfe aber gerade die Möglichkeit des Einbaus eines kleinen Indu-Messers auf ein Zahnriemenrad und ggf. das Umlegen eines möglicherweise nicht notwendigen Einganges.

Wie würde man das mit dem Array dann umsetzen? Könnt ihr mir ggf eine Hilfestellung geben?
Ich möchte natürlich keinen fertigen Code. Wenn es eine Videoanleitung zu soetwas gibt dann nehme ich die alternativ auch, bisher habe ich da nichts brauchbares gefunden.

Danke.
 
Wie würde man das mit dem Array dann umsetzen? Könnt ihr mir ggf eine Hilfestellung geben?
Grundlagen zu Arrays siehe Google oder z.B. hier.

Deine Transportstrecke würde ich, wie gesagt, als ein komplettes Array abbilden.
=> 10m Transportstrecke
=> Gewünschte Segmentgröße 10mm
=> 1000 Array-Elemente benötigt => Array[0..999] of Datentyp
=> Arrayindex 0 ist dabei dein Beginn des Förderbandes

Der Datentyp kann prinzipiell alles sein, was für deine Anwendung passt.
Ich hab Word vorgeschlagen, da ich gerne mit Bitmasken arbeite um Statusbits der jeweiligen Positionen (oder Kombimationen daraus) in der SPS zu verarbeiten & gleichzeitig eine "richtige" Zahl zum Anzeigen am HMI habe.
Du kannst auch Int nehmen um den Zustand der Teile als Zahlenwert darzustellen, oder einen UDT...

Als Bausteinsprache für diese Funktion würde ich dir SCL empfehlen, da du Schleifenfunktionen benötigst.
Schleifen in KOP/FUP sind zwar auch möglich, allerdings nicht durch den Compiler prüfbar => sollte man tunlichst lassen.
Details zu FOR-Schleifen siehe Google oder hier im Forum.
Die FOR-Schleife zum Weiterschieben des Array nach 10mm Bandbewegung könntest du beispielsweise (!) so aufbauen:
Code:
FOR #i:= 999 TO 0 BY -1 DO
    IF #i < 999 THEN
        #Array[#i+1] := #Array[#i];
    END_IF
END_FOR;
Die Schleife arbeitet hier von "hinten", also vom höchsten Index beginnend, das Array ab & kopiert den über die Laufzeitvariable #i addressierten Index in den nächst höheren Index.
Bei solchen Sachen immer etwas aufpassen damit es keine Zugriffsverletzungen auf nicht existerende Array-Elemente gibt (=> deswegen die IF-Anweisung).

Für den Trigger des Transportimulses musst du dir noch etwas überlegen.
Normalerweise würde man das an die steigende Flanke eines Sensors oder ähnlichem hängen.
Hast du keinen Sensor, könntest du beispielsweise zeitbasiert im Bezug auf die Bandgeschindigkeit die For-Schleife aufrufen.
Hier wäre evtl. die Verwendung von TIME_TCK sinnvoll um die Zykluszeit der SPS zu kompensieren.
Normale Timer können auch mitten im Zyklus ablaufen & haben keinen "Rest".

Die vorhandenen Stationen / Lichtschranken könntest du an die Array-Elemente koppeln, die der physischen Position der jeweiligen Station entsprechen, um entsprechend Informationen zu Teil vorhanden/gut/schlecht/usw. zu lesen oder zu schreiben.
Am besten hier mit Konstanten/Variablen für den jeweilige Array-Index arbeiten um die Positionen immer konsistent im kompletten Programm zu ändern.
 
Zurück
Oben