|
<pre> |
|
</pre> |
http://wiki.linuxcnc.org/cgi-bin/emcinfo.pl?Oword |
[LinuxCNC Oword] |
It is safest to cut "air" first if you don't fully understand what will happen when you run g code.
(Following is my generic-gear.ngc:)
#1=25(number of teeth) #2=[360/#1](angle to turn chuck) #3=-.1(y clearance) #4=-.05(X start of cut) #5=2.2(X end of cut) #6=0(starting A position) #7=.7(feed rate infeed Y axis) #8=.394(depth of cut) #9=15(feed rate across X axis) G0 X#4 Y#3 G0 Z0 G0 A0 M3 S70 M8 o200 do G1 Y[#8-.04] F#7 G1 X#5 F#9 G1 Y#8 G1 X#4 F1.5 G0 Y#3 G0 X#4 #6=[#6+#2] G0 A#6 o200 while[#6 lt 359.9] M5 M9 M2Notice that it does a rough cut across then climb mills back for a finish cut. Ed
(Following is my generic-spline.ngc:)
M6 T0 G43 H0 #1=27(number of splines) #2=[360/#1](angle to turn chuck) #3=-.1(y clearance) #4=-.05(X start of spline) #5=5(X end of spline) #6=0(starting A position) #7=3(feed rate) #8=.088(depth of cut) G0 X#4 Y#3 G0 Z0 G0 A#6 M3 S200 M8 o200 do G1 Y#8 F#7 G1 X#5 G0 Y#3 G0 X#4 #6=[#6+#2] G0 A#6 o200 while[#6 lt 359.9] M5 M9 M2
similar to the gear but does all cutting in a single pass. Both are using a cutter on an arbor in a vertical spindle. Ed
(3/4-16 thread milling) G0 X0 Y0 (rapid to location) Z.1 G01 Z-1.020 F50.0 (your finish location will vary depending on conditions always start with a smaller cut until you establish exact finish location) G91 G01 X.1275 F3.0 (incremental move to finish location speeds and feeds will vary with materials being cut) G03 Z.0625 I-.1275 F4.0 (incremental 3 axis move creates right hand thread to establish Z movement divide 1 by thread pitch) ( 1 divided by 16 = .0625) G90 G01 X0 F20.0 (absolute move back to start location) G01 Z-1.020 (absolute move down to starting Z location) G91 G01 X.1275 F6.0 (incremental move to finish location) G03 Z.0625 I-.1275 F6.0 (incremental 3 axis move) G03 Z.0625 I-.1275 F10.0 (optional free pass to remove any burrs) G90 G01 X0 F20.0 (absolute move back to start location) G0 Z3.0 M2
cat 110_mill_grips.ngc % (mill grips on other side, 3/8mill=9.5mm, 12 deep) (params) #1=-15 (drill depth) #2=10 (retraction interval) #100=-12 (depth) (fixed) (speed) F80 (reset) G0 Z5 G0 X0 Y0 G4 P5 (start round) #8=0 (angle in degrees) #9=30 (angle increment in degrees) O101 while [#8 lt 360] #5=32.30 (first step and start) #6=31.00 (second step) #7=35 (safe circle) (first step) G0 Z1 G0 X[#5 * cos] Y[#5 * sin] G1 Z[#100 + 0.06] G1 X[#7 * cos] Y[#7 * sin] (second step) G0 Z1 G0 X[#6 * cos] Y[#6 * sin] G1 Z#100 G1 X[#7 * cos] Y[#7 * sin] (increment angle) #8=[#8 + #9] (wait) (M0) O101 endwhile (end) G0 Z5 G0 X1 Y-1 G1 X0 Y0 G0 Z20 %
(simple turning) (#100 = max Z = start Z > #101) (#101 = min Z) (#200 = max X = start X > #201) (#201 = min X) (#300 = feed) (#400 = stepsize) (Z) #100 = 200 #101 = 0 (X) #200 = 17 #201 = 14 (FEED) #300 = 120 (STEP) #400 = 1 (END OF PARAMETERS) (set feed) F#300 (set current X) #250 = #200 O501 while [#250 gt #201] #250 = [#250 - #400] O502 if [#250 lt #201] #250 = O502 endif (goto start point, safety x 1mm) G0 X[#250 + #400 + 1] G0 Z#100 G0 X#250 G1 F#300 Z#101 O501 endwhile (retract to orig X) (END) G0 X[#200 + 1] M2
% (Author: Kenneth Lerman) (compute the intersection of two lines) (<x1,y1> - <x2,y2> and <x3,y3> - <x4,y4>) (returns: #<_xi> #<_yi>) (#<_status> is 0 if OK) (#<_status> is 1 if intersection is outside of one or both segments) (#<_status> is 2 if lines are parallel) (#<_status> is 3 if lines are coincident) o<intersect> sub #<x1> = #1 #<y1> = #2 #<x2> = #3 #<y2> = #4 #<x3> = #5 #<y3> = #6 #<x4> = #7 #<y4> = #8 ;(print, intersect <#1,#2><#3,#4> <#5,#6><#7,#8>) #<denom> = [[#<y4>-#<y3>]*[#<x2>-#<x1>]-[#<x4>-#<x3>]*[#<y2>-#<y1>]] #<uaNum> = [[#<x4>-#<x3>]*[#<y1>-#<y3>]-[#<y4>-#<y3>]*[#<x1>-#<x3>]] #<ubNum> = [[#<x2>-#<x1>]*[#<y1>-#<y3>]-[#<y2>-#<y1>]*[#<x1>-#<x3>]] o<t> if [#<denom> EQ 0] #<_status> = 2 o<tt> if [#<uaNum> EQ 0 AND #<ubNum> EQ 0] #<_status> = 3 ;(print, "Colinear lines") o<tt> endif o<intersect> return o<t> endif #<ua> = [#<uaNum>/#<denom>] #<ub> = [#<ubNum>/#<denom>] #<_xi> = [#<x1>+#<ua>*[#<x2>-#<x1>]] #<_yi> = [#<y1>+#<ua>*[#<y2>-#<y1>]] #<_status> = 0 (test for failure conditions) o<t1> if[[#<ua> LT 0] OR [#<ua> GT 1]] #<_status> = 1 o<t1> endif o<t2> if[[#<ub> LT 0] OR [#<ub> GT 1]] #<_status> = 1 o<t2> endif o<intersect> endsub (Given three points defining non-collinear line segments and given a radius) (Convert them to two line segments with an arc connecting them) (Input args in order: x0,y0 x1,y1 x2,y2 r -- x1,y1 is the common point) (Output: _xa,_ya,_xb,_yb, _status) (Where: x0,y0 _xa,_ya define the 1st segment and _xb,_yb x2,y2 define the 2nd) (_status = 0 for OK, _status = 1 for error -- usually radius too large) o<linearc> sub #<x0> = #1 #<y0> = #2 #<x1> = #3 #<y1> = #4 #<x2> = #5 #<y2> = #6 #<R> = #7 ;(print, linearc <#<x0>,#<y0>> <#<x1>,#<y1>> <#<x2>,#<y2>> R #<R>) (The A's correspond to the first line; the B's to the second) (compute the normalized vectors) #<dxA> = [#<x0>-#<x1>] #<dyA> = [#<y0>-#<y1>] #<normA> = [sqrt[#<dxA>**2+#<dyA>**2]] #<NdxA> = [#<dxA>/#<normA>] #<NdyA> = [#<dyA>/#<normA>] (compute the first parallel line offset by R) #<Rx0A_1> = [#<x0>+#<R>*#<NdyA>] #<Ry0A_1> = [#<y0>-#<R>*#<NdxA>] #<Rx1A_1> = [#<x1>+#<R>*#<NdyA>] #<Ry1A_1> = [#<y1>-#<R>*#<NdxA>] ;(print, --1-- <#<Rx0A_1>,#<Ry0A_1>> <#<Rx1A_1>,#<Ry1A_1>>) (compute the second parallel line offset by R) #<Rx0A_2> = [#<x0>-#<R>*#<NdyA>] #<Ry0A_2> = [#<y0>+#<R>*#<NdxA>] #<Rx1A_2> = [#<x1>-#<R>*#<NdyA>] #<Ry1A_2> = [#<y1>+#<R>*#<NdxA>] ;(print, --2-- <#<Rx0A_2>,#<Ry0A_2>> <#<Rx1A_2>,#<Ry1A_2>>) (now do the same for the second line) (compute the normalized vectors) #<dxB> = [#<x2>-#<x1>] #<dyB> = [#<y2>-#<y1>] #<normB> = [sqrt[#<dxB>**2+#<dyB>**2]] #<NdxB> = [#<dxB>/#<normB>] #<NdyB> = [#<dyB>/#<normB>] (compute the first parallel line offset by R) #<Rx2B_1> = [#<x2>+#<R>*#<NdyB>] #<Ry2B_1> = [#<y2>-#<R>*#<NdxB>] #<Rx1B_1> = [#<x1>+#<R>*#<NdyB>] #<Ry1B_1> = [#<y1>-#<R>*#<NdxB>] (compute the second parallel line offset by R) #<Rx2B_2> = [#<x2>-#<R>*#<NdyB>] #<Ry2B_2> = [#<y2>+#<R>*#<NdxB>] #<Rx1B_2> = [#<x1>-#<R>*#<NdyB>] #<Ry1B_2> = [#<y1>+#<R>*#<NdxB>] (now find a pair of line segments that intersect within the segments) o<loop> do (we do not really loop -- this is so we can break) o<intersect> call [#<Rx0A_1>][#<Ry0A_1>][#<Rx1A_1>][#<Ry1A_1>] [#<Rx2B_1>] [#<Ry2B_1>][#<Rx1B_1>][#<Ry1B_1>] o<t1> if [#<_status> EQ 0] ;(print,1: x=#<_xi> y=#<_yi> status=#<_status>) (now move the intersection back to the lines) #<_xa> = [#<_xi>-#<R>*#<NdyA>] #<_ya> = [#<_yi>+#<R>*#<NdxA>] #<_xb> = [#<_xi>-#<R>*#<NdyB>] #<_yb> = [#<_yi>+#<R>*#<NdxB>] o<loop> break o<t1> endif o<intersect> call [#<Rx0A_2>][#<Ry0A_2>][#<Rx1A_2>][#<Ry1A_2>] [#<Rx2B_1>] [#<Ry2B_1>][#<Rx1B_1>][#<Ry1B_1>] o<t2> if [#<_status> EQ 0] ;(print,2: x=#<_xi> y=#<_yi> status=#<_status>) (now move the intersection back to the lines) #<_xa> = [#<_xi>+#<R>*#<NdyA>] #<_ya> = [#<_yi>-#<R>*#<NdxA>] #<_xb> = [#<_xi>-#<R>*#<NdyB>] #<_yb> = [#<_yi>+#<R>*#<NdxB>] o<loop> break o<t2> endif o<intersect> call [#<Rx0A_1>][#<Ry0A_1>][#<Rx1A_1>][#<Ry1A_1>] [#<Rx2B_2>] [#<Ry2B_2>][#<Rx1B_2>][#<Ry1B_2>] o<t3> if [#<_status> EQ 0] ;(print,3: x=#<_xi> y=#<_yi> status=#<_status>) (now move the intersection back to the lines) #<_xa> = [#<_xi>-#<R>*#<NdyA>] #<_ya> = [#<_yi>+#<R>*#<NdxA>] #<_xb> = [#<_xi>+#<R>*#<NdyB>] #<_yb> = [#<_yi>-#<R>*#<NdxB>] o<loop> break o<t3> endif o<intersect> call [#<Rx0A_2>][#<Ry0A_2>][#<Rx1A_2>][#<Ry1A_2>] [#<Rx2B_2>] [#<Ry2B_2>][#<Rx1B_2>][#<Ry1B_2>] o<t4> if [#<_status> EQ 0] ;(print,4: x=#<_xi> y=#<_yi> status=#<_status>) (now move the intersection back to the lines) #<_xa> = [#<_xi>+#<R>*#<NdyA>] #<_ya> = [#<_yi>-#<R>*#<NdxA>] #<_xb> = [#<_xi>+#<R>*#<NdyB>] #<_yb> = [#<_yi>-#<R>*#<NdxB>] o<loop> break o<t4> endif (if we get here, we failed) #<_status> = 1 ;(print, failed) o<linearc> return o<loop> while [0] (the loop is a fake so we can break out) (no need check that target point is within lines) (if the intersection of the offset lines was OK, the translated one is too) #<_status> = 0 o<linearc> endsub o<drawlines> sub o<linearc> call [#1][#2][#3][#4][#5][#6][#7] (print, _xa=#<_xa> ya=#<_ya> xb=#<_xb> yb=#<_yb>) g0 x#1 y#2 g1 f1 x#<_xa> y#<_ya> g3 r#7 x#<_xb> y#<_yb> g1 x#5 y#6 o<drawlines> endsub ;o<drawlines> call [0][5] [0][0] [5][0] [1] ;o<drawlines> call [0][5] [0][0] [5][0] [3] ;o<drawlines> call [0][5] [0][0] [5][0] [5] ;o<drawlines> call [0][5] [0][0] [5][0] [7] ;o<drawlines> call [5][5] [0][0] [5][0] [1] (print, ====================) ;o<intersect> call [0][0] [0][5] [0][0] [5][0] ;(print, x=#<_xi> y=#<_yi> status=#<_status>) ;o<intersect> call [0][-5] [0][5] [-5][0] [5][0] ;(print, x=#<_xi> y=#<_yi> status=#<_status>) ;o<intersect> call [-5][-5] [5][5] [-5][2] [5][2] ;(print, x=#<_xi> y=#<_yi> status=#<_status>) ;o<intersect> call [5][5] [-5][-5] [-5][2] [5][2] ;(print, x=#<_xi> y=#<_yi> status=#<_status>) ;o<intersect> call [-5][-5] [5][5] [-5][2] [10][20] ;(print, x=#<_xi> y=#<_yi> status=#<_status>) (Cut a ratchet) (Assumes center is at zero, zero) (Assumes tool is at working depth and does not change Z) (First tooth is at top -- max Y) (Starting point is at above peak of first tooth and to left by at least toolD) (End point will be in same general area) o<ratchet> sub #<id> = #1 #<od> = #2 #<N> = #3 #<toolD> = #4 #<gulletR> = #5 #<peakR> = #6 #<feed> = #<_feed> #<ir> = [#<id>/2] #<or> = [#<od>/2] #<delta> = [360/#<N>] #<currA> = 0 (current angle) g41.1 d#<toolD> (stay to left side) g1 f#<feed> x0 y#<or> #<x1> = [#<or> * sin[#<currA>]] #<y1> = [#<or> * cos[#<currA>]] o<loop> while [#<currA> LT 360] #<currA> = [#<currA> + #<delta>] #<x2> = [#<ir> * sin[#<currA>]] #<y2> = [#<ir> * cos[#<currA>]] #<x3> = [#<or> * sin[#<currA>]] #<y3> = [#<or> * cos[#<currA>]] o<linearc> call [#<x1>][#<y1>] [#<x2>][#<y2>] [#<x3>][#<y3>] [#<gulletR>] o<t1> if [#<_status> NE 0] (print, status NE 0) o<ratchet> return o<t1> endif g1 f#<feed> x#<_xa> y#<_ya> g3 f#<feed> r#<gulletR> x#<_xb> y#<_yb> #<x1> = #<x2> #<y1> = #<y2> #<x2> = #<x3> #<y2> = #<y3> #<x3> = [#<ir> * sin[#<currA>+#<delta>]] #<y3> = [#<ir> * cos[#<currA>+#<delta>]] o<linearc> call [#<x1>][#<y1>] [#<x2>][#<y2>] [#<x3>][#<y3>] [#<peakR>] o<t2> if [#<_status> NE 0] o<ratchet> return o<t2> endif g1 f#<feed> x#<_xa> y#<_ya> g2 f#<feed> r#<peakR> x#<_xb> y#<_yb> (we are now at the head of the next angle) #<x1> = #<x2> #<y1> = #<y2> #<x2> = #<x3> #<y2> = #<y3> o<loop> endwhile o<ratchet> endsub #<_feed> = 5.0 g40 (cutter comp off) ;g54 ;g1 f#<_feed> x0 y0 g1 f#<_feed> y[[5.0/2]+[2*.250]] x[0-[2*.250]] o<ratchet> call [4.0][5.0][12][.250][.126][.0625] m2 %