Hallo zusammen,
im Rahmen einer Studienarbeit soll ich ein Roboterprogramm schreiben, mit dem Teile von einem laufendem Förderband aufgenommen werden können.
Eine SPS überträgt die Ist-Geschwindigkeit des Förderbands an einen Roboter.
Über eine Lichtschranke wird ein Teil erkannt und der Roboter startet eine Verfolgungsjagd entlang des Bandes.
Dies soll durch eine Basisverschiebung, anhand der Bandgeschwindigkeit realisiert werden.
Als Roboter dient ein AGILUS KR10 mit einer KRC4-Steuerung mit der KSS 8.6
Das Förderband wird angesteuert von einem Siemens Umrichter mit einer übergeordneten SPS (S7-1500).
Die Kommunikation zwischen der SPS und der KRC4 läuft über PROFINET.
Aktuell übertrage ich die Ist-Geschwindigkeit des Förderbandes als Integer in 1/100 mm/s über die digitalen Ein-/Ausgänge.
In meinem KRL-Programm wird dieser Wert in einem Submit in eine Gleitkommazahl in mm/s umgerechnet.
Anhand dieser Geschwindigkeit integriere ich über eine Zeit die Strecke, die mein Bauteil auf dem Förderband zurück gelegt hat.
Eine Position zum ablegen/aufnehmen des Teils ist in der Förderbandbasis geteacht.
Diese Basis wird mit der zurückgelegten Strecke in x-Richtung verschoben. (x-Richtung entspricht Laufrichtung des Bandes)
Diese Berechnung wird durch eine Lichtschranke am Band neu initalisiert und gestartet ($FLAG[1]).
Der Roboter befindet sich dabei in einer beliebigen Position über dem Band.
Problem:
Aktuell wird innerhalb eines Loops die zusätzliche Verschiebung der Basis berechnet.
Im Anschluss wird eine linear Bewegung zur geteachten Position ausgeführt (Position wird mit Basis verschoben).
Damit eine flüssige Bewegung entsteht wird die Bewegung mit c_dis überschliffen und ein Vorlaufzeigerstopp durch die CONTINUE-Befehle verhindert.
Nach der Bewegung startet der Loop wieder mit der erneuten Berechnung.
Die Zeit zwischen den Berechnung wird gestoppt und für die nächste Berechnung genutzt.
Da der Roboter das Teil zuerst einholen muss, ist am Anfang die Zeit zwischen zwei Berechnungen sehr groß und eine Geschwindigkeitsänderung des Bandes wird nicht erkannt.
Folge: Roboter fährt dem Würfel voraus oder hinterher.
Code Loop:
continue
LOOP
$TIMER_STOP[2] = TRUE
zeitletzterZyklus = $TIMER[2]
$TIMER[2] = 0
$TIMER_STOP[2] = FALSE
$BASE = BASE_DATA[7]
continue
IF $FLAG[1] THEN
geschwindigkeitSPS = geschwindigkeit
geschwindigkeitKUKA = geschwindigkeitSPS/1000
xVerschiebung = geschwindigkeitKUKA * zeitletzterZyklus
BASE_DATA[7].X = BASE_DATA[7].X + xVerschiebung
ENDIF
LIN Xstart c_dis ;geteachter Position in der Förderbandbasis folgen
continue
IF ( BASE_DATA[7].X >= 510.0) THEN
$FLAG[2] = TRUE ; löst Interrupt zum Greifen des Teils aus
WAIT SEC 0.0
EXIT
ENDIF
continue
IF ( $TIMER_FLAG[1] OR ( BASE_DATA[7].X >= 720.0 ) ) THEN
$FLAG[1] = FALSE ;Abschalten, wenn Teil nicht erreicht wurde
$timer_stop[1] = TRUE
EXIT
ENDIF
ENDLOOP
Display More
Ich habe bereits versucht, die Basisverschiebung in einem Submit zu berechnen, aber dann ist ein Überschleifen der Bewegungen nicht mehr möglich.
Gibt es eine Möglichkeit die xVerschiebung zyklisch zu berechnen und trotzdem ein Überschleifen der Punkte zu realisieren?
Oder würdet ihr ganz anders an die Sache herangehen?
Vielen Dank für eure Bemühungen
Grüße
Erdnuss99