Extrusion multiplier
I have a situation where a product I print with TPU has a perfect first layer finish if I specify a .2mm initial layer in PS but lower the printhead by .06mm for the initial layer on the printer control software, producing an actual 1st layer 0f .14mm but with extrusion calculated for .2mm. So it requires a bit of overextrusion to get the first layer to print well. If I set the 1st layer thinner (.14) in prusaslicer instead of lowering the nozzle I get underextrusion since PS then calculates extrusion differently. If I up the print multiplier I can get the 1st layer to print ok but the rest of the part is then overextruded. Can this be handled in PS so I don't need to tweak the nozzle in the printer control software everytime?
Best Answer by bobstro:
Rather than approximate a flow adjustment by moving the nozzle, why not just insert M221 gcode commands to set a specific flow adjustment at layer 1, then issue another M221 on layer 2? The only downside is that this would make the most sense in layer change gcode -- is that what @lbbro is referring to? -- so you'd (maybe) want to not have it do so for other filaments. You could build in a filament check for FLEX filament type to make it universal.
This reads as if your first layer Z configuration is a little off... For flex filaments it sometimes needs to be set slightly lower.
Cheerio,
I’m not at my pc at the moment but isn’t there a first layer %flow setting ? Or am I getting a super slicer setting mixed up.
RE: extrusion multiplier
searching forums it seems that there is not a setting in PS for that. I've seen a few posts where OP's got belittled for thinking they needed it. I've come up with 3 solutions to allow me to print untethered. 1st was to add an M851 Z# to change the z offset before doing a g29.1, which is how I autolevel. Then I change it back in end gcode. Not great because if you change nozzles and need to recal z offset then all the old gcode production files need edited. 2nd is to set extrusion multipiler befare 1st layer and reset it before 2nd layer. OK, but painful to calibrate. The solution I'm using for now, unless someone can come up with something perfect is in startup gcode and end gcode. Prusa calculates extrusion for 1st layer but the gcode below lowers the nozzle to squeeze things enough to get a good surface on the bed. Every file starts off at zero and there is only one line to edit if needed. I find it easier to calibrate than playing with extrusion multiplier.
G92.1 ;turn off g92
G1 Z10
G91
G1 Z0 ;edit and enter appropriate z startup babystep here
G92 Z10
G90
Then in end gcode I add a G92.1 to cancel the offset.
So instead of calibrating a first layer Z and saving it as a print sheet profile you prefer do do it in custom gcode?
OK, whatever works for you.
There is always more than one way to do it.
Cheerio,
Diem its always possible the OP doesn't have a prusa printer and so can't do a z level and store it as we would with something like a MK3.
I agree that adjusting your actual nozzle/bed distance to get a nice squished first layer and a leveled bed is always preferable to any other method as its a physical real world adjustment rather than something in software. Its what I do with my Cr10s but its not as easy to do with those as it is with my mk3.
Fair comment, but IMO it's reasonable to assue a Prusa or clone for anyone posting here without stating otherwise.
Cheerio,
Diem?
Let me try this again. I posted here because I am looking for a way to get Prusaslicer to directly produce a particular file that prints correctly without modifying gcode or changing my machine calibration every time I need to print it. The part is printed with tpu and if the 1st layer is not overextruded the surface finish is not good. I have found good ways to manage this involving gcode edits. I can live with that. Do you know a way to do this in Prusa Slicer directly? If so that is what I was hoping to learn. Thanks.
RE: More info
In case this helps:
I'm running a prusa clone (pulse XE) with marlin 2.8.1. I am comfortable tweaking firmware and my version has some changes I have made to autoleveling.
I do an autolevel at the start of each part in startup gcode.
Z calibration is good and prints in material other than tpu come out accurate with a good surface on the bed.
For this family of parts, I need to overextrude the 1st layer only to get good results.
I can adjust my z probe offset manually on the printer by .04mm before printing these and the results are good. I want a way to not do this manually every time. The gcode edit with G91...G90 from above is the best way I have found.
RE: If you want to adjust flow for the 1st layer, I'd adjust flow for the first layer
Rather than approximate a flow adjustment by moving the nozzle, why not just insert M221 gcode commands to set a specific flow adjustment at layer 1, then issue another M221 on layer 2? The only downside is that this would make the most sense in layer change gcode -- is that what @lbbro is referring to? -- so you'd (maybe) want to not have it do so for other filaments. You could build in a filament check for FLEX filament type to make it universal.
and miscellaneous other tech projects
He is intelligent, but not experienced. His pattern indicates two dimensional thinking. -- Spock in Star Trek: The Wrath of Khan
RE: M221
Yes, I've done it that way and it does work. I like the idea of making it universal. Hadn't thought of that. I see 'notes' are available as a placeholder which could maybe hold an overextrude flow rate if needed, doesn't say which notes, but easy enough to find out. Thanks!
M221
I have previous comment that got flagged to be moderated, so I'm trying again. Automating M221 is a good idea. I'm using filament_notes to hold an overextrusion flow multiplier for the 1st layer, and writing the extrusion_multiplier for the 2nd layer. It works except I have not found a conditional that can tell if filament_notes is empty. if {filament_notes!=""} , if {filament_notes!=//} etc. all make PS unhappy. Goal is to write M221 [filament_notes] only if filament_notes is not blank. Anyone have any insight to that. Considering using filament_density but will lose cost estimates, not a huge deal.
I'd use filament_type
I have previous comment that got flagged to be moderated, so I'm trying again. Automating M221 is a good idea. I'm using filament_notes to hold an overextrusion flow multiplier for the 1st layer, and writing the extrusion_multiplier for the 2nd layer. It works except I have not found a conditional that can tell if filament_notes is empty. if {filament_notes!=""} , if {filament_notes!=//} etc. all make PS unhappy. Goal is to write M221 [filament_notes] only if filament_notes is not blank. Anyone have any insight to that. Considering using filament_density but will lose cost estimates, not a huge deal.
I'm not a fan of trying to parse too much out of the notes fields. I'd try using filament_type for this test just to keep it isolated from everything else. It makes writing the conditional code much easier.
Something like:
{if layer_z==1} {if filament_type=~/.*FLEX.*/} M221 S110 {else} M221 S100 {endif} {endif}
Do make sure Before layer change g-code is inserted before layer 1. If not, you might end up putting the 221 S110 (or your preferred setting) in filament start gcode, then having your universal layer change gcode set it back to M221 S100 on layer 2.
I can't play around right now, but I recall nesting ifs works. Definitely confirm!
and miscellaneous other tech projects
He is intelligent, but not experienced. His pattern indicates two dimensional thinking. -- Spock in Star Trek: The Wrath of Khan
RE: Macros
I implemented it using filament gcode and layer change gcode
In filament gcode:
{if filament_spool_weight[0]>0 && filament_spool_weight[0]<2}M221 S{(filament_spool_weight[0] * 100)}{else}M221 S{(extrusion_multiplier[0] * 100)}{endif}
And in layer change gcode:
{if layer_num==1 && filament_spool_weight[0]>0 && filament_spool_weight[0]<2}M221 S{(extrusion_multiplier[0] * 100)}{endif}
If I put a number between 0 and 2 in as spool weight it uses it as a 1st layer extrusion_multiplier and writes the actual extrusion_multiplier at the 2nd layer start. Works great, no more gcode editing. I found that layer_z is the z value for the layer .2, .4 etc. layer_num is the integer layer number and starts at 0. so for the 2nd layer layer_num is 1.
Thanks for the idea. Opens up a lot more potential. I didn't know about macros before.
Ah, forgot about the PrusaSlicer syntax
[...] I found that layer_z is the z value for the layer .2, .4 etc. layer_num is the integer layer number and starts at 0. so for the 2nd layer layer_num is 1.
Ah, forgot about that. I also forgot about the "&&" syntax, thanks for the reminder! I'd normally test, but I'm having a busy day.
Thanks for the idea. Opens up a lot more potential. I didn't know about macros before.
Glad it's all working. It's an interesting idea.
and miscellaneous other tech projects
He is intelligent, but not experienced. His pattern indicates two dimensional thinking. -- Spock in Star Trek: The Wrath of Khan