improvements in magfiels/ips_mercury

- read voltage
- fix a bug with ._init name conflict
This commit is contained in:
zolliker 2022-08-12 15:10:23 +02:00
parent 3496e391f6
commit 8e3cdc80e4
4 changed files with 25 additions and 7 deletions

View File

@ -161,6 +161,7 @@ class = secop_psi.ips_mercury.Field
description = magnetic field
slot = GRPZ
io = ips
tolerance = 0.001
target.max = 11
[om_io]

View File

@ -89,6 +89,10 @@ class HasConvergence:
"""to be called from write_target"""
self.convergence_state.start(self.state_approach)
def interrupt_state(self):
"""to be called from stop"""
self.convergence_state.start(self.state_instable)
def state_approach(self, state):
"""approaching, checking progress (busy)"""
state.spent_inside = 0
@ -157,3 +161,10 @@ class HasConvergence:
else:
state.spent_inside = max(0, state.spent_inside - state.delta())
return Retry()
def state_interrupt(self, state):
self.status = IDLE, 'stopped' # stop called
return self.state_instable
def stop(self):
self.convergence_state.start(self.state_interrupt)

View File

@ -35,6 +35,7 @@ CURRENT_CHECK_SIZE = 2
class Field(MercuryChannel, Magfield):
action = Parameter('action', EnumType(Action), readonly=False)
setpoint = Parameter('field setpoint', FloatRange(unit='T'), default=0)
voltage = Parameter('leads voltage', FloatRange(unit='V'), default=0)
atob = Parameter('field to amp', FloatRange(0, unit='A/T'), default=0)
forced_persistent_field = Parameter(
'manual indication that persistent field is bad', BoolType(), readonly=False, default=False)
@ -43,13 +44,13 @@ class Field(MercuryChannel, Magfield):
_field_mismatch = None
nslaves = 3
slave_currents = None
_init = True
__init = True
def read_value(self):
self.current = self.query('PSU:SIG:FLD')
pf = self.query('PSU:SIG:PFLD')
if self._init:
self._init = False
if self.__init:
self.__init = False
self.persistent_field = pf
if self.switch_heater != 0 or self._field_mismatch is None:
self.forced_persistent_field = False
@ -92,6 +93,9 @@ class Field(MercuryChannel, Magfield):
def read_atob(self):
return self.query('PSU:ATOB')
def read_voltage(self):
return self.query('PSU:SIG:VOLT')
def read_setpoint(self):
return self.query('PSU:SIG:FSET')

View File

@ -82,19 +82,21 @@ class Magfield(HasLimits, Drivable):
'wait time to ensure field is stable', FloatRange(0, unit='s'), readonly=False, default=31)
_state = None
_init = True
__init = True
_super_sw_check = False
_last_target = None
switch_time = None
def doPoll(self):
if self._init:
self._init = False
if self.__init:
self.__init = False
self.switch_time = time.time()
if self.read_switch_heater() and self.mode == Mode.PERSISTENT:
self.read_value() # check for persistent field mismatch
# switch off heater from previous live or manual intervention
self.write_target(self.persistent_value)
self.write_target(self.persistent_field)
else:
self._last_target = self.persistent_field
else:
self.read_value()
self._state.cycle()