Repository files navigation

📡 ModbusNet: A .NET Library for Modbus Communication

.NETLicensePlatform

A modern, lightweight, and production-ready .NET library for communicating with Modbus devices using Modbus ASCII (Serial), Modbus RTU (Serial), and Modbus TCP/IP protocols.

Built for industrial automation, IoT gateways, SCADA systems, and embedded .NET applications.


✅ Features

  • Three transport modes:
    • Modbus ASCII over serial ports (with LRC error checking)
    • Modbus RTU over serial ports (with CRC-16 and inter-frame timing)
    • Modbus TCP over Ethernet (with MBAP framing and async I/O)
  • Full function code support:
    • Read/Write Coils & Discrete Inputs
    • Read/Write Holding & Input Registers
    • Mask Write, Read-Write Multiple, FIFO Queue
    • File Record Access, Diagnostics (serial-only), Device Identification
  • Robust error handling:
    • Automatic exception decoding (Modbus exception codes)
    • LRC/CRC validation with custom exceptions (ModbusExceptionLRC, ModbusExceptionCRC)
  • Thread-safe & async-ready:
    • SendRequestReceiveResponseAsync() for TCP and ASCII
    • Semaphore-locked writes to prevent frame corruption
  • Clean architecture:
    • IModbusMaster interface for testability
    • Factory-based creation (ModbusFactory)
    • Settings-driven configuration (ModbusSettings)
  • Extensible design:
    • Easy to add new function codes or transports

🚀 Quick Start

1. Configure Settings

varsettings=newModbusSettings{ConnectionType=ConnectionType.TCP,IpAddress="192.168.1.10",Port=502,RetryCount=3,RetryDelayMs=100};

For serial (RTU or ASCII):

varsettings=newModbusSettings{ConnectionType=ConnectionType.RTU,// or ASCIIPortName=PortName.COM4,BaudRate=9600,Parity=Parity.Even,DataBits=DataBits.db8,StopBits=StopBits.One};

2. Create a Master

// TCPvarmaster=ModbusFactory.CreateTcpMaster(settings);// RTUvarmaster=ModbusFactory.CreateRtuMaster(settings);// ASCIIvarmaster=ModbusFactory.CreateAsciiMaster(settings);

3. Use It!

// Read 10 holding registers starting at address 0ushort[]registers=master.ReadMultipleHoldingRegisters(slaveAddress:1,startAddress:0,numberOfPoints:10);// Write a single coilmaster.WriteSingleCoil(slaveAddress:1,address:5,value:true);// Read-Write atomicallyushort[]readData=master.ReadWriteMultipleRegisters(slaveAddress:1,startReadAddress:0,numberOfPointsToRead:3,startWriteAddress:10,writeData:newushort[]{100,200,300});

💡 All methods validate inputs, handle retries, and throw meaningful exceptions on error.

🧩 Supported Function Codes

The ModbusNet library provides full support for standard Modbus function codes across all three transport modes: ASCII, RTU, and TCP. Operations are organised by data type and use case, enabling robust communication with industrial devices.

CategoryFunction CodeMethod Name
Discrete Inputs0x02ReadDiscreteInputs()
Coils0x01ReadCoils()
0x05WriteSingleCoil()
0x0FWriteMultipleCoils()
Input Registers0x04ReadInputRegisters()
Holding Registers0x03ReadMultipleHoldingRegisters()
0x06WriteSingleHoldingRegister()
0x10WriteMultipleHoldingRegisters()
0x17ReadWriteMultipleRegisters()
0x16MaskWriteRegister()
0x18ReadFifoQueue()
File Record0x14/0x1ReadFileRecord(), WriteFileRecord()
Diagnostics (Serial)0x07–0x11Serial-only diagnostics
Device ID0x2BReadDeviceIdentification()

📌 Diagnostics (0x07, 0x08, etc.) are only available in serial modes (RTU/ASCII).

⚙️ Configuration (ModbusSettings)

PropertyDescription
ConnectionTypeTCP, RTU or ASCII
IpAddress, PortFor TCP mode
PortName, BaudRate, etcFor serial modes
AsciiStartDelimiterUsually ":"
AsciiEndDelimiterUsually "\r\n"
RtuInterCharTimeMsInter-character timeout (auto-calculated if baud < 19200)
RtuInterFrameTimeMsInter-frame delay
RetryCountMax retries on timeout (default: 3)
RetryDelayMsDelay between retries (default: 50 ms)

🔄 RTU timing is automatically calculated for baud rates below 19200 per Modbus spec.

📦 Project Structure

ModbusNet/
├── ModbusNet/ # Core library (IModbusMaster, transports, messages, utils)
├── ModbusNet.Samples/ # Console examples
├── ModbusUI/ # WinForms test UI └── ModbusNet.Tests/ # Unit tests (not required for usage)

Testing & Sample Codes

The solution includes:

  • A WinForms GUI (ModbusUI) for visual testing of all three protocols.
  • A sample console project (ModbusNet.Samples) showing basic usage patterns.

🔒 The core library has no UI dependencies — the GUI is purely for testing/demo.

License

Distributed under the MIT License. See LICENSE for details.

🙌 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest enhancements
  • Implement other function codes
  • Improve documentation

📬 Need Help?

Open an issue or contact the maintainers.

ModbusNet brings industrial-grade Modbus communication to modern .NET developers with simplicity, correctness, and performance.

About

ModbusNet is a C# implementation of the Modbus protocol.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

📡 ModbusNet: A .NET Library for Modbus Communication

.NETLicensePlatform

A modern, lightweight, and production-ready .NET library for communicating with Modbus devices using Modbus ASCII (Serial), Modbus RTU (Serial), and Modbus TCP/IP protocols.

Built for industrial automation, IoT gateways, SCADA systems, and embedded .NET applications.


✅ Features

  • Three transport modes:
    • Modbus ASCII over serial ports (with LRC error checking)
    • Modbus RTU over serial ports (with CRC-16 and inter-frame timing)
    • Modbus TCP over Ethernet (with MBAP framing and async I/O)
  • Full function code support:
    • Read/Write Coils & Discrete Inputs
    • Read/Write Holding & Input Registers
    • Mask Write, Read-Write Multiple, FIFO Queue
    • File Record Access, Diagnostics (serial-only), Device Identification
  • Robust error handling:
    • Automatic exception decoding (Modbus exception codes)
    • LRC/CRC validation with custom exceptions (ModbusExceptionLRC, ModbusExceptionCRC)
  • Thread-safe & async-ready:
    • SendRequestReceiveResponseAsync() for TCP and ASCII
    • Semaphore-locked writes to prevent frame corruption
  • Clean architecture:
    • IModbusMaster interface for testability
    • Factory-based creation (ModbusFactory)
    • Settings-driven configuration (ModbusSettings)
  • Extensible design:
    • Easy to add new function codes or transports

🚀 Quick Start

1. Configure Settings

varsettings=newModbusSettings{ConnectionType=ConnectionType.TCP,IpAddress="192.168.1.10",Port=502,RetryCount=3,RetryDelayMs=100};

For serial (RTU or ASCII):

varsettings=newModbusSettings{ConnectionType=ConnectionType.RTU,// or ASCIIPortName=PortName.COM4,BaudRate=9600,Parity=Parity.Even,DataBits=DataBits.db8,StopBits=StopBits.One};

2. Create a Master

// TCPvarmaster=ModbusFactory.CreateTcpMaster(settings);// RTUvarmaster=ModbusFactory.CreateRtuMaster(settings);// ASCIIvarmaster=ModbusFactory.CreateAsciiMaster(settings);

3. Use It!

// Read 10 holding registers starting at address 0ushort[]registers=master.ReadMultipleHoldingRegisters(slaveAddress:1,startAddress:0,numberOfPoints:10);// Write a single coilmaster.WriteSingleCoil(slaveAddress:1,address:5,value:true);// Read-Write atomicallyushort[]readData=master.ReadWriteMultipleRegisters(slaveAddress:1,startReadAddress:0,numberOfPointsToRead:3,startWriteAddress:10,writeData:newushort[]{100,200,300});

💡 All methods validate inputs, handle retries, and throw meaningful exceptions on error.

🧩 Supported Function Codes

The ModbusNet library provides full support for standard Modbus function codes across all three transport modes: ASCII, RTU, and TCP. Operations are organised by data type and use case, enabling robust communication with industrial devices.

CategoryFunction CodeMethod Name
Discrete Inputs0x02ReadDiscreteInputs()
Coils0x01ReadCoils()
0x05WriteSingleCoil()
0x0FWriteMultipleCoils()
Input Registers0x04ReadInputRegisters()
Holding Registers0x03ReadMultipleHoldingRegisters()
0x06WriteSingleHoldingRegister()
0x10WriteMultipleHoldingRegisters()
0x17ReadWriteMultipleRegisters()
0x16MaskWriteRegister()
0x18ReadFifoQueue()
File Record0x14/0x1ReadFileRecord(), WriteFileRecord()
Diagnostics (Serial)0x07–0x11Serial-only diagnostics
Device ID0x2BReadDeviceIdentification()

📌 Diagnostics (0x07, 0x08, etc.) are only available in serial modes (RTU/ASCII).

⚙️ Configuration (ModbusSettings)

PropertyDescription
ConnectionTypeTCP, RTU or ASCII
IpAddress, PortFor TCP mode
PortName, BaudRate, etcFor serial modes
AsciiStartDelimiterUsually ":"
AsciiEndDelimiterUsually "\r\n"
RtuInterCharTimeMsInter-character timeout (auto-calculated if baud < 19200)
RtuInterFrameTimeMsInter-frame delay
RetryCountMax retries on timeout (default: 3)
RetryDelayMsDelay between retries (default: 50 ms)

🔄 RTU timing is automatically calculated for baud rates below 19200 per Modbus spec.

📦 Project Structure

ModbusNet/
├── ModbusNet/ # Core library (IModbusMaster, transports, messages, utils)
├── ModbusNet.Samples/ # Console examples
├── ModbusUI/ # WinForms test UI └── ModbusNet.Tests/ # Unit tests (not required for usage)

Testing & Sample Codes

The solution includes:

  • A WinForms GUI (ModbusUI) for visual testing of all three protocols.
  • A sample console project (ModbusNet.Samples) showing basic usage patterns.

🔒 The core library has no UI dependencies — the GUI is purely for testing/demo.

License

Distributed under the MIT License. See LICENSE for details.

🙌 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest enhancements
  • Implement other function codes
  • Improve documentation

📬 Need Help?

Open an issue or contact the maintainers.

ModbusNet brings industrial-grade Modbus communication to modern .NET developers with simplicity, correctness, and performance.

About

ModbusNet is a C# implementation of the Modbus protocol.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

📡 ModbusNet: A .NET Library for Modbus Communication

.NETLicensePlatform

A modern, lightweight, and production-ready .NET library for communicating with Modbus devices using Modbus ASCII (Serial), Modbus RTU (Serial), and Modbus TCP/IP protocols.

Built for industrial automation, IoT gateways, SCADA systems, and embedded .NET applications.


✅ Features

  • Three transport modes:
    • Modbus ASCII over serial ports (with LRC error checking)
    • Modbus RTU over serial ports (with CRC-16 and inter-frame timing)
    • Modbus TCP over Ethernet (with MBAP framing and async I/O)
  • Full function code support:
    • Read/Write Coils & Discrete Inputs
    • Read/Write Holding & Input Registers
    • Mask Write, Read-Write Multiple, FIFO Queue
    • File Record Access, Diagnostics (serial-only), Device Identification
  • Robust error handling:
    • Automatic exception decoding (Modbus exception codes)
    • LRC/CRC validation with custom exceptions (ModbusExceptionLRC, ModbusExceptionCRC)
  • Thread-safe & async-ready:
    • SendRequestReceiveResponseAsync() for TCP and ASCII
    • Semaphore-locked writes to prevent frame corruption
  • Clean architecture:
    • IModbusMaster interface for testability
    • Factory-based creation (ModbusFactory)
    • Settings-driven configuration (ModbusSettings)
  • Extensible design:
    • Easy to add new function codes or transports

🚀 Quick Start

1. Configure Settings

varsettings=newModbusSettings{ConnectionType=ConnectionType.TCP,IpAddress="192.168.1.10",Port=502,RetryCount=3,RetryDelayMs=100};

For serial (RTU or ASCII):

varsettings=newModbusSettings{ConnectionType=ConnectionType.RTU,// or ASCIIPortName=PortName.COM4,BaudRate=9600,Parity=Parity.Even,DataBits=DataBits.db8,StopBits=StopBits.One};

2. Create a Master

// TCPvarmaster=ModbusFactory.CreateTcpMaster(settings);// RTUvarmaster=ModbusFactory.CreateRtuMaster(settings);// ASCIIvarmaster=ModbusFactory.CreateAsciiMaster(settings);

3. Use It!

// Read 10 holding registers starting at address 0ushort[]registers=master.ReadMultipleHoldingRegisters(slaveAddress:1,startAddress:0,numberOfPoints:10);// Write a single coilmaster.WriteSingleCoil(slaveAddress:1,address:5,value:true);// Read-Write atomicallyushort[]readData=master.ReadWriteMultipleRegisters(slaveAddress:1,startReadAddress:0,numberOfPointsToRead:3,startWriteAddress:10,writeData:newushort[]{100,200,300});

💡 All methods validate inputs, handle retries, and throw meaningful exceptions on error.

🧩 Supported Function Codes

The ModbusNet library provides full support for standard Modbus function codes across all three transport modes: ASCII, RTU, and TCP. Operations are organised by data type and use case, enabling robust communication with industrial devices.

CategoryFunction CodeMethod Name
Discrete Inputs0x02ReadDiscreteInputs()
Coils0x01ReadCoils()
0x05WriteSingleCoil()
0x0FWriteMultipleCoils()
Input Registers0x04ReadInputRegisters()
Holding Registers0x03ReadMultipleHoldingRegisters()
0x06WriteSingleHoldingRegister()
0x10WriteMultipleHoldingRegisters()
0x17ReadWriteMultipleRegisters()
0x16MaskWriteRegister()
0x18ReadFifoQueue()
File Record0x14/0x1ReadFileRecord(), WriteFileRecord()
Diagnostics (Serial)0x07–0x11Serial-only diagnostics
Device ID0x2BReadDeviceIdentification()

📌 Diagnostics (0x07, 0x08, etc.) are only available in serial modes (RTU/ASCII).

⚙️ Configuration (ModbusSettings)

PropertyDescription
ConnectionTypeTCP, RTU or ASCII
IpAddress, PortFor TCP mode
PortName, BaudRate, etcFor serial modes
AsciiStartDelimiterUsually ":"
AsciiEndDelimiterUsually "\r\n"
RtuInterCharTimeMsInter-character timeout (auto-calculated if baud < 19200)
RtuInterFrameTimeMsInter-frame delay
RetryCountMax retries on timeout (default: 3)
RetryDelayMsDelay between retries (default: 50 ms)

🔄 RTU timing is automatically calculated for baud rates below 19200 per Modbus spec.

📦 Project Structure

ModbusNet/
├── ModbusNet/ # Core library (IModbusMaster, transports, messages, utils)
├── ModbusNet.Samples/ # Console examples
├── ModbusUI/ # WinForms test UI └── ModbusNet.Tests/ # Unit tests (not required for usage)

Testing & Sample Codes

The solution includes:

  • A WinForms GUI (ModbusUI) for visual testing of all three protocols.
  • A sample console project (ModbusNet.Samples) showing basic usage patterns.

🔒 The core library has no UI dependencies — the GUI is purely for testing/demo.

License

Distributed under the MIT License. See LICENSE for details.

🙌 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest enhancements
  • Implement other function codes
  • Improve documentation

📬 Need Help?

Open an issue or contact the maintainers.

ModbusNet brings industrial-grade Modbus communication to modern .NET developers with simplicity, correctness, and performance.

About

ModbusNet is a C# implementation of the Modbus protocol.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

📡 ModbusNet: A .NET Library for Modbus Communication

.NETLicensePlatform

A modern, lightweight, and production-ready .NET library for communicating with Modbus devices using Modbus ASCII (Serial), Modbus RTU (Serial), and Modbus TCP/IP protocols.

Built for industrial automation, IoT gateways, SCADA systems, and embedded .NET applications.


✅ Features

  • Three transport modes:
    • Modbus ASCII over serial ports (with LRC error checking)
    • Modbus RTU over serial ports (with CRC-16 and inter-frame timing)
    • Modbus TCP over Ethernet (with MBAP framing and async I/O)
  • Full function code support:
    • Read/Write Coils & Discrete Inputs
    • Read/Write Holding & Input Registers
    • Mask Write, Read-Write Multiple, FIFO Queue
    • File Record Access, Diagnostics (serial-only), Device Identification
  • Robust error handling:
    • Automatic exception decoding (Modbus exception codes)
    • LRC/CRC validation with custom exceptions (ModbusExceptionLRC, ModbusExceptionCRC)
  • Thread-safe & async-ready:
    • SendRequestReceiveResponseAsync() for TCP and ASCII
    • Semaphore-locked writes to prevent frame corruption
  • Clean architecture:
    • IModbusMaster interface for testability
    • Factory-based creation (ModbusFactory)
    • Settings-driven configuration (ModbusSettings)
  • Extensible design:
    • Easy to add new function codes or transports

🚀 Quick Start

1. Configure Settings

varsettings=newModbusSettings{ConnectionType=ConnectionType.TCP,IpAddress="192.168.1.10",Port=502,RetryCount=3,RetryDelayMs=100};

For serial (RTU or ASCII):

varsettings=newModbusSettings{ConnectionType=ConnectionType.RTU,// or ASCIIPortName=PortName.COM4,BaudRate=9600,Parity=Parity.Even,DataBits=DataBits.db8,StopBits=StopBits.One};

2. Create a Master

// TCPvarmaster=ModbusFactory.CreateTcpMaster(settings);// RTUvarmaster=ModbusFactory.CreateRtuMaster(settings);// ASCIIvarmaster=ModbusFactory.CreateAsciiMaster(settings);

3. Use It!

// Read 10 holding registers starting at address 0ushort[]registers=master.ReadMultipleHoldingRegisters(slaveAddress:1,startAddress:0,numberOfPoints:10);// Write a single coilmaster.WriteSingleCoil(slaveAddress:1,address:5,value:true);// Read-Write atomicallyushort[]readData=master.ReadWriteMultipleRegisters(slaveAddress:1,startReadAddress:0,numberOfPointsToRead:3,startWriteAddress:10,writeData:newushort[]{100,200,300});

💡 All methods validate inputs, handle retries, and throw meaningful exceptions on error.

🧩 Supported Function Codes

The ModbusNet library provides full support for standard Modbus function codes across all three transport modes: ASCII, RTU, and TCP. Operations are organised by data type and use case, enabling robust communication with industrial devices.

CategoryFunction CodeMethod Name
Discrete Inputs0x02ReadDiscreteInputs()
Coils0x01ReadCoils()
0x05WriteSingleCoil()
0x0FWriteMultipleCoils()
Input Registers0x04ReadInputRegisters()
Holding Registers0x03ReadMultipleHoldingRegisters()
0x06WriteSingleHoldingRegister()
0x10WriteMultipleHoldingRegisters()
0x17ReadWriteMultipleRegisters()
0x16MaskWriteRegister()
0x18ReadFifoQueue()
File Record0x14/0x1ReadFileRecord(), WriteFileRecord()
Diagnostics (Serial)0x07–0x11Serial-only diagnostics
Device ID0x2BReadDeviceIdentification()

📌 Diagnostics (0x07, 0x08, etc.) are only available in serial modes (RTU/ASCII).

⚙️ Configuration (ModbusSettings)

PropertyDescription
ConnectionTypeTCP, RTU or ASCII
IpAddress, PortFor TCP mode
PortName, BaudRate, etcFor serial modes
AsciiStartDelimiterUsually ":"
AsciiEndDelimiterUsually "\r\n"
RtuInterCharTimeMsInter-character timeout (auto-calculated if baud < 19200)
RtuInterFrameTimeMsInter-frame delay
RetryCountMax retries on timeout (default: 3)
RetryDelayMsDelay between retries (default: 50 ms)

🔄 RTU timing is automatically calculated for baud rates below 19200 per Modbus spec.

📦 Project Structure

ModbusNet/
├── ModbusNet/ # Core library (IModbusMaster, transports, messages, utils)
├── ModbusNet.Samples/ # Console examples
├── ModbusUI/ # WinForms test UI └── ModbusNet.Tests/ # Unit tests (not required for usage)

Testing & Sample Codes

The solution includes:

  • A WinForms GUI (ModbusUI) for visual testing of all three protocols.
  • A sample console project (ModbusNet.Samples) showing basic usage patterns.

🔒 The core library has no UI dependencies — the GUI is purely for testing/demo.

License

Distributed under the MIT License. See LICENSE for details.

🙌 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest enhancements
  • Implement other function codes
  • Improve documentation

📬 Need Help?

Open an issue or contact the maintainers.

ModbusNet brings industrial-grade Modbus communication to modern .NET developers with simplicity, correctness, and performance.

About

ModbusNet is a C# implementation of the Modbus protocol.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

📡 ModbusNet: A .NET Library for Modbus Communication

.NETLicensePlatform

A modern, lightweight, and production-ready .NET library for communicating with Modbus devices using Modbus ASCII (Serial), Modbus RTU (Serial), and Modbus TCP/IP protocols.

Built for industrial automation, IoT gateways, SCADA systems, and embedded .NET applications.


✅ Features

  • Three transport modes:
    • Modbus ASCII over serial ports (with LRC error checking)
    • Modbus RTU over serial ports (with CRC-16 and inter-frame timing)
    • Modbus TCP over Ethernet (with MBAP framing and async I/O)
  • Full function code support:
    • Read/Write Coils & Discrete Inputs
    • Read/Write Holding & Input Registers
    • Mask Write, Read-Write Multiple, FIFO Queue
    • File Record Access, Diagnostics (serial-only), Device Identification
  • Robust error handling:
    • Automatic exception decoding (Modbus exception codes)
    • LRC/CRC validation with custom exceptions (ModbusExceptionLRC, ModbusExceptionCRC)
  • Thread-safe & async-ready:
    • SendRequestReceiveResponseAsync() for TCP and ASCII
    • Semaphore-locked writes to prevent frame corruption
  • Clean architecture:
    • IModbusMaster interface for testability
    • Factory-based creation (ModbusFactory)
    • Settings-driven configuration (ModbusSettings)
  • Extensible design:
    • Easy to add new function codes or transports

🚀 Quick Start

1. Configure Settings

varsettings=newModbusSettings{ConnectionType=ConnectionType.TCP,IpAddress="192.168.1.10",Port=502,RetryCount=3,RetryDelayMs=100};

For serial (RTU or ASCII):

varsettings=newModbusSettings{ConnectionType=ConnectionType.RTU,// or ASCIIPortName=PortName.COM4,BaudRate=9600,Parity=Parity.Even,DataBits=DataBits.db8,StopBits=StopBits.One};

2. Create a Master

// TCPvarmaster=ModbusFactory.CreateTcpMaster(settings);// RTUvarmaster=ModbusFactory.CreateRtuMaster(settings);// ASCIIvarmaster=ModbusFactory.CreateAsciiMaster(settings);

3. Use It!

// Read 10 holding registers starting at address 0ushort[]registers=master.ReadMultipleHoldingRegisters(slaveAddress:1,startAddress:0,numberOfPoints:10);// Write a single coilmaster.WriteSingleCoil(slaveAddress:1,address:5,value:true);// Read-Write atomicallyushort[]readData=master.ReadWriteMultipleRegisters(slaveAddress:1,startReadAddress:0,numberOfPointsToRead:3,startWriteAddress:10,writeData:newushort[]{100,200,300});

💡 All methods validate inputs, handle retries, and throw meaningful exceptions on error.

🧩 Supported Function Codes

The ModbusNet library provides full support for standard Modbus function codes across all three transport modes: ASCII, RTU, and TCP. Operations are organised by data type and use case, enabling robust communication with industrial devices.

CategoryFunction CodeMethod Name
Discrete Inputs0x02ReadDiscreteInputs()
Coils0x01ReadCoils()
0x05WriteSingleCoil()
0x0FWriteMultipleCoils()
Input Registers0x04ReadInputRegisters()
Holding Registers0x03ReadMultipleHoldingRegisters()
0x06WriteSingleHoldingRegister()
0x10WriteMultipleHoldingRegisters()
0x17ReadWriteMultipleRegisters()
0x16MaskWriteRegister()
0x18ReadFifoQueue()
File Record0x14/0x1ReadFileRecord(), WriteFileRecord()
Diagnostics (Serial)0x07–0x11Serial-only diagnostics
Device ID0x2BReadDeviceIdentification()

📌 Diagnostics (0x07, 0x08, etc.) are only available in serial modes (RTU/ASCII).

⚙️ Configuration (ModbusSettings)

PropertyDescription
ConnectionTypeTCP, RTU or ASCII
IpAddress, PortFor TCP mode
PortName, BaudRate, etcFor serial modes
AsciiStartDelimiterUsually ":"
AsciiEndDelimiterUsually "\r\n"
RtuInterCharTimeMsInter-character timeout (auto-calculated if baud < 19200)
RtuInterFrameTimeMsInter-frame delay
RetryCountMax retries on timeout (default: 3)
RetryDelayMsDelay between retries (default: 50 ms)

🔄 RTU timing is automatically calculated for baud rates below 19200 per Modbus spec.

📦 Project Structure

ModbusNet/
├── ModbusNet/ # Core library (IModbusMaster, transports, messages, utils)
├── ModbusNet.Samples/ # Console examples
├── ModbusUI/ # WinForms test UI └── ModbusNet.Tests/ # Unit tests (not required for usage)

Testing & Sample Codes

The solution includes:

  • A WinForms GUI (ModbusUI) for visual testing of all three protocols.
  • A sample console project (ModbusNet.Samples) showing basic usage patterns.

🔒 The core library has no UI dependencies — the GUI is purely for testing/demo.

License

Distributed under the MIT License. See LICENSE for details.

🙌 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest enhancements
  • Implement other function codes
  • Improve documentation

📬 Need Help?

Open an issue or contact the maintainers.

ModbusNet brings industrial-grade Modbus communication to modern .NET developers with simplicity, correctness, and performance.

About

ModbusNet is a C# implementation of the Modbus protocol.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

📡 ModbusNet: A .NET Library for Modbus Communication

.NETLicensePlatform

A modern, lightweight, and production-ready .NET library for communicating with Modbus devices using Modbus ASCII (Serial), Modbus RTU (Serial), and Modbus TCP/IP protocols.

Built for industrial automation, IoT gateways, SCADA systems, and embedded .NET applications.


✅ Features

  • Three transport modes:
    • Modbus ASCII over serial ports (with LRC error checking)
    • Modbus RTU over serial ports (with CRC-16 and inter-frame timing)
    • Modbus TCP over Ethernet (with MBAP framing and async I/O)
  • Full function code support:
    • Read/Write Coils & Discrete Inputs
    • Read/Write Holding & Input Registers
    • Mask Write, Read-Write Multiple, FIFO Queue
    • File Record Access, Diagnostics (serial-only), Device Identification
  • Robust error handling:
    • Automatic exception decoding (Modbus exception codes)
    • LRC/CRC validation with custom exceptions (ModbusExceptionLRC, ModbusExceptionCRC)
  • Thread-safe & async-ready:
    • SendRequestReceiveResponseAsync() for TCP and ASCII
    • Semaphore-locked writes to prevent frame corruption
  • Clean architecture:
    • IModbusMaster interface for testability
    • Factory-based creation (ModbusFactory)
    • Settings-driven configuration (ModbusSettings)
  • Extensible design:
    • Easy to add new function codes or transports

🚀 Quick Start

1. Configure Settings

varsettings=newModbusSettings{ConnectionType=ConnectionType.TCP,IpAddress="192.168.1.10",Port=502,RetryCount=3,RetryDelayMs=100};

For serial (RTU or ASCII):

varsettings=newModbusSettings{ConnectionType=ConnectionType.RTU,// or ASCIIPortName=PortName.COM4,BaudRate=9600,Parity=Parity.Even,DataBits=DataBits.db8,StopBits=StopBits.One};

2. Create a Master

// TCPvarmaster=ModbusFactory.CreateTcpMaster(settings);// RTUvarmaster=ModbusFactory.CreateRtuMaster(settings);// ASCIIvarmaster=ModbusFactory.CreateAsciiMaster(settings);

3. Use It!

// Read 10 holding registers starting at address 0ushort[]registers=master.ReadMultipleHoldingRegisters(slaveAddress:1,startAddress:0,numberOfPoints:10);// Write a single coilmaster.WriteSingleCoil(slaveAddress:1,address:5,value:true);// Read-Write atomicallyushort[]readData=master.ReadWriteMultipleRegisters(slaveAddress:1,startReadAddress:0,numberOfPointsToRead:3,startWriteAddress:10,writeData:newushort[]{100,200,300});

💡 All methods validate inputs, handle retries, and throw meaningful exceptions on error.

🧩 Supported Function Codes

The ModbusNet library provides full support for standard Modbus function codes across all three transport modes: ASCII, RTU, and TCP. Operations are organised by data type and use case, enabling robust communication with industrial devices.

CategoryFunction CodeMethod Name
Discrete Inputs0x02ReadDiscreteInputs()
Coils0x01ReadCoils()
0x05WriteSingleCoil()
0x0FWriteMultipleCoils()
Input Registers0x04ReadInputRegisters()
Holding Registers0x03ReadMultipleHoldingRegisters()
0x06WriteSingleHoldingRegister()
0x10WriteMultipleHoldingRegisters()
0x17ReadWriteMultipleRegisters()
0x16MaskWriteRegister()
0x18ReadFifoQueue()
File Record0x14/0x1ReadFileRecord(), WriteFileRecord()
Diagnostics (Serial)0x07–0x11Serial-only diagnostics
Device ID0x2BReadDeviceIdentification()

📌 Diagnostics (0x07, 0x08, etc.) are only available in serial modes (RTU/ASCII).

⚙️ Configuration (ModbusSettings)

PropertyDescription
ConnectionTypeTCP, RTU or ASCII
IpAddress, PortFor TCP mode
PortName, BaudRate, etcFor serial modes
AsciiStartDelimiterUsually ":"
AsciiEndDelimiterUsually "\r\n"
RtuInterCharTimeMsInter-character timeout (auto-calculated if baud < 19200)
RtuInterFrameTimeMsInter-frame delay
RetryCountMax retries on timeout (default: 3)
RetryDelayMsDelay between retries (default: 50 ms)

🔄 RTU timing is automatically calculated for baud rates below 19200 per Modbus spec.

📦 Project Structure

ModbusNet/
├── ModbusNet/ # Core library (IModbusMaster, transports, messages, utils)
├── ModbusNet.Samples/ # Console examples
├── ModbusUI/ # WinForms test UI └── ModbusNet.Tests/ # Unit tests (not required for usage)

Testing & Sample Codes

The solution includes:

  • A WinForms GUI (ModbusUI) for visual testing of all three protocols.
  • A sample console project (ModbusNet.Samples) showing basic usage patterns.

🔒 The core library has no UI dependencies — the GUI is purely for testing/demo.

License

Distributed under the MIT License. See LICENSE for details.

🙌 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest enhancements
  • Implement other function codes
  • Improve documentation

📬 Need Help?

Open an issue or contact the maintainers.

ModbusNet brings industrial-grade Modbus communication to modern .NET developers with simplicity, correctness, and performance.

About

ModbusNet is a C# implementation of the Modbus protocol.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

📡 ModbusNet: A .NET Library for Modbus Communication

.NETLicensePlatform

A modern, lightweight, and production-ready .NET library for communicating with Modbus devices using Modbus ASCII (Serial), Modbus RTU (Serial), and Modbus TCP/IP protocols.

Built for industrial automation, IoT gateways, SCADA systems, and embedded .NET applications.


✅ Features

  • Three transport modes:
    • Modbus ASCII over serial ports (with LRC error checking)
    • Modbus RTU over serial ports (with CRC-16 and inter-frame timing)
    • Modbus TCP over Ethernet (with MBAP framing and async I/O)
  • Full function code support:
    • Read/Write Coils & Discrete Inputs
    • Read/Write Holding & Input Registers
    • Mask Write, Read-Write Multiple, FIFO Queue
    • File Record Access, Diagnostics (serial-only), Device Identification
  • Robust error handling:
    • Automatic exception decoding (Modbus exception codes)
    • LRC/CRC validation with custom exceptions (ModbusExceptionLRC, ModbusExceptionCRC)
  • Thread-safe & async-ready:
    • SendRequestReceiveResponseAsync() for TCP and ASCII
    • Semaphore-locked writes to prevent frame corruption
  • Clean architecture:
    • IModbusMaster interface for testability
    • Factory-based creation (ModbusFactory)
    • Settings-driven configuration (ModbusSettings)
  • Extensible design:
    • Easy to add new function codes or transports

🚀 Quick Start

1. Configure Settings

varsettings=newModbusSettings{ConnectionType=ConnectionType.TCP,IpAddress="192.168.1.10",Port=502,RetryCount=3,RetryDelayMs=100};

For serial (RTU or ASCII):

varsettings=newModbusSettings{ConnectionType=ConnectionType.RTU,// or ASCIIPortName=PortName.COM4,BaudRate=9600,Parity=Parity.Even,DataBits=DataBits.db8,StopBits=StopBits.One};

2. Create a Master

// TCPvarmaster=ModbusFactory.CreateTcpMaster(settings);// RTUvarmaster=ModbusFactory.CreateRtuMaster(settings);// ASCIIvarmaster=ModbusFactory.CreateAsciiMaster(settings);

3. Use It!

// Read 10 holding registers starting at address 0ushort[]registers=master.ReadMultipleHoldingRegisters(slaveAddress:1,startAddress:0,numberOfPoints:10);// Write a single coilmaster.WriteSingleCoil(slaveAddress:1,address:5,value:true);// Read-Write atomicallyushort[]readData=master.ReadWriteMultipleRegisters(slaveAddress:1,startReadAddress:0,numberOfPointsToRead:3,startWriteAddress:10,writeData:newushort[]{100,200,300});

💡 All methods validate inputs, handle retries, and throw meaningful exceptions on error.

🧩 Supported Function Codes

The ModbusNet library provides full support for standard Modbus function codes across all three transport modes: ASCII, RTU, and TCP. Operations are organised by data type and use case, enabling robust communication with industrial devices.

CategoryFunction CodeMethod Name
Discrete Inputs0x02ReadDiscreteInputs()
Coils0x01ReadCoils()
0x05WriteSingleCoil()
0x0FWriteMultipleCoils()
Input Registers0x04ReadInputRegisters()
Holding Registers0x03ReadMultipleHoldingRegisters()
0x06WriteSingleHoldingRegister()
0x10WriteMultipleHoldingRegisters()
0x17ReadWriteMultipleRegisters()
0x16MaskWriteRegister()
0x18ReadFifoQueue()
File Record0x14/0x1ReadFileRecord(), WriteFileRecord()
Diagnostics (Serial)0x07–0x11Serial-only diagnostics
Device ID0x2BReadDeviceIdentification()

📌 Diagnostics (0x07, 0x08, etc.) are only available in serial modes (RTU/ASCII).

⚙️ Configuration (ModbusSettings)

PropertyDescription
ConnectionTypeTCP, RTU or ASCII
IpAddress, PortFor TCP mode
PortName, BaudRate, etcFor serial modes
AsciiStartDelimiterUsually ":"
AsciiEndDelimiterUsually "\r\n"
RtuInterCharTimeMsInter-character timeout (auto-calculated if baud < 19200)
RtuInterFrameTimeMsInter-frame delay
RetryCountMax retries on timeout (default: 3)
RetryDelayMsDelay between retries (default: 50 ms)

🔄 RTU timing is automatically calculated for baud rates below 19200 per Modbus spec.

📦 Project Structure

ModbusNet/
├── ModbusNet/ # Core library (IModbusMaster, transports, messages, utils)
├── ModbusNet.Samples/ # Console examples
├── ModbusUI/ # WinForms test UI └── ModbusNet.Tests/ # Unit tests (not required for usage)

Testing & Sample Codes

The solution includes:

  • A WinForms GUI (ModbusUI) for visual testing of all three protocols.
  • A sample console project (ModbusNet.Samples) showing basic usage patterns.

🔒 The core library has no UI dependencies — the GUI is purely for testing/demo.

License

Distributed under the MIT License. See LICENSE for details.

🙌 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest enhancements
  • Implement other function codes
  • Improve documentation

📬 Need Help?

Open an issue or contact the maintainers.

ModbusNet brings industrial-grade Modbus communication to modern .NET developers with simplicity, correctness, and performance.

About

ModbusNet is a C# implementation of the Modbus protocol.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

📡 ModbusNet: A .NET Library for Modbus Communication

.NETLicensePlatform

A modern, lightweight, and production-ready .NET library for communicating with Modbus devices using Modbus ASCII (Serial), Modbus RTU (Serial), and Modbus TCP/IP protocols.

Built for industrial automation, IoT gateways, SCADA systems, and embedded .NET applications.


✅ Features

  • Three transport modes:
    • Modbus ASCII over serial ports (with LRC error checking)
    • Modbus RTU over serial ports (with CRC-16 and inter-frame timing)
    • Modbus TCP over Ethernet (with MBAP framing and async I/O)
  • Full function code support:
    • Read/Write Coils & Discrete Inputs
    • Read/Write Holding & Input Registers
    • Mask Write, Read-Write Multiple, FIFO Queue
    • File Record Access, Diagnostics (serial-only), Device Identification
  • Robust error handling:
    • Automatic exception decoding (Modbus exception codes)
    • LRC/CRC validation with custom exceptions (ModbusExceptionLRC, ModbusExceptionCRC)
  • Thread-safe & async-ready:
    • SendRequestReceiveResponseAsync() for TCP and ASCII
    • Semaphore-locked writes to prevent frame corruption
  • Clean architecture:
    • IModbusMaster interface for testability
    • Factory-based creation (ModbusFactory)
    • Settings-driven configuration (ModbusSettings)
  • Extensible design:
    • Easy to add new function codes or transports

🚀 Quick Start

1. Configure Settings

varsettings=newModbusSettings{ConnectionType=ConnectionType.TCP,IpAddress="192.168.1.10",Port=502,RetryCount=3,RetryDelayMs=100};

For serial (RTU or ASCII):

varsettings=newModbusSettings{ConnectionType=ConnectionType.RTU,// or ASCIIPortName=PortName.COM4,BaudRate=9600,Parity=Parity.Even,DataBits=DataBits.db8,StopBits=StopBits.One};

2. Create a Master

// TCPvarmaster=ModbusFactory.CreateTcpMaster(settings);// RTUvarmaster=ModbusFactory.CreateRtuMaster(settings);// ASCIIvarmaster=ModbusFactory.CreateAsciiMaster(settings);

3. Use It!

// Read 10 holding registers starting at address 0ushort[]registers=master.ReadMultipleHoldingRegisters(slaveAddress:1,startAddress:0,numberOfPoints:10);// Write a single coilmaster.WriteSingleCoil(slaveAddress:1,address:5,value:true);// Read-Write atomicallyushort[]readData=master.ReadWriteMultipleRegisters(slaveAddress:1,startReadAddress:0,numberOfPointsToRead:3,startWriteAddress:10,writeData:newushort[]{100,200,300});

💡 All methods validate inputs, handle retries, and throw meaningful exceptions on error.

🧩 Supported Function Codes

The ModbusNet library provides full support for standard Modbus function codes across all three transport modes: ASCII, RTU, and TCP. Operations are organised by data type and use case, enabling robust communication with industrial devices.

CategoryFunction CodeMethod Name
Discrete Inputs0x02ReadDiscreteInputs()
Coils0x01ReadCoils()
0x05WriteSingleCoil()
0x0FWriteMultipleCoils()
Input Registers0x04ReadInputRegisters()
Holding Registers0x03ReadMultipleHoldingRegisters()
0x06WriteSingleHoldingRegister()
0x10WriteMultipleHoldingRegisters()
0x17ReadWriteMultipleRegisters()
0x16MaskWriteRegister()
0x18ReadFifoQueue()
File Record0x14/0x1ReadFileRecord(), WriteFileRecord()
Diagnostics (Serial)0x07–0x11Serial-only diagnostics
Device ID0x2BReadDeviceIdentification()

📌 Diagnostics (0x07, 0x08, etc.) are only available in serial modes (RTU/ASCII).

⚙️ Configuration (ModbusSettings)

PropertyDescription
ConnectionTypeTCP, RTU or ASCII
IpAddress, PortFor TCP mode
PortName, BaudRate, etcFor serial modes
AsciiStartDelimiterUsually ":"
AsciiEndDelimiterUsually "\r\n"
RtuInterCharTimeMsInter-character timeout (auto-calculated if baud < 19200)
RtuInterFrameTimeMsInter-frame delay
RetryCountMax retries on timeout (default: 3)
RetryDelayMsDelay between retries (default: 50 ms)

🔄 RTU timing is automatically calculated for baud rates below 19200 per Modbus spec.

📦 Project Structure

ModbusNet/
├── ModbusNet/ # Core library (IModbusMaster, transports, messages, utils)
├── ModbusNet.Samples/ # Console examples
├── ModbusUI/ # WinForms test UI └── ModbusNet.Tests/ # Unit tests (not required for usage)

Testing & Sample Codes

The solution includes:

  • A WinForms GUI (ModbusUI) for visual testing of all three protocols.
  • A sample console project (ModbusNet.Samples) showing basic usage patterns.

🔒 The core library has no UI dependencies — the GUI is purely for testing/demo.

License

Distributed under the MIT License. See LICENSE for details.

🙌 Contributing

Contributions are welcome! Feel free to:

  • Report bugs
  • Suggest enhancements
  • Implement other function codes
  • Improve documentation

📬 Need Help?

Open an issue or contact the maintainers.

ModbusNet brings industrial-grade Modbus communication to modern .NET developers with simplicity, correctness, and performance.

About

ModbusNet is a C# implementation of the Modbus protocol.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages