Better demo of parallel colour/material changes - some changes as quick as 2 seconds.
Still more work to do - but synchronisation getting closer.
Using preheat G10's to kicking off the Pre Heat, delay, final heat, priming, tool change.
Demo here.
https://youtu.be/uk7KTCqrujg
2F9F385E-12C0-4647-9F90-BBB57768B5B6_1_201_a.jpeg
Tool change macro getting pretty complicated....
;changeFilament.g
;M98 P"0:/macros/changeFilament.g" A{previous_extruder} B{new_filament_temp} L{layer_num} F{first_layer_temperature} N{next_extruder} H{first_layer_height}
echo {state.thisInput},"changeFilament"
if exists(global.primeLayer) == false
global primeLayer = {-2,-2}
;if exists(param.A) && param.A == 0
; M98.1 A"parkXY.g"
;if exists(param.A) && param.A == 1
; M98.1 A"parkUV.g"
if exists(param.H)
G1 Z{param.H} F500
if exists(param.N) && param.N == 0
M596.1 P1
T0
echo {state.thisInput},"step 0 - wait for 200",{sensors.analog[param.N+1].lastReading}
while heat.heaters[1].active < 200
G4 P500
;echo {state.thisInput},"step 0 - wait for 200",{sensors.analog[param.N+1].lastReading}
;echo {state.thisInput},"M116 P1 from ",{sensors.analog[param.N+1].lastReading}," to 200"
;var start = state.upTime
;M116 P{param.N}
;echo {state.thisInput},"step 1 heat up time",{floor(state.upTime-var.start)},"s"
;**** Calculate delay
var delayT = global.preHeatT
echo {state.thisInput},"delayT initial",var.delayT
if exists(param.L) && param.L <= 0
if global.primeLayer[param.N] < param.L
set var.delayT = var.delayT - global.primeTime0*2
if exists(param.L) && param.L > 0 && global.primeLayer[param.N] < param.L
set var.delayT = var.delayT - global.primeTime0
echo {state.thisInput},"delayT with prime",var.delayT
; post delay heatup
var lastR = sensors.analog[param.N+1].lastReading
if var.lastR < 200
set var.delayT = var.delayT - ((220-200)/global.degSec)
if (200-var.lastR)/global.degSec > var.delayT
set var.delayT = var.delayT - ((200-var.lastR)/global.degSec - var.delayT)
echo {state.thisInput},"delayT with heatup",var.delayT
;set var.delayT = var.delayT - 1
if var.delayT <= 0
echo {state.thisInput},"SYNC not enough time to parallel tool change",floor(-var.delayT*10+0.5)/10,"secs short"
else
if heat.heaters[2].active < 200
echo {state.thisInput},"SYNC - other motion system not active - so no need to wait"
else
echo {state.thisInput},"SYNC - wait for",floor(var.delayT*10+0.5)/10,"secs"
G4 P{floor(var.delayT*1000)}
M568 P0 S220 R220
;echo {state.thisInput},"heat up step2"
var start = state.upTime+state.msUpTime/1000
var startReading = sensors.analog[param.N+1].lastReading
echo {state.thisInput},"M116 P0 from ",{sensors.analog[param.N+1].lastReading}," to 220"
M116 P0
var delayFurther = false
if heat.heaters[2].active > 199
set var.delayFurther = true
while sensors.analog[param.N+1].lastReading < 219
M568 P0 S220 R220
G4 P500
echo {state.thisInput},"step2 heat up time",{(state.upTime+state.msUpTime/1000-var.start)},"s",{sensors.analog[param.N+1].lastReading},"temp",{(sensors.analog[param.N+1].lastReading-var.startReading)/(state.upTime+state.msUpTime/1000-var.start)},"deg/sec"
if exists(param.L) && param.L <= 0
if global.primeLayer[param.N] < param.L
M98.1 A"clean T0"
M801 X40 Y5 T0 S10 ; Prime
M801 X40 Y5 T0 S10 ; Prime
set global.primeLayer[param.N] = param.L
if exists(param.L) && param.L > 0 && global.primeLayer[param.N] < param.L
M801 X40 Y5 T0 S10 ; Prime
set global.primeLayer[param.N] = param.L
set global.T0Clean = false
var timeC = state.upTime+state.msUpTime/1000
while global.uvParked = false ; move.axes[4].machinePosition <290
G4 P500
M400
echo {state.thisInput},"Waited for uv to be parked ",{state.upTime+state.msUpTime/1000-var.timeC},"secs"
set global.xyParked = false
echo {state.thisInput},"finished changeFilament"
if exists(param.N) && param.N == 1
M596.1 P0
T1
echo {state.thisInput},"step 0 - wait for 200",{sensors.analog[param.N+1].lastReading}
while heat.heaters[2].active < 200
G4 P500
;echo {state.thisInput},"step 0 - wait for 200",{sensors.analog[param.N+1].lastReading}
;echo {state.thisInput},"M116 P1 from ",{sensors.analog[param.N+1].lastReading}," to 200"
;var start = state.upTime
;M116 P{param.N}
;echo {state.thisInput},"step 1 heat up time",{floor(state.upTime-var.start)},"s"
;**** Calculate delay
var delayT = global.preHeatT
echo {state.thisInput},"delayT initial",var.delayT
if exists(param.L) && param.L <= 0
if global.primeLayer[param.N] < param.L
set var.delayT = var.delayT - global.primeTime1*2
if exists(param.L) && param.L > 0 && global.primeLayer[param.N] < param.L
set var.delayT = var.delayT - global.primeTime1
echo {state.thisInput},"delayT with prime",var.delayT
; post delay heatup
var lastR = sensors.analog[param.N+1].lastReading
if var.lastR < 200
set var.delayT = var.delayT - ((220-200)/global.degSec)
if (200-var.lastR)/global.degSec > var.delayT
set var.delayT = var.delayT - ((200-var.lastR)/global.degSec - var.delayT)
echo {state.thisInput},"delayT with heatup",var.delayT
;set var.delayT = var.delayT - 1
if var.delayT <= 0
echo {state.thisInput},"SYNC not enough time to parallel tool change",-var.delayT,"secs short"
else
if heat.heaters[2].active < 200
echo {state.thisInput},"SYNC - other motion system not active - so no need to wait"
else
echo {state.thisInput},"SYNC - wait for",var.delayT,"secs"
G4 P{floor(var.delayT*1000)}
M568 P1 S220 R220
;echo {state.thisInput},"heat up step2"
var start = state.upTime+state.msUpTime/1000
var startReading = sensors.analog[param.N+1].lastReading
echo {state.thisInput},"M116 P1 from ",{sensors.analog[param.N+1].lastReading}," to 220"
M116 P1
while sensors.analog[param.N+1].lastReading < 220
M568 P1 S220 R220
G4 P500
echo {state.thisInput},"step2 heat up time",{(state.upTime+state.msUpTime/1000-var.start)},"s",{sensors.analog[param.N+1].lastReading},"temp",{(sensors.analog[param.N+1].lastReading-var.startReading)/(state.upTime+state.msUpTime/1000-var.start)},"deg/sec"
var delayFurther = false
if heat.heaters[1].active > 199
set var.delayFurther = true
if exists(param.L) && param.L <= 0
if global.primeLayer[param.N] < param.L
M98.1 A"clean T1"
T1
M801 U50 V315 T1 S10 ; Prime
M801 U50 V315 T1 S10 ; Prime
set global.primeLayer[param.N] = param.L
if exists(param.L) && param.L > 0 && global.primeLayer[param.N] < param.L
M801 U50 V315 T1 S10 ; Prime
set global.primeLayer[param.N] = param.L
set global.T1Clean = false
var timeC = state.upTime+state.msUpTime/1000
;echo {state.thisInput},"M598 started"
;M598
;M400
;echo {state.thisInput},"M598 waited for ",{state.upTime+state.msUpTime/1000-var.timeC},"secs"
set var.timeC = state.upTime+state.msUpTime/1000
while global.xyParked = false ; move.axes[1].machinePosition > 25
G4 P500
M400
echo {state.thisInput},"waited for xy to be parked ",{state.upTime+state.msUpTime/1000-var.timeC},"secs"
set global.uvParked = false
echo {state.thisInput},"finished changeFilament"