做工业现场的人都有体会,设备通信这件事看起来简单,真要稳定跑起来却全是细节。串口参数对不上、PLC地址填错、通信突然中断没人知道、采集到的数据怎么存怎么查……每个问题都能折腾半天。
本文推荐一套能实实在在解决现场问题的软件,从设备通信到数据存储再到报警提醒,该有的功能基本都配齐了。
一款面向工业现场的轻量级数据采集与监控软件,主要解决 Modbus 设备和西门子 PLC 的通信问题。它采用 C# 编写,界面基于 Windows Forms,数据库用的是 SQL Server,整体结构分成界面层、业务逻辑层和数据访问层三层。
项目最朴素的出发点就是:现场工程师能快速上手,不用写代码就能把设备数据读上来、存下来、看起来。无论是调试阶段挨个测寄存器,还是正式运行后每天看曲线、导报表,都能在一个界面里完成。
| 功能模块 | 具体说明 |
|---|---|
| 用户登录与权限管理 | 支持多用户登录,区分普通用户和管理员角色,管理员可管理账号和菜单权限 |
| Modbus 通信调试 | 支持 RTU(串口)和 TCP(网口)两种模式,可读写保持寄存器、输入寄存器、线圈,支持单个或批量操作 |
| 西门子 PLC 通信 | 覆盖 S7-200 到 S7-1500 系列,支持 M、I、Q、DB 等常见存储区的读写 |
| 实时数据曲线 | 选定设备和地址后,实时刷新数据变化曲线,时间轴自动适配,方便观察趋势 |
| 历史数据查询与导出 | 按时间范围查询历史记录,支持导出为 Excel 表格,也支持把曲线存成图片 |
| 系统参数配置 | 配置数据库连接串、采集刷新间隔、各参数的报警上下限 |
| 报警记录与管理 | 实时检测数值超限,生成报警条目,界面中可确认处理,报警记录支持导出 |
| 点位配置管理 | 配置每个采集点的变量名、寄存器地址、数据类型、缩放系数等,支持批量导入导出 |
| 设备连接状态监控 | 后台定时心跳检测,通信异常时自动尝试重连,并在界面给出状态提示 |
模块分层清晰,界面、业务、数据访问各司其职,改一块不影响另一块
支持同时连接多个 Modbus 设备和 PLC,适合多机台集中监控的场景
通信异常时自动重连,并记录完整日志,现场出问题能快速定位
数据存储带缓存机制,不会因为数据库响应慢而卡住采集线程
报警判断和数据处理都在业务层独立完成,不依赖界面刷新节奏
曲线控件支持鼠标拖拽缩放,查看细节很方便
所有导出操作(Excel、图片)都是一键完成,不需要额外安装办公软件
配置文件采用 JSON 格式,手工修改也很直观
| 技术项 | 选型与说明 |
|---|---|
| 开发语言 | C#(.NET Framework 4.7.2) |
| UI 框架 | Windows Forms,纯原生控件,兼容性好,运行资源占用低 |
| 数据库 | SQL Server用参数化查询防止注入 |
| Modbus 通信 | NModbus 开源库,稳定可靠,覆盖 RTU 和 TCP 两种链路 |
| PLC 通信 | S7.Net 库,针对西门子系列做了封装,调用简单 |
| 图表控件 |
|
| Excel 导出 | NPOI组件,不依赖Excel COM对象服务器环境也能正常导出 |
| 日志组件 | Serilog,支持按日期滚动、分级输出,方便现场排查 |
| 配置管理 | 自定义 ConfigManager 类,读写 JSON 配置文件 |
| 加密工具 | 内置 EncryptionHelper,使用随机盐值对用户密码做哈希存储 |
代码整体遵循三层架构,举几个核心类的实际用法。
入口初始化(Program.cs)
static classProgram
{
[STAThread]
static void Main
{
Application.EnableVisualStyles;
Application.SetCompatibleTextRenderingDefault(false);
// 日志先行,后面所有异常都能被捕获
LogManager.Init;
AppDomain.CurrentDomain.UnhandledException += GlobalExceptionHandler.Handle;
// 共享管理器统一创建全局实例
SharedManager.Initialize;
Application.Run(new LoginForm);
}
}
设备读写核心片段(Form1.cs 中读取保持寄存器)
public async Task ReadHoldingRegisters(byte slaveId, ushort startAddress, ushort length)
{
try
{
if (_modbusMaster == null || !_isConnected)
thrownew Exception("设备未连接");
var result = await _modbusMaster.ReadHoldingRegistersAsync(slaveId, startAddress, length);
return result;
}
catch (Exception ex)
{
LogManager.Error($"读取保持寄存器失败: {ex.Message}");
throw;
}
}
数据保存到数据库(DAL/DataAccess.cs)
public bool SaveDataPoint(string deviceName, string address, string value, DateTime timestamp)
{
string sql = @"INSERT INTO DataHistory (DeviceName, Address, Value, CollectTime)
VALUES (@DeviceName, @Address, @Value, @CollectTime)";
using (SqlConnection conn = new SqlConnection(_connectionString))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@DeviceName", deviceName);
cmd.Parameters.AddWithValue("@Address", address);
cmd.Parameters.AddWithValue("@Value", value);
cmd.Parameters.AddWithValue("@CollectTime", timestamp);
conn.Open;
return cmd.ExecuteNonQuery > 0;
}
}
报警检测逻辑(BLL/AlarmManager.cs)
public void CheckAlarm(string tagName, double currentValue, double highLimit, double lowLimit)
{
if (currentValue > highLimit)
{
CreateAlarm(tagName, "高报警", currentValue, highLimit);
}
else if (currentValue < lowLimit)
{
CreateAlarm(tagName, "低报警", currentValue, lowLimit);
}
}
启动程序后首先看到登录窗口,输入账号密码进入主界面。主界面左侧是菜单树,右侧为功能区域,当前登录用户信息和角色会显示在状态栏。

在 Modbus 调试界面中,选择 RTU 或 TCP 方式,填好串口号或 IP 地址,点击连接,状态指示灯会从灰色变为绿色。接着填入从站地址和寄存器起始地址,点击读取,表格中立即返回数值,并附带采集时间戳。




切换到数据曲线界面,先选设备再选地址,曲线会自动绘制。用鼠标在曲线上拖拽可以框选放大,右键菜单提供还原和导出图片选项。历史查询模式下,选好起止时间,点击查询,表格和曲线同步更新,再点导出 Excel 就能把数据带走。

报警管理界面会实时滚动显示最新报警,未确认的报警有高亮标记,确认后状态变更,整个过程都有操作日志记录。

整体运行下来,CPU 占用和内存都控制在合理范围,在一台普通工控机上连续跑一周没有出现明显性能问题。

目录结构如下:
ModbusMaster/
├── BLL/ # 业务逻辑层(报警、设备管理、心跳、数据处理)
├── DAL/ # 数据访问层(SQL操作)
├── Models/ # 实体类(数据点、报警记录、用户信息)
├── Utils/ # 工具类(配置、加密、日志、Excel导出)
├── bin/ # 编译输出
├── obj/ # 临时文件
├── LoginForm.cs # 登录窗口
├── MainForm.cs # 主窗口
├── Form1.cs # Modbus调试工具
├── Form2.cs # PLC通信工具
├── Form3.cs # 曲线与报表
├── ConfigurationForm.cs # 系统配置
├── AlarmManagementForm.cs # 报警管理
├── PointConfigForm.cs # 点位配置
├── UserManagementForm.cs # 用户管理
├── Program.cs # 程序入口
├── config.json # 系统配置文件
└── users.json # 用户数据文件
项目解决工业现场最频繁的通信采集和监控需求,把事情做扎实。从实际反馈来看,这套软件在多个小型自动化改造项目中顶住了压力,现场人员经过简单培训就能独立操作。
如果你手头正好有 Modbus 设备或西门子 PLC 需要调试,或者想搭建一套轻量级的监控系统,不妨参考这个项目的思路。代码结构清晰,核心通信部分可以直接复用,扩展新协议也不算难。技术本身不复杂,关键是把它组合成一个顺手的东西,放在现场真正能跑起来。
更新时间:2026-07-22
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight All Rights Reserved.
Powered By 71396.com 闽ICP备11008920号
闽公网安备35020302034903号