fix: online changes during flomni comm
This commit is contained in:
parent
b808659d4d
commit
4760456e63
@ -131,11 +131,7 @@ class FlomniGalilAxesReferenced(GalilAxesReferenced):
|
|||||||
|
|
||||||
class FlomniGalilMotor(Device, PositionerBase):
|
class FlomniGalilMotor(Device, PositionerBase):
|
||||||
USER_ACCESS = ["controller"]
|
USER_ACCESS = ["controller"]
|
||||||
readback = Cpt(
|
readback = Cpt(FlomniGalilReadbackSignal, signal_name="readback", kind="hinted")
|
||||||
FlomniGalilReadbackSignal,
|
|
||||||
signal_name="readback",
|
|
||||||
kind="hinted",
|
|
||||||
)
|
|
||||||
user_setpoint = Cpt(FlomniGalilSetpointSignal, signal_name="setpoint")
|
user_setpoint = Cpt(FlomniGalilSetpointSignal, signal_name="setpoint")
|
||||||
motor_resolution = Cpt(FlomniGalilMotorResolution, signal_name="resolution", kind="config")
|
motor_resolution = Cpt(FlomniGalilMotorResolution, signal_name="resolution", kind="config")
|
||||||
motor_is_moving = Cpt(FlomniGalilMotorIsMoving, signal_name="motor_is_moving", kind="normal")
|
motor_is_moving = Cpt(FlomniGalilMotorIsMoving, signal_name="motor_is_moving", kind="normal")
|
||||||
@ -271,18 +267,10 @@ class FlomniGalilMotor(Device, PositionerBase):
|
|||||||
while self.motor_is_moving.get():
|
while self.motor_is_moving.get():
|
||||||
logger.info("motor is moving")
|
logger.info("motor is moving")
|
||||||
val = self.readback.read()
|
val = self.readback.read()
|
||||||
self._run_subs(
|
self._run_subs(sub_type=self.SUB_READBACK, value=val, timestamp=time.time())
|
||||||
sub_type=self.SUB_READBACK,
|
|
||||||
value=val,
|
|
||||||
timestamp=time.time(),
|
|
||||||
)
|
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
val = self.readback.read()
|
val = self.readback.read()
|
||||||
success = np.isclose(
|
success = np.isclose(val[self.name]["value"], position, atol=self.tolerance)
|
||||||
val[self.name]["value"],
|
|
||||||
position,
|
|
||||||
atol=self.tolerance,
|
|
||||||
)
|
|
||||||
|
|
||||||
if not success:
|
if not success:
|
||||||
print(" stop")
|
print(" stop")
|
||||||
|
@ -8,8 +8,6 @@ from ophyd import Component as Cpt
|
|||||||
from ophyd import Device, PositionerBase, Signal
|
from ophyd import Device, PositionerBase, Signal
|
||||||
from ophyd.status import wait as status_wait
|
from ophyd.status import wait as status_wait
|
||||||
from ophyd.utils import LimitError, ReadOnlyError
|
from ophyd.utils import LimitError, ReadOnlyError
|
||||||
from prettytable import PrettyTable
|
|
||||||
|
|
||||||
from ophyd_devices.galil.galil_ophyd import (
|
from ophyd_devices.galil.galil_ophyd import (
|
||||||
BECConfigError,
|
BECConfigError,
|
||||||
GalilAxesReferenced,
|
GalilAxesReferenced,
|
||||||
@ -24,6 +22,7 @@ from ophyd_devices.galil.galil_ophyd import (
|
|||||||
)
|
)
|
||||||
from ophyd_devices.utils.controller import Controller, threadlocked
|
from ophyd_devices.utils.controller import Controller, threadlocked
|
||||||
from ophyd_devices.utils.socket import SocketIO, SocketSignal, raise_if_disconnected
|
from ophyd_devices.utils.socket import SocketIO, SocketSignal, raise_if_disconnected
|
||||||
|
from prettytable import PrettyTable
|
||||||
|
|
||||||
logger = bec_logger.logger
|
logger = bec_logger.logger
|
||||||
|
|
||||||
@ -119,11 +118,7 @@ class FuprGalilAxesReferenced(GalilAxesReferenced):
|
|||||||
class FuprGalilMotor(Device, PositionerBase):
|
class FuprGalilMotor(Device, PositionerBase):
|
||||||
USER_ACCESS = ["controller"]
|
USER_ACCESS = ["controller"]
|
||||||
MOTOR_RESOLUTION = 25600
|
MOTOR_RESOLUTION = 25600
|
||||||
readback = Cpt(
|
readback = Cpt(FuprGalilReadbackSignal, signal_name="readback", kind="hinted")
|
||||||
GalilReadbackSignal,
|
|
||||||
signal_name="readback",
|
|
||||||
kind="hinted",
|
|
||||||
)
|
|
||||||
user_setpoint = Cpt(FuprGalilSetpointSignal, signal_name="setpoint")
|
user_setpoint = Cpt(FuprGalilSetpointSignal, signal_name="setpoint")
|
||||||
motor_resolution = Cpt(FuprGalilMotorResolution, signal_name="resolution", kind="config")
|
motor_resolution = Cpt(FuprGalilMotorResolution, signal_name="resolution", kind="config")
|
||||||
motor_is_moving = Cpt(FuprGalilMotorIsMoving, signal_name="motor_is_moving", kind="normal")
|
motor_is_moving = Cpt(FuprGalilMotorIsMoving, signal_name="motor_is_moving", kind="normal")
|
||||||
@ -169,7 +164,7 @@ class FuprGalilMotor(Device, PositionerBase):
|
|||||||
raise BECConfigError(
|
raise BECConfigError(
|
||||||
"device_mapping has been specified but the device_manager cannot be accessed."
|
"device_mapping has been specified but the device_manager cannot be accessed."
|
||||||
)
|
)
|
||||||
self.rt = self.device_mapping.get("rt")
|
self.rt = self.device_mapping.get("rt", "rtx")
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
prefix,
|
prefix,
|
||||||
@ -258,18 +253,10 @@ class FuprGalilMotor(Device, PositionerBase):
|
|||||||
while self.motor_is_moving.get():
|
while self.motor_is_moving.get():
|
||||||
logger.info("motor is moving")
|
logger.info("motor is moving")
|
||||||
val = self.readback.read()
|
val = self.readback.read()
|
||||||
self._run_subs(
|
self._run_subs(sub_type=self.SUB_READBACK, value=val, timestamp=time.time())
|
||||||
sub_type=self.SUB_READBACK,
|
|
||||||
value=val,
|
|
||||||
timestamp=time.time(),
|
|
||||||
)
|
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
val = self.readback.read()
|
val = self.readback.read()
|
||||||
success = np.isclose(
|
success = np.isclose(val[self.name]["value"], position, atol=self.tolerance)
|
||||||
val[self.name]["value"],
|
|
||||||
position,
|
|
||||||
atol=self.tolerance,
|
|
||||||
)
|
|
||||||
|
|
||||||
if not success:
|
if not success:
|
||||||
print(" stop")
|
print(" stop")
|
||||||
|
@ -122,7 +122,8 @@ class RtFlomniController(RtController):
|
|||||||
fsamx_in = fsamx.user_parameter.get("in")
|
fsamx_in = fsamx.user_parameter.get("in")
|
||||||
if not np.isclose(fsamx.obj.readback.get(), fsamx_in, atol=0.3):
|
if not np.isclose(fsamx.obj.readback.get(), fsamx_in, atol=0.3):
|
||||||
raise RtError(
|
raise RtError(
|
||||||
"Something is wrong. fsamx is very far from the samx_in position. Don't dare correct automatically."
|
"Something is wrong. fsamx is very far from the samx_in position. Don't dare"
|
||||||
|
" correct automatically."
|
||||||
)
|
)
|
||||||
|
|
||||||
if not np.isclose(fsamx.obj.readback.get(), fsamx_in, atol=0.01):
|
if not np.isclose(fsamx.obj.readback.get(), fsamx_in, atol=0.01):
|
||||||
@ -155,7 +156,8 @@ class RtFlomniController(RtController):
|
|||||||
self.rt_pid_voltage = rtx.user_parameter.get("rt_pid_voltage")
|
self.rt_pid_voltage = rtx.user_parameter.get("rt_pid_voltage")
|
||||||
if self.rt_pid_voltage is None:
|
if self.rt_pid_voltage is None:
|
||||||
raise RtError(
|
raise RtError(
|
||||||
"rt_pid_voltage not set in rtx user parameters. Please run feedback_enable_with_reset first."
|
"rt_pid_voltage not set in rtx user parameters. Please run"
|
||||||
|
" feedback_enable_with_reset first."
|
||||||
)
|
)
|
||||||
logger.info(f"Using PID voltage from rtx user parameter: {self.rt_pid_voltage}")
|
logger.info(f"Using PID voltage from rtx user parameter: {self.rt_pid_voltage}")
|
||||||
expected_voltage = self.rt_pid_voltage + fovx / 2 * 7 / 100
|
expected_voltage = self.rt_pid_voltage + fovx / 2 * 7 / 100
|
||||||
@ -171,7 +173,7 @@ class RtFlomniController(RtController):
|
|||||||
fsamx = self.get_device_manager().devices.fsamx
|
fsamx = self.get_device_manager().devices.fsamx
|
||||||
fsamx.enabled_set = True
|
fsamx.enabled_set = True
|
||||||
fsamx.obj.controller.socket_put_confirmed("axspeed[4]=0.1*stppermm[4]")
|
fsamx.obj.controller.socket_put_confirmed("axspeed[4]=0.1*stppermm[4]")
|
||||||
fsamx.obj.pid_x_correction -= (self.get_pid_x() - expected_voltage) * 0.01
|
fsamx.obj.pid_x_correction -= (self.get_pid_x() - expected_voltage) * 0.007
|
||||||
logger.info(f"Correcting fsamx by {fsamx.obj.pid_x_correction}")
|
logger.info(f"Correcting fsamx by {fsamx.obj.pid_x_correction}")
|
||||||
fsamx_in = fsamx.user_parameter.get("in")
|
fsamx_in = fsamx.user_parameter.get("in")
|
||||||
fsamx.obj.move(fsamx_in + cenx / 1000 + fsamx.obj.pid_x_correction, wait=True)
|
fsamx.obj.move(fsamx_in + cenx / 1000 + fsamx.obj.pid_x_correction, wait=True)
|
||||||
@ -234,7 +236,7 @@ class RtFlomniController(RtController):
|
|||||||
logger.info("Cyclic Error Compensation: y-axis is NOT initialized")
|
logger.info("Cyclic Error Compensation: y-axis is NOT initialized")
|
||||||
|
|
||||||
def set_rotation_angle(self, val: float) -> None:
|
def set_rotation_angle(self, val: float) -> None:
|
||||||
self.socket_put(f"a{(-val)/180*np.pi}")
|
self.socket_put(f"a{val/180*np.pi}")
|
||||||
|
|
||||||
def laser_tracker_on(self):
|
def laser_tracker_on(self):
|
||||||
self.laser_update_tracker_info()
|
self.laser_update_tracker_info()
|
||||||
@ -369,10 +371,12 @@ class RtFlomniController(RtController):
|
|||||||
def start_scan(self):
|
def start_scan(self):
|
||||||
if not self.feedback_is_running():
|
if not self.feedback_is_running():
|
||||||
logger.error(
|
logger.error(
|
||||||
"Cannot start scan because feedback loop is not running or there is an interferometer error."
|
"Cannot start scan because feedback loop is not running or there is an"
|
||||||
|
" interferometer error."
|
||||||
)
|
)
|
||||||
raise RtError(
|
raise RtError(
|
||||||
"Cannot start scan because feedback loop is not running or there is an interferometer error."
|
"Cannot start scan because feedback loop is not running or there is an"
|
||||||
|
" interferometer error."
|
||||||
)
|
)
|
||||||
# here exception
|
# here exception
|
||||||
(mode, number_of_positions_planned, current_position_in_scan) = self.get_scan_status()
|
(mode, number_of_positions_planned, current_position_in_scan) = self.get_scan_status()
|
||||||
@ -465,15 +469,16 @@ class RtFlomniController(RtController):
|
|||||||
)
|
)
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Flomni statistics: Average of all standard deviations: x {self.average_stdeviations_x_st_fzp/number_of_samples_to_read}, y {self.average_stdeviations_y_st_fzp/number_of_samples_to_read}."
|
"Flomni statistics: Average of all standard deviations: x"
|
||||||
|
f" {self.average_stdeviations_x_st_fzp/number_of_samples_to_read}, y"
|
||||||
|
f" {self.average_stdeviations_y_st_fzp/number_of_samples_to_read}."
|
||||||
)
|
)
|
||||||
|
|
||||||
def publish_device_data(self, signals, pointID):
|
def publish_device_data(self, signals, pointID):
|
||||||
self.get_device_manager().producer.send(
|
self.get_device_manager().producer.send(
|
||||||
MessageEndpoints.device_read("rt_flomni"),
|
MessageEndpoints.device_read("rt_flomni"),
|
||||||
messages.DeviceMessage(
|
messages.DeviceMessage(
|
||||||
signals=signals,
|
signals=signals, metadata={"pointID": pointID, **self.readout_metadata}
|
||||||
metadata={"pointID": pointID, **self.readout_metadata},
|
|
||||||
).dumps(),
|
).dumps(),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -527,7 +532,8 @@ class RtFlomniSetpointSignal(RtSetpointSignal):
|
|||||||
"""
|
"""
|
||||||
if not self.parent.controller.feedback_is_running():
|
if not self.parent.controller.feedback_is_running():
|
||||||
raise RtError(
|
raise RtError(
|
||||||
"The interferometer feedback is not running. Either it is turned off or and interferometer error occured."
|
"The interferometer feedback is not running. Either it is turned off or and"
|
||||||
|
" interferometer error occured."
|
||||||
)
|
)
|
||||||
self.set_with_feedback_disabled(val)
|
self.set_with_feedback_disabled(val)
|
||||||
|
|
||||||
@ -545,11 +551,7 @@ class RtFlomniFeedbackRunning(RtSignalRO):
|
|||||||
|
|
||||||
class RtFlomniMotor(Device, PositionerBase):
|
class RtFlomniMotor(Device, PositionerBase):
|
||||||
USER_ACCESS = ["controller"]
|
USER_ACCESS = ["controller"]
|
||||||
readback = Cpt(
|
readback = Cpt(RtFlomniReadbackSignal, signal_name="readback", kind="hinted")
|
||||||
RtFlomniReadbackSignal,
|
|
||||||
signal_name="readback",
|
|
||||||
kind="hinted",
|
|
||||||
)
|
|
||||||
user_setpoint = Cpt(RtFlomniSetpointSignal, signal_name="setpoint")
|
user_setpoint = Cpt(RtFlomniSetpointSignal, signal_name="setpoint")
|
||||||
|
|
||||||
high_limit_travel = Cpt(Signal, value=0, kind="omitted")
|
high_limit_travel = Cpt(Signal, value=0, kind="omitted")
|
||||||
@ -673,11 +675,7 @@ class RtFlomniMotor(Device, PositionerBase):
|
|||||||
while not self.controller.slew_rate_limiters_on_target():
|
while not self.controller.slew_rate_limiters_on_target():
|
||||||
print("motor is moving")
|
print("motor is moving")
|
||||||
val = self.readback.read()
|
val = self.readback.read()
|
||||||
self._run_subs(
|
self._run_subs(sub_type=self.SUB_READBACK, value=val, timestamp=time.time())
|
||||||
sub_type=self.SUB_READBACK,
|
|
||||||
value=val,
|
|
||||||
timestamp=time.time(),
|
|
||||||
)
|
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
print("Move finished")
|
print("Move finished")
|
||||||
self._done_moving()
|
self._done_moving()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user