Hallo zusammen,
ich stehe im Moment an. Und zwar habe ich eine KUKA Schweissapplikation mit ArcTechBasic. Bei Zünd- oder Schweissfehler soll der Bediener zuerst schauen ob der Draht freigebrannt ist und falls ja, einen Taster drücken, damit der Roboter mit dem Schweissbrenner in eine Serviceposition fährt. Sobald der Brenner gereinigt wurde, soll wieder der Taster gedrückt werden und der Roboter fährt im Programm fort.
Ich habe das ganze mit einem Interrupt gelöst. Es funktioniert auch 95% der Zeit. Nur manchmal fährt der Roboter mit Schweissgeschwindigkeit (1mm/s) in die Serviceposition ... obwohl ich im Interruptprogramm eigentlich 0.3 m/s programiert habe. Was mache ich falsch?
Interrupt Deklaration:
;Roboter in Serviceposition bei Schweissfehler fahren
$CYCFLAG[iCF_MIG_ServicePos] = diMIG_ServicePos AND $PRO_ACT AND $ROB_STOPPED AND $WORKSTATE1
GLOBAL INTERRUPT DECL iIntr_MIG_ServicePos WHEN $CYCFLAG[iCF_MIG_ServicePos]==TRUE DO irMIG_ServicePos ()
INTERRUPT OFF iIntr_MIG_ServicePos ;nur waehrend dem Schweissen aktivieren
Interrupt Routine:
GLOBAL DEF irMIG_ServicePos ()
DECL E6POS pTemp, pRet
DECL FRAME fTemp
DECL REAL rVel
INTERRUPT OFF iIntr_MIG_ServicePos
IF ($PRO_ACT AND $ROB_STOPPED AND $WORKSTATE1) THEN
BRAKE
WAIT FOR $ROB_STOPPED
;in Servieposition fahren
rVel = $VEL.CP
$VEL.CP = 0.3 ;m/s
pRet = $POS_ACT
pTemp = pRet
SWITCH $ACT_BASE
CASE 0, 1
IF pTemp.Z<0.0 THEN
pTemp.Z = 0.0
LIN pTemp
ENDIF
IF pTemp.Z<250.0 THEN
pTemp.Z = 250.0
ENDIF
IF pTemp.X<2340.0 THEN
pTemp.X = 2340.0
ENDIF
LIN pTemp
;in finale Serviceposition fahren
$AXIS_HOME[2] = XHOME2
PTP XHOME2
CASE 2, 3, 4
IF pTemp.Z<100.0 THEN
pTemp.Z = 100.0
LIN pTemp
ENDIF
IF pTemp.Z<350.0 THEN
pTemp.Z = 350.0
ENDIF
IF pTemp.X>1200.0 THEN
pTemp.X = 1200.0
ENDIF
LIN pTemp
;in finale Serviceposition fahren
$AXIS_HOME[2] = XHOME2
PTP XHOME2
DEFAULT
INTERRUPT ON iIntr_MIG_ServicePos
$VEL.CP = rVel
RETURN
ENDSWITCH
;Fehler beheben
WAIT FOR ((NOT diMIG_ServicePos) OR $CYCFLAG[iCF_PLC_Cancel]) ;Warte darauf dass Taster geloest ist
REPEAT ;warte auf erneutes Druecken des Tasters
WAIT FOR (diMIG_ServicePos OR $CYCFLAG[iCF_PLC_Cancel])
IF NOT $CYCFLAG[iCF_PLC_Cancel] THEN
WAIT SEC 0.2
ENDIF
UNTIL (diMIG_ServicePos OR $CYCFLAG[iCF_PLC_Cancel])
;zurueck auf Fehlerposition
pTemp = pRet
SWITCH $ACT_BASE
CASE 0, 1
IF ((pTemp.Z<250.0)OR(pTemp.X>2340.0)) THEN
IF pTemp.Z<250.0 THEN
pTemp.Z = 250.0
ENDIF
IF pTemp.X>2340.0 THEN
pTemp.X = 2340.0
ENDIF
LIN pTemp
pTemp = pRet
ENDIF
IF pTemp.Z<0.0 THEN
pTemp.Z = 0.0
LIN pTemp
ENDIF
LIN $POS_RET
CASE 2, 3, 4
IF ((pTemp.Z<350.0)OR(pTemp.X>1200.0)) THEN
IF pTemp.Z<350.0 THEN
pTemp.Z = 350.0
ENDIF
IF pTemp.X>1200.0 THEN
pTemp.X = 1200.0
ENDIF
LIN pTemp
pTemp = pRet
ENDIF
IF pTemp.Z<100.0 THEN
pTemp.Z = 100.0
LIN pTemp
ENDIF
LIN $POS_RET
ENDSWITCH
$VEL.CP = rVel
ENDIF
INTERRUPT ON iIntr_MIG_ServicePos
END
Alles anzeigen
Verwendete Softwareversionen:
KSS Version=V8.3.39
ArcTechBasic=1.5.7
BoardPackage=1.4.0
DiagnoseSafety=2.1.0
GripperSpotTech=4.0.7
Profinet ProfiSafe Device=3.2.2
SafeOperation=3.2.4
UserTech=3.3.5
greez Drudge