1. 项目背景与核心需求
在电子元件生产车间,温湿度控制从来都不是小事。去年我们工厂就发生过一起典型的案例:一批价值30万的精密电阻因为存储环境湿度过高导致引脚氧化,最终全部报废。这种惨痛教训让我意识到,传统的温湿度计+人工记录方式已经无法满足现代电子制造的需求。
这个系统要解决三个核心痛点:
- 实时性差:人工巡检存在时间盲区,无法捕捉突发环境变化
- 数据孤岛:纸质记录难以统计分析,无法追溯历史问题
- 响应滞后:异常情况依赖人员发现,处置效率低下
2. 系统架构设计
2.1 硬件选型方案
经过对比测试,我们最终确定的硬件配置:
-
传感器:瑞士Sensirion SHT35数字式温湿度传感器
- 精度:±0.2℃(温度),±1.5%RH(湿度)
- 响应时间:8秒(湿度),4秒(温度)
- 选择理由:比DHT22贵30%但稳定性提升200%
-
采集终端:STM32F103C8T6最小系统板
- 内置Modbus RTU协议栈
- 支持RS485总线级联
- 实测带载能力:单总线可接32个传感器
2.2 通信协议设计
采用工业级Modbus RTU协议,具体参数配置:
csharp复制// C#中的串口配置
serialPort.PortName = "COM3";
serialPort.BaudRate = 19200;
serialPort.Parity = Parity.Even;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
关键经验:RS485总线必须采用手拉手布线方式,星型连接会导致信号反射。我们曾因此损失3天调试时间。
3. 上位机核心功能实现
3.1 实时数据采集模块
采用多线程架构实现:
- 主线程维护UI响应
- 采集线程定时轮询设备
- 数据处理线程进行CRC校验
csharp复制private void ReadSensorData()
{
byte[] request = new byte[] { 0x01, 0x04, 0x00, 0x00, 0x00, 0x02, 0x71, 0xCB };
serialPort.Write(request, 0, request.Length);
Thread.Sleep(100); // 等待设备响应
int bytesToRead = serialPort.BytesToRead;
byte[] response = new byte[bytesToRead];
serialPort.Read(response, 0, bytesToRead);
// 数据解析逻辑...
}
3.2 报警策略设计
分级报警机制配置示例:
| 级别 | 温度阈值 | 湿度阈值 | 响应方式 |
|---|---|---|---|
| 预警 | ±2℃ | ±5%RH | 界面闪烁 |
| 一级 | ±5℃ | ±10%RH | 声光报警 |
| 二级 | ±8℃ | ±15%RH | 短信通知 |
4. 数据库设计与优化
4.1 表结构设计
sql复制CREATE TABLE EnvironmentData (
Id INT PRIMARY KEY IDENTITY,
DeviceId VARCHAR(10) NOT NULL,
Temperature DECIMAL(5,2) NOT NULL,
Humidity DECIMAL(5,2) NOT NULL,
RecordTime DATETIME DEFAULT GETDATE(),
Status TINYINT DEFAULT 0
);
CREATE INDEX IX_DeviceTime ON EnvironmentData (DeviceId, RecordTime);
4.2 批量插入优化
采用SqlBulkCopy实现高速写入:
csharp复制DataTable tempTable = new DataTable();
// ...构建数据表
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = "EnvironmentData";
bulkCopy.BatchSize = 5000; // 每批5000条
bulkCopy.WriteToServer(tempTable);
}
实测对比:单条INSERT耗时3ms,批量方式可达20000条/秒
5. 可视化界面开发
5.1 实时曲线绘制
使用LiveCharts库实现动态图表:
csharp复制CartesianChart.Series = new SeriesCollection
{
new LineSeries
{
Values = new ChartValues<double>(),
PointGeometrySize = 0,
LineSmoothness = 0.2
}
};
// 数据更新
Dispatcher.Invoke(() =>
{
series.Values.Add(newValue);
if (series.Values.Count > 100)
series.Values.RemoveAt(0);
});
5.2 车间平面图集成
将AutoCAD图纸转换为WPF可用的XAML:
- 使用AutoCAD导出DWG为DXF
- 通过Inkscape转换为XAML
- 在Blend中优化路径
6. 系统部署实战经验
6.1 现场调试问题集
我们遇到的典型问题及解决方案:
-
信号干扰问题
- 现象:夜间数据出现毛刺
- 排查:发现与变频器共用电网
- 解决:加装隔离变压器
-
时钟不同步
- 现象:多设备时间差达3分钟
- 解决:部署NTP时间服务器
6.2 性能优化记录
关键优化点及效果:
| 优化项 | 优化前 | 优化后 | 方法 |
|---|---|---|---|
| 数据查询速度 | 1200ms | 80ms | 添加复合索引 |
| 内存占用 | 450MB | 120MB | 改用对象池管理连接对象 |
| UI响应延迟 | 300-500ms | <50ms | 采用Dispatcher优化更新 |
7. 扩展功能实现
7.1 微信报警接入
通过企业微信API实现:
csharp复制public void SendWechatAlert(string message)
{
string url = $"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的KEY";
var data = new {
msgtype = "text",
text = new {
content = $"[环境报警]{DateTime.Now:HH:mm}\n{message}"
}
};
using (HttpClient client = new HttpClient())
{
var content = new StringContent(JsonConvert.SerializeObject(data),
Encoding.UTF8, "application/json");
client.PostAsync(url, content).Wait();
}
}
7.2 数据报表生成
使用FastReport设计报表模板:
- 设计.frx模板文件
- 动态加载数据源
- 导出PDF/Excel
csharp复制report.Load("DailyReport.frx");
report.SetParameterValue("StartDate", DateTime.Today);
report.Prepare();
report.Export(new PDFExport(), "Report.pdf");
8. 系统安全防护
8.1 通信安全措施
- 数据校验:CRC16+异或校验双重验证
- 传输加密:对关键指令进行AES加密
- 防火墙规则:只开放指定端口
8.2 操作审计日志
记录所有关键操作:
sql复制CREATE TABLE AuditLog (
Id INT IDENTITY PRIMARY KEY,
UserName NVARCHAR(50) NOT NULL,
ActionType NVARCHAR(20) NOT NULL,
ActionDetail NVARCHAR(200),
ActionTime DATETIME DEFAULT GETDATE(),
ClientIP NVARCHAR(15)
);
9. 项目总结与改进方向
经过三个月的实际运行,系统达到的指标:
- 数据采集完整率:99.98%
- 报警响应时间:<15秒
- 历史数据查询速度:<0.5秒(百万级数据)
下一步优化计划:
- 引入机器学习预测环境变化趋势
- 增加设备健康度监测功能
- 开发移动端监控APP
在实施过程中最深刻的体会是:工业环境下的软件系统必须考虑现场的各种异常情况。我们专门建立了"异常情况手册",目前已积累87种特殊场景的处理方案,这才是系统稳定运行的关键保障。