Jump to content

Welcome to eMastercam

Register now to participate in the forums, access the download area, buy Mastercam training materials, post processors and more. This message will be removed once you have signed in.

Use your display name or email address to sign in:

Recommended Posts

  • 3 weeks later...
Interested in how to create a contour ramp

%

O1111

( T470 | 10. FLAT ENDMILL )

G21

G0 G17 G40 G49 G80 G90

T470 M6

G0 G90 G54 X-40. Y20. S1900 M3

G43 H470 Z1.

G1 Z0. F190.9

G41 D470 Y15. F381.8

X-25.

X30. Z-.357

Y-15. Z-.5

X-30. Z-.857

Y15. Z-1.

X30. Z-1.357

Y-15. Z-1.5

X-30. Z-1.857

Y15. Z-2.

X30. Z-2.357

Y-15. Z-2.5

X-30. Z-2.857

Y15. Z-3.

X30. Z-3.357

Y-15. Z-3.5

X-30. Z-3.857

Y15. Z-4.

X30. Z-4.357

Y-15. Z-4.5

X-30. Z-4.857

Y15. Z-5.

X30.

Y-15.

X-30.

Y25.

G40 X-35.

G0 Z1.

M5

G91 G28 Z0.

G28 Y0.

M30

%

Link to comment
Share on other sites

 

Interested in how to create a contour ramp
%
O1111
( T470 | 10. FLAT ENDMILL )
G21
G0 G17 G40 G49 G80 G90
T470 M6
G0 G90 G54 X-40. Y20. S1900 M3
G43 H470 Z1.
G1 Z0. F190.9
G41 D470 Y15. F381.8
X-25.
X30. Z-.357
Y-15. Z-.5
X-30. Z-.857
Y15. Z-1.
X30. Z-1.357
Y-15. Z-1.5
X-30. Z-1.857
Y15. Z-2.
X30. Z-2.357
Y-15. Z-2.5
X-30. Z-2.857
Y15. Z-3.
X30. Z-3.357
Y-15. Z-3.5
X-30. Z-3.857
Y15. Z-4.
X30. Z-4.357
Y-15. Z-4.5
X-30. Z-4.857
Y15. Z-5.
X30.
Y-15.
X-30.
Y25.
G40 X-35.
G0 Z1.
M5
G91 G28 Z0.
G28 Y0.
M30
%

 

Give this a try. Thanks for the idea. James

 

O6006(CONTOUR RAMP)

(OUTSIDE PROFILE SQUARE/RECT. PART)

(UNPROVEN)

(FORMAT G65/G66 XYHVQTRZEF)

(X = #24 - X DIMENSION)

(Y = #25 - Y DIMENSION)

(H = #11 - STOCK HORIZONTAL -X-)

(V = #22 - STOCK VERTICAL -Y-)

(Q = #17 - RAMP IN Z/ DOC)

(T = #20 - TOOL DIAMETER)

(R = #18 - R PLANE)

(Z = #26 - Z START ZERO)

(E = #8  - END Z)

(F = #9  - FEEDRATE)

(*********************************)

#100=ABS[#26]-ABS[#8]

#100=ABS[#100]

IF[[#26*#8]GE0]GOTO1

#100=ABS[#26]+ABS[#8]

N1#101=ROUND[#100/#17]

#102=#100/#101

IF[#102GT[#100/2]]GOTO1000

#103=#5001

(CLEARANCE X)

#104=[#103-.1]-[[#20/2]+[#11/2]]

#105=#5002

(CLEARANCE Y)

#106=[#105+.1]+[[#20/2]+[#22/2]]

(CALCULATE START/STOP POINTS)

(X-)

#110=#103-[[#20/2]+[#24/2]]

(Y+)

#111=#105+[[#20/2]+[#25/2]]

(X+)

#112=#103+[[#20/2]+[#24/2]]

(Y-)

#113=#105-[[#20/2]+[#25/2]]

(RAPID TO CLEARANCE POSTION)

G0G90X#104Y#106

Z[#26+.1]

G1Z#26F#9

#120=#5003

#120=#120-#102

G41X#110Y#111

N10

G1G90X#112Z#120

#120=#120-#102

#101=#101-1.

(X+Y+)

IF[#101EQ0]GOTO100

Y#113Z#120

#120=#120-#102

#101=#101-1.

(X+Y-)

IF[#101EQ0]GOTO200

X#110Z#120

#120=#120-#102

#101=#101-1.

(X-Y-)

IF[#101EQ0]GOTO300

Y#111Z#120

#120=#120-#102

#101=#101-1.

(X-Y+)

IF[#101EQ0]GOTO400

GOTO10

N100

Y#113

X#110

Y#111

X#112

GOTO500

N200

X#110

Y#111

X#112

Y#113

GOTO500

N300

Y#111

X#112

Y#113

X#110

GOTO500

N400

X#112

Y#113

X#110

Y#111

N500

G0G90Z#18

G40X#103Y#105

M99

N1000#3000= 1( Q VALUE TOO BIG )

Link to comment
Share on other sites
  • 4 weeks later...

Hi guys I ran this macro program to do an internal keyway (broaching) in a CNC Lathe.

 

 

O0001
G0G28U0W0
G0G28H0
M68
G0T0101
M98P0002
G0G54Z.100X#502
N100 (YOU CAN LOSE THIS)
WHILE[#503LT#500]DO1
G0X#503M8
G1G98Z-.770F250.0
G0X#502
G0Z.100
#503=#503+#501
END1
G0G28U0W0M09
M69
M30




O0002
(SUB FOR MACRO VARIBLE)
#500=1.220(KEYWAY DEPTH)
#501=.002(DEPTH OF CUT)
#502=.950(BORE SIZE)
#503=.958(START REFERENCE POINT)
M99
%

  • Like 1
Link to comment
Share on other sites

Hi guys I ran this macro program to do an internal keyway (broaching) in a CNC Lathe.

 

 

O0001

G0G28U0W0

G0G28H0

M68

G0T0101

M98P0002

G0G54Z.100X#502

N100 (YOU CAN LOSE THIS)

WHILE[#503LT#500]DO1

G0X#503M8

G1G98Z-.770F250.0

G0X#502

G0Z.100

#503=#503+#501

END1

G0G28U0W0M09

M69

M30

 

 

 

 

O0002

(SUB FOR MACRO VARIBLE)

#500=1.220(KEYWAY DEPTH)

#501=.002(DEPTH OF CUT)

#502=.950(BORE SIZE)

#503=.958(START REFERENCE POINT)

M99

%

It's pretty cool to see how others write their macro programs. Thank you for sharing this. James.

Link to comment
Share on other sites
  • 1 month later...

Alright. My experience lies primarily in diamond turning rather than milling but here is my stab at a pocket with a programmable corner radius and an inside radius between the wall and the floor. I wrote this in an attempt to help someone upon request. I know I could have handled the variable inputs a bit better as they are somewhat cluttered and illogically named and I am still debugging the program and checking to ensure all of the inputs are valid. The pocket is intended to be machined with an endmill rather than a ball endmill as that is what was the guy requested. If any of you awesome milling guys, or macro guru's have NCplot and wouldn't mind giving me a little feedback on technique I'd greatly appreciate it. Things like safety features, possible better entry and exit strategies, better way to handle cut depth or feedrate etc. I'd hate to injure someone with bad code. I usually run my own programs so it isn't an issue and those programs are usually main programs rather than macro type programs. I based the general layout on some of the nice macros that cncchipmaker has posted, gotta give credit where it is due. 

G90 G17 G71 G40
G01 X0 Y0 Z1 F500
G65 P0001 A0.1 B0.06 C0.01 D0.8 E60. F0.004 H4. J0.05 K1.0 L26000 M0.002 N2. Q6. M.005 R1. S20000 T2.0 U0.5 V0.05 W0.4 X15. Y9. Z0.     
M99
 
O0001(INSIDE POCKETING MACRO)
(START @ X0 Y0 Z0 (CENTER OF POCKET)
(FORMAT G65 ABCDFHJKMNQRSTUVWXYZ)

(THE PROGRAM WILL OPERATE @ 60% FEEDRATE WHEN RAMPING TO DEPTH.
(MIGHT
 
(A = #1  - LEADIN/OUT ARC RADII
(B = #2  - STEP OVER, FINISH FLOOR
(C = #3  - FINISH ALLOWANCE
(D = #7  - TOOL DIAMETER
(E = #8  - PLUNGE FEEDRATE
(F = #9  - CHIPLOAD PER TOOTH, ROUGH
(H = #11 - TOTAL POCKET DEPTH
(J = #5  - MAX DEPTH PER PASS WHEN MACHINING THE RADIUS
(K = #6  - CORNER RADII, FLOOR
(L = #12 - SPINDLE RPM, FINISHING
(M = #13 - CHIPLOAD PER TOOTH, FINISH
(N = #14 - # OF TEETH
(Q = #17 - MAX RAMP ANGLE
(R = #18 - R PLANE
(S = #19 - SPINDLE RPM, ROUGHING
(T = #20 - CORNER RADII, WALL
(U = #21 - STEP OVER, ROUGHING
(V = #22 - STEP OVER, FLOOR CORNER RADII
(W = #23 - MAX DEPTH OF CUT (Z) 
(X = #24 - POCKET WIDTH  -X- DIM.
(Y = #25 - POCKET LENGTH -Y- DIM.
(Z = #26 - Z START ZERO -- OPTIONAL)
 
(*********************************)

#109=#4001	(RECORD CURRENT G-CODE MODAL GROUP 1 G01/G02/G03/G33
#110=#4002	(RECORD CURRENT G-CODE MODAL GROUP 2 G17/G18/G19
#111=#4003	(RECORD CURRENT G-CODE MODAL GROUP 3 G90/G91

G17 G90

(CHECKING FOR FAULTY INPUT, TOOL INTERFERENCE ETC
IF[#1EQ#0] THEN #3000=1       (A, CANNOT BE BLANK)
IF[#2EQ#0] THEN #3000=2       (B, CANNOT BE BLANK)
IF[#3EQ#0] THEN #3000=3       (C, CANNOT BE BLANK)
IF[#7EQ#0] THEN #3000=4       (D, CANNOT BE BLANK)
IF[#7LE0] THEN #3000=4	   (D, CANNOT BE ZERO)
IF[#8EQ#0] THEN #3000=4	   (E, CANNOT BE BLANK)
IF[#9EQ#0] THEN #3000=5       (F, CANNOT BE BLANK)
IF[#11EQ#0] THEN #3000=6      (H, CANNOT BE BLANK)
IF[#5EQ#0] THEN #3000=7       (J, CANNOT BE BLANK)
IF[#6EQ#0] THEN #3000=8       (K, CANNOT BE BLANK)
IF[#13EQ#0] THEN #3000=9      (M, CANNOT BE BLANK)
IF[#14EQ#0] THEN #3000=10      (N, CANNOT BE BLANK)
IF[#17EQ#0] THEN #3000=11     (Q, CANNOT BE BLANK)
IF[#18EQ#0] THEN #3000=12     (R, CANNOT BE BLANK)
IF[#19EQ#0] THEN #3000=13     (S, CANNOT BE BLANK)
IF[#20EQ#0] THEN #3000=14     (T, CANNOT BE BLANK)
IF[#21EQ#0] THEN #3000=15     (U, CANNOT BE BLANK)
IF[#22EQ#0] THEN #3000=16     (V, CANNOT BE BLANK)
IF[#23EQ#0] THEN #3000=17     (W, CANNOT BE BLANK)
IF[#24EQ#0] THEN #3000=18     (X, CANNOT BE BLANK)
IF[#25EQ#0] THEN #3000=19     (Y, CANNOT BE BLANK)
IF[#26EQ#0] THEN #26=0.
IF[#7GT#20] THEN #3000=21     (TOOL RADIUS (D/2) CANNOT BE LARGER THAN THE INTERNAL CORNER RADIUS (T))
IF[#7GT#20-#6] THEN #3000=21  (TOOL RADIUS (D/2) CANNOT BE LARGER THAN THE CORNER RADIUS MINUS THE FLOOR RADIUS
IF[#7GT#24] THEN #3000=22     (TOOL IS TOO LARGE FOR THE POCKET
IF[#7GT#25] THEN #3000=23     (TOOL IS TOO LARGE FOR THE POCKET
IF[#1GT[#24/2-[#20+#3]]] THEN #3000=24	(LEADIN/OUT ARC (A) IS TOO LARGE
IF[#1GT[#25/2-[#20+#3]]] THEN #3000=25	(LEADIN/OUT ARC (A) IS TOO LARGE
(IF[#21GT#7] THEN #3006=26	(ROUGH STEPOVER (U) IS LARGER THAN THE TOOL DIAMETER (D))
(IF[#22GT#7] THEN #3006=27	(FINISH STEPOVER (V) IS LARGER THAN THE TOOL DIAMETER (D))

(CONVERT TO RADIUS VALUES
#7=#7/2
#17=TAN[#17]*[#7*0.8*2]
#599=#17
#24=#24/2
#25=#25/2
 
(FORCE ABSOLUTE VALUE FOR R-PLANE
#18=ABS[#18]
 
M4S[#19]
 
(GOTO 150
(GOTO 100
(GOTO 50
 
(MACHINING CYCLE PRIOR TO THE BOTTOM RADII
(CALCULATED AMOUNT TO REMOVE IN Z MINUS THE RADIUS AT THE BOTTOM

#30=#11-#6-#3 (CALCULATED AMOUNT OF MATERIAL TO REMOVE BETWEEN THE TOP OF THE FLOOR RADIUS AND THE TOP OF THE CAVITY
#31=#30	  (CALCULATED DEPTH OF CUT
#32=1		 (CALCULATED NUMBER OF CUTS
WHILE[#31GT#23]DO1
#32=#32+1
#31=#30/#32
END1
#33=0		(CUT COUNTER
(AMOUNT TO REMOVE PER PECK CYCLE
#130=#31	(AMOUNT OF MATERIAL TO REMOVE PER ROUGHING PASS
#131=#130	(CALCULATED DEPTH PER HELIX
#132=1		(CALCULATED NUMBER OF HELICAL ROTATIONS IN ORDER TO REACH CUT DEPTH
WHILE[#131GT#17]DO1
#132=#132+1
#131=#130/#132
END1
#133=0		(HELICAL CUT COUNTER
#27=#131/360	(HELICAL Z DEPTH PER DEGREE 
#28=0		(HELICAL ANGULAR COUNTER
G01 X[#7*0.8] F[#8]	(MOVE OVER 80% OF THE TOOL RADIUS IN X IN PREPARATION FOR THE HELICAL ENTRY CYCLE
#590=#31

WHILE[#33LT#32]DO1	(OUTSIDE LOOP: KEEPING TRACK OF TOTAL DEPTH
WHILE[#133LT#132]DO2	(MIDDLE LOOP: FOR CALCULATING AND MACHINING THE EACH DEPTH PASS
WHILE[#28LE360]DO3	(INNER LOOP: FOR MACHINING EACH ITERATION OF THE HELICAL ENTRY PASSES
IF[[#133GE[#132-1]]AND[#28GT351]] GOTO 1
#10=[#9*#14*#19]*0.6
IF[[#28EQ0]AND[#133LT1]] THEN #10=#8
G01 X[COS[#28]*[#7*0.8]] Y[SIN[#28]*[#7*0.8]] Z[#26-#27*#28-#27*360*#133-#27*360*#132*#33]F[#10]
N1
#28=#28+9
END3
IF[#133LE[#132-2]]GOTO 2
G91
G02 X[ABS[SIN[351]*[#7*0.8]]] Y[ABS[SIN[351]*[#7*0.8]]] Z[-#27*9]R[ABS[SIN[351-9/2]*[#7*0.8]]]
G90
N2
#28=0
#133=#133+1
END2

(CALCULATE THE NUMBER OF PASSES AND DOC ONCE THE TOOL HAS REACHED CUTTING DEPTH
#135=#25-#7-#3
#136=#135
#137=1
WHILE[#136GT#21]DO2		
#137=#137+1
#136=#135/#137
END2
#138=1
#115=[#20-#7]/#137
G01 X[#24-#3-#7] F[#9*#14*#19]

(ONCE TO DEPTH THIS LOOP WILL MACHINE TO THE OUTSIDE EDGES OF THE POCKET IN AN EXPANDING		
(RECTILINEAR LOOP
WHILE[#138LE#137]DO2	
G01 Y[#138*#136-#115*#138]
G03 X[#24-#3-#7-#115*#138] Y[#138*#136] R[#115*#138]
G01 X[-#24+#3+#115*#138+#7]
G03 X[-#24+#3+#7] Y[#138*#136-#115*#138] R[#115*#138]
G01 Y[-#138*#136+#115*#138]
G03 X[-#24+#3+#7+#115*#138] Y[-#138*#136] R[#115*#138]
G01 X[#24-#3-#7-#115*#138]
G03 X[#24-#3-#7] Y[-#138*#136+#115*#138] R[#115*#138]

(IF NOT THE LAST PASS THEN SKIP THE WALL SCALLOP REMOVAL MOVE
IF[#138NE#137] GOTO 5
G01 Y#1
N5
#138=#138+1
END2
G91
G03 X[-#1] Y[#1] R[#1]
G90
G01 X[-#24+#3+#7+#1]
G91
G03 X[-#1] Y[-#1] R[#1]
G03 X[#1] Y[-#1] R[#1]
G90
G01 X0
G00X[#7*0.8]Y0Z[#26+#18]
#138=1
#133=0
#33=#33+1
END1

N50
(MACHINING THE RADIUS BETWEEN THE FLOOR AND THE WALL

(CALCULATED AMOUNT TO REMOVE IN Z WHILE MACHINING
(THE RADIUS AT THE BOTTOM OF THE POCKET
#30=#6
#31=#30
#32=1
WHILE[#31GT#5]DO1
#32=#32+1
#31=#30/#32
END1
#33=0
#114=[#6-#3]/#32
 
(AMOUNT TO REMOVE PER PECK CYCLE
#130=#31
#131=#130
#132=1
WHILE[#131GT#17]DO1
#132=#132+1
#131=#130/#132
END1
#133=0
#27=#131/360
#28=0
WHILE[#33LT#32]DO1
#112=#6-#3
IF[[[#6-#3]*[#6-#3]-[[#31*[#33+1]]*[#31*[#33+1]]]]GT0] THEN #112=[#6-#3]-SQRT[[#6-#3]*[#6-#3]-[[#31*[#33+1]]*[#31*[#33+1]]]]

 
(PECK TO DEPTH THEN MACHINE THE 'RECTANGLE'
WHILE[#133LT#132]DO2
WHILE[#28LE360]DO3
IF[[#133GE[#132-1]]AND[#28GT351]] GOTO 51
#10=[#9*#14*#19]*0.6
IF[[#28EQ0]AND[#133LT1]] THEN #10=#8
G01 X[COS[#28]*[#7*0.8]] Y[SIN[#28]*[#7*0.8]] Z[#26-#11+#6+#3-#27*#28-#27*360*#133-#27*360*#132*#33]F[#10]
N51
#28=#28+9
(G01 X[COS[#28]*[#7*0.8]] Y[SIN[#28]*[#7*0.8]] Z[#26-#11+#6+#3-#27*#28-#27*360*#133-#27*360*#132*#33]F[#9*#14*#19]
(#28=#28+9
END3
#28=0
#133=#133+1
END2

IF[#133LE[#132-2]]GOTO 52
G91
G02 X[ABS[SIN[351]*[#7*0.8]]] Y[ABS[SIN[351]*[#7*0.8]]] Z[-#27*9]R[ABS[SIN[351-9/2]*[#7*0.8]]]
G90
N52

#135=#25-#7-#3-#112
#136=#135
#137=1
WHILE[#136GT#21]DO2
#137=#137+1
#136=#135/#137
END2
#138=1
#115=[#20-#7]/#137
 
G01 X[#24-#3-#7-#112] F[#9*#14*#19]
 
WHILE[#138LE#137]DO2
#117=0
(IF[#138GE#137] THEN #117=#114*#33
G01 Y[#138*#136-#115*#138+#117]
G03 X[#24-#3-#7-#115*#138-#112+#117] Y[#138*#136] R[#115*#138-#117]
G01 X[-#24+#3+#115*#138+#7+#112-#117]
G03 X[-#24+#3+#7+#112] Y[#138*#136-#115*#138+#117] R[#115*#138-#117]
G01 Y[-#138*#136+#115*#138-#117]
G03 X[-#24+#3+#7+#115*#138+#112-#117] Y[-#138*#136] R[#115*#138-#117]
G01 X[#24-#3-#7-#115*#138-#112+#117]
G03 X[#24-#3-#7-#112] Y[-#138*#136+#115*#138-#117] R[#115*#138-#117]
G01 Y[-#1]
#138=#138+1
END2
G91
G03 X[-#1] Y[#1] R[#1]
G90
G01 X[-#24+#3+#7+#112+#1]
G91
G03 X[-#1] Y[-#1] R[#1]
G03 X[#1] Y[-#1] R[#1]
G90
G00X[#7*0.8]Y-#3 Z[#26+#18]
#138=1
#133=0
#33=#33+1
END1

N100
M4S[#12]
G01 X[#24-#7-#3-#1] Z[#26-#11+#6] F[#13*#14*#19]
(FINISH PASS
G03 X[#24-#7] Y[#1] R[#1+#3] F[#13*#14*#12]
G01 Y[#25-#20]
G03 X[#24-#20] Y[#25-#7] R[#20-#7]
G01 X[-#24+#20]
G03 X[-#24+#7] Y[#25-#20] R[#20-#7]
G01 Y[-#25+#20]
G03 X[-#24+#20] Y[-#25+#7] R[#20-#7]
G01 X[#24-#20]
G03 X[#24-#7] Y[-#25+#20] R[#20-#7]
G01 Y[#1+0.02]
Y0
 
#30=#6
#31=#30
#32=0
WHILE[#31GT#22]DO1
#32=#32+1
#31=#30/#32
END1
#33=1
 
WHILE[#33LE#32]DO1
#112=#6
IF[[#6*#6-[[#31*#33]*[#31*#33]]]GT0] THEN #112=#6-SQRT[#6*#6-[[#31*#33]*[#31*#33]]]
#134=#20-#112
G18
G03 X[#24-#7-#112] Z[#26-#11+#6-#31*#33] R[#6]
G17
G01 Y[#25-#134-#112-0.0001]
G03 X[#24-#134-#112-0.0001] Y[#25-#7-#112] R[#134-#7+0.0001]
G01 X[-#24+#134+#112+0.0001]
G03 X[-#24+#7+#112] Y[#25-#134-#112-0.0001] R[#134-#7+0.0001]
G01 Y[-#25+#134+#112+0.0001]
G03 X[-#24+#134+#112+0.0001] Y[-#25+#7+#112] R[#134-#7+0.0001]
G01 X[#24-#134-#112-0.0001]
G03 X[#24-#7-#112] Y[-#25+#134+#112+0.0001] R[#134-#7+0.0001]
G01 Y0.02
Y0
#33=#33+1
END1
 
N150
(FINISH THE FLOOR
#135=#25-#7-#6
#136=#135
#137=1
WHILE[#136GT#2]DO1
#137=#137+1
#136=#135/#137
END1
#138=1
#115=[#20-#6-#7]/#137
G01 X[#24-#6-#7-[#115*#138+0.0001]]
WHILE[#138LE#137]DO1
IF[#138GT1] GOTO 152
G03 X[#24-#6-#7] Y[#115*#138+0.0001] R[#115*#138+0.0001]
N152
G01 Y[#138*#136-#115*#138-0.0001]
G03 X[#24-#6-#7-#115*#138-0.0001] Y[#138*#136] R[#115*#138+0.0001]
G01 X[-#24+#6+#115*#138+#7+0.0001]
G03 X[-#24+#6+#7] Y[#138*#136-#115*#138-0.0001] R[#115*#138+0.0001]
G01 Y[-#138*#136+#115*#138-0.0001]
G03 X[-#24+#6+#7+#115*#138+0.0001] Y[-#138*#136] R[#115*#138+0.0001]
G01 X[#24-#6-#7-#115*#138-0.0001]
G03 X[#24-#6-#7] Y[-#138*#136+#115*#138+0.0001] R[#115*#138+.001]
G01 Y0
#138=#138+1
END1
Y#1
G91
G03 X[-#1] Y[#1] R[#1]
G90
G01 X[-#24+#6+#7+#1] Y[#1+#1]
G91
G03 X[-#1] Y[-#1] R[#1]
G03 X[#1] Y[-#1] R[#1]
G90
(G01 X[#24-#6-#7-#1]
G01 X0
G00 X0 Y0 Z1

(RESET MODAL G-CODES BACK TO THEIR ORIGINAL VALUES
G[#109]G[#110]G[#111]
M99

Pocket Macro

Link to comment
Share on other sites

Great idea. More descriptive comments wouldn't hurt. Especially if someone besides me will be running the code. I find the idea of using a macro as a custom drill cycle intriguing.  I'll read up on that. Thanks guys.   :cheers:

Link to comment
Share on other sites
  • 1 month later...

Recently, I feel like I have been wasting my time with this macro stuff. I mean lets face it the CAD/CAM available now allows you to do pretty much whatever you want and not too many people even understand the concept, so it just makes it difficult to teach to others.

 

I really think it depends on the application. Having a firm understanding of Macro B means you can more easily understand Probing Cycles, or any other function that uses a G65/G66 Macro Call. Plus, there is no reason you can't utilize Macro Variables in your NC Code, and have the NC code generated by your CAM System and Post Processor.

 

One example I absolutely love, and use all the time, is outputting Variable Values for the Entry Feed, Cut Feed, and Retract Feeds on my parts. It is so much easier to just reference a list of variables at the top of the program, and if your operator needs to adjust a speed or feed on the shop floor, they can change the value in one place, at the top of the program. (Plus, it makes it so much easier to track any "manual changes" when they are all done in the Program Header...

  • Like 2
Link to comment
Share on other sites

If you get into automation (robots and pallet pools) it's pretty much a necessity.  Plus there are applications where a macro program is simply the better option, such as with large families of similar parts.  You can have one program of reasonable length which will make any part in your family.  You could set a variable for which part you want, or have the machine probe the stock and make the largest one that will fit.

Link to comment
Share on other sites

I use macros quite a lot. If there is a repetitive operation that needs to happen and I can get it down to one command, I'll do it. The key is having it well documented. I have them for attachment changes on a double coulmn, coord. rotation for RAH, angle hole drilling "canned cycles", and so on.

I have a library I keep adding to and try to keep a similar writing process through them all.

 

I made one the other day for a family of parts. The program is now able to make the 40+ parts by updating six variables.

 

Once again the key is documentation. It is very important that you or anyone else can read the macro a year after it has been written and understand the basic use and function (I put a sample of how to use it at the top of the file). Also it is important that you can read the logic easily for when revisions/edits are required. The final thing is the idiot proofing. Make sure there are all the appropriate safety checks in place.

  • Like 1
Link to comment
Share on other sites

Hi guys I ran this macro program to do an internal keyway (broaching) in a CNC Lathe.

 

 

O0001

G0G28U0W0

G0G28H0

M68

G0T0101

M98P0002

G0G54Z.100X#502

N100 (YOU CAN LOSE THIS)

WHILE[#503LT#500]DO1

G0X#503M8

G1G98Z-.770F250.0

G0X#502

G0Z.100

#503=#503+#501

END1

G0G28U0W0M09

M69

M30

 

 

 

 

O0002

(SUB FOR MACRO VARIBLE)

#500=1.220(KEYWAY DEPTH)

#501=.002(DEPTH OF CUT)

#502=.950(BORE SIZE)

#503=.958(START REFERENCE POINT)

M99

%

cool!

FWIW if anyone buys a broach from Dumont they can supply you with HIGHLY configurable macro for a variety of controls. An instruction PDF is included.

 Same idea as above; one to set variables, one to crunch calculations.

 

10pm Edit: just got done testing the Dumont Okuma mill/turn Macro. It's freaking sweet!! Only ran into one "limitation": broaching needs to be on the X positive side.

 had a little trouble getting it to broach at a positive Z but setting the "WORKING LENGTH Z AXIS" variable 8 to a negative # did the trick. :smoke:

Link to comment
Share on other sites

I use macros quite a lot. If there is a repetitive operation that needs to happen and I can get it down to one command, I'll do it. The key is having it well documented. I have them for attachment changes on a double coulmn, coord. rotation for RAH, angle hole drilling "canned cycles", and so on.

I have a library I keep adding to and try to keep a similar writing process through them all.

 

I made one the other day for a family of parts. The program is now able to make the 40+ parts by updating six variables.

 

Once again the key is documentation. It is very important that you or anyone else can read the macro a year after it has been written and understand the basic use and function (I put a sample of how to use it at the top of the file). Also it is important that you can read the logic easily for when revisions/edits are required. The final thing is the idiot proofing. Make sure there are all the appropriate safety checks in place.

 

+1 to proper documentation

 

I will just add that I have always kept a spreadsheet of to keep track of macros. The spreadsheet contained columns for macro numbers, description, etc. The rows contains variables used in the macro. This way you can filter columns to easily check for variable conflicts and compatibility from machine to machine. 

  • Like 2
Link to comment
Share on other sites

 

Alright. My experience lies primarily in diamond turning rather than milling but here is my stab at a pocket with a programmable corner radius and an inside radius between the wall and the floor. I wrote this in an attempt to help someone upon request. I know I could have handled the variable inputs a bit better as they are somewhat cluttered and illogically named and I am still debugging the program and checking to ensure all of the inputs are valid. The pocket is intended to be machined with an endmill rather than a ball endmill as that is what was the guy requested. If any of you awesome milling guys, or macro guru's have NCplot and wouldn't mind giving me a little feedback on technique I'd greatly appreciate it. Things like safety features, possible better entry and exit strategies, better way to handle cut depth or feedrate etc. I'd hate to injure someone with bad code. I usually run my own programs so it isn't an issue and those programs are usually main programs rather than macro type programs. I based the general layout on some of the nice macros that cncchipmaker has posted, gotta give credit where it is due. 

G90 G17 G71 G40
G01 X0 Y0 Z1 F500
G65 P0001 A0.1 B0.06 C0.01 D0.8 E60. F0.004 H4. J0.05 K1.0 L26000 M0.002 N2. Q6. M.005 R1. S20000 T2.0 U0.5 V0.05 W0.4 X15. Y9. Z0.     
M99
 
O0001(INSIDE POCKETING MACRO)
(START @ X0 Y0 Z0 (CENTER OF POCKET)
(FORMAT G65 ABCDFHJKMNQRSTUVWXYZ)

(THE PROGRAM WILL OPERATE @ 60% FEEDRATE WHEN RAMPING TO DEPTH.
(MIGHT
 
(A = #1  - LEADIN/OUT ARC RADII
(B = #2  - STEP OVER, FINISH FLOOR
(C = #3  - FINISH ALLOWANCE
(D = #7  - TOOL DIAMETER
(E = #8  - PLUNGE FEEDRATE
(F = #9  - CHIPLOAD PER TOOTH, ROUGH
(H = #11 - TOTAL POCKET DEPTH
(J = #5  - MAX DEPTH PER PASS WHEN MACHINING THE RADIUS
(K = #6  - CORNER RADII, FLOOR
(L = #12 - SPINDLE RPM, FINISHING
(M = #13 - CHIPLOAD PER TOOTH, FINISH
(N = #14 - # OF TEETH
(Q = #17 - MAX RAMP ANGLE
(R = #18 - R PLANE
(S = #19 - SPINDLE RPM, ROUGHING
(T = #20 - CORNER RADII, WALL
(U = #21 - STEP OVER, ROUGHING
(V = #22 - STEP OVER, FLOOR CORNER RADII
(W = #23 - MAX DEPTH OF CUT (Z) 
(X = #24 - POCKET WIDTH  -X- DIM.
(Y = #25 - POCKET LENGTH -Y- DIM.
(Z = #26 - Z START ZERO -- OPTIONAL)
 
(*********************************)

#109=#4001	(RECORD CURRENT G-CODE MODAL GROUP 1 G01/G02/G03/G33
#110=#4002	(RECORD CURRENT G-CODE MODAL GROUP 2 G17/G18/G19
#111=#4003	(RECORD CURRENT G-CODE MODAL GROUP 3 G90/G91

G17 G90

(CHECKING FOR FAULTY INPUT, TOOL INTERFERENCE ETC
IF[#1EQ#0] THEN #3000=1       (A, CANNOT BE BLANK)
IF[#2EQ#0] THEN #3000=2       (B, CANNOT BE BLANK)
IF[#3EQ#0] THEN #3000=3       (C, CANNOT BE BLANK)
IF[#7EQ#0] THEN #3000=4       (D, CANNOT BE BLANK)
IF[#7LE0] THEN #3000=4	   (D, CANNOT BE ZERO)
IF[#8EQ#0] THEN #3000=4	   (E, CANNOT BE BLANK)
IF[#9EQ#0] THEN #3000=5       (F, CANNOT BE BLANK)
IF[#11EQ#0] THEN #3000=6      (H, CANNOT BE BLANK)
IF[#5EQ#0] THEN #3000=7       (J, CANNOT BE BLANK)
IF[#6EQ#0] THEN #3000=8       (K, CANNOT BE BLANK)
IF[#13EQ#0] THEN #3000=9      (M, CANNOT BE BLANK)
IF[#14EQ#0] THEN #3000=10      (N, CANNOT BE BLANK)
IF[#17EQ#0] THEN #3000=11     (Q, CANNOT BE BLANK)
IF[#18EQ#0] THEN #3000=12     (R, CANNOT BE BLANK)
IF[#19EQ#0] THEN #3000=13     (S, CANNOT BE BLANK)
IF[#20EQ#0] THEN #3000=14     (T, CANNOT BE BLANK)
IF[#21EQ#0] THEN #3000=15     (U, CANNOT BE BLANK)
IF[#22EQ#0] THEN #3000=16     (V, CANNOT BE BLANK)
IF[#23EQ#0] THEN #3000=17     (W, CANNOT BE BLANK)
IF[#24EQ#0] THEN #3000=18     (X, CANNOT BE BLANK)
IF[#25EQ#0] THEN #3000=19     (Y, CANNOT BE BLANK)
IF[#26EQ#0] THEN #26=0.
IF[#7GT#20] THEN #3000=21     (TOOL RADIUS (D/2) CANNOT BE LARGER THAN THE INTERNAL CORNER RADIUS (T))
IF[#7GT#20-#6] THEN #3000=21  (TOOL RADIUS (D/2) CANNOT BE LARGER THAN THE CORNER RADIUS MINUS THE FLOOR RADIUS
IF[#7GT#24] THEN #3000=22     (TOOL IS TOO LARGE FOR THE POCKET
IF[#7GT#25] THEN #3000=23     (TOOL IS TOO LARGE FOR THE POCKET
IF[#1GT[#24/2-[#20+#3]]] THEN #3000=24	(LEADIN/OUT ARC (A) IS TOO LARGE
IF[#1GT[#25/2-[#20+#3]]] THEN #3000=25	(LEADIN/OUT ARC (A) IS TOO LARGE
(IF[#21GT#7] THEN #3006=26	(ROUGH STEPOVER (U) IS LARGER THAN THE TOOL DIAMETER (D))
(IF[#22GT#7] THEN #3006=27	(FINISH STEPOVER (V) IS LARGER THAN THE TOOL DIAMETER (D))

(CONVERT TO RADIUS VALUES
#7=#7/2
#17=TAN[#17]*[#7*0.8*2]
#599=#17
#24=#24/2
#25=#25/2
 
(FORCE ABSOLUTE VALUE FOR R-PLANE
#18=ABS[#18]
 
M4S[#19]
 
(GOTO 150
(GOTO 100
(GOTO 50
 
(MACHINING CYCLE PRIOR TO THE BOTTOM RADII
(CALCULATED AMOUNT TO REMOVE IN Z MINUS THE RADIUS AT THE BOTTOM

#30=#11-#6-#3 (CALCULATED AMOUNT OF MATERIAL TO REMOVE BETWEEN THE TOP OF THE FLOOR RADIUS AND THE TOP OF THE CAVITY
#31=#30	  (CALCULATED DEPTH OF CUT
#32=1		 (CALCULATED NUMBER OF CUTS
WHILE[#31GT#23]DO1
#32=#32+1
#31=#30/#32
END1
#33=0		(CUT COUNTER
(AMOUNT TO REMOVE PER PECK CYCLE
#130=#31	(AMOUNT OF MATERIAL TO REMOVE PER ROUGHING PASS
#131=#130	(CALCULATED DEPTH PER HELIX
#132=1		(CALCULATED NUMBER OF HELICAL ROTATIONS IN ORDER TO REACH CUT DEPTH
WHILE[#131GT#17]DO1
#132=#132+1
#131=#130/#132
END1
#133=0		(HELICAL CUT COUNTER
#27=#131/360	(HELICAL Z DEPTH PER DEGREE 
#28=0		(HELICAL ANGULAR COUNTER
G01 X[#7*0.8] F[#8]	(MOVE OVER 80% OF THE TOOL RADIUS IN X IN PREPARATION FOR THE HELICAL ENTRY CYCLE
#590=#31

WHILE[#33LT#32]DO1	(OUTSIDE LOOP: KEEPING TRACK OF TOTAL DEPTH
WHILE[#133LT#132]DO2	(MIDDLE LOOP: FOR CALCULATING AND MACHINING THE EACH DEPTH PASS
WHILE[#28LE360]DO3	(INNER LOOP: FOR MACHINING EACH ITERATION OF THE HELICAL ENTRY PASSES
IF[[#133GE[#132-1]]AND[#28GT351]] GOTO 1
#10=[#9*#14*#19]*0.6
IF[[#28EQ0]AND[#133LT1]] THEN #10=#8
G01 X[COS[#28]*[#7*0.8]] Y[SIN[#28]*[#7*0.8]] Z[#26-#27*#28-#27*360*#133-#27*360*#132*#33]F[#10]
N1
#28=#28+9
END3
IF[#133LE[#132-2]]GOTO 2
G91
G02 X[ABS[SIN[351]*[#7*0.8]]] Y[ABS[SIN[351]*[#7*0.8]]] Z[-#27*9]R[ABS[SIN[351-9/2]*[#7*0.8]]]
G90
N2
#28=0
#133=#133+1
END2

(CALCULATE THE NUMBER OF PASSES AND DOC ONCE THE TOOL HAS REACHED CUTTING DEPTH
#135=#25-#7-#3
#136=#135
#137=1
WHILE[#136GT#21]DO2		
#137=#137+1
#136=#135/#137
END2
#138=1
#115=[#20-#7]/#137
G01 X[#24-#3-#7] F[#9*#14*#19]

(ONCE TO DEPTH THIS LOOP WILL MACHINE TO THE OUTSIDE EDGES OF THE POCKET IN AN EXPANDING		
(RECTILINEAR LOOP
WHILE[#138LE#137]DO2	
G01 Y[#138*#136-#115*#138]
G03 X[#24-#3-#7-#115*#138] Y[#138*#136] R[#115*#138]
G01 X[-#24+#3+#115*#138+#7]
G03 X[-#24+#3+#7] Y[#138*#136-#115*#138] R[#115*#138]
G01 Y[-#138*#136+#115*#138]
G03 X[-#24+#3+#7+#115*#138] Y[-#138*#136] R[#115*#138]
G01 X[#24-#3-#7-#115*#138]
G03 X[#24-#3-#7] Y[-#138*#136+#115*#138] R[#115*#138]

(IF NOT THE LAST PASS THEN SKIP THE WALL SCALLOP REMOVAL MOVE
IF[#138NE#137] GOTO 5
G01 Y#1
N5
#138=#138+1
END2
G91
G03 X[-#1] Y[#1] R[#1]
G90
G01 X[-#24+#3+#7+#1]
G91
G03 X[-#1] Y[-#1] R[#1]
G03 X[#1] Y[-#1] R[#1]
G90
G01 X0
G00X[#7*0.8]Y0Z[#26+#18]
#138=1
#133=0
#33=#33+1
END1

N50
(MACHINING THE RADIUS BETWEEN THE FLOOR AND THE WALL

(CALCULATED AMOUNT TO REMOVE IN Z WHILE MACHINING
(THE RADIUS AT THE BOTTOM OF THE POCKET
#30=#6
#31=#30
#32=1
WHILE[#31GT#5]DO1
#32=#32+1
#31=#30/#32
END1
#33=0
#114=[#6-#3]/#32
 
(AMOUNT TO REMOVE PER PECK CYCLE
#130=#31
#131=#130
#132=1
WHILE[#131GT#17]DO1
#132=#132+1
#131=#130/#132
END1
#133=0
#27=#131/360
#28=0
WHILE[#33LT#32]DO1
#112=#6-#3
IF[[[#6-#3]*[#6-#3]-[[#31*[#33+1]]*[#31*[#33+1]]]]GT0] THEN #112=[#6-#3]-SQRT[[#6-#3]*[#6-#3]-[[#31*[#33+1]]*[#31*[#33+1]]]]

 
(PECK TO DEPTH THEN MACHINE THE 'RECTANGLE'
WHILE[#133LT#132]DO2
WHILE[#28LE360]DO3
IF[[#133GE[#132-1]]AND[#28GT351]] GOTO 51
#10=[#9*#14*#19]*0.6
IF[[#28EQ0]AND[#133LT1]] THEN #10=#8
G01 X[COS[#28]*[#7*0.8]] Y[SIN[#28]*[#7*0.8]] Z[#26-#11+#6+#3-#27*#28-#27*360*#133-#27*360*#132*#33]F[#10]
N51
#28=#28+9
(G01 X[COS[#28]*[#7*0.8]] Y[SIN[#28]*[#7*0.8]] Z[#26-#11+#6+#3-#27*#28-#27*360*#133-#27*360*#132*#33]F[#9*#14*#19]
(#28=#28+9
END3
#28=0
#133=#133+1
END2

IF[#133LE[#132-2]]GOTO 52
G91
G02 X[ABS[SIN[351]*[#7*0.8]]] Y[ABS[SIN[351]*[#7*0.8]]] Z[-#27*9]R[ABS[SIN[351-9/2]*[#7*0.8]]]
G90
N52

#135=#25-#7-#3-#112
#136=#135
#137=1
WHILE[#136GT#21]DO2
#137=#137+1
#136=#135/#137
END2
#138=1
#115=[#20-#7]/#137
 
G01 X[#24-#3-#7-#112] F[#9*#14*#19]
 
WHILE[#138LE#137]DO2
#117=0
(IF[#138GE#137] THEN #117=#114*#33
G01 Y[#138*#136-#115*#138+#117]
G03 X[#24-#3-#7-#115*#138-#112+#117] Y[#138*#136] R[#115*#138-#117]
G01 X[-#24+#3+#115*#138+#7+#112-#117]
G03 X[-#24+#3+#7+#112] Y[#138*#136-#115*#138+#117] R[#115*#138-#117]
G01 Y[-#138*#136+#115*#138-#117]
G03 X[-#24+#3+#7+#115*#138+#112-#117] Y[-#138*#136] R[#115*#138-#117]
G01 X[#24-#3-#7-#115*#138-#112+#117]
G03 X[#24-#3-#7-#112] Y[-#138*#136+#115*#138-#117] R[#115*#138-#117]
G01 Y[-#1]
#138=#138+1
END2
G91
G03 X[-#1] Y[#1] R[#1]
G90
G01 X[-#24+#3+#7+#112+#1]
G91
G03 X[-#1] Y[-#1] R[#1]
G03 X[#1] Y[-#1] R[#1]
G90
G00X[#7*0.8]Y-#3 Z[#26+#18]
#138=1
#133=0
#33=#33+1
END1

N100
M4S[#12]
G01 X[#24-#7-#3-#1] Z[#26-#11+#6] F[#13*#14*#19]
(FINISH PASS
G03 X[#24-#7] Y[#1] R[#1+#3] F[#13*#14*#12]
G01 Y[#25-#20]
G03 X[#24-#20] Y[#25-#7] R[#20-#7]
G01 X[-#24+#20]
G03 X[-#24+#7] Y[#25-#20] R[#20-#7]
G01 Y[-#25+#20]
G03 X[-#24+#20] Y[-#25+#7] R[#20-#7]
G01 X[#24-#20]
G03 X[#24-#7] Y[-#25+#20] R[#20-#7]
G01 Y[#1+0.02]
Y0
 
#30=#6
#31=#30
#32=0
WHILE[#31GT#22]DO1
#32=#32+1
#31=#30/#32
END1
#33=1
 
WHILE[#33LE#32]DO1
#112=#6
IF[[#6*#6-[[#31*#33]*[#31*#33]]]GT0] THEN #112=#6-SQRT[#6*#6-[[#31*#33]*[#31*#33]]]
#134=#20-#112
G18
G03 X[#24-#7-#112] Z[#26-#11+#6-#31*#33] R[#6]
G17
G01 Y[#25-#134-#112-0.0001]
G03 X[#24-#134-#112-0.0001] Y[#25-#7-#112] R[#134-#7+0.0001]
G01 X[-#24+#134+#112+0.0001]
G03 X[-#24+#7+#112] Y[#25-#134-#112-0.0001] R[#134-#7+0.0001]
G01 Y[-#25+#134+#112+0.0001]
G03 X[-#24+#134+#112+0.0001] Y[-#25+#7+#112] R[#134-#7+0.0001]
G01 X[#24-#134-#112-0.0001]
G03 X[#24-#7-#112] Y[-#25+#134+#112+0.0001] R[#134-#7+0.0001]
G01 Y0.02
Y0
#33=#33+1
END1
 
N150
(FINISH THE FLOOR
#135=#25-#7-#6
#136=#135
#137=1
WHILE[#136GT#2]DO1
#137=#137+1
#136=#135/#137
END1
#138=1
#115=[#20-#6-#7]/#137
G01 X[#24-#6-#7-[#115*#138+0.0001]]
WHILE[#138LE#137]DO1
IF[#138GT1] GOTO 152
G03 X[#24-#6-#7] Y[#115*#138+0.0001] R[#115*#138+0.0001]
N152
G01 Y[#138*#136-#115*#138-0.0001]
G03 X[#24-#6-#7-#115*#138-0.0001] Y[#138*#136] R[#115*#138+0.0001]
G01 X[-#24+#6+#115*#138+#7+0.0001]
G03 X[-#24+#6+#7] Y[#138*#136-#115*#138-0.0001] R[#115*#138+0.0001]
G01 Y[-#138*#136+#115*#138-0.0001]
G03 X[-#24+#6+#7+#115*#138+0.0001] Y[-#138*#136] R[#115*#138+0.0001]
G01 X[#24-#6-#7-#115*#138-0.0001]
G03 X[#24-#6-#7] Y[-#138*#136+#115*#138+0.0001] R[#115*#138+.001]
G01 Y0
#138=#138+1
END1
Y#1
G91
G03 X[-#1] Y[#1] R[#1]
G90
G01 X[-#24+#6+#7+#1] Y[#1+#1]
G91
G03 X[-#1] Y[-#1] R[#1]
G03 X[#1] Y[-#1] R[#1]
G90
(G01 X[#24-#6-#7-#1]
G01 X0
G00 X0 Y0 Z1

(RESET MODAL G-CODES BACK TO THEIR ORIGINAL VALUES
G[#109]G[#110]G[#111]
M99

 

My suggestion would be to look over the "step over" code, and see if you can make it "spiral" out in the X axis, as well as the Y axis. When I look at the backplot, the first cut in the pocket is a full-width slotting cut, that goes in the X direction, until it hits the pocket limit, then it steps over, and goes back the other way. When it reverses, the first half of the backwards movement has clearance, until it goes past center, then it is slotting again.

 

It should be possible to give it a "step over" value (maybe 30%?), and have it "spiral" out from the center, after doing the helical entry. I'm not suggesting a true "spiral" motion, but more like a "parallel spiral" in the Pocket Roughing page...

Link to comment
Share on other sites

My suggestion would be to look over the "step over" code, and see if you can make it "spiral" out in the X axis, as well as the Y axis. When I look at the backplot, the first cut in the pocket is a full-width slotting cut, that goes in the X direction, until it hits the pocket limit, then it steps over, and goes back the other way. When it reverses, the first half of the backwards movement has clearance, until it goes past center, then it is slotting again.

 

It should be possible to give it a "step over" value (maybe 30%?), and have it "spiral" out from the center, after doing the helical entry. I'm not suggesting a true "spiral" motion, but more like a "parallel spiral" in the Pocket Roughing page...

right. Or a ramp (rather than helix) to the x dimension which would open the possibility of using a high feed cutter at shallow depths.

Link to comment
Share on other sites

My suggestion would be to look over the "step over" code, and see if you can make it "spiral" out in the X axis, as well as the Y axis. When I look at the backplot, the first cut in the pocket is a full-width slotting cut, that goes in the X direction, until it hits the pocket limit, then it steps over, and goes back the other way. When it reverses, the first half of the backwards movement has clearance, until it goes past center, then it is slotting again.

 

It should be possible to give it a "step over" value (maybe 30%?), and have it "spiral" out from the center, after doing the helical entry. I'm not suggesting a true "spiral" motion, but more like a "parallel spiral" in the Pocket Roughing page...

 

 

right. Or a ramp (rather than helix) to the x dimension which would open the possibility of using a high feed cutter at shallow depths.

 

Great ideas. Thank you. Now to find out if my math is good enough to implement them.

Link to comment
Share on other sites
  • 2 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

Join us!

eMastercam - your online source for all things Mastercam.

Together, we are the strongest Mastercam community on the web with over 56,000 members, and our online store offers a wide selection of training materials for all applications and skill levels.

Follow us

×
×
  • Create New...