function added to enable/disable all diffractometer axes
This commit is contained in:
@ -9,20 +9,26 @@
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
from slic.core.adjustable import PVAdjustable, Linked, Adjustable, Collection
|
from slic.core.adjustable import PVAdjustable, Linked, Adjustable, Collection
|
||||||
from slic.core.device import Device
|
from slic.core.device import Device
|
||||||
from slic.devices.general.motor import Motor
|
from slic.devices.general.motor import Motor
|
||||||
|
|
||||||
class MotorECMC(Motor):
|
class MotorECMC(Motor):
|
||||||
'''Regular motor class with extra EPICS and ECMC tolerance deadbands for motion.'''
|
'''Regular motor class with extras for ECMC servo motors (tolerance deadbands, PIDs ...)'''
|
||||||
def __init__(self, ID, **kwargs):
|
def __init__(self, ID, **kwargs):
|
||||||
super().__init__(ID, **kwargs)
|
super().__init__(ID, **kwargs)
|
||||||
self.deadband_epics = PVAdjustable(self.name+'-SetAtTrgtDB',units='mm',name='Tolerance deadband for EPICS target reached flag.')
|
self.deadband_epics = PVAdjustable(self.name+'-SetAtTrgtDB',units='mm',name='Tolerance deadband for EPICS target reached flag.')
|
||||||
self.deadband_ecmc = PVAdjustable(self.name+'-SetCtrlDB',units='mm', name='Tolerance deadband for ECMC servo motor control')
|
self.deadband_ecmc = PVAdjustable(self.name+'-SetCtrlDB',units='mm', name='Tolerance deadband for ECMC servo motor control')
|
||||||
self.p = PVAdjustable(self.name+'-Ctrl-Kp',name=self.name+' P parameter')
|
self.deadbands = Collection(self.name+'motion deadbands',[self.deadband_epics,self.deadband_ecmc])
|
||||||
self.i = PVAdjustable(self.name+'-Ctrl-Ki',name=self.name+' I parameter')
|
|
||||||
self.d = PVAdjustable(self.name+'-Ctrl-Kd',name=self.name+' D parameter')
|
self.p = PVAdjustable(self.name+'-Ctrl-Kp',name='P parameter')
|
||||||
|
self.i = PVAdjustable(self.name+'-Ctrl-Ki',name='I parameter')
|
||||||
|
self.d = PVAdjustable(self.name+'-Ctrl-Kd',name='D parameter')
|
||||||
self.pids = Collection(self.name+'PID values',[self.p,self.i,self.d])
|
self.pids = Collection(self.name+'PID values',[self.p,self.i,self.d])
|
||||||
|
self.enabled = PVAdjustable(self.name+'-EnaCmd',name='Axis enabled')
|
||||||
|
|
||||||
class Diffractometer(Device):
|
class Diffractometer(Device):
|
||||||
def __init__(self, ID, **kwargs):
|
def __init__(self, ID, **kwargs):
|
||||||
super().__init__(ID, **kwargs)
|
super().__init__(ID, **kwargs)
|
||||||
@ -44,8 +50,21 @@ class Diffractometer(Device):
|
|||||||
# This diffractometer also has extra swivel stages
|
# This diffractometer also has extra swivel stages
|
||||||
self.rot_x = MotorECMC(ID + ":ROTX")
|
self.rot_x = MotorECMC(ID + ":ROTX")
|
||||||
self.rot_z = MotorECMC(ID + ":ROTZ")
|
self.rot_z = MotorECMC(ID + ":ROTZ")
|
||||||
|
self.axes = Collection(self.name+'movable axes',[self.twotheta,self.theta,self.tr_x,self.tr_y,self.tr_z,self.td,self.trx_base,self.try_base,
|
||||||
|
self.rot_x,self.rot_z])
|
||||||
if ID == "SARES31-GPS":
|
if ID == "SARES31-GPS":
|
||||||
self.name = "DM1: Cristallina dilution fridge diffractometer"
|
self.name = "DM1: Cristallina dilution fridge diffractometer"
|
||||||
|
self.axes = Collection(self.name+'movable axes',[self.twotheta,self.theta,self.tr_x,self.tr_y,self.tr_z,self.td,self.trx_base,self.try_base])
|
||||||
|
|
||||||
|
|
||||||
|
def enable_all_axes(self):
|
||||||
|
for axis in self.axes.adjs:
|
||||||
|
axis.enabled.set_target_value(True).wait()
|
||||||
|
|
||||||
|
def disable_all_axes(self):
|
||||||
|
for axis in self.axes.adjs:
|
||||||
|
axis.enabled.set_target_value(False).wait()
|
||||||
|
|
||||||
|
|
||||||
# class Diffractometer(Device):
|
# class Diffractometer(Device):
|
||||||
# def __init__(self, ID, motor_naming="MOTOR", **kwargs):
|
# def __init__(self, ID, motor_naming="MOTOR", **kwargs):
|
||||||
@ -80,3 +99,45 @@ class ThetasCombined(Linked):
|
|||||||
self.offset = offset
|
self.offset = offset
|
||||||
|
|
||||||
|
|
||||||
|
class DelayAxis(MotorECMC):
|
||||||
|
def __init__(self, axis, delay_after_move=1):
|
||||||
|
#super().__init__(self, *args, **kwargs)#
|
||||||
|
delay_time = delay_after_move
|
||||||
|
self.axis = axis
|
||||||
|
|
||||||
|
def set_target_value(self, value):
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
self.axis.set_target_value(value)
|
||||||
|
while self.axis.is_moving():
|
||||||
|
time.sleep(0.1)
|
||||||
|
|
||||||
|
elapsed = time.time() - start_time
|
||||||
|
wait_time = max(0, self.delay_time - elapsed)
|
||||||
|
time.sleep(wait_time)
|
||||||
|
|
||||||
|
|
||||||
|
class Delayed(Adjustable):
|
||||||
|
def __init__(self, ID, adj, delay_after_move=0, **kwargs):
|
||||||
|
super().__init__(ID, **kwargs)
|
||||||
|
self.adj = adj
|
||||||
|
self.delay_after_move = delay_after_move
|
||||||
|
|
||||||
|
def get_current_value(self):
|
||||||
|
value = self.adj.get_current_value()
|
||||||
|
return value
|
||||||
|
|
||||||
|
def set_target_value(self, value):
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
self.adj.set_target_value(value).wait()
|
||||||
|
|
||||||
|
while self.adj.is_moving():
|
||||||
|
time.sleep(0.02)
|
||||||
|
|
||||||
|
elapsed = time.time() - start_time
|
||||||
|
wait_time = max(0, self.delay_time - elapsed)
|
||||||
|
time.sleep(wait_time)
|
||||||
|
|
||||||
|
def is_moving(self):
|
||||||
|
return self.adj.is_moving()
|
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user