You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The problem is that this is subject to a functional race. If the heater was active prior to G29 being called, then the call to M141 S0 will start to make the chamber fan shutdown. Right now, the chamber fan will stay active for 60s after the chamber heater is turned off. We can assume that this is done to give time for the heater coils to cool down sufficiently.
Now, if the chamber heater was still on when the nozzle wipe sequence completes, but had NOT already reached the target temperature just prior to G29 being called, then the chamber heater coils can still be hot enough to trip the chamber protection sensor in certain scenarios. Some customers have seen this, as the chamber fan can be forced into the off state too soon.
It would be prudent to inject a G4 P15000 command after the M141 S0 command to ensure that the chamber heater unit has had sufficient time to cool down before the fan is forcibly turned off. I recommend that this be done like so:
Additionally, the behavior of TOGGLE_CHAMBER_FAN is inherently relying on the internal coding of chamber_fan.py to ensure that the fan, if initially off, won't turn on because the heater was previously disabled with M141 S0. It's just bad programming practice as it leaves the fan in a non-determinant state. Who knows who/what may have called TOGGLE_CHAMBER_FAN in the past?
I modified chamber_fan.py to give an explicit enable/disable gcode command like so:
It seems to me that get_zoffset wants to be calling DISABLE_CHAMBER_FAN at the start of the macro, and calling ENABLE_CHAMBER_FAN at the end of it, and that's the way it really should be, not potentially flipping the fan state in a non-deterministic fashion and trusting other code paths to handle such properly.
The text was updated successfully, but these errors were encountered:
See here:
klipper/klippy/extras/chamber_fan.py
Lines 31 to 33 in b907369
This creates the
TOGGLE_CHAMBER_FAN
custom g-code command, but there is no indication of whether the fan was on or off.Within the
get_zoffet
macro definition (see here: https://github.com/QIDITECH/QIDI_PLUS4/blob/main/config/gcode_macro.cfg#L29-L45) we can see thatTOGGLE_CHAMBER_FAN
is called.get_zoffset
is called by theG29
macro and others.The problem is that this is subject to a functional race. If the heater was active prior to
G29
being called, then the call toM141 S0
will start to make the chamber fan shutdown. Right now, the chamber fan will stay active for 60s after the chamber heater is turned off. We can assume that this is done to give time for the heater coils to cool down sufficiently.Now, if the chamber heater was still on when the nozzle wipe sequence completes, but had NOT already reached the target temperature just prior to
G29
being called, then the chamber heater coils can still be hot enough to trip the chamber protection sensor in certain scenarios. Some customers have seen this, as the chamber fan can be forced into the off state too soon.It would be prudent to inject a
G4 P15000
command after theM141 S0
command to ensure that the chamber heater unit has had sufficient time to cool down before the fan is forcibly turned off. I recommend that this be done like so:Additionally, the behavior of
TOGGLE_CHAMBER_FAN
is inherently relying on the internal coding ofchamber_fan.py
to ensure that the fan, if initially off, won't turn on because the heater was previously disabled withM141 S0
. It's just bad programming practice as it leaves the fan in a non-determinant state. Who knows who/what may have called TOGGLE_CHAMBER_FAN in the past?I modified
chamber_fan.py
to give an explicit enable/disable gcode command like so:It seems to me that
get_zoffset
wants to be callingDISABLE_CHAMBER_FAN
at the start of the macro, and callingENABLE_CHAMBER_FAN
at the end of it, and that's the way it really should be, not potentially flipping the fan state in a non-deterministic fashion and trusting other code paths to handle such properly.The text was updated successfully, but these errors were encountered: