The "EtherIP" driver/device support module interfaces Allen Bradley ControlLogix 5000 PLCs as well as Compact Logix devices via Ethernet to EPICS IOCs.

It is using a TCP/IP based protocol called EtherNet/IP, where the "IP" stands for Industrial Protocol. EtherNet/IP was also known as ControlNet over Ethernet or CIP over Ethernet, where "CIP" in turn used to be Control and Information Protocol as used by ControlNet, but got renamed into Common Industrial Protocol. If you're not confused, yet, please refer to


The source code is on GitHub in To download:

  1. On the GitHub web page, select either "master" or a specific, tagged, version.
  2. Use the "Download ZIP" entry in the "Clone or download" drop-down.

In addition to the C version for EPICS IOCs that has been in production systems since ca. 2004, there is also a Java version of the basic communication library, not connected to an EPIS IOC, see


The module builds like any other EPICS support module: Edit configure/RELEASE, invoke make. Check the INSTALL file included in the sources for more, and changes.txt for release information.

EtherNet/IP on anything but ControlLogix 5000

There are many other devices besides ControlLogix 5000 which support EtherNet/IP: FlexLogix I/O, PLC5, ... A common question is: Will this EtherIP driver/device support work with XYZ? The driver does seem to work with Compact Logix as well. Feel free to try others, but I'm afraid the answer will mostly be: no.

This software accesses the ControlLogix 5000 PLC via CIP service codes 0x0A, 0x4C, 0x4D, all of which are, as far as I know, specific to the ControlLogix 5000, and will not be understood by any other EtherNet/IP device except maybe Compact Logix. The ControlNet/EtherNet/IP specifications include an "Object Library". In there you find an "Identity" object, to be implemented by any EtherNet/IP device. This driver uses it to obtain the serial number of the Logix 5000 ENET module.

There is a "Message Router" object: We use that to get from the ENET module to the Logix 5000 controller where the ladder logic runs. Other devices like FlexLogix might also implement a MessageRouter object, but when we contact that the same way as we contact the MessageRouter on the Logix 5000 ENET module, I'm pretty sure the response will be: "Invalid Path", because the path from the Logix 5000 ENET module to the controller in slot 0 of the Logix 5000 backplane simply doesn't exist on FlexLogix.

Then there are "Discrete Input Point", "Output Point", "Analog Input Point" etc. objects: Maybe you can use those to access I/O points on any "EtherNet/IP" device. But I was't getting anywhere with them for the Logix 5000. And in order to read/write tags in the Logix 5000 ladder logic, which is what I ultimately wanted to do, I had to use the ControlLogix-specific service codes. So any compatibility to other devices using "EtherNet/IP" is probably limited to generic parts of the protocol.