What's new
What's new

Opinions and Suggestions on Dynamic Offset Macro

Tevibear

Plastic
Joined
Jan 7, 2017
Hey guys/gals. I'm new around these parts and have a question for ya. I'm fairly new to macro programming and have been working on a dynamic-offset macro for my company. I'm not an expert with all of the trig bust was able to use what I researched on the web and apply what logic I could muster to come up with this macro. I would appreciate some feedback on it. I know there is probably a way to compress it a little or restructure the format. Also, even though it may be written in a strange way you may not have seen before, will it still work as written even if it's a little strange? Thanks in advance.

O9054
(AUTHOR - KEVIN - 12-16-2016)
(MAZAK HCN6800 & HCN5000 II SERIES HORIZONTAL MACHINING CENTERS)
(SYNTAX = G65P9054 S W A B X Y Z) (MACRO IS FOR EXTENDED OFFSETS ONLY G54.1P1 - 300)
(WHERE “S” IS THE FIXTURE ANGLE, “W” IS THE FIXTURE WORK OFFSET, "A" IS THE ALTERNATE OFFSET & “B” IS THE MACHINING ANGLE FOR THE DYNAMIC OFFSET)
(X, Y & Z ARE ARGUMENTS FOR INCREMENTAL OFFSETS TO THE DYNAMIC OFFSET ITSELF - ALLOWS FOR FINE MACHINING ADJUSTMENTS SIMILAR TO A G52 COMMAND)
(MASTERCAM FIXTURE COORDINATES MUST BE "TAUGHT" TO THE FIXTURE FOR "W" AT "S" ANGLE BEFORE RUNNING MACRO)

(IF THE "A" ARGUMENT IS LEFT BLANK, THE G-CODE IN THE PROGRAM FOLLOWING THE MACRO MUST USE G54 AS THE WCS, AS THIS IS WHERE THE DYNAMIC OFFSETS ARE STORED)
(THE "A" NUMBER SHOULD MATCH THE WORK OFFSET ASSIGNED TO THE PROGRAM FOR CUTS MADE AT "B" ANGLE IF DIFFERENT FROM "W")
(EXAMPLE: FIXTURE IS MOUNTED AT B90 USING G54.1P48, AND CUTS ARE MADE AT B135 USING G54.1P49, "W" WOULD BE 48 AND "A" WOULD BE 49)

(THIS PROVIDES A WAY TO MACHINE TWO DIFFERENT WAYS AND USE THE SAME MACRO FOR BOTH USING EITHER 1 OFFSET OR MULTIPLE FOR EACH MACHINGING ANGLE)
(USING A MANUAL ENTRY IN MASTERCAM WILL RUN THE MACRO BEFORE THE WORK OFFSETS BEING USED FOR THE ANGLED CUTS ARE MADE MODAL)
(IF USING ONLY 1 WORK OFFSET FOR ALL "ANGLED" CUTS, MAKE SURE TO PROGRAM THE POST FOR THOSE CUTS @ G54) (FIXTURE OFFSETS "A" & "W" MUST BE G54.1P1 - 300)

N100 (MACRO ARGUMENT ERROR DETECTION)
IF[#23EQ#0]#23=#4130 (CHECK "W" WORK OFFSET FOR NULL VALUE AND SET TO MOST RECENT WORK OFFSET IF CONDITION IS TRUE)
IF[#23EQ0]#23=#4130 (CHECK "W" WORK OFFSET FOR ZERO VALUE AND SET TO MOST RECENT WORK OFFSET IF CONDITION IS TRUE)
IF[#24EQ#0]#24=0 (CHECK "X" ARGUMENT FOR NULL VALUE & SET TO ZERO IF CONDITION IS TRUE)
IF[#25EQ#0]#25=0 (CHECK "Y" ARGUMENT FOR NULL VALUE & SET TO ZERO IF CONDITION IS TRUE)
IF[#26EQ#0]#26=0 (CHECK "Z" ARGUMENT FOR NULL VALUE & SET TO ZERO IF CONDITION IS TRUE)
IF[#23LT0]GOTO501 (CHECK "W" WORK OFFSET IS NOT A NEGATIVE NUMBER)
IF[#23GT300]GOTO501 (CHECK "W" WORK OFFSET IS VALID BETWEEN 1 & 300)
IF[#19EQ#0]GOTO502 (CHECK STARTING ANGLE FOR NULL VALUE)
IF[#19LT0]GOTO503 (CHECK STARTING ANGLE IS NOT NEGATIVE)
IF[#19GT360]GOTO503 (CHECK STARTING ANGLE IS BETWEEN ZERO AND 360)
IF[#2EQ#0]GOTO504 (CHECK MACHINING ANGLE FOR NULL VALUE)
IF[#2LT0]GOTO505 (CHECK MACHINING ANGLE IS NOT NEGATIVE)
IF[#2GT360]GOTO505 (CHECK MACHINING ANGLE IS BETWEEN ZERO AND 360)
IF[#1EQ#0]#1=0 (CHECK "A" ARGUMENT FOR NULL & SET TO ZERO IF CONDITION IS TRUE)
IF[#1LT0]GOTO501 (CHECK "A" WORK OFFSET IS NOT A NEGATIVE NUMBER)
IF[#1GT300]GOTO501 (CHECK "A" WORK OFFSET IS VALID BETWEEN 1 & 300)
IF[#1EQ#23]GOTO506 (CHECK "A" IS NOT EQUAL TO "W")
IF[#19NE0.]GOTO300 (JUMP TO PROCESS FOR FIXTURES AT ANGLES OTHER THAN B0.)


N200 (RUN CODE FOR FIXTURES WHERE "W" IS TAKEN FROM B0. ON THE TOMBSTONE)
#500=#50700 (MACHINE X CENTER OF ROTATION)
#501=#50701 (MACHINE Z CENTER OF ROTATION)
#5221=[#[70000+[[#23-1]]*20]+1] (COPY "W" X-OFFSET INTO G54 X-OFFSET)
#5222=[#[70000+[[#23-1]]*20]+2] (COPY "W" Y-OFFSET INTO G54 Y-OFFSET)
#5223=[#[70000+[[#23-1]]*20]+3] (COPY "W" Z-OFFSET INTO G54 Z-OFFSET)
#502=[#5221-#500] (DELTA X) (DEVIATION FROM CENTER OF ROTATION IN X-AXIS)
#503=[#5223-#501] (DELTA Z) (DEVIATION FROM CENTER OF ROTATION IN Z-AXIS)
#504=SQRT[[#502*#502]+[#503*#503]] (GET THE HYPOTENUSE / "RADIUS" FROM DEVIATIONS)
#505=[ASIN[#502/#504]] (START DEGREE) (THE DELTA X WAS USED WITH THE HYPOTENUSE TO GET THIS)
#506=[#505+-#2] (CALCULATE DEGREE) (ADD START DEGREE TO “-B” DEGREE INPUT FROM G65 ARGUMENT)
#507=[SIN[#506]*#504] (NEW DELTA X) (MULTIPLY SINE OF NEW ANGLE BY THE HYPOTENUSE)
#508=[COS[#506]*#504] (NEW DELTA Z) (MULTIPLY COSINE OF NEW ANGLE BY THE HYPOTENUSE)
#5221=#507+[#500+#24] (NEW X OFFSET) (LOAD NEW X-OFFSET INTO G54)
#5222=#5222+#25 (NEW Y OFFSET) (LOAD NEW Y-OFFSET INTO G54)
#5223=#508+[#501+#26] (NEW Z OFFSET) (LOAD NEW Z-OFFSET INTO G54)
G54 (ACTIVATE G54 MODAL)
G4X.25 (SHORT DWELL SO MACHINE CAN GET INTO G54 MODAL TO ALLOW G10 COMMAND)
IF[#1GT0]G90G10L20P#1X#5221Y#5222Z#5223 (LOAD A COPY OF THE NEW OFFSETS FROM G54 INTO "A" EXTENDED OFFSET)
IF[#1GT0]G54.1P#1 (MAKE EXTENDED OFFSET MODAL IF "A" IS USED IN THE MACRO)
G4X.25 (SHORT DWELL SO MACHINE CAN CATCH UP IF NEEDED BEFORE RETURNING TO THE MAIN PROGRAM)
GOTO600


N300 (RUN CODE TO GET DELTA X & Z WHERE IT WOULD BE IF STARTING AT B0 ON THE TOMBSTONE INCREMENTAL FROM THE "S" Angle if greater than Zero)
#511=[360-#19]
#500=#50700
#501=#50701
#5221=[#[70000+[[#23-1]]*20]+1]
#5222=[#[70000+[[#23-1]]*20]+2]
#5223=[#[70000+[[#23-1]]*20]+3]
#502=[#5221-#500] (DELTA X)
#503=[#5223-#501] (DELTA Z)
#504=SQRT[[#502*#502]+[#503*#503]]
#505=[ASIN[#502/#504]]
#506=[#505+-#511] (CALCULATE DEGREE INCREMENTALLY FROM "S" THAT WOULD TAKE US TO B0.)
#512=[SIN[#506]*#504] (DELTA X @B0.)
#513=[COS[#506]*#504] (DELTA Z @B0.)


N400 (APPLY NEW DELTA X & Z COORDINATES TO "B" INPUT FROM G65 MACRO CALL)
#502=#512 (DELTA X @B0.)
#503=#513 (DELTA Z @B0.)
#504=SQRT[[#502*#502]+[#503*#503]]
#505=[ASIN[#502/#504]]
#506=[#505+-#2]
#507=[SIN[#506]*#504] (NEW DELTA X @ "B" ANGLE FROM MACRO)
#508=[COS[#506]*#504] (NEW DELTA Z @ "B" ANGLE FROM MACRO)
#5221=#507+[#500+#24]
#5222=#5222+#25
#5223=#508+[#501+#26]
G54
G4X.25
IF[#1GT0]G90G10L20P#1X#5221Y#5222Z#5223
IF[#1GT0]G54.1P#1
G4X.25
GOTO600


N500 (MACRO INPUT ERROR CODES)
#3000=500(NO_WORK_OFFSET_ENTERED)
GOTO600
N501
#3000=501(INVALID_WORK_OFFSET)
GOTO600
N502
#3000=502(NO_STARTING_ANGLE_ENTERED)
GOTO600
N503
#3000=503(INVALID_FIXTURE_ANGLE)
GOTO600
N504
#3000=504(NO_MACHINING_ANGLE_ENTERED)
GOTO600
N505
#3000=505(INVALID_MACHINING_ANGLE)
GOTO600
N506
#3000=506(OFFSET_"A"_CANNOT_EQUAL_OFFSET_"W")

N600
M99

Kevin
 
Modify what you need to in this and run it. I wrote it originally for a mazak. Then adapted it to Fanuc. Only thing that might be different is the work offsets. One suggestion I have is to use locals not common variables when you write your macros. I am using common in here, if I wrote this today, it wouldn't use any common or non volatile at all.

Code:
%
O9050(WORK OFFSET CALCULATOR)
(OFFSET CALCULATOR FOR HORIZONTAL MILL)
(FANUC 16i-18i-21i)
(N. G****S) 
(4-11-2011) 
 
(FORMAT EXAMPLE) 
(G65 P9050 A0. B90. C1 D2 E1 F2) 


(C IS ORIGINAL WPC OFFSET  NUMBER) 
(1 = G54, 2 = G55,...)
(1 = G54.1 P1,...) 
(D IS ORIGINAL WPC OFFSET NUMBER TYPE)
(1 = STANDARD / 2 = EXTENDED)
(E IS DESTINATION OFFSET NUMBER) 
(1 = G54, 2 = G55,...)
(1 = G54.1 P1,...) 
(F IS OFFSET NUMBER TYPE)
(1 = STANDARD / 2 = EXTENDED)


 
(PERMANENT VARIABLES)
 
(CENTER OF PALLET) 
(GPI - )
(X CENTER)#100=-19.6835
(Z CENTER)#101=-40.1325
 
 
(VARIABLE DECLARATIONS)
 
(102 = RADIUS TO CENTER OF PALLET) 
(103 = X DELTA TO CENTER)
(104 = Z DELTA TO CENTER)
(105 = ORIGINAL ANGLE FROM Z AXIS) 
(106 = INCREMENTAL WCS ROTATION) 
(107 = OUTPUT WPC ROTATION FROM Z AXIS)
(108 = INPUT X REGISTER #) 
(109 = INPUT Y REGTSTER #) 
(110 = INPUT Z REGISTER #) 
(111 = OUTPUT X REGISTER #)
(112 = OUTPUT Y REGISTER #)
(113 = OUTPUT Z REGISTER #)
 
 
(SETTING PASSED VARIABLES INTO USED FORM)
 
(ANGLE)
(A IS ORIGINAL B-AXIS ROTATION)
(B IS DESTINATION B-AXIS ROTATION) 
IF[#1LE#2]GOTO11 
#106=360.-[#1-#2]
GOTON12
N11#106=#2-#1
N12(END ANGLE CALC)
 
(ORIGINAL WPC) 
(C IS OFFSET NUMBER) 
(1 = G54)
(1 = G54.1 P1) 
(D IS OFFSET NUMBER TYPE)
(1 = STANDARD / 2 = EXTENDED)
IF[#7EQ1.]GOTO5200 
#108=7000.+[#3-1.]*20.+1.
#109=7000.+[#3-1.]*20.+2.
#110=7000.+[#3-1.]*20.+3.
GOTO5201 
N5200
#108=2500.+#3
#109=2600.+#3
#110=2700.+#3
N5201
 
 
(OUTPUT WPC) 
(E IS OFFSET NUMBER) 
(1 = G54)
(1 = G54.1 P1) 
(F IS OFFSET NUMBER TYPE)
(1 = STANDARD / 2 = EXTENDED)
IF[#9EQ1.]GOTO5202 
#111=7000.+[#8-1.]*20.+1.
#112=7000.+[#8-1.]*20.+2.
#113=7000.+[#8-1.]*20.+3.
GOTO5203 
N5202
#111=2500.+#8
#112=2600.+#8
#113=2700.+#8
N5203
 
 
(CALCULATE ANGLE OF ORIGINAL WPC)
 
#103=#[#108]-#100
#104=#[#110]-#101
#102=SQRT[[#103*#103]+[#104*#104]]


#114=ABS[#103]
#115=ABS[#104] 
 
(INITIALIZE ANGLE) 
#105=0.
 
IF[#103LE0.]GOTO1
 
IF[#103GT0.]GOTO3
 
N1(FIRST AND SECOND QUADRANT)
IF[#104LE0.]GOTO2
IF[#103EQ0.]GOTO91 
#105=ATAN[ABS[#103]]/[ABS[#104]]
GOTO99 
N2(SECOND QUADRANT INCLUDING 90) 
IF[#104EQ0.]GOTO92 
#105=90.+[ATAN[ABS[#104]]/[ABS[#103]]]
GOTO99 
N3(THIRD AND FOURTH QUADRANT)
IF[#104GE0.]GOTO4
IF[#103EQ0.]GOTO93 
#105=180.+[ATAN[ABS[#103]]/[ABS[#104]]]
GOTO99 
N4(FOURTH QUADRANT INCLUDING 270)
IF[#104EQ0.]GOTO94
#105=270+[ATAN[ABS[#104]]/[ABS[#103]]]
GOTO99 
 
N91#105=0.(ANGLE IS 0) 
GOTO99 
N92#105=90.(ANGLE IS 90) 
GOTO99 
N93#105=180.(ANGLE IS 180) 
GOTO99 
N94#105=270.(ANGLE IS 270) 
GOTO99 
 
N99(END CALCULATE ANGLE OF WPC)
 
 
(FIX ANGLE FOR OUTPUT) 
 
IF[[#105+#106]GE360.]GOTO100 
#107=#105+#106(CALCULATE OUTPUT ANGLE) 
GOTO101
N100#107=#105+#106-360.
 
N101(END FIX ANGLE)
 
 
(CALCULATE NEW WPC AND OUTPUT SPECIFIED LOCATION)
 
IF[#107LT180.]GOTO10(  0 INC TO 180) 
IF[#107LT360.]GOTO30(180 INC TO 360) 
 
N10(FIRST AND SECOND QUADRANT INCLUDING 0) 
IF[#107GT90.]GOTO20
IF[#107EQ0.]GOTO910
#[#111]=#100-[SIN[#107]*#102]
#[#113]=#101+[COS[#107]*#102]
GOTO999
N20(SECOND QUADRANT INCLUDING 90)
IF[#107EQ90.]GOTO920 
#[#111]=#100-[COS[#107-90.]*#102]
#[#113]=#101-[SIN[#107-90.]*#102]
GOTO999
N30(THIRD QUADRANT INCLUDING 180)
IF[#107GE270.]GOTO40 
IF[#107EQ180.]GOTO930
#[#111]=#100+[SIN[#107-180]*#102]
#[#113]=#101-[COS[#107-180]*#102]
GOTO999
N40(FOURTH QUADRANT INCLUDING 270) 
IF[#107EQ270.]GOTO940
#[#111]=#100+[COS[#107-270.]*#102] 
#[#113]=#101+[SIN[#107-270.]*#102] 
GOTO999
 
N910(OUTPUT ANGLE IS 0)
#[#111]=#100 
#[#113]=#101+#102
GOTO999
N920(OUTPUT ANGLE IS 90) 
#[#111]=#100-#102
#[#113]=#101 
GOTO999
N930(OUTPUT ANGLE IS 180)
#[#111]=#100 
#[#113]=#101-#102
GOTO999
N940(OUTPUT ANGLE IS 270)
#[#111]=#100+#102
#[#113]=#101 
GOTO999
 
N999(END CALCULATE NEW WPC AND OUTPUT SPECIFIED LOACTION)
 
(TRANSFER Y AXIS)
#[#112]=#[#109]
 
M99(END OF MACRO)
%
 
Hi Kevin,

I know this post is from earlier this year, and based on what I see here it looks like you probably have this working by now. But I thought I would chime in.

I've written many macros over the years for 4 and 5 axis positioning. I've recently started a company that offers a complete product that serves this purpose. This dynamic work origin functionality is something that has been overlooked in the industry until now.

In addition to the positioning capability the software also has the ability to correct for rotary axis misalignment. In my experience, most machines do not have perfect alignment of the rotary axes to the linear axis and when tolerances are tight this can make a big difference. It also has automatic retract features. The macro that runs in the machine is configured and generated using a desktop application. This makes it easy to set all of the variables...especially for those who are not familiar with macro programming.

If you're interested you can check it out at Axisolve Home - Simplify and improve rotary position machining and email or call with any questions.

Cheers!
Daniel
 








 
Back
Top