Guten morgen, wir besitzen mehrere KRC 2 Roboter die von einer übergeordnete Steuerung (TIA Portal) gesteuert werden, d.h Programm Start, Stopp, Programm Nr übergabe und Quittieren bekommt der Roboter alles von der SPS mittels Schrittketten ablauf übermittelt
Die Programme funktionieren alle, der Roboter ist auch schön am produzieren
Nun passiert bei einem dass er "öfter" kollision fährt weil ein interrupt nicht auslöst (siehe code) (SPS Programm und Archive von Robi auch im Anhang)
Kollisionsfahrt Problem: Der Robi fährt zu Material Position und fährt dann runter mit eingeschalteten vakuum düsen, nun kann es passieren das ein Filterblatt, von vorherigen fahrt, runter auf das Material gefallen ist, dann kann er das vakuum garnicht erzeugen(interrupt) und fährt als weiter runter bis Getriebemoment auslöst (natürlich arbeiten wir auch daran dass das Filterblatt garnicht runterfällt, bzw nicht im ansaugdüsen landet) aber ein Abbruchprogramm braucht man ja generell
Das Problem lösen wir aktuell so das eine unterwiesene Person hin muss, Schrittkette Rücksetzt, Robi im T1 nach home fährt und cell wieder startet
Bestehe denn die möglich bei KRC 2 eine rückzugfahrt durchzuführen nach einer kollision ohne extra programm zu schreiben?
Wenn der Robi jetzt Kollision gefahren hat, welche signale muss er von der SPS bekommen damit er wieder "bereit" ist seine Programme abzuarbeiten? also welche Reihenfolge, conf mess?
Ich hab jetzt überlegt, wenn er kollision fährt, dass ich alles Schrittketten rücksetze ( auch drive on off und moveenable) und das Programm "neustarte", weil er aber nicht in HOME ist kann er sein CELL doch dann garnicht ausführen oder? der braucht ja eine SAK fahrt und muss mich nach einer Programm Nr fragen
&ACCESS RVP1
&REL 128
&PARAM EDITMASK = *
DEF pick_mat( )
;FOLD INI;%{PE}%V3.2.0,%MKUKATPBASIS,%CINIT,%VCOMMON,%P
;FOLD BAS INI;%{E}%V3.2.0,%MKUKATPBASIS,%CINIT,%VINIT,%P
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
;ENDFOLD (BAS INI)
;FOLD USER INI;%{E}%V3.2.0,%MKUKATPUSER,%CINIT,%VINIT,%P
;Make your modifications here
;ENDFOLD (USER INI)
;ENDFOLD (INI)
If doRobINService == false then
;FOLD Stations INI
xvorpos = xteach
x_1 = offset_x_1 / 100.0
y_1 = offset_y_1 / 100.0
z_1 = offset_z_1 / 100.0
xvorpos.x = xvorpos.x + x_1
xvorpos.y = xvorpos.y + y_1
xvorpos.z = xvorpos.z + z_1
Interrupt decl 1 when diVaccumA == true do findpos ()
;ENDFOLD
;FOLD PTP HOME Vel= 100 % DEFAULT;%{PE}%R 4.1.16,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:100, 7:DEFAULT
$BWDSTART = FALSE
PDAT_ACT=PDEFAULT
BAS(#PTP_DAT)
FDAT_ACT=FHOME
BAS(#FRAMES)
BAS(#VEL_PTP,100)
$H_POS=XHOME
PTP XHOME
;ENDFOLD
;FOLD TeachPosition
IF False then
; ======== Hier Satzanwahl um den Punkt zu Teachen ========
;FOLD PTP teach Vel= 100 % PDAT1 Tool[1]:Sauger Base[2]:Magazin;%{PE}%R 4.1.16,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:teach, 3:, 5:100, 7:PDAT1
$BWDSTART = FALSE
PDAT_ACT=PPDAT1
BAS(#PTP_DAT)
FDAT_ACT=Fteach
BAS(#FRAMES)
BAS(#VEL_PTP,100)
PTP Xteach
;ENDFOLD
halt
Endif
;ENDFOLD
; =====Anfahren zum Material
; Punkt ist berechnet! Zum Teachen oben den Fold TeachPosition benutzen
;FOLD PTP VorPos Vel= 80 % PDAT5 Tool[1]:Sauger Base[2]:Magazin;%{PE}%R 4.1.16,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:VorPos, 3:, 5:80, 7:PDAT5
$BWDSTART = FALSE
PDAT_ACT=PPDAT5
BAS(#PTP_DAT)
FDAT_ACT=FVorPos
BAS(#FRAMES)
BAS(#VEL_PTP,80)
PTP XVorPos
;ENDFOLD
;=============================
;====Handschake Daten Einlesen =======
doRobVorPosMat = True
wait for diFreigabeZ_Wert
If diMatOK then
posrechnen ()
;=====================================
; =====Material Suchen================
interrupt on 1
suchen ()
$advance=3
interrupt off 1
wait sec 1
;=====================================
;======Material Hoch fahren===========
; Punkt ist berechnet! Zum Teachen oben den Fold TeachPosition benutzen
;FOLD LIN VorPos Vel= 0.5 m/s CPDAT5 Tool[1]:Sauger Base[2]:Magazin;%{PE}%R 4.1.16,%MKUKATPBASIS,%CMOVE,%VLIN,%P 1:LIN, 2:VorPos, 3:, 5:0.5, 7:CPDAT5
$BWDSTART = FALSE
LDAT_ACT=LCPDAT5
BAS(#CP_DAT)
FDAT_ACT=FVorPos
BAS(#FRAMES)
BAS(#VEL_CP,0.5)
LIN XVorPos
;ENDFOLD
;=====================================
Endif
doRobVorPosMat = false
;FOLD PTP HOME Vel= 30 % DEFAULT;%{PE}%R 4.1.16,%MKUKATPBASIS,%CMOVE,%VPTP,%P 1:PTP, 2:HOME, 3:, 5:30, 7:DEFAULT
$BWDSTART = FALSE
PDAT_ACT=PDEFAULT
BAS(#PTP_DAT)
FDAT_ACT=FHOME
BAS(#FRAMES)
BAS(#VEL_PTP,30)
$H_POS=XHOME
PTP XHOME
;ENDFOLD
Endif
END
def Suchen ()
$advance = 0
doVaccumAON = true
; Punkt ist berechnet!
;FOLD LIN SuchPLC Vel= 0.5 m/s CPDAT6 Tool[1]:Sauger Base[2]:Magazin;%{PE}%R 4.1.16,%MKUKATPBASIS,%CMOVE,%VLIN,%P 1:LIN, 2:SuchPLC, 3:, 5:0.5, 7:CPDAT6
$BWDSTART = FALSE
LDAT_ACT=LCPDAT6
BAS(#CP_DAT)
FDAT_ACT=FSuchPLC
BAS(#FRAMES)
BAS(#VEL_CP,0.5)
LIN XSuchPLC
;ENDFOLD
; Punkt ist berechnet!
;FOLD LIN MaxSuch Vel= 0.02 m/s CPDAT7 Tool[1]:Sauger Base[2]:Magazin;%{PE}%R 4.1.16,%MKUKATPBASIS,%CMOVE,%VLIN,%P 1:LIN, 2:MaxSuch, 3:, 5:0.02, 7:CPDAT7
$BWDSTART = FALSE
LDAT_ACT=LCPDAT7
BAS(#CP_DAT)
FDAT_ACT=FMaxSuch
BAS(#FRAMES)
BAS(#VEL_CP,0.02)
LIN XMaxSuch
;ENDFOLD
end
def findpos ()
interrupt off 1
brake
wait sec 0.5
resume
end
def posrechnen ()
xSuchPLC = xvorpos
Z_Wert_Sensor = sensor_z - 100
xSuchPLC.z = xSuchPLC.z - Z_Wert_Sensor
;xSuchPLC.x = xSuchPLC.x - 20
;xSuchPLC.y = xSuchPLC.y - 20
xMaxSuch = xSuchPLC
xMaxSuch.z = xMaxSuch.z - 120
wait sec 1
end
Alles anzeigen