pcdsdevices.twincat_motor.TwinCATAxis

class pcdsdevices.twincat_motor.TwinCATAxis(prefix='', *, name, kind=None, read_attrs=None, configuration_attrs=None, parent=None, **kwargs)

TwinCAT NC AXIS_REF motor device with error handling and homing.

This class extends the TwinCATMotorInterface with:
  • Additional components (PLC diagnostics, homing command and mode).

  • end-of-move and error handling: move completion status is checked against PLC error and status codes, so that motion failures are accurately detected and reported.

  • A clear_error method to reset PLC motion errors from Python or GUI.

  • A home() method exposing all PLC-configured homing routines with proper mode setting, actuation, status, and timing.

  • Robust session-tracking and logging logic for post-move diagnostics.

Note

Some methods in this class are identical or adapted from BeckhoffAxis, to ensure the error-handling, staging, homing, and value checking logic behaves identically.

actuate_homePytmcSignal

PV to trigger a homing command.

home_modePytmcSignal

PV to select the homing mode (see HomeEnum).

plcBeckhoffAxisPLC

Sub-device interface for further PLC status and diagnostics.

prefixstr

The EPICS PV prefix for this motor.

namestr

An identifying name for this motor.

settle_timefloat, optional

The amount of extra time to wait before interpreting a move as done.

timeoutfloat, optional

The amount of time to wait before automatically marking a long in-progress move as failed.

Ophyd Device Components

Attribute

Class

Suffix

Docs

Kind

Notes

setpoint

PytmcSignal

fPosition

hinted

Inherited from TwinCATMotorInterface

readback

PytmcSignal

fActPosition

hinted

Inherited from TwinCATMotorInterface

done

PytmcSignal

bDone

normal

Inherited from TwinCATMotorInterface

actuate

PytmcSignal

bMoveCmd

normal

Inherited from TwinCATMotorInterface

stop_signal

PytmcSignal

bHalt

normal

Inherited from TwinCATMotorInterface

reset_signal

PytmcSignal

bReset

normal

Inherited from TwinCATMotorInterface

velocity

PytmcSignal

fVelocity

config

Inherited from TwinCATMotorInterface

acceleration

PytmcSignal

fAcceleration

config

Inherited from TwinCATMotorInterface

deceleration

PytmcSignal

fDeceleration

config

Inherited from TwinCATMotorInterface

jerk

PytmcSignal

fJerk

config

Inherited from TwinCATMotorInterface

enable_mode

PytmcSignal

eEnableMode

config

Inherited from TwinCATMotorInterface

brake_mode

PytmcSignal

eBrakeMode

config

Inherited from TwinCATMotorInterface

motor_is_moving

PytmcSignal

bMoving

normal

Inherited from TwinCATMotorInterface

motor_is_moving_negative

PytmcSignal

bNegativeDirection

normal

Inherited from TwinCATMotorInterface

motor_is_moving_positive

PytmcSignal

bPositiveDirection

normal

Inherited from TwinCATMotorInterface

power_is_enabled

PytmcSignal

bPowerIsEnabled

normal

Inherited from TwinCATMotorInterface

high_limit_switch

PytmcSignal

bLimitFwd

normal

Inherited from TwinCATMotorInterface

low_limit_switch

PytmcSignal

bLimitBwd

normal

Inherited from TwinCATMotorInterface

negative_dir_enabled

PytmcSignal

bNegativeMotionIsEnabled

normal

Inherited from TwinCATMotorInterface

positive_dir_enabled

PytmcSignal

bPositiveMotionIsEnabled

normal

Inherited from TwinCATMotorInterface

command

PytmcSignal

eCommand

normal

Inherited from TwinCATMotorInterface

motor_egu

PytmcSignal

sEGU

normal

Inherited from TwinCATMotorInterface

low_limit_travel

EpicsSignal

NC:MinPos:Val_RBV

config

Inherited from TwinCATMotorInterface

high_limit_travel

EpicsSignal

NC:MaxPos:Val_RBV

config

Inherited from TwinCATMotorInterface

low_limit_enable

EpicsSignal

NC:SoftPosMinOn:Val_RBV

config

Inherited from TwinCATMotorInterface

high_limit_enable

EpicsSignal

NC:SoftPosMaxOn:Val_RBV

config

Inherited from TwinCATMotorInterface

homed

PytmcSignal

bHomed

normal

home_mode

PytmcSignal

eHomeMode

config

plc

BeckhoffAxisPLC

PLC error handling and aux functions.

normal

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 limit switches.

Logic structure reused from EpicsMotorInterface for API consistency. Returns a string summary.

clear_error()

Identical to BeckhoffAxis.clear_error. Clears any active motion/plc errors on this axis.

clear_limits()

Set both low and high limits to 0.

Duplicated from EpicsMotorInterface for function and API consistency.

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.

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.

home(wait: bool = True, **kwargs)

Adapted from BeckhoffAxis.home.

Executes the PLC-programmed home routine. For hardware where only one homing method may be active/configured.

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

Functionally adapted from BeckhoffAxis.move.

Sets up tailored end-of-move handler and error capture, as in BeckhoffAxis. Prepares a new MoveStatus for custom error interpretation.

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.

reset(*, success=False)
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.

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. Adapted from EpicsMotorInterface.

Parameters:

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

Raises:

ValueError – When in motion or position outside of limit.

set_low_limit(value)

Set the low limit. Adapted from EpicsMotorInterface.

Parameters:

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

Raises:

ValueError – When 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

actuate_value = 1
configuration_attrs
connected
connection_timeout
done_value = 1
egu

The engineering units (EGU) for this motor. Updated via the motor_egu PV.

enabled

returns: * bool – True if power is enabled and either negative or positive direction is enabled. * Explanation * ———– * - Returns True if

  • Power is on (power_is_enabled)

  • At least one direction (negative_dir_enabled OR positive_dir_enabled) is enabled

high_limit
hints
kind
limits

Override limits property to always return the latest values from the soft limit PVs (low_limit_travel and high_limit_travel).

This ensures no stale/cached values are reported.

low_limit
moving

Whether or not the motor is moving.

Duplicated logic from EpicsMotorInterface for API consistency.

Returns:

moving (bool)

position

The current position of the motor in its engineering units

Returns:

position (float)

put_complete
settle_time

Amount of time to wait after moves to report status completion

stop_value = 1
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