diff --git a/config/example-extras.cfg b/config/example-extras.cfg index 29e42455..ca57f065 100644 --- a/config/example-extras.cfg +++ b/config/example-extras.cfg @@ -133,15 +133,18 @@ # The amount of time (in seconds) that the heating_gain must be met # in before an error is raised. The default is 20 seconds for # extruders and 60 seconds for heater_bed. -#hysteresis: 10 +#hysteresis: 5 # The difference between the target temperature and the current # temperature for the heater to be considered within range of the -# target temperature. The default is 10. -#check_time: 15 -# The amount of time (in seconds) a heater that has reached the -# target temperature (as defined by the hysteresis field) may fall -# outside the target temperature range before an error is -# raised. The default is 15. +# target temperature. The default is 5. +#max_error: 120 +# The maximum temperature difference a heater that falls outside the +# target temperature range may accumulate before an error is +# raised. For example, if the target temperature is 200, the +# hysteresis is 5, the max_error is 120, and the temperature is +# reported at 185 degrees for 12 seconds then an error would be +# raised (or 24 seconds at 190, or 120 seconds at 194, etc.). The +# default is 120. # Multi-stepper axes. On a cartesian style printer, the stepper diff --git a/klippy/extras/verify_heater.py b/klippy/extras/verify_heater.py index 4a30c241..a6eae5a1 100644 --- a/klippy/extras/verify_heater.py +++ b/klippy/extras/verify_heater.py @@ -11,8 +11,8 @@ class HeaterCheck: self.printer = config.get_printer() self.heater_name = config.get_name().split()[1] self.heater = None - self.hysteresis = config.getfloat('hysteresis', 10., above=0.) - self.check_time = config.getfloat('check_time', 15., minval=1.) + self.hysteresis = config.getfloat('hysteresis', 5., minval=0.) + self.max_error = config.getfloat('max_error', 120., minval=0.) self.heating_gain = config.getfloat('heating_gain', 2., above=0.) default_gain_time = 20. if self.heater_name == 'heater_bed': @@ -20,7 +20,7 @@ class HeaterCheck: self.check_gain_time = config.getfloat( 'check_gain_time', default_gain_time, minval=1.) self.met_target = False - self.last_target = self.goal_temp = 0. + self.last_target = self.goal_temp = self.error = 0. self.fault_systime = self.printer.get_reactor().NEVER def printer_state(self, state): if state == 'connect': @@ -33,12 +33,13 @@ class HeaterCheck: temp, target = self.heater.get_temp(eventtime) if temp >= target - self.hysteresis: # Temperature near target - reset checks - if not self.met_target: + if not self.met_target and target: logging.info("Heater %s within range of %.3f", self.heater_name, target) self.met_target = True - self.fault_systime = eventtime + self.check_time + self.error = 0. elif self.met_target: + self.error += (target - self.hysteresis) - temp if target != self.last_target: # Target changed - reset checks logging.info("Heater %s approaching new target of %.3f", @@ -46,7 +47,7 @@ class HeaterCheck: self.met_target = False self.goal_temp = temp + self.heating_gain self.fault_systime = eventtime + self.check_gain_time - elif eventtime >= self.fault_systime: + elif self.error >= self.max_error: # Failure due to inability to maintain target temperature return self.heater_fault() elif temp >= self.goal_temp: