Hi liebe Forumuser,
ich habe nochmal eine Frage an euch und vielleicht könnt ihr mir Programmtechnisch dabei ja helfen.
Folgendes ist vorzufinden:
Der KUKA muss Senkrecht nebeneinander stehende Bleche (ca. 10mm Abstand) aus einem Magazin mit einem Vakuumsauger entnehmen (siehe Foto anbei -> Draufsicht).
Dazu fährt der Robi in das Magazin auf einen Startpunkt (ganz Rechts), stellt das Vakuum ein und startet einen Suchlauf bis zum Endpunkt (ganz links im Magazin).
Sobald ein Blech erreicht wird, meldet das Vakuumventil "Vakuum aufgebaut" und startet den Interrupt um mit dem Blech aus dem Magazin zu fahren.
Diese Pposition wird immer gespeichert, damit der Robi beim nächsten Anfahren 10mm vor dem letzten "Abholpunkt" startet.
Sollte kein Blech vorhanden sein, fährt der Robi bis zum Ende des Magazins, gibt der SPS durch, dass das Magazin leer ist, schaltet Vakuum ab und fährt aus dem Magazin.
Ein zusätzlicher Interrupt mit einem Bauteilsensor am Sauger soll verhindern, dass die Bleche verbogen werden, falls sich das Vakuum nicht aufbaut.
Das ist so gelöst, dass dieser nach einer gewissen Zeit (wenn Blech 3 sek. erkannt und kein Vakuum aufgebaut) auslöst. Der Robi bleibt dann stehen und wartet auf Beseitigung des Bleches (kann man von Bedienerseite herausnehmen) oder Vakuum aufgebaut.
Folgendes sollte noch eingebracht werden:
Anstelle des stehens bei dem zusätzlichen Interrupt soll der Roboter 10mm zurück fahren, seinen Suchwinkel um ca.5° (Foto -> Winkel x°) ändern und sich wieder Richtung Endpunkt begeben.
Problem:
Ich habe das schon versucht im Interrupt zu lösen. Das klappt mit Relativbewegungen aber nur bedingt. Sobald der Interrupt auslöst, fährt der Robi 10mm zurück, dreht sich um die 5° meldet dann aber eine Störung (weis nicht mehr genau welche das war) und kann den Endpunkt mit seiner veränderten Position nicht anfahren...
Habt ihr eine Idee wie ich das noch lösen könnte? Es handelt sich um den Interrupt "Anhalten".
Hier mal ein grober Auszug aus dem aktuellen Quellcode:
DEF Main ()
INTERRUPT DECL 10 WHEN vakuum_aufgebaut==TRUE DO Ausfahren ()
INTERRUPT DECL 12 WHEN blech_erkannt==TRUE DO Anhalten ()
;In Magazin fahren
SLIN Startpos_Suchlauf
Suchlauf ()
;Abholposition speichern
pos_aktuell = $POS_ACT
;Ausfahren aus Magazin
SLIN Nachpos_magazin
END
DEF Suchlauf ()
INTERRUPT ON 10
INTERRUPT ON 12
;Vorlaufzeiger anhalten
WAIT SEC 0
Vakuum_ein
SLIN Endpos_magazin
Vakuum_aus
END
DEF Ausfahren ()
BRAKE
;Interrupt gegen wiederauslösen sichern
INTERRUPT OFF 10
INTERRUPT OFF 12
RESUME
END
DEF Anhalten ()
BRAKE
;Interrupt gegen wiederauslösen sichern
INTERRUPT OFF 10
INTERRUPT OFF 12
;Warten bis Blech vor Sauger weg oder Vakuum aufgebaut
WAIT FOR (blech_erkannt==FALSE) OR (vakuum_aufgebaut==TRUE)
IF vakuum_aufgebaut==TRUE THAN
RESUME
ENDIF
;Interrupts wieder einschalten und Suchlauf fortsetzen
INTERRUPT ON 10
INTERRUPT ON 12
END
Alles anzeigen