mesh compensation too aggressive?
-
@gnydick yes, you need to rehome Z after tramming because the plane may have shifted and with that Z is out of whack.
-
@gnydick said in mesh compensation too aggressive?:
I think you're asking me if I home my Z axis at the same place every time. Yes.
Yes and no.
Since I don't home Z using the Z probe I always speak of setting the Z=0 Datum rather than homing Z.
Frederick
-
@gnydick It is also a good idea (assuming you use a probe to set Z=0) to home so that the probe is over one of the points in the bed mesh. If you do that then that point should read 0 in the mesh (or very close to it), if that is not the case then there may be a problem with the mesh (or possibly there is a problem with repeatability of Z homing).
-
@gloomyandy good advice
-
I was just thinking about this topic. I've followed all of the advice and things are better. But, I do still think there should be zero tapering applied at the first layer.
The question posed to me was, "how is it supposed to know which is the first layer?"
There are a number of ways, all of them are hinting it. Many of the gcode commands in RRF have hint-like parameters, so I think this would follow the general style.
Can we just add a param to
M376
?M376: Set bed compensation taper Parameters Hnnn Height (mm) over which to taper off the bed compensation Fnnn.nnn First layer height (mm) used to calculate when to start the taper. By providing this parameter, the taper will be deferred to any height above the first layer height. This will apply the mesh exactly as probed to theoretically follow the bed's contours exactly.
-
@gnydick said in mesh compensation too aggressive?:
I was just thinking about this topic. I've followed all of the advice and things are better. But, I do still think there should be zero tapering applied at the first layer.
As I understand it, there is zero compensation at Z=0
The first layer is always Z0 + first layer height, so it seems reasonable to me that a tiny amount of compensation taper will be applied.
However it would be relatively easy for you to use the layer change section of the slicer to only apply taper after the first layer. -
reasonable a tiny amount of taper will be applied: I don't think it's reasonable, which is why I'm proposing this. I think it's expected because it's just following the programming of the board.
... write some code ...: that's true, but then I have to code something that will have to be evaluated for every line of gcode.
If the condition is in the slicer, then it has to evaluate [layer_num] for every iteration of the loop, which is time/cpu wasted.
If the slicer just outputs
M376 S<calculated new offset>
then the same happens as the previous scenario and the duet controller has extra commands to process.Both of those sound clunky and inconvenient. Given it's reasonable that people will assume tapering isn't applied until the second layer, and the large number of "perfect first layer hunters" out there, combined with many people not wanting to be bothered with coding any more than they really have to, it just makes sense to add this parameter so it's a set and forget.
It would only need to go in the
START
gcode,M376 F[first_layer_height]
, of the slicer and nothing else is every emitted, calculated, or cpu/time wasted on.I would imagine this would be the most efficient and user-friendliest way to do things and adheres to the style of the gcode implementation.
-
@gnydick said in mesh compensation too aggressive?:
If the condition is in the slicer, then it has to evaluate [layer_num] for every iteration of the loop, which is time/cpu wasted.
No, that's not correct (at least for superslicer, & prusa slicer)
If you put M376 H0 in your start GCodeand this in your before later change in the slicer
{if layer_num==1} M376 H10 {endif}
The resulting GCODE is only inserted at the end of layer 1
This is the output with a lot of moves stripped
I use 0.26mm first layer height and 0.2mm layer heightM376 H0 ; added in start G code ;_TOOLCHANGE 0 M106 S0 ;LAYER_CHANGE ;Z:0.26 ;HEIGHT:0.26 G10 ; retract G1 Z0.26 F4800 G92 E0 G1 X92.231 Y124.123 G11 ; unretract ;TYPE:Skirt ;WIDTH:0.44 M106 S0 G1 F2400 G1 X94.242 Y123.447 E0.09 G1 X123.684 Y123.45 G1 X95.98 Y154.962 E0.03 G1 X95.98 Y155.505 E0.02 G1 X96.16 Y155.685 E0.01 ;TYPE_EXTRUDE remove type Solid infill M106 S0 ;LAYER_CHANGE ;Z:0.46 ;HEIGHT:0.2 M376 H10 ; added at end of layer 1 G10 ; retract ; stop printing object Shape-Box id:0 copy 0 M486 S-1 G1 Z0.46 F4800 G92 E0 M140 S90 ; set bed temperature ; printing object Shape-Box id:0 copy 0 M486 S0 G1 X122.241 Y155.741 G11 ; unretract ;TYPE:Internal perimeter ;WIDTH:0.45 M106 S0 G1 F3990 G1 X95.759 Y155.741 E0.9 G1 X95.759 Y129.259 E0.9 G1 X122.241 Y129.259 E0.9 G1 X122.241 Y155.741 E0.9 ;TYPE_EXTRUDE remove type Internal perimeter
-
@OwenD if you add code to the before layer change, it's evaluated for every layer. That's part of what I was talking about.
-
@gnydick
If you added RRF conditional code then yes, it would be evaluated every layer.If you use the slicers own conditional code in the layer change section then it only inserts the command once because the condition is only true once and I have no "else" statement.
I even posted the output to demonstrate that.