FastADS

High-throughput ADS communication for new industrial Python projects.

FastADS is the performance path when standard pyads communication becomes the bottleneck and the project needs native batching, subscriptions, typed access, and long-running service workloads.
Proprietary high-throughput ADS client

Native ADS throughput with production-friendly Python APIs.

Measured benchmark gains

FastADS is a native-powered, async-first TwinCAT ADS client for Python, built for high-performance industrial communication.

FastADS is a modern, high-performance ADS client for Beckhoff TwinCAT systems, built for industrial Python applications that need speed, scalability, and clean developer ergonomics. Together with our proprietary fastads-core.dll, it is engineered for scenarios where the standard pyads stack backed by Beckhoff adslib.dll becomes the bottleneck.

It is built for machine connectivity, test systems, industrial analytics, gateways, orchestration layers, and custom automation software where ADS communication must be both fast and maintainable.

Why it exists

FastADS is built for selected industrial Python projects where the standard pyads and adslib path becomes the limiting factor. The goal is a stronger internal option when throughput, batching, subscriptions, and full-stack PLC integration matter more than compatibility.

Core strengths
Async-first architectureNative C coreCompiled batch plansPrepared symbol setsTyped PLC data and structsTyped subscriptions and callbacksTyped RPC bindingsRaw ADS accessSync and async clientsConnection poolingParallel connectionsWindows, Linux, and macOS binaries
Bulk read
10.45x
55 ms -> 5 ms on 10,000 variables
Bulk write
7.54x
51 ms -> 6 ms on 10,000 variables
Single-call
25.4x
72945 ms -> 2871 ms
10,000-variable bulk read benchmark

Bulk read throughput

10.45x faster than pyads
FastADS + fastads-core.dll
10,000 variables via bulk read in 5 ms
10.45x
pyads + Beckhoff adslib.dll
same 10,000-variable bulk read in 55 ms
1x
10,000-variable bulk write benchmark

Bulk write throughput

7.54x faster than pyads
FastADS + fastads-core.dll
10,000 variables via bulk write in 6 ms
7.54x
pyads + Beckhoff adslib.dll
same 10,000-variable bulk write in 51 ms
1x
10,000 single read/write operations

Single read/write operations

25.4x faster than pyads
FastADS + fastads-core.dll
10,000 individual calls in 2871 ms
25.4x
pyads + Beckhoff adslib.dll
same workload in 72945 ms
1x

Timings depend on CPU performance and system load.

Async-first with a native C backend

FastADS combines an async-first Python API with a native C core so Python applications get fast symbol access, efficient batch communication, and low-overhead concurrent ADS workloads.

Built around symbols, plans, subscriptions, and services

Instead of forcing procedural ADS plumbing, FastADS uses a modern object-oriented API with typed subscriptions, RPC integration, device control helpers, and raw ADS access when experts need it.

Designed for production-scale deployment

Prepared symbol sets, native scalar buffers, pooling, and parallel connections support large symbol sets and long-running services, with bundled Windows, Linux, and macOS binaries so target machines do not need to build the native core.

Usability in real code

FastADS is meant to feel usable in production Python, not just benchmark well. The native client exposes the same core ideas across async and sync flows: symbols, plans, subscriptions, services, and workflow-aware operations.

Native feature overview
Async-first client design with parallel connections for concurrent workloads
No Beckhoff adslib dependency and bundled native binaries for target platforms
Typed symbols, compiled plans, and efficient batch reads and writes
Typed subscriptions, event streams, and callback-driven monitoring
Typed RPC bindings and workflow-aware operations for higher-level PLC interfaces
Raw ADS access plus device inspection and control when low-level access is needed

Example patterns

Example

Async native client

The async client keeps symbol access and compiled plans readable even when communication volume grows.

import asyncio
from fastads import AdsClient, types


async def main():
    async with AdsClient(
        host="192.168.1.100",
        target_net_id="192.168.1.100.1.1",
        parallel_connections=4,
    ) as client:
        counter = client.symbol("MAIN.counter", types.DInt)

        print(await counter.read())
        await counter.write(123)

        plan = await client.plan(
            (
                ("MAIN.counter", types.DInt),
                ("MAIN.enabled", types.Bool),
            )
        )
        print(await plan.read())


asyncio.run(main())
Example

Async typed RPC

Typed service binding stays short and approachable when you want a clean PLC-facing API instead of raw symbol plumbing.

import asyncio
from fastads import AdsClient, service, types


@service("MAIN.math")
class MathService:
    async def add(self, left: types.DInt, right: types.DInt) -> types.DInt:
        raise NotImplementedError


async def main():
    async with AdsClient(
        host="192.168.1.100",
        target_net_id="192.168.1.100.1.1",
    ) as client:
        math = client.bind(MathService)
        print(await math.add(20, 22))


asyncio.run(main())
Default choice vs compatibility path

Choose FastADS by default. Use Pyads-Agile when compatibility decides.

If you can choose freely, FastADS is the stronger option across performance, RPC, subscriptions, plans, and long-running service workloads. Pyads-Agile remains valuable primarily when you need pyads compatibility, Beckhoff adslib-backed behavior, or the lowest-risk migration path for an existing codebase.

FastADS

Default choice

If you can choose freely, FastADS is the stronger general-purpose option. It brings the highest performance while also covering typed RPC, subscriptions, compiled plans, raw ADS access, and long-running industrial Python workloads.

  • Best overall technical choice for new TwinCAT Python projects
  • Covers the higher-level integration patterns teams typically want from Pyads-Agile and goes further on throughput
  • Fits gateways, analytics, orchestration, validation, service tools, and machine connectivity without needing a second client strategy

Pyads-Agile

Compatibility path

Pyads-Agile remains the right choice when compatibility is the deciding constraint. Its main advantage is staying close to pyads and the Beckhoff adslib runtime while adding cleaner TwinCAT-oriented ergonomics.

  • Best fit for existing pyads codebases that need minimal rewrite risk
  • Useful where Beckhoff adslib is already approved, expected, or embedded in deployment assumptions
  • Pragmatic migration bridge for teams that want typed RPC and stepchain patterns before moving fully to FastADS

Decision patterns

Choose FastADS

New TwinCAT Python applications

If there is no compatibility constraint, start with FastADS. It already covers RPC, subscriptions, plans, and service-style integrations, while giving you more throughput headroom for real production workloads.

One client for the whole stackHigher performance ceilingNo compatibility compromises
Choose Pyads-Agile for compatibility

Existing pyads applications

Pyads-Agile is strongest when the application already speaks pyads and the goal is to improve TwinCAT ergonomics without changing the underlying compatibility model too aggressively.

Minimal rewrite riskKeeps pyads-style integrationLower migration friction
Choose Pyads-Agile for compatibility

adslib-bound or validated environments

Where Beckhoff adslib behavior, qualification history, installed tooling, or deployment expectations are part of the acceptance criteria, Pyads-Agile keeps you on the familiar runtime path.

Easier approval pathOperational continuityCompatibility-first rollout
Choose FastADS

High-throughput machine software and services

For gateways, analytics, orchestration layers, regression rigs, and symbol-heavy machine services, FastADS is the default recommendation even when you also need RPC and advanced PLC integration patterns.

Higher throughputBroader native feature setScalable long-running services

Evaluating FastADS for a gateway, test rig, or service layer?

Tell us what you are building, where the current blocker is, and what the target architecture should support.

Contact