Rückzugstrategie

  • Hallo Kollegen!


    Ich wollte eigentlich zum Thema/Thread (sieh Link unten) noch eine kurze abschließende Meldung posten, wie das Problem schlussendlich erfolgreich gelöst wurde.


    Leider ist mir das nicht gelungen (kein Button gefunden oder einfach blind ;)). Wenn ich was übersehen haben sollte, bitte ich die Mods schon mal um Verzeihung und um Anfügen dieses Beitrags an den Ursprungs- Artikel...



    Hier ein neuer Eintrag zur Lösung:


    Das Problem wurde nun tatsächlich so gelöst, das im Hintergrund in zyklischen Abständen die Ist- Achswinkel aufgezeichnet und in ein Array gespeichert wurden.


    Im Fehlerfall konnte der Bediener nun den Roboter- Rückzug auslösen (über Visu und AutExt). Somit wurde das aktuelle Programm abgewählt und ein eigenes Programm angewählt, das nun die gespeicherten Achswinkel in umgekehrter Reihenfolge als neue Sollwerte vorgegeben hat (natürlich auch mit einigen Überprüfungen usw.). Das letzte (eig. erste) Element in dem Array war gleichzeitig auch die Ausgangslage/Homeposition oder wie auch immer. Dann wurde das Hauptprogramm wieder angewählt (ich glaube cell) und der Roboter konnte wieder aus der Grundstellung seine vorgegebenen Aktionen durchführen.


    Diese Vorgehensweise hatte insofern den Vorteil, dass das bestehende oder eig. alle bestehenden Ablauf- Programme davon nicht betroffen/beeinflusst wurden. Auch wenn Programme geändert, umgeschrieben oder einfach Positionen hinzugefügt/umgeteached werden. Der nächste schöne Vorteil war, dass die Routinen zum Aufzeichnen und Zurückziehen auf allen Robotern gleich funktionieren und so durch Copy/Paste auf X-Systeme einfach zu kopieren gingen. Dann im Submit- Interpreter ein paar Zeilen hinzufügen und fertig war der Zauber.


    Somit konnte durch ein bisschen Hirnschmalz ein aufwändiges Umprogrammieren aller Roboter vermieden werden und eine flexible Lösung für eigentlich jeden Robotertyp/Hersteller gefunden werden. Auch unabhängig von der Anzahl der Achsen und Komlpexität des Systems.
    Bei weiteren Fragen einfach melden.


    https://www.roboterforum.de/ro…s-ruckzugstrategie/10701/
    bzw.
    https://www.roboterforum.de/ro…g51112;topicseen#msg51112


    LG
    Stups

  • Schritt für Schritt zum Roboterprofi!
  • Hi,
    natürlich kann ich das.


    Ich habe die Daten (die Achswinkel) in einem Zyklus von 50ms aufgezeichnet, sobald ein Programm im cell gestartet wurde (via Interrupt). Je nach Bewegungsgeschwindigkeit des Armes kann man es schneller oder langsamer machen (aber immer die Geschwindikeit der Führungsachse beachten). Die Arrays sind glaube ich auch in der Größe begrenzt (gleube 600 Zeilen- also 7x 600). 50ms reichten aber vollkomen aus, um beim rückwärts- Abfahren der Werte wieder ziemlich die selben Stellungen der Achsen zu erreichen.


    Wie gesagt, der Rückzug wurde vom Bediener nach einer Kollision, Programmabbruch, Not- Aus oder Sonstigem aktiviert (über eine externe Visualisierung via Profibus). Dabei wurde im Submit- Interpreter das cell abgebrochen (beendet) und mit einem Übergabe- Flag wieder angestartet. Im cell wurde dann am Anfang dieses Flag (Merker zB) abgefragt und noch vor dem Auomatik- Extern Programm das Rückzugsprogramm ausgewählt. Dadurch wurde nach abfahren der Bahn wieder die Home- Position erreicht und alles Rückgesetzt. Nach Check Home im cell wurde das Programm wieder normal ausgeführt und auf eine neue Programmnumer durch Auto Extern gewartet.


    Im Rückzugsprogramm waren einige Sicherheits und Plausibilitätsabfragen eingebaut. So z.B., ob die vorgegebenen Sollwinkel überhaupt angefahren werden können usw. Die Positionen wurden bis auf die letzte im Array natürlich überschliffen, sonst hat man keine flüssige Bewegung.


    Hoffe, ich konnte weiterhelfen...


    LG
    Stups

  • Hi,


    Konkretes Beispiel kann ich leider nicht veröffentlichen, da ich nicht mehr in der damaligen Firma arbeite. Aber ich kann Pseudo- Code hinschreiben bzw. den ungefähren Ablauf, soweit ich mich errinere ;)


    Ich habe das Paket in folgende Module (*.src) aufgeteilt (Ablauf/Reihenfolge siehe weiter unten):


    #Achswinkel speichern (wird im vorgegebenen Zyklus ausgeführt); $axis_act_mes liefert die aktuellen Daten und wird in ein Array geschrieben. Rückgebewerte: Fehler beim Speichern; Aufzeichnung läuft;


    #Check Puffer: hier wird überpfüft, ob das Array initialisiert ist; Also, ob ab dem 2. Eintrag Werte vorhanden sind. (1. Wert sollte mit der Home- Position vorbelegt sein); Rückgabe = true / false


    #Bewegung rückwärts abfahren: Hier wird nach Auslösen der Weg zurück bis zum ersten Wert im Array abgefahren. Rückgabewerte: Rückzug läuft; Position kann nicht erreicht werden; Puffer ungültig; Sonstige Fehler;


    #Array Rücksetzen: Die Variable aus Check Puffer=ok wird rückgesetzt und das gesamte array wird mit 0 überschrieben. Der erste Wert im Array wird mit der Home- Position vorbesetzt. Auch alle weiteren Variablen für die Strategie werden rückgesetzt;


    #Start Aufzeichnung: Hier wird der Interrupt aktiviert, der im Zyklus das Programm für Achswinkel speichern aufruft; Rückgabe: Aufzeichnung läuft;


    #Stoppe Aufzeichnung: Aufzeichnung stoppen. Rückgabe: Aufzeichnung läuft nicht mehr (selbe Variable wie oben);



    Hier nun der Ablauf im Groben:


    Im cell steht etwa folgendes:


    #Prüfen, ob RZ- (für Rückzug) Flag true?
    wenn Ja:
    #Check Puffer; #Bewegung rückwärts Abfahren; #Array Rücksetzen; #RZ- Flag Rücksetzen
    sonst:
    #weiter im cell wie Standard;
    #Wenn Programmnummer von AUTEXT gekommen, im jeweiligen CASE #Start Aufzeichnung
    #Wenn Ziel erreicht, dann #Stoppe Aufzeichnung und #Array löschen (Warum nicht erst, wenn Programm fertig? Weil die Rückwärtsbewegung vom Ziel nach Home aus dem Programm eine andere sein kann als die Vorwärtsbewegung. Deshalb soll bei der Rückwärtsbewegung jedenfalls das Standard- Programm normal beendet werden. (mann kann ja nicht in die Zukunft sehen, welche Bahn abgefahren warden soll- deshalb Aufzeichnung nur für Bewegung von der Home- Position weg))


    Bei einer Kollision oder Störung wird ebenfalls #Aufzeichnung Stopp gemacht (mann will ja bei Roboterstillstand nicht immer die selbe Position ins Array klopfen, bis Dieses voll ist); Hier werden einfach die standardmäßigen Programme von KUKA erweitert.


    Im Submit sieht das ungefähr so aus:


    Da der Submit schon Zyklisch läuft, kann hier permanent ein Flag der externen Steuerung abgefragt werden, ob der Rückzug ausgeführt werden soll.
    #Wenn das Flag kommt, wird geprüft, ob #Check Puffer = true. D.h., der Roboter ist iwo auf der Vorwärtsbewegung von der Home- Position zum Ziel hängengeblieben (warum auch immer) und der Puffer ist mit Werten befüllt.
    Wenn dies so ist, wird das cell program abgewählt, das RZ- Flag auf true gesetzt und das cell wieder neu angewählt; was dann passiert- siehe oben im cell.


    Soweit meine Erinnerung.


    Ich hoffe, ich konnte bisschen was helfen;


    LG
    Stups

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