1. 项目背景与需求分析
去年我在负责公司自动化产线改造项目时,遇到一个典型的上位机通信需求:需要通过PC与多台PLC设备进行数据交互。这些PLC分布在车间不同位置,有的通过RS-232串口连接,有的则通过以太网TCP/IP连接。作为主力开发语言,我们选择了C#来实现这个通信模块。
最初考虑过自己实现Modbus协议栈,但评估后发现:
- Modbus协议虽然结构简单,但完整实现需要处理CRC校验、异常响应、超时重试等细节
- 不同传输层(RTU over串口/TCP over以太网)需要不同底层实现
- 工业现场对通信稳定性要求极高,自研方案测试周期长
经过技术调研,最终选择了开源的NModbus库。这个库的优势在于:
- 同时支持RTU和TCP传输模式
- 经过多年工业场景验证
- 提供同步/异步两种调用方式
- 源码开放可定制
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与库安装
2.1 开发环境配置
推荐使用Visual Studio 2019或更高版本,创建Windows窗体应用项目时需注意:
- 目标框架选择.NET Framework 4.6.1或.NET Core 3.1+
- 对于串口通信,需要确保项目引用System.IO.Ports
- 工业现场建议关闭"优化代码"编译选项,避免调试时出现地址偏移
2.2 NModbus库安装
通过NuGet包管理器安装最新稳定版:
bash复制Install-Package NModbus
该库包含以下核心组件:
- ModbusSerialMaster:串口通信主站实现
- ModbusIpMaster:TCP通信主站实现
- Modbus协议数据单元(PDU)处理
- CRC16校验算法实现
3. TCP/IP通信实现详解
3.1 建立TCP连接
典型连接代码如下:
csharp复制var factory = new ModbusFactory();
using var client = new TcpClient("192.168.1.100", 502);
var master = factory.CreateMaster(client);
// 设置合理的超时时间(单位ms)
master.Transport.ReadTimeout =
