Skip to content

Controller Communication

The Consystence edge runtime reads and writes controller data through one driver layer. Two drivers are implemented and in early access: EtherNet/IP CIP, which reads a Rockwell ControlLogix directly, and GDS over gRPC to a Phoenix Contact PLCnext. One edge can connect to both. A site server can also read a ControlLogix directly over the same driver layer, read-only, without an edge (early access: our engineers enable it per controller, with a site engineer’s acknowledgement; direct reads have no edge buffer; it has run at a site trial since 28 October 2026; off by default). The PLCnext driver also serves the PLCnext border-gateway topology, an accepted target design for Consystence-managed equipment that has been demonstrated in our workshop. This page describes both drivers, how a driver is selected, and where the control boundary sits.

Throughout, we use the vendor-neutral term controller rather than “PLC”. Consystence treats ControlLogix and PLCnext controllers uniformly behind the same engineering model: controller → module → channel → tag/register. Modbus TCP is on the roadmap. A pure-.NET Modbus TCP driver (coils, discrete inputs, and holding and input registers, with the data type and word order stated in the tag path) is merged and bench-verified in the shared driver layer, but no edge or site-server acquisition path uses it yet. Choosing Modbus TCP as a controller’s protocol does not start acquisition. A direct OPC UA runtime driver is also on the roadmap. For the edge runtime in general, see the edge overview.

Every controller connection goes through one small, symbolic driver layer: connect, disconnect, and read or write one tag or many by path. Callers never address raw register offsets. Batch reads and writes let a driver coalesce many tags into one wire request (a single batched CIP request, or a single GDS read) rather than issuing one round-trip per tag.

Each value the driver returns carries the tag path, the value, the controller data type, a quality (Good, Uncertain, Bad or ConfigError), a read timestamp and any error. The driver only moves typed values; access mode, physicalRole and the meaning of each tag come from the device type and instance mapping (see Concepts).

The edge wraps each driver with reconnect logic, so callers never touch a raw socket. Poll groups drive reads on independent timers. Changed values (by value or quality) stream upstream as they occur, with a periodic full snapshot so static values stay attested — or buffer to SQLite when the link to the server is down (store-and-forward) and replay on reconnect.

Each controller entry in the edge’s Plcs configuration selects a driver with its Driver value (see Edge deployment):

Driver valueUse
ethernet-ipEtherNet/IP CIP, direct to a ControlLogix/CompactLogix controller
plcnext-grpcGDS variables on a PLCnext controller over gRPC
stubSimulated IO for development, tests and CI (no hardware)

Transport settings sit beside the Driver value: an address, a port and a CIP route for EtherNet/IP; for PLCnext, the edge’s PlcNext block (a socket path, or a gRPC host and port, plus the component path). The rest of the edge stays transport-agnostic. The CIP route is a comma-separated series of port,link hops (for example 1,0 for the local backplane slot 0) and supports multi-hop routes through an EtherNet/IP bridge to a CPU in a remote chassis; a malformed route is rejected outright rather than falling back to a default slot. Note that the cloud-side simulator is a separate mechanism — the server’s Sim Runtime, selected by sim:// endpoint prefixes — not this driver.

flowchart LR
  EDGE["Consystence Edge<br/>(.NET 10 Orleans silo)"]
  CLX["ControlLogix / CompactLogix<br/>(read directly)"]
  subgraph PLCnext["PLCnext controller"]
    GDS["GDS / PORT variables"]
  end
  FIELD["Field devices<br/>(VFDs, relays, IO)"]

  EDGE -- "EtherNet/IP CIP (TCP 44818)" --> CLX
  EDGE -- "gRPC (GDS) over UDS or TCP" --> GDS
  GDS -. "CIP / EtherNet-IP<br/>(border-gateway topology)" .-> FIELD

EtherNet/IP CIP: reading a ControlLogix directly

Section titled “EtherNet/IP CIP: reading a ControlLogix directly”

The ethernet-ip driver is a native EtherNet/IP driver for ControlLogix / CompactLogix controllers, speaking EtherNet/IP CIP over TCP (port 44818) and batching reads where the protocol allows. It needs no native library dependency. It connects the edge straight to a controller’s symbolic tag space, for example Program:Main.Pump1.SpeedSP (illustrative). An edge in our workshop reads a physical ControlLogix this way.

The controller keeps its own program and its authority over outputs, and the edge reads it alongside your existing control system. Further direct drivers (Modbus TCP and OPC UA) are on the roadmap.

The plcnext-grpc driver reads and writes PLCnext GDS (Global Data Space) PORT variables through the controller’s local gRPC API. The default transport is a Unix Domain Socket at /run/plcnext/grpc.sock — lowest latency, no network stack — which suits an edge runtime co-located on the PLCnext device itself, as in the VL3 target installation. A TCP channel (GrpcHost, default port 41100) is used when the socket cannot be shared: a containerised vPLCnext, where the edge and the vPLCnext runtime do not share a filesystem, or a PLCnext on another host. The workshop’s virtual PLCnext is reached this way.

The client splits reads from writes for correctness:

  • Reads are designed around the PLCnext subscription service, which delivers task-consistent, buffered samples at the controller scan-cycle rate rather than polling each variable independently.
  • Writes use the data-access service for immediate, direct updates.

GDS variables are addressed by a full component path of the shape Arp.Plc.Eclr/{Component}.{Program}.{Port} — dot-joined after the first slash. The driver builds it from a configured ComponentPath prefix plus the PORT name. For example (illustrative only — names vary per project):

ComponentPath : Arp.Plc.Eclr/ExamplePumpComp.PumpStation1
PORT name : PP01_Running
Full GDS path : Arp.Plc.Eclr/ExamplePumpComp.PumpStation1.PP01_Running

The PLCnext border gateway is an accepted target topology for Consystence-managed equipment, demonstrated in our workshop on a virtual PLCnext. In it, a PLCnext controller sits between an isolated internal field network and the wider OT network. The PLCnext runs the deterministic control logic and speaks CIP / EtherNet-IP to the field devices (VFDs, protection relays, remote IO) on its internal port. The edge connects only to the PLCnext, and only on the external port.

The design gives a clean boundary: the field network is invisible to anything outside the PLCnext, the controller is the single point of control for its field devices, and control continues to run on the controller even if the edge disconnects. The edge sees abstracted device and process variables, not raw IO.

ConcernEtherNet/IP CIP (ethernet-ip)PLCnext GDS over gRPC (plcnext-grpc)
Edge → controller transportEtherNet/IP CIP over TCP 44818gRPC over UDS (co-located) or TCP
Controller → fieldThe controller’s own I/OIn the border-gateway topology, CIP / EtherNet-IP on an isolated internal network
Field network isolationSet by your site network designIn the border-gateway topology, the field network sits behind the gateway
Control if edge disconnectsContinues on the controllerContinues on the controller
StatusEarly access, arranged with our team; reads an existing controller, read-onlyEarly access; the border-gateway topology is an accepted target topology, demonstrated in our workshop

For where the edge tier sits in the wider system, see cell topology. Tag values surfaced to clients are documented in the API reference.