随着工业自动化与智能仓储的深度融合,库房环境的实时监测已成为保障物资安全和提升管理效率的关键环节。传统温湿度记录方式不仅效率低下,还难以实现异常情况的及时预警。
本文介绍一款基于 .NET 8.0、WPF 与 NModbus4 开发的库房环境智能监测中心。项目通过 Modbus 协议 与现场传感器通信,结合本地可视化界面与后端 API 服务,实现了对多个库房温湿度数据的集中采集、状态判断、异常告警及统计展示,为中小型仓储场景提供了轻量、可靠且可扩展的解决方案。
该系统是一个集数据采集、处理、分析和展示于一体的综合性平台。它利用 Modbus 协议与各种环境传感器进行通信,实时采集库房内的温度、湿度等关键参数。通过 WPF 开发的用户界面,可以直观地查看库房环境的实时状态和历史数据。同时,系统还提供了强大的报警功能,当环境参数超出预设范围时,能够及时发出警报,提醒管理人员采取相应措施。
核心功能
- 实时采集:通过串口连接 Modbus 从站设备,定时读取寄存器中的温湿度原始值,并转换为实际物理量。
- 动态展示:主界面以列表形式展示当前选中仓库下所有库房的温湿度数值及状态(正常、温度异常、湿度异常、温湿度双异常)。
- 智能告警:根据后台配置的报警阈值(高低温、高低湿),自动判断每个库房的状态变化,一旦异常即生成告警日志并更新数据库。
- 数据统计:首页顶部区域汇总显示库房总数、正常数量及各类异常数量,便于管理者快速掌握整体情况。
- 多仓库支持:系统可管理多个仓库,用户可通过下拉选择切换查看不同仓库下的库房数据。
- 安全退出:关闭程序时自动释放串口资源、停止定时器与监测线程,确保系统稳定退出。
系统特点
系统设计注重实用性与稳定性。一方面,它充分利用了 WPF 的数据绑定与 MVVM 模式(通过 Prism 框架实现),使界面与逻辑解耦,代码结构清晰;另一方面,采用双定时器机制——一个用于刷新系统时间,另一个用于驱动 Modbus 数据读取,保证了采集频率的可控性。此外,告警检测被置于独立后台线程中循环执行,避免阻塞 UI,同时通过 Dispatcher 安全地更新界面,兼顾了响应速度与用户体验。
技术架构
基于 .NET 8.0 运行时,利用 WPF 开发桌面客户端界面,使用 NModbus4 库处理 Modbus RTU 通信协议。数据交互方面,通过封装的 HttpRestClient 调用 Web API 获取仓库、库房、从站配置及报警规则等基础信息,并将实时状态与告警日志回传至服务端。序列化采用 Newtonsoft.Json,串口操作依赖 System.IO.Ports,整体架构简洁高效,易于部署和维护。
关键代码示例
初始化监测逻辑
/// <summary>
/// 初始化监测
/// </summary>
private void InitAlarmList()
{
var datas = dicDatas;
foreach (var set in alarmSets)
{
int storeNo = set.StoreNo;
var rooms = StoreRoomList.Where(r => r.StoreNo == storeNo).ToList();
foreach (var room in rooms)
{
int roomNo = room.StoreRoomNo;
THDataInfo data = datas[roomNo];
decimal temperature = data.Temperature;
decimal humidity = data.Humidity;
// 监测
int state = 1;// 总状态
int tState = -1, hState = -1;// 温度状态、湿度状态
string msg = "";// 异常消息
// 温度监测
if (temperature < set.LTValue)
{
tState = 0;
msg = "低温异常;";
}
else if (temperature > set.HTValue)
{
tState = 2;
msg = "高温异常;";
}
else
{
tState = 1;
}
// 湿度监测
if (humidity < set.LHValue)
{
hState = 0;
msg += "低湿度异常;";
}
else if (humidity > set.HHValue)
{
hState = 2;
msg += "高湿度异常;";
}
else
{
hState = 1;
}
// 状态合并
if (tState == 1 && hState == 1)
{
state = 1;
}
else if (tState != 1 && hState == 1)
{
state = 2;
}
else if (tState == 1 && hState != 1)
{
state = 3;
}
else if (tState != 1 && hState != 1)
{
state = 4;
}
RoomStates roomStates = new RoomStates();
roomStates.RoomNo = roomNo;
roomStates.State = state;
roomStates.TState = tState;
roomStates.HState = hState;
dicCheckDatas.Add(roomNo, roomStates);
if (state != 1)
{
// 生成异常记录
AddAlarmLog(state, msg, roomNo);
}
if (room.StoreRoomState != state)
{
room.StoreRoomState = state;
UpdateRoomState(room);
}
}
}
Application.Current.Dispatcher.Invoke(() =>
{
LoadStoreRooms();
StatisticsData();
LoadAlarmLogList();
});
}
运行效果
程序运行后,界面清晰展示当前时间、各库房温湿度数值、状态标识及历史告警记录,便于实时监控。

源码获取
项目源码已开源,可直接克隆仓库,根据实际硬件地址、串口号及 API 接口进行适配,快速部署到本地环境。
Gitee:https://gitee.com/shuwenya/wpf-modbus-project2
总结
这款库房环境智能监测中心虽为中小型项目,却完整覆盖了工业数据采集、分析、告警与展示的核心流程。它不仅解决了传统人工监测的痛点,也为 Modbus 协议在 .NET 生态下的应用提供了实践参考。对于需要低成本、高可靠环境监控方案的仓储、档案室、实验室等场景,具有较高的实用价值和借鉴意义。
|