So far this is what I have. Thanks to Dan Mauch for sharing his tool changer macro.
My tool changer is a ratcheting type with 8 positions.
Right now it will change tools if the next tool is a higher number(CW move), If it is a lower number it wants to spin CCW against the ratcheting mechanism. I'd like to be able to home the C axis and then do the tool change. I haven't figured out how to make that work, it will Home the C Axis but then it wont do the tool change after.
-- Mach4Turn 8 positon tool Turret
function m6()
inst = mc.mcGetInstance()
selectedtool = mc.mcToolGetSelected(inst)
currenttool = mc.mcToolGetCurrent(inst)
Ulock = 10 --' Sets the Unlock Movement in Degrees Value
Rlock = 10 -- ' Sets the Relock Movement in Degrees Value
T1SafePosX = 2.25
T1SafePosZ = 1.5
if (selectedtool >

or (selectedtool < 1) then
--DoButton(3) --'Stop Program Run
mc.mcCntlSetLastError(inst,"Program Stopped due to Tool Number Out of Range")
do return end
end
if (selectedtool == currenttool) then
mc.mcCntlSetLastError(inst,"Tool is the same NO tool change needed")
do return end
end
local Tp = 0 --' Zero's the Tool Positon values DO NOT CHANGE
--'------------------- Move to Safe Tool Position -----------
mc.mcCntlSetLastError(inst," Move to Tool Safe Pos")
mc.mcCntlGcodeExecuteWait(inst, "G1 F30 X" .. T1SafePosX);
mc.mcCntlGcodeExecuteWait(inst, "G1 F40 Z" .. T1SafePosZ);
mc.mcCntlSetLastError(inst,"Safe XZ Move Completed")
--'------ Begin Tool Change , UNLOCK turret --------------
mc.mcCntlSetLastError(inst," Tool Turret UNLOCKING ")
--mc.mcCntlGcodeExecuteWait(inst, " G91"); --'Set to INC
mc.mcCntlGcodeExecuteWait(inst, " G52 C0");
mc.mcCntlGcodeExecuteWait(inst, " G00 C " ..Ulock); --' Unlock turret
mc.mcCntlGcodeExecuteWait(inst, " G52 C0");
--'------ Select Tool ------------------------------------
if (selectedtool == 1) then
mc.mcCntlSetLastError(inst,"Moving to Tool# " ..selectedtool )
if (selectedtool > currenttool) then
Moves = selectedtool - currenttool
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C" ..Moves);
end
if (selectedtool < currenttool) then
Moves = ((8 - currenttool) + selectedtool)
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C " ..Moves);
end
Tp = 0
mc.mcCntlSetLastError(inst,"Tool#1 Loaded")
end
--'-------------------------------------------------------------
if (selectedtool == 2) then
mc.mcCntlSetLastError(inst, "Moving to Tool# " ..selectedtool )
if (selectedtool > currenttool) then
Moves = selectedtool - currenttool
Moves = (Moves * 45)
mc.mcCntlGcodeExecuteWait(inst, " G00 C" ..Moves);
end
if (selectedtool < currenttool) then
Moves = ((8 - currenttool) + selectedtool)
Moves = (Moves * 45)
mc.mcCntlGcodeExecuteWait(inst, " G00 C " ..Moves);
end
Tp = 45
mc.mcCntlSetLastError(inst,"Tool#2 Loaded")
end
--'----------------------------------------------------------
if (selectedtool == 3) then
mc.mcCntlSetLastError(inst,"Moving to Tool# " ..selectedtool )
if (selectedtool > currenttool) then
Moves = selectedtool - currenttool
Moves = (Moves * 45)
mc.mcCntlGcodeExecuteWait(inst, " G00 C" ..Moves);
end
if (selectedtool < currenttool) then
Moves = ((8 - currenttool) + selectedtool)
Moves = (Moves * 45)
mc.mcCntlGcodeExecuteWait(inst, " G00 C " ..Moves);
end
Tp = 90
mc.mcCntlSetLastError(inst, "Tool#3 Loaded")
end
--'--------------------------------------------------------------
if selectedtool == 4 then
mc.mcCntlSetLastError(inst,"Moving to Tool# " ..selectedtool )
if selectedtool > currenttool then
Moves = selectedtool - currenttool
Moves = (Moves * 45)
mc.mcCntlGcodeExecuteWait(inst, " G00 C" ..Moves);
end
if selectedtool < currenttool then
Moves = ((8 - currenttool) + selectedtool)
Moves = (Moves * 45)
mc.mcCntlGcodeExecuteWait(inst, " G00 C " ..Moves);
end
Tp = 135
mc.mcCntlSetLastError(inst,"Tool#4 Loaded")
end
--'--------------------------------------------------------------
if (selectedtool == 5) then
mc.mcCntlSetLastError(inst,"Moving to Tool# " ..selectedtool )
if (selectedtool > currenttool) then
Moves = selectedtool - currenttool
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C" ..Moves);
end
if (selectedtool < currenttool) then
Moves = ((8 - currenttool) + selectedtool)
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C " ..Moves);
end
Tp = 180
mc.mcCntlSetLastError(inst,"Tool#1 Loaded")
end
--'--------------------------------------------------------------
if (selectedtool == 6) then
mc.mcCntlSetLastError(inst,"Moving to Tool# " ..selectedtool )
if (selectedtool > currenttool) then
Moves = selectedtool - currenttool
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C" ..Moves);
end
if (selectedtool < currenttool) then
Moves = ((8 - currenttool) + selectedtool)
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C " ..Moves);
end
Tp = 225
mc.mcCntlSetLastError(inst,"Tool#1 Loaded")
end
--'--------------------------------------------------------------
if (selectedtool == 7) then
mc.mcCntlSetLastError(inst,"Moving to Tool# " ..selectedtool )
if (selectedtool > currenttool) then
Moves = selectedtool - currenttool
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C" ..Moves);
end
if (selectedtool < currenttool) then
Moves = ((8 - currenttool) + selectedtool)
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C " ..Moves);
end
Tp = 270
mc.mcCntlSetLastError(inst,"Tool#1 Loaded")
end
--'--------------------------------------------------------------
if (selectedtool ==

then
mc.mcCntlSetLastError(inst,"Moving to Tool# " ..selectedtool )
if (selectedtool > currenttool) then
Moves = selectedtool - currenttool
Moves = (Moves * 45)
end
mc.mcCntlSetLastError(" G00 C" ..Moves);
if (selectedtool < currenttool) then
Moves = ((8 - currenttool) + selectedtool)
Moves = (Moves * 45)
mc.mcCntlSetLastError(" G00 C " ..Moves);
end
Tp = 315
mc.mcCntlSetLastError(inst,"Tool#1 Loaded")
end
--'------------ end Tool Change ------------------------
mc.mcCntlSetLastError(inst," Tool Turret LOCKING ")
mc.mcCntlGcodeExecuteWait(inst, " G52 C0");
mc.mcCntlGcodeExecuteWait(inst, " G00 H-" ..Rlock ); -- ' Lock Turret
mc.mcCntlGcodeExecuteWait(inst, "G52 C" ..Tp);
--mc.mcCntlGcodeExecuteWait(inst, "G90"); --' Reset to ABS
tool = selectedtool
mc.mcToolSetCurrent(inst, selectedtool)
if (mc.mcInEditor() == 1) then
m6()
end
end