def test_read_pv_timestamp_no_monitor(motor): sp = EpicsSignal(motor.user_setpoint.pvname, name='test') rbv = EpicsSignalRO(motor.user_readback.pvname, name='test') rbv_value0 = rbv.get() ts0 = rbv.timestamp sp.put(sp.value + 0.1, wait=True) time.sleep(0.1) rbv_value1 = rbv.get() ts1 = rbv.timestamp assert ts1 > ts0 assert_almost_equal(rbv_value0 + 0.1, rbv_value1) sp.put(sp.value - 0.1, wait=True)
class Part: def __init__(self, part): # Let errors propagate self._name = part.get('name') self._vset = part.get('vset') self._base = part.get('base') self._scale = part.get('scale') self._ramping = EpicsSignalRO(f'{self._base}{RAMPING}') self._set_voltage = EpicsSignal(f'{self._base}{VSET}') @property def name(self): return self._name @property def vset(self): return self._vset @property def base(self): return self._base def set_voltage(self, zero=False): if zero: self._set_voltage.put(0) else: self._set_voltage.put(self.vset) @property def ramping(self): return self._ramping.get()
def test_read_pv_timestamp_no_monitor(self): mtr = EpicsMotor(config.motor_recs[0], name='test') mtr.wait_for_connection() sp = EpicsSignal(mtr.user_setpoint.pvname, name='test') rbv = EpicsSignalRO(mtr.user_readback.pvname, name='test') rbv_value0 = rbv.get() ts0 = rbv.timestamp sp.put(sp.value + 0.1, wait=True) time.sleep(0.1) rbv_value1 = rbv.get() ts1 = rbv.timestamp self.assertGreater(ts1, ts0) self.assertAlmostEqual(rbv_value0 + 0.1, rbv_value1) sp.put(sp.value - 0.1, wait=True)
def test_read_pv_timestamp_monitor(self): mtr = EpicsMotor(config.motor_recs[0]) mtr.wait_for_connection() sp = EpicsSignal(mtr.user_setpoint.pvname, auto_monitor=True) rbv = EpicsSignalRO(mtr.user_readback.pvname, auto_monitor=True) rbv_value0 = rbv.get() ts0 = rbv.timestamp sp.put(sp.value + 0.1, wait=True) time.sleep(0.1) rbv_value1 = rbv.get() ts1 = rbv.timestamp self.assertGreater(ts1, ts0) self.assertAlmostEqual(rbv_value0 + 0.1, rbv_value1) sp.put(sp.value - 0.1, wait=True)
def check_workstation_access(): wa = EpicsSignalRO('XF:06BM-CT{}Prmt:RemoteExp-Sel', name='write_access') if wa.get() == 0: print( f'{TAB}*** Uh oh! The beamline is not enabled for write access to PVs!' ) print(f'{TAB} You need to get a beamline staff person to do:') print(f'{TAB} caput XF:06BM-CT{{}}Prmt:RemoteExp-Sel 1') print(f'{TAB} then restart bsui') ## the next line is intended to trigger an immediate error and return to the IPython command line wa.put(1)
def instrument_in_use(): """check if the soft IOC for 6BM-A""" from ophyd import EpicsSignalRO tmp = EpicsSignalRO("6bm:instrument_in_use", name="tmp") try: state = tmp.get() except TimeoutError: state = False print("🙈: cannot find this soft IOC PV, please check the settings.") finally: print(f"🙈: the instrument is {'' if state else 'not'} in use.") return state
from ophyd import EpicsSignalWithRBV from ophyd import PVPositioner from ophyd import Signal import datetime import os import time SECOND = 1 MINUTE = 60 * SECOND HOUR = 60 * MINUTE # write output to log file in userDir, name=MMDD-HHmm-heater-log.txt user_dir = EpicsSignalRO("9idcLAX:userDir", name="user_dir", string=True) user_dir.wait_for_connection() log_file_name = os.path.join( user_dir.get(), datetime.datetime.now().strftime("%m%d-%H%M-heater-log.txt")) # Can't call the instrument package in this module. # Thus, we must re-define these devices here class FeatureMixin(Device): @property def settled(self): return self.done.get() == self.done_value class Linkam_CI94_Device(FeatureMixin, PVPositioner): """The old Linkam controller.""" readback = Component(EpicsSignalRO, "temp", kind="normal")
def get_motor_pv(label): _pv_signal = EpicsSignalRO(f"{prefix}Kohzu{label}PvSI", name="tmp") _pv_signal.wait_for_connection() return _pv_signal.get(as_string=True)