Machsupport Forum
Mach Discussion => General Mach Discussion => Topic started by: diego85tam on April 28, 2020, 12:53:34 PM
-
Hi everyone, I wrote this script to zero all the axis.
When I try it step by step in the VB script editor everything works fine but when I try it in Mach3 hitting the "Auto Tool Zero" button it's working weirdly.
So I have two G31 moves for each axis, a "fast" feed rate move then retract and a second one very slow.
Here is the problem, On the X and Y axis, when the script perform the fast move it's actually in the wrong direction. All the others moves are in the correct direction. The Z axis moves (fast and slow) are also ok.
I can't find the problem by myself, please help :-\
Here is the code that I wrote taking inspiration from a few different one found online:
ToolRadius = GetOemDRO(1112)/2
PlateOffset = 20
CurrentFeed = GetOemDRO(818)
CurrentAbsInc = GetOemLED(48)
CurrentGmode = GetOemDRO(819)
CurrentFeedOverride = GetOEMDRO(821)
'X 1st Pass at fast rate
Message "X axis 1st pass"
If GetOemLed (825) = 0 Then
DoOemButton (1008)
Code "G4 P0.5"
SetOemDRO (821,100)
Code "G90 G31 X20 F600"
While IsMoving()
Wend
XProbePos = GetVar(2000)
If Abs(XprobePos) <= Abs(20) - 0.1 Then
Code "G0 X" &XProbePos
While IsMoving()
Wend
Call SetDro (0,0)
Code "G4 P0.25"
Code "G1 X-1 F1000"
While IsMoving()
Wend
Message "X axis 2nd pass"
Else
Code "G53 G0 X" &x
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
End If
Else
Message "Probe is grounded, check connection and try again"
End If
'X 2nd pass at slow rate
DoOEMButton (1008)
Code "G4 P0.5"
Code "G31 X2 F30"
While IsMoving()
Wend
XProbePos = GetVar(2000)
If Abs(XprobePos) <= Abs(2) - 0.1 Then
Code "G0 X" &XProbePos
While IsMoving()
Wend
Call SetDro (0,-ToolRadius)
Code "G4 P0.25"
Message "X axis is now zeroed"
Code "G91 G0 X-10"
Code "G0 Y-20"
Code "G0 X20"
While IsMoving()
Wend
Else
Code "G53 G0 X" &x
While IsMoving()
Wend
Message "Material not found, check connection and try again"
End If
'Y 1st Pass at fast rate
Message "(Y axis 1st pass)"
If GetOemLed (825) = 0 Then
DoOemButton (1009)
Code "G4 P0.5"
Code "G90 G31 Y20 F600"
While IsMoving()
Wend
YProbePos = GetVar(2001)
If Abs(YprobePos) <= Abs(20) - 0.1 Then
Code "G0 Y" &YProbePos
While IsMoving()
Wend
Call SetDro (1,0)
Code "G4 P0.25"
Code "G1 Y-1 F1000"
While IsMoving()
Wend
Message "Y axis 2nd pass"
Else
Code "G53 G0 Z0"
Code "G53 G0 Y" & y & "X" & x
Code "G53 G0 Z" & z
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
End If
Else
Message "Probe is grounded, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
End If
'Y 2nd pass at slow rate
DoOEMButton (1009)
Code "G4 P0.5"
Code "G31 Y2 F30"
While IsMoving()
Wend
YProbePos = GetVar(2001)
If Abs(YprobePos) <= Abs(2) - 0.1 Then
Code "G0 Y" &YProbePos
While IsMoving()
Wend
Call SetDro (1,-ToolRadius)
Code "G4 P0.25"
Message "Y axis is now zeroed"
Code "G91 G0 Y-5"
Code "G0 Z50"
Code "G90 G0 X20 Y20"
While IsMoving()
Wend
Else
Code "G53 G0 Z0"
Code "G53 G0 Y" & y & "X" & x
Code "G53 G0 Z" & z
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
End If
-
I did some minor changes, I'm not an expert on coding, I'm learning!
Some times the script works well and sometime one, two or all three axis goes in the wrong direction, just for the fast movement though.
I tried many times the script and I think there is something going wrong between Mach3 and the control board, I'm using a cheap chinese 4axis usb controller.
That my guess, anyone had the same issue?
ToolRadius = GetOemDRO(1112)/2 'custom tool diameter DRO
PlateOffset = 20 'X and Y offset
PlateThickness = 15 'Z offset
CurrentFeed = GetOemDRO(818)
CurrentAbsInc = GetOemLED(48)
CurrentGmode = GetOemDRO(819)
CurrentFeedOverride = GetOEMDRO(821)
'X 1st Pass at fast rate
Message "X axis 1st pass"
Sleep 2000
If GetOemLed (825) = 0 Then
DoOemButton (1008)
Code "G4 P0.5"
SetOemDRO (821,100)
Code "G90 G31 X20 F600"
While IsMoving()
Wend
XProbePos = GetVar(2000)
If Abs(XprobePos) <= Abs(20) - 0.1 Then
Code "G0 X" &XProbePos
While IsMoving()
Wend
Call SetDro (0,0)
Code "G4 P0.25"
Code "G1 X-1 F1000"
While IsMoving()
Wend
Message "X axis 2nd pass"
Else
Code "G53 G0 X" &x
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Exit Sub
End If
Else
Message "Probe is grounded, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Exit Sub
End If
'X 2nd pass at slow rate
DoOEMButton (1008)
Code "G4 P0.5"
Code "G31 X2 F30"
While IsMoving()
Wend
XProbePos = GetVar(2000)
If Abs(XprobePos) <= Abs(2) - 0.1 Then
Code "G0 X" &XProbePos
While IsMoving()
Wend
Call SetDro (0,ToolRadius)
Code "G4 P0.25"
Message "X axis is now zeroed"
Code "G91 G0 X-10"
Code "G0 Y-20"
Code "G0 X20"
While IsMoving()
Wend
Else
Code "G53 G0 X" &x
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Exit Sub
End If
'Y 1st Pass at fast rate
Message "(Y axis 1st pass)"
If GetOemLed (825) = 0 Then
DoOemButton (1009)
Code "G4 P0.5"
Code "G90 G31 Y20 F600"
While IsMoving()
Wend
YProbePos = GetVar(2001)
If Abs(YprobePos) <= Abs(20) - 0.1 Then
Code "G0 Y" &YProbePos
While IsMoving()
Wend
Call SetDro (1,0)
Code "G4 P0.25"
Code "G1 Y-1 F1000"
While IsMoving()
Wend
Message "Y axis 2nd pass"
Else
Code "G53 G0 Z0"
Code "G53 G0 Y" & y & "X" & x
Code "G53 G0 Z" & z
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Exit Sub
End If
Else
Message "Probe is grounded, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Exit Sub
End If
'Y 2nd pass at slow rate
DoOEMButton (1009)
Code "G4 P0.5"
Code "G31 Y2 F30"
While IsMoving()
Wend
YProbePos = GetVar(2001)
If Abs(YprobePos) <= Abs(2) - 0.1 Then
Code "G0 Y" &YProbePos
While IsMoving()
Wend
Call SetDro (1,ToolRadius)
Code "G4 P0.25"
Message "Y axis is now zeroed"
Code "G91 G0 Y-5"
Code "G0 Z20"
Code "G90 G0 X20 Y20"
While IsMoving()
Wend
Else
Code "G53 G0 Z0"
Code "G53 G0 Y" & y & "X" & x
Code "G53 G0 Z" & z
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Exit Sub
End If
-
When ever you update a DRO or in a while loop or send a message you need to have a short sleep() 50 to 150 is usually enough time for mach to update data in the background.
If you still have problems make sure you have a genuine licence file.
-
added some sleep's to your code, maybe it helps
ToolRadius = GetOemDRO(1112)/2 'custom tool diameter DRO
PlateOffset = 20 'X and Y offset
PlateThickness = 15 'Z offset
CurrentFeed = GetOemDRO(818)
CurrentAbsInc = GetOemLED(48)
CurrentGmode = GetOemDRO(819)
CurrentFeedOverride = GetOEMDRO(821)
'X 1st Pass at fast rate
Message "X axis 1st pass"
Sleep 2000
If GetOemLed (825) = 0 Then
DoOemButton (1008)
Sleep(250)
SetOemDRO (821,100)
Code "G90 G31 X20 F600"
While IsMoving()
Wend
Sleep(250)
XProbePos = GetVar(2000)
If Abs(XprobePos) <= Abs(20) - 0.1 Then
Code "G0 X" &XProbePos
While IsMoving()
Wend
Call SetDro (0,0)
Sleep(250)
Code "G1 X-1 F1000"
While IsMoving()
Wend
Message "X axis 2nd pass"
Sleep(250)
Else
Code "G53 G0 X" &x
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
Else
Message "Probe is grounded, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
'X 2nd pass at slow rate
DoOEMButton (1008)
Sleep(250)
Code "G31 X2 F30"
While IsMoving()
Wend
Sleep(250)
XProbePos = GetVar(2000)
If Abs(XprobePos) <= Abs(2) - 0.1 Then
Code "G0 X" &XProbePos
While IsMoving()
Wend
Call SetDro (0,ToolRadius)
Sleep(250)
Message "X axis is now zeroed"
Sleep(250)
Code "G91 G0 X-10"
Code "G0 Y-20"
Code "G0 X20"
While IsMoving()
Wend
Sleep(250)
Else
Code "G53 G0 X" &x
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
'Y 1st Pass at fast rate
Message "(Y axis 1st pass)"
If GetOemLed (825) = 0 Then
DoOemButton (1009)
Sleep(250)
Code "G90 G31 Y20 F600"
While IsMoving()
Wend
Sleep(250)
YProbePos = GetVar(2001)
If Abs(YprobePos) <= Abs(20) - 0.1 Then
Code "G0 Y" &YProbePos
While IsMoving()
Wend
Call SetDro (1,0)
Sleep(250)
Code "G1 Y-1 F1000"
While IsMoving()
Wend
Message "Y axis 2nd pass"
Sleep(250)
Else
Code "G53 G0 Z0"
Code "G53 G0 Y" & y & "X" & x
Code "G53 G0 Z" & z
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
Else
Message "Probe is grounded, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
'Y 2nd pass at slow rate
DoOEMButton (1009)
Sleep(250)
Code "G31 Y2 F30"
While IsMoving()
Wend
Sleep(250)
YProbePos = GetVar(2001)
If Abs(YprobePos) <= Abs(2) - 0.1 Then
Code "G0 Y" &YProbePos
While IsMoving()
Wend
Call SetDro (1,ToolRadius)
Sleep(250)
Message "Y axis is now zeroed"
Code "G91 G0 Y-5"
Code "G0 Z20"
Code "G90 G0 X20 Y20"
While IsMoving()
Wend
Else
Code "G53 G0 Z0"
Code "G53 G0 Y" & y & "X" & x
Code "G53 G0 Z" & z
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
-
When ever you update a DRO or in a while loop or send a message you need to have a short sleep() 50 to 150 is usually enough time for mach to update data in the background.
If you still have problems make sure you have a genuine licence file.
Thank you Graham!
I'm Using the Demo version until the machine is finished.
added some sleep's to your code, maybe it helps
ToolRadius = GetOemDRO(1112)/2 'custom tool diameter DRO
PlateOffset = 20 'X and Y offset
PlateThickness = 15 'Z offset
CurrentFeed = GetOemDRO(818)
CurrentAbsInc = GetOemLED(48)
CurrentGmode = GetOemDRO(819)
CurrentFeedOverride = GetOEMDRO(821)
'X 1st Pass at fast rate
Message "X axis 1st pass"
Sleep 2000
If GetOemLed (825) = 0 Then
DoOemButton (1008)
Sleep(250)
SetOemDRO (821,100)
Code "G90 G31 X20 F600"
While IsMoving()
Wend
Sleep(250)
XProbePos = GetVar(2000)
If Abs(XprobePos) <= Abs(20) - 0.1 Then
Code "G0 X" &XProbePos
While IsMoving()
Wend
Call SetDro (0,0)
Sleep(250)
Code "G1 X-1 F1000"
While IsMoving()
Wend
Message "X axis 2nd pass"
Sleep(250)
Else
Code "G53 G0 X" &x
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
Else
Message "Probe is grounded, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
'X 2nd pass at slow rate
DoOEMButton (1008)
Sleep(250)
Code "G31 X2 F30"
While IsMoving()
Wend
Sleep(250)
XProbePos = GetVar(2000)
If Abs(XprobePos) <= Abs(2) - 0.1 Then
Code "G0 X" &XProbePos
While IsMoving()
Wend
Call SetDro (0,ToolRadius)
Sleep(250)
Message "X axis is now zeroed"
Sleep(250)
Code "G91 G0 X-10"
Code "G0 Y-20"
Code "G0 X20"
While IsMoving()
Wend
Sleep(250)
Else
Code "G53 G0 X" &x
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
'Y 1st Pass at fast rate
Message "(Y axis 1st pass)"
If GetOemLed (825) = 0 Then
DoOemButton (1009)
Sleep(250)
Code "G90 G31 Y20 F600"
While IsMoving()
Wend
Sleep(250)
YProbePos = GetVar(2001)
If Abs(YprobePos) <= Abs(20) - 0.1 Then
Code "G0 Y" &YProbePos
While IsMoving()
Wend
Call SetDro (1,0)
Sleep(250)
Code "G1 Y-1 F1000"
While IsMoving()
Wend
Message "Y axis 2nd pass"
Sleep(250)
Else
Code "G53 G0 Z0"
Code "G53 G0 Y" & y & "X" & x
Code "G53 G0 Z" & z
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
Else
Message "Probe is grounded, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
'Y 2nd pass at slow rate
DoOEMButton (1009)
Sleep(250)
Code "G31 Y2 F30"
While IsMoving()
Wend
Sleep(250)
YProbePos = GetVar(2001)
If Abs(YprobePos) <= Abs(2) - 0.1 Then
Code "G0 Y" &YProbePos
While IsMoving()
Wend
Call SetDro (1,ToolRadius)
Sleep(250)
Message "Y axis is now zeroed"
Code "G91 G0 Y-5"
Code "G0 Z20"
Code "G90 G0 X20 Y20"
While IsMoving()
Wend
Else
Code "G53 G0 Z0"
Code "G53 G0 Y" & y & "X" & x
Code "G53 G0 Z" & z
While IsMoving()
Wend
Message "Material not found, check connection and try again"
Code "F" &CurrentFeed
SetOemDRO (821,CurrentFeedOverride)
If CurrentAbsInc = 0 Then Code "G91"
If CurrentGMode = 0 Then Code "G0"
Sleep(250)
Exit Sub
End If
Thanks TPS! I'm doing more tests, in a couple of days I'll share the results.