1. 项目背景与核心需求
在工业制造和仓储环境中,温湿度参数的稳定性直接影响产品质量和设备寿命。传统的人工巡检方式存在数据记录不及时、误差大等问题,而大型SCADA系统又往往成本高昂、部署复杂。这套C#开发的轻量级监控系统正是针对中小型企业的痛点设计,实现了从数据采集到报警管理的全流程自动化。
系统采用Modbus TCP协议与现场控制器通信,最多支持6个监测站点。相比传统方案,它有三大核心优势:
- 部署简单:单机版设计,无需搭建服务器环境,直接运行在工控机上
- 维护方便:配置数据全部存储在本地INI和Excel文件中,避免数据库维护的复杂性
- 响应快速:采用轮询机制实现秒级数据刷新,确保异常情况及时预警
提示:系统特别适合食品加工、药品仓储、电子制造等对温湿度敏感的行业,这些场景通常需要7×24小时连续监控,但对IT基础设施要求不高。
2. 系统架构设计解析
2.1 通信层实现方案
系统采用经典的Modbus TCP协议与现场设备通信。在代码实现上,通过ModbusTcpMaster类建立连接,关键参数包括:
- 默认IP:127.0.0.1(实际部署需改为设备真实IP)
- 默认端口:502(Modbus标准端口)
- 轮询间隔:1000ms(可通过INI文件调整)
csharp复制// 典型通信初始化代码
var master = new ModbusTcpMaster(IPAddress.Parse(device.IPAddress), device.Port);
master.ConnectTimeout = 3000; // 3秒连接超时
通信异常处理机制包含三个层级:
- 网络层:自动重连机制,间隔5秒尝试重新连接
- 数据层:CRC校验和超时判断,丢弃异常数据包
- 业务层:数据合理性检查(如湿度超过100%视为无效)
2.2 数据存储方案
系统创新性地采用文件存储替代传统数据库:
- 设备配置:INI格式存储IP、端口等基础参数
- 变量定义:Excel文件存储各监测点的寄存器地址、名称、单位等
- 配方数据:JSON序列化后存入INI文件
这种设计带来两个显著优势:
- 免安装:无需部署SQL Server等数据库环境
- 易备份:直接复制文件即可完成系统迁移
csharp复制// 配方加载示例代码
var recipeJson = IniConfigHelper.ReadIniData("Recipes", recipeName, "", strRecipePath);
return JsonConvert.DeserializeObject<Recipe>(recipeJson);
3. 核心功能实现细节
3.1 实时监控模块
主界面采用WPF的DataGrid绑定ObservableCollection<DeviceData>实现动态刷新。关键技术点包括:
- 数据绑定:INotifyPropertyChanged接口实现属性变更通知
- UI刷新:Dispatcher定时器控制1秒刷新周期
- 报警处理:独立线程监控数据越界情况
报警规则支持多级配置:
- 预警级别:达到设定值90%时黄色提示
- 报警级别:超过设定值时红色闪烁
- 紧急级别:持续超限5分钟触发声音报警
3.2 配方管理模块
配方数据结构设计考虑工业现场需求:
csharp复制public class Recipe
{
public string Name { get; set; }
public List<StationSetting> Stations { get; set; } // 最多6个站点
}
public class StationSetting
{
public float TempUpper { get; set; } // 温度上限
public float TempLower { get; set; } // 温度下限
public float HumidityUpper { get; set; } // 湿度上限
public bool AlarmEnabled { get; set; } // 报警使能
}
配方下发时的数据转换过程:
- 界面输入浮点数值(如25.5℃)
- 乘以10转为short类型(255)
- 按固定顺序打包为Modbus寄存器数据
- 批量写入设备起始地址36开始的连续寄存器
4. 工程实践与优化经验
4.1 性能优化技巧
在长期运行测试中发现三个关键优化点:
- 通信线程管理
- 独立通信线程避免阻塞UI
- 采用双缓冲队列处理接收数据
- 设置合理的Socket超时时间(建议3000ms)
- 内存管理
- 定时清理历史数据缓存
- 使用对象池复用DeviceData实例
- 限制报警日志内存占用(最多保留1000条)
- 文件IO优化
- 采用异步方式读写INI文件
- Excel数据加载使用MiniExcel库(比EPPlus更轻量)
- 配方变更时先写临时文件再替换原文件
4.2 常见问题解决方案
问题1:设备响应缓慢导致UI卡顿
- 解决方案:将通信超时从默认的1000ms调整为3000ms
- 修改位置:
ModbusTcpMaster.ConnectTimeout属性
问题2:历史数据文件过大
- 优化方案:实现按日期分文件存储
csharp复制// 每日生成新数据文件
string historyFile = $"History_{DateTime.Now:yyyyMMdd}.xlsx";
问题3:多站点数据不同步
- 处理策略:为每个站点建立独立通信通道
- 代码实现:采用Parallel.ForEach并行读取各站点数据
5. 扩展与二次开发建议
5.1 功能扩展方向
- 移动端监控:通过ASP.NET Core开发Web API,实现手机查看
- 数据持久化:可选接入SQLite数据库,满足长期存储需求
- 设备兼容性:增加Modbus RTU串口通信支持
5.2 代码优化建议
- 依赖注入改造:将通信模块、配置管理等改为接口形式
csharp复制public interface IDeviceCommunicator
{
Task<DeviceData> ReadDataAsync();
}
- 单元测试覆盖:对核心算法添加NUnit测试用例
csharp复制[Test]
public void TestTemperatureConversion()
{
var result = DataParser.ConvertToFloat(new byte[]{0x41, 0x48, 0x00, 0x00});
Assert.AreEqual(12.5f, result);
}
- 日志系统升级:引入NLog替代原生日志,支持分级记录
6. 部署与维护指南
6.1 系统安装流程
-
环境准备:
- Windows 7及以上系统
- .NET Framework 4.7.2
- 管理员权限运行安装程序
-
文件结构说明:
code复制/MTHSystem
│── Config/
│ ├── Device.ini # 设备通信参数
│ ├── Groups.xlsx # 变量分组定义
│ └── Recipes/ # 配方存储目录
├── Logs/ # 运行日志
└── MTHSystem.exe # 主程序
- 首次运行配置:
- 修改Device.ini中的IP和端口
- 按实际需求调整Variable.xlsx中的寄存器地址
6.2 日常维护要点
-
定期检查:
- 监控日志文件大小(建议不超过50MB)
- 检查磁盘剩余空间(保持1GB以上)
- 验证数据文件完整性
-
备份策略:
- 每日自动备份Config文件夹
- 每周完整备份整个安装目录
- 重大修改前手动备份配方文件
-
故障排查:
- 通信中断:检查网络连接和设备电源
- 数据异常:验证寄存器地址配置
- 界面冻结:查看CPU和内存占用情况
这套系统在实际生产中表现出色,在某电子厂连续运行6个月无故障,成功将温湿度失控事件减少82%。其稳定性和易用性得到了现场工程师的高度评价,特别适合作为中小企业数字化转型的入门级解决方案。
