1. 项目背景与核心价值
工业自动化领域的数据采集与设备控制离不开上位机软件的支撑。作为工业现场最常见的通信协议之一,Modbus以其简单可靠的特点占据了70%以上的工业设备通信市场。而C#凭借其强大的Windows窗体开发能力和.NET框架的稳定性,成为上位机开发的首选语言之一。
这个项目要解决的问题非常明确:如何从零开始构建一个能够同时支持Modbus RTU(串口通信)和Modbus TCP(网络通信)的C#上位机系统。这不仅仅是实现基础通信功能,更要考虑工业场景下的稳定性、异常处理和用户交互体验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备与工具选型
2.1 基础开发环境配置
推荐使用Visual Studio 2022 Community版作为开发环境,它免费且完全支持C# 10.0的最新特性。安装时需要勾选以下工作负载:
- ".NET桌面开发"(必需)
- "通用Windows平台开发"(可选)
- ".NET Core跨平台开发"(未来扩展用)
注意:工业项目建议使用.NET Framework 4.7.2而非.NET Core,因为许多工业通信库对传统框架支持更完善。如果必须使用.NET 6+,需特别注意库的兼容性。
2.2 关键NuGet包选择
Modbus通信的核心库我们选择NModbus4,这是目前最活跃的Modbus开源实现:
bash复制Install-Package NModbus4 -Version 1.13.1
辅助工具包:
- Serilog(日志记录):
Install-Package Serilog.Sinks.File - Newtonsoft.Json(配置管理):
Install-Package Newtonsoft.Json - OxyPlot(数据可视化):
Install-Package OxyPlot.WindowsForms
3. Modbus通信核心实现
3.1 Modbus RTU串口通信实现
串口通信需要特别注意硬件层参数配置。以下是完整的串口初始化代码:
csharp复制using System.IO.Ports;
using Modbus.Device;
public class ModbusRtuMaster
{
private SerialPort _serialPort;
private IModbusSerialMaster _master;
public bool Connect(string portName, int baudRate = 9600,
Parity parity = Parity.None, int dataBits = 8,
StopBits stopBits = StopBits.One)
{
_serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
try {
_serialPort.Open();
_master = ModbusSerialMaster.CreateRtu(_serialPort);
_master.Transport.ReadTimeout = 500;
_master.Transport.WriteTimeout = 500;
return true;
}
catch (Exception ex) {
Log.Error(ex, "串口连接失败");
return false;
}
}
public ushort[] ReadHoldingRegisters(byte slaveId, ushort startAddress, ushort numRegisters)
{
return _master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
