1. 项目概述
这个制造装备物联及生产管理ERP系统,是我去年带队完成的一个中型工业互联网项目。核心目标是通过SpringBoot+Vue技术栈,实现工厂设备联网监控与生产流程数字化管理的深度融合。系统上线后,客户车间的设备利用率提升了27%,订单交付周期缩短了40%,这让我深刻体会到工业数字化转型的实际价值。
不同于传统ERP只关注业务流程,我们特别强化了设备物联层与生产执行层的实时数据互通。车间里的CNC机床、注塑机通过物联网关采集运行参数,与ERP的生产工单、物料库存形成闭环管理。当设备发生异常时,系统能自动触发维修工单并调整生产排程——这种实时联动是纸质工单时代根本无法实现的。
2. 系统架构设计
2.1 技术栈选型考量
选择SpringBoot+Vue的全家桶方案主要基于三个实际需求:
- 快速迭代:客户要求6个月内完成从需求调研到试运行,SpringBoot的约定优于配置特性大幅减少了XML配置工作量
- 前后端解耦:工厂需要同时支持PC端看板和移动端巡检,Vue的组件化开发完美适配多终端场景
- 工业协议兼容:通过Java的Modbus4J库实现与PLC设备通信,这是Python等语言难以替代的
技术栈具体构成:
mermaid复制graph TD
A[前端] -->|Axios| B(Vue3+ElementPlus)
B --> C[WebSocket实时数据]
D[后端] -->|SpringSecurity| E(SpringBoot2.7)
E --> F[MyBatis-Plus+PageHelper]
F --> G[MySQL8.0]
H[设备层] -->|ModbusTCP| I(Java物联网网关)
I --> J[Redis缓存]
2.2 核心模块划分
系统包含5个关键子系统:
-
设备物联平台:
- 采用Netty实现高并发协议解析
- 设备状态采样频率可配置(默认5秒)
- 支持断线缓存和补偿上报
-
生产执行系统:
- 工单排程算法考虑设备负荷率
- 动态甘特图展示生产进度
- 质量追溯采用批次号+工序号双关联
-
仓储管理:
- 库位RFID自动识别
- 安全库存智能预警
- 物料BOM版本控制
-
决策分析:
- 设备OEE实时计算
- 不良品柏拉图分析
- 成本核算精确到工序
-
系统管理:
- 基于RBAC的权限控制
- 操作日志审计追踪
- 数据字典统一管理
3. 关键技术实现
3.1 设备数据采集方案
车间有30多台不同品牌的设备,我们开发了通用的协议转换层:
java复制// 设备通信服务抽象
public interface DeviceService {
DeviceStatus readRealTimeData(String ip);
void sendCommand(String ip, byte[] cmd);
}
// ModbusTCP实现
@Service("modbusService")
public class ModbusServiceImpl implements DeviceService {
private final ModbusMaster master;
public ModbusServiceImpl(@Value("${modbus.timeout}") int timeout) {
this.master = new ModbusTCPMasterCreator()
.setTimeout(timeout)
.create();
}
@Override
public DeviceStatus readRealTimeData(String ip) {
// 读取保持寄存器40001-40020
ReadHoldRegistersRequest request =
new ReadHoldRegistersRequest(ip, 0, 20);
return master.sendRequest(request);
}
}
关键点:设备通信必须设置合理的超时时间(建议3-5秒),避免线程阻塞影响系统响应
3.2 前后端交互设计
采用RESTful+WebSocket双通道:
- 基础数据:通过RESTful接口获取
javascript复制// Vue组件中获取工单数据
async loadWorkOrders() {
const { data } = await api.get('/api/production/orders', {
params: {
page: this.pagination.page,
status: this.filterStatus
}
})
this.orders = data.records
}
- 实时数据:通过WebSocket推送
javascript复制// 建立设备状态监听
const socket = new WebSocket(`wss://${location.host}/api/realtime/device`)
socket.onmessage = (event) => {
const data = JSON.parse(event.data)
this.$store.commit('updateDeviceStatus', data)
}
3.3 生产排程算法
核心排程逻辑考虑以下因素:
- 设备当前负荷率
- 物料齐套情况
- 工序间的先后约束
- 紧急插单权重
算法伪代码示例:
code复制function schedule(orders, devices):
// 按交付日期倒排
sorted_orders = sort_by_due_date(orders)
for order in sorted_orders:
// 获取可选设备列表
available_devices = filter_devices(devices, order.requirements)
// 选择负荷最低的设备
best_device = find_min_load(available_devices)
// 计算工序时间(含换模时间)
duration = calculate_duration(order, best_device)
// 分配时间窗口
time_slot = allocate_time_slot(best_device, duration)
// 更新设备负荷
update_device_load(best_device, time_slot)
4. 典型问题解决方案
4.1 设备数据断连处理
车间网络不稳定会导致数据丢失,我们采用三级保障:
- 本地缓存:网关设备存储最近6小时数据
- 补偿上报:网络恢复后优先传输关键数据
- 数据修复:通过算法补全缺失时段数据
Redis缓存配置示例:
yaml复制spring:
redis:
host: 192.168.1.100
port: 6379
timeout: 3000
database: 1
lettuce:
pool:
max-active: 50
max-wait: 1000
4.2 高并发下的数据一致性
生产报工场景采用乐观锁控制:
java复制@Transactional
public void reportProduction(ProductionReport report) {
// 检查工单版本号
WorkOrder order = orderMapper.selectById(report.getOrderId());
if (order.getVersion() != report.getVersion()) {
throw new OptimisticLockException("工单已被修改");
}
// 更新生产数量
order.setCompletedQuantity(
order.getCompletedQuantity() + report.getQuantity());
order.setVersion(order.getVersion() + 1);
orderMapper.updateById(order);
// 记录报工明细
reportDetailMapper.insert(report);
}
5. 部署实施要点
5.1 服务器配置建议
根据200个并发用户的压力测试结果,推荐配置:
| 组件 | CPU | 内存 | 磁盘 | 网络 |
|---|---|---|---|---|
| 应用服务器 | 8核 | 16G | SSD 200G | 千兆 |
| 数据库 | 16核 | 32G | RAID10 1T | 万兆 |
| Redis | 4核 | 8G | SSD 100G | 千兆 |
5.2 性能优化措施
- MySQL调参:
ini复制innodb_buffer_pool_size = 12G
innodb_log_file_size = 2G
max_connections = 300
- JVM参数:
bash复制-server -Xms8g -Xmx8g -XX:+UseG1GC
-XX:MaxGCPauseMillis=200
- 前端懒加载:
javascript复制// 按需加载车间平面图组件
const WorkshopMap = () => import('./components/WorkshopMap.vue')
6. 开发经验总结
-
设备对接坑点:
- 不同品牌的PLC寄存器地址可能冲突
- 某些老旧设备需要增加信号放大器
- 车间电磁干扰会导致通信不稳定
-
效率提升技巧:
- 使用MyBatis-Plus的LambdaQueryWrapper大幅简化DAO代码
- 前端采用Vuex管理设备实时状态数据
- 利用Redis的Geo类型实现物料定位查询
-
扩展性设计:
- 预留MES系统接口(采用Apache Camel集成)
- 设备协议层采用策略模式便于扩展
- 所有核心表都有预留字段
这个项目让我深刻认识到:工业软件的核心价值不在于技术有多先进,而在于能否真正解决生产现场的实际问题。比如我们最初设计的精美报表,后来都被车间主任要求改成大字体的简易看板——因为老师傅们需要站在3米外就能看清数据。这种细节的打磨,往往比技术实现更有挑战性。
