Hallo liebe Experten,
ich habe das Forum bereits durchsucht und noch keine Antwort auf meine Frage gefunden.
Das Problem:
Ich habe ein Roboterportal mit 3 Bearbeitungsmaschinen und 2 hängend auf zusatzachse montierten Robotern. Diese bestücken die Maschinen in 2 Spannungen. Es gibt hier also jede Menge Unterprogramme.
Ich muss jetzt dafür sorgen das nicht nur ein Typ sondern 2 Typen über die Linie gefahren werden sollen. Die Greifer müssen hierfür umgebaut werden und die Greifposition ist anders.
Ich hänge gerade bei der Frage fest wie ich die Umschaltung zwischen den Typen realisiere.
Das Programm (cell):
&ACCESS RVP
&REL 79
&COMMENT HANDLER on external automatic
DEF cell( )
BOOL Roboter_ausrichten
;FOLD INIT
; EXT up2_rt_an_ma_vorr1 (INT:IN)
; EXT up3_ft1_an_ma_zwst (INT:IN)
; EXT up4_ft1_an_ma_vorr2 (INT:IN)
; EXT up5_ft2_an_io_nio_band (INT:IN,INT:IN)
; EXT up6_ft1_an_nio_band (INT:IN)
; EXT up7_rt_wdh_an_ma_vorr1 (INT:IN)
; EXT up8_ft1_wdh_an_ma_vorr2 (INT:IN)
DECL CHAR DMY[3]
DMY[]="---"
;ENDFOLD (INIT)
;FOLD BASISTECH INI
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
;ENDFOLD (BASISTECH INI)
;PTP HOME ist auskommentiert
;FOLD CHECK HOME
;$H_POS=XHOME
;IF CHECK_HOME==TRUE THEN
; P00 (#CHK_HOME,#PGNO_GET,DMY[],0 ) ;Testing Home-Position
;ENDIF
;ENDFOLD (CHECK HOME)
;FOLD PTP HOME Vel= 100 % DEFAULT;%{PE}%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:100, 7:DEFAULT
;$H_POS=XHOME
;PDAT_ACT=PDEFAULT
;BAS (#PTP_DAT )
;FDAT_ACT=FHOME
;BAS (#FRAMES )
;BAS (#VEL_PTP,100 )
;PTP XHOME
;ENDFOLD
;FOLD AUTOEXT INI
P00 (#INIT_EXT,#PGNO_GET,DMY[],0 ) ; Initialize extern mode
;ENDFOLD (AUTOEXT INI)
;Unterprogramm beendet und andere Signale sicherheitshalber
;loeschen
FOR Schleife=59 TO 64 STEP 1
$OUT[Schleife]=FALSE
ENDFOR
FOR Schleife=81 TO 94 STEP 1
$OUT[Schleife]=FALSE
ENDFOR
FOR Schleife=98 TO 112 STEP 1
$OUT[Schleife]=FALSE
ENDFOR
FOR Schleife=121 TO 137 STEP 1
$OUT[Schleife]=FALSE
ENDFOR
FOR Schleife=140 TO 149 STEP 1
$OUT[Schleife]=FALSE
ENDFOR
FOR Schleife=153 TO 160 STEP 1
$OUT[Schleife]=FALSE
ENDFOR
;Satzvorlauf (Max=5)
$ADVANCE=3
LOOP
P00 (#EXT_PGNO,#PGNO_GET,DMY[],0 )
SWITCH PGNO ; Select with Programnumber
CASE 1
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
;Unterprogramm Aufruf fahre zur Grundstellung
;ACHTUNG!! Roboter_ausrichten=TRUE bedeutet:GRST-Fahrt wird zugelassen!!
Roboter_ausrichten=FALSE
up1_grundstellung (Roboter_ausrichten)
CASE 2
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
up2_rt_an_ma_vorr1 (IN_Akt_Maschinen_Nummer); up2_Rohteil an Maschine 1-3 Vorrichtung 1
CASE 3
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
up3_ft1_an_ma_zwst (IN_Akt_Maschinen_Nummer); up3_Fertigteil 1 an Maschine 1-3 Zwischenstation
CASE 4
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
up4_ft1_an_ma_vorr2 (IN_Akt_Maschinen_Nummer); up4_Fertigteil 1 an Maschine 1-3 Vorrichtung 2
CASE 5
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
up5_ft2_an_io_nio_band (IN_Akt_Maschinen_Nummer,IN_Akt_Teilekennung); up5_Fertigteil 2 an (i.O./ n.i.O.) Band
CASE 6
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
up6_ft1_an_nio_band (IN_Akt_Maschinen_Nummer); up6_Fertigteil 1 an n.i.O. Band
CASE 7
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
up7_rt_wdh_an_ma_vorr1 (IN_Akt_Maschinen_Nummer)
CASE 8
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
up8_ft1_wdh_an_ma_vorr2 (IN_Akt_Maschinen_Nummer)
DEFAULT
P00 (#EXT_PGNO,#PGNO_FAULT,DMY[],0 )
OUT_UP_niO_beendet=TRUE
;Unbekannter Auftrag, daher erfolgt Fehlerausgabe
WAIT FOR $IN[1026]
;Eingang ist systemseitig FALSE -> Roboter bleibt bei falschem Zustand der Variablen hier stehen!
ENDSWITCH
ENDLOOP
END
Ich würde das jetzt so lösen, das ich in die Loop Funktion eine IF Anwesiung integriere und über einen Eingang von der SPS den Typ wähle. Also z.B. LOOP IF $IN[99] THEN Typ1, SWITCH, CASE 1 ...n, ENDSWITCH ELSE Typ2, SWITCH, CASE 1 ...n, ENDSWITCH ENDIF. Die Unterprogrammstruktur würde ich dann duplizieren und umbenennen.
Meine Frage an euch: Ist das programmtechnisch möglich und sauber oder sollte man das anders lösen.
MfG lesard