[SprutCAM postprocessor] Version 4 NC Mach2 Machine PCNC1100 Date 08.06.2007 Authors J A Prentice Comment Adapted JAP Rev 4A (June 2007) Extension TAP [Common definitions] Spaces Y ! Y / N CtrInc Y ! Y / N ArcDivision N ! N / 90 / 180 Helical Y ! Y / N MaxRad 360 ! >= 0 LinearMovement N ! Y / N UpperCaseComment N ! Y / N Sequence N 1 10 10 ! Symbol Frequence StepValue StartValue Xmax 1200 ! >= 0 Ymax 600 ! >= 0 Zmax 400 ! >= 0 [Block format] ! Id(id) Sign(+-,-) BP(nz) P(Y,AY) AP(nz) Name(name) Scale() Comment() Id(N) Sign() BP(4) P() AP() Name(BLOCKN) Scale (1) Id(G) Sign() BP(2) P() AP() Name(ABS_INC) Scale (1) Id(G) Sign() BP(2) P() AP() Name(COORDSYS) Scale (1) Id(G) Sign() BP(2) P() AP() Name(INTERP_) Scale (1) Id(G) Sign() BP(2) P() AP() Name(GFUNC) Scale (1) Id(G) Sign() BP(2) P() AP() Name(PLANE) Scale (1) Id(M) Sign(-) BP(3) P() AP() Name(GoTCP) Scale (1) Id(G) Sign() BP(2) P() AP() Name(KORECV) Scale (1) Id(G) Sign() BP(2) P() AP() Name(CYCLE) Scale (1) Id(X) Sign(-) BP(4) P(AY) AP(4) Name(X) Scale (1) Id(X) Sign() BP(3) P(AY) AP(3) Name(PAUSE) Scale (1) Id(Y) Sign(-) BP(4) P(AY) AP(4) Name(Y) Scale (1) Id(Z) Sign(-) BP(4) P(AY) AP(4) Name(Z) Scale (1) Id(I) Sign(-) BP(4) P(AY) AP(4) Name(XC_) Scale (1) Id(J) Sign(-) BP(4) P(AY) AP(4) Name(YC_) Scale (1) Id(K) Sign(-) BP(4) P(AY) AP(4) Name(ZC_) Scale (1) Id(A) Sign(-) BP(4) P(AY) AP(4) Name(ANGLE) Scale (1) Id(Z) Sign(-) BP(4) P(AY) AP(4) Name(ZCYCLE) Scale (1) Id(R) Sign(-) BP(4) P(AY) AP(4) Name(ZCLEAR) Scale (1) Id(Q) Sign(-) BP(4) P(AY) AP(4) Name(Q) Scale (1) Id(F) Sign() BP(4) P() AP() Name(FEED_) Scale (1) Id(D) Sign() BP(2) P() AP() Name(D) Scale (1) Id(S) Sign() BP(4) P() AP() Name(S) Scale (1) Id(T) Sign() BP(4) P() AP() Name(TOOL) Scale (1) Id(G) Sign() BP(2) P() AP() Name(KORDL) Scale (1) Id(H) Sign() BP(2) P() AP() Name(H) Scale (1) Id(M) Sign() BP(1) P() AP() Name(Msm) Scale (1) Id(M) Sign() BP(2) P() AP() Name(M) Scale (1) Id(M) Sign() BP(2) P() AP() Name(MSP) Scale (1) Id(M) Sign() BP(2) P() AP() Name(MC) Scale (1) Id(P) Sign() BP(2) P(AY) AP(1) Name(P) Scale (1) Id(A) Sign(-) BP(4) P(AY) AP(4) Name(AT) Scale (1) Id(B) Sign(-) BP(4) P(AY) AP(4) Name(BT) Scale (1) Id(C) Sign(-) BP(4) P(AY) AP(4) Name(CT) Scale (1) Id(L) Sign() BP(4) P() AP() Name(L) Scale (1) [Mask block begin] [Mask block end] [Programs block begin] program AbsMlt if Abs_Inc = 91 then Abs_Inc = 90 if INTERP_ > 1 then INTERP_ = 1 ! G1 X = cld[1] ! X,Y,Z in absolutes Y = cld[2] Z = cld[3] ! AT = cld[4] ! BT = cld[5] ! CT = cld[6] AT=asin(cld[6]) CT=acos( cld[4]/(sqr(1-cld[6]*cld[6])) ) call OutBl ! output to NC block XT_ = X; YT_ = Y; ZT_ = Z ! save current coordinates end program AbsMov if Abs_Inc = 91 then Abs_Inc = 90 if INTERP_ > 1 then INTERP_ = 1 ! G1 X = cld[1] ! X,Y,Z in absolutes Y = cld[2] Ztmp = cld[3] if Ztmp<>Z@ and IsFirstMove<>0 then begin Mtmp=Mc Mc=Mc@ COORDSYS=54 COORDSYS@=0 INTERP_ = 0 INTERP_@ = -5 call OutBl IsFirstMove=0 Mc=Mtmp end Z = cld[3] if Z<>Z@ then begin if H_<>0 then KorDl=43 !else KorDl=49 H=H_ end if cycleon = 1 then jump 1 ! when drilling, don't output X/Y pos call OutBl ! output to NC block XT_ = X; YT_ = Y; ZT_ = Z ! save current coordinates 1: end program Circle if cld[4] > 0 then INTERP_ = 3 else INTERP_ = 2 ! G3/G2 XC_ = cld[1] - XT_ ! I,J,K in increments always YC_ = cld[2] - YT_ ZC_ = cld[3] - ZT_ X = cld[5] ! X,Y,Z in absolutes Y = cld[6] Z = cld[7] if ABS_INC = 91 then begin ! X,Y,Z in increments X = X - XT_ Y = Y - YT_ Z = Z - ZT_ end XC_@ = MaxReal; YC_@ = MaxReal; ZC_@ = MaxReal X@ = MaxReal; Y@ = MaxReal; Z@ = MaxReal case Plane of 17: begin ZC_@=ZC_; end ! Z@=Z !This line changed 17Jan07 by TM for helical path fix via Dave Pearson 18: begin YC_@=YC_; end ! Y@=Y 19: begin XC_@=XC_; end ! X@=X end call OutBl ! output to NC block XT_ = cld[5] ! save current coordinates YT_ = cld[6] ZT_ = cld[7] end program Comment ! PCNC 1100 code always has comment on new line OutBlock ! get Code out of our system cs$ = CLDATA$ if pos("@",cs$) = 1 then begin cs$ = copy(cs$,2,128) end Output "("+cs$+")" end program Common MAXREAL: Real MUSOR: Real XT_: Real FROMX_: Real YT_: Real FROMY_: Real ZT_: Real FROMZ_: Real CYCLEON: Real KODCYCLE: Real ZA: Real ZF: Real ZP_: Real ZL: Real ZI: Real DWELL: Real FR: Real RC: Real REPP1: Real REPP2: Real REPP3: Real REPP4: Real REPP5: Real REPL1: Real REPL2: Real REPL3: Real REPL4: Real REPL5: Real NN: Real RAPFR: Real ! SAFPOSFLAG: Real ! SAFPOSSTEP: Real ! TOOLFLAG: Real TOOL_: Real D_: Real H_: Real ISFIRSTMOVE: Real MUSOR$: String S$: String OPSK$: String MSpDir: Real ! to remember old spindle direction over TlCh end program CoolNt if Msp <> Msp@ or M <> M@ then call OutBl if cld[1] = 71 then Mc = 8 else Mc = 9 ! On/Off coolant end program CutCom if cld[2]=9 then begin ! LENGTH if cld[1]=71 then H_=cld[3] else H_=0 end else if cld[2]=23 then begin ! RADIUS if cld[1]=72 then KorEcv=40 else begin if cld[10]=24 then KorEcv=42 else KorEcv=41 D=cld[3] end end else begin ! cx=cld[4]; cy=cld[5]; cz=cld[6] ! X,Y,Z ! cxy=cld[7]; cxz=cld[8]; cyz=cld[9] ! XY,XZ,YZ end end program Cycle if cld[1]=71 then CycleOn = 1 ! cycle On else if cld[1]=72 then CycleOn = 0 ! cycle Off else begin CycleOn = 1 ! cycle On KodCycle = cld[1] Za = cld[2] ! work depth if cld[4] > 0 then begin ! creating FEED_ value if cld[3]=316 then Fr=cld[4]*S else Fr=cld[4] end Zf = cld[5] ! safe level ZP_ = cld[8] ! reverse move level if cld[1]=81 or cld[1]=212 or cld[1]=213 then Dwell = cld[10] ! FACE,BORE8,BORE9 else Dwell = 0 ! dwell time if cld[1]=153 or cld[1]=288 then begin ! DEEP,BRKCHP Zl = cld[6] ! depth of one drilling step Zi = cld[7] ! transitional value ZP_ = cld[8] ! reverse move level Dwell = cld[10] ! dwell time end end if CycleOn=1 then begin if Abs_Inc=90 then begin Zcycle=Zf-Za; ZClear=Zf end else begin Zcycle=-Za; ZClear=Zf-ZT_ end ! Zcycle@=0; ZClear@=0 ! switched off 17Jan07 by TM for multiple drill fix via Dave Pearson if Dwell<>0 then P=Dwell; Dwell=0 if Zl<>0 then Q=Zl; Zl=0; FEED_ = Fr case KodCycle of 163: Cycle = 81 ! DRILL 81 : Cycle = 82 ! FACE 168: Cycle = 84 ! TAP 209: Cycle = 85 ! BORE5 210: Cycle = 86 ! BORE6 211: Cycle = 87 ! BORE7 212: Cycle = 88 ! BORE8 213: Cycle = 89 ! BORE9 153: Cycle = 83 ! DEEP 288: Cycle = 73 ! BRKCHP end call OutBl end else Cycle = 80 ; call OutBl ! modified 1Oct07 per Dave Pearson to fix G80/G0 issue - ; call OutBl was added end program Delay call OutBl ! load old values to block XX = XT_; GG = GFunc ! save old values GFunc = 4 ! value G4 X = CLD[1] ! dwell value X@ = MaxReal ! dwell output be always call OutBl ! output NC block XT_ = XX; X = XX; X@ = XX ! restore old values GFunc = GG; GFunc@ = GG end program Fedrat FEED_ = cld[1] ! filling FEED_ rgister if INTERP_ = 0 then INTERP_ = 1 ! G1 end program Fini GoTCP@ = 0 GoTCP = 998 call OutBl ! output go to Tool Ch Pos Msp=5 Msp@=0 MC = 9 MC@ = 0 call OutBl ! output coolan/spindle OFF M = 30 ! M30 Rewind programm call OutBl ! output OutPut "%" end program From FROMX_=cld[1]; FROMY_=cld[2]; FROMZ_=cld[3] ! initial point coordinates X=FROMX_; X@=X; XT_=FROMX_ Y=FROMY_; Y@=Y; YT_=FROMY_ Z=FROMZ_; Z@=Z; ZT_=FROMZ_ end program GoHome ! Probably needs attention for PCNC if CycleOn=1 then begin CycleOn=0; Cycle=80; end !Interp = 0 !if Z<>FROMZ_ then begin ! if Abs_Inc=91 then begin ! Z=FROMZ_-ZT_ ! Z@=0 ! end else Z=FROMZ_ ! call OutBl !end !X=FROMX_; Y=FROMY_ !if Abs_Inc=91 then begin ! X=FROMX_-XT_ ! Y=FROMY_-YT_ ! X@=0; Y@=0 !end call OutBl ! Output in block !Xt = FROMX_ !Yt = FROMY_ !Zt = FROMZ_ end program Head ! when use NHead initialize in PARTNO ! if cld[1]=83 then begin ! BOTH ! end else NHead=cld[1] end program IncMlt if Abs_Inc = 90 then Abs_Inc = 91 if INTERP_ > 1 then INTERP_ = 1 ! G1 X = cld[1] ! X,Y,Z in increments Y = cld[2] Z = cld[3] ! AT = cld[4] ! BT = cld[5] ! CT = cld[6] AT = asin(cld[6]) CT = acos( cld[4]/(sqr(1-cld[6]*cld[6])) ) X@ = 0; Y@ = 0; Z@ = 0; ! output values different from zero call OutBl ! output to NC block XT_ = XT_ + X ! save current coordinates YT_ = YT_ + Y ZT_ = ZT_ + Z end program IncMov if Abs_Inc = 90 then Abs_Inc = 91 if INTERP_ > 1 then INTERP_ = 1 ! G1 X = cld[1] ! X,Y,Z in increments Y = cld[2] Z = cld[3] X@ = 0; Y@ = 0; Z@ = 0; ! output values different from zero call OutBl ! output to NC block XT_ = XT_ + X ! save current coordinates YT_ = YT_ + Y ZT_ = ZT_ + Z end program Incr if cld[1] = 71 then ABS_INC = 91 else ABS_INC = 90 ! G91/G90 end program LoadTl print OutStr$ Call OutBl ! clear out what we have been doing if CycleOn=1 then begin CycleOn=0; Cycle=80 end GoTCP@ = 0 GoTCP = 998 ! M998 added JAP 16/6/06 Call OutBl Tool_ = cld[1] ! filling Tool register ! D_ = cld[6] ! correction on radius H_ = cld[1] ! correction on length MSpDir = 0 if Msp<>5 then begin MSpDir = MSp MSp=5 call OutBl ! Stop spindle end Tool=Tool_ H = H_ KorDL@ = 0 ! so we get a new G43 KorDL = 43 Msm=6 Msm@ = 0 ! enforce an M6 Call OutBl If MSpDir <> 0 then begin MSp = MSpDir ! old Sp direction End Call OutBl ! start spindle Call Initialise end program OpSkip ! inputting block skipping value to predefined variable OPSK$ if cld[1] = 71 then OpSk$ = "/" else OpSk$ = "" end program OpStop if M <> M@ then call OutBl M = 1 ! M01 M@ = 0 end program Origin if cld[4] > 0 and cld[4] < 7 then begin X@=X; Y@=Y; Z@=Z case cld[4] of 1: GFunc = 54 2: GFunc = 55 3: GFunc = 56 4: GFunc = 57 5: GFunc = 58 6: GFunc = 59 end call OutBl end else if cld[4] = 1079 then begin X@=0; Y@=0; Z@=0 X=cld[1] Y=cld[2] Z=cld[3] GFunc=92 call OutBl end end program Paleta ! when use NPal initialize in PARTNO ! NPal=cld[1] end program PartNo ! Changes in moduls : ! 26.04.94 - Circle ! Initialization of global variables MaxReal = 99999.999 Musor = 0 Musor$ = "" XT_ = 0; FROMX_ = 0 YT_ = 0; FROMY_ = 0 ZT_ = 0; FROMZ_ = 0 ! Constsnt cycles variables CycleOn = 0 ! 0 - cycle Off, 1 - cycle On KodCycle = 0 ! constant cycle code Za = 0 ! work depth Zf = 0 ! safe level ZP_ = 0 ! reverse move level Zl = 0 ! depth of one drilling step Zi = 0 ! transitional value Dwell = 0 ! pause in constsnt cycles Fr = 0 ! work FEED_ ! Repetition variables Rc = 0 ! repetition cycles counter RepP1=0; RepP2=0; RepP3=0; RepP4=0; RepP5=0; ! number of repetition beginning block RepL1=0; RepL2=0; RepL3=0; RepL4=0; RepL5=0; ! number of repetitions in cycle ! Set machene functions by default X = MaxReal; X@=X Y = MaxReal; Y@=Y Z = MaxReal; Z@=Z Zcycle = MaxReal; Zcycle@ = ZCycle ! Initialise cycle depth value ! added 21 Jan07 by TM via Dave Pearson OutPut "%" ! Creating NC heading NN=len(cldata$)+1 2:NN = NN - 1 S$ = copy(cldata$,NN,1) if S$ = "\" then jump 3 if NN > 1 then jump 2 NN = NN - 1 3: S$=copy(Cldata$,NN+1,len(cldata$)-NN) output "O"+S$ BlockN = 1 RapFR = 2000 INTERP_ = 100; INTERP_@ = 100 Plane = 17 KorEcv = 40 KorDl = 49 Cycle = 80 ABS_INC = 90 ! Msp = 5 ! Mc = 9 OutBlock ! ABS_INC = 90 OutStr$=""; OpSk$ = ""; SafPosFlag=0; ! Flag SafPos SafPosStep=0; ! steps counter with finalising SafPos in SPRUT ToolFlag=0; Tool_=0; ! tool output expectation flag, value T D_=0; H_=0; ! values D, H IsFirstMove = 0 ! 1 - tool change was used Msp = 5 ! spindle off Msp@ = 5 end program Plane case cld[1] of 33: Plane = 17 ! XY 37: Plane = 19 ! YZ 41: Plane = 18 ! XZ end end program PPFun if cld[1] = 53 then begin ! repstart Rc=Rc+1; BlockN=BlockN+1; if Rc=1 then begin RepP1=BlockN; RepL1=cld[2]; end if Rc=2 then begin RepP2=BlockN; RepL2=cld[2]; end if Rc=3 then begin RepP3=BlockN; RepL3=cld[2]; end if Rc=4 then begin RepP4=BlockN; RepL4=cld[2]; end if Rc=5 then begin RepP5=BlockN; RepL5=cld[2]; end FormBlock; OutPut OutStr$; end else if cld[1] = 54 then begin ! repend if Rc=1 then begin P=RepP1; L=RepL1; Rc=Rc-1; end if Rc=2 then begin P=RepP2; L=RepL2; Rc=Rc-1; end if Rc=3 then begin P=RepP3; L=RepL3; Rc=Rc-1; end if Rc=4 then begin P=RepP4; L=RepL4; Rc=Rc-1; end if Rc=5 then begin P=RepP5; L=RepL5; Rc=Rc-1; end P@=0; L@=0; call OutBl; end else if cld[1] = 500 then ! user function for i = 2 to recnum-2 do begin end end program PPrint print cldata$ ! print to operator's window end program Rapid if cycle = 80 then INTERP_@ = Maxreal ! added 1Oct07 per Dave Pearson to fix G80/G0 problem if INTERP_ > 0 then INTERP_ = 0 ! G0 RapFr = cld[1] end program RoTabl ! for PCNC 4th Axis Only tested with A axis other should really be C Call OutBl GoTCP@ = 0 GoTCP = 998 ! safe to do it at TCP call OutBl Output "(Repositioning 4th Axis)" if cld[1]=0 then begin ! abs rotation if Abs_Inc = 91 then Abs_Inc = 90 end else if Abs_Inc = 90 then Abs_Inc = 91 AT@ = 999 ! gorce code for transparency AT = cld[2] ! angle of rotation if cld[3] = 60 then AT = -AT ! reverse angle if INTERP_ > 0 then INTERP_ = 0 ! G0 Call OutBl end program SafPos ! Not used in PCNC1100 - M998 recnanism replaces ! if cld[4] > 0 then begin ! SafPosFlag = 0 ! end ! else SafPosFlag=1 end program SelcTl Tool=cld[1] end program Spindl ! For PCNC remembers S word even when off ! if Mc <> Mc@ or M <> M@ then call OutBl if cld[1] = 72 then begin Msp = 5 ! Msp$ = 5 end else begin ! spindle On S = abs(cld[2]) if cld[2] > 0 then Msp = 3 else Msp = 4 ! M3/M4 CW/CCW end end program Stop if M <> M@ then call OutBl ! output to NC block M = 0 ! M0 M@ = 1 end sub Initialise Interp_ = MaxReal; Interp_@ = Interp_ ! initilalise G0 rapid ZCycle = Maxreal; ZCycle@ = ZCycle ! initalise cycle depth ZClear = MaxReal; ZClear@ = ZClear ! initialise cycle rapid Q = MaxReal; Q@ = Q ! initialise peck amount Feed_ = MaxReal; Feed_@ = Feed_ ! initialise feed X = MaxReal; X@ = X ! initialise X Y = MaxReal; Y@ = Y ! initialise Y Z = MaxReal; Z@ = Z ! initialise Z subend sub NumK if BlockN = 9999 then BlockN = 0 BlockN = BlockN + 1 subend sub OutBl ! Clever timing of tool change removed for PCNC OutBlock subend [Programs block end] [NC data block begin] Interpolation=G0;G1;G2;G3;;G60 Plane=G17;G18;G19;;; Cutter_compensation=G40;G41;G42 Tool_length_compensation=G43;G44;G49 Coordinate_system_selection=G54;G55;G56;G57;G58;G59 Cycles=G73;;;G80;G81;G82;G83;;G85;G86;;G88;G89 Frame_of_reference=G90;G91 Feed=G84;G95 Canned_cycle_parameters=G98;G99 G_Function_Other=G4;;;;G10;G92 Spindle_status=M3;M4;M5 Flush_coolant=M8;M9 M_Function_Other=M0;M1;M2;M6;M30;M98;M99 Coordinates_of_movement=X;Y;Z;;; Coordinates_of_centre=;;;I;J;K Correctors=H;D Identifiers_Other=N;X;F;S;T;;; Additional="(", "%", "!";")";" " [NC data block end]