Skip to main content

PROFINET IO-Controller library for Python

Project description

profinet-py

CI PyPI Python License Code style: ruff CLA

A Python library for PROFINET IO communication, acting as an IO-Controller.

Features

  • DCP Discovery & Configuration: Find devices, set IP/name, signal LEDs, factory reset with full SET response validation
  • DCE/RPC Communication: Establish Application Relationships (AR) and perform acyclic read/write via slot/subslot/index
  • I&M Records: Read/write Identification & Maintenance data (IM0-IM5)
  • Cyclic I/O: Real-time periodic data exchange (RT_CLASS_1) with state machine, double-buffered IO, cycle counter tracking, watchdog fault detection, and graceful shutdown
  • Alarm Handling: Background alarm listener per IEC 61158-6-10
  • Diagnosis Parsing: Channel, extended channel, and qualified channel diagnosis decoding
  • Vendor Registry: 2100+ PROFINET vendor IDs with name lookup
  • Declarative Parsing: Binary protocol parsing via construct library
  • Cross-Platform: Linux (AF_PACKET), Windows (Npcap)
  • High-level API: ProfinetDevice class and scan() for quick device interaction

Requirements

  • Python 3.10+
  • Administrator/root privileges (for raw Ethernet access)
  • construct>=2.10

Platform-specific

Platform Raw Socket Backend Extra Software
Linux AF_PACKET (built-in) None
Windows Npcap (wpcap.dll) Install Npcap with "WinPcap API-compatible Mode" enabled

Installation

pip install profinet-py

From source:

git clone https://github.com/f0rw4rd/profinet-py.git
cd profinet-py
pip install -e ".[dev]"

Usage

import profinet

# Discover all PROFINET devices on the network
for device in profinet.scan("eth0", timeout=5):
    print(f"Found: {device.name} at {device.ip} ({device.mac})")

On Windows, use the adapter's friendly name:

for device in profinet.scan("Ethernet 3", timeout=5):
    print(f"Found: {device.name} at {device.ip}")

Low-level DCP + RPC

from profinet.util import ethernet_socket, get_mac
from profinet.dcp import send_discover, read_response
from profinet.rpc import RPCCon

# Create raw socket on interface
sock = ethernet_socket("eth0")
src_mac = get_mac("eth0")

# Discover PROFINET devices
send_discover(sock, src_mac)
responses = read_response(sock, src_mac, timeout_sec=5)

sock.close()

CLI

# Discover devices
profinet -i eth0 discover

# Read I&M0 from device
profinet -i eth0 read-inm0 device-name

# Read raw record
profinet -i eth0 read device-name --slot 0 --subslot 1 --index 0xAFF0

# Cyclic IO monitoring (default 32ms cycle)
profinet -i eth0 cyclic device-name --gsdml device.xml

# Custom cycle time
profinet -i eth0 cyclic device-name --gsdml device.xml --cycle-ms 16

Support

If you find this project useful, consider supporting development:

Ko-fi

License

Dual-licensed under GPL-3.0 and a commercial license.

Free for open source use under GPL-3.0. If you want to use profinet-py in proprietary products without GPL obligations, a commercial license is available — see LICENSE-COMMERCIAL.md for details.

References

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

profinet_py-0.6.2.tar.gz (219.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

profinet_py-0.6.2-py3-none-any.whl (166.9 kB view details)

Uploaded Python 3

File details

Details for the file profinet_py-0.6.2.tar.gz.

File metadata

  • Download URL: profinet_py-0.6.2.tar.gz
  • Upload date:
  • Size: 219.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for profinet_py-0.6.2.tar.gz
Algorithm Hash digest
SHA256 20e44828861190f70944e5f89f6dfbe71d439a360f149fe9cce2537743cd8c1b
MD5 3785e7c2bfa87e696fa689d0146f5711
BLAKE2b-256 5d177d66b898d5fa9c21d8f41df589f53b11dc8cd9467293a9315ea11d4e0e31

See more details on using hashes here.

Provenance

The following attestation bundles were made for profinet_py-0.6.2.tar.gz:

Publisher: release.yml on f0rw4rd/profinet-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file profinet_py-0.6.2-py3-none-any.whl.

File metadata

  • Download URL: profinet_py-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 166.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for profinet_py-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7b5747829dbdba2c67beca57e648262bc359751a2bfef0f60f071207fcd41da3
MD5 3369c036d4b3b76a22a1e3c12d6ca45e
BLAKE2b-256 8a11193a983080bcd42c0adf7288a768e925b20fa8fa5554f65b4265e24c91b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for profinet_py-0.6.2-py3-none-any.whl:

Publisher: release.yml on f0rw4rd/profinet-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page