forked from jay-m/fanuc-post
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Generic Fanuc 4X Mill
2506 lines (2307 loc) · 93.3 KB
/
Generic Fanuc 4X Mill
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
[POST_VERSION] #DO NOT MOVE OR ALTER THIS LINE# V15.00 P0 E1 W15.00 T1305895881 M15.00 I0 O0
# Post Name : Generic Fanuc 4X Mill.pst
# Product : Mill
# Machine Name : Generic
# Control Name : Fanuc
# Description : Generic 4 Axis Mill Post
# 4-axis/Axis subs. : Yes
# 5-axis : No
# Subprograms : Yes
# Executable : MP 15.0
#
# WARNING: THIS POST IS GENERIC AND IS INTENDED FOR MODIFICATION TO
# THE MACHINE TOOL REQUIREMENTS AND PERSONAL PREFERENCE.
#
# THIS POST REQUIRES A VALID 3 OR 4 AXIS MACHINE DEFINITION.
# YOU WILL RECEIVE AN ERROR MESSAGE IF MORE THAN ONE ROTARY AXIS IS DETECTED IN
# THE ACTIVE AXIS COMBINATION WITH READ_MD SET TO YES.
#
# Associated File List$
#
# GENERIC FANUC 4X MILL.control-6
#
# Associated File List$
#
# --------------------------------------------------------------------------
# Revision log:
# --------------------------------------------------------------------------
# CNC 06/09/05 - Initial post setup for Mastercam X
# CNC 10/06/05 - Changed parameter read for min_speed, modified pspindle, pprep$ and pset_mach
# - Modified pset_rot_label to use srot_y for horizontal machines
# - Added call to pset_mach in pq$ to set rotaxtyp$
# CNC 11/18/05 - Added psynclath with call to pset_mach to set rotaxtyp$, removed call from pq$
# CNC 02/03/06 - Added logic for high-speed toolpath tool inspection (see prapidout & plinout)
# CNC 06/26/06 - Initial post setup for Mastercam X2
# CNC 12/15/06 - Modified pset_mach for horizontal rotation when rotating about world Z axis.
# CNC 02/26/07 - Modified pwcs
# CNC 11/02/07 - Added prv_shftdrl$ = zero
# CNC 04/08/08 - X3 release - Removed check for write_ops
# CNC 01/26/09 - Initial post update for Mastercam X4
# CNC 04/15/09 - Added read_md switch to enable or disable setting rotary axis from Machine Definition
# CNC 05/06/09 - Modified pindxcalc to omit ctable check when rotary is not indexer
# CNC 06/09/09 - Updated MD parameters
# CNC 08/31/09 - Added check for read_md in pset_mach
# CNC 02/03/10 - Initial post update for Mastercam X5
# CNC 04/21/10 - Added Toolpath Transform Enhancements
# CNC 08/17/10 - Added fix for canned drill cycle incremental mode code output and Z output in incremental mode
# - Added fix for X coolant output
# - Added fix for MP line break pattern
# - Added fix for stock to leave output in tool table
# - Removed CD_VAR variables
# - Added axis sub direction logic
# CNC 08/23/10 - Added logic to handle axis sub with signed or shortest direction and rotation >= 360 degrees
# CNC 02/17/11 - Added three arctype$ initialization variables that are used for
# full arc and helix arc output, when CD is set to R or signed R
# CNC 05/20/11 - Initial post update for Mastercam X6
# CNC 05/23/11 - Modified pcoutrev to fix potential endless loop when processing axis sub
# CNC 09/01/11 - Modified pcoutrev to fix potential endless loop when processing axis sub for null tool change operation
# CNC 11/21/11 - Modified ptap$ and pmisc2$ logic. Post now uses switch (tap_feedtype) to control
# Feed per Unit (Inch/MM), or Feed per Revolution
#
# --------------------------------------------------------------------------
# Features:
# --------------------------------------------------------------------------
# This post supports Generic Fanuc code for 3 and 4 axis milling.
# It is designed to support the features of Mastercam X Mill.
#
# NEW FEATURES FOR X:
# - Machine definition, control definition and toolpath group parameter read sections added.
# - Post sets rotary "switches" from MD and CD settings. Also sets min/max spindle speed,
# max feed rates and type of feed for rotary motion from MD and CD. Includes option for
# units/min and units/sec for inverse time feed rate.
# - Variable initialization with SET_BY_MD or SET_BY_CD are overwritten in this post by parameter or
# variable settings from MD or CD.
# - Support for rotary axis lock/unlock codes when in index mode (see rot_lock)
# - Support for signed rotary axis direction and M-code specified axis direction (see use_rotmcode)
# - Switch to force rotary output to index mode when tool plane positioning with a full rotary (see force_index)
# - Enhanced tool information - Added switch for tool comments only, tooltable in header with no tool
# comments at tool change or tooltable in header with tool comments at tool change (see tool_info)
# Tooltable output includes cutter compensation type and stock to leave information
# - Enhanced tool staging options - enable or disable in CD. Set stagetltype in post for output type:
# Do not stage 1st tool, stage 1st tool at last tool change or stage 1st tool at end of file (peof)
# - Supports X comments including machine name, group name and group comment output (see pcomment2)
# - Additional date, time and data path output options (see pheader)
# - Additional rigid tapping cycle (separate from original tapping cycle) and initial custom drill
# cycle support (see pmisc2$ and pdrlcst$)
# - Support for 10 additional canned text options for X
# - Decimal support for sequence number output (set "Increment sequence number" in CD to a decimal value
# for output. I.E. "Increment sequence number" = .5, "Start sequence number" = 10 : N10, N10.5, N11, N11.5, etc...)
# - Switch for output of M00 or M01 at tool change (3 position switch, off, M00, M01 - see prog_stop)
# - Support for seperate XY, XZ and YZ plane/arc variables (see Arc page in CD)
# - Support for X style coolant. Allows up to 10 different coolants to be turned on/off before, with, or after like
# canned text. Coolant output is handled by "coolant" variable and string selector for V9 style coolant,
# "coolantx" variable and string selector for X style coolant.
#
# --------------------------------------------------------------------------
# Misc. Values:
# --------------------------------------------------------------------------
# Integers:
#
# mi1 - Work coordinate system
# 0 = Reference return is generated and G92 with the
# X, Y and Z home positions at file head.
# 1 = Reference return is generated and G92 with the
# X, Y and Z home positions at each tool.
# 2 = WCS of G54, G55.... based on Mastercam settings.
#
# mi2 - Absolute or Incremental positioning at top level
# 0 = absolute
# 1 = incremental
#
# mi3 - Select G28 or G30 reference point return.
# 0 = G28, 1 = G30
#
# mi4 - mi10 (NOT USED)
#
# Reals:
#
# mr1 - mr10 (NOT USED)
#
# --------------------------------------------------------------------------
#Canned text:
# Entering cantext on a contour point from within Mastercam allows the
# following functions to enable/disable.
# Cantext value:
# 1 = Program Stop = output the "M00" stop code
# 2 = Optional Stop = output the "M01" optional stop code
# 3 = Block Delete on = turn on block delete codes in NC lines
# 4 = Block Delete off = turn off block delete codes in NC lines
#
# --------------------------------------------------------------------------
#Milling toolpaths (4 axis)
#Layout:
# The term "Reference View" refers to the coordinate system associated
# with the Top view (Alt-F9, the upper gnomon of the three displayed).
# Create the part drawing with the axis of rotation about the axis
# of the "Reference View" according to the setting you entered for
# 'vmc' (vertical or horizontal) and 'rot_on_x' (machine relative
# axis of rotation).
# vmc = 1 (vertical machine) uses the top toolplane as the base machine
# view.
# vmc = 0 (horizontal machine) uses the front toolplane as the base machine
# view.
# Relative to the machine matrix -
# Rotation zero position is on the Z axis for rotation on X axis.
# Rotation zero position is on the Z axis for rotation on Y axis.
# Rotation zero position is on the X axis for rotation on Z axis.
# The machine view rotated about the selected axis as a "single axis
# rotation" are the only legal views for 4 axis milling. Rotation
# direction around the part is positive in the CCW direction when
# viewed from the plus direction of the rotating axis. Set the variable
# 'rot_ccw_pos' to indicate the signed direction. Always set the work
# origin at the center of rotation.
#
#Toolplane Positioning:
# Create the Cplane and Tplane as the rotation of the machine view about
# the selected axis of rotation. The toolplane is used to calculate
# the position of the rotary axis. This is the default setting.
#
#3 Axis Rotary (Polar)
# Polar positioning is offered in Mastercam 3 axis toolpaths through the
# rotary axis options dialog. The selected toolpath is converted to angle
# and radius position. The axis of rotation is forced to zero.
#
#Axis substitution:
# Use the Rotary axis substitution by drawing the geometry flattened
# from the cylinder. The rotary axis button must be active for axis
# substitution information to be output to the NCI file. The radius of
# the rotary diameter is added to all the Z positions at output.
#
#Simultaneous 4 Axis (11 gcode):
# Full 4 axis toolpaths can be generated from various toolpaths under the
# 'multi-axis' selection (i.e. Rotary 4 axis). All 5 axis paths are
# converted to 4 axis paths where only the angle about the rotation axis
# is resolved.
#
#Drill:
# All drill methods are supported in the post. See Simultaneous 4 Axis.
#
# --------------------------------------------------------------------------
#Additional Notes:
# 1) G54 calls are generated where the work offset entry of 0 = G54,
# 1 = G55, etc.
# 2) Metric is applied from the NCI met_tool variable.
# 3) Incremental mode calculates motion from home position at toolchanges.
# The home position is used to define the last position of the tool
# for all toolchanges.
# 4) The variable 'absinc' is now pre-defined, set mi2 (Misc. Integer) for
# the 'top level' absolute/incremental program output. Subprograms are
# updated through the Mastercam dialog settings for sub-programs.
# 5) Always avoid machining to the center of rotation with rotary axis!
# 6) Transform subprograms are intended for use with G54.. workshifts.
#
# END_HEADER$
#
# --------------------------------------------------------------------------
# Debugging and Factory Set Program Switches
# --------------------------------------------------------------------------
#Define Constants
m_one := -1
zero := 0
one := 1
two := 2
three := 3
four := 4
five := 5
c9k := 9999
bug4$ : 1 #Debug output with the tilde '~'.
#A value greater the zero applies the variable formatting with
#debug output (default is typically FS 1 but not a guarantee).
#A value of zero gets the value directly with NO formatting.
linktolvar$ : 0 #Associate X tolerance variables to V9- variable?
linkplnvar$ : 0 #Associate X plane specific variables to V9- variable?
skp_lead_flgs$ : 0 #Do NOT use v9 style contour flags
get_1004$ : 1 #Find gcode 1004 with getnextop?
rpd_typ_v7$ : 0 #Use Version 7 style contour flags/processing?
strtool_v7$ : 2 #Use Version 7+ toolname?
tlchng_aft$ : 2 #Delay call to toolchange until move line
cant_tlchng$ : 1 #Ignore cantext entry on move with tlchng_aft
newglobal$ : 1 #Error checking for global variables
getnextop$ : 1 #Build the next variable table
tooltable$ : 3 #Pre-read, call the pwrtt postblock
# --------------------------------------------------------------------------
# General Output Settings
# --------------------------------------------------------------------------
maxfeedpm : 500 #SET_BY_MD Limit for feed in inch/min
ltol_m : 0.05 #Length tolerance for arccheck, metric
vtol_m : 0.0025#System tolerance, metric
maxfeedpm_m : 10000 #SET_BY_MD Limit for feed in mm/min
force_wcs : yes$ #Force WCS output at every toolchange?
stagetool : 0 #SET_BY_CD 0 = Do not pre-stage tools, 1 = Stage tools
stagetltype : 1 #0 = Do not stage 1st tool
#1 = Stage 1st tool at last tool change
#2 = Stage 1st tool at end of file (peof)
use_gear : 0 #Output gear selection code, 0=no, 1=yes
min_speed : 50 #SET_BY_MD Minimum spindle speed
progname$ : 1 #Use uppercase for program name (sprogname)
prog_stop : 1 #Program stop at toolchange: 0=None, 1=M01, 2 = M00
tool_info : 2 #Output tooltable information?
#0 = Off - Do not output any tool comments or tooltable
#1 = Tool comments only
#2 = Tooltable in header - no tool comments at T/C
#3 = Tooltable in header - with tool comments at T/C
tlchg_home : no$ #Zero return X and Y axis prior to tool change?
# The following three initializations are used for full arc and helix arc output when the CD
# is set to output R or signed R for arcs
arctype$ : 2 #Arc center type XY plane 1=abs, 2=St-Ctr, 3=Ctr-St, 4=unsigned inc.
arctypexz$ : 2 #Arc center type XZ plane 1=abs, 2=St-Ctr, 3=Ctr-St, 4=unsigned inc.
arctypeyz$ : 2 #Arc center type YZ plane 1=abs, 2=St-Ctr, 3=Ctr-St, 4=unsigned inc.
# --------------------------------------------------------------------------
# Rotary Axis Settings
# --------------------------------------------------------------------------
read_md : yes$ #Set rotary axis switches by reading Machine Definition?
vmc : 1 #SET_BY_MD 0 = Horizontal Machine, 1 = Vertical Mill
rot_on_x : 1 #SET_BY_MD Default Rotary Axis Orientation
#0 = Off, 1 = About X, 2 = About Y, 3 = About Z
rot_ccw_pos : 0 #SET_BY_MD Axis signed dir, 0 = CW positive, 1 = CCW positive
index : 0 #SET_BY_MD Use index positioning, 0 = Full Rotary, 1 = Index only
ctable : 5 #SET_BY_MD Degrees for each index step with indexing spindle
use_frinv : no$ #SET_BY_CD Use Inverse Time Feedrates in 4 Axis, (0 = no, 1 = yes)
maxfrdeg : 2000 #SET_BY_MD Limit for feed in deg/min
maxfrinv : 999.99#SET_BY_MD Limit for feed inverse time
maxfrinv_m : 99.99 #SET_BY_MD Maximum feedrate - inverse time
frc_cinit : yes$ #Force C axis reset at toolchange
ctol : 225 #Tolerance in deg. before rev flag changes
ixtol : 0.01 #Tolerance in deg. for index error
frdegstp : 10 #Step limit for rotary feed in deg/min
rot_type : 1 #SET_BY_MD Rotary type - 0=signed continuous, 1=signed absolute, 2=shortest direction
force_index : no$ #Force rotary output to index mode when tool plane positioning with a full rotary
use_rotmcode : 0 #Output M-Code for Axis direction (sindx_mc)
#0 = Signed direction (only valid when rot_type = 1)
#1 = M-Code for direction
toolismetric : 0 #flag that tool is metric
tap_feedtype : 1 #0 = Units Per Minute (G94)
#1 = Units Per Revolution (G95)
#Rotary Axis Label options
use_md_rot_label : no$ #Use rotary axis label from machine def? - Leave set to 'no' until available
srot_x : "A" #Label applied to rotary axis movement - rotating about X axis - used when use_md_rot_label = no
srot_y : "B" #Label applied to rotary axis movement - rotating about Y axis - used when use_md_rot_label = no
srot_z : "C" #Label applied to rotary axis movement - rotating about Z axis - used when use_md_rot_label = no
sminus : "-" #Address for the rotary axis (signed motion)
#Axis locking
rot_lock : 0 #Use rotary axis lock/unlock codes (0 = no, 1 = yes)
slock : "M10" #Axis lock
sunlock : "M11" #Axis unlock
# --------------------------------------------------------------------------
# Common User-defined Variable Initializations (not switches!)
# --------------------------------------------------------------------------
xia : 0 #Formatted absolute value for X incremental calculations
yia : 0 #Formatted absolute value for Y incremental calculations
zia : 0 #Formatted absolute value for Z incremental calculations
cia : 0 #Formatted absolute value for C incremental calculations
cuttype : 0 #Cut type flag
#0 = Tool Plane, 1 = Axis Subs, 2 = Polar, 3 = 4/5 axis
bld : 0 #Block delete active
result : 0 #Return value for functions
sav_spc : 0 #Save spaces
sav_gcode : 0 #Gcode saved
sav_absinc : 0 #Absolute/Incremental Saved Value
sav_coolant : 0 #Coolant saved
sav_frc_wcs : 0 #Force work offset flag saved
toolchng : 1 #On a toolchange flag
toolchng0 : 0 #On a null toolchange flag
spdir2 : 1 #Copy for safe spindle direction calculation
#Drill variables
drlgsel : -1 #Drill Select Initialize
drillref : 0 #Select drill reference
drlgcode : 0 #Save Gcode in drill
sav_dgcode : 0 #Drill gcode saved
#Subprogram variables
mr_rt_actv : 0 #Flag to indicate if G51/G68 is active
#0=Off, 1=Rotate initial, 2=G68 Subprogram call/start, 3=Mirror, Neg. enable restore
mr_rt_rst : 0 #Flag to restore abs/inc when G51/G68 is active
rt_csav : 0 #C saved value
end_sub_mny : 0 #Many tool setting captured at transform sub end
#Rotary/Index variables
csav : 0 #C saved value
prvcabs : 0 #Saved cabs from pe_inc_calc,
#Used for rotary feed and direction calculations
cdelta : 0 #Calculation for angle change
cdelta_calc : 0 #Rotation calculation
rev : 0 #Calculation for deg/min
sav_rev : 0 #Saved revolution counter
indx_out : c9k #Rotation direction calculation
fmt 16 indx_mc #Rotation direction calculation
rev_brkflag : 0 #Revolution break flag. 0 = No break, 1 = Break every 90 or 360 degrees (see pmotion_su)
#Vector Constants for Rotatary Calculations
aaxisx : 1 #A axis rotation vector constant
aaxisy : 0 #A axis rotation vector constant
aaxisz : 0 #A axis rotation vector constant
baxisx : 0 #B axis rotation vector constant
baxisy : 1 #B axis rotation vector constant
baxisz : 0 #B axis rotation vector constant
caxisx : 0 #C axis rotation vector constant
caxisy : 0 #C axis rotation vector constant
caxisz : 1 #C axis rotation vector constant
#Feedrate calculation variables
frdelta : 0 #Calculation for deg/min
frinv : 0 #Feedrate inverse time
frdeg : 0 #Feedrate deg/min actual
prvfrdeg : 0 #Feedrate deg/min actual
ldelta : 0 #Calculation for deg/min, linear
cldelta : 0 #Calculation for deg/min, linear and rotary
circum : 0 #Calculation for deg/min
ipr_type : 0 #Feedrate for Rotary, 0 = UPM, 1 = DPM, 2 = Inverse
comp_type : 0 #Cutter compensation type - 0=computer, 1=control, 2=wear, 3=reverse wear, 4=off
#rotary_axis2 values are not consistent with rot_on_x values. Need to add 1 to rotary_axis2 to compare them.
rotary_axis2 : c9k #Rotary axis selected in Multiaxis Drill and Curve 5 Axis, 0=X, 1=Y, 2=Z
#Coolant variables for X style coolant
cant_pos : 0 #Read from current canned text (cant_pos1 - cant_pos20)
coolant_bin : 0 #Binary value for current coolant command
coolant_on : 0 #Binary value holding the sum of all coolants currently on
coolantx : 0 #Selector variable for coolant string selector
local_int : 0 #Local variable for output of coolant off commands
result2 : 0 #Return value for functions
suppress : 0 #Flag used to suppress redundant coolant on commands
all_cool_off : 0 #First coolant off command shuts off ALL coolant options
#Variables to capture parameter values - use to set post switches in pset_mach
rotaxerror : 0 #Error flag
rot_axis : 0 #Axis of rotation - 1=X, 2=Y, 3=Z
rot_dir : 0 #Rotary direction - CW is positive, 0 = false, 1 = true
rot_index : 0 #Index or continuous - 0 = continuous, 1 = index
rot_angle : 0 #Degrees for each index step with indexing spindle
rot_zero : 0 #Rotary zero degree position (NOT CURRENTLY IMPLEMENTED)
rot_ax_cnt : 0 #Rotary axis counter
component_type : 0 #Component type: (See documentation for complete list - )
#0 = MACHINE
#1 = STOCK_COMPONENT
#2 = MISC_COMPONENT
#3 = MACHINE_BASE_COMPONENT
#4 = LINEAR_AXIS_COMPONENT
#5 = ROTARY_AXIS_COMPONENT
#6 = RECT_TABLE_COMPONENT
#12 = CHUCK_COMPONENT
#24 = TOOL_SPINDLE_COMPONENT
#23 = ATC_COMPONENT
z_dir : 0 #Z Axis direction flag
axis_label : 0 #Axis label - 1=X,2=Y,3=Z
srot_label : "" #Rotary Axis label (Generally A, B or C)
sav_srot_label : "" #Store original rotary axis label (required for signed rotation output rot_type = 1)
sav_index : 0 #Store original index value
# --------------------------------------------------------------------------
#String and string selector definitions for NC output
# --------------------------------------------------------------------------
#Address string definitions
strm : "M"
strn : "N"
stro : "O"
strp : "P"
srad : "R"
srminus : "R-"
sblank : ""
#Cantext string definitions (spaces must be padded here)
sm00 : "M00"
sm01 : "M01"
strtextno : ""
strcantext : ""
#Transform mirror and rotate codes
strns_mir_on : "G51.1" #Programmable mirror image code
strns_mir_off : "G50.1" #Programmable mirror image cancel code
strns_rot_on : "G68" #Coordinate System Rotation
strns_rot_off : "G69" #Coordinate System Rotation Cancel
#Misc. string definitions
sopen_prn : "(" #String for open parenthesis "("
sclose_prn : ")" #String for close parenthesis ")"
sdelimiter : "|" #String for delimiter
sg95 : "G95" #Feed per rotation
sm29 : "M29" #Rigid tapping preperation support function
sg80 : "G80" #Cancel canned drilling cycle
sg43 : "G43" #Tool length compensation
sg49 : "G49" #Tool length compensation cancel
sg92 : "G92" #Set work piece coordinate system
sm06 : "M6" #Toolchange
# --------------------------------------------------------------------------
# Error messages
# --------------------------------------------------------------------------
saxiserror : "WARNING - DEFINED AXIS OF ROTATION DOES NOT MATCH OPERATION'S AXIS OF ROTATION - OUTPUT MAY BE INVALID"
sindxerror : "WARNING - INDEX ANGLE DOES NOT MATCH POST SETTING ('ctable')"
stlorgerr : "ERROR - TOOL ORIGIN DOES NOT MATCH CENTER OF ROTATION IN POLAR MILLING"
shomeserror : "ERROR - WORK OFFSET USAGE DOES NOT SUPPORT TRANSFORM SUBPROGRAM"
sprgnerror : "ERROR - SUBPROGRAM NUMBER MATCHES THE MAIN PROGRAM NUMBER"
srotaxerror : "ERROR - MORE THAN 1 ROTARY AXIS DETECTED IN SELECTED AXIS COMBINATION - OUTPUT MAY BE INVALID"
# --------------------------------------------------------------------------
# General G and M Code String select tables
# --------------------------------------------------------------------------
# Motion G code selection
sg00 : "G0" #Rapid
sg01 : "G1" #Linear feed
sg02 : "G2" #Circular interpolation CW
sg03 : "G3" #Circular interpolation CCW
sg04 : "G4" #Dwell
sgcode : "" #Target string
fstrsel sg00 gcode$ sgcode 5 -1
# --------------------------------------------------------------------------
# Select work plane G code
sg17 : "G17" #XY plane code
sg19 : "G19" #YZ plane code
sg18 : "G18" #XZ plane code
sgplane : "" #Target string
fstrsel sg17 plane$ sgplane 3 -1
# --------------------------------------------------------------------------
#Select english/metric code
sg20 : "G20" #Inch code
sg21 : "G21" #Metric code
smetric : "" #Target string
fstrsel sg20 met_tool$ smetric 2 -1
# --------------------------------------------------------------------------
#Select reference return code
sg28 : "G28" #First reference point return
sg30 : "G30" #Second reference point return
sg28ref : "" #Target string
fstrsel sg28 mi3$ sg28ref 2 -1
# --------------------------------------------------------------------------
# Cutter compensation G code selection
scc0 : "G40" #Cancel cutter compensation
scc1 : "G41" #Cutter compensation left
scc2 : "G42" #Cutter compensation right
sccomp : "" #Target string
fstrsel scc0 cc_pos$ sccomp 3 -1
# --------------------------------------------------------------------------
# Canned drill cycle string select
sg81 : "G81" #drill - no dwell
sg81d : "G82" #drill - with dwell
sg83 : "G83" #peck drill - no dwell
sg83d : "G83" #peck drill - with dwell
sg73 : "G73" #chip break - no dwell
sg73d : "G73" #chip break - with dwell
sg84 : "G84" #tap - right hand
sg84d : "G74" #tap - left hand
sg85 : "G85" #bore #1 - no dwell
sg85d : "G89" #bore #1 - with dwell
sg86 : "G86" #bore #2 - no dwell
sg86d : "G86" #bore #2 - with dwell
sgm1 : "G76" #fine bore - no dwell
sgm1d : "G76" #fine bore - with dwell
sgm2 : "G84" #rigid tap - right hand
sgm2d : "G74" #rigid tap - left hand
sgdrill : "" #Target string
fstrsel sg81 drlgsel sgdrill 16 -1
# --------------------------------------------------------------------------
# Select incremental or absolute G code
sg90 : "G90" #Absolute code
sg91 : "G91" #Incremental code
sgabsinc : "" #Target string
fstrsel sg90 absinc$ sgabsinc 2 -1
# --------------------------------------------------------------------------
# Feed mode G code selection
sg94 : "G94" #UPM
sg94d : "G94" #DPM, See pfcalc_deg if you use another gcode
sg93 : "G93" #Inverse
sgfeed : "" #Target string
fstrsel sg94 ipr_type sgfeed 3 -1
# --------------------------------------------------------------------------
#Canned drill cycle reference height
sg98 : "G98" #Reference at initht
sg99 : "G99" #Reference at refht
sgdrlref : "" #Target string
fstrsel sg98 drillref sgdrlref 2 -1
# --------------------------------------------------------------------------
# Generate string for spindle
sm04 : "M4" #Spindle reverse
sm05 : "M5" #Spindle off
sm03 : "M3" #Spindle forward
spindle : "" #Target string
fstrsel sm04 spdir2 spindle 3 -1
# --------------------------------------------------------------------------
# Coolant M code selection for V9 style coolant
# Note: To enable V9 style coolant, click on the General Machine Parameters icon
# in the Machine Definition Manager, Coolant tab, enable first check box
# Output of V9 style coolant commands in this post is controlled by scoolant
sm09 : "M9" #Coolant Off
sm08 : "M8" #Coolant Flood
sm08_1 : "M8" #Coolant Mist
sm08_2 : "M8" #Coolant Tool
scoolant : "" #Target string
fstrsel sm09 coolant$ scoolant 4 -1
# --------------------------------------------------------------------------
# Coolant output code selection for X style coolant
# Note: To enable X style coolant, click on the General Machine Parameters icon
# in the Machine Definition Manager, Coolant tab, disable first check box
# Output of X style coolant commands in this post is controlled by pcan, pcan1, & pcan2
scool50 : "M8" #Coolant 1 on value
scool51 : "M9" #Coolant 1 off value
scool52 : "M7" #Coolant 2 on value
scool53 : "M9" #Coolant 2 off value
scool54 : "M88" #Coolant 3 on value
scool55 : "M89" #Coolant 3 off value
scool56 : "M8(Coolant4=ON)" #Coolant 4 on value
scool57 : "M9(Coolant4=OFF)" #Coolant 4 off value
scool58 : "M8(Coolant5=ON)" #Coolant 5 on value
scool59 : "M9(Coolant5=OFF)" #Coolant 5 off value
scool60 : "M8(Coolant6=ON)" #Coolant 6 on value
scool61 : "M9(Coolant6=OFF)" #Coolant 6 off value
scool62 : "M8(Coolant7=ON)" #Coolant 7 on value
scool63 : "M9(Coolant7=OFF)" #Coolant 7 off value
scool64 : "M8(Coolant8=ON)" #Coolant 8 on value
scool65 : "M9(Coolant8=OFF)" #Coolant 8 off value
scool66 : "M8(Coolant9=ON)" #Coolant 9 on value
scool67 : "M9(Coolant9=OFF)" #Coolant 9 off value
scool68 : "M8(Coolant10=ON)" #Coolant 10 on value
scool69 : "M9(Coolant10=OFF)" #Coolant 10 off value
scoolantx : "" #Target string
fstrsel scool50 coolantx scoolantx 20 -1
# --------------------------------------------------------------------------
#X coolant has the option - First coolant off command shuts off ALL coolant options
sall_cool_off : "M09" #Coolant off command output with all_cool_off
# --------------------------------------------------------------------------
# Table rotation direction, index
sindx_cw : "M22" #Rotate CW code
sindx_ccw : "M21" #Rotate CCW code
sindx_mc : "" #Target string
fstrsel sindx_cw indx_mc sindx_mc 2 -1
# --------------------------------------------------------------------------
# Define the gear selection code
flktbl 1 3 #Lookup table definition - table no. - no. entries
40 0 #Low gear range
41 400 #Med gear range
42 2250 #Hi gear range
# --------------------------------------------------------------------------
# Define coolant binary value for X style coolant
flktbl 2 20 #Lookup table definition - table no. - no. entries
1 50 #Coolant 1 on value
2 51 #Coolant 1 off value
4 52 #Coolant 2 on value
8 53 #Coolant 2 off value
16 54 #Coolant 3 on value
32 55 #Coolant 3 off value
64 56 #Coolant 4 on value
128 57 #Coolant 4 off value
256 58 #Coolant 5 on value
512 59 #Coolant 5 off value
1024 60 #Coolant 6 on value
2048 61 #Coolant 6 off value
4096 62 #Coolant 7 on value
8192 63 #Coolant 7 off value
16384 64 #Coolant 8 on value
32768 65 #Coolant 8 off value
65536 66 #Coolant 9 on value
131072 67 #Coolant 9 off value
262144 68 #Coolant 10 on value
524288 69 #Coolant 10 off value
# --------------------------------------------------------------------------
# Month selector
smon0 : ""
smon1 : "JAN."
smon2 : "FEB."
smon3 : "MAR."
smon4 : "APR."
smon5 : "MAY."
smon6 : "JUN."
smon7 : "JUL."
smon8 : "AUG."
smon9 : "SEP."
smon10 : "OCT."
smon11 : "NOV."
smon12 : "DEC."
smonth : "" #Target string
fstrsel smon0 month$ smonth 13 -1
# --------------------------------------------------------------------------
# Cutter Compensation Type
scomp : "COMPUTER"
scomp1 : "CONTROL COMP"
scomp2 : "WEAR COMP"
scomp3 : "REVERSE WEAR COMP"
scomp4 : "OFF"
scomp_type : "" #Target string
fstrsel scomp comp_type scomp_type 5 -1
# --------------------------------------------------------------------------
# Format statements - n=nonmodal, l=leading, t=trailing, i=inc, d=delta
# --------------------------------------------------------------------------
#Default english/metric position format statements
fs2 1 0.7 0.6 #Decimal, absolute, 7 place, default for initialize (:)
fs2 2 0.4 0.3 #Decimal, absolute, 4/3 place
fs2 3 0.4 0.3d #Decimal, delta, 4/3 place
#Common format statements
fs2 4 1 0 1 0 #Integer, not leading
fs2 5 2 0 2 0l #Integer, force two leading
fs2 6 3 0 3 0l #Integer, force three leading
fs2 7 4 0 4 0l #Integer, force four leading
fs2 9 0.1 0.1 #Decimal, absolute, 1 place
fs2 10 0.2 0.2 #Decimal, absolute, 2 place
fs2 11 0.3 0.3 #Decimal, absolute, 3 place
fs2 12 0.4 0.4 #Decimal, absolute, 4 place
fs2 13 0.5 0.5 #Decimal, absolute, 5 place
fs2 14 0.3 0.3d #Decimal, delta, 3 place
fs2 15 0.2 0.1 #Decimal, absolute, 2/1 place (feedrate)
fs2 16 1 0 1 0n #Integer, forced output
fs2 17 0.2 0.3 #Decimal, absolute, 2/3 place (tapping feedrate)
# These formats used for 'Date' & 'Time'
fs2 18 2.2 2.2lt #Decimal, force two leading & two trailing (time2)
fs2 19 2 0 2 0t #Integer, force trailing (hour)
fs2 20 0 2 0 2lt #Integer, force leading & trailing (min)
# This format statement is used for sequence number output
# Number of places output is determined by value for "Increment Sequence Number" in CD
# Max depth to the right of the decimal point is set in the fs statement below
fs2 21 0^7 0^7 #Decimal, 7 place, omit decimal if integer value
fs2 22 0^3 0^3 #Decimal, 3 place, omit decimal if integer value
# --------------------------------------------------------------------------
# Toolchange / NC output Variable Formats
# --------------------------------------------------------------------------
fmt "T" 4 t$ #Tool number
fmt "T" 4 first_tool$ #First tool used
fmt "T" 4 next_tool$ #Next tool used
fmt "D" 4 tloffno$ #Diameter offset number
fmt "H" 4 tlngno$ #Length offset number
fmt "G" 4 g_wcs #WCS G address
fmt "P" 4 p_wcs #WCS P address
fmt "S" 4 speed #Spindle Speed
fmt "M" 4 gear #Gear range
# --------------------------------------------------------------------------
fmt "N" 21 n$ #Sequence number
fmt "X" 2 xabs #X position output
fmt "Y" 2 yabs #Y position output
fmt "Z" 2 zabs #Z position output
fmt "X" 3 xinc #X position output
fmt "Y" 3 yinc #Y position output
fmt "Z" 3 zinc #Z position output
fmt "A" 11 cabs #C axis position
fmt "A" 14 cinc #C axis position
fmt "A" 22 indx_out #Index position
fmt "R" 14 rt_cinc #C axis position, G68
fmt "I" 3 iout #Arc center description in X
fmt "J" 3 jout #Arc center description in Y
fmt "K" 3 kout #Arc center description in Z
fmt "R" 2 arcrad$ #Arc Radius
fmt "F" 15 feed #Feedrate
fmt "P" 11 dwell$ #Dwell
fmt "M" 5 cantext$ #Canned text
fmt "F" 2 pitch #Tap pitch (units per thread)
# --------------------------------------------------------------------------
#Move comment (pound) to output colon with program numbers
fmt "O" 7 progno$ #Program number
#fmt ":" 7 progno$ #Program number
fmt "O" 7 main_prg_no$ #Program number
#fmt ":" 7 main_prg_no$ #Program number
fmt "O" 7 sub_prg_no$ #Program number
#fmt ":" 7 sub_prg_no$ #Program number
fmt "X" 2 sub_trnsx$ #Rotation point
fmt "Y" 2 sub_trnsy$ #Rotation point
fmt "Z" 2 sub_trnsz$ #Rotation point
# --------------------------------------------------------------------------
fmt "Q" 2 peck1$ #First peck increment (positive)
fmt "Q" 2 shftdrl$ #Fine bore tool shift
fmt "R" 2 refht_a #Reference height
fmt "R" 2 refht_i #Reference height
# --------------------------------------------------------------------------
fmt "TOOL - " 4 tnote #Note format
fmt "DIA. OFF. - " 4 toffnote #Note format
fmt "LEN. - " 4 tlngnote #Note format
fmt "TOOL DIA. - " 1 tldia$ #Note format
fmt "XY STOCK TO LEAVE - " 2 xy_stock #Note format
fmt "Z STOCK TO LEAVE - " 2 z_stock #Note format
# --------------------------------------------------------------------------
fmt 4 year2 #Calculated year value
fmt 18 time2 #Capture 24-hour time value into 'time2' variable
fmt 19 hour #Hour
fmt 20 min #Minutes
year2 = year$ + 2000
# --------------------------------------------------------------------------
# Tool Comment / Manual Entry Section
# --------------------------------------------------------------------------
ptoolcomment #Comment for tool
tnote = t$, toffnote = tloffno$, tlngnote = tlngno$
if tool_info = 1 | tool_info = 3,
sopen_prn, pstrtool, sdelimiter, *tnote, sdelimiter, *toffnote, sdelimiter, *tlngnote, sdelimiter, *tldia$, sclose_prn, e$
ptooltable #Tooltable output
sopen_prn, *t$, sdelimiter, pstrtool, sdelimiter, *tlngno$,
[if comp_type > 0 & comp_type < 4, sdelimiter, *tloffno$, sdelimiter, *scomp_type, sdelimiter, *tldia$],
[if xy_stock <> 0 | z_stock <> 0, sdelimiter, *xy_stock, sdelimiter, *z_stock],
sclose_prn, e$
xy_stock = 0 #Reset stock to leave values
z_stock = 0 #Reset stock to leave values
pstrtool #Comment for tool
if strtool$ <> sblank,
[
strtool$ = ucase(strtool$)
*strtool$
]
pcomment$ #Comment from manual entry (must call pcomment2)
pcomment2 #Required if doing boolean 'if' logic testing!
pcomment2 #Output Comment from manual entry
scomm$ = ucase (scomm$)
if gcode$ = 1005, sopen_prn, scomm$, sclose_prn, e$ #Manual entry - as comment
if gcode$ = 1006, scomm$, e$ #Manual entry - as code
if gcode$ = 1007, sopen_prn, scomm$, sclose_prn #Manual entry - as comment with move NO e$
if gcode$ = 1026, scomm$ #Manual entry - as code with move NO e$
if gcode$ = 1008, sopen_prn, scomm$, sclose_prn, e$ #Operation comment
if gcode$ = 1051, sopen_prn, scomm$, sclose_prn, e$ #Machine name
if gcode$ = 1052, sopen_prn, scomm$, sclose_prn, e$ #Group comment
if gcode$ = 1053, sopen_prn, scomm$, sclose_prn, e$ #Group name
if gcode$ = 1054, sopen_prn, scomm$, sclose_prn, e$ #File Descriptor
# --------------------------------------------------------------------------
# Start of File and Toolchange Setup
# --------------------------------------------------------------------------
ptime #Convert 24-hour time format into 12-hour AM/PM format
if time$ >= 13, time2 = (time$ - 12)
else, time2 = time$
hour = int(time2), min = frac(time2)
*hour, ":", *min,
if time$ > 12, " PM"
else, " AM"
pheader$ #Call before start of file
"%", e$
sav_spc = spaces$
spaces$ = 0
*progno$, sopen_prn, sprogname$, sclose_prn, e$
#sopen_prn, "PROGRAM NAME - ", sprogname$, sclose_prn, e$
sopen_prn, "DATE=DD-MM-YY - ", date$, " TIME=HH:MM - ", time$, sclose_prn, e$ #Date and time output Ex. 12-02-05 15:52
#sopen_prn, "DATE - ", month$, "-", day$, "-", year$, sclose_prn, e$ #Date output as month,day,year - Ex. 02-12-05
#sopen_prn, "DATE - ", *smonth, " ", day$, " ", *year2, sclose_prn, e$ #Date output as month,day,year - Ex. Feb. 12 2005
#sopen_prn, "TIME - ", time$, sclose_prn, e$ #24 hour time output - Ex. 15:52
#sopen_prn, "TIME - ", ptime sclose_prn, e$ #12 hour time output 3:52 PM
spathnc$ = ucase(spathnc$)
smcname$ = ucase(smcname$)
stck_matl$ = ucase(stck_matl$)
snamenc$ = ucase(snamenc$)
sopen_prn, "MCX FILE - ", *smcpath$, *smcname$, *smcext$, sclose_prn, e$
sopen_prn, "NC FILE - ", *spathnc$, *snamenc$, *sextnc$, sclose_prn, e$
sopen_prn, "MATERIAL - ", *stck_matl$, sclose_prn, e$
spaces$ = sav_spc
psof0$ #Start of file for tool zero
psof$
psof$ #Start of file for non-zero tool number
pcuttype
toolchng = one
if ntools$ = one,
[
#skip single tool outputs, stagetool must be on
stagetool = m_one
!next_tool$
]
pbld, n$, *smetric, e$
pbld, n$, *sgcode, *sgplane, scc0, sg49, sg80, *sgabsinc, e$
sav_absinc = absinc$
if mi1$ <= one, #Work coordinate system
[
absinc$ = one
pfbld, n$, sgabsinc, *sg28ref, "Z0.", e$
pfbld, n$, *sg28ref, "X0.", "Y0.", e$
pfbld, n$, sg92, *xh$, *yh$, *zh$, e$
absinc$ = sav_absinc
]
pcom_moveb
pcheckaxis
c_mmlt$ #Multiple tool subprogram call
ptoolcomment
comment$
pcan
pbld, n$, *t$, sm06, e$
pindex
if mi1$ > one, absinc$ = zero
pcan1, pbld, n$, *sgcode, *sgabsinc, pwcs, pfxout, pfyout, pfcout,
[if nextdc$ <> 7, *speed, *spindle], pgear, strcantext, e$
pbld, n$, sg43, *tlngno$, pfzout, scoolant, pstagetool, e$
absinc$ = sav_absinc
pbld, n$, sgabsinc, e$
pcom_movea
toolchng = zero
c_msng$ #Single tool subprogram call
ptlchg0$ #Call from NCI null tool change (tool number repeats)
pcuttype
toolchng0 = one
pcom_moveb
pcheckaxis
c_mmlt$ #Multiple tool subprogram call
comment$
pcan
result = newfs(15, feed) #Reset the output format for 'feed'
pbld, n$, sgplane, e$
pspindchng
pbld, n$, scoolant, e$
if mi1$ > one & workofs$ <> prv_workofs$,
[
sav_absinc = absinc$
absinc$ = zero
pbld, n$, sgabsinc, pwcs, pfxout, pfyout, pfzout, pfcout, e$
pe_inc_calc
ps_inc_calc
absinc$ = sav_absinc
]
if cuttype = zero, ppos_cax_lin
if gcode$ = one, plinout
else, prapidout
pcom_movea
toolchng0 = zero
c_msng$ #Single tool subprogram call
!xnci$, !ynci$, !znci$
ptlchg$ #Tool change
pcuttype
toolchng = one
if mi1$ = one, #Work coordinate system
[
pfbld, n$, *sg28ref, "X0.", "Y0.", e$
pfbld, n$, sg92, *xh$, *yh$, *zh$, e$
]
if prog_stop = 1, pbld, n$, *sm01, e$
if prog_stop = 2, pbld, n$, *sm00, e$
pcom_moveb
pcheckaxis
c_mmlt$ #Multiple tool subprogram call
ptoolcomment
comment$
pcan
result = newfs(15, feed) #Reset the output format for 'feed'
pbld, n$, *t$, sm06, e$
pindex
sav_absinc = absinc$
if mi1$ > one, absinc$ = zero
pcan1, pbld, n$, *sgcode, *sgabsinc, pwcs, pfxout, pfyout, pfcout,
[if nextdc$ <> 7, *speed, *spindle], pgear, strcantext, e$
pbld, n$, sg43, *tlngno$, pfzout, scoolant, pstagetool, e$
absinc$ = sav_absinc
pbld, n$, sgabsinc, e$
pcom_movea
toolchng = zero
c_msng$ #Single tool subprogram call
!xnci$, !ynci$, !znci$
pstagetool #Pre-stage tools
if stagetool = 1,
[
if ttblend$, #Check for last toolchange
[
if stagetltype = 1, *next_tool$ #stage first tool at last toolchange
]
else, *next_tool$ #stage tool at every toolchange
]
pretract #End of tool path, toolchange
sav_absinc = absinc$
absinc$ = one
sav_coolant = coolant$
coolant$ = zero
# if nextop$ = 1003, #Uncomment this line to leave coolant on until eof unless
[ # explicitely turned off through a canned text edit
if all_cool_off,
[
#all coolant off with a single off code here
if coolant_on, pbld, n$, sall_cool_off, e$
coolant_on = zero
]
else,
[
local_int = zero
coolantx = zero
while local_int < 20 & coolant_on > 0,
[
coolantx = and(2^local_int, coolant_on)
local_int = local_int + one
if coolantx > zero,
[
coolantx = local_int
pbld, n$, scoolantx, e$
]
coolantx = zero
]
coolant_on = zero
]
]
#cc_pos is reset in the toolchange here
cc_pos$ = zero
gcode$ = zero
pbld, n$, sccomp, *sm05, psub_end_mny, e$
pbld, n$, sgabsinc, sgcode, *sg28ref, "Z0.", scoolant, e$
if nextop$ = 1003 | tlchg_home, pbld, n$, *sg28ref, "X0.", "Y0.", protretinc, e$
else, pbld, n$, protretinc, e$
absinc$ = sav_absinc
coolant$ = sav_coolant
protretinc #Reset the C axis revolution counter
if frc_cinit & rot_on_x,
[
rev = zero
sav_rev = zero
cabs = zero
csav = zero
indx_out = zero
if index, e$, pindxcalc, pindex
else, *cabs
prvcabs = zero
!csav, !cabs
]
peof0$ #End of file for tool zero
peof$
peof$ #End of file for non-zero tool
pretract
comment$
if stagetool = 1 & stagetltype = 2, pbld, n$, *first_tool$, e$
n$, "M30", e$
mergesub$
clearsub$
mergeaux$
clearaux$
"%", e$
pwcs #G54+ coordinate setting at toolchange
if mi1$ > one,
[
sav_frc_wcs = force_wcs
if sub_level$ > 0, force_wcs = zero
if workofs$ <> prv_workofs$ | (force_wcs & toolchng),