DMC, Inc.
Libplctag.NET

Replacing the NET.LOGIX InGear Driver with libplctag.NET

DMC strives to offer stable and up-to-date solutions for our clients. InGear’s NET.LOGIX driver was once a convenient and simple option for communicating between .NET software and various types of PLCs, including Allen Bradley ControlLogix, CompactLogix, SoftLogix, and Micro800 series controllers. However, as of 2026, the NET.LOGIX driver is no longer available or supported by InGear, and the development license validation is no longer available. Here, DMC discusses an alternative driver: libplctag.NET.

What is libplctag.NET?

libplctag is an open-source C library that enables EthernNet/IP and Modbus TCP reading and writing tags on Rockwell/Allen-Bradley ControlLogix, Micro 850, and SLC 500 and MicroLogix PLCs. libplctag.NET is its .NET wrapper and is available on NuGet. The libplctag repository can be found here, and the libplctag.NET repository can be found here.

Advantages of libplctag.NET

One of the biggest advantages of libplctag.NET is that, because it is open source, it does not cost anything! Specifically, the library is dual-licensed under the Mozilla Public License 2.0 (MPL 2.0) and the GNU Lesser/Library General Public License 2+ (LGPL 2+). As mentioned above, libplctag.NET supports EtherNet/IP and Modbus TCP. The provided API is stable and is actively being supported and upgraded. The driver is lightweight, high-performance, and low on memory usage. The documentation and wiki provided in the repositories linked above are very robust and full of examples.

Example Tag Read and Write

Below is an example that demonstrates reading and writing a tag to an Allen-Bradley CompactLogix/ControlLogix PLC that was taken from the libplctag.NET documentation.

Allen Bradley CompactLogix ControlLogix PLC

As can be seen in the above example, a new tag can be configured using a simple constructor. Read() gets the current value, and Get[Type]([default]) converts this value to [Type]; in the above example, that would be GetInt32(0), which converts the value to an int. Similarly, writing a new value is as simple as Set[Type]([default], [new_value]), which is SetInt32(0, updatedValue) in the above example, and then calling Write().

Ready to take your Automation and AppDev project to the next level? Contact us today to learn more about our solutions and how we can help you achieve your goals.