improve HasConvergence mixin
- add stop command - fix bug in cleanup - reset time spent on write_target Change-Id: Iaa76cb7a9c6b4a2ccb08313f9880006ab14afe2b Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/29355 Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de> Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch> Tested-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
@ -60,8 +60,8 @@ class HasConvergence:
|
||||
|
||||
def cleanup(self, state):
|
||||
state.default_cleanup(state)
|
||||
if self.stopped:
|
||||
if self.stopped is Stop: # and not Restart
|
||||
if state.stopped:
|
||||
if state.stopped is Stop: # and not Restart
|
||||
self.status = WARN, 'stopped'
|
||||
else:
|
||||
self.status = WARN, repr(state.last_error)
|
||||
@ -78,11 +78,11 @@ class HasConvergence:
|
||||
return dif / self.timeout # assume exponential decay of dif, with time constant <tolerance>
|
||||
|
||||
def get_dif_tol(self):
|
||||
self.read_value()
|
||||
value = self.read_value()
|
||||
tol = self.tolerance
|
||||
if not tol:
|
||||
tol = 0.01 * max(abs(self.target), abs(self.value))
|
||||
dif = abs(self.target - self.value)
|
||||
tol = 0.01 * max(abs(self.target), abs(value))
|
||||
dif = abs(self.target - value)
|
||||
return dif, tol
|
||||
|
||||
def start_state(self):
|
||||
@ -91,6 +91,7 @@ class HasConvergence:
|
||||
|
||||
def state_approach(self, state):
|
||||
"""approaching, checking progress (busy)"""
|
||||
state.spent_inside = 0
|
||||
dif, tol = self.get_dif_tol()
|
||||
if dif < tol:
|
||||
state.timeout_base = state.now
|
||||
@ -101,7 +102,6 @@ class HasConvergence:
|
||||
state.timeout_base = state.now
|
||||
state.dif_crit = dif # criterium for resetting timeout base
|
||||
self.status = BUSY, 'approaching'
|
||||
state.spent_inside = 0
|
||||
state.dif_crit -= self.get_min_slope(dif) * state.delta()
|
||||
if dif < state.dif_crit: # progress is good: reset timeout base
|
||||
state.timeout_base = state.now
|
||||
@ -157,3 +157,16 @@ class HasConvergence:
|
||||
else:
|
||||
state.spent_inside = max(0, state.spent_inside - state.delta())
|
||||
return Retry()
|
||||
|
||||
def state_interrupt(self, state):
|
||||
"""stopping"""
|
||||
self.status = IDLE, 'stopped' # stop called
|
||||
return self.state_instable
|
||||
|
||||
def stop(self):
|
||||
"""set to idle when busy
|
||||
|
||||
does not stop control!
|
||||
"""
|
||||
if self.isBusy():
|
||||
self.convergence_state.start(self.state_interrupt)
|
||||
|
Reference in New Issue
Block a user