KS V8.5.465_HF3
KR8R1620 C4
Hi,
I have a question consider on motion interpolation beetwen two procedures.
As I know, in Kuka, there is no posibility to approximate the last point in procedure but maybe sameone have a solution.
I have a main loop in CELL which manages the actual procedure to execute. Inside the procedures a have the another ones responsible for motion commands and the utilis consider with that. So I can say the main loop in CELL is a 1 level, procedure with trajectory is 2 level and the motion procedures are 3 level.
If the PLC choose for example procedure P1000 from main loop, the motion is going smoothly within this procedure up to the last motion. All of the motion instuctions are approximated. I want to make smooth motion (approximated) beetwen two another procedures for example p1000 -> p1100. Actualy before the last motion i get the msg 1123 and 1442.
Mayby someone have the solution to make this movements interpolated. In my opinion this is little bit strange, because every next movement is called by the "subprocedure" and beetwen this "subprocedures" as i told the movment is smooth up to the last when the program goes down from 3 level to 1 to change the 2 levele procedure.
I mark, the advance run does not stop, the $Advance isnt null and i explain my problem brightly. Below I added fragment of code.
Thanks a lot for your help !
;---------------------- MAIN PROGRAM LOOP ----------------------
LOOP
;wait for iCmdNr <> 0;
nCmdNr = iCmdNr ; copy command number from PLC data
SWITCH nCmdNr
;--------------------------------------------------------
;--------------- PRODUCTION PROCESS CMD ----------------
;--------------- CmdNr from 1000 to 2100 ----------------
CASE 0
;------------------------------------------------------
; Movement to position - pickup home - movement trajectory related to current position (Bender home or intermediate module home)
CASE 1000
P1000_PickupHome()
;------------------------------------------------------
; Movement to pickup position - pickup the tube from the orientation module
CASE 1100
P1100_PickupOrientation()
;------------------------------------------------------
; Movement to position - pickup home - tube in gripper clamps
CASE 1200
P1200_DepOrientation()
;------------------------------------------------------
; Movement to position - intermediate module home
CASE 1300
P1300_IntModHome()
;------------------------------------------------------
; Movement to position - put away tube in intermediate module gripper clamps
CASE 1400
P1400_FeedIntermodule()
;------------------------------------------------------
;Movement to position - intermediate module home - after putaway tube in intermediate module gripper clamps
CASE 1500
P1500_DepFeedIntModule()
;------------------------------------------------------
;Movment to position - left/right side of intermediate module - side depends on actual formed tube position
CASE 1600
P1600_PickupIntModule()
;------------------------------------------------------
; Movement to position - intermediate module home
CASE 1700
P1700_DepPickupIntModule()
;------------------------------------------------------
;Movement to position - crippa home - tube in gripper clamps
CASE 1800
P1800_CrippaHome()
;------------------------------------------------------
;Movement to position - put away tube in crippa colet
CASE 1900
P1900_FeedCrippa()
;------------------------------------------------------
; Movement to position - crippa home - without tube in gripper clamps
CASE 2000
P2000_DepFeedCrippa()
;------------------------------------------------------
; Movement to position - put away tube to NOK container
CASE 2100
P2100_NOK()
;--------------------------------------------------------
;--------------- SERVICE PROCESS CMD -------------------
;--------------------------------------------------------
;--------------------------------------------------------
;Movement to Service position -------------------------
CASE 20
P20_SERVICE_POS()
;--------------------------------------------------------
;Movement to SAFE HOME position -------------------------
CASE 30
P30_SAFE_HOME()
;--------------------------------------------------------
;----------------- Brake test procedure -----------------
CASE 40
P40_BRAKETEST()
;--------------------------------------------------------
;----------------- Axes sync procedure -----------------
CASE 50
P50_AXES_SYNQ()
;------------------------------------------------------
DEFAULT
oCmdNr_Ack = 0
PULSE($OUT[250], TRUE,0.5)
MsgQuit("Nieznany rozkaz z PLC")
ENDSWITCH
CONTINUE
IF nCmdNr <> 0 THEN
P11_ConfirmCommand() ; Command executed, confirm to PLC
ENDIF
INTERRUPT OFF 8
CONTINUE
oCmdNr_Ack = 0
ENDLOOP
END
Display More
DEF P1200_DepOrientation( )
;FOLD INI;%{PE}
;FOLD BASISTECH INI
;GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
;INTERRUPT ON 3
BAS (#INITMOV,0 )
;ENDFOLD (BASISTECH INI)
;FOLD USER INI
;Make your modifications here
;ENDFOLD (USER INI)
;ENDFOLD (INI)
MovementE6Axis(PickupHomeAxisPos, F_P1000_PickupHome, P_P1000_PickupHome,true)
MovementPTP(XP1300_IntModHome_01, FP1300_IntModHome_01, PP1300_IntModeHome_01, MoveTypeSPTP,TRUE)
;Pozycja końcowa - domowa dla strefy modułu poSredniego
;Wystawienie zezwolenia na potwierdzenie komendy ruchowej
TRIGGER WHEN PATH = -50 DELAY = 0 DO P1200ConfirmCommandPerm = TRUE
MovementE6Axis(InterModHomeAxisPos, F_P1300_InterModHome, P_P1300_InterModHome,TRUE) HERE IS THE PROBLEM WITH APPROX
;WAIT FOR PICKUP_HOME
CONTINUE ; oczekiwanie na zezwolenie wejScia do potwierdzenia komendy
WAIT FOR P1200ConfirmCommandPerm
CONTINUE
P1200ConfirmCommandPerm = FALSE
END
Display More
DEF MovementPTP(Position_IN :IN, FrameData_IN :IN, MoveParams_IN :IN, MoveType_IN :IN,ApproxONOFF :IN)
;Deklaracje zmiennych
ENUM Motion S_PTP,_PTP, S_LIN,_LIN
DECL Motion MoveType_IN
DECL E6POS Position_IN
DECL FDAT FrameData_IN
DECL PDAT MoveParams_IN
DECL BOOL ApproxONOFF
DECL INT APO_CDIS
;----------------------------------------------------------------------------------------
;Funkcja obsBugujca operacje ruchowe PTP robota oraz zapisywanie informacja dla RecoveryPath
;----------------------------------------------------------------------------------------
CONTINUE
SWITCH MoveType_IN
CASE #S_PTP ; ruch SPTP
SaveMoveType = 1
CASE #_PTP ; ruch PTP
SaveMoveType = 2
DEFAULT
ENDSWITCH
SavePosition = Position_IN
SaveFrameData = FrameData_IN
SaveMoveParamsP = MoveParams_IN
CONTINUE
TRIGGER WHEN DISTANCE = 0 DELAY = 0 DO SavePosParamsPTP(SavePosition,SaveMoveParamsP,SaveFrameData,SaveMoveType) PRIO =-1
CONTINUE
SWITCH SaveMoveType ; wybranie odpowiedniego typu ruchu dla aktualnie danego przejazdu do punktu
;pozycja dla przejazdu do uprzednio zapamitanego punktu
CASE 1 ; ruch SPTP
CONTINUE
IF ApproxONOFF THEN
$APO.CDIS = MoveParams_IN.APO_DIST
SPTP Position_IN WITH $VEL_AXIS[1] = SVEL_JOINT(MoveParams_IN.Vel),$TOOL = STOOL2(FrameData_IN),$BASE = SBASE(FrameData_IN.BASE_NO),$IPO_MODE = SIPO_MODE(FrameData_IN.IPO_FRAME),$LOAD = SLOAD(FrameData_IN.TOOL_NO),$ACC_AXIS[1] = SACC_JOINT(MoveParams_IN),$APO = SAPO_PTP(MoveParams_IN),$GEAR_JERK[1] = SGEAR_JERK(MoveParams_IN),$COLLMON_TOL_PRO[1] = USE_CM_PRO_VALUES(0) C_DIS
ELSE
SPTP Position_IN WITH $VEL_AXIS[1] = SVEL_JOINT(MoveParams_IN.Vel),$TOOL = STOOL2(FrameData_IN),$BASE = SBASE(FrameData_IN.BASE_NO),$IPO_MODE = SIPO_MODE(FrameData_IN.IPO_FRAME),$LOAD = SLOAD(FrameData_IN.TOOL_NO),$ACC_AXIS[1] = SACC_JOINT(MoveParams_IN),$APO = SAPO_PTP(MoveParams_IN),$GEAR_JERK[1] = SGEAR_JERK(MoveParams_IN),$COLLMON_TOL_PRO[1] = USE_CM_PRO_VALUES(0)
ENDIF
CASE 2 ; ruch PTP
$BWDSTART = FALSE
PDAT_ACT = MoveParams_IN
FDAT_ACT = FrameData_IN
BAS(#PTP_PARAMS, MoveParams_IN.VEL)
SET_CD_PARAMS (0) ; obsluga detekcji kolizji - wybranie jednej z konfiguracji
CONTINUE
IF ApproxONOFF THEN
$APO.CDIS = MoveParams_IN.APO_DIST
PTP Position_IN C_DIS ;aproksymacja
ELSE
PTP Position_IN
ENDIF
DEFAULT
ENDSWITCH
;Zerowanie zmiennej SaveMoveType
SaveMoveType = 0
END
Display More