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
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