improve magfield and ips_mercury

This commit is contained in:
l_samenv
2022-09-22 17:12:30 +02:00
parent 485e81bfb0
commit 48076edd99
2 changed files with 28 additions and 24 deletions

View File

@ -26,6 +26,7 @@ from secop.lib.enum import Enum
from secop.errors import BadValueError, HardwareError
from secop_psi.magfield import Magfield
from secop_psi.mercury import MercuryChannel, off_on, Mapped
from secop.lib.statemachine import Retry
Action = Enum(hold=0, run_to_set=1, run_to_zero=2, clamped=3)
hold_rtoz_rtos_clmp = Mapped(HOLD=Action.hold, RTOS=Action.run_to_set,
@ -52,7 +53,6 @@ class Field(MercuryChannel, Magfield):
nslaves = 3
slave_currents = None
__init = True
__reset_switch_time = False
def doPoll(self):
super().doPoll()
@ -98,15 +98,10 @@ class Field(MercuryChannel, Magfield):
def read_switch_heater(self):
value = self.query('PSU:SIG:SWHT', off_on)
now = time.time()
switch_time = self.switch_time[self.switch_heater]
if value != self.switch_heater:
self.__reset_switch_time = True
if now < (switch_time or 0) + 10:
if now < (self.switch_time[self.switch_heater] or 0) + 10:
# probably switch heater was changed, but IPS reply is not yet updated
return self.switch_heater
elif self.__reset_switch_time:
self.__reset_switch_time = False
self.switch_time = [None, None]
return value
def write_switch_heater(self, value):
@ -155,16 +150,22 @@ class Field(MercuryChannel, Magfield):
try:
self.set_and_go(self.persistent_field)
except (HardwareError, AssertionError):
state.switch_undef = self.switch_on_time or state.now
state.switch_undef = self.switch_time[self.switch_heater.on] or state.now
return self.wait_for_switch
return self.ramp_to_field
def ramp_to_field(self, state):
if self.action != 'run_to_set':
self.status = Status.PREPARING, 'restart ramp to field'
return self.start_ramp_to_field
return super().ramp_to_field(state)
def wait_for_switch(self, state):
if self.now - self.switch_undef < self.wait_switch_on:
if state.now - state.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.set_and_go(self.target)
return self.ramp_to_target