ciplink is a fork of pycomm3 rebuilt on a shared Rust core. Every language calls the same driver, so tag reads, packet packing and error handling behave the same everywhere. In Python it keeps the familiar pycomm3-style API and uses several times less CPU per call.
flowchart LR
PY[Python] -->|PyO3| CORE
CPP[C / C++] -->|C ABI| CORE
CS[C# / .NET] -->|P/Invoke| CORE
RS[Rust] --> CORE
CORE[[ciplink core<br/>Rust]] -->|EtherNet/IP| PLC[(Logix · Micro800<br/>SLC · MicroLogix)]
Features
| Controllers | ControlLogix, CompactLogix, GuardLogix and Micro800 with LogixDriver; SLC 500 and MicroLogix with SLCDriver; generic CIP messaging to any EtherNet/IP device with CIPDriver |
| Tag types | atomic types, arrays, strings, UDTs (whole or by member), AOIs, bits of integers and BOOL arrays |
| Throughput | many tags packed into each packet, with large values fragmented and chunked automatically |
| Tag discovery | the tag list and UDT definitions are uploaded on connect, or loaded on first use with lazy_tags; a binary tag cache makes restarts near-instant |
| Online-edit safe | tags are addressed by instance ID and checked against the controller's tag-table version on every read and write, so an online edit never silently returns the wrong tag |
| Extras | tag descriptions, PLC clock, device discovery, module identity, and a simulated controller for testing |
Install
| Language | Command |
|---|---|
| 🐍 Python 3.9+ | pip install ciplink |
| 🦀 Rust | cargo add ciplink |
| 🟣 C# / .NET 8+ | dotnet add package Ciplink |
| ⚙️ C / C++ | ciplink.h, ciplink.hpp and prebuilt libraries on the releases page |
The Python wheels and the NuGet package already contain the compiled core, so you don't need a Rust toolchain.
Quick start
The path is the controller's IP address, IP/slot for a ControlLogix outside slot 0, or a full route such as
192.0.2.10/bp/2/enet/192.0.2.20/bp/0. Every read and write returns one result per tag. A failure is reported on
that result, with a message and an error kind (not found, bad value, access denied and so on), rather than raised
as an exception.
Python
from ciplink import LogixDriver
with LogixDriver("192.0.2.10") as plc:
print(plc.read("Counter")) # Tag(tag='Counter', value=42, type='DINT', error=None)
level, recipe = plc.read("Tank.Level", "Recipe{10}")
plc.write(("Counter", 0), ("Tank.Setpoint", 75.5))
Rust
use ciplink::Value;
use ciplink::logix::driver::{LogixDriver, LogixOptions};
let plc = LogixDriver::new("192.0.2.10", LogixOptions::default())?;
plc.open()?;
for tag in plc.read(&["Counter", "Tank.Level"]) {
println!("{} = {:?} {:?}", tag.tag, tag.value, tag.error);
}
plc.write(&[("Counter", Value::DInt(0))]);
C#
using Ciplink;
using var plc = new LogixDriver("192.0.2.10");
plc.Open();
Tag counter = plc.Read("Counter");
Console.WriteLine(counter.IsOk ? $"{counter.Name} = {counter.Value}" : counter.Error);
plc.Write("Counter", 0);
C++
#include "ciplink.hpp"
ciplink::Logix plc("192.0.2.10");
plc.open();
for (const ciplink::Tag& t : plc.read({"Counter", "Tank.Level"}))
std::cout << t.tag << " = " << ciplink::to_json(t.value) << "\n";
plc.write_tag("Counter", 0);
Test without a PLC
ciplink-sim is a simulated Logix or SLC controller that speaks real EtherNet/IP. Load it with tags and UDTs from
a JSON file or an L5X export, then point any driver at 127.0.0.1.
cargo run -p ciplink-sim -- --config tools/sim/example_controller.json --port 44818
Build from source
You need Rust (stable). The Python package also needs Python 3.9+ with uv, and the C# binding needs the .NET 8+ SDK.
cargo test --workspace # core, simulator, C ABI and the Python ↔ Rust parity harness
uvx maturin build --release # Python wheel, written to target/wheels/
bash bindings/cpp/build_and_test.sh # C++ binding
dotnet test bindings/dotnet # C# binding
See CONTRIBUTING.md for how the parity fixtures are generated and how releases are published.
Project layout
| Path | Contents |
|---|---|
crates/ciplink |
the Rust driver core |
crates/ciplink-py, ciplink/ |
the Python extension module and package |
crates/ciplink-ffi |
the C ABI and ciplink.h |
bindings/cpp, bindings/dotnet |
the C++ and C# bindings |
crates/ciplink-sim |
the simulated controller |
License
MIT. Built on pycomm3 by Ian Ottoway and pycomm by Agostino Ruscito.
Metadata
Release files for ciplink 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ciplink-0.3.0.tar.gz | 263.5 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| ciplink-0.3.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| ciplink-0.3.0-cp39-abi3-musllinux_1_2_x86_64.whl | CPython 3.9 | abi3 | Linux musl 1.2+ x86-64 | Details |
| ciplink-0.3.0-cp39-abi3-musllinux_1_2_aarch64.whl | CPython 3.9 | abi3 | Linux musl 1.2+ ARM64 | Details |
| ciplink-0.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| ciplink-0.3.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| ciplink-0.3.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64, macOS 10.12+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64 | Details |
Total release size: 7.8 MB
Release files / ciplink-0.3.0.tar.gz
| Download URL | ciplink-0.3.0.tar.gz |
|---|---|
| Size | 263.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
af73f3e5e4091070321cd3c4470d8dee028c6e6f2f9882f36a2b8e57d00578e4
|
|
BLAKE2b-256 checksum How to use checksums |
784f3028bc9d0bc2ee3969fe6bb7f081287038aec0b9444a4defc8b6542067d7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / ciplink-0.3.0-cp39-abi3-win_amd64.whl
| Download URL | ciplink-0.3.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 979.9 kB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
55d6c1a4ac506ed3a43de21b30b7246b3190fd6429f99943d82557d947490759
|
|
BLAKE2b-256 checksum How to use checksums |
2d9194cc72c481358939e0e5a0984ca0af903f15cb8f8a4e1143ebe167c7d12c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / ciplink-0.3.0-cp39-abi3-musllinux_1_2_x86_64.whl
| Download URL | ciplink-0.3.0-cp39-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.9 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
0f25b71d85e674c574c78876314d046b2653fb0942f5d922d088ae32b62a68dd
|
|
BLAKE2b-256 checksum How to use checksums |
6286fdadd77a4148c7605915e41fe4721100550f4c36fe4d408d63ab78eae995
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / ciplink-0.3.0-cp39-abi3-musllinux_1_2_aarch64.whl
| Download URL | ciplink-0.3.0-cp39-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.9 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
99114249f01865850d00a3e1d5f32549fc601d3ac5de03e17cb9fd47ae6256eb
|
|
BLAKE2b-256 checksum How to use checksums |
09bf0a3fe921c2d52d07127408644c4d9453281a4a99a85497f7060662f3f2f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / ciplink-0.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | ciplink-0.3.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c093d8d54a303d851e9d22a8adce17cd95943236ef6526216ec088a85bfeda78
|
|
BLAKE2b-256 checksum How to use checksums |
70c0240f5470a057241d8661a5708390e76970889f095e19ac39dffde36648e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / ciplink-0.3.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | ciplink-0.3.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
60546bc7a4cd97534ab86322ff3436594abeaa4e9e3dee4141cf135e8543745b
|
|
BLAKE2b-256 checksum How to use checksums |
dc9cf788d72fc95707977551ddb61f8def28d01eea0058a714c2a5865bc89c16
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / ciplink-0.3.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | ciplink-0.3.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 1.9 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
16fd1712d0fd2ef99b27b65721126a8cb2593c8343a86e08fb40d2a85d4d64e6
|
|
BLAKE2b-256 checksum How to use checksums |
369ddaa15827aaedf3b2259f9a31d36538d4813a415ef6c7b46702551c6c9086
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logSecurity for ciplink 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 7 files in this release have been uploaded with provenance metadata.
Attestation for ciplink-0.3.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.