Varible als Koordinate

  • Hallo, nachdem ich die Übertragung nun hinbekommen hab, steht das nächste Problem an.
    Der Roboter soll die aufgenommenen Packete auf bestimmte Plätze, P1 - P9, abstellen. Die Punkte wurden bereits eingeteacht und sind somit bekannt.
    Nun hab ich versucht, das ganze mit einer Loopschleife zu machen, wobei der Zähler I von 1 - 9 läuft.
    Die Bewegung sollte dann mittels:
    PTP PI CONT Vel= 100 % PDATI
    erfolgen.
    Leider funktioniert das aber irgenwie nicht so wie ich mir dachte.


    Auch eine Bewegung mit:
    LIN {XPOS,YPOS,ZPOS}
    bringt eine Fehlermeldung. :huh:


    Hab Ihr Vorschläge. :huh:

    Einmal editiert, zuletzt von Ralle ()

  • Schritt für Schritt zum Roboterprofi!
  • Variablen in den KUKA-Folds funktionieren leider nicht. :waffen100:


    Hast du die LIN-Zeile mit dem KRL-Asistenten geschriegen oder von Hand?


    Wie ist die Deklaration von XPOS, YPOS und ZPOS?

    Kontrolle ist eine Illusion, denn niemand weiss was als nächstes passiert.

  • Hallo Ralle


    Ganz einfach



    DECL FRAME FP[9]


    FOR FI = 1 TO 9
    LIN FP[FI]
    ENDFOR


    Ansprechen kannst du die Varible mit
    FP[1].X=0.0
    FP[1].Y=0.0
    FP[1].Z=0.0
    FP[1].A=0.0
    FP[1].B=0.0
    FP[1].C=0.0


    FP[2].X=0.0
    u.s.w

  • Scheint wohl das beste, ich setz das Programm mal hier rein:


    DEF Test( )


    INT I



    $VEL_AXIS [1]=50
    $VEL_AXIS [2]=50
    $VEL_AXIS [3]=50
    $VEL_AXIS [4]=50
    $VEL_AXIS [5]=50
    $VEL_AXIS [6]=50
    $ACC_AXIS [1]=50
    $ACC_AXIS [2]=50
    $ACC_AXIS [3]=50
    $ACC_AXIS [4]=50
    $ACC_AXIS [5]=50
    $ACC_AXIS [6]=50


    LOOP


    I[1]=0 ;Zähler der Durchläufe


    KOORDINATEN() ;Koordinaten einlesen
    PTP P10 CONT Vel= 100 % PDAT1 Tool[1] Base[0] ;Bewegung zum Bezugspunkt am Sorter
    LIN {XPOS,YPOS,ZPOS} ;Bewegung des Greifers über das Packet
    LIN {Z -1} ;Andrücken des Vacuumgreifers
    SET Schmalzsaug Greifer State= Vacuum CONT at Start DELAY=0ms ;Vacuum ziehen
    LIN {Z 10} ;Anheben des Packetes
    PTP PI CONT Vel= 100 % PDATI Tool[1] Base[0] ;Bewegung zum Pufferplatz
    LIN {Z -5} ;Absenken des Greifer
    SET Schmalzsaug Greifer State= Blow GDAT1
    SET Schmalzsaug Greifer State= Off GDAT2


    I=I+1 ;Zähler +1


    ENDLOOP


    END
    DEF KOORDINATEN()


    REAL TIMEOUT
    INT HANDLE
    INT XPOS
    INT YPOS
    INT ZPOS
    INT OFFSET
    DECL STATE_T STATR, STATW, STAT
    DECL MODUS_T MODR, MODW


    COPEN(:SER_2, HANDLE)


    MODR=#ABS
    TIMEOUT=0.0
    OFFSET=0


    WAIT FOR $DATA_SER2>0


    CREAD(HANDLE,STATR,MODR,TIMEOUT,OFFSET,"%f%f%f",XPOS,YPOS,ZPOS)


    MODW=#SYNC


    CWRITE(HANDLE,STATW,MODW,"%f%f%f",XPOS,YPOS,ZPOS)


    CCLOSE(HANDLE,STAT)


    END


    Ich hoffe das hilft, den Ansatz von Robota werd ich mal versuchen, danke schon mal.

    Einmal editiert, zuletzt von Ralle ()

  • Ups, ja, muss LIN_REL heißen.


    Was die Idee von robota angeht so kann ich keinen LIN oder PTP Befehl mit FP[FI] anlegen :wallbash:


    Alle Programmschritte wurden von Hand geschrieben.


    Bin so langsam ein wenig verzweifelt, da ich das ganze für meine Diplomarbeit brauch.


    Hier noch mal wie es ablaufen sollte.


    Programmablauf:


    1. INT Variablen (I, Xpos, Ypos, Zpos, Handle, Offset)
    2. DECL Status und Modus
    3. Geschwindigkeit und Beschleunigung festlegen ($ACC... ; $VEL...)
    4. Loopschleife für die Pufferung starten für I=1-9
    5. Zähler für Packete I = 1
    6. Kanal öffnen (COPEN...)
    7. Modus, Timeout und Offset festlegen
    8. Warteschleife da Probleme mit TIMEOUT=0
    9. Daten lesen und Variablen zuordnen (CREAD...,"%d%d%d"XPOS, YPOS, ZPOS)
    11. Kanal schließen (CCLOSE...)
    12. Bewegung zum Bezugspunkt über der Endstelle (PTP...)
    13. Bewegung über das Packet mittels Variablen (LIN_REL {X XPOSX,Y (Länge der Endstelle)-YPOS, Z (Höhe des Greifers über der Endstelle)-ZPOS})
    14. Andrücken des Sauggreifers (LIN_REL {Z -10})
    15. Vacuum ziehen des Sauggreifers
    16. Anheben des Packetes (LIN_REL {Z 100})
    17. Bewegung zum Pufferplatz I (PTP...)
    18. Absenken zum Ablegen (LIN_REL {Z -HÖHE-ZPOS}
    19. Vacuum ablassen
    20. Greifer abschalten
    21. Zähler I+1
    22. Loopschleife beenden (ENDLOOP)
    23. Ende (END)

    Einmal editiert, zuletzt von Ralle ()

  • Hallo Ralle


    Ich würde dann das Daten lesen und Variablen zuordnen (CREAD...,"%d%d%d"FP[1].X, FP[1].Y, FP[1].Z) einfach mit einem Frame machen


    Dann sollte das doch ohne Probleme gehen! Ob du das Frame Array mit einer Variable (FP[FI]) oder Direkt (FP[1]) anspricht ist nicht endscheident


    Wenn ich dein Problem recht verstanden habe würde ich es wie folgt machen:


    INT Variablen (I, Xpos, Ypos, Zpos, Handle, Offset)
    2. DECL Status und Modus
    3. Geschwindigkeit und Beschleunigung festlegen ($ACC... ; $VEL...)
    4. Loopschleife für die Pufferung starten für I=1-9
    5. Zähler für Packete I = 1
    6. Kanal öffnen (COPEN...)
    7. Modus, Timeout und Offset festlegen
    8. Warteschleife da Probleme mit TIMEOUT=0
    9. Daten lesen und Variablen zuordnen (CREAD...,"%d%d%d"SP[1].X, SP[1].Y, SP[1].Z)
    11. Kanal schließen (CCLOSE...)
    12. Bewegung zum Bezugspunkt über der Endstelle (PTP...)


    FP[1].x=SP[1].x
    FP[1].y=(Länge der Endstelle)-YPOS,
    FP[1].z=(Höhe des Greifers über der Endstelle)-ZPOS
    13. Bewegung über das Packet mittels Variablen (LIN_REL {X FP[1].X,Y FP[1].Y, Z FP[1].Z})
    14. Andrücken des Sauggreifers (LIN_REL {Z -10})
    15. Vacuum ziehen des Sauggreifers
    16. Anheben des Packetes (LIN_REL {Z 100})
    17. Bewegung zum Pufferplatz I (PTP...)
    18. Absenken zum Ablegen (LIN_REL {Z -HÖHE-SP[1].Z}
    19. Vacuum ablassen
    20. Greifer abschalten
    21. Zähler I+1
    22. Loopschleife beenden (ENDLOOP)
    23. Ende (END)

  • Hallo Ralle,


    hier mein Lösungsvorschlag:


    1. XPOS, YPOS, ZPOS in der TEST.DAT deklarieren, oder im Unterprogrammaufruf
    als Variable uebergeben.


    2. Für Relativbewegung: Deklaration eines Frames in TEST.DAT
    z.Bsp: DECL frame Zwischenpos {X 0,y 0,z 0, a 0, b 0, c 0}
    Dann Zuweisung
    Zwischenpos.x = xpos
    Zwischenpos.y = ypos
    Zwischenpos.z = zpos (alternativ gleich Zwischenpos.x/.y/.z einlesen).
    Dann die Bewegung per LIN_REL Zwischenpos auslösen.
    LIN_REL (X variable) funktioniert leider nicht, egal was man da für
    'variable' reinschreibt.


    3. Für Absolutbewegung (wie von ralle beschrieben),
    anstelle von
    13. Bewegung über das Packet mittels Variablen (LIN_REL {X FP[1].X,Y FP[1].Y, Z FP[1].Z})
    sollte es heissen:
    13. Bewegung über das Packet mittels Variablen (LIN_REL FP[1])


    Eine weitere Möglichkeit wäre (um mit Arrays und Teachpunkten) zu arbeiten ist:


    Ein separates Unterprogramm (oder einen Programmteil der übersprungen wird)
    erstellen, dort die Punkte ganz normal teachen (sagen wir mal P1, P2 bis P9).
    Danach eine Zuweisung auf ein in der .DAT-Datei deklariertes Array:
    FP[1]=P1
    FP[2]=P2
    ..
    FP[9]=P9


    Dann kann man mit PTP FP[i] elegant auf die 'Arraypunkte fahren. Vorher noch
    evtl. mit den BAS(....)-Aufrufen (einfach aus einem der Folds der P1..P9 kopieren),
    die Geschwindigkeit und Base/Frame einstellen.


    Hoffe das war halbwegs verständlich :huh:


    Gruss Hermann

  • Danke für die schnellen Antworten: :grinser043:



    Ich glaub da liegt Teilweise ein Missverständniss vor. Die Koordinaten die eingelesen werden dienen nur zur Aufnahme des Packetes, da diese unterschiedlich groß sind. Die Ablage ist davon nur insofern betroffen, da hier noch die Höhe zu beachten ist.


    Hab mal versucht eure Anregungen einzubringen, hier das Ergebniss:


    DEF Test( )


    INT I
    INT XPOS
    INT YPOS
    INT ZPOS
    INT YENDSTELLE
    INT ZENDSTELLE
    DECL FRAME ZWISCHENPOS
    DECL FRAME FP[9]


    $VEL_AXIS [1]=50
    $VEL_AXIS [2]=50
    $VEL_AXIS [3]=50
    $VEL_AXIS [4]=50
    $VEL_AXIS [5]=50
    $VEL_AXIS [6]=50
    $ACC_AXIS [1]=50
    $ACC_AXIS [2]=50
    $ACC_AXIS [3]=50
    $ACC_AXIS [4]=50
    $ACC_AXIS [5]=50
    $ACC_AXIS [6]=50



    YENDSTELLE=100 ;Länge der Endstelle
    ZENDSTELLE=100 ;Höhe des Greifers über der Endstelle


    ZWISCHENPOS.X=XPOS
    ZWISCHENPOS.Y=YENDSTELLE-YPOS
    ZWISCHENPOS.Z=ZENDSTELLE-ZPOS


    FP[1]=P1 ;Pufferpunkt 1
    FP[2]=P2 ;Pufferpunkt 2
    FP[3]=P3 ;Pufferpunkt 3
    FP[4]=P4 ;Pufferpunkt 4
    FP[5]=P5 ;Pufferpunkt 5
    FP[6]=P6 ;Pufferpunkt 6
    FP[7]=P7 ;Pufferpunkt 7
    FP[8]=P8 ;Pufferpunkt 8
    FP[9]=P9 ;Pufferpunkt 9


    LOOP


    I[1]=0 ;Zähler der Durchläufe


    KOORDINATEN() ;Koordinaten einlesen


    PTP P10 CONT Vel= 100 % PDAT1 Tool[1] Base[0] ;Bewegung zum Bezugspunkt


    LIN_REL {ZWISCHENPOS.X, ZWISCHENPOS.Y, ZWISCHENPOS.Z} ;Bewegung über das Packet
    LIN_REL {Z -1} ;Andrücken des Vacuumgreifers


    SET Schmalzsaug Greifer State= Vacuum CONT at Start DELAY=0ms ;Vacuum ziehen


    LIN_REL {Z 10} ;Anheben des Packetes


    PTP FP[I] CONT Vel= 100 % PDAT1 TOOL[1] Base [0] ;Bewegung über Ablageplatz
    LIN_REL {ZWISCHENPOS.Z} ;Absenken des Greifer


    SET Schmalzsaug Greifer State= Blow GDAT1
    SET Schmalzsaug Greifer State= Off GDAT2


    I=I+1 ;Zähler +1


    ENDLOOP


    END
    DEF KOORDINATEN()



    INT XPOS
    INT YPOS
    INT ZPOS
    INT OFFSET
    DECL STATE_T STATR, STATW, STAT
    DECL MODUS_T MODR, MODW
    REAL TIMEOUT
    INT HANDLE


    COPEN(:SER_2, HANDLE)


    MODR=#ABS
    TIMEOUT=0.0
    OFFSET=0


    WAIT FOR $DATA_SER2>0


    CREAD(HANDLE,STATR,MODR,TIMEOUT,OFFSET,"%f%f%f",XPOS,YPOS,ZPOS)


    CCLOSE(HANDLE,STAT)


    END


    Allerding bekomme ich immer wieder die Fehlermeldungen:


    LIN_REL {ZWISCHENPOS.X, ZWISCHENPOS.Y, ZWISCHENPOS.Z} ->Konstante erwartet


    PTP FP[I] CONT Vel= 100 % PDAT1 TOOL[1] Base [0] ->Satzende oder Kommentar erwartet


    Wo könnte der Fehler liegen?
    Hab ich einer Fehler bei der Zuordnung des Frames zu den Variablen gemacht (wäre meine Vermutung).

    Einmal editiert, zuletzt von Ralle ()

  • Auch bei:


    LIN_REL {X ZWISCHENPOS.X, Y ZWISCHENPOS.Y, Z ZWISCHENPOS.Z}


    bekomm ich die Fehlermeldung:Konstante erwartet
    :huh:

  • Super, funktioniert. :danke:
    Hab zwar auch nur Kuka Office Lite, aber zumindest bei der Kompilierung gibt er nur noch den Fehler:


    PTP FP[I] CONT Vel= 100 % PDAT1 TOOL[1] Base[0]
    ->Satzende oder Kommentar erwartet


    aus. Vielleicht kann mir ja auch hier noch jemand helfen? :blumen:


    PS: Dieser Befehl wurde per Hand eingefügt, automatisch läst sich keine Klammer beim Koordinatenwert eingeben. Falls das wichtig sein sollte.

  • PTP FP[I] CONT Vel= 100 % PDAT1 TOOL[1] Base[0]


    Das sieht mir schwer nach einem Bewegunssatz aus, den Du per Inlineformular eingebaut hast. Das geht natürlich nicht.


    Wenn Du den Fold öffnest, dann wirst Du sehen, daß die letzte Zeile dieses Folds ungefähr so aussieht:


    PTP XFP[1]


    Schreib den Punkt doch einfach händisch rein so in der Art wie:


    $Tool=Tool_Data[1]
    $Base=$NULLFRAME
    BAS(#PTP_PARAMS,100)
    PTP FP[I] C_PTP


    Funktioniert genauso gut.


    Gruß Robodoc


  • ????
    Sorry, aber ich versteh nur Bahnhof.


    Hab mal die SRC mit nem normalen Editor geöffnet. Bei allen anderen PTP Bewegungen steht z.B.:


    ;FOLD PTP P10 CONT Vel= 100 % PDAT1 Tool[1] Base[0];%{PE}%R 4.1.12,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:P10, 3:C_PTP, 5:100, 7:PDAT1
    $BWDSTART = FALSE
    PDAT_ACT=PPDAT1
    BAS(#PTP_DAT)
    FDAT_ACT=FP10
    BAS(#FRAMES)
    BAS(#VEL_PTP,100)
    PTP XP10 C_PTP
    ;ENDFOLD


    Bei der fehlerhaften steht gar nichts von FOLD, nur:


    PTP FP[I] CONT Vel= 100 % PDAT1 TOOL[1] Base [0]


    Nun bin ich total verwirrt.

  • ;fold versteckt die nachfolgenden Zeilen bis zum;endfold
    KUKA benutzt das um die geteachten Punkte hübsch in ein Programm einzubauen. Die zeilen zwischen ;fold und ;endfold sind der automatisch erzeugte code. Die Zeile wo nix von fold aussen rum steht hast Du wahrscheinlich von Hand rein getippt.


    lösch einfach die ;fold und ;endfold Zeilen raus und modifiziere den übrigen code, so wie von Ralle beschrieben:


    $Tool=Tool_Data[1]
    $Base=$NULLFRAME
    BAS(#PTP_PARAMS,100)
    PTP FP[I] C_PTP

    If you and DEAD people can read Hex, how many people can read Hex?

  • Hä?


    Also soll ich bei den anderen PTP Bewegungen das Fold und Endfold löschen, macht doch irgendwie keinen Sinn oder :nocheck:??


    Bei der Fehlerhaften Zeile steht nichts von FOLD und ENDFOLD oder $Tool=Tool_Data[1]; $Base=$NULLFRAME; BAS(#PTP_PARAMS,100); PTP FP[I] C_PTP.


    Nun bin ich total verwirrt.

  • Hallo Ralle!


    Klar steht nichts von $tool=tool_data[schlachmichtot] drin.


    Das Beispiel funktioniert auch ein bißchen anders. Versuch's einfach mal. Das wird schon funktionieren. Wenn Du die Zeit hast (ich weiß ich weiß, Zeit ist meist die größte Mangelware), dann versuch mal die bas.src im Systemordner durchzulesen und zu verstehen. Dann wird Dir einiges klar werden über die Art und Weise, wie der Kuka seine Tools und Bases anspricht bzw. verwaltet.


    Mein Beispiel ist ja auch nur ein Ansatz, der aber sicher funktioniern wird. Wenn alles nichts fruchtet, dann poste dochmal einen Abzug des Programmes, das Dir den Fehler rauswirft. Dann kann Dir ganz sicher geholfen werden.


    Gruß Robodoc

  • Hab versucht, die Änderungen vorzunehmen, Hat aber keine Änderung nach sich gezogen. Bin wahrscheinlich einfach zu doof :?.
    Wäre nett, wenn einer von euch sich das Programm mal anschauen könnte.
    Hab es mal angehängt.

  • Hallöle!


    Bei Dir steht:



    PTP FP[I] CONT Vel= 100 % PDAT1 TOOL[1] Base [0];$Tool=Tool_Data[1]


    $Base=$NULLFRAME
    BAS(#PTP_PARAMS,100)
    PTP FP[I] C_PTP


    Das ist syntaktisch nicht ganz in Ordnung. Laß mal diese Zeile weg:


    PTP FP[I] CONT Vel= 100 % PDAT1 TOOL[1] Base [0]


    Möchte heißen, stattdessen nur das dranhängen, was Du auskommentiert hast ($tool=tool_data[1] )


    Dann funzt's! (Sagt jedenfalls mein Laborroboter)


    Gruß Robodoc

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