Beiträge von IrrerPolterer


    Die Positionsvariable Ablage muss einmal mit der Masterposition (1.Ablage) beschrieben werden, da sonst undefinierte Elemente der Positionsstruktur vorhanden sind.


    Ein bisschen selbst sollte der TO ja auch denken... ;)



    50mm Abstand, wie groß ist der Greifer


    Das ist doch irrelevant. Vielleicht ist ja ein Bauteil 50cm groß.



    Ich bin hier neu im Forum und es sicherlich nicht gewünscht komplette Lösungen zu liefern. (oder)


    Da gibt es keine Regelung. ich persönlich mag es nicht, wenn Leute sich keine Mühe mehr machen müssten und sich komplette Lösung von anderen vorkauen lassen.

    Zaehler gibt's ja genügend z.B I[1]..I[2] etc
    nur zwei Beispiele:
    10 verschieden Ablage
    Beispiel 1:


    Code
    I[1]=0
    LOOP
    ABLAGE.X = 50*I[1]
    LIN ABLAGE
    I[1]=I[1]+1
    IF I[1]>9 then
    I[1]=0
    ENDIF
    ENDLOOP


    Beispiel 2:


    Code
    INT I
    LOOP
    FOR I = 1 TO 9
    ABLAGE.X= 50*I
    LIN ABLAGE
    ENDFOR
    ENDLOOP


    Das gehört für mich allerdings zum Grundwissen, der Roboterprogrammierung!


    und vor der Home i mit 1 beschreiben (i=1) damit du einen Startwert hast


    Ist nicht nötig, da I in der Schleife initialisiert wird.



    Dort ist egal was für befehl benutze und fast egal wo des steht, meckert nicht so viel wegen sowas!!!
    Warum muss ich jedes mal einen befehl definieren was normalerweise grundsatz im Programm ist?


    Du definierst keinen Befehl, sondern eine Variable!
    Das ist vieleicht nicht bei in jeder Hochsprache bei For.-Schleifen notwendig, aber Variablen deklariert man eigentlich auch in C++, VB, Python....



    Wegen home meckert er nicht!


    Das können wir aber nicht wissen und HOME ist kein gültiger Befehl, wenn es genauso dort stehen würde, würde er sehr wohl meckern. Bitte beim nächsten Mal den Code richtig hier einfügen.



    Läuft's denn jetzt?

    Die Deklaration von I am Programmanfang setzen. Das Home ist auch komisch.
    Bitte mal mit den Grundlagen auseinandersetzen. Deklarationsteil, Anweisungsteil...



    Code
    INT I
    INI
    PTP HOME 100% DEFAULT 
    FOR i=1 TO 10
    v13neu()
    ENDFOR
    PTP HOME 100% DEFAULT

    Das Programm springt in das Unterprogramm INTR_STOP()
    Der Roboter wird angehalten (Programmstopp durch HALT-Befehl) bis das Bauteil im Greifer ist oder das Programm zurückgestezt wurde.
    Ich weiß nicht genau was du vorhast, dieses wäre nur eine von vielen Lösungen, und da du von Interruots gesprochen hast, bin ich davon ausgegangen, dass du so ingefähr weißt wie man sie programmiert.
    Interrupt Programmierung ist in der KUKA-Doku beschrieben.



    Des weiteren hätte ich noch ein weiteres Anliegen:
    Etwas früher im Programm, wo das Bauteil geholt wird, soll ebenfalls geprüft werden, ob es korrekt gegriffen wurde. Andernfalls soll der Roboter per Loop zurück an den Anfang des


    Vielleicht solltest du dein Programm anders aufbauen.

    Ich weiß nicht, ob ich dich richtig verstanden habe, aber es geht einfacher im Programm selber.



    So ähnlich jedenfalls...

    Ist gibt bei der KRC Arbeitsräume, die konfiguriert werden können. Es kann auch festgelegt werden, wie der Roboter reagieren soll, wenn z.B. ein Arbeitsraum verlassen oder befahren wird. Manchmal reicht es auch, die Softwareendschalter einzustellen um einzelne Achsen zu begrenzen.

    Du kannst das auch ohne Funktion nutzen. Also einfach in deinem Programm direkt berechnen.


    Aber ein Aufrechnen OHNE geometrischen Operator ist IMO absoluter Mist und Gepfusche. In der KUKA Dokumentation ist der geometrische Operator gut beschrieben.
    Wenn du einfach sagst BASE_DATA[1].X=BASE_DATA[1].X+500, dann verschiebst du die Base um den Roboterursprung in 500mm aber nicht vom Base-Ursprung! Das mag höchstens gehen, wenn alle Winkel der Base 0 sind. Aber wann hat man das schon mal?


    Alles was halt in einen Frame so rein passt. Also nichts anderes als zuvor auch schon...


    Das Kompakte hatte Programmiersklave schon geschrieben. Und dort eben auch mit $NULLFRAME, was für mich die einzige sinnvolle Lösung ist. Denn:
    Wenn man das Bauteil nur in A drehen möchte und in $POS_ACT folgendes drinsteht: {...., a. 45.0, b 0.0, c 180.0....} dann dreht man z.B. auch noch C mit. Dürfte nicht so der Brüller sein.
    Die Funktion in meinem Beispiel ist eine etwas abgespeckte Version eine Funktion aus meiner eigene Bibliothek, die ich immer auf jeder Steuerung nutze. Heißt da etwas anders:



    Damit lässt sich also jeder Frame mit x-beliebigen Koordinaten verschieben. Egal ob Tool-, Basedata oder sonstige Frames.

    Außerdem hast du meinen Fehler "OFFSET.X" schön übernommen... :zwink:


    Code
    DEFFCT FRAME MOVETOOL()
    FRAME OFFSET
    OFFSET.X=$POS_ACT.X
    OFFSET.X=$POS_ACT.Y
    OFFSET.X=$POS_ACT.Z
    OFFSET.X=$POS_ACT.A + CAM_OFFSET
    OFFSET.X=$POS_ACT.B
    OFFSET.X=$POS_ACT.C
    RETURN TOOL_DATA[1]:OFFSET
    ENDFCT




    Was tust du, wenn in $POS_ACT.C z.B. 180.0, also nicht 0.0 drinsteht? Dann rechnest du diesen Winkel mit ein!
    Das Ganze hängt also stark von deinem bisherigen Programmaufbau ab, und wonach sich die Offsetdaten berechnen, auf was sie sich beziehen und viele andere Faktoren...

    Also dreht sich die Base um X=0? Und nicht um $POS_ACT oder TCP?


    Hääh? :shock:
    Wenn du eine Base vermessen hast und per geometrischem Operator nur A drehst, dann wird um die Z-Achse des Base-Nullpunktes gedreht. Kleines Beispiel:

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Sieht ganz schön kompliziert aus!
    Wieso ist "Offset X="alles andere?
    Ich hatte überlegt, den Base Ursprung mit einem Teachpunkt zu überschreiben und die ganze Base zu drehen, geht das?
    Dreht eine Base immer um den Ursprung?


    1. Ist nicht so kompliziert.
    2.Weil ich bei Copy/Paste vergessen habe, es anzupassen. :laugh: Korrigiere ich gleich.


    Sicher kannst du genauso die Base drehen. Allerdings immer daran denken auch hier den geometrischen Operator zu nehmen, dann verdrehst/verschiebst du die Base immer um sich selbst.


    Hier ein wenig einfacher. Mit Base:


    Code
    DEF MOVEBASE()
    ;Kopiert Base 1 mit Offset in Base 11
    FRAME OFFSET
    OFFSET=$NULLFRAME ;Offset mit allen Koordinaten auf 0.0 initialisieren
    OFFSET.Z=CAM_Z ;Offset.Z mit Z-Wert von Kamera überschreiben
    OFFSET.A=CAM_A ;Offset.A mit A-Wert von Kamera überschreiben
    BASE_DATA[11]=BASE_DATA[1]:OFFSET
    ENDFCT

    Achse 6 drehen wird dir nicht helfen. Ich würde wahrscheinlich das Tool oder die Base verschieben. Dazu nutzt man den geometrischen Operator.
    Kleines Beispiel Tool-Verschiebung:



    Programm Aufruf: