TIA Denksport Band mit Encoder Teile prüfen und ein Stück weiter ausblasen

F

Flatpro

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPSler

für ein Projektchen soll ich folgende Aufgabe lösen:
Auf einem Band mit Encoder sollen Teile (sehr dicht hintereinander) mit einer Kamera geprüft werden, diese liefert zu jedem Teil IO/NIO zurück. Zu dem Zeitpunkt wo das Signal kommt kann ich dann den Encoderwert abgreifen und Ergebnis und Encoder Wert speichern (FIFO, Schieberegister??) 3-4 Teile was ungefähr 100mm entspricht sitzt eine Blasdüse die, die Teile über einen Impuls wegblasen soll (Schnellschaltventil von Festo) . Als Steuerung nutze ich eine 1513 Steuerung von Siemens und TIA-Portal V14. Die Encoder Werte gehen auf eine Zählerbaugruppe, Zählen geht schon.

Wie kann ich das Ergebnis mit dem Encoder Wert bis zu Ausblasstelle transportieren? Hat sowas schon mal jemand gemacht?

// Baustein Ergebnis erfassen

U(
O FlankeIO-Ergebnis
O FlankeNIO-Ergebnis
)
SPBN XY

// Schieberegister mit 3 Speicherplätzen

L MD104
T MD108

U M10.4
= M10.8

L MD100
T MD104

U M10.0
= M10.4

L EncoderWert
T MD100

U Ergebnis
= M10.0

// Baustein Ausblasdüse

U FP M10.8
S TimerImpuls.IN


Funzt sowas?
Geht sowas auch in schön und Profi mäßiger? die Merker würd ich vielleicht in ein ARRAY of udtSpeicherplätze stecken oder so.
Wie würdet Ihr das Thema Zählerüberlauf der Baugruppe und Zähleüberlauf vom Encoder angehen?


Würdet Ihr owas in SCL oder AWL schreiben?

Puhh das gibt ein Denksportwochenende.....

Grüßle Flat


PS: Danke schon mal für eure Tipps, Hinweise, Anregungen und so....
 
Ich mach sowas per Array. Mit der Flanke von Auswerteergebniss schreibe ich mir die aktuelle Bandposition+Abstand zur Düse weg. Sind mehr als 0 Einträge im Array so liest die Ausblasdüse ihren nächsten wert aus und schaltet bei diesen für eine Zeit oder Weg ein.

Gesendet von meinem SM-G930F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich zerbrösel mir gerade den Kopf wie ich das in Befehlen umsetze soll
Den DB anlegen mit Speicherplatz Array 1 to 20 of udtDatenstruktur hab ich gemacht funzt .

udtDatenstruct
Teilestatus bool // 0=NIO 1= IO
EncoderWert dword

so bei FlankePositiv Ergebis
Schiebe Rechts
Schreibe Wert in Speicherplatz [0]



aber was meinst du mit "nd mehr als 0 Einträge im Array so liest die Ausblasdüse ihren nächsten wert aus " wie geht das?
 
Hallo, taktet das Band oder fährt es konstant ? Wenns es taktet wäre es ja ganz einfach, da müsste mann nur mit Takt weiterkopieren. Also denke ich mal es fährt konstant...
Ich würds so machen: Inkremente des Encoders zwischen Kamera und Düse ermitteln, im NIO Fall den akuellen Encoder Wert speichern, wenn sich der aktuelle Encoder Wert um den Abstandswert ändert -> Abwurfimpuls
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja ich würde auch nur die nio teile weg schreiben. Und mir die Anzahl an Einträgen merken. Ist diese größer 0 so liest du den ersten Eintrag aus deinem Array aus. Die Anzahl der Einträge gibt gleichzeitig auch den nächsten freien Platz zum speichern.

Gesendet von meinem SM-G930F mit Tapatalk
 
Band läuft konstant. Der Abstand von 100mm in Inkremente umrechnen das bekomme ich hin. Zwischen dem Prüfgerät und der Ausblasstelle liegen dann aber 4 Teile dazwischen. d.h. ich Prüfe erst 4 Teile bevor das erste an der Ausblasstelle ist.... also irgendwie brauche ich ein FIFO-Puffer oder Schieberegister nur das fällt mir dazu gerade ein...Ih glaub ich brauch ne Pause... steh auf dem schlauch
 
Ja ich würde auch nur die nio teile weg schreiben. Verstanden es kann sein das ich die Blasdüse auf dauer an mach und nur wenn ein gutes kommt dann mach ich kurz aus, der Projektleiter meinte aus Produktionssicherheit heraus wäre das besser so lieber ein gutes ghet verloren als ein NIO in die Produktion...
Nach der Blasdüse sitzt noch eine Lichtschranke die dann erkennen soll ob das NIO-Teil wirklich ausgeblasen wurde....

Und mir die Anzahl an Einträgen merken. ? Hochzählen klar aber wer zählt Rückwärts?

Ist diese größer 0 so liest du den ersten Eintrag aus deinem Array aus. ?
Die Anzahl der Einträge gibt gleichzeitig auch den nächsten freien Platz zum speichern. ?

Hast du da ein Beispiel?

 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja zurückgezahlt wird, wenn das Ventil aktiviert wird. Wenn du es mit IO teilen machen willst musst du halt nur die IO Teile so auswerten.
Grad nicht sorry.

Gesendet von meinem SM-G930F mit Tapatalk
 
Vlt. hilft das... So würde ich jetzt anfangen
Code:
//NIO Fall speichern
//Platz 1
      SET   
      U     #Kamera_NIO //Flanke
      SPBN  IO
      U    #Platz1_belegt
      SPB  M001
      L     #Encoderwert
      L     #Abstand_Kam_Duese          //Einstellparameter
      +D                                //Richtigen Datentyp nehmen 
      T     #Platz1_Encoderwert
      S     #Platz1_belegt
      SPA IO
M001: SET   
      U   #Platz2_belegt
      SPB  M002
      L     #Encoderwert
      L     #Abstand_Kam_Duese          //Einstellparameter
      +D    
      T     #Platz2_Encoderwert
      S     #Platz2_belegt
      SPA IO
M002: SET   
//So oft wiederholen wie Teile zwischen Kamera und Düse Platz haben
//...
IO:   NOP   0

//Abwerfen
      SET   
      U     #Platz1_belegt
      SPBN  M003
      U(    
      L     #Platz1_Encoderwert
      L     #Encoderwert
      >=D                               //Kamera Platz 1 ist jetzt bei Düse angekommen
      )     
      U(    
      L     #Platz1_Encoderwert
      L     #Fenstergroesse             //Einstellparameter (wie groß ist der Bereich
      L     #Encoderwert                //in dem geblasen werden soll
      <=D                               //Kamera Platz 1 ist jetzt bei Düse vorbei
      )     
      =     #Abwurfimpuls
      R     #Platz1_belegt
M003: SET                               //usw mit allen Plätzen

Wenn der Encoderwert zwischen Kamera und Düse überläuft hast du halt ein Problem, aber da findet sich sicher auch eine Lösung
 
Zuletzt bearbeitet:
Grundsätzlich bin ich so ähnlich schonmal rangegangen.
Position NIO mit Offset in FIFO
Wenn innerhalb Toleranzband der gespeicherten Position etwas am Auswerfer vorbeifährt, wird ausgestoßen.

Bei hoher Teiledichte auf dem Band bzw. höherer Transportgeschwindigkeit muss allerdings auch noch die Verarbeitungszeit der Kamera im Offset mit einkalkuliert werden. Bei konstanter Zeit ist es eine Konstante, bei variabler Zeit muss diese exakt als Incremente zwischen Trigger Kamera und NIO-Signal bestimmt werden.

Bei mir war es einfach, weil die Lücke zwischen den Teilen 2x so groß wie das Teil und die Transportgeschwindigkeit niedrig gewesen ist.

Der "Takt" wird hierbei vom Incrementalencoder generiert. Ist eine Fifo-Position kleiner als das aktuelle Encodersignal+Teilebreite+Toleranz, wird sie gelöscht (FIFO-Takt).
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, taktet das Band oder fährt es konstant ? Wenns es taktet wäre es ja ganz einfach, da müsste mann nur mit Takt weiterkopieren. Also denke ich mal es fährt konstant...
Ich würds so machen: Inkremente des Encoders zwischen Kamera und Düse ermitteln, im NIO Fall den akuellen Encoder Wert speichern, wenn sich der aktuelle Encoder Wert um den Abstandswert ändert -> Abwurfimpuls

Ich würde es auch mit einem Takt lösen. Du kannst dir einen Takt aus deinen Encoder-Signalen generieren, zB 100 Inkremente = 1 Takt, das entspricht dann von mir aus 10cm auf dem Band.
Dazu würde ich ein Array vom Typ Byte erstellen, das als Schieberegister funktioniert.
Jeder Takt schiebt das Schieberegister um einen Takt nach vorne. Ich würde das Array mit Blockmove und einem Offset von 1 Byte auf ein Hilfsarray kopieren, das alte Array auf 0 setzen und dann das Hilfsarray aufs Original zurückkopieren. Dann hat man das Array bereinigt und den Versatz von einer Stelle.
Der erste Sensor (wahrscheinlich ist das der Trigger der Kamera) schreibt eine Information ins SR (zB 1, das heißt dann Teil vorhanden): Position[0] = 1. Nun fährt man das Band bis an die Stelle, wo die Antwort der Kamera kommt. Man nimmt sich das Array und schaut wo die 1 steht. An diese Stelle des Arrays schreibt man dann eine neue Information. Position[5] = 2(für OK) oder 3(für NIO).
An Position 9 sitzt dann meinetwegen der Auswerfer, der prüft, ob eine 3 im SR steht. Falls ja, dann wirft er aus und schreibt eine neue Information ins SR. An Position 11 sitzt dann die Kontrolllichtschranke. Falls diese ein 1-Signal bringt ohne dass an der Stelle eine 2 im SR steht ist entweder die Lichtschranke verschmutzt oder das Teil wurde nicht ausgeworfen.
 
Moin hab jetzt auch schon ausgeschlafen.... aber das Thema konnte ich heute Nacht auch nicht loslassen.
Zur Info noch die Teile kommen aus einem Rütteltopf relativ ungleichmäßig aber immer mit genügend Abstand. d.h. Der Sensor müsste den takt vorgeben und nicht der Encoder oder?

Und Thema Encoder und Überlauf bereitet mir Kopfzerbrechen.
Angenommen der Encoder hat 1000inc (Tatsächlich 1024) und ich habe 100inc Abstand vom Sensor bis zur Ausblasstelle und keine Laufzeiten zu berücksichtigen.

Dann wäre Teil 1 (20inc lang) im Schieberegister auf Platz 1, das Teil wäre nach 20inc geprüft also würde ich 20Inc Encoderwert + 100inc Abstand und den Teilestatus , NIO, in Platz 1 schreiben und beim 2.Teil .... siehe Tabelle ... Abstand nehmen wir mal 10-40inc Abstand an

Teil_1: Geprüft bei 20inc: Ausgeblasen wird bei 120Inc Status NIO
Teil_2: Geprüft bei 90inc: Ausgeblasen wird bei 190inc
Teil_X: ....
Teil Y: Geprüft bei 980inc: Ausgeblasen wird bei 1080Inc ==> Geberüberlauf also könnt ich ja sagen nicht bei 1080inc sondern bei 80inc.

Aber wie sieht dann die Abfrage im Blasdüsen Baustein aus, bisher hätte ich gesagt Live Encoder Wert >= Wert in Schieberegister = Blasimpuls;

Den Überlauf zu erkenne ist ja nicht das Problem, anhalten und referenzieren geht nicht, folgende Ideen hätte ich.
1. Anzahl Überläufe zählen, da der Überlauf alle 20 Sekunden stattfindet, wäre der Überlauf Zähler nach ein paar Stunden / Tagen auch voll also Zähler Kaskadieren...
2. Könnte ich mit einer Modulo-Funktion was anfangen?
3. Geber fliegend nullen ?

*vde*

Eins ist sicher ich dreh auch gleich durch, hab glaub ein Überlauf :)
 
Also das einfachste ist einfach nach deiner Berechnung der nächsten Ausblasposition zu prüfen ob es einen Überlauf gibt und dann von diesen Wert den maximalen wert abzuziehen. Sprich wenn du bei 1080 ausblasen musst dann 1080-1000=80 als Ergebniss ein zu tragen. Dann passt auch wieder dein >= Vergleich

Gesendet von meinem SM-G930F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ja das hab ich mir auch schon überlegt aber sobald ein Überlauf stattfinden würde, dann würde die Blasdüse die Teile mit werten größer 80 nicht mehr ausblasen...

Habe mir nochmal die Variante mit Überläufe zählen angeschaut:
Jedesmal wenn ich einen Überlauf habe zähle ich einfach in einem DWORD +1 (Anzahl Überläufe)

In das Schieberegister trage ich dann LiveEncoderWert + (AnzahlÜberläufe x 1000)


Die Abfrage an der Blasdüse wäre dann
LiveEncoderWert + (AnzahlÜberläufe x 1000) = AktuelleEncoderWert
AktuelleEncoderWert >= Eintrag in Schieberegister = Blasimpuls

Nachteil die Zahl wird ziemlich schnell ziemlich groß.

??? Und wat nu?
 
Wenn du mit dem Encoder einen Takt generierst dann ist der Überlauf egal. Du kannst zB aus 5 Encoderimpulsen einen Takt generieren. Mit diesem Takt bewegst du das Schieberegister. Dein erster Sensor schreibt an die Position[0] eine Information, falls ein Teil da ist, zB eine 1. Nach 20 Encoderinkrementen, also 4 Takten, steht diese 1 an Position[4]. Dort sitzt die Auswertung und du schreibst eine 2 oder 3 rein.
Nach 100inc = Position[20] prüfst du, ob ein NIO im SR steht und bläst aus und schreibst eine neue Info für Ausgeblasen ins SR. An Position[25] zB überprüfst du dann, ob die Kontrolllichtschranke ein Teil sieht obwohl es eigentlich ausgeworfen werden sollte.
Die Abfrage wäre relativ einfach: Falls Position[20] = 3, dann ausblasen. Evtl mit Ausschaltverzögerung.
 
So hört sich das gut an. Der Sensor der in Platz 0 schreibt kommt dann aber immer asynchron rein ist das nicht problematisch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Teil wäre z.b. 40 Encoderimpulse lang dann würde ich ja 8 Plätze im Schieberegister auf NIo setzen....klappen könnte das schon ist ja egal wieviel Plätze ich habe. Und die Abblaslänge könnte ich auch Encoderimpuls abhängig machen ... dann würde es ja funktionieren...
 
So hört sich das gut an. Der Sensor der in Platz 0 schreibt kommt dann aber immer asynchron rein ist das nicht problematisch?

Ich denke nicht. Wichtig ist ja nur, dass die Strecke zwischen Trigger, Kamera, Ausblasung etc. gleich bleibt. Wann du eine Info ins SR schreibst, ist egal. Egal ist auch, ob im SR Leerplätze mitgeschoben werden (das sind dann die Lücken zwischen den Teilen).
Ich würde allerdings für ein Teil nur eine Position belegen und mit Flankenauswertung arbeiten. Sprich eine FP der Trigger-LS schreibt eine 1 an Position[0]. Dieses Teil ist dann nach 20 Takten oder 100 inc genau 100cm gewandert und befindet sich vorm Auswerfer.
Wie groß du deinen Takt im Verhältnis zum Encoder und der Teilegröße machst, musst du halt ausprobieren.
 
Danke @ all mit der Lösung werde ich mal morgen ins rennen gehen.... mal schauen was es wird junge oder mädchen :)
 
Zurück
Oben