'************************************************************************************************************* '************************************ FIND X/Y CENTER (EXTERNAL) ************************************** '************************************ A TOUCH SCRIPT FOR MACH3 ************************************** '******FONT************************** FOR BOTH INCH AND MM UNITS ************************************** '*********Courier******************** CHARLIE SARSFIELD REV14 JUN/2018 ************************************** '************************************ WWW.YOUTUBE.COM/SUNNY5RISING ************************************** '************************************ SUNNY5RISE@GMAIL.COM ************************************** '************************************************************************************************************* '***************** NOTES BEFORE LAUNCHING: **************** '***************** Z ZERO MUST ALREADY BE SET TO TOP OF PART OR ABOVE PATH OBSTACLES. **************** '***************** PROBE MUST BE PLACED AT NEGATIVE SIDE OF AXIS AT USER PREFERRED Z HEIGHT.**************** '***************** APPROXIMATE SPAN INPUT SHOULD BE SET AT PART SIZE OR SLIGHTLY LARGER. **************** '***************** TO USE DEFAULT PROBE & GAGE VALUES, SET RELEVANT DRO(S) TO ZERO. **************** '***************** TO USE A GAGE VALUE OF ZERO, ENTER A NEGATIVE VALUE IN THICKNESS DRO. **************** '************************************************************************************************************* '----- USER VARIABLES ---------------------------------------------------------------------------------------- If GetParam("Units") = 0 Then 'METRIC VALUES VarUnits = " MM" VarMaxDistance = 25.4 'MAX TRAVEL BEFORE ALARM VarFeedRate = 127 'MM/MIN FEEDRATE FOR APPROACH VarStandOff = 1.27 'STANDOFF DISTANCE * RECOMMENDED SETTING 1.27 VarProbeDia = 3.175 'DEFAULT PROBE DIAMETER | EDGE FINDER DIA. DRO PRECEDENCE VarGageThick = 0 'DEFAULT GAGE THICKNESS | GAGE THICKNESS DRO PRECEDENCE VarApproxSpan = 0 'DEFAULT APPROXIMATE PART SPAN * OPTIONAL VarSafetyGap = 6.35 'DEFAULT SAFETY GAP (EXTRA SPAN BEYOND APPROXIMATE SPAN) MIN RCMD:3.05 Else 'SAE VALUES VarUnits = " INCH" VarMaxDistance = 1.0 'MAX TRAVEL BEFORE ALARM VarFeedRate = 5 'INCH/MIN FEEDRATE FOR APPROACH VarStandOff = 0.05 'STANDOFF DISTANCE * RECOMMENDED SETTING 0.05 VarProbeDia = 0.125 'DEFAULT PROBE DIAMETER | EDGE FINDER DIA. DRO PRECEDENCE VarGageThick = 0 'DEFAULT GAGE THICKNESS | GAGE THICKNESS DRO PRECEDENCE VarApproxSpan = 0 'DEFAULT APPROXIMATE PART SPAN * OPTIONAL VarSafetyGap = 0.250 'DEFAULT SAFETY GAP (EXTRA SPAN BEYOND APPROXIMATE SPAN) MIN RCMD:0.120 End If VarRateOrRapid = 1 'DEFAULT POSITIONING MOVEMENT: 0=SAFETY RATE (FEEDRATE * 2) 1=RAPID VarWhichAxis = 0 'DEFAULT AXIS CHOICE: 0=X 1=Y VarSpanHold = 3 'DEFAULT SECONDS TO PAUSE MOVEMENT UPON REACHING SPAN LOCATION VarDelayInSec = 0 'DEFAULT SECONDS TO DELAY MOTION AFTER BUTTON CLICK VarBeepOrSpeak = 2 'COUNTDOWN AUDIO: 0=NONE 1=BEEP 2=SPEAK VarSecOfAudio = 5 'COUNTDOWN SECOND AT WHICH AUDIO BEGINS VarCompleteAudio = 3 'END SIGNAL: 0=NONE 1=Beep 2=SPEAK 3=WAV_AUDIO_FILE VarWavAudioFile = "C:\MACH3\ToolCompleteSND1.wav" 'AUDIO FILE & PATH '************************************************************************************************************* '************************************************************************************************************* '----- GET INITIAL ENVIRONMENT SETTINGS FOR LATER REINSTATEMENT ---------------------------------------------- VarInitialLinearMode = GetOemDRO(819) 'LINEAR MODE G00/G01 VarInitialDistMode = GetOemLED(48) 'DISTANCE MODE G90/G91 VarInitialFeedRate = GetOemDRO(818) 'FEEDRATE VarInitialInhibit = GetParam("ZInhibitOn") 'Z INHIBIT STATUS OFF/ON VarInitialXScale = GetParam("XScale") 'X SCALE VALUE VarInitialYScale = GetParam("YScale") 'Y SCALE VALUE VarInitialZScale = GetParam("ZScale") 'Z SCALE VALUE VarInitialFRO = GetOemDRO(821) 'FEEDRATE OVERRIDE PERCENTAGE Message "" 'CLEAR STATUS LINE TEXT '----- CHECK DIGITIZE STATE; 0=CLEAR 1=ACTIVE ---------------------------------------------------------------- If GetOemLED (825) <> 0 Then MachMsg("Digitize Status Not Clear. Check Probe/Connections And Try Again!","*** ERROR! ***",0) End 'END SCRIPT End If '----- RETRIEVE PROBE DIAMETER AND GAGE THICKNESS ------------------------------------------------------------ If VarProbeDia = 0 And GetOEMDRO(1000) = 0 Then MachMsg("Coffee First, Then Provide Probe Diameter And Try Again.","*** ERROR! ***",0) Message "Find Center CANCELED" 'DISPLAY MESSAGE End 'END SCRIPT Else If GetOEMDRO(1000) <> 0 Then VarProbeDia = Abs(GetOEMDRO(1000)) 'CHECK AND GET FINDER DIA DRO VALUE IF USED End If If GetOEMDRO(1001) <> 0 Then 'CHECK FOR GAGE THICKNESS VALUE Select Case InStr(1,GetOEMDRO(1001),"-") 'CHECK IF NEGATIVE IS USED Case 0 'NEG NOT PRESENT VarGageThick = Abs(GetOEMDRO(1001)) 'SET GAGE THICKNESS TO DRO VALUE Case 1 'NEG IS PRESENT VarGageThick = 0 'SET GAGE THICKNESS TO ZERO End Select End If Select Case GetParam("Units") 'SET UNITS FOR STATUS LINE DISPLAY Case 0 'MM VarMsgUnits = "mm" Case 1 'INCH VarMsgUnits = "in" End Select 'FORMAT STATUS LINE TEXT VarStatusMsg = "Probe: " &VarProbeDia &VarMsgUnits &" Gage: " &VarGageThick &VarMsgUnits '----- RUN DIALOG SUBROUTINE --------------------------------------------------------------------------------- RunTheThing '----- ACTIVATE TIME DELAY IF USED --------------------------------------------------------------------------- If VarDelayInSec <> 0 Then COUNTDOWN '----- CANCEL SCALE, FEEDRATE OVERRIDE, Z INHIBIT, AND CALC VARIABLES ---------------------------------------- SetParam("XScale",1.0) 'SET X SCALE TO 1.0 SetParam("YScale",1.0) 'SET Y SCALE TO 1.0 SetParam("ZScale",1.0) 'SET Z SCALE TO 1.0 SetParam("ZInhibitOn",0) 'TURN Z INHIBIT OFF DoOemButton(1014) 'CANCEL FEED OVERRIDE VarInitialZ = GetOemDRO(802) 'GET STARTING Z LOCATION Var2ndDist = VarMaxDistance + VarSafetyGap 'CALCULATE 2ND PROBE MAX DISTANCE VarSafetyRate = "F" &VarFeedRate * 2 'SETUP SAFETY POSITIONING FEEDRATE If VarRateOrRapid = 0 Then VarLinearMode = "G1" Else VarLinearMode = "G0" 'SETUP LINEAR MODE '----- RUN CHOSEN AXIS SUBROUTINE 0=X 1=Y ------------------------------------------------------------------- If VarWhichAxis = 0 Then RunXCenter Else RunYCenter '----- REINSTATE ----- RUN END AUDIO ----- DISPLAY SPAN ------------------------------------------------------ RETURNSTATE 'CALL REINSTATE SUBROUTINE Select Case VarCompleteAudio 'PLAY SELECTED END AUDIO Case 1 'OPTION BEEP Beep Case 2 'OPTION SPEAK Speak("Tool Zero Complete.") Case 3 'OPTION WAV_AUDIO_FILE PlayWave(VarWavAudioFile) End Select Sleep 500 'DELAY 1/2 SEC Select Case VarWhichAxis 'DISPLAY SPECS FOR RELEVANT AXIS/AXES Case 0 'X Message VarStatusMsg &" X Span:" &VarSpanX 'STATUS MSG X Case 1 'Y Message VarStatusMsg &" Y Span:" &VarSpanY 'STATUS MSG Y End Select End 'SCRIPT RUN COMPLETE '******************************************* SUBROUTINES BELOW *********************************************** '----- SUBROUTINE FOR COUNTDOWN DELAY ------------------------------------------------------------------------ Sub COUNTDOWN VarDelayInSec = Abs(VarDelayInSec) Do Until VarDelayInSec = 0 'LOOP UNTIL SECONDS = ZERO Message VarStatusMsg &" Delay: " &VarDelayInSec 'DISPLAY SECONDS VALUE IN STATUS LINE If VarDelayInSec < VarSecOfAudio + 1 Then Select Case VarBeepOrSpeak Case 1 'OPTION BEEP Beep Case 2 'OPTION SPEAK Speak(VarDelayInSec) End Select End If Sleep 1000 'PAUSE 1 SEC. VarDelayInSec = VarDelayInSec - 1 'REDUCE SECONDS BY 1 AFTER EACH LOOP Loop End Sub '----- SUBROUTINE TO RETURN INITIAL SETTINGS ----------------------------------------------------------------- Sub RETURNSTATE 'REINSTATE INITIAL FEEDRATE Code "F" &VarInitialFeedRate 'REINSTATE DISTANCE MODE 0=G91 -1=G90 If VarInitialDistMode = 0 Then Code "G91" Else Code "G90" 'REINSTATE LINEAR MODE 0=G00 1=G01 If VarInitialLinearMode = 0 Then Code "G00" Else Code "G01" 'REINSTATE Z INHIBIT STATUS 0=OFF 1=ON If VarInitialInhibit = 1 Then SetParam("ZInhibitOn",1) 'SET X SCALE TO INITIAL VALUE If VarInitialXScale <> 1.0 Then SetParam("XScale",VarInitialXScale) 'SET Y SCALE TO INITIAL VALUE If VarInitialYScale <> 1.0 Then SetParam("YScale",VarInitialYScale) 'SET Z SCALE TO INITIAL VALUE If VarInitialZScale <> 1.0 Then SetParam("ZScale",VarInitialZScale) 'SET FEEDRATE OVERRIDE TO INITIAL VALUE If VarInitialFRO <> 100 Then SetOemDRO(821,VarInitialFRO) End Sub '----- DIALOG SUBROUTINE FOR SPAN LENGTH, AXIS CHOICE, AND TIME DELAY ---------------------------------------- Sub RunTheThing Dim ApproxText$ (0) 'DECLARE 1 ITEM ARRAY FOR APPROXIMATE SPAN ApproxText (0) = VarApproxSpan 'FILL ARRAY 1 Dim UnitList$ (0) 'DECLARE 1 ITEM ARRAY FOR UNIT LISTBOX UnitList (0) = VarUnits 'FILL ARRAY 1 'SETUP DIALOG CONTROLS Begin Dialog AxisSpanChoice 110,130,"Find Center (External)", .EnableIt Text 25,1,100,30, "*** WARNING ***" Text 7,11,115,15, "Z0 Must Be Above Obstacles!" TextBox 15,32,35,10, ApproxText$(),.ApproxTxt ListBox 64,32,25,10, UnitList$(),.Listbox1 GroupBox 8,22,95,57,"Set Approx. Span",.GroupBox1 OptionGroup .grp1 OptionButton 15, 45, 30, 10, "X Axis" OptionButton 15, 55, 30, 10, "Y Axis" OKButton 57,50,37,12, .OkBtn CheckBox 19,67,70,10, "Rapid Positioning", .Check1 Text 18,83,100,15, "Delay" TextBox 42,83,30,10, .SecText Text 75,83,30,15, "Seconds" Text 4,100,50,15, "Span Hold" TextBox 42,100,30,10, .HoldText Text 75,100,30,15, "Seconds" Text 3,117,50,15, "Safety Gap" TextBox 42,117,30,10, .GapTxt End Dialog Dim Dlg1 As AxisSpanChoice Dlg1.grp1 = VarWhichAxis 'LOAD DEFAULT AXIS Dlg1.ApproxTxt = VarApproxSpan 'LOAD APPROX SPAN TEXTBOX WITH DEFAULT VALUE Dlg1.Check1 = VarRateOrRapid 'SET CHECKBOX TO DEFAULT Dlg1.SecText = VarDelayInSec 'LOAD SECONDS TEXTBOX WITH DEFAULT VALUE Dlg1.HoldText = VarSpanHold 'LOAD SPAN HOLD SECONDS WITH DEFAULT VALUE Dlg1.GapTxt = Format(VarSafetyGap,"##0.000") 'LOAD SAFETY GAP Message VarStatusMsg 'SHOW STATUS MESSAGE OF PROBE/GAGE Button = Dialog (Dlg1) 'SHOW DIALOG AND WAIT FOR BUTTON REPLY If Button = 0 Then 'IF CLOSE BUTTON Message "Find Center CANCELED" 'DISPLAY MESSAGE End 'END SCRIPT End If 'CHECK THAT APPROX SPAN WAS ENTERED NUMERIC If IsNumeric(Dlg1.ApproxTxt) = False Then MachMsg("***** APPROXIMATE SPAN MUST BE ENTERED IN NUMERIC FORMAT! *****", _ " Substance Abuse Is Not Recommended ",0) RunTheThing 'RESTART SUB End If 'CHECK THAT SECONDS WAS ENTERED NUMERIC If IsNumeric(Dlg1.SecText) = True Then VarDelayInSec = Int(Dlg1.SecText) Else MachMsg("***** SECONDS MUST BE ENTERED IN NUMERIC FORMAT! *****", _ " Stronger Coffee Is Recommended ",0) RunTheThing 'RESTART SUB End If 'CHECK THAT HOLD SECONDS WAS ENTERED NUMERIC If IsNumeric(Dlg1.HoldText) = True Then VarSpanHold = Int(Dlg1.HoldText) Else MachMsg("***** SECONDS MUST BE ENTERED IN NUMERIC FORMAT! *****", _ " Substance Abuse Is Not Recommended ",0) RunTheThing 'RESTART SUB End If VarApproxSpan = Dlg1.ApproxTxt 'APPROXIMATE SPAN VarWhichAxis = Dlg1.grp1 'AXIS OPTION CHOICE 0=X 1=Y VarRateOrRapid = Dlg1.Check1 'POSITIONING MODE 0=SAFETYRATE 1=RAPID VarSafetyGap = Dlg1.GapTxt 'SAFETY GAP 'CHECK THAT SPAN IS NOT ENTERED AS ZERO If VarApproxSpan = 0 Then MachMsg("***** SPAN CANNOT BE ZERO *****", _ "Stronger Coffee Is Recommended",0) RunTheThing 'RESTART SUB End If End Sub '----- DIALOG FUNCTION TO ENABLE/DISABLE CONTROLS ------------------------------------------------------------ Function EnableIt( ControlID$, Action%, SuppValue%) Select Case Action% Case 1 'SETTINGS FOR DIALOG START If VarApproxSpan = 0 Then DlgEnable "OkBtn",0 Else DlgEnable "OkBtn",1 Case 3 'SETTINGS IF TEXTBOX CONTENT CHANGES If ControlID$ = "ApproxTxt" Then If SuppValue% = 0 Then DlgEnable "OkBtn",0 Else DlgEnable "OkBtn",1 End If End Select End Function '----- X AXIS SUBROUTINE ------------------------------------------------------------------------------------- Sub RunXCenter SetOemDRO(800,0) 'ZERO X AXIS DRO Sleep 200 'DELAY TO ALLOW DRO TO CHANGE Message VarStatusMsg &" X Center Running..." Code "G90 G31 X" &VarMaxDistance &"F" &VarFeedRate 'MOVE IN X POS DIRECTION While IsMoving() 'WAIT UNTIL MOVE IS COMPLETE BEFORE PROCEEDING Wend If GetVar(2000) >= (VarMaxDistance - .001) Then 'GET CONTACT POSITION AND TEST FOR MAX TRAVEL MachMsg("Maximum Travel Reached. Reposition X Axis Closer To Part And Try Again!","*** OOPS! ***",0) Message "" RETURNSTATE 'CALL REINSTATE SUBROUTINE End Else Beep Code "G90 G0 X" &GetVar(2000) 'MOVE TO CONTACT POINT DUE TO OVERRUN While IsMoving() Wend SetOemDRO(800,0) 'ZERO X AXIS DRO Sleep 200 Code "G90" &VarLinearMode &"X-" &VarStandOff &VarSafetyRate 'MOVE TO X- STANDOFF While IsMoving () Wend End If Code "G90" &VarLinearMode &"Z" &VarStandOff &VarSafetyRate 'MOVE TO Z STANDOFF While IsMoving () Wend VarSpanLocation = (VarSafetyGap+VarProbeDia+(VarGageThick*2)+CDbl(VarApproxSpan)) 'CALC SPAN LOCATION Code "G90" &VarLinearMode &"X" &VarSpanLocation &VarSafetyRate 'MOVE TO SPAN LOCATION While IsMoving () Wend VarSpanDro = GetOemDRO(800) - Var2ndDist 'CAPTURE SPAN LOCATION DRO AND CALC SPAN2 VarDelayInSec = VarSpanHold 'SAFETY DELAY COUNTDOWN 'CALL COUNTDOWN SUBROUTINE Message VarStatusMsg &" X Center Continuing..." Code "G90" &VarLinearMode &"Z" &VarInitialZ &VarSafetyRate 'MOVE DOWN TO PREVIOUS Z LOCATION While IsMoving() 'WAIT UNTIL MOVE IS COMPLETE BEFORE PROCEEDING Wend Code "G91 G31 X-" &Var2ndDist &"F" &VarFeedRate 'MOVE IN X NEG DIRECTION While IsMoving() 'WAIT UNTIL MOVE IS COMPLETE BEFORE PROCEEDING Wend Beep If GetVar(2000) <= (VarSpanDro + .001) Then 'GET CONTACT POSITION AND TEST FOR MAX TRAVEL MachMsg("Maximum Travel Reached. Reposition And Try Again!","*** OOPS! ***",0) Message "Find Center CANCELED" 'DISPLAY MESSAGE End 'END SCRIPT End If Code "G90 G0 X" &GetVar(2000) 'MOVE TO CONTACT POINT DUE TO OVERRUN While IsMoving() Wend VarSpanHit = GetVar(2000)/2 'CALCULATE CENTER X LOCATION VarSpanCalc = GetVar(2000) 'GET SPAN HIT DISTANCE FOR STATUS Code "G91" &VarLinearMode &"X+" &VarStandOff &VarSafetyRate 'MOVE TO X+ STANDOFF While IsMoving() Wend Code "G90" &VarLinearMode &"Z" &VarStandOff &VarSafetyRate 'MOVE TO Z STANDOFF While IsMoving() Wend Code "G90" &VarLinearMode &"X" &VarSpanHit &VarSafetyRate 'MOVE TO X CENTER While IsMoving() Wend Select Case GetParam("Units") 'SET INFORMATION FOR STATUS LINE DISPLAY Case 0 'MM VarSpanX = Format(VarSpanCalc-VarProbeDia-(VarGageThick*2),"###0.000") 'CALCULATE SPAN FOR STATUS Case 1 'INCH VarSpanX = Format(VarSpanCalc-VarProbeDia-(VarGageThick*2),"##0.0000") 'CALCULATE SPAN FOR STATUS End Select SetOemDRO(800,0) 'ZERO X AXIS DRO Sleep 200 End Sub '----- Y AXIS SUBROUTINE ------------------------------------------------------------------------------------- Sub RunYCenter SetOemDRO(801,0) 'ZERO Y AXIS DRO Sleep 200 'DELAY TO ALLOW DRO TO CHANGE Message VarStatusMsg &" Y Center Running..." Code "G90 G31 Y" &VarMaxDistance &"F" &VarFeedRate 'MOVE IN Y POS DIRECTION While IsMoving() 'WAIT UNTIL MOVE IS COMPLETE BEFORE PROCEEDING Wend If GetVar(2001) >= (VarMaxDistance - .001) Then 'GET CONTACT POSITION AND TEST FOR MAX TRAVEL MachMsg("Maximum Travel Reached. Reposition Y Axis Closer To Part And Try Again!","*** OOPS! ***",0) Message "" RETURNSTATE 'CALL REINSTATE SUBROUTINE End Else Beep Code "G90 G0 Y" &GetVar(2001) 'MOVE TO CONTACT POINT DUE TO OVERRUN While IsMoving() Wend SetOemDRO(801,0) 'ZERO Y AXIS DRO Sleep 200 Code "G90" &VarLinearMode &"Y-" &VarStandOff &VarSafetyRate 'MOVE TO Y- STANDOFF While IsMoving () Wend End If Code "G90" &VarLinearMode &"Z" &VarStandOff &VarSafetyRate 'MOVE TO Z STANDOFF While IsMoving () Wend VarSpanLocation = (VarSafetyGap+VarProbeDia+(VarGageThick*2)+CDbl(VarApproxSpan)) 'CALC SPAN LOCATION Code "G90" &VarLinearMode &"Y" &VarSpanLocation &VarSafetyRate 'MOVE TO SPAN LOCATION While IsMoving () Wend VarSpanDro = GetOemDRO(801) - Var2ndDist 'CAPTURE SPAN LOCATION DRO AND CALC SPAN2 VarDelayInSec = VarSpanHold 'SAFETY DELAY COUNTDOWN 'CALL COUNTDOWN SUBROUTINE Message VarStatusMsg &" Y Center Continuing..." Code "G90" &VarLinearMode &"Z" &VarInitialZ &VarSafetyRate 'MOVE DOWN TO PREVIOUS Z LOCATION While IsMoving() 'WAIT UNTIL MOVE IS COMPLETE BEFORE PROCEEDING Wend Code "G91 G31 Y-" &Var2ndDist &"F" &VarFeedRate 'MOVE IN Y NEG DIRECTION While IsMoving() 'WAIT UNTIL MOVE IS COMPLETE BEFORE PROCEEDING Wend Beep If GetVar(2001) <= (VarSpanDro + .001) Then 'GET CONTACT POSITION AND TEST FOR MAX TRAVEL MachMsg("Maximum Travel Reached. Reposition And Try Again!","*** OOPS! ***",0) Message "Find Center CANCELED" 'DISPLAY MESSAGE End 'END SCRIPT End If Code "G90 G0 Y" &GetVar(2001) 'MOVE TO CONTACT POINT DUE TO OVERRUN While IsMoving() Wend VarSpanHit = GetVar(2001)/2 'CALCULATE CENTER Y LOCATION VarSpanCalc = GetVar(2001) 'GET SPAN HIT DISTANCE FOR STATUS Code "G91" &VarLinearMode &"Y+" &VarStandOff &VarSafetyRate 'MOVE TO Y+ STANDOFF While IsMoving() Wend Code "G90" &VarLinearMode &"Z" &VarStandOff &VarSafetyRate 'MOVE TO Z STANDOFF While IsMoving() Wend Code "G90" &VarLinearMode &"Y" &VarSpanHit &VarSafetyRate 'MOVE TO Y CENTER While IsMoving() Wend Select Case GetParam("Units") 'SET INFORMATION FOR STATUS LINE DISPLAY Case 0 'MM VarSpanY = Format(VarSpanCalc-VarProbeDia-(VarGageThick*2),"###0.000") 'CALCULATE SPAN FOR STATUS Case 1 'INCH VarSpanY = Format(VarSpanCalc-VarProbeDia-(VarGageThick*2),"##0.0000") 'CALCULATE SPAN FOR STATUS End Select SetOemDRO(801,0) 'ZERO Y AXIS DRO Sleep 200 End Sub '*************************************************************************************************************