INVERSE-FUNKTION, Fehlernummer 3

  • Hey,


    ich kriege bei der Inverse-Funktion als Fehlernummer die 3 zurück. Was das bedeutet weiß ich (3 Angle exists, but not in SW-Limits). Aber ich habe keine Ahnung wie man das Problem lösen kann.
    Hat jemand eine Idee?


    Viele Grüße,
    Johanna

  • Schritt für Schritt zum Roboterprofi!
  • Hallo zusammen,


    muss das Thema nochmal aus den Akten hervorholen. Habe das gleiche Problem mit der INVERSE-Funktion mit Fehlernummer 3 "Angle exists, but not in SW-Limits". Ich weiß nicht was die Meldung genau bedeutet und aussagt.


    Ich beschreibe kurz in welcher Situation diese Fehlermeldung kommt:
    Ich habe einen KR180-2PA (Palettierer) mit KRC2-Steuerung. Ich möchte für eine automatische Homepositionsfahrt immer als erstes senkrecht hoch zur oberen Arbeitsraumgrenze fahren. Das mache dadurch, das ich $POS_ACT einlese und dem Z-Wert einen sehr großen Wert zuweise, der sicher außerhalb des Arbeitsbereiches liegt.


    pActPos=$POS_ACT
    pActPos.z=4000


    Jetzt verringere ich den Z-Wert in einer Schleife jeweils um 10mm und prüfe bei jedem Schleifendurchlauf die Position mit der INVERSE-Funktion ob die Position im Arbeitsbereich liegt. Im dem Schleifendurchlauf wo der Error-Status der INVERSE-Funktion auf Null geht, breche ich die Schleife ab. --> Das ist die Position mit dem maximalen Z-Wert. Diese Position kann ich dann senkrecht nach oben anfahren.


    Nun habe ich aber ein Position die liegt bei {X 1277.0,Y -239.0,Z -519.0, ...} innerhalb des Arbeitsbereiches. Von Hand kann ich senkrecht nach oben fahren bis Arbeitsraumende oben. Allerdings bringt mir die INVERSE-Funktion für alle Z-Wert (von +4000 bis -519) immer den Error-Status=3.
    Habe ich aber diese Position {X 1277.0,Y -239.0,Z 100.0, ...} funktioniert es einwandfrei und ich kann den max. Z-Wert mit der INVERSE-Funktion detektieren.


    1. Hat jemand eine Idee woran das liegen könnte?
    2. Was bedeutet die Fehlermeldung genau? "Angle exists, but not in SW-Limits"
    3. Was bedeutet die Problemlösung vom Eröffner dieses Themas "$TARGET_STATUS=#BEST"? --> Das funtkioniert bei mir nicht.


    Gruß HarryH

  • Hallo HarryH,


    hier ein kurzer Doku-Auszug vielleicht hilft dir das ja schon weiter:


    E6AXIS INVERSE (E6POS POSITION: IN, E6AXIS START_AXIS: IN, INT ERR_STATUS: OUT)


    In der Funktion INVERSE() wird die Variable START_AXIS in den folgenden Fällen also gebraucht und wie folgt dann benutzt:


    1) Der Zielpunkt besitzt keinen STATUS-Wert:
    Über die Systemvariable $TARGET_STATUS (ist in $CUSTOM.DAT hinterlegt) kann nun eingestellt werden, welchen STATUS-Wert der Zielpunkt kriegen soll. Sie ist vom ENUM-Typ und besitzt die beiden Zustände #SOURCE und #BEST.


    (a) $TARGET_STATUS = #SOURCE, d.h. der Zielpunkt erhält den gleichen Status wie der Startpunkt:
    In diesem Fall wird über die Achswinkel „START_AXIS“ der Status berechnet und als Status für den Zielpunkt vorgegeben.


    (b) $TARGET_STATUS = #BEST, d.h. der Zielpunkt erhält, denjenigen Status, so daß die Bewegung von Startpunkt zu Zielpunkt im Achsraum einen möglichst kurzen Weg zurücklegen muß. In diesem Fall wird für alle 8 möglichen Status-Werte eine Rücktransformation durchgerechnet, und dann unter allen zulässigen Lösungen diejenige ausgewählt, die im Achsraum am „nächsten“ zum Startpunkt liegt. (Gegenwärtig wir als Abstandsmaß im Achsraum die euklidische Norm verwendet. Denkbar wäre z.B. auch die Maximumsnorm).


    2) Der Zielpunkt besitzt keinen TURN-Wert:
    In diesem Fall wird für jede Achse der zulässige TURN-Wert berechnet, mit dem der Zielpunkt den kürzesten Weg zum Startpunkt besitzt. („Zulässig“ heißt in diesem Fall, daß falls bei der Wahl des näher gelegenen Achswinkel ein Softwareendschalter verletzt würde, wird der weiter entfernte gewählt.)


    3) Der Zielpunkt liegt nahe genug an einer Singularität, so daß ein Achswinkel vorgegeben werden muß und nur der davon abhängige berechnet wird. (Z.B. drehen bei A5=0 die Achsen 4 und 6 identisch, so daß der Wert von A4 vorgegeben werden muß und A6 passend berechnet wird.) Dann kann über eine Systemvariable ($SINGUL_POS[1..3]) eingestellt werden, ob der vorzugebende Winkel auf 0 Grad oder auf den Winkelwert des Startpunktes gesetzt werden soll. Für den zweiten Fall wird also der Winkelwert des Startpunktes gebraucht.


    Beide Funktionen liefern, wenn die Berechnung nicht erfolgreich war, als return-Wert eine ungültige E6POS- bzw. E6AXIS- Variable zurück. Man erkennt also ob die Berechnung gescheitert ist daran, daß als Rückgabeergebnis nur „{E6POS:}“ oder {E6AXIS:}“ zurückgeliefert wurde.


    Nachdem du leider nichts zum Status und Turn deiner Positionen sagst, kann ich leider erstmal nichts weiteres beitragen.


    Gruß
    Fubini

  • Der Zielpunkt ist gleich dem Startpunkt. Für den Zielpunkt ist nur der Z-Wert verändert. Den Startpunkt lese ich mit $POS_ACT in eine E6POS Variable ein.


    DECL E6POS pActPos


    pActPos=$POS_ACT


    Somit ist der Status und Turn der Zielposition = der Startposition.

  • Danke fubini,


    Der Dokuauszug hat mir geholfen. Mein Problem war (siehe oben), das sich der Status (Bit 0 - Bit 2) im Bit 2 während der Aufwärtsfahrt ändert. Dieses Bit beschreibt ja die Achsstellung von Achse 5. Nun ja, der KR180-2PA hat natürlich keine Achse 5. Warscheinlich wird trotzdem eine virtuelle Achse 5 für die ganze "Kinematik-Berechung" verwendet. Das war das Problem, das die INVERSE-Funktion immer Fehler 3 ausgespuckt hat. Gelöst habe ich das jetzt wie folgt:


    1. Ich habe die POSITION (Zielpunkt, siehe Doku-Auszug von fubini) als Frame gespeichert. Da somit kein gültiger Status und Turn vorliegt, wird START_AXIS ausgewertet.
    2. Habe $TARGET_STATUS=#BEST gesetzt. Somit wird für den Zielpunkt der Status und Turn automatisch vergeben. Es wird der kürzeste Weg zum Zielpunkt angenommen. Das ist wenn ich nur senkrecht hoch fahren will immer der Fall.


    fubini
    Aus welcher Doku hast du das rausgezogen? Wo finde ich das?


    Gruß HarryH

  • Hallo HarryH,


    Zitat

    Aus welcher Doku hast du das rausgezogen? Wo finde ich das?


    Ist aus einer internen Doku der KUKA-Entwicklung. Normalerweise läuft das bei KUKA so, dass der Entwickler so ein Doku-Dokument zu einer von ihm entwickelten Funktion erstellt und dann diese an die hauseigene Dokuabteilung weiterleitet, die dann daraus die Endkundendoku ableitet. In welchen Endkundendoku (und in welcher Form) das dann zur Verfügung steht kriegen die Entwickler leider oft nicht mit, so dass ich leider selbst nicht weiß, wo ihr das offiziell finden könntet.


    Gruß
    Fubini

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