From 8e3cdc80e4a392edeb2f02a85f87a3e8cbf1c164 Mon Sep 17 00:00:00 2001 From: camea Date: Fri, 12 Aug 2022 15:10:23 +0200 Subject: [PATCH] improvements in magfiels/ips_mercury - read voltage - fix a bug with ._init name conflict --- cfg/main/mb11.cfg | 1 + secop_psi/convergence.py | 11 +++++++++++ secop_psi/ips_mercury.py | 10 +++++++--- secop_psi/magfield.py | 10 ++++++---- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/cfg/main/mb11.cfg b/cfg/main/mb11.cfg index 56b4248..b863724 100644 --- a/cfg/main/mb11.cfg +++ b/cfg/main/mb11.cfg @@ -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] diff --git a/secop_psi/convergence.py b/secop_psi/convergence.py index 15833b5..385a098 100644 --- a/secop_psi/convergence.py +++ b/secop_psi/convergence.py @@ -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) diff --git a/secop_psi/ips_mercury.py b/secop_psi/ips_mercury.py index e965f5e..c3ee708 100644 --- a/secop_psi/ips_mercury.py +++ b/secop_psi/ips_mercury.py @@ -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') diff --git a/secop_psi/magfield.py b/secop_psi/magfield.py index 5e55270..65a33af 100644 --- a/secop_psi/magfield.py +++ b/secop_psi/magfield.py @@ -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()