Taktzeiten optimieren bei Asynchronen Achsen

  • Guten Morgen,


    auf Arbeit gibt es mal wieder Stress, weil die Taktzeiten nicht stimmen, uns fehlen blöde 4 sec. :denk:


    Wir haben flächenportale, die Beinhaltet 5 Achsen.
    1 X Achse (A1), daran sind zwei verschiedene Systeme


    ein Flascheneinpacker Y Achse (A2) - Z Achse (A3)


    zweite System Palettierer


    Y Achse (E1 Asynchron)
    z Achse (E2 Asynchron)


    Die Achsen a1 - a3 werden im Hauptprogramm abgefahren.


    Die Externen Achsen werden durch die SPS.SUB gesteuert, in dem ein weiteres SUB Programm aufgerufen wird...
    z.B. Bahn1_asy.sub. In diesem Proggramm werden dann die Externen Achsen angesteuert zum Palettieren..


    Das Problem Nach jeder Bewegung bleiben die externen Achsen stehen, weil jede Position durch same pos abgefragt werden, um sicher zu gehen das die Externen achsen auch wirklich bis zu Position fahren.


    Gibt es Möglichkeiten ihn über positionen schleifen zu lassen, oder das die Achsen flüssiger laufen.., bin gerne bereit das sub Programm zukommen zu lassen.


    Vielen Dank

  • Schritt für Schritt zum Roboterprofi!
  • &ACCESS RVO
    &COMMENT Leergutsortierung Bahn 2 Asynchron
    DEF steinibahn_2asy( )


    $ov_async = $ov_pro
    ;FOLD -- Geschwindigkeit von Rob 2 --
    $vel_extax[1] = 100
    $vel_extax[2] = 100
    $acc_extax[1] = 100
    $acc_extax[2] = 100
    $async_flt = $filter
    ;---------------------------------------------------------------------
    ;ENDFOLD


    IF $T1 THEN
    ASYCANCEL 0
    ELSE


    SWITCH SCHRITT2


    ;---------------------------------------------------------------------
    CASE 0 ;*** ROB 2 - SCHRITT 0: Home 12 ***


    GR2AUF=1 ; Variablen fuer Greifer zurücksetzten
    GR2ZU=1 ; Variablen fuer Greifer zurücksetzten
    KGR2ZU=1 ; Variablen fuer Greifer zurücksetzten
    KGR2AUF=1 ; Variablen fuer Greifer zurücksetzten


    korr_pal ( ) ;Stapelhoehe einlesen


    IF ((START_B2) AND (SI_GR2_AUF==TRUE) AND (SAME_POS(HOME12,1) AND SAME_POS(HOME12,2))) THEN
    SCHRITT2=1
    VHOME=TRUE
    FREIGABE2_TUER=TRUE
    ELSE
    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_AUF) AND (NOT $T1) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    ; IF ($AXIS_ACT.A1<-3105) AND ($AXIS_ACT.A1>-3107) THEN
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    ASYPTP HOME12 ; Bewegung zur HOME12
    ENDIF
    ELSE
    IF (SAME_POS(HOME12,1) AND SAME_POS(HOME12,2)) THEN
    FREIGABE2_TUER=TRUE
    IF (X_ACHSE_B2) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) AND (SI_GR2_AUF) THEN
    IF (HALT_TUER==FALSE) THEN
    SCHRITT2=1
    VHOME=TRUE
    ELSE
    IF ((HALT_TUER==TRUE)) THEN
    SCHRITT2=0
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_AUF==FALSE) THEN
    MELDUNGEN (10,0,0)
    ENDIF
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN ;alle gespeicherten asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 1 ; *** ROB 2 - SCHRITT 1: Home nach POS23 Kästen ***


    ;LEERFAHREN
    IF (LEERFAHREN_ENDE_B2==TRUE) THEN
    SCHRITT2=10
    ENDIF


    IF (SAME_POS(POS23,1) AND SAME_POS(POS23,2)) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    SCHRITT2=2
    VHOME=FALSE
    FREIGABE2_TUER=TRUE
    ELSE
    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_AUF) AND (KLEMMUNG_AUF) AND (NOT $T1) AND (SI_FRG_KAESTEN_ROB2_B2) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    ASYPTP POS23 ; Bewegung zu Greifposition Kästen
    ENDIF
    ELSE
    IF (SAME_POS(POS23,1) AND SAME_POS(POS23,2)) THEN
    FREIGABE2_TUER=TRUE
    IF (HALT_TUER==FALSE) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    SCHRITT2=2
    ELSE
    IF (HALT_TUER==TRUE) THEN
    SCHRITT2=1
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_AUF==FALSE) THEN
    MELDUNGEN (10,0,0)
    ENDIF
    IF (KLEMMUNG_AUF==FALSE) THEN
    MELDUNGEN (44,0,0)
    ENDIF
    ENDIF
    ELSE
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN;alle gespeicherte asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 2 ; *** ROB 2 - SCHRITT 2: Greifer 2 schliessen ***
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN


    VHOME=FALSE
    SWITCH GR2ZU

    CASE 1
    SO_GR2_AUF=FALSE
    SO_GR2_ZU=TRUE
    GR2ZU=2

    CASE 2
    IF ((SI_GR2_ZU==FALSE) AND (SI_GR2_AUF==TRUE)) THEN
    SCHRITT2=2
    ELSE
    IF ((SI_GR2_ZU==TRUE) AND (SI_GR2_AUF==FALSE)) THEN
    SCHRITT2=3
    korr_pal ( ) ;Stapelhoehe einlesen
    GR2ZU=1
    IF (LAGE_2==4) THEN


    BNurKasten=SI_FRG_NKAESTEN_ROB2_B2
    iBahn=2


    SO_LETZTE_LAGE_B2=TRUE
    ENDIF
    ENDIF
    ENDIF

    ENDSWITCH ; GR2ZU
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 3 ;*** ROB 2 - SCHRITT 3: POS23 Kästen nach POS23o über Kästen ***
    IF (SAME_POS(POS23Ok,1) AND SAME_POS(POS23Ok,2)) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    SO_FRG_EINL_BELADER_B2=TRUE
    SCHRITT2=4
    VHOME=FALSE
    FREIGABE2_TUER=TRUE
    ELSE
    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_ZU) AND (KLEMMUNG_AUF) AND (NOT $T1) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    ASYPTP POS23Ok ; Bewegung über Kästen
    ENDIF
    ELSE
    IF (SAME_POS(POS23Ok,1) AND SAME_POS(POS23Ok,2)) THEN
    SO_FRG_EINL_BELADER_B2=TRUE
    FREIGABE2_TUER=TRUE
    IF (HALT_TUER==FALSE) AND ((SI_PAL_INPOS_B2==TRUE) OR (SI_Platz_frei_B2==TRUE)) THEN
    ; IF (HALT_TUER==FALSE) AND (SI_PAL_INPOS_B2==TRUE) THEN
    SCHRITT2=4
    ELSE
    IF (HALT_TUER==TRUE) THEN
    SCHRITT2=3
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_ZU==FALSE) THEN
    MELDUNGEN (43,0,0)
    ENDIF
    IF (KLEMMUNG_AUF==FALSE) THEN
    MELDUNGEN (44,0,0)
    ENDIF
    ENDIF
    ELSE
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN;alle gespeicherte asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 4 ;*** ROB 2 - SCHRITT 5: POS23o über Kästen nach POS24o über Palette ***
    IF (SAME_POS(POS24Ok,1) AND SAME_POS(POS24Ok,2)) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    SCHRITT2=5
    VHOME=FALSE
    korr_pal ( ) ;Stapelhoehe einlesen
    FREIGABE2_TUER=TRUE
    ELSE
    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_ZU) AND (NOT $T1) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) AND ((SI_PAL_INPOS_B2==TRUE) OR (SI_Platz_frei_B2==TRUE)) THEN
    ; IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) AND (SI_PAL_INPOS_B2==TRUE) THEN
    ASYPTP POS24Ok ; Bewegung über Palette
    ENDIF
    ELSE
    IF (SAME_POS(POS24Ok,1) AND SAME_POS(POS24Ok,2)) THEN
    FREIGABE2_TUER=TRUE
    IF (HALT_TUER==FALSE) AND (SI_PAL_INPOS_B2==TRUE) THEN
    ; IF (HALT_TUER==FALSE) THEN
    SCHRITT2=5
    korr_pal ( )
    ELSE
    IF (HALT_TUER==TRUE) THEN
    SCHRITT2=4
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_ZU==FALSE) THEN
    MELDUNGEN (43,0,0)
    ENDIF
    ENDIF
    ELSE
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN;alle gespeicherte asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 5 ;*** ROB 2 - SCHRITT 6: POS24o über Palette nach POS24k Palette ***
    IF (SAME_POS(POS24k,1) AND SAME_POS(POS24k,2)) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    SCHRITT2=6 ;7 ohne Klemmung
    VHOME=FALSE
    ELSE
    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_ZU) AND (KLEMMUNG_AUF) AND (NOT $T1) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) AND (SI_PAL_INPOS_B2==TRUE) THEN
    ASYPTP POS24k ; Bewegung zu Kästen-Ablageposition
    ENDIF
    ELSE
    IF (SAME_POS(POS24k,1) AND SAME_POS(POS24k,2)) THEN
    SCHRITT2=6 ;7 ohne Klemmung
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_ZU==FALSE) THEN
    MELDUNGEN (43,0,0)
    ENDIF
    IF (KLEMMUNG_AUF==FALSE) THEN
    MELDUNGEN (44,0,0)
    ENDIF
    ENDIF
    ELSE
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN;alle gespeicherte asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 6 ; *** ROB 2 - SCHRITT 4: Klemmung Greifer 2 schliessen ***
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    VHOME=FALSE
    SO_FRG_EINL_BELADER_B2=TRUE


    SWITCH KGR2ZU

    CASE 1 ; Klemmung Greifer 2 schliessen, wenn LAGE_2>0
    IF (LAGE_2==0) THEN
    SCHRITT2=7
    KGR2ZU=1
    ELSE
    IF (LAGE_2>0) THEN
    SO_KGR2L_AUF=FALSE
    SO_KGR2L_ZU=TRUE
    SO_KGR2R_AUF=FALSE
    SO_KGR2R_ZU=TRUE
    KGR2ZU=2
    ENDIF
    ENDIF

    CASE 2 ;Kontrolle Klemmung Greifer 2 geschlossen
    IF (KLEMMUNG_AUF) THEN
    SCHRITT2=6
    ELSE
    IF (KLEMMUNG_ZU) THEN
    SCHRITT2=7
    KGR2ZU=1
    ENDIF
    ENDIF


    ENDSWITCH ; KGR2ZU
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 7 ; *** ROB 2 - SCHRITT 7: Greifer 2 öffnen ***
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    VHOME=FALSE
    FREIGABE2_TUER=TRUE


    SWITCH GR2AUF

    CASE 1
    SO_GR2_ZU=FALSE
    SO_GR2_AUF=TRUE
    GR2AUF=2

    CASE 2
    IF ((SI_GR2_ZU==TRUE) AND (SI_GR2_AUF==FALSE)) THEN
    SCHRITT2=7
    ELSE
    IF ((SI_GR2_ZU==FALSE) AND (SI_GR2_AUF==TRUE)) THEN
    SCHRITT2=8
    GR2AUF=1
    IF LAGE_2<5 THEN
    LAGE_2=LAGE_2+1
    ENDIF
    ENDIF
    ENDIF
    ENDSWITCH ; GR2AUF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 8 ; *** ROB 2 - SCHRITT 8: Klemmung Greifer 2 oeffnen ***
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    VHOME=FALSE

    SWITCH KGR2AUF

    CASE 1
    SO_KGR2L_ZU=FALSE
    SO_KGR2L_AUF=TRUE
    SO_KGR2R_ZU=FALSE
    SO_KGR2R_AUF=TRUE
    KGR2AUF=2

    KGR2AUF=1
    IF (LAGE_2==3) OR (LAGE_2==4) THEN
    POS23ok.e2=POS23ok.e2-100
    SCHRITT2=12
    ENDIF
    IF (LAGE_2==0) OR (LAGE_2==5) THEN
    SCHRITT2=10
    ENDIF
    IF (LAGE_2==1) OR (LAGE_2==2) THEN
    SCHRITT2=9
    ENDIF
    KGR2AUF=1


    CASE 2
    IF (KLEMMUNG_ZU) THEN
    SCHRITT2=8
    ELSE
    IF (KLEMMUNG_AUF) THEN


    IF (LAGE_2==3) OR (LAGE_2==4) THEN
    SCHRITT2=12
    ENDIF
    IF (LAGE_2==0) OR (LAGE_2==5) THEN
    SCHRITT2=10
    ENDIF
    IF (LAGE_2==1) OR (LAGE_2==2) THEN
    SCHRITT2=9
    ENDIF


    KGR2AUF=1
    ENDIF
    ENDIF

    ENDSWITCH ; KGR2AUF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 9 ;*** ROB 2 - SCHRITT 9: POS24 Palette nach POS24o über Palette ***
    IF (SAME_POS(POS24Ok,1) AND SAME_POS(POS24Ok,2)) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    VHOME=FALSE
    IF (LAGE_2>0) AND (LAGE_2<5) THEN
    SCHRITT2=12 ;Pos23Ok
    ELSE
    SCHRITT2=10 ;Home
    ENDIF
    FREIGABE2_TUER=TRUE
    ELSE
    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_AUF) AND (NOT $T1) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    ASYPTP POS24Ok ; Bewegung über Palette
    ENDIF
    ELSE
    IF (SAME_POS(POS24Ok,1) AND SAME_POS(POS24Ok,2)) THEN
    FREIGABE2_TUER=TRUE
    IF (HALT_TUER==FALSE) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    IF (LAGE_2>0) AND (LAGE_2<5) THEN
    SCHRITT2=12 ;Pos24Ok
    ELSE
    SCHRITT2=10 ;Home
    ENDIF
    ELSE
    IF (HALT_TUER==TRUE) THEN
    SCHRITT2=9
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_AUF==FALSE) THEN
    MELDUNGEN (10,0,0)
    ENDIF
    ENDIF
    ELSE
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN;alle gespeicherte asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 12 ;*** ROB 2 - SCHRITT 12: POS24Ok über Palette nach POS23Ok über Kästen ***
    IF (SAME_POS(POS23Ok,1) AND SAME_POS(POS23Ok,2)) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    VHOME=FALSE
    IF (LAGE_2>0) AND (LAGE_2<5) AND (LEERFAHREN_ENDE_B2==FALSE) THEN
    SCHRITT2=13 ;Pos 23
    ELSE
    SCHRITT2=10 ;Home
    ENDIF
    FREIGABE2_TUER=TRUE
    ELSE
    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_AUF) AND (NOT $T1) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    ASYPTP POS23Ok ; Bewegung über Kästen
    ENDIF


    ELSE
    IF (SAME_POS(POS23Ok,1) AND SAME_POS(POS23Ok,2)) THEN
    FREIGABE2_TUER=TRUE
    IF (HALT_TUER==FALSE) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    IF (LAGE_2>0) AND (LAGE_2<5) AND (LEERFAHREN_ENDE_B2==FALSE) THEN
    SCHRITT2=13 ;Pos23
    ELSE
    SCHRITT2=10 ;Home
    ENDIF
    ELSE
    IF (HALT_TUER==TRUE) THEN
    SCHRITT2=12
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_AUF==FALSE) THEN
    MELDUNGEN (10,0,0)
    ENDIF
    ENDIF
    ELSE
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN;alle gespeicherte asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 13 ;*** ROB 2 - SCHRITT 13: POS23Ok nach POS23 kurz über Kästen ***


    ;LEERFAHREN
    IF (LEERFAHREN_ENDE_B2==TRUE) THEN
    SCHRITT2=10
    ENDIF


    IF (SAME_POS(POS23,1) AND SAME_POS(POS23,2)) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    SCHRITT2=2
    VHOME=FALSE
    FREIGABE2_TUER=TRUE
    ELSE


    ;IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) and (Klemmung_auf) THEN
    ;ASYPTP POS23 ; Bewegung kurz über Kästen
    ;ENDIF


    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_AUF) AND (KLEMMUNG_AUF) AND (NOT $T1) AND (SI_FRG_KAESTEN_ROB2_B2==true) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    ASYPTP POS23 ; Bewegung kurz über Kästen
    ENDIF
    ELSE
    IF (SAME_POS(POS23,1) AND SAME_POS(POS23,2)) THEN
    FREIGABE2_TUER=TRUE
    IF (HALT_TUER==FALSE) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) and (si_frg_kaesten_rob2_b2==true) THEN
    SCHRITT2=2
    ELSE
    IF (HALT_TUER==TRUE) THEN
    SCHRITT2=13
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_AUF==FALSE) THEN
    MELDUNGEN (10,0,0)
    ENDIF
    IF (KLEMMUNG_AUF==FALSE) THEN
    MELDUNGEN (44,0,0)
    ENDIF
    ENDIF
    ELSE
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN;alle gespeicherte asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 10 ;*** ROB 2 - SCHRITT 10: POS24o über Palette nach Home ***


    korr_pal ( ) ;Stapelhoehe einlesen


    IF (SAME_POS(HOME12,1) AND SAME_POS(HOME12,2)) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN


    ;LEERFAHREN
    IF (LEERFAHREN_ENDE_B2==TRUE) THEN
    BLeerfahren=TRUE
    SO_LETZTE_LAGE_B2=TRUE
    LAGE_2=5
    LEERFAHREN_ENDE_B2=FALSE
    SPEICHERN_KI_B2=FALSE
    SPEICHERN_FL_B2=FALSE
    ENDIF


    SCHRITT2=11
    VHOME=TRUE
    FREIGABE2_TUER=TRUE
    ELSE
    IF $PRO_STATE1==#P_ACTIVE THEN
    IF (X_ACHSE_B2) AND (SI_GR2_AUF) AND (NOT $T1) THEN
    IF $ASYNC_STATE<>#BUSY THEN ; keine Doppelbeauftragung
    VHOME=FALSE
    FREIGABE2_TUER=FALSE
    IF ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    ASYPTP HOME12 ; Bewegung zu Home12
    ENDIF
    ELSE
    IF (SAME_POS(HOME12,1) AND SAME_POS(HOME12,2)) THEN
    FREIGABE2_TUER=TRUE

    ;LEERFAHREN
    IF (LEERFAHREN_ENDE_B2==TRUE) THEN
    BLeerfahren=TRUE
    SO_LETZTE_LAGE_B2=TRUE
    LAGE_2=5
    LEERFAHREN_ENDE_B2=FALSE
    SPEICHERN_KI_B2=FALSE
    SPEICHERN_FL_B2=FALSE
    ENDIF

    IF (HALT_TUER==FALSE) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) THEN
    SCHRITT2=11
    VHOME=TRUE
    ELSE
    IF (HALT_TUER==TRUE) THEN
    SCHRITT2=10
    ENDIF
    ENDIF
    ENDIF
    ENDIF
    ELSE
    IF (SI_GR2_AUF==FALSE) THEN
    MELDUNGEN (10,0,0)
    ENDIF
    ENDIF
    ELSE
    IF ($ASYNC_STATE==#PEND) OR ($ASYNC_STATE==#BUSY) THEN;alle gespeicherte asyptp loeschen
    ASYCANCEL 0
    ENDIF
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------


    ;---------------------------------------------------------------------
    CASE 11 ;*** Entscheidung weiter auf Bahn 2 oder Bahnwechsel ??? ***
    IF ((START_B2) AND (NOT START_B1)) AND (X_ACHSE_B2) AND ($AXIS_ACT.A1<($AXIS_HOME[2].A1+3)) AND ($AXIS_ACT.A1>($AXIS_HOME[2].A1-3)) AND (SI_GR2_AUF) THEN


    IF (NOT Pal_fertig_B2) THEN
    SCHRITT2=1
    ELSE
    IF (SCHRITT1==6) AND ($IN_HOME2) AND (NOT SI_FRG_GENUG_FLASCHEN_B2) THEN
    START_B2=FALSE
    ENDIF
    SCHRITT2=14
    ; BLeerfahren=FALSE
    ENDIF
    ENDIF
    ;---------------------------------------------------------------------



    ENDSWITCH ; SCHRITT2
    ENDIF


    END


    DEFFCT BOOL SAME_POS (P_POS :IN,ACHSE :IN)


    E6POS P_POS
    INT ACHSE
    REAL VALUE1
    REAL VALUE2


    SWITCH ACHSE


    CASE 1
    VALUE1=P_POS.E1
    VALUE2=$AXIS_ACT.E1


    IF (ABS(VALUE1-VALUE2)<1) THEN
    RETURN (TRUE)
    ELSE
    RETURN (FALSE)
    ENDIF


    CASE 2
    VALUE1=P_POS.E2
    VALUE2=$AXIS_ACT.E2


    IF (ABS(VALUE1-VALUE2)<1) THEN
    RETURN (TRUE)
    ELSE
    RETURN (FALSE)
    ENDIF


    ENDSWITCH


    ENDFCT

  • Ich geb zu, ich hab das Programm nicht komplett durchgelesen aber was mir schon in den ersten Zeilen aufgefallen ist: Da sind gaaanz viele IF's und sonstige Abfragen und der KUKA möchte gerne bei jeder stehen bleiben, ausser man programmiert ein CONTINUE davor.
    Das gleich in dem Same_Pos, wobei natürlich eine Positionsabfrage ohne stehen bleiben auch nicht wirklich Sinn macht.


    Wie auch immer, versuchs mal mit dem Einfügen von ein paar Continue speziell vor Abfragen, die was mit Achsen zu tun haben.


    Gruß
    Stromer

  • Wieso sollte der KUKA bei einer IF-Abfrage stehen bleiben?


    Der Vorlauf wird meines Wissens nur bei WAIT, und setzen von Ausgängen angehalten.
    Ausserdem steuert der Kollege doch seine Achsen aus dem Submitinterpreter heraus.

  • Zitat von [wEm

    link=topic=7038.msg32817#msg32817 date=1267026221]
    Wieso sollte der KUKA bei einer IF-Abfrage stehen bleiben?


    Der Vorlauf wird meines Wissens nur bei WAIT, und setzen von Ausgängen angehalten.
    Ausserdem steuert der Kollege doch seine Achsen aus dem Submitinterpreter heraus.


    So nicht ganz richtig.


    Anweisungen und Daten, die die Peripherie beeinflussen (z.B. Ein--/Ausgabeanweisungen),
    oder sich auf den aktuellen Roboterzustand beziehen, lösen einen
    Vorlaufstopp aus (s. Tab. 6). Dies ist notwendig, um die korrekte, zeitliche Reihenfolge
    der Anweisungen und der Roboterbewegungen sicherzustellen.


    Anweisungen
    ANOUT ON ANOUT OFF
    ANIN ON ANIN OFF
    DIGIN ON DIGIN OFF
    PULSE
    HALT WAIT
    CREAD CWRITE COPEN CCLOSE
    SREAD SWRITE
    CP-PTP--Kombination ohne Überschleifen


    Anweisungen in Verbindungmit einem Interrupt
    - INTERRUPT DECL (falls der Interrupt bereits deklariert wurde)
    RESUME ohne BRAKE
    END (falls im Modul ein nicht globaler Interrupt definiert wurde)


    gebräuchliche Systemvaria
    $ANOUT[Nr] $ANIN[Nr]
    Systemvariablen
    $DIGIN1 $DIGIN2 $DIGIN6
    $OUT[Nr] $IN[Nr]
    $AXIS_ACT $AXIS_BACK $AXIS_FOR $AXIS_RET
    $POS_ACT $POS_BACK $POS_FOR $POS_RET


    gebräuchliche Systemvaria
    $AXIS_INC $AXIS_INT $POS_ACT_MES $POS_INT


    Systemvariablen
    $TORQUE_AXIS $ASYNC_AXIS
    $TECH[X].MODE, $TECH[X].CLASS bei gewissen Operationen
    $LOAD, $LOAD_A1, $LOAD_A2, $LOAD_A3 (falls es sich um
    einen absolutgenauen Roboter mit Lastwechsel handelt)


    weitere Systemvariablen
    $ALARM_STOP
    $EM_STOP
    $ACT_TOOL
    $OV_PRO
    $ASYNC_EX_AX_DECOUPLE
    $AXIS_ACTMOD
    $EXTSTARTTYP
    $PAL_MODE
    $WORKSPACE
    $INHOME_POS
    $REVO_NUM
    $ACT_BASE
    $IBUS_OFF
    $ON_PATH
    $SAFETY_SW
    $ACT_EX_AX
    $IBUS_ON


    importierte Variablen alle, bei Zugriff


    Sonstiges
    Findet zwischen überschliffenen Sätzen ein Filterwechsel statt, wird
    ein Vorlaufstopp ausgelöst.

    Einmal editiert, zuletzt von Stethi ()

  • Was soll die Diskussion mit Vorlaufstop in einem Posting von nem Submit-Programm.
    Wollte heute nachmittag schon auf die Unmöglichkeit eines ContinueBefehls im .Sub hinweisen, wurde aber aus dem Forum gerissen.
    Stethi, Du bist echt ein Profi, aber hier passt die Belehrung net wirklich hin.


    Gruß
    Robotnik

  • wEm


    Stehti hat recht, ohne Einschränkung!


    Du hast aber recht mit dem Submit...


    hier ist der Code optimiert - aber nur weil ich mich dann besser reindenken kann.


    Fuer ne Schrittkette gelungen... kleine dreher haben wir alle.
    Sowas hab ich im Submit noch nie umgesetzt. Deshalb meines erachtens ein Sehr Interesannter Code von Gladi.


    Als Anhang der Code von mir umgeschrieben - hätte nicht sein müssen - ist sehr schlüssig!

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