Interrupt startet nicht trotz erfüllter Bedingung

  • Hallo Zusammen,

    ich muss für einen Kunden eine Suchfahrt programmieren, die mir bei Betätigen zweier Sensoren das Signal gibt, dass ich nur noch eine gewisse Strecke fahren kann.

    Dies versuche ich natütrlich mit einem Interrupt zu programmieren.

    Ich habe aber folgendes Problem:

    Beim direkten Ablauf meines Programms wird der Interrupt nie aktiviert, obwohl der Sensor bestätigt wird. Springe ich jedoch mit der Satzanwahl wieder auf eine Ebene höher (überhalb meiner Bewegung) und starte den Ablauf erneut, startet daraufhin gleich das Interrupt-UP.

    Ich habe so gut wie alles versucht und bin mit meinem Latein am Ende.. Vielleicht hat von euch wer eine Idee, was ich an meinem Programm noch falsch mache.

    Danke schon mal für eure Hilfe.

    Hier mein aktuelles Programm:




    INTERRUPT DECL 11 WHEN Absenkpos_TR_links OR Absenkpos_TR_rechts DO Endposition_Stop()


    ;INTERRUPT DECL 12 WHEN $IN[8] == TRUE DO Endposition_Stop()


    INTERRUPT OFF 11


    ;INTERRUPT OFF 12



    ; for homing


    PLC_i_AH_JobNum=3


    ; Automatic homing possible


    tmo_do_AutoHomePossible=TRUE



    IF ((BTL_vorh_Grip_cln_links OR BTL_vorh_Grip_cln_rechts) AND (Grip_zu_cln_links OR Grip_zu_cln_rechts)) THEN



    PLC_b_RobInGrst=FALSE


       GOTO DROP_DRTY




    ENDIF



    IF (PLC_b_RobInGrst==FALSE) THEN


       GOTO END_HP


    ENDIF



    ;FOLD Grp Init GrpNo:1


    ;FOLD ;%{h}


    ;Params IlfProvider=gripperset; Grp_Cmd=Init; Grp_No=1; Grp_Desc=


    ;ENDFOLD


    Grp_Init (1)


    ;ENDFOLD


    ;FOLD Grp ChkAdv GrpNo:1 Actuator:1,2


    ;FOLD ;%{h}


    ;Params IlfProvider=gripperset; Grp_Cmd=ChkAdv; Grp_No=1; Grp_Move=NoMove; Grp_Actuator1=1; Grp_Actuator2=2; Grp_Actuator3=_; Grp_Desc=


    ;ENDFOLD


    Grp_GrpChkPos (1,#ChkAdv,"1,2,0,0,0")


    ;ENDFOLD


    ;FOLD Grp PartChk GrpNo:1 Chk:True PartControl:1,2 PlcControl:noControl


    ;FOLD ;%{h}


    ;Params IlfProvider=grpchkpart; Grp_Cmd=PartChk; Grp_No=1; Grp_Move=NoMove; Grp_Chk=True; Grp_PartCont1=1; Grp_PartCont2=2; Grp_PartCont3=_; Grp_Cont=_; Grp_PlcControl=noControl; Grp_Desc=


    ;ENDFOLD


    Grp_ChkPart (1,True,1,2,0,0,0,False,#noControl)


    ;ENDFOLD



    ;FOLD PlcCheckHome Home:2


    ;FOLD ;%{h}


    ;Params IlfProvider=plchome; Plc_ChkHomeNum=2; Plc_ChkRehome=False; Plc_ChkDesc=


    ;ENDFOLD


    PLC_CheckHome (2,FALSE)


    ;ENDFOLD




    ; ------------------------------------------------------


    ; Hauptprogramm


    ; ------------------------------------------------------



    TRIGGER WHEN DISTANCE=1 DELAY=0 DO PLC_i_AH_StepNum=2


    ;FOLD PTP HOME2 Vel=100 % PHOME2 ;%{PE}


       ;FOLD Parameters ;%{h}


          ;Params IlfProvider=kukaroboter.basistech.inlineforms.movement.old; Kuka.IsGlobalPoint=False; Kuka.PointName=HOME2; Kuka.BlendingEnabled=False; Kuka.MoveDataPtpName=PHOME2; Kuka.VelocityPtp=100; Kuka.CurrentCDSetIndex=0; Kuka.MovementParameterFieldEnabled=True; IlfCommand=PTP


       ;ENDFOLD


    $BWDSTART = FALSE


    PDAT_ACT = PPHOME2


    FDAT_ACT = FHOME2


       BAS(#PTP_PARAMS, 100.0)


       SET_CD_PARAMS (0)


       PTP XHOME2


    ;ENDFOLD



    PLC_b_RobInGrst=FALSE


    TRIGGER WHEN DISTANCE=1 DELAY=0 DO PLC_i_AH_StepNum=31


    ;FOLD PTP VP1_TR CONT Vel=100 % VP1_TR Tool[11]:GRP_drt_Parts Base[2]:Drehtisch ;%{PE}


       ;FOLD Parameters ;%{h}


          ;Params IlfProvider=kukaroboter.basistech.inlineforms.movement.old; Kuka.IsGlobalPoint=False; Kuka.PointName=VP1_TR; Kuka.BlendingEnabled=True; Kuka.MoveDataPtpName=VP1_TR; Kuka.VelocityPtp=100; Kuka.CurrentCDSetIndex=0; Kuka.MovementParameterFieldEnabled=True; IlfCommand=PTP


       ;ENDFOLD


    $BWDSTART = FALSE


    PDAT_ACT = PVP1_TR


    FDAT_ACT = FVP1_TR


       BAS(#PTP_PARAMS, 100.0)


       SET_CD_PARAMS (0)


       PTP XVP1_TR C_Dis


    ;ENDFOLD



    DROP_DRTY:



    ;FOLD Job Started JobNum:3 Desc:Ablegen schmutzige Rohre


       ;FOLD ;%{h}


          ;Params IlfProvider=job; Plc_JobCmd=Started; Plc_JobMove=NoMove; Plc_JobNum=3; Plc_JobCont=_; Plc_JobDesc=Ablegen schmutzige Rohre


       ;ENDFOLD


       Plc_Job (1,3,False)


    ;ENDFOLD




    ;FOLD Area Request AreaNum:2 Desc:Drehtisch


       ;FOLD ;%{h}


          ;Params IlfProvider=area; Plc_AreaCmd=Request; Plc_AreaMove=NoMove; Plc_AreaNum=2; Plc_AreaAbort=_; Plc_AreaCont=_; Plc_AreaDesc=Drehtisch


       ;ENDFOLD


       Plc_AreaPreReq (2)


       Plc_AreaReq (2,0,0,0,False)


    ;ENDFOLD




    TRIGGER WHEN DISTANCE=1 DELAY=0 DO PLC_i_AH_StepNum=32


    ;FOLD PTP DROP_VP_oben CONT Vel=100 % DRO_VP_oben Tool[11]:GRP_drt_Parts Base[2]:Drehtisch ;%{PE}


    ;FOLD Parameters ;%{h}


    ;Params IlfProvider=kukaroboter.basistech.inlineforms.movement.old; Kuka.IsGlobalPoint=False; Kuka.PointName=DROP_VP_oben; Kuka.BlendingEnabled=True; Kuka.MoveDataPtpName=DRO_VP_oben; Kuka.VelocityPtp=100; Kuka.CurrentCDSetIndex=0; Kuka.MovementParameterFieldEnabled=True; IlfCommand=PTP


    ;ENDFOLD


    $BWDSTART = FALSE


    PDAT_ACT = PDRO_VP_oben


    FDAT_ACT = FDROP_VP_oben


    BAS(#PTP_PARAMS, 100.0)


    SET_CD_PARAMS (0)


    PTP XDROP_VP_oben C_Dis


    ;ENDFOLD



    TRIGGER WHEN DISTANCE=1 DELAY=0 DO PLC_i_AH_StepNum=33


    ;FOLD LIN DROP_VP Vel=0.5 m/s DROP_VP Tool[11]:GRP_drt_Parts Base[2]:Drehtisch ;%{PE}


       ;FOLD Parameters ;%{h}


          ;Params IlfProvider=kukaroboter.basistech.inlineforms.movement.old; Kuka.IsGlobalPoint=False; Kuka.PointName=DROP_VP; Kuka.BlendingEnabled=False; Kuka.MoveDataName=DROP_VP; Kuka.VelocityPath=0.5; Kuka.CurrentCDSetIndex=0; Kuka.MovementParameterFieldEnabled=True; IlfCommand=LIN


       ;ENDFOLD


    $BWDSTART = FALSE


    LDAT_ACT = LDROP_VP


    FDAT_ACT = FDROP_VP


       BAS(#CP_PARAMS, 0.5)


       SET_CD_PARAMS (0)


       LIN XDROP_VP


    ;ENDFOLD



    ; Abfahren der Suchstrecke mit Interrupt



    $Advance=0


    WAIT SEC 0



    INTERRUPT ON 11


    Suchstrecke()



    INTERRUPT OFF 11


    LIN XGRP_Pos_TR



    $ADVANCE = 3


    [...]


    DEF Suchstrecke ()



    $Advance = 0



    INTERRUPT ON 11



    WAIT SEC 0.1


    Suchfahrt()




    XGRP_Pos_TR = $POS_ACT



    WAIT SEC 1.0



    INTERRUPT OFF 11


    ;INTERRUPT OFF 12



    $ADVANCE = 3





    END



    DEF Suchfahrt ()




    ;XGRP_Pos_TR = XDROP_ZP


    ;LIN XGRP_Pos_TR:{X -8.0,Y 0.0, Z -630.0, A 0.0, B 0.0, C 0.0}


    INTERRUPT ON 11


    WAIT SEC 0.1



    XGRP_Pos_TR = $POS_ACT



    $VEL.CP = 0.1


    $ACC.CP = 0.1



    TRIGGER WHEN DISTANCE=1 DELAY=0 DO PLC_i_AH_StepNum=34


    ;LIN XGRP_Pos_TR:{X -8.0 -20,Y 0.0, Z -630 -1412.0, A 0.0, B 0.0, C 0.0}


    XGRP_Pos_TR.X = XGRP_Pos_TR.X - 28 ;Versatz beim Verfahren entlang der Stange


    XGRP_Pos_TR.Z = XGRP_Pos_TR.Z - 1412 ; Versatz aus Diff VP und ZP + Unterschied Rohre max / min


    LIN XGRP_Pos_TR




    WAIT FOR TRUE



    IF FALSE THEN


    TRIGGER WHEN DISTANCE=1 DELAY=0 DO PLC_i_AH_StepNum=34


    ;FOLD LIN DROP_ZP Vel=0.2 m/s DROP_ZP Tool[11]:GRP_drt_Parts Base[2]:Drehtisch ;%{PE}


       ;FOLD Parameters ;%{h}


          ;Params IlfProvider=kukaroboter.basistech.inlineforms.movement.old; Kuka.IsGlobalPoint=False; Kuka.PointName=DROP_ZP; Kuka.BlendingEnabled=False; Kuka.MoveDataName=DROP_ZP; Kuka.VelocityPath=0.2; Kuka.CurrentCDSetIndex=0; Kuka.MovementParameterFieldEnabled=True; IlfCommand=LIN


       ;ENDFOLD


    $BWDSTART = FALSE


    LDAT_ACT = LDROP_ZP


    FDAT_ACT = FDROP_ZP


       BAS(#CP_PARAMS, 0.2)


       SET_CD_PARAMS (0)


       LIN XDROP_ZP


       ;ENDFOLD


    ENDIF



    END



    DEF Endposition_Stop ()



    WAIT SEC 0.1



    LIN $POS_INT


    XGRP_Pos_TR = $POS_INT


    XGRP_Pos_TR.z = XGRP_Pos_TR.z -195


    XGRP_Pos_TR.x = XGRP_Pos_TR.x - 10



    LIN XGRP_Pos_TR



    INTERRUPT OFF 11


    ;INTERRUPT OFF 12



    Brake F



    RESUME



    INTERRUPT OFF 11


    ;INTERRUPT OFF 12



    END

  • Schritt für Schritt zum Roboterprofi!
  • Du musst zuerst die noch laufende Bewegung stoppen mit Brake.

    z.B. so:

    Code
    DEF Endposition_Stop ()
    INTERRUPT OFF 11
    Brake F
    XGRP_Pos_TR = $POS_INT
    XGRP_Pos_TR.z = XGRP_Pos_TR.z -195
    XGRP_Pos_TR.x = XGRP_Pos_TR.x - 10
    LIN XGRP_Pos_TR
    RESUME
    END

    weiter verschachtelst Du dies doppelt. Wieso? Mit Resume landest Du in der Deklarationsebene des Interrupts.

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

  • Hilfreich bei der Fehlersuche ist auch, das Gegenteil der Auslösebedingung zur Wartebedingung zu machen, bevor man den Interrupt scharfschaltet:

    wait for (not (Absenkpos_TR_links OR Absenkpos_TR_rechts))

    INTERRUPT ON 11

    Dann weiß man wenigstens das mit Sicherheit.

  • Servus,


    ich hatte auch schon mal ein OR in den Interrupt rein gemacht hat aber nicht funktioniert! Nach dem ich 2 Interrupts daraus gemacht habe, hat es funktioniert. Das Ereignis darf eine boolsche Variable, Signal, Vergleich oder so ähnlich sein aber keine Logik. Das war auf jeden fall in 8.3 noch so, die neueren Steuerungen hatte ich noch nicht. Der Witz dabei, es wird nicht als Fehler angesehen und das Programm läuft auch ganz normal ab ohne Fehler aber auch ohne das was passiert.


    Gruß Philipp

  • Moin,


    ich könnte mir noch vorstellen bei der Deklaration des Interrupts 11 geht eventuell noch etwas schief -> Klammern um ganzen Logikausdruck fehlen. (Absenkpos_TR_links OR Absenkpos_TR_rechts)

    Bei If-Bedingungen schreit er sofort Fehler das der Interpreter es nicht versteht (zumindest in KRC2), deshalb muss das auch nicht unbedingt sein.


    @ Team Rosario: hattest du das auch getestet mit Klammern und trotzdem kein Erfolg?

  • Servus!

    Hatte ich auch schon probiert mit Klammern um die Bedingung, da spukt mir jedoch das WoV sofort eine Fehlermeldung..

    Laut Beschreibung des Dokuments "

    KUKA System Software

    KUKA System Software 8.6

    Bedien- und Programmieranleitung für Systemintegratoren"



    Ist eine Verknüpfung doch möglich.

  • Servus,


    ich hatte auch schon mal ein OR in den Interrupt rein gemacht hat aber nicht funktioniert! Nach dem ich 2 Interrupts daraus gemacht habe, hat es funktioniert. Das Ereignis darf eine boolsche Variable, Signal, Vergleich oder so ähnlich sein aber keine Logik. Das war auf jeden fall in 8.3 noch so, die neueren Steuerungen hatte ich noch nicht. Der Witz dabei, es wird nicht als Fehler angesehen und das Programm läuft auch ganz normal ab ohne Fehler aber auch ohne das was passiert.


    Gruß Philipp

    Hi Philipp,


    diese Möglichkeit hatte ich auch schon in Benutzung, leider mit gleichem Endergebnis.

    In dem Fall hatte ich beide Eingänge mit Interrupt 11 und 12 geschalten.

  • Du musst zuerst die noch laufende Bewegung stoppen mit Brake.

    z.B. so:

    Code
    DEF Endposition_Stop ()
    INTERRUPT OFF 11
    Brake F
    XGRP_Pos_TR = $POS_INT
    XGRP_Pos_TR.z = XGRP_Pos_TR.z -195
    XGRP_Pos_TR.x = XGRP_Pos_TR.x - 10
    LIN XGRP_Pos_TR
    RESUME
    END

    weiter verschachtelst Du dies doppelt. Wieso? Mit Resume landest Du in der Deklarationsebene des Interrupts.

    Danke ich versuche es mal auf diese Weise.

    Mein Problem ist jedoch, dass ich gar nicht in den Interrupt reinkomme im "normalen Ablauf"..

    Verfahre ich die Bewegung vorher und löse aus, passiert nichts. Springe ich mittels Satzanwahl wieder weiter nach oben, springt der Ablaufzeiger sofort in den Interrupt.


    Ich habe diese Verschachtelung probiert augfrund des Fehlers bei der Resume-Anweisung. Wenn ich nämlich diese Zwischenebene "Suchstrecke" nicht verwende, habe ich, wenn der Interrupt mal auslöst, das Problem mit ungültiger Programmstruktur durch den RESUME-Befehl. (Laut KRC-Programmierunganleitung:

    "Zum Zeitpunkt der RESUME-Anweisung darf der Vorlaufzeiger nicht in der

    Ebene sein, in der der Interrupt deklariert wurde, sondern er muss sich

    mindestens eine Ebene tiefer befinden."


    Somit springe ich nicht direkt in die Deklarationsebene und habe ich nicht das Problem dieses Fehlers.

  • Hallo YK_Ertl,


    Ok dann war ich mal wieder auf dem Holzweg in meiner Beschreibung wo ich habe stehen nur die ersten 3 Einträge nicht die von einfache Logische Verknüpfungen.


    Gruß Philipp

  • Mein Problem ist jedoch, dass ich gar nicht in den Interrupt reinkomme im "normalen Ablauf"..

    Verfahre ich die Bewegung vorher und löse aus, passiert nichts. Springe ich mittels Satzanwahl wieder weiter nach oben, springt der Ablaufzeiger sofort in den Interrupt.

    Ich denke, das ist korrekt so. Wenn Du nicht explizit die laufende Bewegung stoppst, wird die zu Ende gefahren, bevor der Programmzeiger den Erfolg des Einsprungs widerspiegelt. Oder Du die Bewegung eben manuell abbrichst.

    In Deiner ursprünglichen Version ergäbe sich bei unmittelbarer Ausführung ja ohnehin ein Prioritätenproblem, mit dem die Steuerung allein gelassen würde: während die Bewegung zu "XGRP_Pos_TR " noch läuft, soll diese Variable bereits dreimal überschrieben und dreimal gelesen werden (einmal mit $POS_INT, dann zweimal die Berechnung, dann einmal anfahren?!).

    Das liefe auf "während der geplanten Fahrt umentscheiden auf ein anderes Ziel" hinaus. Das will kein Roboter freiwillig.

  • Hallo,


    was mir noch aufgefallen ist ich mache immer an den Anfang des Interrupt Programmes, bei dir Endposition_Stop () ,einen $Advance = 0 rein du machst da ein Wait rein, das Stopp den Vorlauf aber der Vorlaufzeiger steht dann immer noch auf 3 oder was auch immer zu dem Zeitpunkt drin steht. Ich schalte dann nach dem Stopp Programm den Vorlauf wieder auf 3 oder was immer du haben möchtest.


    Gruß

  • was mir noch aufgefallen ist ich mache immer an den Anfang des Interrupt Programmes, bei dir Endposition_Stop () ,einen $Advance = 0 rein

    Interruptprogramm selbst läuft nicht mit Vorlauf ab.

    Es muss im UP der Suchfahrt verhindert werden, dass der Vorlauf nicht schon aus der Verschachtelungsebene rausgelaufen ist. Sonst hast Du Probleme mit dem Resume.

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

  • Ich denke, das ist korrekt so. Wenn Du nicht explizit die laufende Bewegung stoppst, wird die zu Ende gefahren, bevor der Programmzeiger den Erfolg des Einsprungs widerspiegelt. Oder Du die Bewegung eben manuell abbrichst.

    In Deiner ursprünglichen Version ergäbe sich bei unmittelbarer Ausführung ja ohnehin ein Prioritätenproblem, mit dem die Steuerung allein gelassen würde: während die Bewegung zu "XGRP_Pos_TR " noch läuft, soll diese Variable bereits dreimal überschrieben und dreimal gelesen werden (einmal mit $POS_INT, dann zweimal die Berechnung, dann einmal anfahren?!).

    Das liefe auf "während der geplanten Fahrt umentscheiden auf ein anderes Ziel" hinaus. Das will kein Roboter freiwillig.

    Danke für die Info! Die hat mir hierzu gefehlt :) :thumbup: Habe es nochmals mit einem vorhergehenden Bremsbefehl versucht und es hat geglückt! :applaus:

    Vielen Dank für die nützlichen Tipps!

    Gruß Yannick

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