ZeroComm.Core 2.0.0

dotnet add package ZeroComm.Core --version 2.0.0
                    
NuGet\Install-Package ZeroComm.Core -Version 2.0.0
                    
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="ZeroComm.Core" Version="2.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ZeroComm.Core" Version="2.0.0" />
                    
Directory.Packages.props
<PackageReference Include="ZeroComm.Core" />
                    
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 ZeroComm.Core --version 2.0.0
                    
#r "nuget: ZeroComm.Core, 2.0.0"
                    
#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 ZeroComm.Core@2.0.0
                    
#: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=ZeroComm.Core&version=2.0.0
                    
Install as a Cake Addin
#tool nuget:?package=ZeroComm.Core&version=2.0.0
                    
Install as a Cake Tool

ZeroComm

ZeroPlatform Tier License: MIT .NET Multi-Targeting Protocols Zero External Dependencies Tests NuGet Version

ZeroComm is an ultra-high-performance industrial communications library, PLC master runtime, and SCADA telemetry engine for .NET with zero external dependencies. Written in 100% pure C#, it delivers asynchronous non-blocking TCP and serial transport, zero-allocation ring buffers, transaction channels, and native protocol implementations for the world's top 5 industrial automation ecosystems: Siemens S7, Mitsubishi MELSEC, Modbus TCP/RTU, Omron FINS, and Allen-Bradley CIP / EtherNet/IP.


๐ŸŒŸ Key Capabilities

  • 100% Pure C# Sovereign Drivers: No external native binaries (libplctag), no proprietary commercial DLLs (HslCommunication), no runtime bloatware.
  • Unified Industrial PLC Client (IIndustrialPlcClient): Polymorphic tag read/write API (ReadAsync<T>, WriteAsync<T>, ReadRawBytesAsync, WriteRawBytesAsync) across all vendors.
  • Intelligent Address Resolution (PlcAddressParser): Automatically compiles vendor-specific string addresses into binary memory areas, byte offsets, and bit masks at microsecond speed.
  • High-Frequency SCADA Polling Engine (PlcPollingEngine):
    • Batch Coalescing Engine (BatchCoalescingEngine): Automatically merges hundreds of scattered tag read requests into optimal contiguous block transfers to minimize network round-trips.
    • Zero-Allocation Deadband Filter (DeadbandFilterSlot): Suppresses sub-threshold sensor noise and edge jitter while enforcing periodic heartbeat liveness events.
    • ZeroUI Off-Heap Telemetry Integration: High-throughput delegate pipeline streaming directly into off-heap unmanaged memory series without boxing or GC pressure.
  • Zero-Allocation Request/Response Channel (HalfDuplexChannel): Reusable state machine eliminating per-request TaskCompletionSource, CancellationTokenSource, and closure allocations.
  • Automatic Protocol Session Renegotiation (IProtocolSession): Transparently executes protocol handshakes upon transport reconnection.

๐Ÿญ Supported PLC Ecosystems

Vendor / Protocol Physical Transport Default Port Memory Areas / Addressing Key Features
Siemens S7 ISO-on-TCP (RFC 1006 / S7comm) 102 DB1.DBD0, DB5.DBW10, M0.5, IB0, QB0 S7-300, S7-400, S7-1200, S7-1500; Big-Endian typed packing
Mitsubishi MELSEC MC Protocol (3E Binary Frame) 6000 / 5000 D100, W10, X1A, Y20, M100, B10, ZR0 Q, L, iQ-R, FX5U series; Hex/Decimal auto-radix
Modbus TCP / RTU TCP / RS485 Serial 502 / Serial 40001, 40100:F, HR100, COIL1, DI10, IR50 Function Codes 01, 02, 03, 04, 05, 06, 16; CRC16 checksum
Omron FINS FINS TCP (16-byte encapsulation) 9600 D100, CIO50, W10.01, H20, A400, E0_100 CP, CJ, CS, NX series; Auto client/server node address handshake
Allen-Bradley CIP EtherNet/IP (24-byte encapsulation) 44818 Tank1_Temp, Motor_Run, DataArray[2], Recipe.Speed ControlLogix, CompactLogix, Micro800; ANSI Extended Symbol segment

๐Ÿ“ฆ Installation

Install via the .NET CLI:

dotnet add package ZeroComm.Core

๐Ÿš€ Usage Examples

1. Unified Multi-Vendor Tag Access (IIndustrialPlcClient)

using ZeroComm.Core.Abstractions;
using ZeroComm.Core.Siemens;
using ZeroComm.Core.Transport;

// Connect to Siemens S7-1500 PLC
var transport = new AsyncTcpTransport("192.168.1.10", port: 102);
await transport.ConnectAsync();

using IIndustrialPlcClient plc = new S7TcpClient(transport, S7CpuType.S71500, rack: 0, slot: 1);
await plc.ConnectAsync();

// Strongly-typed reading across unified address syntax
float temperature = await plc.ReadAsync<float>("DB1.DBD0");
short motorSpeed = await plc.ReadAsync<short>("DB1.DBW4");
bool isRunning = await plc.ReadAsync<bool>("DB1.DBX6.0");

// Strongly-typed writing
await plc.WriteAsync<float>("DB1.DBD0", 75.5f);

2. Allen-Bradley EtherNet/IP & CIP Tag Client

using ZeroComm.Core.AllenBradley;
using ZeroComm.Core.Transport;

var transport = new AsyncTcpTransport("192.168.1.50", port: 44818);
await transport.ConnectAsync();

using var abClient = new EtherNetIpClient(transport) { Slot = 0 };
await abClient.ConnectHandshakeAsync();

// Read primitive tag values by symbol name
int processCount = await abClient.ReadInt32Async("Tag_ProcessCount");
float pressure = await abClient.ReadFloatAsync("Pressure_Tank1");
string recipeName = await abClient.ReadStringAsync("ActiveRecipe_Name");

// Write tag value
await abClient.WriteFloatAsync("Pressure_Setpoint", 12.5f);

3. Omron FINS TCP Client

using ZeroComm.Core.Omron;
using ZeroComm.Core.Transport;

var transport = new AsyncTcpTransport("192.168.1.30", port: 9600);
await transport.ConnectAsync();

using var finsClient = new FinsTcpClient(transport);
await finsClient.ConnectHandshakeAsync(); // Negotiates node address allocation

// Read/write DM words
ushort[] dmWords = await finsClient.ReadWordsAsync(FinsMemoryArea.DmWord, address: 100, wordCount: 10);
await finsClient.WriteWordsAsync(FinsMemoryArea.DmWord, address: 100, new ushort[] { 100, 200, 300 });

// Read/write single bit
bool pumpStatus = await finsClient.ReadBitAsync(FinsMemoryArea.WorkBit, address: 10, bitOffset: 2);

4. High-Frequency SCADA Polling Engine with Tag Coalescing

using ZeroComm.Core.Abstractions;
using ZeroComm.Core.Engine;
using ZeroComm.Core.Siemens;
using ZeroComm.Core.Transport;

var transport = new AsyncTcpTransport("192.168.1.10", port: 102);
await transport.ConnectAsync();

var s7Client = new S7TcpClient(transport, S7CpuType.S71500, rack: 0, slot: 1);
await s7Client.ConnectAsync();

// Initialize batch polling engine (max block size: 500 bytes, bridge gaps <= 10 bytes)
using var engine = new PlcPollingEngine(s7Client, maxContiguousBytes: 500, maxAllowedGapBytes: 10);

// Register tags with individual deadband thresholds and heartbeat liveness
engine.RegisterTag(tagId: 1, "DB1.DBD0", TagDataType.Float, deadbandAbsolute: 0.1);
engine.RegisterTag(tagId: 2, "DB1.DBD4", TagDataType.Float, deadbandAbsolute: 0.5);
engine.RegisterTag(tagId: 3, "DB1.DBW8", TagDataType.Int16, deadbandAbsolute: 1.0, heartbeatIntervalMs: 5000);
engine.RegisterTag(tagId: 4, "DB1.DBX10.0", TagDataType.Bool);

// Connect zero-allocation telemetry stream directly to ZeroUI off-heap pipeline
engine.OnTelemetrySampled = (tagId, value, timestampMs) =>
{
    // Fast path: writes straight into off-heap buffer without heap allocations or boxing
};

// Start high-speed background polling at 50ms (20 Hz)
engine.Start(intervalMs: 50);

๐Ÿ“Š Benchmark & Performance

Tested on local PLC simulation rig (10,000 requests, Release x64, .NET 8.0):

Component / Driver Operations / Sec Round-Trip Latency Allocations / Req
HalfDuplexChannel $120,000 \text{ req/sec}$ $< 0.01 \text{ ms}$ 0 bytes (steady state)
CircularRingBuffer $95\text{M bytes/sec}$ $< 0.001 \text{ ms}$ 0 bytes
Siemens S7 Client $5,200 \text{ req/sec}$ $0.19 \text{ ms}$ Stack-allocated PDU
MELSEC 3E Client $4,800 \text{ req/sec}$ $0.21 \text{ ms}$ Stack-allocated frame
Omron FINS TCP $4,600 \text{ req/sec}$ $0.22 \text{ ms}$ Reusable channel buffer
Allen-Bradley CIP $4,300 \text{ req/sec}$ $0.23 \text{ ms}$ Reusable channel buffer
SCADA Polling Engine $150,000 \text{ samples/sec}$ $< 0.05 \text{ ms}$ 0 bytes (unpacked via Span)

๐Ÿ“œ Release History

Version Release Date Key Milestones & Highlights
v2.0.0 2026-09-29 Major Architectural Sovereign Release:<br/>โ€ข Universal Drivers: Native pure C# Omron FINS TCP (FinsTcpClient) & Allen-Bradley CIP / EtherNet/IP (EtherNetIpClient) with ANSI Extended Symbol parsing and backplane routing.<br/>โ€ข Unified PLC Abstraction: IIndustrialPlcClient and compiled PlcAddressParser covering Siemens, Mitsubishi, Modbus, Omron, and Allen-Bradley.<br/>โ€ข Zero-Allocation Core: HalfDuplexChannel<T>, lock-free circular buffer read paths, and automatic IProtocolSession renegotiation.<br/>โ€ข SCADA Polling Engine: BatchCoalescingEngine (contiguous memory merging), DeadbandFilterSlot (noise & heartbeat), and zero-allocation telemetry pipeline.<br/>โ€ข 102 Automated Tests passing (100% green, 0 warnings) across .NET 8.0, .NET Standard 2.0, and .NET Framework 4.6.2.
v1.1.0 2026-09-16 P2P Edge Discovery & STUN Client:<br/>โ€ข Integrated RFC 5389 StunClient for WAN IP binding discovery & NAT traversal.<br/>โ€ข Zero-allocation binary transaction multiplexing.
v1.0.0 2026-09-09 Initial Sovereign Release:<br/>โ€ข Pure C# Modbus TCP/RTU Master, Mitsubishi 3E Binary, Omron FINS drivers.<br/>โ€ข AsyncTcpTransport with CircularRingBuffer and hardware CRC16/CRC32.

๐Ÿ“„ License

MIT License ยฉ 2026 Phong Vรต. Part of the ZeroPlatform project.

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 was computed.  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 is compatible.  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 is compatible.  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 (1)

Showing the top 1 NuGet packages that depend on ZeroComm.Core:

Package Downloads
ZeroPipeline.Nodes

Industrial Concrete Pipeline Nodes: Machine Vision, Metrology, Barcode/QR Decoders, AI Inference, Modbus PLC, and Gorilla TimeSeries Logging for ZeroPlatform.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.0 104 9/29/2026
1.2.0 128 9/22/2026
1.1.0 99 9/16/2026
1.0.0 149 9/9/2026