Our system is KRC4 8.5.7 HF1 and KR 90 R3100 extra HA, robot mounted on a non-Kuka track (but with Kuka-motor) and two KP1 positioners.
Between the two positioners, a tube can be placed, so that the two positioners can continuously rotate the tube (the tub is in the center of the two positioners).
The two postioners and the robot track are kinematically coupled to the robot.
The purpose of the application is that the robot can weld a layer on the tube. This done by continuously rotating the tube while the robot slowly moves from one side of the
tube to the other. What is the prefered way to program this application : make the KP1's rotate continuously (in master-slave) and meanwhile the robot moves from one side to another, creating a
weld pattern in a spiral shape. All axes are kinematically coupled.
Robot with KP1 manipulators
- Plc_User
- Thread is Unresolved
-
-
That's very vague.
If the spiral is of constant pitch, you could potentially program the entire spiral with a single motion command. For example, for a spiral of 10mm/deg, 1 meter long, you could use something like LIN {X 1000, E1 100}. This assumes the X axis is along the length of the tube, and E1 is the KP1s rotational axis.
OTOH, if your spiral requires multiple revolutions of E1, you might need to use a series of LINs or LIN_RELs, because the "natural" behavior of an Endless rotational axis is to jump to the nearest multiple of 360deg -- that is, if E1 is at 0 deg, and you command it to {E1 361}, E1 will only move 1deg, because the physical endpoint is the same.
-
We have now already programmed this. It is a spiral that contains multiple rotations of the external axis.
I repeat lin motions where I rotate the external axis each time 120° further while moving the robot along its track.
This works fine.
But now we also need an application where the robotaxes and its track will stay stationary during multiple complete rotations of the external axis. The problem I observe is that now the motion of the external axis is not continues anymore : it stops shortly every 120° of rotation. I don't have that stopping if there is also some motion of the robotaxes (even if f.i. the x-axis moves only 0.001 mm / rotation). I understand that there is no approximation possible if you go from one point to another point if X,Y, Z of that point are the same. What is the proposed solution for my case : robotaxes and its track stationarry, but external axis rotating multiple turns without any intermediarry stoppings. -
Kss version?
Synchronous ext axis?
Program sample?
-
The system is KRC4 8.5.7 HF1.
The external axis for the manipulator is synchronous when the application is run.
I don't have the exact program at the moment, but basically I loop through three LIN motions, continuous (C_DIS suffix).
e.g. LOOPLIN P1 C_DIS
LIN P2 C_DIS
LIN P3 C_CISEND_LOOP
P1,P2,P3 are E6POS variables, that have all identical values, except that
P1.E2 = 0.0, P2.E2 = 120.0 and P3.E2 = 240.0, where E2 is the external axis of the manipulator that must rotate.
$ADVANCE is set to 3.
The motion (only rotation of E2) behaves just like the C_DIS was ommited (rotation comes to a stop after reaching P1,P2,P3 and then starts again towards next point.. -
Is this in Teach mode? Are you getting the message "Approximation not possible"?
-
what is the approximation distance used? are you SURE that value is set?
-
The approximation distance should be 20 mm.
Underneath is the subroutine that is active when the manipulator is rotating.
I tested in T2-mode and already set $STOPNOAPROX to true,
but I get no message that approximation is not possible.
So it does not seem that the advance run pointer is stopped.Code
Display MoreDEF RotateCil () Int_RelStopRotCilPreheat = TRUE Int_RelPausRotCilPreheat = TRUE Int_RelEndRotCilPreheat=TRUE Int_RelChgRotCilPreheat=TRUE LOOP SWITCH CycleStep_PreheatKP1 ;;;;;;;;;;;;;Preheat active;;;;;;;;;;;;; CASE 11 PowerOnPreheat = TRUE XP_PREHEATPOSKP1.E2 = 120.0 BASE_DATA[4] = OFFS_PREHEATSTARTACT $BWDSTART=FALSE LDAT_ACT=LCPDAT_PREHEAT FDAT_ACT=FP_PREHEAT LDAT_ACT.VEL = SPDROTATECILPREHEAT1_L LDAT_ACT.ACC = ACCROTATECILPREHEAT1_L LDAT_ACT.APO_DIST = 20 LDAT_ACT.GEAR_JERK = JERK_ROTATECILPREHEAT1_L BAS(#CP_PARAMS,LDAT_ACT.VEL) $VEL_EXTAX[2] = SpdRotAxPreheatKP1 LIN XP_PREHEATPOSKP1 C_DIS Cntr120DegPrehCilinder1 = Cntr120DegPrehCilinder1 +1 CalcDataRotPos () IF NegDirectionPreheatKP1 THEN CycleStep_PreheatKP1 = 13 LogCycle (40013) ELSE CycleStep_PreheatKP1 = 12 LogCycle (40012) ENDIF ;;;;;;;;;;;;;Preheat active;;;;;;;;;;;;; CASE 12 PowerOnPreheat = TRUE XP_PREHEATPOSKP1.E2 = 240.0 BASE_DATA[4] = OFFS_PREHEATSTARTACT $BWDSTART=FALSE LDAT_ACT=LCPDAT_PREHEAT FDAT_ACT=FP_PREHEAT LDAT_ACT.VEL = SPDROTATECILPREHEAT1_L LDAT_ACT.ACC = ACCROTATECILPREHEAT1_L LDAT_ACT.APO_DIST = 20 LDAT_ACT.GEAR_JERK = JERK_ROTATECILPREHEAT1_L BAS(#CP_PARAMS,LDAT_ACT.VEL) $VEL_EXTAX[2] = SpdRotAxPreheatKP1 LIN XP_PREHEATPOSKP1 C_DIS Cntr120DegPrehCilinder1 = Cntr120DegPrehCilinder1 +1 CalcDataRotPos () IF NegDirectionPreheatKP1 THEN CycleStep_PreheatKP1 = 11 LogCycle (40011) ELSE CycleStep_PreheatKP1 = 13 LogCycle (40013) ENDIF ;;;;;;;;;;;;;Preheat active;;;;;;;;;;;;; CASE 13 PowerOnPreheat = TRUE XP_PREHEATPOSKP1.E2 = 0.0 BASE_DATA[4] = OFFS_PREHEATSTARTACT $BWDSTART=FALSE LDAT_ACT=LCPDAT_PREHEAT FDAT_ACT=FP_PREHEAT LDAT_ACT.VEL = SPDROTATECILPREHEAT1_L LDAT_ACT.ACC = ACCROTATECILPREHEAT1_L LDAT_ACT.APO_DIST = 20 LDAT_ACT.GEAR_JERK = JERK_ROTATECILPREHEAT1_L BAS(#CP_PARAMS,LDAT_ACT.VEL) $VEL_EXTAX[2] = SpdRotAxPreheatKP1 LIN XP_PREHEATPOSKP1 C_DIS Cntr120DegPrehCilinder1 = Cntr120DegPrehCilinder1 +1 CalcDataRotPos () IF NegDirectionPreheatKP1 THEN CycleStep_PreheatKP1 = 12 LogCycle (40012) ELSE CycleStep_PreheatKP1 = 11 LogCycle (40011) ENDIF ENDSWITCH ENDLOOP $ADVANCE=0 INTERRUPT OFF 14 INTERRUPT OFF 13 INTERRUPT OFF 15 END
$STOPNOAPROX
-
what is the value of $ADVANCE?
what is the declaration of PowerOnPreheat (signal?)
what is the declaration of CycleStep_PreheatKP1 (signal?)
what is the declaration of NegDirectionPreheatKP1 (signal?)
-
The value of $ADVANCE IS 3.
It is set explicitly before the subroutine RotateCil() is called : $ADVANCE=3.After that instruction there are no other assignments to $advance before entering 'RotateCil()'.
On the KCP I also see its value at 3 when executing RotateCil().PowerOnPreheat , CycleStep_PreheatKP1 and NegDirectionPreheatP1 are defined as global variables in a Dat-file.
DECL GLOBAL BOOL PowerOnPreheat=FALSE
DECL GLOBAL INT CycleStep_PreheatKP1=12
DECL GLOBAL BOOL NegDirectionPreheatKP1=FALSEIf BASE_DATA[4] is not changing during execution of the loop in RotateCil, the motion stops shortly every 120° of E2-rotation. If f.i. the X-value changes slightly (even if its only 0.001 mm every new LIN execution) the rotation is not stopped.
BASE_DATA[4] is the base used in the LIN-motionsDECL GLOBAL FDAT FP_PREHEAT={TOOL_NO 1,BASE_NO 4,IPO_FRAME #BASE,POINT2[] " ",TQ_STATE FALSE}
-
Since it is a HA machine it also has absolute accuracy. Therefore also check load dat changes. You can not blend over load data changes in case of absolute accuracy.
Fubini
-
Load data is unchanged during the whole cycle.
-
Can I conclude that in my example as posted before :
LOOP
LIN P1 C_DIS
LIN P2 C_DIS
LIN P3 C_CIS
END_LOOP
P1,P2,P3 are E6POS variables, that have all identical values, except that
P1.E2 = 0.0, P2.E2 = 120.0 and P3.E2 = 240.0, where E2 is the external axis of the manipulator that must rotate.
$ADVANCE is set to 3 and load data is not changed.
That the motion of the external axis will stop shortly every time P1,P2 or P3 is reached?
-
For that code, the motion should be continuous. There's no obvious reason for the behavior you describe.
I would try something like this:
Code
Display MoreDEF E2Test() DECL E6POS _eTestPos DECL INT _nIndex DECL INT _nIncrement $ADVANCE=3 _nIncrement = 1 _eTestPos.E2 = 0 ; PTP test PTP {E2 0} FOR _nIndex = 1 to 100 _eTestPos.E2 = _eTestPos.E2 + _nIncrement PTP _eTestPos C_PTP ENDFOR ; LIN test PTP {E2 0} FOR _nIndex = 1 to 100 _eTestPos.E2 = _eTestPos.E2 + _nIncrement LIN _eTestPos C_DIS ENDFOR ; PTP_REL Test PTP {E2 0} FOR _nIndex = 1 to 100 _eTestPos.E2 = _nIncrement PTP_REL _eTestPos C_PTP ENDFOR ;LIN_REL test PTP {E2 0} FOR _nIndex = 1 to 100 _eTestPos.E2 = _nIncrement LIN_REL _eTestPos C_DIS ENDFOR END
Try different settings of _nIncrement and see if/how the motion behavior changes.
-
If the motions are as in my case only rotations of E2.
What is the guideline for the value of the approximation distance for LIN-commands (with C_DIS)? -
If you're only moving E2, why not use PTP? Are you using an interpolated motion?
The value of $APO depends on your requirements, and the configuration of your axes. A small value might work for low-inertia conditions, but for situations with high inertia or axes that require long accel/decel ramps, the path planner might have to reduce speed before reaching the approximation radius (in other words, the acceleration distance exceeds the $APO value).
The quick answer would be to try your test program with different $APO values and see if increasing them makes a difference.
Also, since E2 is kinematically integrated, it's possible that your limiting factor might be $APO.CORI, rather than CDIS -- depending on your configuration of E2 relative to your TCP, the path planner might be seeing the E2 motion as a change in TCP orientation, rather than position.