Speicherung der Roboterposition auf Robotersteuerung, getriggert durch SPS Signal

  • Hallo Zusammen,


    ich würde gerne eine Funktion realisieren, mit der sich die aktuelle Position des Roboters durch ein Signal einer SPS auf der Robotersteuerung abspeichern lässt. Der Punkt soll einer Variablen (auch durch die SPS übermittelt) zugeordnet werden.


    $config.dat

    Code
    DECL GLOBAL E6POS tablepos[200]
    tablepos[1]={X 0,Y 0,Z 0,A 0,B 0,C 0,S 0,T 0,E1 0,E2 0,E3 0,E4 0,E5 0,E6 0}     ;muss dies für jede Position eingefügt werden?
    DECL GLOBAL INT tpos


    Sonderprogramm:

    Code
    If $IN[1]==TRUE THEN             ;boolsches Signal der SPS (Profinet) zum Speichern der aktuellen Position
        tpos=$IN[2]                    ;Zielpositionsnummer
        tablepos[tpos]=$POS_ACT    ;aktuelle Position speichern
    ENDIF


    irgendwo im Bewegungsprogramm:

    Code
    tpos=$IN[2]
    LIN tablepos[tpos]


    Geht das in die richtige Richtung und ist es möglich oder bin ich auf dem Holzweg? Koordinatensysteme müssen natürlich auch beachtet werden.

    Über Antworten würde ich mich sehr freuen.


    Gruß JR


    edit:

    WV Vers. 5.0.10

    KSS V. 8.5.6

    2 Mal editiert, zuletzt von RJust ()

  • Schritt für Schritt zum Roboterprofi!
  • $config.dat

    Code
    DECL GLOBAL E6POS tablepos[200]
    tablepos[1]={X 0,Y 0,Z 0,A 0,B 0,C 0,S 0,T 0,E1 0,E2 0,E3 0,E4 0,E5 0,E6 0}     ;muss dies für jede Position eingefügt werden?
    DECL GLOBAL INT tpos

    Wenn Du die Deklaration im $config.dat machst, bitte Schlüsselwort Global weglassen. Sonst Fehlermeldung. Alles im $config.dat ist automatisch global.

    Wenn Du jede Array-Position aufführst, wie Du es gemacht hast mit der ersten, sind sie als Persistent (speichernd) deklariert. Heisst, Wert bleibt erhalten, auch wenn Du Programm neu startest, abwählst, Steuerung neu startest. Auch bei der Archivierung.

    Für die Variable von der SPS für die Speichernummer brauchst Du eine Signalvereinbarung mit mehreren Eingängen, wo Du binär den Wert übergeben kannst. Wenn Du 200 Positionen ansprechen möchtest bräuchtest Du ja mindestens 8 bit.

    DECL SIGNAL TPOS $IN[2] TO $IN[9]

    Sonderprogramm:

    Code
    If $IN[1]==TRUE THEN             ;boolsches Signal der SPS (Profinet) zum Speichern der aktuellen Position
        tpos=$IN[2]                    ;Zielpositionsnummer
        tablepos[tpos]=$POS_ACT    ;aktuelle Position speichern
    ENDIF

    von Deinem Beschrieb her nicht klar, wann dies exakt ausgeführt werden soll. Einfach definiert in Deinem Ablauf oder irgendwo Parallel dazu.

    Möglichkeit wäre dies zum Bsp. via Interrupt:


    def Main ()

    ;......

    INTERRUPT DECL 10 WHEN $IN[1]==TRUE DO SAVE_POS( )

    INTERRUPT ON 10

    ;......BEREICH, WO SPEICHERN MOEGLICH FREIGEGEBEN IST

    ;......

    ;......

    INTERRUPT OFF 10

    END


    DEF SAVE_POS()

    INTERRUPT OFF 10

    TABLEPOS[TPOS]=$POS_INT

    PULSE (TPOS_SAVED,TRUE,0.5) ;RUECKMELDUNG AN SPS GESPEICHERT

    INTERRUPT ON 10

    END


    Eine Rückmeldung an die SPS würde ich auch einbauen. Ob's die Speichernummer sein soll oder einfach ein Ausgang...


    Wenn Du später Positionen fahren willst, aufgerufen von der SPS


    LIN TABLEPOS[TPOS]


    Gruss SJX

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • Vielen Dank! Der erste Teil hilft mir auf jeden Fall weiter.


    von Deinem Beschrieb her nicht klar, wann dies exakt ausgeführt werden soll. Einfach definiert in Deinem Ablauf oder irgendwo Parallel dazu.

    Möglichkeit wäre dies zum Bsp. via Interrupt:


    Der Roboter wird inkrementell bewegt. Wenn die gewünschte Position erreicht ist (z. B. Taster/Sensor) soll die Position abgespeichert werden. Quasi wie teachen durch ein übergeordnetes System. Über ein Interrupt muss ich es glaube nicht machen.

  • Die Möglichkeit über Interrupt erlaubt dir aber exakt die Position zu ermittel die die Flanke deines Signals ermittelt.

    Frage dabei spielt der Abstand deiner Inkremente mit der geforderten Genauigkeit deiner Position.


    Es würde eine Systemvariable geben die exakt im Moment des Auslösesignals deines Interrupt die Position speichert. ($pos_Int)


    Gruß

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Hallo,


    gibt es zur Syntax der KRL Bewegungsprogrammierung irgendeine Dokumentation die ich nicht kenne? Im Dokument "KUKA System Software 8.5 Bedien- und Programmieranleitung für Systemintegratoren" ist es sehr spärlich dokumentiert (S.478).


    Die Struktur der InLine Programmierung wollte ich nicht nutzen, sondern wollte die Teile mit "KRL Bewegungen" in ein Subprogramm legen und dann aufrufen. So bleibt es denke übersichtlicher.


    Gruß

  • Also in den vorherigen Versionen stand meines Wissens nach auch nicht mehr drin.

    Denke das der grobe Umfang dort schon abgedeckt ist.


    Gruß

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Hallo,


    nach dem Speichern der aktuellen Position des Roboters in eine globale E6POS (siehe oben) bekomme ich als Status und Turn folgenden Eintrag:

    Code
    S 'B0011',T 'B00100011'

    Laut Doku besteht der Status aus 5 Bits (und nicht aus 4). Kann das letzte einfach weggelassen werden, weil es sich nicht um einen absolutgenauen Rob handelt?

    Der Turn besteht laut Doku aus 6 Bits (und nicht aus 8). 7 Bits beim Turn hätte ich wegen einer externen Achse verstehen können, jedoch keine 8. Hat da jemand eine Erklärung?


    Wenn ich die Position im Bezug auf ein anderes Koordinatensystem speichern will, muss ich vorher die Basis ändern?

    Code
    ...
    $BASE=BASE_DATA[1]
    tablepos[1]=$POS_ACT
    ...

    Oder bezieht sich $POS_ACT immer auf das gleiche Koordinatensystem?


    Grüße

    RJ

    • Hilfreich

    $Pos_act bezieht sich auf das aktuell aktive Koordinatensystem und Toolkoordinatensystem. 😉

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

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