Servo

class ingenialink.servo.DictionaryFactory[source]

Dictionary factory.

Creates the appropriate dictionary instance according to the file version and connection interface.

classmethod create_dictionary(dictionary_path: str, interface: Interface) Dictionary[source]

Creates a dictionary instance.

Choosing the class depending on dictionary version and connection interface.

Parameters:
  • dictionary_path – target dictionary path

  • interface – connection interface

Returns:

Dictionary instance

Raises:

NotImplementedError – Dictionary version is not supported.

classmethod get_dictionary_description(dictionary_path: str, interface: Interface) DictionaryDescriptor[source]

Quick function to get target dictionary description.

Parameters:
  • dictionary_path – target dictionary path

  • interface – device interface

Returns:

Target dictionary description

Raises:

NotImplementedError – Dictionary version is not supported.

class ingenialink.servo.RegisterAccessOperation(value)[source]

Register operation.

class ingenialink.servo.Servo(target: int | str, dictionary_path: str, servo_status_listener: bool = False, disconnect_callback: Callable[[Servo], None] | None = None)[source]

Declaration of a general Servo object.

Parameters:
  • target – Target ID of the servo.

  • dictionary_path – Path to the dictionary file.

  • servo_status_listener – Toggle the listener of the servo for its status, errors, faults, etc.

Raises:

ILDictionaryParseError – If dictionary can not be parsed.

check_configuration(config_file: str, subnode: int | None = None) None[source]

Check if the drive is configured in the same way as the given configuration file.

Compares the value of each register in the given file with the corresponding value in the drive.

Parameters:
  • config_file – the configuration to check

  • subnode – Subnode of the axis. Defaults to None.

Raises:
  • ValueError – If a configuration file from a subnode different from 0 is attempted to be loaded to subnode 0.

  • ValueError – If an invalid subnode is provided.

  • ILConfigurationError – If the configuration file differs from the drive state.

disable(subnode: int = 1, timeout: int = 1000) None[source]

Disable PDS.

Parameters:
  • subnode – Subnode of the drive.

  • timeout – Timeout in milliseconds.

disturbance_disable() None[source]

Disable disturbance process.

disturbance_enable() None[source]

Enable disturbance process.

disturbance_get_num_mapped_registers() int[source]

Obtain the number of disturbance mapped registers.

Returns:

Actual number of mapped registers.

disturbance_remove_all_mapped_registers() None[source]

Remove all disturbance mapped registers.

disturbance_remove_data() None[source]

Remove disturbance data.

disturbance_set_mapped_register(channel: int, uid: str, size: int, axis: int | None = None) None[source]

Set monitoring mapped register.

Parameters:
  • channel – Identity channel number.

  • uid – Register uid.

  • size – Size of data in bytes.

  • axis – axis. Should be specified if multiaxis, None otherwise.

Raises:

RuntimeError – if the register is not monitoreable.

disturbance_write_data(channels: int | list[int], dtypes: RegDtype | list[RegDtype], data_arr: list[int | float] | list[list[int | float]]) None[source]

Write disturbance data.

Parameters:
  • channels – Channel identifier.

  • dtypes – Data type.

  • data_arr – Data array.

Raises:

ILValueError – if the disturbance data cannot be written.

emcy_subscribe(callback: Callable[[EmergencyMessage], None]) None[source]

Subscribe to emergency messages.

Parameters:

callback – Callable that takes an EmergencyMessage instance as argument.

emcy_unsubscribe(callback: Callable[[EmergencyMessage], None]) None[source]

Unsubscribe from emergency messages.

Parameters:

callback – Subscribed callback.

enable(subnode: int = 1, timeout: int = 1000) None[source]

Enable PDS.

Parameters:
  • subnode – Subnode of the drive.

  • timeout – Timeout in milliseconds.

Raises:

ILStateError – If a subnode cannot be enabled within the timeout.

fault_reset(subnode: int = 1, timeout: int = 1000) None[source]

Executes a fault reset on the drive.

Parameters:
  • subnode – Subnode of the drive.

  • timeout – Timeout in milliseconds.

get_state(subnode: int = 1) ServoState[source]

Get the current drive state.

Returns:

current drive state.

is_alive() bool[source]

Checks if the servo responds to a reading a register.

Returns:

Return code with the result of the read.

is_listener_started() bool[source]

Check if servo listener is started.

Returns:

True if listener is started, else False

load_configuration(config_file: str, subnode: int | None = None, strict: bool = False) None[source]

Write current dictionary storage to the servo drive.

Parameters:
  • config_file – Path to the dictionary.

  • subnode – Subnode of the axis.

  • strict – Whether to raise an exception if any error occurs during the loading

  • false (configuration process. If)

  • ignored. (all errors will only be)

  • default. (False by)

Raises:
  • ValueError – If a configuration file from a subnode different from 0 is attempted to be loaded to subnode 0.

  • ValueError – If an invalid subnode is provided.

  • ILError – If strict is set to True and any error occurs during the loading

  • configuration process.

monitoring_actual_number_bytes() int[source]

Get the number of monitoring bytes left to be read.

Returns:

number of monitoring bytes left to be read.

monitoring_channel_data(channel: int) list[float][source]

Obtain processed monitoring data of a channel.

Parameters:

channel – Identity channel number.

Returns:

Monitoring data.

monitoring_disable() None[source]

Disable monitoring process.

monitoring_enable() None[source]

Enable monitoring process.

monitoring_get_bytes_per_block() int[source]

Obtain Bytes x Block configured.

Returns:

Actual number of Bytes x Block configured.

monitoring_get_num_mapped_registers() int[source]

Obtain the number of monitoring mapped registers.

Returns:

Actual number of mapped registers.

monitoring_read_data() None[source]

Obtain processed monitoring data.

monitoring_remove_all_mapped_registers() None[source]

Remove all monitoring mapped registers.

monitoring_remove_data() None[source]

Remove monitoring data.

monitoring_set_mapped_register(channel: int, uid: str, size: int, axis: int | None = None) None[source]

Set monitoring mapped register.

Parameters:
  • channel – Identity channel number.

  • uid – Register uid.

  • size – Size of data in bytes.

  • axis – axis. Should be specified if multiaxis, None otherwise.

Raises:

RuntimeError – if the register is not monitoreable.

read(reg: str | Register, subnode: int = 1) int | float | str | bytes[source]

Read a register value from servo.

Parameters:
  • reg – Register.

  • subnode – Target axis of the drive.

Returns:

int, float or Value stored in the register.

Raises:

ILAccessError – Wrong access to the register.

read_bitfields(reg: str | Register, subnode: int = 1, bitfields: dict[str, BitField] | None = None) dict[str, int][source]

Read bitfields of a register.

Parameters:
  • reg – Register.

  • subnode – Target subnode of the drive.

  • bitfields – Optional bitfield specification. If not it will be used from the register definition (if Any).

Raises:
  • ValueError – if the register does not have bitfields.

  • TypeError – if the register is not of integer type.

Returns:

Dictionary with values of the bitfields. Key is the name of the bitfield. Value is the value parsed.

read_complete_access(reg: str | CanopenRegister | EthercatRegister | CanOpenObject, subnode: int = 1, buffer_size: int | None = None) bytes[source]

Read a complete access register.

Parameters:
  • reg – Register to be read.

  • subnode – Target subnode of the drive.

  • buffer_size – Size of the buffer to read.

Raises:
  • ValueError – if buffer size is not specified or cannot be detected

  • TypeError – if the register is not a CanopenRegister or EthercatRegister.

Returns:

Data read from the register.

register_update_complete_access_subscribe(callback: Callable[[Servo, CanopenRegister | EthercatRegister, int | float | str | bytes, RegisterAccessOperation], None]) None[source]

Subscribe to complete access register updates.

The callback will be called when a complete access read/write operation occurs.

Parameters:

callback – Callable that takes a Servo and a Register instance as arguments.

register_update_complete_access_unsubscribe(callback: Callable[[Servo, CanopenRegister | EthercatRegister, int | float | str | bytes, RegisterAccessOperation], None]) None[source]

Unsubscribe to complete access register updates.

Parameters:

callback – Subscribed callback.

register_update_subscribe(callback: Callable[[Servo, Register, int | float | str | bytes], None]) None[source]

Subscribe to register updates.

The callback will be called when a read/write operation occurs.

Parameters:

callback – Callable that takes a Servo and a Register instance as arguments.

register_update_unsubscribe(callback: Callable[[Servo, Register, int | float | str | bytes], None]) None[source]

Unsubscribe to register updates.

Parameters:

callback – Subscribed callback.

reload_errors(dictionary: str) None[source]

Force to reload all dictionary errors.

Parameters:

dictionary – The dictionary path.

replace_dictionary(dictionary: str) None[source]

Deletes and creates a new instance of the dictionary.

Parameters:

dictionary – Path to the dictionary.

restore_parameters(subnode: int | None = None) None[source]

Restore all the current parameters of all the slave to default.

Note

The drive needs a power cycle after this in order for the changes to be properly applied.

Parameters:

subnode – Subnode of the axis. None by default which restores all the parameters.

Raises:

ILError – Invalid subnode.

save_configuration(config_file: str, subnode: int | None = None) None[source]

Save a drive configuration.

Read all dictionary registers content and put it to the dictionary storage.

Parameters:
  • config_file – Destination path for the configuration file.

  • subnode – Subnode of the axis.

Raises:

ILError – if the subnode is invalid.

save_configuration_csv(config_file: str, subnode: int | None = None) None[source]

Save a drive configuration in CSV format.

Parameters:
  • config_file – Destination path for the configuration file.

  • subnode – Subnode of the axis.

Raises:
  • NotImplementedError – CSV configuration files are only supported for EtherCAT drives.

  • ILError – if the subnode is invalid.

start_status_listener() None[source]

Start listening for servo status events (ServoState).

state_wait_change(state: ServoState, timeout: int, subnode: int = 1) ServoState[source]

Waits for a state change.

Parameters:
  • state – Servo state before calling this function.

  • timeout – Maximum value to wait for the change.

  • subnode – Subnode of the drive.

Returns:

The last read state.

Raises:

ILTimeoutError – If state does not change in the given time.

status_word_decode(status_word: dict[str, int]) ServoState[source]

Decodes the status word to a known value.

Parameters:

status_word – Read value for the status word.

Returns:

Status word value.

status_word_wait_change(status_word: int, timeout: int, subnode: int = 1) None[source]

Waits for a status word change.

Parameters:
  • status_word – Status word to wait for.

  • timeout – Maximum value to wait for the change.

  • subnode – Subnode of the drive.

Raises:

ILTimeoutError – If status word does not change in the given time.

stop_status_listener() None[source]

Stop listening for servo status events (ServoState).

store_parameters(subnode: int | None = None) None[source]

Store all the current parameters of the target subnode.

Parameters:
  • subnode – Subnode of the axis. None by default which stores

  • parameters. (all the)

Raises:

ILError – Invalid subnode.

subscribe_to_status(callback: Callable[[ServoState, int], Any]) None[source]

Subscribe to state changes.

Parameters:

callback – Callback function.

unsubscribe_from_status(callback: Callable[[ServoState, int], Any]) None[source]

Unsubscribe from state changes.

Parameters:

callback – Callback function.

write(reg: str | Register, data: int | float | str | bytes, subnode: int = 1) None[source]

Writes a data to a target register.

Parameters:
  • reg – Target register to be written.

  • data – Data to be written.

  • subnode – Target axis of the drive.

Raises:

ILAccessError – Wrong access to the register.

write_bitfields(reg: str | Register, values: dict[str, int], subnode: int = 1, bitfields: dict[str, BitField] | None = None) None[source]

Write bitfields of a register.

Only the values specified will be updated. The register will be read first to prevent overwriting other bits.

Parameters:
  • reg – Register

  • values – Dictionary with values of the bitfields. Key is the name of the bitfield. Value is the value to set.

  • subnode – Target subnode of the drive.

  • bitfields – Optional bitfield specification. If not it will be used from the register definition (if Any)

Raises:
  • ValueError – if the register does not have bitfields.

  • TypeError – if the register is not of integer type.

write_complete_access(reg: str | CanopenRegister | EthercatRegister | CanOpenObject, data: bytes, subnode: int = 1) None[source]

Write a complete access register.

Parameters:
  • reg – Register to be written.

  • data – Data to be written.

  • subnode – Target subnode of the drive.

Raises:

TypeError – if the register is not a CanopenRegister or EthercatRegister.

property dictionary: Dictionary

Returns dictionary object.

property disturbance_data: bytes

Obtain disturbance data.

Returns:

Current disturbance data.

property disturbance_data_size: int

Obtain disturbance data size.

Returns:

Current disturbance data size.

property disturbance_number_mapped_registers: int

Get the number of mapped disturbance registers.

property errors: dict[int, DictionaryError]

Errors.

property full_name: str

Obtains the servo full name.

property info: dict[str, None | str | int]

Servo information.

property monitoring_data_size: int

Obtain monitoring data size.

Returns:

Current monitoring data size in bytes.

property monitoring_number_mapped_registers: int

Get the number of mapped monitoring registers.

property status: dict[int, ServoState]

Servo status.

property subnodes: dict[int, SubnodeType]

Dictionary of subnode ids and their type.

units_acc

Acceleration units.

Type:

ServoUnitsAcc

units_pos

Position units.

Type:

ServoUnitsPos

units_torque

Torque units.

Type:

ServoUnitsTorque

units_vel

Velocity units.

Type:

ServoUnitsVel

class ingenialink.servo.ServoStatusListener(servo: Servo)[source]

Reads the status word to check if the drive is alive.

Parameters:

servo – Servo instance of the drive.

run() None[source]

Checks if the drive is alive by reading the status word register.

stop() None[source]

Stops the loop that reads the status word register.