G76 - Pause in Z during exit taper Linux CNC 2.7.0

More
26 Sep 2015 18:56 #63020 by verticalperformance
Since updating to 2.7.0, I have noticed a brief pause in Z feed when cutting threads with an exit taper. I've been using the same code fragment for a while and had not noticed this in 2.6.x. :(
With an exit taper, what I expect to see if constant Z feed feed until "Z" with the X feed starting to disengage the tool at a distance "E" prior to this. What I do see is a definite "hiccup" in Z velocity as the X axis starts to feed out - almost like it's trying to index?

I might have to resort to a exit rebate (which I use when I need to thread up to a shoulder) until resolved.

Anybody else seen this in 2.7.0 - or can try G76 with and without exit tapers and confirm it's not just a a "me moment" ;)

Thanks in advance.

Machine Details:
Sherline Lathe with factory steppers and driver box
Digispeed spindle control using sherline spindle encoder with single pulse for spindle index
Homemade 60ppr spindle encoder for spindle RPM.


Code fragment below -
(sorry it's coded using radius - one day I'll really have to go and fix all my code to diameter. Also it's an M6 thread but it's a bit of a struggle for the sherline in stainless steel so the numbers were arrived at with a bit of iteration to make the nut fit, rather than working out what they should be first!)
(Sherline Lathe)
(Tool List		)
(T20 60 degree V point thread tool)

g00 g21 g40 g49 g90 g18 g8 g64


#<Thread_Diameter>=5.8
#<Thread_Minor_Diameter>=4.5
#<Thread_Pitch>=1 

#<Thread_Start>=7.5
#<Thread_Length>=13.4
#<Thread_Rebate_Width>=0

#<Tool_Thread>=20
#<Thread_Surface_Speed>=25

#<Roughing_Cut_Depth>=.125


O<Thread> if [#<Thread_Pitch> GT 0]
	G0 X25 (clearance Pos)
	G40
	T#<Tool_Thread> M6 G43 (Change to thread cutting tool)
	
	#<Thread_Start_Offset>=[-#<Thread_Start>+#<Thread_Pitch>*2]
	#<Drive_Line_Radius>=[#<Thread_Diameter>/2+2*#<Roughing_Cut_Depth>]
	#<Thread_Peak_Offset>=[#<Drive_Line_Radius>-#<Thread_Diameter>/2]
	#<Thread_Depth>=[[#<Thread_Diameter>-#<Thread_Minor_Diameter>]/2]  
	#<Initial_Cut_Depth>=#<Roughing_Cut_Depth>
	
	G96 D250 S#<Thread_Surface_Speed> M3

	G00 Z#<Thread_Start_Offset>
	G00 X#<Drive_Line_Radius>

    O<ThreadRunout> if [#<Thread_Rebate_Width> GT 0]
	    #<Thread_Cut_Length>=-[#<Thread_Length>-[#<Thread_Rebate_Width>*0.80]]
	    G76 P#<Thread_Pitch> Z#<Thread_Cut_Length> I-#<Thread_Peak_Offset> J#<Initial_Cut_Depth> K#<Thread_Depth>  L0 E0 H0 R1.0 Q0
    O<ThreadRunout> else
	    #<Thread_Runout_Length>=[#<Thread_Depth>*sqrt[3]]
	    #<Thread_Cut_Length>=-[#<Thread_Length>+#<Thread_Runout_Length>]
            G76 P#<Thread_Pitch> Z#<Thread_Cut_Length> I-#<Thread_Peak_Offset> J#<Initial_Cut_Depth> K#<Thread_Depth>  L2 E#<Thread_Runout_Length> H0 R1.0 Q0 
    O<ThreadRunout> endif

	G0 X25 (clearance Pos)
	M5

O<Thread> endif

M30

%
Also see axis preview attached with and without taper.



Attachments:

Please Log in or Create an account to join the conversation.

More
27 Sep 2015 04:15 #63040 by skunkworks
A developer plotted the g76 cycle in sim and it seems to be working correct.

You can see the z axis velocity stays up while x retracts.

emergent.unpythonic.net/files/sandbox/ma...he-thread-taper2.png

Could you try plotting?

Sam

Please Log in or Create an account to join the conversation.

More
27 Sep 2015 09:11 #63044 by verticalperformance
Further observations.... If I run the sample code fragment first up, I can't see the Z pause. If I run the full code the pause is there! If I then run the code fragment again, it now pauses too for the first time I run the code, but works fine the second and subsequent times.
The pause during tapered exit does look like the z pause at the start of motion when the axis syncs to the rotation - has the same sort of "stutter".

I've compared the modal codes before and after and the only difference is the G17/18 noted below. I thought it might be G61 / G64 but putting a G61 as first line inside threading routine made no difference.

One real oddity when looking at the modal codes is even though I program a G18 in the preamble, when the test code runs it switches (according to the active g-code in the MDI tab in axis) to a G17. The full code doesn't do this. Weird!

Silly question re halscope - the graphs plotted.... should they all be available signals, or would that depend on the way the config was set up? I can see the spindle-index-enable and I suspect Z-pos-cmd and X-pos-cmd are comparable to Zpos and Xpos, But I don't seem to have any velocity signals.

Thanks again.

Here is the full program, as it does seem that there is something there causing issues!
%
(Spindle, Whistle Front)
(WH001-403 6MM)
(Stock 1/4 OD Stainless)
(Tool List		)
(T1 .040 Parting Tool)
(T5 .020 Grooving Tool)
(T10 Sharp Tool) 
(T20 60 degree V point thread tool)


g00 g21 g40 g49 g90 g18 g8 g64

#<Spiggot_Diameter>=4
#<Spiggot_Length>=[27.5-14-6]
#<Spiggot_Chamfer_Length>=[2/SQRT[3]]
#<Spiggot_Chamfer_Angle>=60

#<Thread_Diameter>=5.8
#<Thread_Minor_Diameter>=4.5
#<Thread_Pitch>=1 

#<Thread_Start>=#<Spiggot_Length>
#<Thread_Length>=[#<Spiggot_Length>+6]
#<Thread_Rebate_Width>=0
#<Thread_Chamfer_Angle>=45
#<Thread_Chamfer_Length>=[[#<Thread_Diameter>-#<Thread_Minor_Diameter>]/2]

#<Head_Length>=17.25;[22-6.5]
#<Head_Diameter>=6.35
#<Head_Chamfer_Angle>=45
#<Head_AF>=6.35

#<Shoulder_Diameter>=#<Head_Diameter>

#<Manifold_Radius>=1
#<Manifold_Location>=[27.5-6-5]
#<Manifold_Neck_Diameter>=[#<Shoulder_Diameter>-2*#<Manifold_Radius>]


#<HoleDiameter>=0
#<HoleDepth>=0


#<Length>=[#<Head_Length>+#<Thread_Length>]

#<Stock_Dia>=#<Head_Diameter>
#<Stock_Extension_Start>=0 (Stock Extension at start)
#<Stock_Extension_End>=1.5 (Stock Extension at parting end)

#<_Chamfer_Lead_In>=0.25
#<_Chamfer_Lead_Out>=0.25
#<_Chamfer_Parallel_Lead>=1

#<Roughing_Feed>=75
#<Finishing_Feed>=50
#<Grooving_Feed>=25
#<Parting_Feed>=10

#<Tool_Turn>=10
#<Tool_Part>=1
#<Tool_Groove>=1
#<Tool_Thread>=20
#<Tool_Radius>=5

#<Turn_Surface_Speed>=80
#<Part_Surface_Speed>=30
#<Thread_Surface_Speed>=25
#<Groove_Surface_Speed>=50
#<Max_Spindle_Speed>=1500

#<Roughing_Cut_Depth>=.125
#<Finishing_Cut_Depth>=.075 

#<Stock_Radius>=[#<Stock_Dia>/2]
#<Roughing_Length>=[#<Roughing_Cut_Depth>]
#<Final_Length>=[#<Finishing_Cut_Depth>]


#<Z_Start>=[#<Stock_Extension_Start>] (Z start location for OD- clearance on end face)


T#<Tool_Turn> M6 (Change to cutting tool)

G96 D#<Max_Spindle_Speed> S#<Turn_Surface_Speed> M3

G1 F#<Roughing_Feed>
(Do End Face if needed)

O<FaceEnd> if [#<Stock_Extension_Start> GT 0]

	#<X_Start>=[#<Stock_Radius>+#<Roughing_Cut_Depth>] (x start location for face)
	#<X_End>=[-0.05] (x end location)

	#<Z_Current>=[#<Stock_Extension_Start>]
	G0 X#<X_Start> Z#<Z_Current> G43 H#<Tool_Turn>

	O<RoughFaceEnd> while [#<Z_Current> gt #<Roughing_Length>] (Roughing face loop)
		G1 Z#<Z_Current> F#<Roughing_Feed>
		G1 X#<X_End>
		G1 X[#<X_End>-#<Roughing_Cut_Depth>] Z[#<Z_Current>+#<Roughing_Cut_Depth>]
		G0 X#<X_Start>
		#<Z_Current>=[#<Z_Current>-#<Roughing_Cut_Depth>]
	O<RoughFaceEnd> endwhile
	(Last Roughing Pass)

	#<Z_Current>=[#<Roughing_Length>] (Last Roughing Pass)
	G1 Z#<Z_Current> F#<Roughing_Feed>
	G1 X#<X_End>
	G1 X[#<X_End>-#<Roughing_Cut_Depth>] Z[#<Z_Current>+#<Roughing_Cut_Depth>]
	G0 X#<X_Start>
	
	(finish pass)
	G1 Z0 F#<Finishing_Feed> 
	G1 X#<X_End> 
	G1 X[#<X_End>-#<Roughing_Cut_Depth>] Z[#<Roughing_Cut_Depth>]
	G0 X#<X_Start>

O<FaceEnd> endif


(Do Thread OD if needed)
O<ProfileThread> if [#<Thread_Diameter> LT #<Stock_Dia>]  (Don't reduce OD for thread if not needed)
    #<Roughing_Radius>=[#<Thread_Diameter>/2+#<Finishing_Cut_Depth>]
    #<_Final_Radius>=[#<Thread_Diameter>/2]
    #<L>=#<Thread_Length>;[#<Thread_Length>+#<Thread_Start>]

    #<Z_Start>=[#<Roughing_Cut_Depth>] (Z start location for OD- clearance on end face)
    #<Z_End>=[-#<L>] (Z end location)
    #<X_Current>=#<Stock_Radius>
	T#<Tool_Turn> M6 (Change to cutting tool)
	S#<Turn_Surface_Speed> M3
	G1 F#<Roughing_Feed>
    G0 X#<X_Current> Z#<Z_Start> G43
    O<RoughProfileThread> while [#<X_Current> gt #<Roughing_Radius>] (Roughing loop)
	    G1 X#<X_Current> F#<Roughing_Feed>
	    G1 Z[#<Z_End>+#<Finishing_Cut_Depth>]
	    G1 X[#<X_Current>+#<Roughing_Cut_Depth>] Z[#<Z_End>+[#<Finishing_Cut_Depth>+#<Roughing_Cut_Depth>]]
	    G0 Z#<Z_Start>
	    #<X_Current>=[#<X_Current>-#<Roughing_Cut_Depth>]
    O<RoughProfileThread> endwhile
    #<X_Current>=[#<Roughing_Radius>] (Last Roughing Pass)
    G1 X#<X_Current> F#<Roughing_Feed>
    G1 Z[#<Z_End>+#<Finishing_Cut_Depth>]
    G1 X[#<Stock_Radius>+#<Roughing_Cut_Depth>] Z[#<Z_End>+#<Finishing_Cut_Depth>]
    

    (finish pass)
    G0 Z#<Z_Start>
    G0 X#<X_Current>
    #<X_Current>=[#<_Final_Radius>]
    G1 X#<X_Current> F#<Finishing_Feed> 
    G1 Z#<Z_End>
    G1 X[#<Stock_Radius>+#<Roughing_Cut_Depth>]
    G0 Z#<Z_Start>

O<ProfileThread> endif

O<ThreadSameAsSpiggot> if [#<Spiggot_Diameter> LT #<Thread_Diameter>]

    (Do Spiggot OD if needed)
    #<L>=[#<Spiggot_Length>]
    #<Roughing_Radius>=[[#<Spiggot_Diameter>/2]+#<Finishing_Cut_Depth>]
    #<_Final_Radius>=[#<Spiggot_Diameter>/2]

    O<ProfileSpiggot> if [#<Spiggot_Diameter> LT #<Stock_Dia>]  (Don't reduce OD for Spiggot if not needed)
	    G0 X25 (clearance Pos)
	    G40
	    T#<Tool_Turn> M6 (Change to cutting tool)
	    S#<Turn_Surface_Speed> M3
	    G1 F#<Roughing_Feed>
	
	    #<Z_Start>=[#<Roughing_Cut_Depth>] (Z start location for OD- clearance on end face)
	    #<Z_End>=[-#<L>] (Z end location)
	    #<X_Current>=[[#<Thread_Diameter>/2]-#<Roughing_Cut_Depth>]  ;#<Stock_Radius>
	    G0 X#<X_Current> Z#<Z_Start> G43

	    O<RoughProfileSpiggot> while [#<X_Current> gt #<Roughing_Radius>] (Roughing loop)
		    G1 X#<X_Current> F#<Roughing_Feed>
		    G1 Z[#<Z_End>+#<Finishing_Cut_Depth>]
		    G1 X[#<X_Current>+#<Roughing_Cut_Depth>] Z[#<Z_End>+[#<Finishing_Cut_Depth>+#<Roughing_Cut_Depth>]]
		    G0 Z#<Z_Start>
		    #<X_Current>=[#<X_Current>-#<Roughing_Cut_Depth>]
	    O<RoughProfileSpiggot> endwhile

	    #<X_Current>=[#<Roughing_Radius>] (Last Roughing Pass)
	    G1 X#<X_Current> F#<Roughing_Feed>
	    G1 Z[#<Z_End>+#<Finishing_Cut_Depth>]
	    G1 X[[#<Thread_Diameter>/2]+#<Roughing_Cut_Depth>] Z[#<Z_End>+#<Finishing_Cut_Depth>]

	    (finish pass)
        G0 Z#<Z_Start>
	    G0 X#<X_Current>
	    
	    #<X_Current>=[#<_Final_Radius>]
	    G1 X#<X_Current> F#<Finishing_Feed> 
	    G1 Z#<Z_End>
        G1 X[[#<Thread_Diameter>/2]+#<Roughing_Cut_Depth>]
	    G0 Z#<Z_Start>

    O<ProfileSpiggot> endif
O<ThreadSameAsSpiggot> endif


O<Chamfer> sub
	(Chamfer Cut Path)
	#<Current_Cut_Depth_L>=#1
	#<Feed>=#2
	#<Start_Z>=#3

	#<Start_X>=[#<_Final_Radius>-#<Current_Cut_Depth_L>/Cos[#<_Chamfer_Angle>]]
	#<Finish_Z>=[#<Start_Z>-[#<Current_Cut_Depth_L>/sin[#<_Chamfer_Angle>]]]
	O<ChamferLeadInStyle> if [#<_Chamfer_Parallel_Lead> EQ 0]
		G00 Z[#<Start_Z>+#<_Chamfer_Lead_In>]
		G00 X[#<Start_X>]  G42 L2
	O<ChamferLeadInStyle> else
		G00 Z[#<Start_Z>+#<_Chamfer_Lead_In>*cos[#<_Chamfer_Angle>]] 
		G00 X[#<Start_X>-#<_Chamfer_Lead_In>*sin[#<_Chamfer_Angle>]]  G42 L2
	O<ChamferLeadInStyle> endif

	G01 X[#<Start_X>] Z#<Start_Z> F#<Feed> 
	G01 X[#<_Final_Radius>] Z[#<Finish_Z>]
	O<ChamferLeadInOutStyle> if [#<_Chamfer_Parallel_Lead> EQ 0]
		G01 X[#<_Final_Radius>+#<_Chamfer_Lead_Out>] Z[#<Finish_Z>]
	O<ChamferLeadInOutStyle> else		
		G01 X[#<_Final_Radius>+[#<_Chamfer_Lead_Out>*#<_Chamfer_Parallel_Lead>]*sin[#<_Chamfer_Angle>]] Z[#<Finish_Z>-[#<_Chamfer_Lead_Out>*#<_Chamfer_Parallel_Lead>]*[cos[#<_Chamfer_Angle>]]]

	O<ChamferLeadInOutStyle> endif
	G40		
O<Chamfer> endsub

(Chamfer end)
O<ChamferEnd> if [#<Spiggot_Chamfer_Angle> GT 0]

    #<_Chamfer_Angle>=#<Spiggot_Chamfer_Angle>
    #<_Chamfer_Length>=#<Spiggot_Chamfer_Length>
    #<Start_Z>=0

	#<Roughing_Total_Depth>=[#<_Chamfer_Length>*SIN[#<_Chamfer_Angle>]-#<Finishing_Cut_Depth>]
	#<Finishing_Total_Depth>=[#<_Chamfer_Length>*SIN[#<_Chamfer_Angle>]]

	#<Current_Cut_Depth>=#<Roughing_Cut_Depth>	
	G40
	T#<Tool_Turn> M6 (Change to cutting tool)
	S#<Turn_Surface_Speed> M3
	G1 F#<Roughing_Feed>
	O<RoughChamferEnd> while [#<Current_Cut_Depth> lt #<Roughing_Total_Depth>] (Roughing chamfer loop)
		(#1=#<Current_Cut_Depth>)
		(#2=#<Roughing_Feed>)
		O<Chamfer> Call  [#<Current_Cut_Depth>] [#<Roughing_Feed>] [#<Start_Z>]
		#<Current_Cut_Depth>=[#<Current_Cut_Depth>+#<Roughing_Cut_Depth>]
	O<RoughChamferEnd> endwhile

	O<Chamfer> Call  [#<Roughing_Total_Depth>] [#<Roughing_Feed>] [#<Start_Z>] (Last roughing path)
	O<Chamfer> Call  [#<Finishing_Total_Depth>] [#<Finishing_Feed>] [#<Start_Z>]  (Finish path)
	G40

O<ChamferEnd> endif

(Chamfer thread)
O<ChamferThread> if [#<Thread_Chamfer_Angle> GT 0]

    #<_Final_Radius>=[#<Thread_Diameter>/2]
    #<_Chamfer_Angle>=#<Thread_Chamfer_Angle>
    #<_Chamfer_Length>=#<Thread_Chamfer_Length>
    #<Start_Z>=-[#<Spiggot_Length>]

	#<Roughing_Total_Depth>=[#<_Chamfer_Length>*SIN[#<_Chamfer_Angle>]-#<Finishing_Cut_Depth>]
	#<Finishing_Total_Depth>=[#<_Chamfer_Length>*SIN[#<_Chamfer_Angle>]]

	#<Current_Cut_Depth>=#<Roughing_Cut_Depth>	
	G40
	T#<Tool_Turn> M6 (Change to cutting tool)
	S#<Turn_Surface_Speed> M3
	G1 F#<Roughing_Feed>
	O<RoughChamferThread> while [#<Current_Cut_Depth> lt #<Roughing_Total_Depth>] (Roughing chamfer loop)
		(#1=#<Current_Cut_Depth>)
		(#2=#<Roughing_Feed>)
		O<Chamfer> Call  [#<Current_Cut_Depth>] [#<Roughing_Feed>] [#<Start_Z>]
		#<Current_Cut_Depth>=[#<Current_Cut_Depth>+#<Roughing_Cut_Depth>]
	O<RoughChamferThread> endwhile

	O<Chamfer> Call  [#<Roughing_Total_Depth>] [#<Roughing_Feed>] [#<Start_Z>] (Last roughing path)
	O<Chamfer> Call  [#<Finishing_Total_Depth>] [#<Finishing_Feed>] [#<Start_Z>]  (Finish path)
	G40
O<ChamferThread> endif
(Chamfer Head)
O<ChamferHead> if [#<Head_Chamfer_Angle> GT 0]
    #<Head_Chamfer_Length>=[[[#<Head_Diameter>-#<Head_AF>]/2]/tan[#<Head_Chamfer_Angle>]]
    #<_Final_Radius>=[#<Head_Diameter>/2]
    #<_Chamfer_Angle>=#<Head_Chamfer_Angle>
    #<_Chamfer_Length>=#<Head_Chamfer_Length>
    #<Start_Z>=-[#<Thread_Length>];-[#<Thread_Length>+#<Spiggot_Length>]
    G00 X[#<_Final_Radius>]

	#<Roughing_Total_Depth>=[#<_Chamfer_Length>*SIN[#<_Chamfer_Angle>]-#<Finishing_Cut_Depth>]
	#<Finishing_Total_Depth>=[#<_Chamfer_Length>*SIN[#<_Chamfer_Angle>]]

	#<Current_Cut_Depth>=#<Roughing_Cut_Depth>	
	G40
	T#<Tool_Turn> M6 (Change to cutting tool)
	S#<Turn_Surface_Speed> M3
	G1 F#<Roughing_Feed>
	O<RoughChamferHead> while [#<Current_Cut_Depth> lt #<Roughing_Total_Depth>] (Roughing chamfer loop)
		(#1=#<Current_Cut_Depth>)
		(#2=#<Roughing_Feed>)
		O<Chamfer> Call  [#<Current_Cut_Depth>] [#<Roughing_Feed>] [#<Start_Z>]
		#<Current_Cut_Depth>=[#<Current_Cut_Depth>+#<Roughing_Cut_Depth>]
	O<RoughChamferHead> endwhile

	O<Chamfer> Call  [#<Roughing_Total_Depth>] [#<Roughing_Feed>]  [#<Start_Z>] (Last roughing path)
	O<Chamfer> Call  [#<Finishing_Total_Depth>] [#<Finishing_Feed>]  [#<Start_Z>] (Finish path)
	G40
O<ChamferHead> endif

( Do Thread Rebate)
O<ThreadRebate> if [#<Thread_Rebate_Width> GT 0]
	G0 X25 (clearance Pos)
	G40
	T#<Tool_Groove> M6 (Change to grooving tool LH tool set point = Q2)
	S#<Groove_Surface_Speed> M3
	G1 F#<Roughing_Feed>

    #<Tool_Groove_Width>=[#5410*25.4]
	
	O<ToolOrientation> if [#5413 EQ 1]
		;G0 Z[-#<Thread_Length>+#5410*25.4] G43 H#<Tool_Groove>
		#<Thread_Rebate_Start_Z> =[-#<Thread_Length>+#<Tool_Groove_Width>]
	O<ToolOrientation> else
		;G0 Z[-#<Thread_Length>] G43 H#<Tool_Groove>
		#<Thread_Rebate_Start_Z> = [-#<Thread_Length>] 
	O<ToolOrientation> endif	
	
	
    #<Thread_Rebate_End_Z>=[#<Thread_Rebate_Start_Z>+#<Thread_Rebate_Width>-#<Tool_Groove_Width>]
	#<Thread_Rebate_Z>=#<Thread_Rebate_Start_Z>
    #<Thread_Rebate_Diameter>=#<Thread_Minor_Diameter>

    #<Pass_Count>=0
 	G0 Z[#<Thread_Rebate_Z>] G43 H#<Tool_Groove>	

    O<ThreadRebateMultiPass> while [#<Thread_Rebate_Z> LT #<Thread_Rebate_End_Z>]
 	    G0 Z[#<Thread_Rebate_Z>] G43 H#<Tool_Groove>	
	    G0 X[#<Stock_Radius>+#<Roughing_Cut_Depth>] 
	    G1 X#<Stock_Radius> F#<Grooving_Feed>
	    G1 X[#<Thread_Rebate_Diameter>/2]
  	    G0 X[#<Stock_Radius>+#<Roughing_Cut_Depth>] 
        #<Thread_Rebate_Z>=[#<Thread_Rebate_Z>+#<Tool_Groove_Width>]
        #<Pass_Count>=[#<Pass_Count>+1]
    O<ThreadRebateMultiPass> endwhile   

    O<ThreadRebateFinalPass> if [#<Thread_Rebate_Z> NE #<Thread_Rebate_End_Z>]
  	    G0 Z[#<Thread_Rebate_End_Z>] G43 H#<Tool_Groove>	
	    G0 X[#<Stock_Radius>+#<Roughing_Cut_Depth>] 
	    G1 X#<Stock_Radius> F#<Grooving_Feed>
	    G1 X[#<Thread_Rebate_Diameter>/2]
  	    G0 X[#<Stock_Radius>+#<Roughing_Cut_Depth>] 
        #<Pass_Count>=[#<Pass_Count>+1]
    O<ThreadRebateFinalPass> endif

    O<ThreadRebateCleanupDiameter> if [#<Pass_Count> GT 1]
  	    G0 Z[#<Thread_Rebate_Start_Z>] G43 H#<Tool_Groove>	
	    G0 X[#<Stock_Radius>+#<Roughing_Cut_Depth>] 
	    G1 X#<Stock_Radius> F#<Grooving_Feed>
	    G1 X[#<Thread_Rebate_Diameter>/2] 
	    G1 Z[#<Thread_Rebate_End_Z>] 
	    G1 X[#<Stock_Radius>+#<Roughing_Cut_Depth>] 
    O<ThreadRebateCleanupDiameter> endif

	G0 X[#<Stock_Radius>+5]
	
O<ThreadRebate> endif


O<Thread> if [#<Thread_Pitch> GT 0]

	G0 X5 (clearance Pos)
	G40
	T#<Tool_Thread> M6 G43 (Change to thread cutting tool)
	
	#<Thread_Start_Offset>=[-#<Thread_Start>+#<Thread_Pitch>*2]
	#<Drive_Line_Radius>=[#<Thread_Diameter>/2+2*#<Roughing_Cut_Depth>]
	#<Thread_Peak_Offset>=[#<Drive_Line_Radius>-#<Thread_Diameter>/2]
	#<Thread_Depth>=[[#<Thread_Diameter>-#<Thread_Minor_Diameter>]/2]  
	#<Initial_Cut_Depth>=#<Roughing_Cut_Depth>;[#<Roughing_Cut_Depth>/2]
	
	G96 D250 S#<Thread_Surface_Speed> M3

	G00 Z#<Thread_Start_Offset>
	G00 X#<Drive_Line_Radius>

    O<ThreadRunout> if [#<Thread_Rebate_Width> GT 0]
	    #<Thread_Cut_Length>=-[#<Thread_Length>-[#<Thread_Rebate_Width>*0.80]]
	    G76 P#<Thread_Pitch> Z#<Thread_Cut_Length> I-#<Thread_Peak_Offset> J#<Initial_Cut_Depth> K#<Thread_Depth>  L0 E0 H2 R2.0 Q0 ;Q29.5
    O<ThreadRunout> else
	    #<Thread_Runout_Length>=[#<Thread_Depth>*sqrt[3]]
	    #<Thread_Cut_Length>=-[#<Thread_Length>+#<Thread_Runout_Length>]
	    G76 P#<Thread_Pitch> Z#<Thread_Cut_Length> I-#<Thread_Peak_Offset> J#<Initial_Cut_Depth> K#<Thread_Depth>  L2 E#<Thread_Runout_Length> H2 R2.0 Q0 
    O<ThreadRunout> endif

	G0 X5 (clearance Pos)
	M5

O<Thread> endif

O<CircularRebate> sub
    #<Centreline_z> = #1
    #<Bottom_x> = #2
    #<Radius>= #3
    #<Feed>=#4
    G00 X[#<Bottom_x>+[2*#<Radius>]] Z#<Centreline_z>
    G03 X[#<Bottom_x>+[#<Radius>]] Z[#<Centreline_z>-#<Radius>] K[0] I[-#<Radius>] F#<Feed> G43
    G03 X[#<Bottom_x>+[2*#<Radius>]] Z[#<Centreline_z>] K[#<Radius>] I[0] F#<Feed> 
    G40
O<CircularRebate> endsub

O<Manifold_Groove> if [#<Manifold_Radius> GT 0]
    G40
    G0 X25
    G0 Z10

	T#<Tool_Radius> M6 G43 (Change to radius grooving tool)
	S#<Turn_Surface_Speed> M3

    G00 X10
    G00 Z[-#<Manifold_Location>]

    #<Roughing_Radius>=[#<Manifold_Neck_Diameter>/2+#<Finishing_Cut_Depth>]
    #<X_Current>=[#<Shoulder_Diameter>/2-#<Roughing_Cut_Depth>]

    O<CircularRebateLoop> while [#<X_Current> gt #<Roughing_Radius>]

        O<CircularRebate> Call [-#<Manifold_Location>] [#<X_Current>] [#<Manifold_Radius>] [#<Grooving_Feed>]
        #<X_Current>=[#<X_Current>-#<Roughing_Cut_Depth>]
    O<CircularRebateLoop> endwhile

    O<CircularRebate> Call [-#<Manifold_Location>] [#<Roughing_Radius>] [#<Manifold_Radius>] [#<Grooving_Feed>]
    O<CircularRebate> Call [-#<Manifold_Location>] [[#<Manifold_Neck_Diameter>/2]] [#<Manifold_Radius>] [#<Grooving_Feed>]
    G90
O<Manifold_Groove> endif







O<DrillHole> if [#<HoleDiameter> GT 0]
    (DEBUG,Drill Hole Diameter #<HoleDiameter> #<HoleDepth> deep - Hit STOP or Resume) 
    G0 X25
    Z-10
    M0
    M110
O<DrillHole> endif


O<PartOff> if [#<Head_Length> GT 0]
    G40
    G0 X25
    G0 Z10

    T#<Tool_Part> M6 (Change to parting tool)
	G96 D#<Max_Spindle_Speed>  S#<Part_Surface_Speed> M3

    G1 F#<Roughing_Feed>

    G0 Z[-#<Length>] G43 H#<Tool_Part>
    G0 X[#<Stock_Radius>+#<Roughing_Cut_Depth>] 
    G1 X#<Stock_Radius> F#<Parting_Feed>
    G1 X0 
    G0 X[#<Stock_Radius>+5]

    (Change back to Cutting tool)

    T#<Tool_Turn> M6
    G1 F#<Roughing_Feed>
    G0 X25 Z50 G43 H#<Tool_Turn>
O<PartOff> endif

G49

M30

%

Please Log in or Create an account to join the conversation.

More
27 Sep 2015 10:04 #63045 by verticalperformance
OK - figured out that axis.2.joint-vel-cmd was the z axis velocity, so attached the plots

Run #1 - Testcode fragment. No visible pause on the actual machine, but a slight "blip" in the velocity plot


Run #2 Full program. Visible pause on actual machine (as observed when making real part yesterday) Velocity plot of Z drops to zero momentarily - so LinuxCNC is telling it to pause - so not a hardware issue.


Run #3 - Testcode fragment. Visible pause on actual machine as per full program - Velocity plot as per run #2


Run#4 - Testcode fragment run again. No visible pause and velocity plot similar to run #1.



So the problem is repeatable - I just have no idea of the cause! :unsure:
Thanks.

Keith.
Attachments:

Please Log in or Create an account to join the conversation.

More
27 Sep 2015 12:14 #63047 by verticalperformance
Just ran the full program on 2.6.9 using a "simmed" version of the sherline lathe on VMWare player image of Lucid, and it did not give the pause.


Upgraded to 2.7.0, commented out the loadrt probe_parport and tried the same file again on the sim - as you can see there is definitely a difference between 2.6.9 and 2.7.0


Find also attached the sim version of the sherline lathe config I'm using.

Hope this can help tweak this minor annoyance.

Oh, I have also noticed the occasional uncommanded axis move when moving the other axis - roughly of the order of magnitude of the backlash compensation - wonder if this has any relation. I suspect not much testing is done with backlash compensation values of other than zero. Related??

Cheers,

Keith
Attachments:

Please Log in or Create an account to join the conversation.

More
27 Sep 2015 19:58 #63062 by skunkworks
Could you try to get it to do it in sim-> axis -> lathe? I will try to dig into your config but I cannot get it to run here because I am not running real hardware.

I am running the full program and not seeing the pause. I also added backlash comp with no effect.

What version of linuxcnc are you using? what does it say in the window - did you update to the latest 2.7.0 or are you running a 2.7.0 pre?


Attachments:

Please Log in or Create an account to join the conversation.

More
28 Sep 2015 02:02 #63085 by verticalperformance
Went straight from 2.6.9 to 2.7.0 (not pre)
The config attached is a sim config. Should run without gardware. I run it in a virtual session using vmware player. I was quite suprised to see same blip on the physical machine and the virtual machine too. I'll have a ho with sim axis tonight.
Thanks for all the help with this.

Please Log in or Create an account to join the conversation.

More
28 Sep 2015 02:39 #63087 by skunkworks
Jeff has been goofing around with it. Could you see if setting F0 before the g33/g76 fixes the problem?

Sam

Please Log in or Create an account to join the conversation.

More
28 Sep 2015 09:58 #63105 by verticalperformance
I'll have a go when I get home, assuming I can sneak out to the shed ;) . F0 interesting thought. The test code fragment nowhere sets the feed rate using an F code, but the full version does for the prior operations. That might explain why running the test code after the full version still hiccups - the last F code is still active. Not sure why running the test code again works though.

Might also try without the G96 - I'll just set a constant spindle RPM and see if any difference.

Did you observe the flip to G17 during running of the test code BTW - or is that just me too :unsure:

As always, thanks.

Keith

Please Log in or Create an account to join the conversation.

More
28 Sep 2015 17:26 #63125 by verticalperformance
Genius! :cheer:
If I set F0 prior to G76, I just get that tiny glitch you can see in the test code, but the velocity dropping to zero goes away.
If I run the code again and set say an F100 before the G76, the pause where zvel drops to zero reappears.

I can see the same effect in the HAL-SIM-LATHE sample config - so problem identified, and temporary work around found.

Now somebody needs to dig into the code and see why it would need an F0 before invoking G76 (and I suspect the fix will be invoke a F0 internally as part of the G76 internals!)

Anybody else using G76 on 2.7.0 put an F0 in just to be sure!

Thanks a lot guys, most appreciated.

Please Log in or Create an account to join the conversation.

Time to create page: 0.190 seconds
Powered by Kunena Forum