pcdsdevices.epics_motor.SmarActEtherCAT

class pcdsdevices.epics_motor.SmarActEtherCAT(*args, **kwargs)

SmarAct MCS2 stage driven through a Beckhoff EtherCAT DS402 PLC.

This combines the SmarAct-specific configuration and diagnostics with the BeckhoffAxis motor record, PLC error handling, and homing. The DS402 interface exposes fewer objects than the serial MCS2 IOC, so unsupported components (module temperature, default range, and the need-calibration readback) are removed, and the remaining components are re-pointed to their pytmc record names.

Ophyd Device Components

Attribute

Class

Suffix

Docs

Kind

Notes

user_readback (UpdateComponent)

EpicsSignalROEditMD

.RBV

Component attribute
Component(EpicsSignalRO, '.RBV', auto_monitor=True, kind='hinted')

hinted

Inherited from SmarAct

user_setpoint (UpdateComponent)

EpicsSignalEditMD

.VAL

Component attribute
Component(EpicsSignal, '.VAL', limits=True, auto_monitor=True, kind='normal')

normal

Inherited from SmarAct

user_offset

EpicsSignal

.OFF

config

Inherited from SmarAct

user_offset_dir

EpicsSignal

.DIR

config

Inherited from SmarAct

offset_freeze_switch

EpicsSignal

.FOFF

omitted

Inherited from SmarAct

set_use_switch

EpicsSignal

.SET

omitted

Inherited from SmarAct

velocity

EpicsSignal

.VELO

config

Inherited from SmarAct

acceleration

EpicsSignal

.ACCL

config

Inherited from SmarAct

motor_egu

EpicsSignal

.EGU

config

Inherited from SmarAct

motor_is_moving

EpicsSignalRO

.MOVN

normal

Inherited from SmarAct

motor_done_move

EpicsSignalRO

.DMOV

omitted

Inherited from SmarAct

high_limit_switch

EpicsSignalRO

.HLS

normal

Inherited from SmarAct

low_limit_switch

EpicsSignalRO

.LLS

normal

Inherited from SmarAct

high_limit_travel (UpdateComponent)

EpicsSignal

.HLM

Component attribute
Component(EpicsSignal, '.HLM', auto_monitor=True, kind='omitted')

config

Inherited from SmarAct

low_limit_travel (UpdateComponent)

EpicsSignal

.LLM

Component attribute
Component(EpicsSignal, '.LLM', auto_monitor=True, kind='omitted')

config

Inherited from SmarAct

direction_of_travel

EpicsSignal

.TDIR

normal

Inherited from SmarAct

motor_stop

EpicsSignal

.STOP

normal

Inherited from SmarAct

disabled

EpicsSignal

.DISP

omitted

Inherited from SmarAct

description

EpicsSignal

.DESC

normal

Inherited from SmarAct

dial_position

EpicsSignalRO

.DRBV

normal

Inherited from SmarAct

velocity_base

EpicsSignal

.VBAS

omitted

Inherited from SmarAct

velocity_max

EpicsSignal

.VMAX

config

Inherited from SmarAct

msta_raw

EpicsSignalRO

.MSTA

omitted

Inherited from SmarAct

plc (FCpt)

BeckhoffAxisPLC

{prefix}{_plc_suffix}

PLC error handling and aux functions.

normal

Inherited from BeckhoffAxis

motor_spmg

EpicsSignal

.SPMG

Stop, Pause, Move, Go

config

Inherited from BeckhoffAxis

pos_type

EpicsSignal

:PTYPE_RBV

config

Inherited from SmarAct

do_calib

PytmcSignal

:DO_CALIB

Calibrate command

config

Inherited from SmarAct

log_scale_offset

PytmcSignal

:LSCO

Logical Scale Offset

omitted

Inherited from SmarAct

log_scale_inv

PytmcSignal

:LSCI

Logical Scale Inversion

omitted

Inherited from SmarAct

dist_code_inv

PytmcSignal

:DCIN

Distance code inverted (0x2029)

config

Inherited from SmarAct

channel_temp

PytmcSignal

:CHANTEMP

Channel temperature (0x2026)

normal

Inherited from SmarAct

channel_state_raw

PytmcSignal

:chanState:STATE

Channel state bitmask represented as raw int

omitted

Inherited from SmarAct

open_loop

SmarActEtherCATOpenLoop

omitted

Inherited from SmarAct

movement_type

PytmcSignal

:MOVE_TYPE

Movement type (0x2003)

config

base_unit

PytmcSignal

:BASE_UNIT

Base unit (0x2005)

config

base_resolution

PytmcSignal

:BASE_RES

Base resolution (0x2006)

config

pos_control_opt

PytmcSignal

:POS_CTRL_OPT

Positioner control options (0x2027)

config

actuator_mode

PytmcSignal

:ACT_MODE

Actuator mode (0x2028)

config

motor_load_protection

PytmcSignal

:MOTOR_LOAD_PROT

Motor load protection threshold (0x202B)

config

diag_closed_loop_freq_max

PytmcSignal

:DIAG_CLF_MAX

Diagnostic closed-loop frequency, max (0x202A:1)

normal

diag_closed_loop_freq_avg

PytmcSignal

:DIAG_CLF_AVG

Diagnostic closed-loop frequency, avg (0x202A:2)

normal

channel_state

SmarActChannelState

:chanState

Decoded channel state flags

normal

step_egu

PytmcSignal

:STEP_EGU

Step scale factor

config

hold_time

PytmcSignal

:HOLD_TIME

Closed-loop hold time

config

max_close_loop_freq

PytmcSignal

:MAX_CLF

Maximum closed-loop frequency

config

calibration_opt

PytmcSignal

:CAL_OPT

Calibration options

config

sensor_mode

PytmcSignal

:SENSOR_MODE

Sensor power mode

config

referencing_opt

PytmcSignal

:REF_OPT

Referencing options

config

reference_type

PytmcSignal

:REF_TYPE

Reference type

config

safe_direction

PytmcSignal

:SAFE_DIR

Safe direction (0x200C). For positioners referenced by a mechanical end stop, homing and calibration ignore the requested start direction and use this plus the logical scale inversion. FORWARD=0, BACKWARD=1. This is an R(W)* object, writable only in the Pre-Op ESM state, so the PLC applies a new setpoint only while the drive is in Pre-Op. Stored in NVRAM; re-calibrate after changing.

config

motor_load

PytmcSignal

:MOTOR_LOAD

Motor load

normal

channel_type

PytmcSignal

:CHAN_TYPE

Channel type

config

op_mode_req

PytmcSignal

:OPMODE_REQ

DS402 operation mode request

config

home_mode

PytmcSignal

:HOME_MODE

Vendor homing mode

config

Methods

camonitor()

Shows a live-updating motor position in the terminal.

This will be the value that is returned by the position attribute.

This method ends cleanly at a ctrl+c or after a call to end_monitor_thread(), which may be useful when this is called in a background thread.

check_limit_switches()

Check the limits switches.

Returns:

limit_switch_indicator (str) – Indicate which limit switch is activated.

clear_error()

Clear any active motion errors on this axis.

clear_limits()

Set both low and high limits to 0.

configure(d: Dict[str, Any]) → Tuple[Dict[str, Any], Dict[str, Any]]

Configure the device for something during a run

This default implementation allows the user to change any of the configuration_attrs. Subclasses might override this to perform additional input validation, cleanup, etc.

Parameters:

d (dict) – The configuration dictionary. To specify the order that the changes should be made, use an OrderedDict.

Returns:

  • (old, new) tuple of dictionaries

  • Where old and new are pre- and post-configure configuration states.

describe() → OrderedDictType[str, Dict[str, Any]]

Provide schema and meta-data for read().

This keys in the OrderedDict this method returns must match the keys in the OrderedDict return by read().

This provides schema related information, (ex shape, dtype), the source (ex PV name), and if available, units, limits, precision etc.

Returns:

data_keys (OrderedDict) – The keys must be strings and the values must be dict-like with the event_model.event_descriptor.data_key schema.

disable()

Disables the motor.

When disabled, all EPICS puts to the base record will be dropped.

enable()

Enables the motor.

When disabled, all EPICS puts to the base record will be dropped.

end_monitor_thread()

Stop a camonitor() or wm_update() that is running in another thread.

get(**kwargs)

Get the value of all components in the device

Keyword arguments are passed onto each signal.get(). Components beginning with an underscore will not be included.

get_high_limit()

Get high limit.

get_lim(flag)

Returns the travel limit of motor

  • flag > 0: returns high limit

  • flag < 0: returns low limit

  • flag == 0: returns None

Included here for compatibility with similar with SPEC command.

Parameters:
  • high (float) – Limit of travel in the positive direction.

  • low (float) – Limit of travel in the negative direction.

get_low_limit()

Get the low limit.

home(direction=None, wait=True, **kwargs)

Perform the configured homing function.

This is set on the controller. Unlike other kinds of axes, only the single pre-programmed homing routine can be used, so the direction argument has no effect.

move(position: float, wait: bool = True, **kwargs) → MoveStatus

Move to a specified position, optionally waiting for motion to complete.

Parameters:
  • position – Position to move to

  • moved_cb (callable) – Call this callback when movement has finished. This callback must accept one keyword argument: ‘obj’ which will be set to this positioner instance.

  • timeout (float, optional) – Maximum time to wait for the motion. If None, the default timeout for this positioner is used.

Returns:

status (MoveStatus)

Raises:
mv(position, timeout=None, wait=False, log=True)

Absolute move to a position.

Parameters:
  • position – Desired end position.

  • timeout (float, optional) – If provided, the mover will throw an error if motion takes longer than timeout to complete. If omitted, the mover’s default timeout will be use.

  • wait (bool, optional) – If True, wait for motion completion before returning. Defaults to False.

  • log (bool, optional) – If True, logs the move at INFO level.

mv_ginput(timeout=None)

Moves to a location the user clicks on.

If there are existing plots, this will be the position on the most recently active plot. If there are no existing plots, an empty plot will be created with the motor’s limits as the range.

mvr(delta, timeout=None, wait=False, log=True)

Relative move from this position.

Parameters:
  • delta (float) – Desired change in position.

  • timeout (float, optional) – If provided, the mover will throw an error if motion takes longer than timeout to complete. If omitted, the mover’s default timeout will be use.

  • wait (bool, optional) – If True, wait for motion completion before returning. Defaults to False.

  • log (bool, optional) – If True, logs the move at INFO level.

post_elog_status()

Post device status to the primary elog, if possible.

read() → OrderedDictType[str, Dict[str, Any]]

Read data from the device.

This method is expected to be as instantaneous as possible, with any substantial acquisition time taken care of in trigger().

The OrderedDict returned by this method must have identical keys (in the same order) as the OrderedDict returned by describe().

By convention, the first key in the return is the ‘primary’ key and maybe used by heuristics in bluesky.

The values in the ordered dictionary must be dict (-likes) with the keys {'value', 'timestamp'}. The 'value' may have any type, the timestamp must be a float UNIX epoch timestamp in UTC.

Returns:

data (OrderedDict) – The keys must be strings and the values must be dict-like with the keys {'value', 'timestamp'}

read_configuration() → OrderedDictType[str, Dict[str, Any]]

Dictionary mapping names to value dicts with keys: value, timestamp

To control which fields are included, change the Component kinds on the device, or modify the configuration_attrs list.

screen()

Open a screen for controlling the device.

Default behavior is the typhos screen, but this method can be overridden for more specialized screens.

set(new_position: Any, *, timeout: float = None, moved_cb: Callable = None, wait: bool = False) → StatusBase

Set a value and return a Status object

Parameters:
  • new_position (object) – The input here is whatever the device requires (this should be over-ridden by the implementation. For example a motor would take a float, a shutter the strings {‘Open’, ‘Close’}, and a goineometer (h, k, l) tuples

  • timeout (float, optional) – Maximum time to wait for the motion. If None, the default timeout for this positioner is used.

  • moved_cb (callable, optional) –

    Deprecated

    Call this callback when movement has finished. This callback must accept one keyword argument: ‘obj’ which will be set to this positioner instance.

  • wait (bool, optional) –

    Deprecated

    If the method should block until the Status object reports it is done.

    Defaults to False

Returns:

status (StatusBase) – Status object to indicate when the motion / set is done.

set_current_position(pos)

Configure the motor user position to the given value

Override ophyd’s method temporarily for error handling.

Parameters:

pos (number) – Position to set.

classmethod set_defaults(*, connection_timeout=10.0)

Set class-wide defaults for device communications

This may be called only before any instances of Device are made.

This setting applies to the class it is called on and all its subclasses. For example,

>>> Device.set_defaults(...)

will apply to any Device subclass.

Parameters:

connection_timeout (float, optional) – Time (seconds) allocated for establishing a connection with the IOC.

Raises:

RuntimeError – If called after EpicsSignalBase has been instantiated for the first time.

set_high_limit(value)

Limit of travel in the positive direction.

Parameters:

value (float) – High limit value to be set.

Raises:

ValueError – When motor in motion or position outside of limit.

set_lim(low, high)

Sets the low and high travel limits of motor

  • No action taken if motor is moving.

  • Low limit is set to lesser of (low, high)

  • High limit is set to greater of (low, high)

Included here for compatibility with similar with SPEC command.

Parameters:
  • high (float) – Limit of travel in the positive direction.

  • low (float) – Limit of travel in the negative direction.

set_low_limit(value)

Set the low limit.

Parameters:

value (float) – Limit of travel in the negative direction.

Raises:

ValueError – When motor in motion or position outside of limit.

set_position(position)

Alias for set_current_position.

Will fail if the motor does not have set_current_position.

status() → str

Returns a str with the current pv values for the device.

stop(*, success=False)

Stop the Device and all (instantiated) subdevices

summary()
trigger() → StatusBase

Trigger the device and return status object.

This method is responsible for implementing ‘trigger’ or ‘acquire’ functionality of this device.

If there is an appreciable time between triggering the device and it being able to be read (via the read() method) then this method is also responsible for arranging that the StatusBase object returned by this method is notified when the device is ready to be read.

If there is no delay between triggering and being readable, then this method must return a StatusBase object which is already completed.

Returns:

status (StatusBase) – StatusBase object which will be marked as complete when the device is ready to be read.

tweak(scale=0.1)

Control this motor using the arrow keys.

Use left arrow to step negative and right arrow to step positive. Use up arrow to increase step size and down arrow to decrease step size. Press q or ctrl+c to quit.

Parameters:

scale (float) – starting step size, default = 0.1

umv(position, timeout=None, log=True, newline=True)

Move to a position, wait, and update with a progress bar.

Parameters:
  • position (float) – Desired end position.

  • timeout (float, optional) – If provided, the mover will throw an error if motion takes longer than timeout to complete. If omitted, the mover’s default timeout will be use.

  • log (bool, optional) – If True, logs the move at INFO level.

  • newline (bool, optional) – If True, inserts a newline after the updates.

umvr(delta, timeout=None, log=True, newline=True)

Relative move from this position, wait, and update with a progress bar.

Parameters:
  • delta (float) – Desired change in position.

  • timeout (float, optional) – If provided, the mover will throw an error if motion takes longer than timeout to complete. If omitted, the mover’s default timeout will be use.

  • log (bool, optional) – If True, logs the move at INFO level.

  • newline (bool, optional) – If True, inserts a newline after the updates.

wait(timeout=None)
wm()

Get the mover’s current positon (where motor).

wm_update()

Shows a live-updating motor position in the terminal.

This will be the value that is returned by the position attribute.

This method ends cleanly at a ctrl+c or after a call to end_monitor_thread(), which may be useful when this is called in a background thread.

Attributes

configuration_attrs
connected
connection_timeout
def_range_max = None
def_range_min = None
egu

Engineering units str if available, otherwise ‘’

Use the monitored/cached value rather than checking EPICS.

high_limit
hints
home_forward = None
home_reverse = None
homed

Get the home status of the motor as reported by the MSTA field.

kind
limits

Override the limits attribute

low_limit
module_temp = None
moving

Whether or not the motor is moving

Returns:

moving (bool)

msta

Returns the msta fields as a dictionary.

needs_calib = None
position

The current position of the motor in its engineering units

Returns:

position (float)

precision

The precision of the readback PV, as reported by EPICS

settle_time

Amount of time to wait after moves to report status completion

subscriptions: ClassVar[FrozenSet[str]] = frozenset({'_req_done', 'acq_done', 'done_moving', 'readback', 'start_moving'})
timeout

Amount of time to wait before to considering a motion as failed

tolerated_alarm = 0