Interrupt funz nicht so wie ausgemalt

  • Hall Leute,
    hatte vor einer Weile mit ähnlichem Problem hier nach Rat gefragt und war zum Teil fündig geworden.
    In der Zwichenzeit konnte ich mich auch etwas in die Roboterprogrammierung einlesen.
    Es geht um ein Projekt an der Schule.
    Der Roboter: KR16 Steuerung KRC2. Also eine gut ausgestattete Roboterzelle mit Laufband, teachpanel und einer sog. Switchbox an der man 10 E/A`s anschliesen kann. Am Roboter ist ein Parallelgreifer von Festo montiert.


    Die Aufgabe:
    An die oben genannte "Switchbox" ist so eine Industriekamera am Eingang 6 angeschlossen. In der Kamera ist ein Referenzbild im Vorfeld erstellt wurden.
    Nun soll der Roboter ein Werkstück (Zylinderförmig 65 duchmesser 25 hoch) greifen und es über die Kamera halten. Dann wird das Werkstück z.B. um 180° um die eingene Achse gedreht und sobald die Kamera die Pos erkennt gibt sie ein Signal.
    Und genau da soll der Roboter halten oder die Position bei der Signalgabe speichern.
    Im Nachhinein das Werkstück auf eine Palette legen in der gespeicherten Pos. (Aber soweit bin ich noch garnicht gekommen..... :???:
    Ich habe hier mal ein Auszug aus dem Programm. Bin erst seit ein zwei Monaten an dem Projekt dran und habe auch selten richtig viel Zeit.
    Würde mich auf eine schnelle Antwort freuen.
    Danke im Voraus.


    DEF Projekt( )




    interrupt decl 1 when $in[6]==true do unterprog () ;-------Das ist die Deklaration (So stand es zumindest in Doku von Kuka) die Kamera ist an Eingang sechs angeschlossen und sendet ein signal bei Erkennung des Bildes---;


    interrupt 1 on ;------hier schalte ich das interupt an.
    Dann macht er ein paar lin und ptp bewegungen. Und in der letzten bewegung (Die Drehbewegung des Werkstückes) erkennt die Kamera das Bild und der Eingang 6 an der Switchbox leuchtet kurz auf.



    Dann habe ich noch das Unterprogramm:


    tja und hier bin ich nicht weiter gekommen. bis jetzt habe ich nur BRAKE eingetragen, damit der Roboter wenigsens anhält wenn E6 angeht, aber nichtmal das klappt.


    &ACCESS RVO
    &REL 33
    &COMMENT PROJEKT
    &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
    &PARAM EDITMASK = *
    DEF UNTERPROG( )
    ;FOLD INI
    ;FOLD BASISTECH INI
    GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
    INTERRUPT ON 3
    BAS (#INITMOV,0 )
    ;ENDFOLD (BASISTECH INI)
    ;FOLD SPOTTECH INI
    USERSPOT(#INIT)
    ;ENDFOLD (SPOTTECH INI)
    ;FOLD GRIPPERTECH INI
    USER_GRP(0,DUMMY,DUMMY,GDEFAULT)
    ;ENDFOLD (GRIPPERTECH INI)
    ;FOLD USER INI
    ;Make your modifications here


    ;ENDFOLD (USER INI)
    ;ENDFOLD (INI)
    BRAKE



    END



    Danke für eure Hilfe... :merci:

  • Schritt für Schritt zum Roboterprofi!
  • Hallo Herr Kaiser :)


    also ich würde Ihr Unterprogramm folgendermaßen abändern.


    &ACCESS RVO
    &REL 33
    &COMMENT PROJEKT
    &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
    &PARAM EDITMASK = *
    DEF UNTERPROG( )


    BRAKE
    ...
    ...Fahrbewegungen
    ...
    ...
    ...
    ...
    INTERRUPT OFF
    RESUME
    END


    Ich hatte auch öfters Probleme mit Interrupts das entfernen der INI Zeile wirkt manchmal Wunder.
    Nach Ablauf des Unterprogramms wird wieder an die stelle gesprungen in der der Interrupt deklariert wurde.
    evtl bei der Interrupt deklaration folgendes probieren.


    GLOBAL INTERRUPT DECL 5 WHEN $IN[6]==TRUE DO unterprog()

  • Moin,
    wenn ich nicht irre sind die ersten Interrupts vom System belegt, ich würde mal ab Interrupt 10
    programmieren, damit sollte das ganze dann funktionieren.


    Wichtig evtl. noch, daß in Unterprogrammen, die mit RESUME abgebrochen werden sollen, vor der
    letzten Zeile der Vorlauf angehalten wird. Nur dann ist gewährleistet, daß der Vorlaufzeiger
    bei RESUME nicht in der Ebene steht, in welcher der Interrupt deklariert wurde.
    $ADVANCE=0.
    Nach RESUME wird das Hauptprogramm mit der Anweisung nach dem Unterprogrammaufruf,
    also $ADVANCE=3 (Vorlauf zurückstellen), fortgesetzt.


    Das sollte Stoff für die nächsten Versuche bringen.


    LG Simone

    Was haben Roboter und Männer gemeinsam ?<br />Beide brauchen Befehle um zu funktionieren !!!

  • Hallo nochmal,


    nur die Interrupts mit der Priorität 40 - 80 sind durch eine automatische Prioritätsvergabe durch das System reserviert.
    1-39 und 81-128 können verwendet werden.

  • Und nochmal


    Haben Sie schon einmal unter Anzeige/Eingänge geschaut ob Ihr declarierter Eingang auch wirklich auf High geht?
    Der Interrupt kommt nur mit einer ansteigenden Flanke.

  • Du musst nach BRAKE auf irgentetwas warten z.B. das der Roboter angehalten hat.
    Das machst man am besten so:

    Code
    DEF UNTERPROG()
      INTERRUPT OFF 1
      BRAKE
      WAIT FOR $ROB_STOPPED
    END


    So wird der Roboter abbremsen bis der zum Stillstand gekommen ist und anschliessend weiterfahren.


    Für den Positionsauswertung eignet sich $POS_INT am besten, da darin die Position des Roboters beim auslösen des Interrupts abgespeichert wird.
    ACHTUNG!!! $POS_INT wird wieder ungültig wenn das Interrupt-Unterprogramm verlassen wird.

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

  • Hallo Leute,
    habe heute morgen die ersten freudensprünge gemacht bis dann heute abend wieder probleme aufgetreten sind.
    Das mit interrupt klappt jetzt.
    Es lag an dieser INI Sache wie es der Syrix vermutet hatte :gutidee:.
    Verflucht sei es, :wallbash: darauf waere ich als anfänger nicht in hundert jahren drauf gekommen... Danke dafür und danke an alle die so schnell und kompetent geantwortet haben. Mit so einem Forum im Rücken kann es doch nur klappen :merci:


    Nun stimmt die Abstimmung mit dem Signal nicht so richtig. Obwohl die Drehbewegung sehr langsam ausgeführt wird klappt das mit dem Signal nicht so ganz. Spielt die Dauer des Signals eine große Rolle, ich mein die leuchtet ganz kurz auf und naja dann wieder aus oder blinkt manchmal zwei mal oder so. Wie kann ich feststellen oder irgendwie eine Aussage über die Verarbeitung dieses Signals treffenl.
    Ich habe die Kamera zu testzwecken an Eingang acht eingesteckt und den Eingang während der Drehung manuell gesetzt und es klappt wunderbar. Jemand eine Idee.....Bin sicher jemand hat eine Idee..... :danke:


    MFG Kaiser




    Ach und die INI Zeile wollte ich noch sagen: und zwar habe ich da die Zeile
    BAS (#INITMOV,0 ) rausgelöscht, und es lief...........

    Einmal editiert, zuletzt von Kaiser ()

  • Hmm ich hab noch ne Idee!
    vielleicht liegt es daran dass du den Interrupt nicht ausgeschalten hast, kommt er öfter hintereinander?
    versuch das ma
    &ACCESS RVO
    &REL 33
    &COMMENT PROJEKT
    &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
    &PARAM EDITMASK = *
    DEF UNTERPROG( )


    BRAKE
    INTERRUPT OFF
    ...
    ...Fahrbewegungen
    ...
    ...
    ...
    ...
    RESUME
    END


    Und was auch wichtig ist der Interrupt geht nur bei einem Flankensignal.
    das heisst wenn der eingang schon 1 ist bevor der Interrupt an geschalten wird kommt er nicht!
    Nur wenn das Signal nach dem Einschalten des Interrupts auf 1 geht (positive Flanke) funktioniert er.


    MFG
    Syrix

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