Zyklische Berechnung einer Förderbandposition KSS 8.6

  • 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.

    Code
    DEFDAT plc_signals PUBLIC
    GLOBAL SIGNAL speed $IN[257] TO $IN[272]
    ENDDAT

    In meinem KRL-Programm wird dieser Wert in einem Submit in eine Gleitkommazahl in mm/s umgerechnet.

    Code
    DEF  Interface ( )
    LOOP
    geschwindigkeit = speed/100.0
    ENDLOOP
    END

    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:

    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

  • Schritt für Schritt zum Roboterprofi!
  • Die Studienarbeit ist doch für'n A... :) :(

    Dafür gibt es nicht ohne Grund eine Option Bandsynchrones Verfahren. Da wird die Korrektur im IPO-Takt berechnet und benutzt.


    Entweder Überschleifen, mit den Nachteilen, die Du schon gesehen hast, oder ohne Überschleifen, aber auch da wird es immer eine Differenz geben. Überschleifen ist als Standard auf 3 Bewegungen gesetzt, vielleicht hilft Dir das auf 1 zu setzen.

    Code
    $advance=1
  • 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?

    Am einfachsten ist sicher die von Hermann erwähnte Option ConveyorTech.

    Für eine Studienarbeit wäre evtl. der Ansatz über den "Funktionsgenerator" interessant.

    ConveyorTech "beruht" prinzipiell auch darauf.

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

    • Hilfreich

    Wenn's nur eine Denkaufgabe ist...


    Der Code ist schon oberflächlich betrachtet Quark, weil ERST das $Base zugewiesen wird, um es DANACH neu zu berechnen, aber mit dem ALTEN noch gefahren wird. Dadurch hängt der Regler eh' einen Schritt hinterher.

    Warum man in der .sub nicht auch gleich die Istverschiebung laufend berechnet (nicht das Base, aber die Istposition vor der Übernahme in selbiges) ist mir auch nicht klar. Die wäre ja deutlich sensitiver als das Fahrprogramm.

    Und dann müsste man sich vielleicht mal Gedanken machen über das Regelverhalten. Einfach nur I ist vielleicht zu wenig.

  • Erstmal vielen Dank für eure Überlegungen und Antworten.

    Mir ist bekannt, dass es die Funktion bereits als Optionspaket ConveyorTech gibt.

    Da wir dieses noch nicht besitzen, sollte ich mich daran versuchen, diese Funktion selbst zu implementieren um mich mit der Roboterprogrammierung vertraut zu machen.

    In naher Zukunft wird dieses Paket auch erworben.

    Am einfachsten ist sicher die von Hermann erwähnte Option ConveyorTech.

    Für eine Studienarbeit wäre evtl. der Ansatz über den "Funktionsgenerator" interessant.

    ConveyorTech "beruht" prinzipiell auch darauf.

    Über den Funktionsgenerator hab ich auch schon etwas gelesen, jedoch noch keine genaue Erläuterung oder ein Handbuch gefunden. Läuft ein Funktionsgenerator selbstständig und parallel zu meinem Roboterprogramm ab?

    Wo kann ich Informationen zum "Funktionsgenerator" finden?


    Wenn's nur eine Denkaufgabe ist...


    Der Code ist schon oberflächlich betrachtet Quark, weil ERST das $Base zugewiesen wird, um es DANACH neu zu berechnen, aber mit dem ALTEN noch gefahren wird. Dadurch hängt der Regler eh' einen Schritt hinterher.

    Warum man in der .sub nicht auch gleich die Istverschiebung laufend berechnet (nicht das Base, aber die Istposition vor der Übernahme in selbiges) ist mir auch nicht klar. Die wäre ja deutlich sensitiver als das Fahrprogramm.

    Und dann müsste man sich vielleicht mal Gedanken machen über das Regelverhalten. Einfach nur I ist vielleicht zu wenig.

    Du hast völlig recht. Die Zuweisung der Basis ist an dieser Stelle komplett irrsinnig.

    Und auch eine Berechnung im Submit wäre deutlich genauer. Aber auch das finde ich irgendwie nicht ganz zufriedenstellend, da dieser nicht determistisch ist oder liege ich hier falsch?


    Der von Hermann gewählte Ansatz über die Berechnung im IPO-Takt halte ich für die beste Lösung.

    Dieser läuft zyklisch im 12ms Takt oder?

    Kann ich dies über ein Funktionsgenerator realisieren?


    Ich habe zusätzlich versucht, die Berechnung in einem Interrupt, welcher alle 12ms aufgerufen wird, durchzuführen. Dabei ist das Teil auf dem Band dem Roboter davon gelaufen und auch ein Überschleifen war nicht mehr möglich.

    Auch ein Überschleifen ist dann nicht mehr möglich, wenn ich meine Verschiebung in einem anderen Ablaufprogramm im Takt berechne oder?

    Weil mein Vorlaufzeiger kennt ja den übernächsten Punkt noch nicht oder befinde ich mich dann in einer durchgängigen Bewegung, welche nie verlassen wird??


    Ich werde am Montag wieder an dem Roboter sitzen und die Ansätze ausprobieren.

    Entschuldigung, für manche nicht zu Ende gedachten Programmierzeilen. Es ist mein erstes kleines Projekt in der Robotik.


    Danke für eure Hilfe


    Grüße

  • Wo kann ich Informationen zum "Funktionsgenerator" finden?

    Viele KUKA Technologien basieren unter der Haube darauf. Ist aber nicht Teil der offiziellen Kundenschnittstellen. Es gibt aber Leute die durch Reverse-Engineering da viel rausgefunden haben. Also entweder Suchfunktion hier im Forum oder auch im englischen Partnerforum bemühen und auch mal im Kuka XPert Webportal vorbeischauen.


    Fubini

  • Kannst ja mal messen, wie lange Deine sps.sub für einen Durchlauf braucht... nicht wundern, wenn das Ergebnis 12ms zeigt (oder, in extremen Fällen, ein Vielfaches davon).

    Sie ist nur nicht synchron zu irgendwas, das muss man im Hinterkopf behalten.


    Der Satzvorlauf ist freilich eine Sache...

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden