diff --git a/secop_psi/magfield.py b/secop_psi/magfield.py index 5a71ff4..cdf04c7 100644 --- a/secop_psi/magfield.py +++ b/secop_psi/magfield.py @@ -84,6 +84,7 @@ class Magfield(HasLimits, Drivable): _state = None _init = True _super_sw_check = False + _target_changed = False switch_time = None def doPoll(self): @@ -113,6 +114,7 @@ class Magfield(HasLimits, Drivable): def write_target(self, target): self.check_limits(target) + self._target_changed = target != self.target self.target = target if not self._state.is_active: # as long as the state machine is still running, it takes care of changing targets @@ -145,7 +147,7 @@ class Magfield(HasLimits, Drivable): def start_field_change(self, state): self.setFastPoll(True, 1.0) self.status = Status.PREPARING, 'changed target field' - if self.persistent_field == self.target: + if abs(self.target - self.persistent_field) <= self.tolerance: # short cut return self.check_switch_off return self.start_ramp_to_field @@ -158,7 +160,7 @@ class Magfield(HasLimits, Drivable): def ramp_to_field(self, state): """ramping, wait for current at persistent field""" - if self.persistent_field == self.target: # short cut + if abs(self.target - self.persistent_field) <= self.tolerance: # short cut return self.check_switch_off if abs(self.current - self.persistent_field) > self.tolerance: if state.init: @@ -196,11 +198,11 @@ class Magfield(HasLimits, Drivable): def switch_on(self, state): """wait for switch heater open""" - if self.persistent_field == self.target: # short cut + if abs(self.target - self.persistent_field) <= self.tolerance: # short cut return self.check_switch_off if state.now - self.switch_time < self.wait_switch_on: return Retry() - state.set_point = self.target + self._target_changed = False return self.start_ramp_to_target def start_ramp_to_target(self, state): @@ -212,8 +214,8 @@ class Magfield(HasLimits, Drivable): def ramp_to_target(self, state): """ramp field to target""" - if state.set_point != self.target: # target changed - state.set_point = self.target + if self._target_changed: + self._target_changed = False return self.start_ramp_to_target self.persistent_field = self.value # Remarks: assume there is a ramp limiting feature @@ -226,6 +228,9 @@ class Magfield(HasLimits, Drivable): def stabilize_field(self, state): """stabilize field""" + if self._target_changed: + self._target_changed = False + return self.start_ramp_to_target self.persistent_field = self.value if state.now - state.stabilize_start < self.wait_stable_field: if state.init: @@ -253,9 +258,8 @@ class Magfield(HasLimits, Drivable): def switch_off(self, state): """wait for switch heater closed""" - if self.persistent_field != self.target: # redo - return self.start_switch_on - if self.mode == Mode.DRIVEN: + if self._target_changed or self.mode == Mode.DRIVEN: + # target or mode has changed -> redo return self.start_switch_on self.persistent_field = self.value if state.now - self.switch_time < self.wait_switch_off: @@ -272,7 +276,8 @@ class Magfield(HasLimits, Drivable): def ramp_to_zero(self, state): """ramp field to zero""" - if self.persistent_field != self.target or self.mode == Mode.DRIVEN: # redo + if self._target_changed or self.mode == Mode.DRIVEN: + # target or mode has changed -> redo return self.start_field_change if abs(self.current) > self.tolerance: if state.init: