function added to enable/disable all diffractometer axes

This commit is contained in:
2025-04-28 12:16:45 +02:00
parent d57b964b33
commit c5688804b0
2 changed files with 511 additions and 133 deletions

View File

@ -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