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 <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2019-02-28 18:16:22 -05:00 committed by KevinOConnor
parent f2ca7d5c66
commit 8f37700d23
1 changed files with 17 additions and 13 deletions

View File

@ -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.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