.NET 平台的 Modbus 开发生态
在 Windows 工业自动化软件开发中,.NET(C#/VB.NET)是最主流的开发平台之一。modbus.org 推荐了多个 .NET 平台的 Modbus 库,涵盖了从开源免费到商业支持的不同选择。本文将逐一介绍这些库的特点和使用方法。
NModbus —— 最流行的 C# Modbus 库
NModbus 是 .NET 平台上最成熟、使用最广泛的 Modbus 开源库。最早托管在 Google Code,现已迁移至 GitHub:github.com/NModbus/NModbus。NuGet 包名:NModbus。
功能特性
- 支持 Modbus RTU(串口)、Modbus ASCII、Modbus TCP 和 Modbus UDP 四种传输模式
- 完整支持所有常用功能码(FC01-FC06, FC15, FC16)
- 通过 NuGet 包管理器一键安装
- 支持 .NET Framework 和 .NET Core / .NET 5+
- 开源许可证:MIT(可商用)
安装
# NuGet 命令行安装
dotnet add package NModbus
# 或通过 Visual Studio 的 NuGet 包管理器搜索 "NModbus"
Modbus TCP 读写示例
using System;
using System.Net.Sockets;
using NModbus;
// 创建 TCP 客户端
using var client = new TcpClient("192.168.1.100", 502);
var factory = new ModbusFactory();
var master = factory.CreateMaster(client);
// 读取从站 1 的保持寄存器 0-9
ushort[] registers = master.ReadHoldingRegisters(1, 0, 10);
Console.WriteLine("读取结果:");
for (int i = 0; i < registers.Length; i++)
Console.WriteLine($" 地址 {i}: {registers[i]}");
// 写入单个寄存器
master.WriteSingleRegister(1, 0, 1234);
// 批量写入多个寄存器
ushort[] writeData = { 100, 200, 300 };
master.WriteMultipleRegisters(1, 10, writeData);
Modbus RTU 串口通信
using System.IO.Ports;
using NModbus;
using var port = new SerialPort("COM3")
{
BaudRate = 9600,
DataBits = 8,
Parity = Parity.None,
StopBits = StopBits.One
};
port.Open();
var factory = new ModbusFactory();
var master = factory.CreateRtuMaster(port);
ushort[] data = master.ReadHoldingRegisters(1, 0, 5);
foreach (var val in data)
Console.WriteLine(val);
Free .NET Modbus(free-dotnet-modbus)
Free .NET Modbus 是另一个开源的 .NET Modbus 库,托管在 Google Code Archive。与 NModbus 类似,它也支持 Modbus ASCII、RTU、TCP 和 UDP。如果你使用的是旧版 .NET Framework(2.0/3.5),这个库可能有更好的兼容性。但对于新项目,推荐使用活跃维护的 NModbus。
ASComm.NET —— 商业级 .NET Modbus 驱动
ASComm.NET 是 Automated Solutions 公司的商业 .NET 组件,官网:automatedsolutions.com。它是完全托管的 .NET 库,不仅支持 Modbus TCP/RTU/ASCII,还支持 Allen-Bradley Logix、PLC5、SLC500、MicroLogix 和 GE SRTP 等多种工业协议。
核心特性
- 可视化设计:既可以通过代码配置,也可以通过 Visual Studio 的属性窗口可视化配置
- 后台扫描:以指定速率自动扫描数据点,检测到数据变化时触发事件
- 序列化支持:配置可序列化为 XML/JSON 格式
- 30 天免费试用:无功能限制,完整版可充分测试
- 多协议:一个组件支持 Modbus + Allen-Bradley + GE 等
ASComm.NET 代码示例
using ASComm.NET;
// 创建 Modbus TCP 通信组件
var comm = new ModbusTcpComm();
comm.RemoteAddress = "192.168.1.100";
comm.RemotePort = 502;
// 添加要扫描的数据组
var group = new ModbusScanGroup();
group.SlaveId = 1;
group.StartAddress = 0;
group.Length = 10;
group.ScanRate = 1000; // 每秒扫描一次
// 数据变化事件
group.DataChanged += (s, e) =>
{
Console.WriteLine($"地址 {e.Address} 变为 {e.Value}");
};
comm.ScanGroups.Add(group);
comm.Connect();
Delphi ModbusTCP 组件
对于 Delphi/Lazarus 开发者,有一个开源的 Modbus TCP 组件集,托管在 SourceForge:sourceforge.net/projects/delphimodbus。它基于 Indy(Internet Direct)网络组件库,支持 Indy 9 和 Indy 10 两个版本。
⚠️ 注意:这个项目活跃度较低,最近的 Delphi 版本(10.4 Sydney / 11 Alexandria)可能需要调整才能直接使用。如果需要在新版 Delphi 上开发 Modbus 功能,也可以考虑通过 COM 互操作调用 MBServer ActiveX、或者用 Delphi 调用 C 语言版的 libmodbus 动态库(DLL)。
ModLink —— Delphi VCL 原生组件
ModLink 是一套用于 Borland Delphi 的原生 VCL 组件,由 Ivo Bauer 开发,官网 www.ozm.cz/ivobauer/modlink。它是一组可直接拖放到 Delphi 窗体上的可视化组件,让 Delphi 开发者无需手写 Socket 通信代码即可集成 Modbus 通信能力。
ModLink 支持多种网络类型,包括:
- Modbus TCP(通过 TModLinkTCP 组件)
- Modbus RTU 串口(通过 TModLinkRTU 组件)
- Modbus ASCII 串口
- Modbus Plus 网络
⚠️ ModLink 是 Delphi 时代的产物,项目已多年未更新。如果你在维护旧的 Delphi 工控项目,ModLink 仍然有价值;但新建项目建议使用 NModbus(.NET)或 pymodbus(Python)等更现代的方案。
如何选择 .NET/Delphi Modbus 库
| 场景 | 推荐 | 理由 |
|---|---|---|
| C# 新项目 | NModbus(NuGet) | MIT 许可,活跃维护,API 简洁 |
| .NET 商业项目 | ASComm.NET | 多协议支持,可视化配置,商业支持 |
| 旧 Delphi 项目 | ModLink 或 DelphiModbus | 原生 Delphi 组件,免去跨语言调用 |
| Python 脚本 | pymodbus | 最活跃的 Python Modbus 库 |
总结
.NET 平台的 Modbus 开发生态是最丰富的。对于新项目,开源免费的 NModbus 是大多数场景的最佳选择——MIT 许可、NuGet 一键安装、支持所有主流传输模式。如果需要同时连接 Allen-Bradley 或 GE 设备,ASComm.NET 提供了统一的多协议方案。而 Delphi 开发者虽然选择较少,但 ModLink 和 DelphiModbus 两个组件覆盖了最基础的 Modbus TCP/RTU 通信需求。
发表回复