Download Macro:  
https://www.cnc4pc.com/pub/media/productattachments/files/Macro_m6.zip

Hardware Used:
C82, M26X and MultiCAM 3000

 

----------Variables----------

local inst = mc.mcGetInstance() 
local ToolInColletSig = mc.ISIG_INPUT0
local DrawBarOut = mc.OSIG_OUTPUT2 -------- Release drawbar ------
local BlowOut = mc.OSIG_OUTPUT3 -------- Release blow ------
local AirOut = mc.OSIG_OUTPUT4 -------- Release Air ------
local dustOut = mc.OSIG_OUTPUT5 -------- Release dust collector  ------
local numtools = 6

-----------------------------
local ToolXPositions = {}
ToolXPositions[1] = 108.1125
ToolXPositions[2] = 108.0490
ToolXPositions[3] = 108.0490
ToolXPositions[4] = 108.0490
ToolXPositions[5] = 108.0377
ToolXPositions[6] = 108.0377

-----------------------------
local ToolYPositions = {}
ToolYPositions[1] = 10.5956
ToolYPositions[2] = 17.5321
ToolYPositions[3] = 24.5036
ToolYPositions[4] = 31.5118
ToolYPositions[5] = 38.4884
ToolYPositions[6] = 45.6542

-----------------------------
local ToolZPositions = {}
ToolZPositions[1] = -11.93856
ToolZPositions[2] = -11.93856
ToolZPositions[3] = -11.93856
ToolZPositions[4] = -11.93856
ToolZPositions[5] = -11.93856
ToolZPositions[6] = -11.93856

function m6()

local GCode = ""
GCode = GCode .. string.format("M5\n")
GCode = GCode .. string.format("G04 P1000\n")
mc.mcCntlGcodeExecuteWait(inst, GCode)


------ Get and compare current and next tools ------ 
local SelectedTool = mc.mcToolGetSelected(inst)
local CurrentTool = mc.mcToolGetCurrent(inst)
if (SelectedTool == CurrentTool) then
mc.mcCntlSetLastError(inst, "Next tool = Current tool")
do return end
end

------ Get current machine state ------

local CurFeed = mc.mcCntlGetPoundVar(inst, 2134)
local CurFeedMode = mc.mcCntlGetPoundVar(inst, 4001)
local CurAbsMode = mc.mcCntlGetPoundVar(inst, 4003)

------ Get Position data for current tool ------

if (CurrentTool <= numtools) then

Num1 = CurrentTool
XPos1 = ToolXPositions[CurrentTool]
YPos1 = ToolYPositions[CurrentTool]
ZPos1 = ToolZPositions[CurrentTool]

else

mc.mcCntlEStop(inst)
mc.mcCntlSetLastError(inst, "ERROR: Tool number out of range!")
do return end

end

------ Get position data for next tool ------

if (SelectedTool <= numtools) then

Num2 = SelectedTool
XPos2 = ToolXPositions[SelectedTool]
YPos2 = ToolYPositions[SelectedTool]
ZPos2 = ToolZPositions[SelectedTool]

else

mc.mcCntlEStop(inst)
mc.mcCntlSetLastError(inst, "ERROR: Tool number out of range!")
do return end

end
------ Release dust collector  ------ 
local hsig = mc.mcSignalGetHandle(inst,dustOut)
mc.mcSignalSetState(hsig, 0)

  local hSig, rc = mc.mcSignalGetHandle(inst, ToolInColletSig)
local hReg, rc = mc.mcSignalGetState(hSig)

if (hReg == 1) then

------ Move to current tool change position ------ 
local GCode = ""
GCode = GCode .. "G00 G90 G53 Z-2.0\n"
GCode = GCode .. string.format("G00 G90 G53 X%.4f Y%.4f\n", XPos1 - 4.5, YPos1) 
GCode = GCode .. string.format("G00 G90 G53 Z%.4f\n", ZPos1 + 1.0) -- Ab +1 unit über Ablagehöhe wird mit G01 verfahren, hier Wert einstellen.
GCode = GCode .. string.format("G00 G90 G53 Z%.4f\n", ZPos1)
GCode = GCode .. string.format("G01 G90 G53 X%.4f Y%.4f F50\n", XPos1 , YPos1)

mc.mcCntlGcodeExecuteWait(inst, GCode)

------ Release drawbar ------ 
local hsig = mc.mcSignalGetHandle(inst, DrawBarOut)
mc.mcSignalSetState(hsig, 1)

------ Release blow ------ 
local hsig1 = mc.mcSignalGetHandle(inst, BlowOut)
mc.mcSignalSetState(hsig1, 1)

------ Release Air ------ 
local hsig2 = mc.mcSignalGetHandle(inst, AirOut)
mc.mcSignalSetState(hsig2, 1)

------ Move to next tool change position ------
GCode = ""
GCode = GCode .. "G04 P2000\n"
GCode = GCode .. "G00 G90 G53 Z-2.0\n"
GCode = GCode .. string.format("G00 G90 G53 X%.4f Y%.4f\n", XPos2, YPos2)
GCode = GCode .. string.format("G00 G90 G53 Z%.4f\n", ZPos2 +1) -- Ab +1 unit über Ablagehöhe wird mit G01 verfahren, hier Wert einstellen
GCode = GCode .. string.format("G01 G90 G53 Z%.4f F20.0\n", ZPos2)

mc.mcCntlGcodeExecuteWait(inst, GCode)

------ Clamp drawbar ------
mc.mcSignalSetState(hsig,0)
mc.mcSignalSetState(hsig1,0)
mc.mcSignalSetState(hsig2,0)
GCode = ""
GCode = GCode .. "G04 P1000\n"
mc.mcCntlGcodeExecuteWait(inst, GCode)
hSig, rc = mc.mcSignalGetHandle(inst, ToolInColletSig)
hReg, rc = mc.mcSignalGetState(hSig)

if (hReg == 0) then
mc.mcCntlEStop(inst)
mc.mcCntlSetLastError(inst, "ERROR: Tool not detected!")
do return end

end

GCode = ""
GCode = GCode .. "G04 P2000\n" --Wartezeit 2000 milisekunden, nur optional
GCode = GCode .. string.format("G01 G90 G53 X%.4f Y%.4f F 50\n", XPos2 - 4.5, YPos2)
mc.mcCntlGcodeExecuteWait(inst, GCode)
mc.mcSignalSetState(hsig,0)

------ Move to Safe Z UP & in front of last change position ------
mc.mcCntlGcodeExecuteWait(inst, "G00 G90 G53 Z-2.0\n")
mc.mcCntlGcodeExecuteWait(inst, "G00 G90 G53 Y0\n") -- Fahrt hier in einen sicheren Abstand vom Werkzeugwechsler bei X=Letztes WZG. vor!

else

------ Release drawbar ------ 
local hsig = mc.mcSignalGetHandle(inst, DrawBarOut)
mc.mcSignalSetState(hsig, 1)

------ Release blow ------
local hsig1 = mc.mcSignalGetHandle(inst, BlowOut)
mc.mcSignalSetState(hsig1, 1)

------ Release Air ------ 
local hsig2 = mc.mcSignalGetHandle(inst, AirOut)
mc.mcSignalSetState(hsig2, 1)

------ Move to next tool change position ------
GCode = ""
GCode = GCode .. "G04 P2000\n"
GCode = GCode .. "G00 G90 G53 Z-2.0\n"
GCode = GCode .. string.format("G00 G90 G53 X%.4f Y%.4f\n", XPos2, YPos2)
GCode = GCode .. string.format("G00 G90 G53 Z%.4f\n", ZPos2 +1) -- Ab +1 unit über Ablagehöhe wird mit G01 verfahren, hier Wert einstellen
GCode = GCode .. string.format("G01 G90 G53 Z%.4f F20.0\n", ZPos2)
mc.mcCntlGcodeExecuteWait(inst, GCode)

------ Clamp drawbar ------
mc.mcSignalSetState(hsig,0)
mc.mcSignalSetState(hsig1,0)
mc.mcSignalSetState(hsig2,0)

GCode = ""
GCode = GCode .. "G04 P1000\n"
mc.mcCntlGcodeExecuteWait(inst, GCode)

local hSig, rc = mc.mcSignalGetHandle(inst, ToolInColletSig)

  local hReg, rc = mc.mcSignalGetState(hSig)

if (hReg == 0) then

mc.mcCntlEStop(inst)
mc.mcCntlSetLastError(inst, "ERROR: Tool not detected!")
do return end
end

GCode = ""
GCode = GCode .. "G04 P2000\n" --Wartezeit 2000 milisekunden, nur optional
GCode = GCode .. string.format("G01 G90 G53 X%.4f Y%.4f F50\n", XPos2 - 4.5, YPos2)
mc.mcCntlGcodeExecuteWait(inst, GCode)
mc.mcSignalSetState(hsig,0)

------ Move to Safe Z UP & in front of last change position ------
mc.mcCntlGcodeExecuteWait(inst, "G00 G90 G53 Z-2.0\n")
mc.mcCntlGcodeExecuteWait(inst, "G00 G90 G53 Y0\n") -- Fahrt hier in einen sicheren Abstand vom Werkzeugwechsler bei X=Letztes WZG. vor!

end

------ Reset state ------
mc.mcCntlSetPoundVar(inst, 2134, CurFeed)
mc.mcCntlSetPoundVar(inst, 4001, CurFeedMode)
mc.mcCntlSetPoundVar(inst, 4003, CurAbsMode)

------ Set new tool ------
mc.mcToolSetCurrent (inst, SelectedTool)
mc.mcCntlSetLastError(inst, string.format("Tool change - Tool: %.0f", SelectedTool))
mc.mcCntlGcodeExecuteWait(inst, "G43 H"..SelectedTool)

------ Release dust collector  ------ 
local hsig = mc.mcSignalGetHandle(inst,dustOut)
mc.mcSignalSetState(hsig, 1)
end
if (mc.mcInEditor() == 1) then
m6()

end