improvements in magfiels/ips_mercury
- read voltage - fix a bug with ._init name conflict
This commit is contained in:
parent
3496e391f6
commit
8e3cdc80e4
@ -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]
|
||||
|
@ -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)
|
||||
|
@ -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')
|
||||
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user