This commit is contained in:
gac-x05la 2024-12-10 13:19:13 +01:00 committed by mohacsi_i
parent 4e59f15285
commit 59103f16c6

View File

@ -14,7 +14,8 @@ from ophyd.utils.epics_pvs import AlarmSeverity
class SpmgStates: class SpmgStates:
""" Enum for the EPICS MotorRecord's SPMG state""" """Enum for the EPICS MotorRecord's SPMG state"""
# pylint: disable=too-few-public-methods # pylint: disable=too-few-public-methods
STOP = 0 STOP = 0
PAUSE = 1 PAUSE = 1
@ -23,25 +24,24 @@ class SpmgStates:
class EpicsMotorMR(EpicsMotor): class EpicsMotorMR(EpicsMotor):
""" Extended EPICS Motor class """Extended EPICS Motor class
Special motor class that exposes additional motor record functionality. Special motor class that exposes additional motor record functionality.
It extends EpicsMotor base class to provide some simple status checks It extends EpicsMotor base class to provide some simple status checks
before movement. Usage is the same as EpicsMotor. before movement. Usage is the same as EpicsMotor.
""" """
tolerated_alarm = AlarmSeverity.INVALID tolerated_alarm = AlarmSeverity.INVALID
motor_deadband = Component( motor_deadband = Component(EpicsSignalRO, ".RDBD", auto_monitor=True, kind=Kind.config)
EpicsSignalRO, ".RDBD", auto_monitor=True, kind=Kind.config)
motor_mode = Component( motor_mode = Component(
EpicsSignal, ".SPMG", auto_monitor=True, put_complete=True, kind=Kind.omitted) EpicsSignal, ".SPMG", auto_monitor=True, put_complete=True, kind=Kind.omitted
motor_status = Component( )
EpicsSignal, ".STAT", auto_monitor=True, kind=Kind.omitted) motor_status = Component(EpicsSignal, ".STAT", auto_monitor=True, kind=Kind.omitted)
motor_enable = Component( motor_enable = Component(EpicsSignal, ".CNEN", auto_monitor=True, kind=Kind.omitted)
EpicsSignal, ".CNEN", auto_monitor=True, kind=Kind.omitted)
def move(self, position, wait=True, **kwargs) -> MoveStatus: def move(self, position, wait=True, **kwargs) -> MoveStatus:
""" Extended move function with a few sanity checks """Extended move function with a few sanity checks
Note that the default EpicsMotor only supports the 'GO' movement mode. Note that the default EpicsMotor only supports the 'GO' movement mode.
This could get it deadlock if it was previously explicitly stopped. This could get it deadlock if it was previously explicitly stopped.
@ -54,16 +54,15 @@ class EpicsMotorMR(EpicsMotor):
status = self.motor_status.get() status = self.motor_status.get()
if status: if status:
warnings.warn( warnings.warn(
f"EPICS MotorRecord is in alarm state {status}, ophyd will raise", f"EPICS MotorRecord is in alarm state {status}, ophyd will raise", RuntimeWarning
RuntimeWarning )
)
# Warni if trying to move beyond an active limit # Warni if trying to move beyond an active limit
# if self.high_limit_switch and position > self.position: # if self.high_limit_switch and position > self.position:
# warnings.warn("Attempting to move above active HLS", RuntimeWarning) # warnings.warn("Attempting to move above active HLS", RuntimeWarning)
# if self.low_limit_switch and position < self.position: # if self.low_limit_switch and position < self.position:
# warnings.warn("Attempting to move below active LLS", RuntimeWarning) # warnings.warn("Attempting to move below active LLS", RuntimeWarning)
# EpicsMotor might raise # EpicsMotor might raise
try: try:
status = super().move(position, wait, **kwargs) status = super().move(position, wait, **kwargs)
return status return status
@ -75,16 +74,18 @@ class EpicsMotorMR(EpicsMotor):
class EpicsMotorEC(EpicsMotorMR): class EpicsMotorEC(EpicsMotorMR):
""" Detailed ECMC EPICS motor class """Detailed ECMC EPICS motor class
Special motor class to provide additional functionality for ECMC based motors. Special motor class to provide additional functionality for ECMC based motors.
It exposes additional diagnostic fields and includes basic error management. It exposes additional diagnostic fields and includes basic error management.
Usage is the same as EpicsMotor. Usage is the same as EpicsMotor.
""" """
USER_ACCESS = ['reset']
USER_ACCESS = ["reset"]
motor_enable_readback = Component(EpicsSignalRO, "-EnaAct", auto_monitor=True, kind=Kind.normal) motor_enable_readback = Component(EpicsSignalRO, "-EnaAct", auto_monitor=True, kind=Kind.normal)
motor_enable = Component( motor_enable = Component(
EpicsSignal, "-EnaCmd-RB", write_pv="-EnaCmd", auto_monitor=True, kind=Kind.normal) EpicsSignal, "-EnaCmd-RB", write_pv="-EnaCmd", auto_monitor=True, kind=Kind.normal
)
homed = Component(EpicsSignalRO, "-Homed", auto_monitor=True, kind=Kind.normal) homed = Component(EpicsSignalRO, "-Homed", auto_monitor=True, kind=Kind.normal)
velocity_readback = Component(EpicsSignalRO, "-VelAct", auto_monitor=True, kind=Kind.normal) velocity_readback = Component(EpicsSignalRO, "-VelAct", auto_monitor=True, kind=Kind.normal)
position_readback = Component(EpicsSignalRO, "-PosAct", auto_monitor=True, kind=Kind.normal) position_readback = Component(EpicsSignalRO, "-PosAct", auto_monitor=True, kind=Kind.normal)
@ -99,7 +100,7 @@ class EpicsMotorEC(EpicsMotorMR):
error_reset = Component(EpicsSignal, "-ErrRst", put_complete=True, kind=Kind.omitted) error_reset = Component(EpicsSignal, "-ErrRst", put_complete=True, kind=Kind.omitted)
def move(self, position, wait=True, **kwargs) -> MoveStatus: def move(self, position, wait=True, **kwargs) -> MoveStatus:
""" Extended move function with a few sanity checks """Extended move function with a few sanity checks
Note that the default EpicsMotor only supports the 'GO' movement mode. Note that the default EpicsMotor only supports the 'GO' movement mode.
This could get it deadlock if it was previously explicitly stopped. This could get it deadlock if it was previously explicitly stopped.
@ -114,7 +115,7 @@ class EpicsMotorEC(EpicsMotorMR):
return super().move(position, wait, **kwargs) return super().move(position, wait, **kwargs)
def reset(self): def reset(self):
""" Resets an ECMC axis """Resets an ECMC axis
Recovers an ECMC axis from a previous error. Note that this does not Recovers an ECMC axis from a previous error. Note that this does not
solve the cause of the error, that you'll have to do yourself. solve the cause of the error, that you'll have to do yourself.
@ -127,7 +128,7 @@ class EpicsMotorEC(EpicsMotorMR):
- MAX_VELOCITY_EXCEEDED : PID is wrong or the motor is sticking-slipping - MAX_VELOCITY_EXCEEDED : PID is wrong or the motor is sticking-slipping
- BOTH_LIMITS_ACTIVE : The motors are probably not connected - BOTH_LIMITS_ACTIVE : The motors are probably not connected
- HW_ERROR : Tricky one, usually the drive power supply is cut due to - HW_ERROR : Tricky one, usually the drive power supply is cut due to
fuse or safety, might need to push physical buttons. fuse or safety, might need to push physical buttons.
""" """
# Reset the error # Reset the error
self.error_reset.set(1, settle_time=0.2).wait() self.error_reset.set(1, settle_time=0.2).wait()