diff --git a/secop_psi/ips_mercury.py b/secop_psi/ips_mercury.py index c245b76..84758c5 100644 --- a/secop_psi/ips_mercury.py +++ b/secop_psi/ips_mercury.py @@ -132,6 +132,8 @@ class SimpleField(MercuryChannel, SimpleMagfield): class Field(SimpleField, Magfield): + persistent_field = Parameter( + 'persistent field', FloatRange(unit='$'), readonly=False) wait_switch_on = Parameter( 'wait time to ensure switch is on', FloatRange(0, unit='s'), readonly=True, default=60) wait_switch_off = Parameter( diff --git a/secop_psi/magfield.py b/secop_psi/magfield.py index 2b21687..4c04136 100644 --- a/secop_psi/magfield.py +++ b/secop_psi/magfield.py @@ -130,8 +130,6 @@ class Magfield(SimpleMagfield): 'persistent mode', EnumType(Mode), readonly=False, default=Mode.PERSISTENT) switch_heater = Parameter('switch heater', EnumType(off=OFF, on=ON), readonly=False, default=0) - persistent_field = Parameter( - 'persistent field', FloatRange(unit='$'), readonly=False) current = Parameter( 'leads current (in units of field)', FloatRange(unit='$')) # TODO: time_to_target @@ -164,7 +162,7 @@ class Magfield(SimpleMagfield): def doPoll(self): if self.__init_persistency: if self.__init_persistency is True: - self._last_target = self.persistent_field + self._last_target = self.value self.__init_persistency = time.time() + 60 self.read_value() # check for persistent field mismatch elif self.read_switch_heater() and self.mode != Mode.DRIVEN: @@ -182,11 +180,11 @@ class Magfield(SimpleMagfield): def write_mode(self, value): self.__init_persistency = False - target = self.persistent_field + target = self.value func = self.start_field_change if value == Mode.DISABLED: target = 0 - if abs(self.persistent_field) < self.tolerance: + if abs(self.value) < self.tolerance: func = self.start_switch_off elif value == Mode.PERSISTENT: func = self.start_switch_off @@ -206,7 +204,7 @@ class Magfield(SimpleMagfield): def on_error(self, sm): # sm is short for statemachine if self.switch_heater == ON: - self.persistent_field = self.read_value() + self.read_value() if sm.mode != Mode.DRIVEN: self.log.warning('turn switch heater off') self.write_switch_heater(OFF) @@ -215,9 +213,9 @@ class Magfield(SimpleMagfield): @status_code(Status.PREPARING) def start_field_change(self, sm): self.setFastPoll(True, 1.0) - if sm.target == self.persistent_field or ( + if sm.target == self.value or ( sm.target == self._last_target and - abs(sm.target - self.persistent_field) <= self.tolerance): # short cut + abs(sm.target - self.value) <= self.tolerance): # short cut return self.check_switch_off if self.switch_heater == ON: return self.start_switch_on @@ -237,7 +235,7 @@ class Magfield(SimpleMagfield): if sm.init: sm.stabilize_start = 0 # in case current is already at field self.init_progress(sm, self.current) - dif = abs(self.current - self.persistent_field) + dif = abs(self.current - self.value) if dif > self.tolerance: tdif = self.get_progress(sm, self.current) if tdif > self.leads_ramp_tmo: @@ -283,7 +281,7 @@ class Magfield(SimpleMagfield): @status_code(Status.PREPARING) def wait_for_switch_on(self, sm): if (sm.target == self._last_target and - abs(sm.target - self.persistent_field) <= self.tolerance): # short cut + abs(sm.target - self.value) <= self.tolerance): # short cut return self.check_switch_off self.read_switch_heater() # trigger switch_on/off_time if self.switch_heater == OFF: @@ -309,7 +307,6 @@ class Magfield(SimpleMagfield): @status_code(Status.RAMPING) def ramp_to_target(self, sm): - self.persistent_field = self.value dif = abs(self.value - sm.target) if sm.init: sm.stabilize_start = 0 # in case current is already at target @@ -328,7 +325,6 @@ class Magfield(SimpleMagfield): @status_code(Status.STABILIZING) def stabilize_field(self, sm): - self.persistent_field = self.value if sm.now < sm.stabilize_start + self.wait_stable_field: return Retry return self.check_switch_off @@ -346,7 +342,6 @@ class Magfield(SimpleMagfield): @status_code(Status.FINALIZING) def wait_for_switch_off(self, sm): - self.persistent_field = self.value self.read_switch_heater() if self.switch_heater == ON: if sm.init: # avoid too many states chained @@ -377,6 +372,6 @@ class Magfield(SimpleMagfield): if self.get_progress(sm, self.value) > self.leads_ramp_tmo: raise HardwareError('no progress') return Retry - if sm.mode == Mode.DISABLED and abs(self.persistent_field) < self.tolerance: + if sm.mode == Mode.DISABLED and abs(self.value) < self.tolerance: return self.final_status(Status.DISABLED, 'disabled') return self.final_status(Status.IDLE, 'persistent mode')