We are thrilled to announce a major addition to benthos-umh: native Ethernet/IP connectivity. With this plugin, you can pull live data from Ethernet/IP (i.e. CIP) capable controllers straight into the Unified Namespace (UNS).

What is benthos-umh?
benthos‑umh is our high‑throughput stream processor, forked from Redpanda Connect (formerly Benthos). It powers every Data Flow Component and Protocol Converter you spin up in the UMH Management Console. Out of the box it already speaks OPC UA, Siemens S7, Modbus and SensorConnect. As of today Ethernet/IP joins the toolbox. Since it was built on top of Redpanda Connect, it also natively provides several key components as you can find here.
Why Ethernet/IP?
Ethernet/IP (Ethernet Industrial Protocol) is one of the most widely deployed industrial Ethernet standards.
It rides the full OSI stack – Ethernet (physical & data‑link), IP (network), and TCP/UDP (transport) – and layers the Common Industrial Protocol (CIP) or legacy PCCC on top:

Key capabilities
- Real-time messaging: It provides explicit messaging (TCP) with a request/response communication model, as well as implicit messaging (UDP) with a producer-consumer model. With this baked in it allows not only for non-continuous data reading, but also for efficient cyclic data transfer.
- Vendor neutrality: By leveraging the Ethernet/IP protocols, it provides the flexibility of using basic networking devices (i.e. switches)
Ethernet/IP in a nutshell
CIP vs PCCC
Key differences:

CIP | PCCC | |
---|---|---|
Devices | CompactLogix, ControlLogix, Micro800 | PLC-5, SLC-5, early MicroLogix |
Data model | Tags & attributes (object-oriented) | File-based (F, N, B, etc.) |
Messaging | Explicit (TCP) & Implicit (UDP) | Explicit only (TCP) |
Address syntax | 192.168.0.10:MyPump.state |
192.168.0.10:B3:1/0 |
We decided to focus on CIP first, driven by:
- Modern controllers overwhelmingly supporting CIP.
- Full duplex producer-consumer I/O for high-frequency telemetry.
- Cleaner tag semantics that can map 1-to-1 onto UNS topic naming.
Support for PCCC is on the roadmap (see below).
Explicit vs Implicit messaging
Explicit(TCP) | Implicit(UDP) | |
---|---|---|
Pattern | Request / Response | Producer -> Consumer |
Typical payloads | Configuration, diagnostics | Fast cyclic I/O |
Reliability | Guaranteed delivery | Best-effort, low-latency |
Currently, we only use explicit messaging for all data, leveraging benthos-umh as a requester. Therefore, you cannot switch to implicit messaging right now. However, this feature will be available when we introduce a subscription-based model here.
How we extended benthos-umh
Integrating Ethernet/IP in the toolbox of input plugins was not a straightforward approach. It didn't feel like implementing only one protocol, because we needed to consider the differing underlying protocols at first. Once the strategy was set, however, we could begin the process in four key steps.
Implementation process
- Community-driven roadmap: As mentioned not only the quantity of CIP devices, but also the feedback from our UMH community members were early adopters who guided the spec.
- Robust plugin architecture: We implemented the new
eip_plugin
into benthos-umh to read tags and attributes via CIP, using retries and reconnection logic. - Solid foundation: We built the plugin based on the open-source gologix library, which also provides continuous development.
- Comprehensive Testing: This library was also used to build a dockerized eip-server, that is used for testing purposes and will be integrated in CI as well.
Example configuration
The configuration for benthos-umh is very straightforward in a single YAML file. The key concepts of this can also be found in the Management Console, whenever you set up a Data Flow Component or a Protocol Converter. Therefore we've set up templates and some documentation within the console, which can also be found here.
A PLC tag set for Ethernet/IP might look like this:
MyPressureMachine/
pressure <- REAL
temperature <- INT
state <- BOOL
powerConsumption[] <- REAL[10]
Tags in Ethernet/IP devices are usually names for objects or attributes and follow a specific naming schema:<ip-address>:<TagSet>.<TagName>
, wherein the <TagSet>
is optional.
- Read the whole object:
192.168.0.10:MyPressureMachine
- Read a single attribute:
192.168.0.10:MyPressureMachine.state
- Read an array slice:
192.168.0.10:MyPressureMachine.powerConsumption/0:10
All those patterns are now unified and simplified by the new plugin:
input:
ethernetip:
endpoint: "192.168.0.10:44818" # controller IP
path: "1,0" # optional rack,slot
tags:
- name: "MyPressureMachine"
type: "struct"
alias: "machine"
- name: "MyPressureMachine.pressure"
type: "float32"
alias: "machine_pressure"
- name: "MyPressureMachine.temperature"
type: "int16"
alias: "machine_temperature"
- name: "MyPressureMachine.state"
type: "bool"
alias: "machine_running"
- name: "MyPressureMachine.powerConsumption"
type: "arrayoffloat32"
length: 10
alias: "machine_power_curve"
This simplification is achieved through a Read Tag
service provided by Ethernet/IP controllers. Currently, we use a continuous polling system, that updates values at predefined intervals (request/response). As previously mentioned we plan to also provide a subscription model, that could reduce the amount of data, which is read at once. This could be a significant improvement for large plants.
Looking Ahead
There are a couple of things already planned to further improve the experience for Ethernet/IP users.
- multiRead: This feature should improve the efficiency when reading large quantities of tags.
- listTags: We want to achieve something similar to the Tag-Browser for OPC UA, this will let you simply pick existing tags out of your devices.
- Write support: At a certain point, we plan to enable writing back to Ethernet/IP devices.
- Subscription model: This feature reduces the amount of data that needs to be read, since it focuses only on changing values and includes implicit messaging.
- PCCC: This would expand support for Ethernet/IP devices to older devices.
Try it today
Deploy the Ethernet/IP Protocol Converter template in the UMH Management Console, or pull the latest benthos-umh Docker image:
docker run -v $(pwd)/config.yaml:/config.yaml ghcr.io/united-manufacturing-hub/benthos-umh:latest
It works out of the box with umh-core
and, if you're on nightly release channel, with legacy UMH users as well.
If you have any questions or feedback feel free to join our Discord. We'd love to hear how Ethernet/IP works in your plant!