Pyads-Agile is our maintained TwinCAT ADS distribution for teams that want Python to be part of the machine stack, not an afterthought. It stays drop-in compatible with pyads while adding typed RPC proxies, a serialized async runtime, and stepchain support for long-running PLC workflows.
Typed proxies make TwinCAT function blocks look like Python classes, which is a clean fit for pytest-based FAT, SAT, and regression packs.
@pyads.ads_path("GVL.fbAxisTests")
class FB_AxisTests:
def m_xHome(self) -> pyads.PLCTYPE_BOOL: ...
def m_xReset(self) -> pyads.PLCTYPE_BOOL: ...
with pyads.Connection(net_id, pyads.PORT_TC3PLC1) as plc:
axis = plc.get_object(FB_AxisTests)
assert axis.m_xHome()
assert axis.m_xReset()For longer-running PLC procedures, the async stepchain model separates acceptance from completion and returns a consistent status snapshot.
@pyads.ads_async_path("GVL.fbMesOrder")
class FB_MesOrder(pyads.StepChainRpcInterface):
@pyads.stepchain_start
def m_xStartOrder(
self,
udiRequestId: pyads.PLCTYPE_UDINT,
) -> pyads.StepChainOperation[pyads.PLCTYPE_BOOL]:
...
async with pyads.AsyncConnection(net_id, pyads.PORT_TC3PLC1) as plc:
rpc = plc.get_async_object(FB_MesOrder)
operation = rpc.m_xStartOrder()
await operation.accepted
snapshot = await operationTell us what you are building, where the current blocker is, and what the target architecture should support.