Python SDK for Henschel Robotics HDrive17-ETH servo drives
Project description
HDriveETH Python SDK
Control Henschel Robotics HDrive17-ETH servo drives from Python. No PLC required.
Features
- Simple API —
motor.move_to(90)and you're done - Zero dependencies — uses only the Python standard library
- Real-time telemetry — live position, velocity, and torque via UDP
- Thread-safe — send commands from any thread
- Context manager — automatic connect/disconnect with
withstatement - Object read/write — read and write drive configuration objects over TCP
- Firmware version check — refuses to connect to outdated firmware (< v266)
Installation
pip install hdrive-eth
Or install from source:
git clone https://github.com/henschel-robotics/python-hdrive17-eth.git
cd python-hdrive17-eth
pip install .
For development (editable install):
pip install -e .
Quickstart
from hdrive_eth import HDriveETH
import time
with HDriveETH("192.168.122.102") as motor:
# Move to 90 degrees
motor.move_to(90)
# Read telemetry
time.sleep(1)
frame = motor.telemetry
if frame:
print(f"Position: {frame.position}, Velocity: {frame.velocity}")
# Motor is automatically stopped and disconnected when leaving the 'with' block
API Reference
Connect
from hdrive_eth import HDriveETH
# Recommended: use a context manager (auto-connect and auto-disconnect)
with HDriveETH("192.168.122.102") as motor:
motor.move_to(90)
# The motor is stopped (mode=0) and the connection is closed automatically.
On connection the driver will:
- Open a TCP socket to the drive
- Read the firmware version (
m3s0) and refuse to connect if < 266 - Discover the UDP telemetry port (
m4s17) - Configure telemetry: check UDP enabled (
m4s19), autosend (m4s34), set binary TX ticket (m4s22=3,TX_BinaryTicket; value2is the smaller debug binary ticket, not this layout) - Start the UDP telemetry receiver
Position Control
# Move to absolute position in degrees
motor.move_to(position=90)
# With custom speed, torque, acceleration, deceleration
motor.move_to(position=90, speed=500, torque=500, acc=3000, decc=3000)
Velocity Control
# Constant speed
motor.set_speed(speed=500)
# With torque limit
motor.set_speed(speed=500, torque=300)
Torque Control
# Direct torque setpoint in milli-newton-metres (mNm; firmware demandedTorque)
motor.set_torque(torque=200)
Stop
# Stop the motor (sets mode to 0)
motor.stop()
Read / Write Objects
# Read a drive object (e.g. firmware version m3s0)
version = motor.read_object(index=3, subindex=0)
print(f"Firmware version: {version}")
# Write a drive object (e.g. select BinaryTicket telemetry — m4s22 = 3)
motor.write_object(index=4, subindex=22, value=3)
Telemetry
# Read the latest telemetry frame
frame = motor.telemetry
if frame:
print(f"Position: {frame.position}")
print(f"Velocity: {frame.velocity}")
print(f"Time: {frame.time_us} µs")
print(f"Temperature: {frame.temperature}")
print(f"Motor mode: {frame.motor_mode}")
# Register a callback for every frame
def on_frame(frame):
print(f"pos={frame.position} vel={frame.velocity}")
motor.on_telemetry(on_frame)
Alternate TX layouts match TicketManager::TX_Ticket (see hdrive_eth.TXTicket): Binary CAN (29×int32), Binary CAN full (49×int32, positions/speeds/torques/modes/states per axis), debug (15×int32). Example:
from hdrive_eth import HDriveETH, TXTicket, BinaryCanFullTelemetryFrame
motor = HDriveETH(
"192.168.122.102",
telemetry_ticket=TXTicket.BINARY_CAN_FULL,
telemetry_format="binary_can_full", # optional: reject other UDP sizes
)
t = motor.telemetry
if isinstance(t, BinaryCanFullTelemetryFrame):
print(t.master_torque, t.slave_torques)
With telemetry_format="auto" (default), the parser selects the layout from the UDP payload length.
Raw Command
from hdrive_eth import HDriveETH, Mode
# Full control over all parameters
motor.send_raw(
position=90,
speed=500,
torque=200,
mode=Mode.POSITION_CONTROL,
acc=5000,
decc=5000,
)
Control Modes
| Constant | Value | Description |
|---|---|---|
Mode.TORQUE_CONTROL |
0x80 (128) | Profile torque / current (AXIS_STATE_MOTORMODE_CURRENT) |
Mode.POSITION_CONTROL |
0x81 (129) | Profile position (AXIS_STATE_MOTORMODE_POSITION) |
Mode.VELOCITY_CONTROL |
0x82 (130) | Profile speed (AXIS_STATE_MOTORMODE_SPEED) |
Mode.DISABLE |
0x00 | Stop (AXIS_STATE_MOTORMODE_STOP) |
Telemetry Frame Fields
With TXTicket.BINARY (default), each UDP packet has 33 int32 values (~1 kHz):
| Index | Field | Description |
|---|---|---|
| 0 | time_us |
System time in microseconds |
| 1 | position |
Actual position (degrees) |
| 2 | velocity |
Actual velocity |
| 9 | temperature |
Motor temperature |
| 10 | motor_mode |
Current motor mode |
| 11 | motor_voltage |
Supply voltage |
| 12 | demanded_speed |
Demanded speed |
| 13 | demanded_position |
Demanded position |
| 19 | software_version |
Firmware version |
| 23–30 | slave_positions |
CAN slave positions (list of 8) |
See hdrive_eth/telemetry.py for the full list of all 33 fields.
Network Configuration
| Parameter | Default | Description |
|---|---|---|
| IP address | 192.168.122.102 |
HDrive default IP |
| TCP port | 1000 |
Command port (auto-discovered from m4s16) |
| UDP port | 1001 |
Telemetry port (auto-discovered from m4s17) |
# Custom IP (ports are auto-discovered from the drive)
motor = HDriveETH("192.168.1.50")
Examples
See the examples/ folder:
basic_control.py— Connect, move, print telemetryvelocity_mode.py— Constant speed controltorque_mode.py— Torque controlread_object.py— Read a single object via raw TCP
Requirements
- Python 3.8+
- HDrive17-ETH firmware version 266 or newer
- No external dependencies
License
MIT — see LICENSE for details.
Support
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hdrive_eth-0.1.3.tar.gz.
File metadata
- Download URL: hdrive_eth-0.1.3.tar.gz
- Upload date:
- Size: 28.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1712220dede2915c73a675685613d7d0cf0eefe2bd5d4cde2adb1e796efc3b99
|
|
| MD5 |
a0277f9dbec67fc27c42ec09c293d2b9
|
|
| BLAKE2b-256 |
5d8005025ad3fd63582803c353bdcac2429faf100c477c0426ec2107174144d1
|
File details
Details for the file hdrive_eth-0.1.3-py3-none-any.whl.
File metadata
- Download URL: hdrive_eth-0.1.3-py3-none-any.whl
- Upload date:
- Size: 20.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d022f184ad2aadeba5075a6be534ab1975ceb8d33f7cd43a0170143cbb52f3f6
|
|
| MD5 |
a54155fe5c4381553270aa847d126be0
|
|
| BLAKE2b-256 |
c3176975600e0352f262b8abe763b996f8eb317ca53c50e89df1eff20e2e587a
|