def setUp(self): self.ca = ChannelAccess(device_prefix="MOT", default_timeout=30) with ManagerMode(ChannelAccess()): self._disable_collision_avoidance() for axis in BAFFLES_AND_DETECTORS_Z_AXES: current_position = self.ca.get_pv_value("{}".format(axis)) new_position = self._get_axis_default_position( "{}".format(axis)) self.ca.set_pv_value("{}:MTR.VMAX".format(axis), TEST_SPEED, sleep_after_set=0) self.ca.set_pv_value("{}:MTR.VELO".format(axis), TEST_SPEED, sleep_after_set=0) self.ca.set_pv_value("{}:MTR.ACCL".format(axis), TEST_ACCELERATION, sleep_after_set=0) if current_position != new_position: self.ca.set_pv_value("{}:SP".format(axis), new_position, sleep_after_set=0) timeout = self._get_timeout_for_moving_to_position( axis, new_position) self.ca.assert_that_pv_is("{}".format(axis), new_position, timeout=timeout) # re-enable collision avoidance self._enable_collision_avoidance()
def test_WHEN_heater_association_is_set_THEN_pv_updates( self, _, parent_card, associated_card): card_pv_prefix = get_card_pv_prefix(parent_card) with ManagerMode(ChannelAccess()): self.ca.assert_setting_setpoint_sets_readback( associated_card, "{}:HTRCHAN".format(card_pv_prefix))
def test_GIVEN_jaw_5_set_directly_WHEN_set_pv_called_THEN_underlying_jaw_5_changes( self, direction): underlying_jaw = UNDERLYING_GAP_SP.format(5, direction) with ManagerMode(self.ca): self.ca.set_pv_value(TOP_LEVEL_JAW_5_GAP.format(direction), 10) self.ca.set_pv_value(SET_JAW_5, 1) self.ca.assert_that_pv_is_number(underlying_jaw, 10)
def test_GIVEN_jaws_not_at_zero_WHEN_define_motor_position_for_jaw_centres_THEN_jaws_position_are_changed_without_move( self): param_name = "S1HC" jaw_motors = ["MTR0203", "MTR0204"] initial_gap = 1.0 initial_centre = 2.0 new_centre = 4.0 expected_pos = { "MTR0203": initial_gap / 2.0 + new_centre, "MTR0204": initial_gap / 2.0 - new_centre } self.ca.assert_setting_setpoint_sets_readback(initial_gap, "PARAM:S1HG", expected_alarm=None, timeout=30) self.ca.assert_setting_setpoint_sets_readback(initial_centre, "PARAM:S1HC", expected_alarm=None, timeout=30) for motor_name in jaw_motors: self.ca_galil.set_pv_value("{}.FOFF".format(motor_name), "Frozen") self.ca_galil.set_pv_value("{}.OFF".format(motor_name), 0) for motor_name in jaw_motors: self.ca_galil.assert_that_pv_is("{}.DMOV".format(motor_name), 1, timeout=30) with ManagerMode(self.ca_no_prefix): self.ca.set_pv_value( "PARAM:{}:DEFINE_POSITION_AS".format(param_name), new_centre) # soon after change there should be no movement, ie a move is triggered but the motor itself does not move so it # is very quick for motor_name in jaw_motors: self.ca_galil.assert_that_pv_is("{}.DMOV".format(motor_name), 1, timeout=1) for motor_name in jaw_motors: # jaws are open to half the gap self.ca_galil.assert_that_pv_is("{}.RBV".format(motor_name), expected_pos[motor_name]) self.ca_galil.assert_that_pv_is("{}.VAL".format(motor_name), expected_pos[motor_name]) self.ca_galil.assert_that_pv_is("{}.SET".format(motor_name), "Use") self.ca_galil.assert_that_pv_is("{}.FOFF".format(motor_name), "Frozen") self.ca_galil.assert_that_pv_is_number("{}.OFF".format(motor_name), 0.0, tolerance=MOTOR_TOLERANCE) self.ca.assert_that_pv_is("PARAM:{}".format(param_name), new_centre) self.ca.assert_that_pv_is("PARAM:{}:SP".format(param_name), new_centre) self.ca.assert_that_pv_is("PARAM:{}:SP_NO_ACTION".format(param_name), new_centre) self.ca.assert_that_pv_is("PARAM:{}:CHANGED".format(param_name), "NO")
def _set_collision_avoidance_state_with_retries(self, state): with ManagerMode(ChannelAccess()): for _ in range(5): try: self.ca.set_pv_value("SANS2DVAC:COLLISION_AVOIDANCE", state) break except WriteAccessException as e: err = e time.sleep(1) else: raise err
def test_GIVEN_motors_at_zero_WHEN_define_motor_position_to_and_back_multiple_times_THEN_motor_position_is_changed_without_move( self): param_name = "DET_POS" motor_name = "MTR0104" initial_foff = "Frozen" self.ca.set_pv_value("PARAM:{}:SP".format(param_name), 0) self.ca_galil.set_pv_value("MTR0104.FOFF", initial_foff) self.ca_galil.set_pv_value("MTR0104.OFF", 0) self.ca.assert_that_pv_is_number("PARAM:{}".format(param_name), 0, tolerance=MOTOR_TOLERANCE, timeout=30) self.ca_galil.assert_that_pv_is("MTR0104.DMOV", 1, timeout=30) for i in range(20): new_position = i - 5 with ManagerMode(self.ca_no_prefix): self.ca.set_pv_value( "PARAM:{}:DEFINE_POSITION_AS".format(param_name), new_position) # soon after change there should be no movement, ie a move is triggered but the motor itself does not move so it # is very quick self.ca_galil.assert_that_pv_is("{}.DMOV".format(motor_name), 1, timeout=1) self.ca_galil.assert_that_pv_is("{}.RBV".format(motor_name), new_position) self.ca_galil.assert_that_pv_is("{}.VAL".format(motor_name), new_position) self.ca_galil.assert_that_pv_is("{}.SET".format(motor_name), "Use") self.ca_galil.assert_that_pv_is("{}.FOFF".format(motor_name), initial_foff) self.ca_galil.assert_that_pv_is_number("{}.OFF".format(motor_name), 0.0, tolerance=MOTOR_TOLERANCE) self.ca.assert_that_pv_is("PARAM:{}".format(param_name), new_position) self.ca.assert_that_pv_is("PARAM:{}:SP".format(param_name), new_position) self.ca.assert_that_pv_is( "PARAM:{}:SP_NO_ACTION".format(param_name), new_position) self.ca.assert_that_pv_is("PARAM:{}:CHANGED".format(param_name), "NO")
def setUp(self): super(PolarisJawsManagerTests, self).setUp() with ManagerMode(self.ca): # Use a retry loop here in case the IOC has not connected to the manager mode PV yet for _ in range(10): try: [ self.ca.set_pv_value( TOP_LEVEL_JAW_5_GAP.format(direction), 0) for direction in ["V", "H"] ] self.ca.set_pv_value(SET_JAW_5, 1) except WriteAccessException: sleep(5) else: break else: raise WriteAccessException( "Unable to write to jaws 5 in setup after 10 attempts")
def test_GIVEN_motors_not_at_zero_WHEN_define_motor_position_to_THEN_motor_position_is_changed_without_move( self, initial_foff, param_name, motor_name): offset = 10 new_position = 2 self.ca.set_pv_value("PARAM:{}:SP".format(param_name), offset) self.ca_galil.set_pv_value("MTR0104.FOFF", initial_foff) self.ca_galil.set_pv_value("MTR0104.OFF", 0) self.ca.assert_that_pv_is_number("PARAM:{}".format(param_name), offset, tolerance=MOTOR_TOLERANCE, timeout=30) self.ca_galil.assert_that_pv_is("MTR0104.DMOV", 1, timeout=30) with ManagerMode(self.ca_no_prefix): self.ca.set_pv_value( "PARAM:{}:DEFINE_POSITION_AS".format(param_name), new_position) # soon after change there should be no movement, ie a move is triggered but the motor itself does not move so it # is very quick self.ca_galil.assert_that_pv_is("{}.DMOV".format(motor_name), 1, timeout=1) self.ca_galil.assert_that_pv_is("{}.RBV".format(motor_name), new_position) self.ca_galil.assert_that_pv_is("{}.VAL".format(motor_name), new_position) self.ca_galil.assert_that_pv_is("{}.SET".format(motor_name), "Use") self.ca_galil.assert_that_pv_is("{}.FOFF".format(motor_name), initial_foff) self.ca_galil.assert_that_pv_is_number("{}.OFF".format(motor_name), 0.0, tolerance=MOTOR_TOLERANCE) self.ca.assert_that_pv_is("PARAM:{}".format(param_name), new_position) self.ca.assert_that_pv_is("PARAM:{}:SP".format(param_name), new_position) self.ca.assert_that_pv_is("PARAM:{}:SP_NO_ACTION".format(param_name), new_position) self.ca.assert_that_pv_is("PARAM:{}:CHANGED".format(param_name), "NO") self.ca.assert_that_pv_is("PARAM:THETA", 0) self.ca.assert_that_pv_is("PARAM:THETA:SP", 0) self.ca.assert_that_pv_is("PARAM:THETA:SP:RBV", 0)
def _set_collision_avoidance_state(self, write_value, read_value): # Do nothing if manager mode is already in correct state if ChannelAccess().get_pv_value(ManagerMode.MANAGER_MODE_PV) != "Yes": cm = ManagerMode(ChannelAccess()) else: cm = nullcontext() with cm: err = None for _ in range(20): try: self.ca.set_pv_value("SANS2DVAC:COLLISION_AVOIDANCE", write_value, sleep_after_set=0) break except WriteAccessException as e: err = e sleep(1) else: raise err self.ca.assert_that_pv_is("SANS2DVAC:COLLISION_AVOIDANCE", read_value)
def test_WHEN_setting_calibration_file_THEN_pv_updates( self, _, test_value, card): card_pv_prefix = get_card_pv_prefix(card) with ManagerMode(ChannelAccess()): self.ca.assert_setting_setpoint_sets_readback( test_value, "{}:CALFILE".format(card_pv_prefix))