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
<PackageReference Include="MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore" Version="1.2.1" />
<PackageVersion Include="MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore" Version="1.2.1" />
<PackageReference Include="MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore" />
paket add MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore --version 1.2.1
#r "nuget: MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore, 1.2.1"
#:package MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore@1.2.1
#addin nuget:?package=MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore&version=1.2.1
#tool nuget:?package=MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNetCore&version=1.2.1
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.
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
Returninginstead of throwing, so a dropped PLC is a value you handle, not an exception that takes down a loop. - Bindable state.
ControllerandTag<T>implementINotifyPropertyChanged, so a WPF view can bind straight totag.Valueorplc.IsConnectedwith 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 | Versions 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. |
-
.NETStandard 2.0
- libplctag (>= 1.5.2)
- MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNet (>= 1.2.1)
-
net7.0
- libplctag (>= 1.5.2)
- MgSoftDev.IndustrialController.AllenBradley.LibPlcTagNet (>= 1.2.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.