S3 · 采样、聚合与 OEE
挑战:这台机器的效率到底是多少?用 OEE 回答,并说明这个数字有多可靠。你会拿到同一段运行的两份日志,一份 10 Hz,一份 1 Hz,它们算出来的结果并不一样。
你拿到什么
- 同一段运行的两份日志:10 Hz 和 1 Hz,30 分钟,数据已经干净。
- 下文的 OEE 口径和额定产能。
- 你在 S1、S2 写的 skill。
OEE 的口径
OEE = 可用率 × 性能 × 质量。三个因子分别回答:机器有多少时间在运转?运转时有多快?做出来的有多少是对的?
算出来是多少,取决于几条约定。本课程统一使用下面的口径:
| 项目 | 本课程的约定 |
|---|---|
| 计划时间 | 日志覆盖的时长 |
| 额定产能 | 每分钟 21.47 个球,已包含正常的满管排料 |
| 停机(计入可用率损失) | 两臂都停在原位、且不是满管停机,持续 30 秒以上 |
| 短停(计入性能损失) | 同上,但不足 30 秒 |
| 满管停机 | 正常节拍的一部分,不单独扣除;比额定时长慢的部分,自然体现为性能损失 |
| 质量 | 日志看不到球最终进了哪个收集仓,记为 100%,并在报告中注明 |
由此:
- 可用率 = (计划时间 − 停机时间) ÷ 计划时间
- 性能 = 实际球数 ÷ (额定产能 × 运转时间)
- OEE = 可用率 × 性能 × 质量
步骤
1. 从日志里定义事件
OEE 需要的不是一行一行的状态,而是事件:每次满管停机、每次两臂停在原位,各自从哪一刻开始、到哪一刻结束。
把这些事件的定义写进 machine.yaml,用你的代码从日志中提取出来,存成一张事件表。时长一律用时间戳计算。
2. 比较两种采样率
用同一份代码处理 10 Hz 和 1 Hz 两份日志 ,比较:
- 满管停机的次数、总时长、中位时长;
- 两臂停在原位的次数和总时长;
- 球数。
哪些数字两者一致,哪些不一致?差异来自哪里?1 Hz 时,一段持续时间的起点和终点各有多大的误差?
3. 选择聚合层级
OEE 用的是事件层:它需要每次停机的起止时间,但不需要逐行的数据。
再想一想,如果你只拿到每分钟的汇总(每分钟分拣了几个球),哪些问题还能回答,哪些不能?示范页有一个具体的例子。
4. 按口径计算 OEE
按上面的口径,用 10 Hz 的事件表算出可用率、性能、OEE,以及每一项损失折合多少个球。再用 1 Hz 算一遍。
5. 写报告
报告给出 OEE 和三个因子,每个数字都带误差范围,并说明误差从哪里来:采样率、事件定义里的阈值、质量无法观测。
交付
kpi-reportskill:输入日志和machine.yaml,输出事件表和 OEE 报告。- 两种采样率的结果对照,以及对差异的解释。
- OEE 报告,每个数字都带误差范围。
验收
- 10 Hz 的 OEE 和各因子与参考值的差距在给定容差以内。
- 正确指出 1 Hz 下哪些数字不可靠,以及原因。
- 每个数字都附有误差范围和来源。
- 在另一份日志上,你的 skill 不改代码就能跑通。