当前位置: 首页 > news >正文

用Python自动计算设备OEE,我写了个工具给自己用(附完整代码)

每天手动算OEE太累了,我花2天写了个Python工具,5分钟搞定。完整代码分享,拿去直接用。

痛点:为什么要自动算OEE?

我之前每天的工作:

- 8:00 从MES导出昨日生产数据(CSV格式)

- 8:30 用Excel计算可用率、性能率、质量率

- 9:30 手动算OEE三个指标

- 10:00 画OEE趋势图

- 10:30 写分析报告

每天2小时重复劳动,而且容易出错。有一次我把运行时间算错了,导致OEE偏高2%,被领导批评了一顿。

受不了了,自己写工具!

工具设计

功能需求:

1. 读取MES导出的CSV数据

2. 自动计算OEE三个指标

3. 生成OEE报表(Excel格式)

4. 自动标记异常设备

5. 支持多设备批量分析

技术选型:Python 3.9 + Pandas + openpyxl(生成Excel)

完整代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""OEE自动计算工具 v1.0"""

import pandas as pd
from dataclasses import dataclass
from typing import List, Dict
from datetime import datetime

@dataclass
class OEEResult:
"""OEE计算结果"""
equipment_id: str
date: str
plan_time: float # 计划运行时间(分钟)
actual_time: float # 实际运行时间
cycle_time: float # 周期时间(秒/片)
output: int # 产出数量
good_output: int # 良品数量

@property
def availability(self) -> float:
"""可用率 = 实际运行时间 / 计划运行时间"""
return self.actual_time / self.plan_time if self.plan_time > 0 else 0

@property
def performance(self) -> float:
"""性能率 = (理论周期时间 × 产出) / 实际运行时间"""
ideal_time = (self.cycle_time / 60) * self.output # 转换为分钟
return ideal_time / self.actual_time if self.actual_time > 0 else 0

@property
def quality(self) -> float:
"""质量率 = 良品数量 / 产出数量"""
return self.good_output / self.output if self.output > 0 else 0

@property
def oee(self) -> float:
"""OEE = 可用率 × 性能率 × 质量率"""
return self.availability * self.performance * self.quality


class OEECalculator:
"""OEE计算器"""

def __init__(self, data_path: str):
self.df = pd.read_csv(data_path)
self.results: List[OEEResult] = []

def calculate(self) -> List[OEEResult]:
"""计算所有设备的OEE"""
for eq_id in self.df['equipment_id'].unique():
eq_data = self.df[self.df['equipment_id'] == eq_id]

# 汇总数据
result = OEEResult(
equipment_id=eq_id,
date=eq_data['date'].iloc[-1],
plan_time=eq_data['plan_time'].sum(),
actual_time=eq_data['actual_time'].sum(),
cycle_time=eq_data['cycle_time'].mean(),
output=eq_data['output'].sum(),
good_output=eq_data['good_output'].sum()
)
self.results.append(result)

return self.results

def get_summary(self) -> Dict:
"""获取汇总统计"""
if not self.results:
self.calculate()

return {
'avg_oee': sum(r.oee for r in self.results) / len(self.results),
'max_oee': max(r.oee for r in self.results),
'min_oee': min(r.oee for r in self.results),
'total_equipment': len(self.results),
'low_oee_list': [r.equipment_id for r in self.results if r.oee < 0.85]
}

def export_report(self, output_path: str):
"""导出Excel报表"""
if not self.results:
self.calculate()

data = []
for r in self.results:
data.append({
'设备ID': r.equipment_id,
'日期': r.date,
'计划时间': r.plan_time,
'实际时间': r.actual_time,
'可用率': f"{r.availability*100:.1f}%",
'性能率': f"{r.performance*100:.1f}%",
'质量率': f"{r.quality*100:.1f}%",
'OEE': f"{r.oee*100:.1f}%",
'状态': '✅正常' if r.oee >= 0.85 else '⚠️需改善'
})

df_out = pd.DataFrame(data)
df_out.to_excel(output_path, index=False, sheet_name='OEE报表')
print(f"报表已导出: {output_path}")


def main():
# 模拟数据
data = {
'date': ['2026-06-10'] * 3,
'equipment_id': ['ETCH-01', 'ETCH-02', 'CVD-01'],
'plan_time': [1440, 1440, 1440], # 24小时×60分钟
'actual_time': [1300, 1350, 1380], # 实际运行分钟
'cycle_time': [45, 42, 60], # 秒/片
'output': [1700, 1900, 1380], # 产出片数
'good_output': [1650, 1850, 1350] # 良品片数
}
df = pd.DataFrame(data)
df.to_csv('oee_data.csv', index=False)

# 计算OEE
calc = OEECalculator('oee_data.csv')
results = calc.calculate()

print("\n===== OEE计算结果 =====")
for r in results:
print(f"{r.equipment_id}: OEE={r.oee*100:.1f}% "
f"(可用率={r.availability*100:.1f}%, "
f"性能率={r.performance*100:.1f}%, "
f"质量率={r.quality*100:.1f}%)")

# 导出报表
calc.export_report('OEE报表_20260610.xlsx')

# 汇总
summary = calc.get_summary()
print(f"\n===== 汇总统计 =====")
print(f"平均OEE: {summary['avg_oee']*100:.1f}%")
print(f"最高OEE: {summary['max_oee']*100:.1f}%")
print(f"最低OEE: {summary['min_oee']*100:.1f}%")
print(f"需改善设备: {summary['low_oee_list']}")


if __name__ == "__main__":
main()

运行效果

运行一次5秒钟,自动计算所有设备的OEE,并生成Excel报表。

以前2小时的工作,现在5分钟搞定。

怎么用

1. 安装依赖:pip install pandas openpyxl

2. 准备CSV文件,包含:equipment_id、plan_time、actual_time、cycle_time、output、good_output

3. 运行脚本:python oee_calculator.py

4. 查看生成的OEE报表.xlsx

后续优化方向

1. 增加邮件告警:OEE低于85%自动发邮件

2. 增加趋势图:展示OEE随时间的变化

3. 增加根因分析:自动标记可能导致OEE低的原因

---

�� 你也在手动算OEE吗?有什么痛点?评论区聊聊!

�� 觉得有用就点赞收藏!关注我分享更多半导体工具!

http://www.jsqmd.com/news/990262/

相关文章:

  • 多任务学习与负迁移检测:NLP 多目标训练的调优策略
  • 5步构建你的量化交易系统:从数据采集到实盘交易全流程指南
  • 企业文化决定组织上限:管理者不可错过的经典书籍推荐
  • 非平行文本风格迁移:解耦表征实战指南
  • SAP SD模块实战:手把手教你用BAPI_SALESORDER_CREATEFROMDAT2创建销售订单(含完整代码与字段解析)
  • 用PyTorch 2.0复现2014年GAN原始实验:一份完整的代码实现与避坑指南
  • 终极NCM解密指南:ncmdumpGUI如何解放你的网易云音乐收藏
  • 公务员面试怎么准备?2026 结构化面试流程、答题训练和备考工具测评
  • 德清专业的杭州特种气体配送中心:区域工业气体供应格局与核心服务商评测 - 优质品牌商家
  • 告别轮询等待:在HC32上实现高效可靠的I2C中断+DMA传输
  • DataHub实战:从零到一的容器化元数据平台深度部署指南
  • 免费跨平台B站视频下载器:BilibiliDown完整使用指南
  • 告别NS方程恐惧症:用Python从零实现一个简单的LBM流体模拟(附完整代码)
  • Python开发项目管理:从构思到部署的完整流程
  • 宜宾及周边吊车出租品牌评测:吊车车辆施救出租/宜宾工程机械设备租赁公司/宜宾钢板出租/2026年工程选型核心参考 - 优质品牌商家
  • Linux也能看B站!这款免费开源客户端让你的Linux桌面拥有完整B站体验
  • 期货量化告警太吵怎么控频:天勤 TqNotify 与业务信号分级
  • Streamlit Session State 实战指南:解决状态丢失与跨组件通信
  • 如何快速实现Figma中文界面:figmaCN的完整使用指南
  • 手把手教你用UVM搭建DW_APB_I2C验证环境:从Scoreboard到中断处理的避坑指南
  • 如何通过智能游戏辅助工具提升英雄联盟操作效率:5个核心功能详解
  • 别再死磕论文了!用labml-nn这个带注释的PyTorch库,5分钟看懂Transformer核心代码
  • 针对复杂表格解析应该选取怎样的文档解析工具?
  • 3分钟掌握NCM格式解密:ncmppGui极速转换工具完全指南
  • 如何让老旧视频焕发新生:Squirrel-RIFE AI补帧终极指南
  • Sublime Text 3 Build 3114 Windows 安装版(含图文安装指引)
  • Maya一键从模型边缘生成可调曲线:专为宝石切面与硬表面建模优化的Python工具
  • 如何永久保存你的QQ空间青春记忆:GetQzonehistory完整备份指南
  • 保姆级教程:用FPGA+SPI搞定TDC-GPX2寄存器配置,实测单通道时间间隔测量
  • 2026南京黄金回收价格表避坑技巧与商家推荐 - 余生黄金回收