fix bugs with persistent_limit parameter

take into account that reading the switch heater might be delayed
This commit is contained in:
2022-08-16 16:54:30 +02:00
parent 2f6954c4f3
commit f23e42de1f
3 changed files with 45 additions and 24 deletions

View File

@ -82,6 +82,16 @@ description = dynamic needle valve position
slot = DB8.P1,DB4.G1
io = itc1
[mf]
class = secop_psi.ips_mercury.Field
description = magnetic field
slot = GRPZ
io = ips
tolerance = 0.001
wait_stable_field = 60
target.max = 11
persistent_limit = 7
[lev]
class = secop_psi.mercury.HeLevel
description = LHe level
@ -156,14 +166,6 @@ description = coil temperature
slot = MB1.T1
io = ips
[mf]
class = secop_psi.ips_mercury.Field
description = magnetic field
slot = GRPZ
io = ips
tolerance = 0.001
target.max = 11
[om_io]
description = dom motor IO
class = secop_psi.phytron.PhytronIO

View File

@ -119,16 +119,27 @@ class Field(MercuryChannel, Magfield):
return current / self.atob
return 0
def start_ramp_to_field(self, state):
self.change('PSU:SIG:FSET', self.persistent_field)
def set_and_go(self, value):
self.change('PSU:SIG:FSET', value)
assert self.write_action('hold') == 'hold'
assert self.write_action('run_to_set') == 'run_to_set'
def start_ramp_to_field(self, state):
try:
self.set_and_go(self.persistent_field)
except (HardwareError, AssertionError):
state.switch_undef = self.switch_on_time or state.now
return self.wait_for_switch
return self.ramp_to_field
def wait_for_switch(self, state):
if self.now - self.switch_undef < self.wait_switch_on:
return Retry()
self.set_and_go(self.persistent_field)
return self.ramp_to_field
def start_ramp_to_target(self, state):
self.change('PSU:SIG:FSET', self.target)
assert self.write_action('hold') == 'hold'
assert self.write_action('run_to_set') == 'run_to_set'
self.set_and_go(self.target)
return self.ramp_to_target
def start_ramp_to_zero(self, state):

View File

@ -185,7 +185,7 @@ class Magfield(HasLimits, Drivable):
def update_switch_heater(self, value):
"""is called whenever switch heater was changed"""
if value:
if value != 0:
self.switch_off_time = None
if self.switch_on_time is None:
self.switch_on_time = time.time()
@ -196,11 +196,15 @@ class Magfield(HasLimits, Drivable):
def start_switch_on(self, state):
"""switch heater on"""
if self.switch_heater != 0:
self.status = Status.PREPARING, 'wait for heater on'
else:
if self.switch_heater == 0:
self.status = Status.PREPARING, 'turn switch heater on'
self.write_switch_heater(True)
try:
self.write_switch_heater(True)
except Exception as e:
self.log.warning('write_switch_heater %r', e)
return Retry()
else:
self.status = Status.PREPARING, 'wait for heater on'
return self.switch_on
def switch_on(self, state):
@ -210,8 +214,10 @@ class Magfield(HasLimits, Drivable):
return self.check_switch_off
self.read_switch_heater()
if self.switch_on_time is None:
self.log.warning('switch turned off manually - try again')
return self.start_switch_on
if state.now - self.switch_off_time > 10:
self.log.warning('switch turned off manually?')
return self.start_switch_on
return Retry()
if state.now - self.switch_on_time < self.wait_switch_on:
return Retry()
self._last_target = self.target
@ -258,11 +264,11 @@ class Magfield(HasLimits, Drivable):
def start_switch_off(self, state):
"""turn off switch heater"""
if self.switch_heater != 0:
if self.switch_heater == 1:
self.status = Status.FINALIZING, 'turn switch heater off'
self.write_switch_heater(False)
else:
self.status = Status.FINALIZING, 'wait for heater off'
self.write_switch_heater(False)
return self.switch_off
def switch_off(self, state):
@ -274,8 +280,10 @@ class Magfield(HasLimits, Drivable):
self.persistent_field = self.value
self.read_switch_heater()
if self.switch_off_time is None:
self.log.warning('switch turned on manually - try again')
return self.start_switch_off
if state.now - self.switch_on_time > 10:
self.log.warning('switch turned on manually?')
return self.start_switch_off
return Retry()
if state.now - self.switch_off_time < self.wait_switch_off:
return Retry()
if abs(self.value) > self.persistent_limit: