{4/12/95 Modified: Heid TNC 2500 [MT] M754.81.3 For: Micron Technology Versions: Compost 4.21.28 Changes made per Dave Sperry of Micron Technology. Replaced SaveProgNum2 at setup and initializations. Replaced SetProgNum('1') at setup and initializations. Changed SetProgNum('1') to SetProgNum('0') at setup and initializations. Changed Program# to Program2# at FirstOperation. for Multiple Parts: Added: EOL between Fixture Offset and Sub Call Added: /Recall# Num#('1')/ in CloseMP: to match /Save# Num#('1') Program#/ in OpenMP: Added: line to Reset fixture offset after last part In Drilling Changed /' P02 ' SUB# ClearancePlane2# FIRST SPZ#/ to ' P02 ' SUB# Num#('0') SPZ# to Output Absoulute Value for Z Depth Added '.0' to AutoCycle Sub Call in ToolPath:, '.0' = do 1 time, '.1' = do 2 times, '.2' = do 3 times, etc. Added '.0' to ZonlyRep: Added '%' EOL to end of program when no comments are used to insure control reads 'M30' M Sickles}
{5/10/95 Modified: Heid TNC 2500 [MT] M754.81.4 For: Micron Technology Versions: Compost 4.21.28 Changes made per Dave Sperry of Micron Technology. To number subs correctly: Changed all Seq and SeqC to SeqLab and SeqLabC respectively. Changed String 'N' to 'N?' Added Retag after Close. Because Retag adds the SetLineStrtChr to the beginning of the line a second time: Moved SetLineStrtChr(' ') from FirstOperation to just before Retag to avoid double ASCII 10 characters at the line beginning. Because Retag adds the ASCII line terminator codes (in the Form) to the end of the line a second time and there is no "SetLineEndChr" command: Removed '*' from Form's ASCII line terminator codes, where a line is certain do be NOT EmptyLine? I replaced /EOL/ with /'*' EOL/ elswhere I replaced EOL with DoEOL which determines that a line is not empty before outputting /'*' EOL/. M Sickles}
{10/20/95, Updated for Catalyst v2.20 per Fanuc 6M M001.85 Format, I have purposely retained the above comments for continued reference - MPS}
{ Format: Heid TNC 2500 [MT] M754.85.1 For: Micron Technology 11/7/95 Removed SetLineStrtChr from prog. Added Changed end of line in form to be 13,10 TH}
{ Format: Heid TNC 2500 [MT] M754.85.2 For: Micron Technology 11/15/95 Fixed Drill Subs to output G98 L0* for the end of the sub TH}
{1/17/96, Updated .85 to .86 version, MPK}
{3/22/96, Tested ZOnlyRepAutoCycle, Changed version # to .89, MPK} {5/3/96, Initial: Heid TNC 2500 [MT] M574.89 Created: Heid TNC 2500 [MT] M574.89.1 Elimniated tool offset line from FirstOp and NewTool, MPK}
{7/9/96, Initial: Heid TNC 2500 [MT] M574.89.1 Created: Heid TNC 2500 [MT] M574.89.2 Added G70 and Plane commands before ToolChange in NewTool, Changed RapidC to Rapid and added AbsOrInc before StartPos in NewTool, MPK}
1. Under NewTool, changed Plane to PlaneC. 2. Changed #9 FORMAT and added FORMAT to ArcAngle#. 3. Changed helical blocks output. 4. Changed drilling cycles per customer fax. 5. Added FORMAT to CalcZFmSurf#. JHE}
{Prog Numeric Format Definitions *******************************************}
RestoreScale: IF Metric? { CAM file is in Metric, tools and tool path } SetScale('.03937007874') { change to English, this is an English post } ELSE SetScale('1') END RETURN
DoEOL: IF EmptyLine? EOL {will not output} ELSE '*' EOL {will output line} END RETURN
DoSubComment: IF UseComments? AND SubComment? '( SUB NUMBER: ' Program# ' )*' EOL END RETURN
DoOpComments: IF UseComments? SetScale('1') IF OperationIDComment? '( OPERATION ' Operation# ': ' OperationType$ ' )*' EOL END IF OperationComment? '( ' OperationComment$ ' )*' EOL END IF WorkGroupComment? '( ' WorkGroupComment$ ' )*' EOL END IF ToolTypeComment? '( TOOL ' Tool# ': ' ToolDiameter# ' ' ToolType$ ' )*' EOL END IF ToolComment? '( ' ToolComment$ ' )*' EOL END RestoreScale END RETURN
PSStuff: {revised.72} IF FourthCW? FORMAT(FourthDegree#,2) SeqLabC ' A' FourthDegree# '*' EOL FourthCWF {reset flag} END IF FourthCCW? FORMAT(FourthDegree#,3) SeqLabC ' A' FourthDegree# '*' EOL FourthCCWF {reset flag} END IF FifthCW? FORMAT(FifthDegree#,2) SeqLabC ' B' FifthDegree# '*' EOL FifthCWF {reset flag} END IF FifthCCW? FORMAT(FifthDegree#,3) SeqLabC ' B' FifthDegree# '*' EOL FifthCCWF {reset flag} END RETURN
SubWarning: IF NOT FeedConnect? IF AnyZshift? '( WARNING )*' EOL '( WARNING Z CLEARANCE WILL CHANGE WITH EACH CYCLE OF SUB REPEAT )*' EOL '( WARNING )*' EOL END END RETURN
FinishSub1: {part 1} SeqLabC CRCOffC IF NOT FeedConnect? IF AutoCycle? ZCP3C ELSE IF FIFO? {.81} FeedC ZCP3C FeedEntC ELSE RapidC ZCP3C END END END DoEOL RETURN
OpenMP: IF EquallySpacedOffsets? NewProg Save# Num#('1') Program# SeqLabC ' G98 L' Program# '*' EOL { SubCall CallLab } DoSubComment END RETURN
CloseMP: IF EquallySpacedOffsets? SeqLabC ' G98 L0' '*' EOL { EndSub } EachPart IF NOT FirstPart? SeqLabC ' G54' AbsOrInc IF AllToolsOnePart? FirstHome '*' EOL ELSE ' X' CurOriginPosX# ' Y' CurOriginPosY# END IF NotEqual? PartShiftZ# Num#('0') ' Z' CurOriginPosZ# END '*' EOL SeqLabC ' L' Recall# Num#('1') '.0' '*' EOL { '.0' is for one time thru the subprogram } END IF LastPart? AND NOT AllToolsOnePart? SeqLabC ' G54' AbsOrInc ' X+0.0 Y+0.0' { reset fixture offset to First Part } IF NotEqual? PartShiftZ# Num#('0') ' Z+0.0' END '*' EOL END NextPart END RETURN
DoAbsOrInc: IF Flag?('1') AND AbsoluteMoves? IF ZMove? AND AbsValue? ' ' IncValue ELSE IF NOT ZMove? AND NOT AbsValue? ' ' AbsValue END END END RETURN
DoDrillAbsOrInc: IF Flag?('1') AND AbsoluteMoves? IF SPZMove? AND AbsValue? ' ' IncValue ELSE IF NOT SPZMove? AND NOT AbsValue? ' ' AbsValue END END END RETURN
RestoreAbsOrInc: IF Flag?('1') AND AbsoluteMoves? AND NOT AbsValue? SeqLabC ' ' AbsValue EOL END RETURN
FormatArc: DoAbsOrInc IF ArcCW? CWArc { No Output } ELSE CCWArc { No Output } END IF ZMove? IF ArcCW? ' G12' ELSE ' G13' END ArcIJ SetAbs TrackXNO# EPX# TrackYNO# EPY# IF AbsoluteMoves? AND NOT AutoCycle? {Moved MoveZ to the ' H' line - JHE} IncValue ' H' ArcAngle# MoveZ AbsValue {Changed from EPMoveAngle# - JHE} ELSE ' H' ArcAngle# SetInc MoveZ {Changed from EPMoveAngle#, added SetInc - JHE} END SetAbs {Added - JHE} ELSE IF ArcCW? ' G02' ELSE ' G03' END ArcIJ MoveXY END RETURN
CkCRC: { 4.2 } IF XMove? OR YMove? { Approach Length Feature and Multiple Pockets } IF NOT ZMove? CRCOnC END END IF LastFeat? AND EmptyLine? { Exit Length Feature } CRCOffC END RETURN
StdLine: {enables CRC on first call, .70} IF Decelerate? IF RoomToDecel? DecelMove1 SeqLabC DoAbsOrInc CkCRC FeedC MoveXYZC FeedRateC DoEOL DecelMove2 END SeqLabC DoAbsOrInc CkCRC FeedC MoveXYZC DecelFeed DoEOL ELSE IF XMove? OR YMove? OR ZMove? SeqLabC DoAbsOrInc CkCRC FeedC MoveXYZC FeedRateC DoEOL END END RETURN
ToolPath: EACHFeat IF PointFeat? IF AutoCycle? SeqLabC MoveSXYC DoEOL SeqLabC ' L' Program# '.0' '*' EOL { SubCall CallLab }{ '.0' is for one time thru the subprogram } CalcACSRXY {calc tool position after sub call, CalcAutoCycleStatusRecordXY} ELSE SeqLabC DoDrillAbsOrInc ' G79' MoveSXYZC '*' EOL {.80.01} { CycleCall } END ELSE IF RapidFeat? IF AutoCycle? SeqLabC DoAbsOrInc IF LastFeat? CRCOffC {.70} END RapidC MoveXYZC DoEOL ELSE SeqLabC DoAbsOrInc IF ZMove? AND NOT XMove? AND NOT YMove? CRCOffC {.82} END IF XMove? OR YMove? OR ZMove? RapidC MoveXYZC DoEOL END END ELSE IF LineFeat? IF AutoCycle? {.70} IF LastFeat? SeqLabC DoAbsOrInc CRCOffC FeedC MoveXYZC FeedRateC DoEOL ELSE IF ZMove? {skip CRCOn until first non-Z move line, skipping ramps} SeqLabC DoAbsOrInc FeedC MoveXYZC FeedRateC DoEOL ELSE StdLine {enables CRC on first call} END END ELSE StdLine END ELSE IF ArcFeat? EACHQuadrant { Do not use NOT, FIRST, LAST or NEXT modifiers in this loop } IF LastQuadrant? AND Decelerate? IF RoomToDecel? DecelMove1 SeqLabC FormatArc ArcFeedC DoEOL DecelMove2 END SeqLabC FormatArc DecelFeed DoEOL ELSE SeqLabC FormatArc ArcFeedC DoEOL END NEXTQuadrant END END END END NEXTFeat RestoreAbsOrInc RETURN
WFOStuff: { NOTE: This Post Processor does not support WorkFixtureOffsets. } RETURN
AutoCycCutSub2: {part 2} ToolPath SeqLabC AbsOrInc IF Repeats? AND FeedConnect? AND ZshiftOnly? {.69 removed RapidC} {.71.2 removed CRCOffC, gets turned off in ToolPath} ELSE IF FIFO? {.81} FeedC ZCP2 FeedEntC ELSE RapidC ZCP2 END END DoEOL SeqLabC ' G98 L0' '*' EOL { EndSub } CloseSub SetSRSubXY {restore SR to 1st position value} SetSRSubMove RETURN
AutoCycPat: SetPass2 {position pattern} ToolPath {call after NewProg for correct sub calls} SetPass1 {reset} RETURN
Milling: IF AutoCycle? NewProg AutoCycCutSub1 EntryMove AutoCycCutSub2 AutoCycPat ELSE EntryMove ToolPath END RETURN
ZonlyRepAutoCycle: AutoCycPat {write pattern moves and main calls} StartSub NewProg EachCycle SetSRXYtoEP IF FeedConnect? IF NOT FirstCycle? IF SPXMove? OR SPYMove? SeqLabC Feed IncValue StrtPosC EOL SeqLabC AbsOrInc ELSE SeqLabC Feed END ELSE SeqLabC Feed END ZInPlusInc FeedEnt EOL ELSE IF NOT FirstCycle? IF SPXMove? OR SPYMove? SeqLabC Rapid IncValue StrtPosC EOL IF FeedEntry? SeqLabC AbsOrInc ZCP2PlusInc EOL SeqLabC Feed ZInPlusInc FeedEnt EOL ELSE SeqLabC AbsOrInc ZInPlusInc EOL END ELSE IF FeedEntry? SeqLabC Rapid ZCP2PlusInc EOL SeqLabC Feed ZInPlusInc FeedEnt EOL ELSE SeqLabC Rapid ZInPlusInc EOL END END ELSE IF FeedEntry? SeqLabC Feed ZInPlusInc FeedEnt EOL ELSE SeqLabC Rapid ZInPlusInc EOL END END END IF FirstCycle? SetStatusOff {protect Z position for incremental sub} END SeqLabC ' L' Program# '.0' '*' EOL { SubCall CallLab }{ '.0' is for one time thru the subprogram } NextCycle SetStatusOn AutoCycCutSub1 {build element sub} AutoCycCutSub2 {.69, removed FinishSub1} IF FeedConnect? {there is no Z up in the sub, .69} IF FIFO? {.81} SeqLabC Feed ZCP2 FeedEnt DoEOL {.69} ELSE SeqLabC Rapid ZCP2 DoEOL {.69} END END {.69} SeqLabC ' G98 L0' '*' EOL { EndSub } CloseSub {Element shift, not pattern} RETURN
ZonlyRep: EachCycle IF NOT FirstCycle? SeqLabC Connect StrtPos DoEOL {.71.2, added Connect} END IF FeedConnect? SeqLabC FeedC ZInPlusInc FeedEnt DoEOL {.71.2, changed to FeedC} ELSE {Entry/Exit Connect} IF FeedEntry? IF NOT FirstCycle? SeqLabC RapidC ZCP2PlusIncC DoEOL {can't call for cycle =1} {.69 added Rapid, reads better} {.71.2, changed to RapidC, reads better} END SeqLabC Feed ZInPlusInc FeedEnt DoEOL ELSE SeqLabC RapidC ZInPlusInc DoEOL {.69 added Rapid, reads better} {.71.2, changed to RapidC, reads better} END END SeqLabC ' L' Program# '.0' '*' EOL { SubCall CallLab }{ '.0' is for one time thru the subprogram } NextCycle StartSub TrackZNO# FIRST SPZ# ToolPath FinishSub1 SeqLabC ' G98 L0' '*' EOL { EndSub } CloseSub RETURN
CheckPass: IF AutoCycle? {use the correct StrtPos} SetPass2 ELSE SetPass1 END RETURN
SkipToLastFeat: EachFeat IF LastFeat? TrackXNO# SPX# TrackYNO# SPY# END NextFeat RETURN
SetDrillEndOpZ: IF RetractToCP1? TrackZNO# ClearancePlane1# ELSE TrackZNO# ClearancePlane2# END RETURN
IF PSComment? AND UseComments? 'PostScript:*' EOL ' Literals: put between single or double quotes.*' EOL ' Separate commands and literals with at least one space.*' EOL ' A CR ( RETURN key ) will start a new line.*' EOL ' Commands: may be capital and/or lower case letters. Separate commands with a space.*' EOL ' EndOP -*' EOL ' all literals and commands before an ENDOP command*' EOL ' will appear at the beginning of the operation. All *' EOL ' literals and commands after an ENDOP command will appear*' EOL ' at the end of the operation. *' EOL ' 4thAxisCW(12.5), 4ACW(12.5) -*' EOL ' generates a + A move of the value you specify*' EOL ' 4thAxisCCW(22.5), 4ACCW(22.5) -*' EOL ' generates a - A move of the value you specify*' EOL ' 5thAxisCW(30), 5ACW(30) -*' EOL ' generates a + B move of the value you specify*' EOL ' 5thAxisCCW(22.5), 5ACCW(22.5) -*' EOL ' generates a - B move of the value you specify*' EOL END
EachOp {Start of post processing *********************} IF FirstOperation? EOR Program2# ' G70' '*' EOL { Inch } IF ToolChangeAtHome? SetHome END IF UseComments? IF ProgramNameComment? '( PROGRAM: ' ProgramName$ ' )*' EOL END IF ProgramComment? '( ' ProgramComment$ ' )*' EOL END IF FormatNameComment? '( FORMAT: ' FormatName$ ' )*' EOL END IF TimeComment? '( ' Date$ ' AT ' Time$ ' )*' EOL END IF MovesComment? '( OUTPUT IN ABSOLUTE INCHES )*' EOL END IF PartsComment? '( PARTS PROGRAMMED: ' Parts# ' )*' EOL END IF StartToolComment? '( FIRST TOOL NOT IN SPINDLE )*' EOL END END OpenSub RestoreScale IF MultipleParts? AND AllToolsOnePart? OpenMP END SeqLab Plane DoEOL DoOpComments DoPostScript IF MultipleParts? AND OneToolAllParts? AND FullUp? OpenMP END CheckPass SeqLabC Rapid AbsOrInc StrtPos DoEOL SeqLabC OpToolID ToolChng DoEOL SeqLabC Speed SpinOn DoEOL SeqLabC CoolOn DoEOL SeqLabC ZCP1 DoEOL IF MultipleParts? AND OneToolAllParts? AND ExitClearancePlane? OpenMP SeqLabC StrtPos DoEOL END ELSE IF NewTool?
{Finish off last Operation}
IF MultipleParts? AND OneToolAllParts? AND ExitClearancePlane? CloseMP END SeqLabC CoolOff DoEOL IF MultipleParts? AND OneToolAllParts? AND FullUp? CloseMP END DoEndOpPS IF ToolChangeAtHome? SeqLabC Rapid Home DoEOL END IF LAST ProgStop? SeqLabC ' M00' '*' EOL ELSE SeqLabC ProgStop DoEOL END
{Start new Operation}
DoOpComments DoPostScript IF MultipleParts? AND OneToolAllParts? AND FullUp? OpenMP END CheckPass SeqLabC ' G70' DoEOL SeqLabC PlaneC DoEOL {Added C - JHE} SeqLabC OpToolID ToolChng DoEOL SeqLabC Speed SpinOn DoEOL SeqLabC Rapid AbsOrInc StrtPos DoEOL SeqLabC CoolOn DoEOL SeqLabC ZCP1 DoEOL IF MultipleParts? AND OneToolAllParts? AND ExitClearancePlane? OpenMP SeqLabC StrtPos DoEOL END ELSE IF SameTool? DoEndOpPS IF LAST ProgStop? SeqLabC CoolOff DoEOL SeqLabC ' M00' '*' EOL
{Start new Operation}
GetStartOfSameTool SeqLabC ToolOfst PlaneC SpeedC DoEOL SeqLabC AbsOrInc Rapid StrtPos GetCoolOn DoEOL SeqLabC ZCP1 DoEOL ELSE IF CoolOff? AND LAST NOT CoolOff? SeqLabC CoolOff DoEOL END IF NewToolOffset?
GetStartOfSameTool SeqLabC PlaneC SpeedC DoEOL SeqLabC RapidC StrtPosC IF LAST CoolOff? AND NOT CoolOff? ' M13' { CoolOn and SpinOn } END DoEOL END END END END END {common point for all operations} IF Milling? SeqLabC ZCP2C DoEOL IF Repeats? NewProg IF ZshiftOnly? IF AutoCycle? {incremental Autocycle sub can have Z moves} ZonlyRepAutoCycle ELSE {Z shift only, NOT Auto Cycle} IF UseSeparateSubCalls? AND CyclesLessThanMaxSubCalls? SetFlag('1') { Milling ZShiftOnly SepSubs } ZonlyRep SetFlagF('1') ELSE {no sep subs desired} G92Sub END END {end Auto Cycle IF} ELSE {not Z only} G92Sub END {end Z only IF} ELSE {no repeat OPs} Milling END IF AutoCycle? SeqLabC ZCP3C DoEOL ELSE IF FIFO? {.81} SeqLabC FeedC CRCOffC ZCP3C FeedEntC DoEOL ELSE SeqLabC RapidC CRCOffC ZCP3C DoEOL END END ELSE IF Drilling? IF Repeats? NewProg StdSub SeqLabC AbsOrInc Rapid StrtPos DoEOL END SeqLabC ZCP2 DoEOL {Changed from DrillCP - JHE} GetCycle SeqLabC Cycle IF Tap? OR RigidTap? {Added RigidTap? - JHE} ' P01 ' CalcCP2FmSurf# ' P02 ' CalcZFmSurf# {Changed to this line - JHE} {' P02 ' SUB# Num#('0') SPZ#} {Removed - JHE} ' P03 0' {Added 0 - JHE} {IF Dwell?} {Removed next 5 lines - JHE} { Dwell#} {ELSE} { '0'} {END} ' P04 ' FeedEntry# ELSE ' P01 ' CalcCP2FmSurf# ' P02 ' CalcZFmSurf# {Changed to this line - JHE} {' P02 ' SUB# Num#('0') SPZ#} {Removed - JHE} ' P03 ' IF Peck? Peck# ELSE CalcZFmSurf# {Changed from SUB# Num#('0') SPZ# - JHE} END ' P04 ' IF Peck? {Changed from Dwell? - JHE} '0' {Changed from Dwell# - JHE} ELSE Dwell# {Changed from '0' - JHE} END ' P05 ' FeedEntry# END DoEOL IF CallMasterOp? SeqLabC ' L' CallMasterNum# '.0' '*' EOL { '.0' is for one time thru the subprogram } SkipToLastFeat ELSE TrackZNO# FIRST SPZ# IF MasterOp? SetFlag('1') {std sep sub Zreps in effect} NewMasterProg SeqLabC ' L' Program# '.0' '*' EOL { '.0' is for one time thru the subprogram } StartSub ToolPath SeqLabC ' G98 L0' '*' EOL CloseSub SetFlagF('1') {not std sep sub Zreps in effect} ELSE ToolPath END END SetDrillEndOpZ SeqLabC Rapid ZCP3 DoEOL {Removed C from both keywords - JHE} IF Repeats? FinishSubG92 END END END NextOp {loops back to EachOP until last Operation}
{End of program ************************************************************}
{finish last operation} IF MultipleParts? AND OneToolAllParts? AND ExitClearancePlane? CloseMP END IF MultipleParts? AND OneToolAllParts? AND FullUp? CloseMP END DoEndOpPS SeqLabC ' M25' '*' EOL IF ProgStop? SeqLabC ' M00' '*' EOL END IF MultipleParts? AND AllToolsOnePart? CloseMP END SeqLabC EOP DoEOL CloseSub Post2 {organize Subs into one program} Close
{SetLineStrtChr(' ') { ASCII('10') }} Retag
IF UseComments? SetScale('1') {restore scale for comments} Reopen IF FileBytesComment? '( FILE LENGTH: ' FileBytes# ' CHARACTERS )*' EOL END IF FileFeetComment? '( FILE LENGTH: ' FileFeet# ' FEET )*' EOL END IF FileMetersComment? '( FILE LENGTH: ' FileMeters# ' METERS )*' EOL END Close ELSE Reopen '%*' EOL Close END