1. 工业级Modbus RTU轮询服务设计背景
在工业自动化控制系统中,PLC(可编程逻辑控制器)作为核心控制设备,其数据采集的稳定性和实时性直接关系到生产线的运行状态监测。松下FP7系列PLC作为日系主流设备,广泛用于汽车制造、食品加工等行业产线控制。传统的数据采集方案通常采用OPC DA或专用协议库,但在.NET生态中,Modbus RTU协议因其简单通用、跨平台兼容性好的特点,成为许多中小型项目的首选方案。
去年我在某包装机械项目中,就遇到了一个典型场景:需要通过工控机实时采集分布在6个站点的FP7 PLC生产数据(温度、压力、速度等128个寄存器值),并将数据存入SQLite数据库供MES系统调用。最初采用控制台应用+Timer的方案,运行一周后出现了内存泄漏和串口死锁问题。后来重构为基于BackgroundService的轮询服务,连续稳定运行至今已超过300天。本文将分享这套经过生产验证的实现方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构设计解析
2.1 为什么选择BackgroundService
相较于传统Timer方案,BackgroundService作为.NET Core引入的托管服务,具有三大先天优势:
- 生命周期管理:与Host绑定,支持优雅启动/停止
- 依赖注入:原生支持IServiceProvider
- 异常隔离:未处理异常不会导致进程崩溃
在工业场景中,这对应着三个关键需求:
- 产线停机维护时需要安全断开PLC连接
- 需要灵活更换数据存储方式(SQLite/SQL Server)
- 单次通信失败不能影响整体服务
2.2 通信层关键设计
2.2.1 串口参数配置
松下FP7的Modbus RTU默认参数为:
- 波特率:19200bps(产线环境建议不高于38400)
- 数据位:8位
- 校验位:奇校验(Odd Parity)
- 停止位:1位
csharp复制_serialPort = new SerialPort(_portName, _baudRate)
{
DataBits = 8,
Parity = Parity.Odd,
StopBits = StopBits.One,
ReadTimeout = 1500, // 超时时间建议设为轮询间隔的50%-70%
WriteTimeout = 1500
};
注意:部分国产串口转换芯片需要额外设置Handshake为None
2.2.2 寄存器地址映射
FP7的Modbus地址与PLC内部地址对应关系:
- DT寄存器:4x地址,偏移量+1
- DT100 → 40101
- DT200 → 40201
- 输入继电器:0x地址
- 输出线圈:1x地址
3. 完整实现方案
3.1 服务主体结构
csharp复制public class Fp7PollingService : Backgroun
