MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore 1.2.1

dotnet add package MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore --version 1.2.1
                    
NuGet\Install-Package MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore -Version 1.2.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore" Version="1.2.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore" Version="1.2.1" />
                    
Directory.Packages.props
<PackageReference Include="MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore --version 1.2.1
                    
#r "nuget: MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore, 1.2.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore@1.2.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore&version=1.2.1
                    
Install as a Cake Addin
#tool nuget:?package=MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore&version=1.2.1
                    
Install as a Cake Tool

MgSoftDev.IndustrialController

One API for talking to industrial PLCs from .NET.

Connect, create a tag, read, write — the code is identical whether the controller on the other end is a Siemens S7, an Allen Bradley ControlLogix, an Omron NJ/NX, an Emerson PAC System, or a simulator running on your laptop. Switching brands is a one-line change in your dependency injection setup; nothing else in your application moves.

NuGet

Controller plc = factory.New(connection).Throw();
plc.Connect(persist: true);                       // auto-reconnects in the background

Tag<int> counter = plc.CreateTag<int>(parameters).Throw();
counter.Read();                                   // updates counter.Value
counter.Write(42);

Why it exists

Every PLC vendor ships its own driver with its own object model, its own error conventions and its own idea of what a "tag" is. An application written against S7.Net Plus has to be rewritten to talk to libplctag. This library puts a single Controller / Tag<T> abstraction in front of all of them, so the vendor choice stays where it belongs: in configuration.

On top of that it adds what production line software actually needs and raw drivers don't provide:

  • Automatic reconnection. Connect(persist: true) starts a background task that watches the link and reconnects on its own.
  • Errors as values. Every operation returns Returning instead of throwing, so a dropped PLC is a value you handle, not an exception that takes down a loop.
  • Bindable state. Controller and Tag<T> implement INotifyPropertyChanged, so a WPF view can bind straight to tag.Value or plc.IsConnected with no ViewModel plumbing in between.
  • Built-in diagnostics. Each controller and tag keeps an event log, and tags keep a history of value changes — enough to build a monitoring screen without instrumenting anything.
  • Configuration as data. Connections and tag addresses serialize to JSON, so a plant's PLC map can live in a database and be edited without recompiling.

Install

Always the core, plus one provider package:

dotnet add package MgSoftDev.IndustrialController.Core
dotnet add package MgSoftDev.IndustrialController.Siemens.S7_PlcCore
Provider Package (*Core is the one you install) Protocol / port Target
Siemens S7 MgSoftDev.IndustrialController.Siemens.S7_PlcCore ISO-on-TCP / 102 net7.0, netstandard2.0
Allen Bradley + Omron MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore EtherNet/IP / 44818 net7.0, netstandard2.0
Allen Bradley (INGEAR) MgSoftDev.IndustrialController.AllenBradley.Ingear.LogixCore EtherNet/IP net4.8 only, licensed
AB PLC-5 / SLC (INGEAR) MgSoftDev.IndustrialController.AllenBradley.Ingear.ABLinkCore EtherNet/IP net4.8 only, licensed
Emerson PAC / Series 90 MgSoftDev.IndustrialController.Emerson.ASComm.SRTPCore SRTP needs ASComm IoT installed
Simulator MgSoftDev.IndustrialController.Simulator IPC/TCP / 1588 testing, no hardware

For Allen Bradley and Omron on .NET 7+, LibPlcTag is the one to pick — it is the only provider with no commercial license attached. See docs/providers/ for the full comparison.

Quick start

No PLC needed — this runs against the simulator:

using MgSoftDev.IndustrialController.Core;
using MgSoftDev.IndustrialController.Simulator;

var factory = new SimulatorControllerFactory();

Controller plc = factory.New(new SimulatorControllerConnection("Sim1", "127.0.0.1", 1588)).Throw();
plc.Connect(persist: true);

Tag<int> tag = plc.CreateTag<int>(new TagParameters("Counter", "Int", null)).Throw();

tag.Write(42);
tag.Read();

Console.WriteLine($"{tag.Parameters.DisplayTagName} = {tag.Value}");

Start SimulatorServerApp first — it hosts the virtual PLC and creates tags on first use. Full walkthrough in Getting started.

Against a real Siemens S7-1500, only the two configuration objects change:

var factory = new S7ControllerFactory();

Controller plc = factory.New(new S7ControllerConnection("Plc1", CpuType.S71500, "192.168.0.10", rack: 0, slot: 1)).Throw();
plc.Connect(persist: true);

Tag<int> tag = plc.CreateTag<int>(
    new S7TagParameters("Counter", "Int", DataType.DataBlock, db: 17, VarType.Int, startByteAdr: 2)).Throw();

Documentation

Guide What's in it
Getting started Install, run the simulator, read and write your first tag
Core concepts Controller, ControllerFactory, Tag<T>, ITag, ControllerConfig, caching, error handling
Providers One page per vendor: connection parameters, tag addressing, enums, quirks
JSON configuration Storing the PLC and tag map in a database
Monitoring UI Binding a WPF diagnostics screen straight to controllers and tags
API reference Full public surface with signatures
Releasing How a git tag publishes the packages

Requirements

  • .NET 7+ or any .NET Standard 2.0 consumer (including .NET Framework 4.6.1+).
  • The two INGEAR providers are .NET Framework 4.8 only and need an INGEAR runtime license.
  • The Emerson provider needs ASComm IoT installed locally; the assembly is not redistributed on NuGet.

Building from source

dotnet build MgSoftDev.IndustrialController.sln -c Release

Requires Windows: two providers target net4.8 and the simulator server is WPF. The Emerson provider additionally needs ASComm IoT — override its location with -p:ASCommDir="C:\path\to\ASComm" if you installed it somewhere other than the default.

License

Copyright (c) MgSoftDev. All rights reserved.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.1 34 8/27/2026
1.2.0 38 8/27/2026
1.1.2 178 1/19/2026
1.1.1 322 5/22/2025
1.1.0 246 5/22/2025
1.0.7 334 5/14/2025
1.0.6 314 4/15/2025
1.0.5 297 4/15/2025
1.0.4 359 11/14/2023
1.0.3 206 10/6/2023
1.0.2 206 10/6/2023
1.0.0 266 9/10/2023