KRC 4 interrupt funktioniert nicht

  • hallo
    habe ein problem mit der interrupt programmierung
    in dem einen programm springt er nicht in das programm was durch den interrupt aufgerufen werden soll.


    dann habe ich ein testprogramm geschrieben und dort funktioniert es
    vielleicht kann mir jemand sagen wo in den beiden programmen der unterschied liegt.


    danke schonmal


    -- programm was funktioniert:


    DEF test22( )
    ;FOLD INI;%{PE}
    ;FOLD BASISTECH INI
    GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
    INTERRUPT ON 3
    BAS (#INITMOV,0 )
    ;ENDFOLD (BASISTECH INI)
    ;FOLD USER INI
    ;Make your modifications here


    ;ENDFOLD (USER INI)
    ;ENDFOLD (INI)


    interrupt decl 10 when $flag[1]==TRUE DO gtre()




    PTP XHOME


    LIN XP1


    LIN XP2


    interrupt on 10
    wait sec 0.012
    $flag[1]=true
    wait sec 2
    $flag[1]=false



    LIN XP3


    PTP XHOME



    END



    ---- programm was nicht funktioniert:


    DEF aufnahme_gruen_nio( )


    ;FOLD INI;%{PE}
    ;FOLD BASISTECH INI
    GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
    INTERRUPT ON 3
    BAS (#INITMOV,0 )
    ;ENDFOLD (BASISTECH INI)
    ;FOLD USER INI
    ;Make your modifications here


    ;ENDFOLD (USER INI)
    ;ENDFOLD (INI)


    global interrupt decl 10 when int_greifer_schliessen == TRUE DO f_greifer()
    global interrupt decl 11 when int_greifer_oeffnen == TRUE DO f_greifer()
    global interrupt decl 12 when $flag[1] == true DO f_keinTeil()


    IF silber_nio or drucken_nio THEN
    an_sps_hauptprognr = 20
    ptp $POS_ACT
    goto silber_nio
    ENDIF


    an_sps_hauptprognr = 20
    wait for an_sps_hauptprognr == von_sps_hauptprognr



    PTP XHOME



    PTP Xueber_aufnahme_gruen C_DIS


    LIN Xaufnahme_pos



    $VEL.CP=1
    $ACC.CP=7
    $APO.CDIS=20


    INTERRUPT ON 10
    wait sec 0.012
    PULSE ( int_greifer_schliessen, true, 0.3 )
    lin_rel {z 60.0} c_dis
    INTERRUPT OFF 10


    interrupt ON 12
    wait sec 0.012
    $flag[1]=true
    lin_rel {z 50.0}
    interrupt OFF 12
    $flag[1]=false


    silber_nio:


    FOR zaehler_achsen=1 TO $NUM_AX
    $ACC_AXIS[zaehler_achsen]=60
    ENDFOR
    FOR zaehler_achsen=1 TO $NUM_AX
    $VEL_AXIS[zaehler_achsen]=60
    ENDFOR


    ptp{a1 -110.6, a2 -61.4, a3 135.7,a4 -0.5, a5 16.0,a6 -48.4} c_ptp



    ptp xhome


    END

  • Schritt für Schritt zum Roboterprofi!
  • Hi,
    in testprogramm sehe ich nicht INTERRUPT OFF und wo nicht funktioniert wird es programmzeiger fast gleichzeitig pulse setzen und interrupt ausschalten. Probiermal:


    INTERRUPT ON 10
    $advance=1
    PULSE ( int_greifer_schliessen, true, 0.3 )
    lin_rel {z 60.0} c_dis
    INTERRUPT OFF 10
    $advance=3


    aber dann c_dis kann man wahrscheinlich sparen

  • ich habe jetzt den abstand zwischen on und off vergrößert u es scheint zu funktionieren
    musste aber in jedes programm wo ich die interrupts benötige sie deklarieren dachte wenn man sie global setzt kann man sie überall benutzen. :nocheck:


    oder wo muss ich sie deklarieren das ich sie in jedem programm nutzen kann ?????????????? :denk:

  • Hallo,


    Du musst den Interrupt eine Ebene höher deklarieren, dann kannst Du Ihn überall verwenden.


    Hier ein Auszug aus der Doku:
    Ein Interrupt wird erst ab der Ebene erkannt, in der er
    deklariert ist. Das bedeutet: Ein Interrupt, der in einem
    Unterprogramm deklariert wurde, ist im Hauptprogramm
    nicht bekannt (und kann dort auch nicht aktiviert werden).
    Wenn ein Interrupt auch in übergeordneten Ebenen
    bekannt sein soll, dann muss der Deklaration das Schlüsselwort
    GLOBAL vorangestellt werden.


    Gruß Georg

  • hatte ich eigentlich gemacht ging aber nicht
    kann man die interrupts auch im cell programm deklarieren?
    dann sollten sie ja in der höchsten programmebene stehen. oder ?

  • Klar geht das. Im Cell deklarieren wir z.B. den Interrupt für die Grundstellungsfahrt.


    Auszug aus Cell.src
    ;***************************************************
    ; Declare interrupts
    ;***************************************************
    INTERRUPT DECL 5 WHEN di_MoveHome==TRUE DO STOP_ROBOT()
    INTERRUPT OFF 5
    ;***************************************************


    Gruß Georg

  • Hallo,


    der Post ist ja schon etwas aelter. Freelancer hat da 100% recht.
    Abstand vergroessern zwischen On und Off hat den selben Effekt, wie $Advance zu reduzieren.
    Declaration und Aussloessen sind im gezeigten Beispiel in der selben Ebene, das funktioniert.


    Trotzdem wuerde ich den Interrupt in der Interruptroutine auschalten und im aufrufenden Progrann dann pruefen, ob er geschaltet hat.


    GeorgS in Stop_Robot() steht sicher Brake und Resume? Dann mindestens eine Ebene hoeher, weil Resume den Ruecksprung in die Ebene der Deklaration bewirkt.



    Gruss Stefan

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