From 8f37700d235de09b836721af536a6e44b6c0ce58 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Thu, 28 Feb 2019 18:16:22 -0500 Subject: [PATCH] verify_heater: If the heating_gain check fails, just use max_error check Don't immediately raise an error if the heating_gain check fails. Instead, just transition to the normal max_error check. This should make the code less likely to raise an error should the heater have a slow approach to the target temperature. Signed-off-by: Kevin O'Connor --- klippy/extras/verify_heater.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/klippy/extras/verify_heater.py b/klippy/extras/verify_heater.py index 5f47ebad..2d9d758b 100644 --- a/klippy/extras/verify_heater.py +++ b/klippy/extras/verify_heater.py @@ -27,9 +27,9 @@ class HeaterCheck: default_gain_time = 60. self.check_gain_time = config.getfloat( 'check_gain_time', default_gain_time, minval=1.) - self.met_target = self.starting_approach = False + self.approaching_target = self.starting_approach = False self.last_target = self.goal_temp = self.error = 0. - self.fault_systime = self.printer.get_reactor().NEVER + self.goal_systime = self.printer.get_reactor().NEVER self.check_timer = None def handle_connect(self): if self.printer.get_start_args().get('debugoutput') is not None: @@ -48,33 +48,37 @@ class HeaterCheck: temp, target = self.heater.get_temp(eventtime) if temp >= target - self.hysteresis: # Temperature near target - reset checks - if not self.met_target and target: + if self.approaching_target and target: logging.info("Heater %s within range of %.3f", self.heater_name, target) - self.met_target = True + self.approaching_target = self.starting_approach = False if temp <= target + self.hysteresis: self.error = 0. - elif self.met_target: - self.error += (target - self.hysteresis) - temp + self.last_target = target + return eventtime + 1. + self.error += (target - self.hysteresis) - temp + if not self.approaching_target: if target != self.last_target: # Target changed - reset checks logging.info("Heater %s approaching new target of %.3f", self.heater_name, target) - self.met_target = False - self.starting_approach = True + self.approaching_target = self.starting_approach = True self.goal_temp = temp + self.heating_gain - self.fault_systime = eventtime + self.check_gain_time + self.goal_systime = eventtime + self.check_gain_time elif self.error >= self.max_error: # Failure due to inability to maintain target temperature return self.heater_fault() elif temp >= self.goal_temp: # Temperature approaching target - reset checks self.starting_approach = False + self.error = 0. self.goal_temp = temp + self.heating_gain - self.fault_systime = eventtime + self.check_gain_time - elif eventtime >= self.fault_systime: - # Failure due to inability to approach target temperature - return self.heater_fault() + self.goal_systime = eventtime + self.check_gain_time + elif eventtime >= self.goal_systime: + # Temperature is no longer approaching target + self.approaching_target = False + logging.info("Heater %s no longer approaching target %.3f", + self.heater_name, target) elif self.starting_approach: self.goal_temp = min(self.goal_temp, temp + self.heating_gain) self.last_target = target