1. 项目背景与核心目标
去年夏天接手这个项目时,客户只给了一个模糊的需求方向:"做一个能解决实际问题的系统"。经过三周的需求梳理,我们最终确定要开发一套面向中小型制造企业的生产管理系统。这个系统需要解决三个核心痛点:
- 生产数据手工记录效率低下(平均每个班次要浪费45分钟在纸质报表上)
- 质量异常追溯困难(从发现问题到定位原因平均需要2.3天)
- 设备利用率不透明(实际OEE数据比管理层预估低18-22%)
2. 技术架构设计
2.1 整体架构选型
考虑到客户IT基础设施薄弱(只有一台5年前的服务器),我们采用混合架构:
- 前端:Vue.js + Element UI(兼容IE11)
- 后端:Spring Boot 2.3 + MySQL 5.7
- 数据采集:Python + Modbus TCP
- 部署:Docker Compose单机部署
关键决策:放弃微服务架构,实测在2核4G服务器上Spring Cloud基础组件就要占用1.2G内存
2.2 数据库设计要点
生产数据表采用时间分片设计:
sql复制CREATE TABLE production_data_2023Q1 (
id BIGINT AUTO_INCREMENT,
device_id VARCHAR(20) NOT NULL,
timestamp DATETIME(3) NOT NULL,
-- 其他字段
PRIMARY KEY (id, timestamp),
INDEX idx_device_time (device_id, timestamp)
) ENGINE=InnoDB
PARTITION BY RANGE (TO_DAYS(timestamp)) (
PARTITION p_jan VALUES LESS THAN (TO_DAYS('2023-02-01')),
PARTITION p_feb VALUES LESS THAN (TO_DAYS('2023-03-01')),
PARTITION p_mar VALUES LESS THAN (TO_DAYS('2023-04-01'))
);
3. 核心功能实现
3.1 实时数据采集模块
设备通信协议处理流程:
- 建立Modbus TCP连接(超时设置3秒)
- 按设备类型加载寄存器映射配置
- 定时读取数据(默认5秒间隔)
- 数据校验(CRC16校验+阈值检查)
python复制def read_holding_registers(slave_ip, start_addr, count):
try:
with ModbusTcpClient(slave_ip, timeout=3) as client:
return client.read_holding_registers(start_addr, count)
except (ConnectionError, ModbusIOException) as e:
logger.error(f"设备{slave_ip}通信失败: {str(e)}")
raise RetryableError()
3.2 生产异常检测算法
采用滑动窗口标准差检测:
java复制public class AnomalyDetector {
private static final int WINDOW_SIZE = 10;
public boolean isAnomaly(List<Double> values) {
if (values.size() < WINDOW_SIZE) return false;
double mean = values.stream()
.mapToDouble(Double::doubleValue)
.average().orElse(0);
double stdDev = Math.sqrt(values.stream()
.mapToDouble(v -> Math.pow(v - mean, 2))
.average().orElse(0));
return Math.abs(values.get(values.size()-1) - mean) > 3 * stdDev;
}
}
4. 部署与性能优化
4.1 服务器资源配置
经过压力测试后最终配置:
yaml复制version: '3'
services:
app:
image: openjdk:11-jre
deploy:
resources:
limits:
cpus: '1.5'
memory: 2G
ports:
- "8080:8080"
volumes:
- ./logs:/app/logs
mysql:
image: mysql:5.7
command: --innodb_buffer_pool_size=512M
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
4.2 前端性能优化
针对老旧电脑的特别处理:
- 禁用SourceMap生成
- 使用babel-plugin-transform-remove-console移除console.log
- 配置SplitChunksPlugin分割vendor包
javascript复制// vue.config.js
module.exports = {
productionSourceMap: false,
configureWebpack: {
optimization: {
splitChunks: {
chunks: 'all',
maxSize: 244 * 1024 // 拆分成小于250KB的包
}
}
}
}
5. 踩坑实录
5.1 Modbus通信不稳定问题
现象:夜间频繁出现通信中断
根本原因:工厂电压波动导致交换机重启
解决方案:
- 增加UPS电源
- 通信层添加自动重试机制(指数退避算法)
- 添加心跳检测(每分钟1次)
5.2 数据库慢查询问题
典型问题查询:
sql复制SELECT * FROM production_data
WHERE device_id = 'M001'
AND timestamp BETWEEN '2023-01-01' AND '2023-01-31'
ORDER BY timestamp DESC
优化方案:
- 强制使用分区表查询
- 添加复合索引(device_id, timestamp)
- 限制返回行数(分页查询)
6. 项目成果
上线三个月后的关键指标改善:
- 数据录入时间缩短82%(从45分钟→8分钟)
- 异常响应速度提升65%(2.3天→0.8天)
- 设备利用率可视化使OEE提升7%
这套系统后来成为我们团队的标准化解决方案,已经复制部署到3家同类企业。最大的收获是认识到:在资源受限的环境中,合理的架构妥协往往比追求技术先进性更重要。