← Back to Services

EtherNet/IP Adapter Stack

PRE-CONFORMANCE ADAPTER // PYTHON BINARIES

⏱ Coming soon — package and repository not yet published.

System Overview

EtherNet/IP adapts CIP over standard Ethernet to let PLCs and field devices exchange real-time I/O and configuration data using implicit and explicit messaging.

This adapter implementation turns a Python-hosted application into a full EtherNet/IP I/O device, exposing CIP objects over UDP for Class 1 I/O and TCP for Class 3 explicit messaging. The library runs as a compiled binary module that you call from Python, so application code remains focused on behavior rather than protocol framing.

The current release targets Linux and Windows environments, with LLDP object behavior available on Linux hosts only.

Technical Capabilities

Object SetIdentity (0x01), Assembly (0x04), Connection Manager (0x06), TCP/IP (0xF5), Ethernet Link (0xF6), Port (0xF4), QoS (0x48), and LLDP Management/Agent (0x109 / 0x10A, Linux-only).
Messaging ModesClass 1 implicit I/O and Class 3 explicit messaging, both connected and unconnected, cyclic and change of state, supporting regular and large Forward Open.
Run/Idle HeaderO→T and T→O support for the 32-bit run/idle header, including the additional 4-byte run/idle segment in the I/O payload.
Unicast & MulticastT→O producer connections support both unicast and multicast data distribution to consuming scanners.
Timing & RobustnessValidated at RPIs down to 3 ms, 120-second encapsulation timeout behavior, and 10-second UCMM flooding tests for stability.
Multi-Adapter HostingMultiple logical adapters can be hosted in a single process by assigning separate Assembly instance ranges (e.g. A: 100/101/102 and B: 110/111/112).
Python-First DeliveryDistributed as compiled Python extension modules, consumed from Python via callbacks for I/O, configuration, TCP/IP, Ethernet, LLDP, QoS, and reset handling.
Conformance StatusDesigned to align with ODVA recommendations but not yet CT-certified; suited for early adopters, labs, and production where formal ODVA certification is not a hard requirement.

Python Integration

Imports & Setup

import Adapter
import os
import time
from random import randint as R

Callback Functions

Running = False
Output_Data = {}

def Log():
    global Running
    if not Running:
        Running = True
        os.system('cls')
        for Key, Value in Output_Data.items():
            print(f"{Key}: {Value}")
        time.sleep(0.02)
        Running = False

def IO(Data):
    global Output_Data
    for Key, Value in Data.items():
        Run, IO = Value
        Output_Data[Key] = [Run, IO]
    Log()

def Config(Data):
    for Key, Value in Data.items():
            print(Key, Value)

def Random_List(Length, Start, Stop):
    return [R(Start, Stop) for Index in range(Length)]

Adapter Configuration

Adapter.Config(IP='192.168.7.7')
Adapter.Register('IO', IO)
Adapter.Register('Config', Config)
Adapter.Register('Assembly', Config)
Adapter.Register('TCPIP', Config)
Adapter.Register('Ethernet', Config)
Adapter.Register('Reset', Config)
Adapter.Register('LED', Config)
Adapter.Register('LLDP', Config)
Adapter.Register('QoS', Config)

Adapter.Add(Name='A', Datatype='UDINT', T_O_Length=4, O_T_Length=8, Config_Length=6,
            T_O_Instance=100, O_T_Instance=101, Config_Instance=102, Input_Only_Instance=111,
            Listen_Only_Instance=112, Inhibit=False, O_T_Header=True, T_O_Header=True, Run=True)

Adapter.Add(Name='B', Datatype='USINT', T_O_Length=64, O_T_Length=64, Config_Length=32,
            T_O_Instance=150, O_T_Instance=151, Config_Instance=152, Input_Only_Instance=161,
            Listen_Only_Instance=162, Inhibit=False, O_T_Header=False, T_O_Header=False, Run=True)

Start & Runtime Loop

Adapter.Start()

while True:
    time.sleep(0.01)
    Adapter.Write('A', Random_List(4, 1, 10))
    Adapter.Write('B', Random_List(64, 11, 20))

Resources

The adapter is currently in a pre-conformance phase: the implementation targets ODVA specifications but has not yet been through official CT testing.

User ManualObject model, adapter lifecycle, and Python API reference. (Coming soon)
SupportUse the contact page to request features or report findings.