Dual extruder - Preheat nozzle before tool change
-
Hello everyone,
I'm using a dual extruder setup on my custom machine with a Mainboard 6HC, slicer used is PrusaSlicer. I also have a Raise3D pro3 at work and their slicer (IdeaMaker) has an option to start heating up the inactive extruder before tool change so the machine doesn't stay idle too long.
Posting this here because I don't think the setting exists in PrusaSlicer, and I can't think of a way to detect an imminent tool change with a macro.
Maybe I could use the last known layer time, but i will have to assume each subsequent layer has approximately the same completion time.
Does someone have an idea ?
Thank you in advanceBest
-
@modl I found this Prusaslicer feature request, also has a link to a post processing script: https://github.com/prusa3d/PrusaSlicer/issues/11035
Alternatively you should be able to use IdeaMaker to generate Gcode for Duet boards.
Ian
-
@droftarts thank you very much i will give this a try.
Unfortunately IdeaMaker doesn't handle large files very well, Prusa seems to have much better optimisation -
@modl Cura handles this pretty well, though I can’t remember if you need to install the ‘Machine Settings’ plugin or not (easy to install, can get it directly from the built in Cura add-in ‘store’).
Cura allows you to set standby temperatures, and in the Machine Settings section you can configure heat up and cool down rates for your tools. The generated gcode file has temperature commands embedded that aid in bringing the temperature up to temperature before the tool is selected in RRF.
-
@sebkritikel Thank you very much for the info I'll give it a try too. Last time I used Cura (maybe one year ago?) it also had issues handling the large files I'm dealing with. Will report !
-
@sebkritikel so Cura fails to slice my model, I'll leave that aside for now
@droftarts As for Prusaslicer's script i'm having trouble getting it to function . It is my understanding that it is looking for every M109 commands in the gcode to replace them with other commands a bit before the tool change. I tried editing my tool change gcode so it includes an M109 instead of the M116 I had set, but it still doesn't work. I need to dig
; tool change gcode G91 G1 Z1 G90 T[next_extruder]; select tool M104 S160 T[previous_extruder] ; set previous extruder to standby temp M109 S[temperature] ; wait for temperature
Edit : Maybe i need M73s in the gcode too?
-
I found the setting to add M73 commands but it still would not output the preheating commands, I'll try contacting the creator of the script, see if he is willing to share his config file
-
@modl Re:Cura, do you believe it’s a file size issue? Just curious, as I exclusively use Cura, and the only slicing failures I’ve had deal with extremely large flat overhangs in conjunction with tree supports.
-
@sebkritikel I don't have large flat overhangs, but i do have a lot of complex overhangs (printing a "realistic" model of a plant) using, indeed, tree supports.
-
@modl ah gotcha, bummer to hear!
Not that you should be troubleshooting Cura, but if you’re so inclined - https://github.com/Ultimaker/Cura/discussions/18080
-
@sebkritikel Thank you I tried with the nightly build. Still not able to slice but if i understand correctly, a report was sent to cura devs ? Hopefully this helps
-
@modl Hope so!
Depending on how sensitive you are to sharing your print file, I could take a look at the project and see whats going on.
Insert the model into Cura, do File->Save Project, and then upload that .3mf file to Google drive (or an equivalent). You could post that link here, or directly message me the drive link,
-
Hi eveyone here is an update on this. So I'm stil lnot able to have Prusa's macro to work, in the meantime I did two things , one is working the second remains to be tested. I needed to implement the first solution in deamon.g to accomodate an ongoing long print (2weeks) that didn't have a single macro called on tool changes.
This assumes that succesive layer times have little variations (successive tool work times are approximately similar) which is the case for me with variations from layer to layer being a couple tens of seceonds at max . The thing is, every tool is going to be preheated regardless of their future usage, which is OK in my case as both tools are used until the last layers
Here is what i have in deamon.g
if state.status == "processing" if exists(global.previousTool) if state.currentTool != global.previousTool ; executes right after tool change G10 P{abs(state.currentTool - 1)} R160 if exists(global.newToolchangeTime) ; intitialize previous tool change time with last know tool change time if !exists(global.previousToolchangeTime) global previousToolchangeTime = global.newToolchangeTime else set global.previousToolchangeTime = global.newToolchangeTime if !exists(global.newToolchangeTime) ; update tool change time global newToolchangeTime = state.time else set global.newToolchangeTime = state.time echo "Last Toolchange time was :", global.previousToolchangeTime ; see if it works as intended echo "New Toolchange time is :", global.newToolchangeTime if exists(global.newToolchangeTime) && exists(global.previousToolchangeTime) echo "Calculating time between last tool changes..." if state.currentTool == 0 if !exists(global.lasttoolworkduration0) global lasttoolworkduration1 = global.newToolchangeTime - global.previousToolchangeTime else set global.lasttoolworkduration1 = global.newToolchangeTime - global.previousToolchangeTime if state.currentTool == 1 if !exists(global.lasttoolworkduration1) global lasttoolworkduration0 = global.newToolchangeTime - global.previousToolchangeTime else set global.lasttoolworkduration0 = global.newToolchangeTime - global.previousToolchangeTime if exists(global.lasttoolworkduration0) echo "It took", global.lasttoolworkduration1, "s between two tool changes from 1 to 0" else echo "Not enough tool changes were sampled" if exists(global.lasttoolworkduration1) echo "It took", global.lasttoolworkduration0, "s between two tool changes from 0 to 1" else echo "Not enough tool changes were sampled" if !exists(global.previousTool) global previousTool = state.currentTool else set global.previousTool = state.currentTool if !exists(global.preheatingoffset) global preheatingoffset = 40 else set global.preheatingoffset = 40 ; start heating up 60 seconds before next layer if exists(global.previousLayerTime) && exists(global.lasttoolworkduration0) && exists(global.lasttoolworkduration1) if state.currentTool == 1 && state.time >= global.newToolchangeTime + global.lasttoolworkduration1 - global.preheatingoffset echo "Preheating extruder ", abs(state.currentTool - 1), "..." G10 P{abs(state.currentTool - 1)} R{heat.heaters[abs(state.currentTool -1) + 1].active} ;G10 P{state.currentTool} R150 elif state.currentTool == 0 && state.time >= global.newToolchangeTime + global.lasttoolworkduration0 - global.preheatingoffset echo "Preheating extruder ", abs(state.currentTool - 1), "..." G10 P{abs(state.currentTool - 1)} R{heat.heaters[abs(state.currentTool -1) + 1].active} ;G10 P{state.currentTool} R150
Now the goal, and second solution will be to execute a macro called preheatextruders.g in prusaslicer tool change custom gcode that will handle the Time globals
and let deamon.g do the regular checksIt's DIY and has a rather narrow scope i know but I hope it can help others in similar situations
-
@modl thanks for sharing that.
In the future I have it in mind to be able to use the second file reader to run a simulation of the print in parallel with but ahead of the actual print. The simulation would be able to warn about upcoming tool changes, allowing for automatic tool preheat.