Homeposition

  • Hallo zusammen,


    ich habe einen KR150-L110-2 mit KRC2 Steuerung.


    Folgende Situation:
    Roboterzelle mit mehreren Entnahme- und Ablagepositionen. Der Roboter steht beliebig irgendwo in der Anlage (z.B. weil von Hand verfahren), das Programm wird neu angewählt und als ersten "Akt" soll der Roboter in seine Homeposition fahren. Nun müßte der Roboter (wenn er gerade in einer Maschine steht) erst aus der Maschine freifahren um dann z.B. über eine sichere Höhe zur Homeposition zu fahren.


    Meine Frage(n) an euch:
    Wie macht ihr diese Homepositionfahrt?


    1. Versucht ihr für jede Position in welcher der Roboter stehen könnte eine automatische Homepositionsfahrt zu realisieren (z.B. über Abfrage der IST-Achsposition und davon abhängig verschiedene Fahrwege zur Homeposition) , oder muss der Roboter erst von Hand freigefahren werden um dann eine (recht einfache) automatische Homepositionsfahrt zu realisieren?


    Bisher hatte ich immer nur 4-Achs Palettierer. Da konnte ich (egal wo der Roboter stand) immer senkrecht nach oben und dann in die Homepos fahren. Das war automatisch immer möglich.


    2. Was ist eine übliche Vorgehensweise?


    3. Kann man das dem Kunden zumuten, den Roboter von Hand freizufahren?


    4. Und wie überprüft ihr das vom Roboterprogramm, das der Roboter freigefahren ist?


    Bin für jeden Hinweis dankbar.


    Gruß HarryH

  • Schritt für Schritt zum Roboterprofi!
  • Zu 1.)
    Ja


    Zu 2.)
    Ich deklariere einen Punkt P_Aktuell. Diesem Punkt weise ich die aktuellen Koordinaten zu und lass ihn diese anfahren.
    P_Aktuell = $POS_Act
    PTP P_Aktuell
    Damit hast du die SAK-Fahrt durchgeführt ohne daß sich der Roboter bewegt.
    Wenn du zuerst linear noch oben fahren willst erweiterst du das entsprechend
    P_Aktuell = $POS_Act
    PTP P_Aktuell
    P_Aktuell.Z = (P_Aktuell.Z + 100)
    LIN P_Aktuell
    Der Roboter fährt 100 mm linear nach oben.
    Anschliessend Achsstellung abfragen und entsprechend wegfahren.


    Zu 3.)
    Kommt auf den Kunden an. Ausserdem auf die Qualifikation der Bediener.


    Zu 4.)
    Wie willst du abfragen ob er freigefahren ist?
    Wenn der Roboter aus der Position wegfährt, geh ich davon aus, daß er frei ist. Die Rückfahrtstrategie muss natürlich angepasst sein an die Position an der der Robi steht.


    Gruß
    Roboman

    Gruß Roland


    Wie poste ich falsch?

    Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.

    Konrad Adenauer


  • P_Aktuell = $POS_Act
    PTP P_Aktuell
    P_Aktuell.Z = (P_Aktuell.Z + 100)
    LIN P_Aktuell


    Kürzer:


    PTP $POS_ACT
    LIN_REL {Z 100}


    HarryH
    Zu 1.
    Kommt ganz auf die Applikation an. Meist benutze ich eine Kombination aus Stellungsmerkern(im Programm gesetzt) und Aktuellen-Achswinkeln
    Wenn's ganz haarig und eng wird, muß der Bediener halt mal was von Hand machen.


    zu 2.


    Kommt auf die Applikation, den Bediener und...und...und..an. Es gibt hier kein üblich.


    zu 3.
    Kommt auf die Fähigkeiten des Bedieners an...wenn er das locker und sicher gedackelt kriegt...


    zu 4.
    Ergibt sich aus der Grundstellungsstartegie...



    Man kann auch bei der Grundstellungsfahrt die Momente runterdrehen, sodaß bei einer Kollision nicht so hoher Schaden ensteht.


    Meine Grundstellungsfahrt sieht vom Ablauf meist so aus:


    1. If NOT $IN_HOME ; wenn Homeposition, das ganze weitere Gelumpe umgehen.
    2. Momente runter
    3. Per While...Wend-Schleife im Fold T1-Modus erzwingen (umgeht Taste Simuliere)
    4. Interrupt einschalten, der bei Verlassen des T1-Modus auslöst und wieder eine while...wend Schleife ausführt (T1 erneut erzwingen)
    5. Rückzugsstartegie ausführen
    6. PTP HOME
    7. Interrupt für T1 aus
    8. Meldung ausgeben: Grundstellung erreicht

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

    Einmal editiert, zuletzt von IrrerPolterer ()

  • Danke für die Feedbacks! :danke:


    IrrerPolterer


    - Auf was für einen Wert verringerst du die Momente?
    Ist es die Variable SET_TQ_VALUES(100,100,100,100,100,100)?


    - Das "mit dem Interrupt den T1-Modus erzwingen" habe ich nicht verstanden wie du das machst. :nocheck: Könntest du das nochmal erläutern?


    Gruß HarryH


  • - Auf was für einen Wert verringerst du die Momente?
    Ist es die Variable SET_TQ_VALUES(100,100,100,100,100,100)?


    Das kommt wiederrum ganz auf die Applikation und das Werkzeug usw. an. Muß man halt 'n bischen propieren.
    SET_TQ_VALUES ist richtig.


    Zitat


    - Das "mit dem Interrupt den T1-Modus erzwingen" habe ich nicht verstanden wie du das machst. :nocheck: Könntest du das nochmal erläutern?


    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Hallo Harry,


    ich hab das auf folgende Art gelöst. Der Roboter fährt bei mir mit vier Punkten in eine Maschine hinein. Bei jedem Punkt, den er erreicht, bzw. angefahren hat, wird im Hauptprogramm eine FLAG gesetzt.
    Jetzt muß es nur noch ermöglicht werden, das der Roboter erkennt, das er von Hand verfahren wurde. Ich denke mal das ist kein Problem, weil ja sicher das Automatiksignal von eurer Anlage abgefragt wird.
    Diese Abfrage dann halt mit einem Interrupt überwachen. Wird dieser Interrupt dann ausgelöst, dann kann man den Roboter in ein Unterprogramm springen lassen, z.B. mit dem Namen "Rueckwärts".
    In diesem Programm fragst du dann die FLAGS ab, die beim Einfahren in die Maschine gesetzt wurden, bei erreichen der einzelnen Wegpunkte. Ab der letzten Flag, die gesetzt wurde, kannst du den Roboter nun den Weg wieder rückwärts herausfahren lassen, weil er ja weiß, daß er bis zu diesem Punkt gekommen ist. Am Schluß des "Rückwärts" Unterprogramms dann alle FLAGS wieder zurücksetzen und das Ganze kann von vorne losgehen, wenn erforderlich.


    Hab was vergessen Sorry. In dem "Rueckwaerts" Unterprogramm muß dann zu jedem Punkt natürlich eine Marke gesetzt werden, wo der Roboter im Programm dann hinspringt, nachdem er die Flags abgefragt hat.


    z.B.:


    IF $FLAG[5] THEN
    728 GOTO MARKER0
    729 ENDIF
    730 IF $FLAG[4] THEN
    731 GOTO MARKER1
    732 ENDIF
    733 IF $FLAG[3] THEN
    734 GOTO MARKER2
    735 ENDIF
    736 IF $FLAG[2] THEN
    737 GOTO MARKER3
    738 ENDIF



    746 MARKER0:
    747 LIN XP35

    750 MARKER1:
    751 LIN XP30


    752 MARKER2:
    753 LIN XP20


    754 MARKER3:
    755 PTP XP10


    Ich bin leider net so der "Erklärer", aber ich hoffe trotzdem, daß du was damit anfangen kannst.

    ---------------------------------------------<br />Greetz

    Einmal editiert, zuletzt von Lupus ()

  • IF $FLAG[5] THEN
    728 GOTO MARKER0


    Persönlich finde ich eine INT-Variable(z.B. Robpos) als Positionsmerker eleganter. Und mit GOTO-Befehlen...kann ich mich nicht anfreunden. :)



    Schwierig finde ich immer festzustellen, ob der Robi von Hand verfahren wurde...denn dann müssen die Stellungsmerker gelöscht werden...Hab da schon viel rumexperimentiert, aber kein wirklich befriedigendes Ergebnis erhalten.

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

    Einmal editiert, zuletzt von IrrerPolterer ()

  • Zitat

    Persönlich finde ich eine INT-Variable(z.B. Robpos) als Positionsmerker eleganter. Und mit GOTO-Befehlen...kann ich mich nicht anfreunden. :)


    Das ist natürlich ein nicht wenig schwerwiegendes Argument. Elegant isses halt in der Tat nicht, aber es funzt schon seit geraumer Zeit ganz ordentlich ;)

    ---------------------------------------------<br />Greetz

  • Hallo,
    und immer schön dran denken:
    Wenn beim Reinfahren von PTP nach LIN
    gewechselt wird, dann muss man beim rückwärts Rausfahren den
    vorher PTP angefahrenen Punkt linear anfahren (und andersrum):


    vorwärts:
    PTP P1
    LIN P2
    LIN P3
    PTP P4
    PTP P5


    rückwärts:
    PTP P4
    PTP P3
    LIN P2
    LIN P1


    (hab' jetzt mal die Logik weggelassen, ob Schleife oder Goto's sind in DIESEM
    Fall meiner Meinung nach egal).


    Sonst kann's unter Umständen rappeln im Karton.


    Hermann

  • ... GOTO ...



    :aufsmaul:


    Wer mit GOTO programmiert, der haut auch kleine Kinder. Das ist BÖÖÖSE... :eviltongue:


    nix für ungut, aber mit ner integervariable und etwas SWITCH CASE läßt sich das wesentlich besser machen


    Grüße
    WH

    Wolfram (Cat) Henkel

    never forget Asimov's Laws at the programming of robots...

    "Safety is an integral part of function. No safety, no production. I don't buy a car without brakes."


    Messages und Mails mit Anfragen wie "Wie geht das..." werden nicht beantwortet.

    Diese Fragen und die Antworten interessieren jeden hier im Forum.


    Messages and Mails with questions like "how to do..." will not be answered.

    These questions and the answers are interesting for everyone here in the forum.


  • *Ups* Ich haue keine kleinen Kinder obwohl ich ab und an das GOTO verwende. Machmal macht es mehr Sinn eine Verzweigung/Auswahl über ein Goto zu machen als ein unnötiges Switch/Case zu installieren. Gerade bei einfachen Anwendungen.

    Gruß Roland


    Wie poste ich falsch?

    Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.

    Konrad Adenauer

  • Wer GOTO verwendet haut nicht unbedingt kleine Kinder, aber er ißt zumindest alte Putzlappen... :biggrins:


    Jetzt aber im Ernst:


    Die Diskussion GOTO vs. Schleifen/Switch hatten wir schon mal. Das brachte damals auch schon nix.


    In meinem Beispiel ist IMO ein Switch in Verbindung mit der While-Schleife einfach übersichtlicher und komfortabler als GOTO.


    So, jetzt sind wir glaube ich etwas Off Topic....


    Gute Nacht....

    Greetings, Irrer Polterer!

    Wie poste ich falsch? Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Life is a beta version. Full of bugs and no Manual.

  • Schwierig finde ich immer festzustellen, ob der Robi von Hand verfahren wurde...denn dann müssen die Stellungsmerker gelöscht werden...Hab da schon viel rumexperimentiert, aber kein wirklich befriedigendes Ergebnis erhalten.



    Ich hab das bei mir in der SPS.sub momentan so gelöst:

    Code
    IF $Ext==FALSE THEN      ;Grundstellungsfahrt deaktivieren
    nRoutinenNummer=99       ;sobald Roboter in Hand
    goPosition=99
    ENDIF ;


    Wenn dann die Grundstellungsfahrt durchgeführt wird, wird ein fehler zur SPS geschickt.

    Einmal editiert, zuletzt von killah ()

  • Ich bevorzuge für diesen Anwendungsfall eine andere Strategie:


    Im Programm setze ich vor jeden Verfahrpunkt folgenden Befehl:


    Trigger When Distance=0 Delay=0 DO Grst_pos=#P2
    PTP P2


    Trigger When Distance=0 Delay=0 DO Grst_pos=#P3
    PTP P3


    usw.


    Wichtig ist, daß Du hierfür in der $config.dat eine ENUM-Variable deklarierst. Ein Beispiel:


    ENUM Grst_pos P1,P2,P3,.........,HOME,GrdSt_Erreicht


    Außerdem müssen die Positionen P1,P2 usw. global deklariert sein. Hierfür würde ich eine globale Datenliste empfehlen, die folgendermaßen aussehen müßte:


    DEFDAT Globaledatenliste
    Global E6POS XP1={x.....,.,.,.,.,.}
    DECL GLOBAL FDAT FP1 = {TOOL_NO........}
    .
    .
    .
    ENDDAT


    So kannst Du ständig im laufenden Programm zurückspeichern, auf welchem Weg der Roboter gerade ist. Anhand dessen kannst Du Dir dann ein Grundstellungsprogramm erstellen, das folgendermaßen aussieht.


    Repeat
    Switch Grst_Pos
    Case #P1
    PTP P2
    Grst_Pos=#P2
    Case #P2
    PTP P3
    Grst_Pos=#P3
    Case #Home
    PTP Home
    Grst_Pos=GrdSt_Erreicht
    Default
    Halt
    Endswitch
    Until Grst_pos == #GrdSt_Erreicht


    Auf diese Weise umgehst Du das häßliche GOTO (Ich teile da die Meinung von WolfHenk in vollem Umfang) und hast noch eine elegante Lösung erreicht. Ineinanderlaufende Schleifen haben auch den Vorteil, daß sie sehr sehr übersichtlich sind und Du auch nach Jahren noch mit einem Blick verstehst, was Du da getrieben hast.


    Gruß Robodoc

    Weniger als 100% wird nicht akzeptiert :)

    Einmal editiert, zuletzt von robodoc ()

  • im prinzip kommen wir ja alle auf das gleiche heraus. :supi:


    für meine geteachten punkte hab ich ein eigenes ILF geschrieben, so dass ich in jedem punkt die GST-nummer eingeben kann.
    In jedem Fold steht dann zusätzlich zu den Punktdaten:


    Code
    ...
    TRIGGER WHEN DISTANCE=1 DELAY=0.0 DO goPosition=1
    TRIGGER WHEN DISTANCE=1 DELAY=0.0 DO nRoutinenNummer=1



    Und meine GST sieht dann so aus:


    Naja, extra ein ENUM dafür zu deklarieren?! :denk: Geht auch ohne! ;)

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