OEE计算时如何扣除ResourcePool中的非工作时段?
原逻辑缺陷分析
你之前的代码逻辑存在三个核心问题,导致无法正确统计非工作时长:
- 触发时机错误:仅在产品流经对应流程节点时才执行判断,若非工作时段内没有产品经过节点,这段时间完全不会被统计
- 起始时间重复覆盖:若多次触发工人无活跃的判断条件,会反复重写
noworkingTimeStart的值,导致上一段非工作时段的起始时间丢失,最终统计的非工作时长偏小 - 缺少状态标记:没有记录当前是否处于非工作时段的标识,模型启动即处于非工作时段、非工作时段跨多天等边界场景都会出现统计偏差
修复方案
第一步:新增状态变量
首先定义三个全局变量:
noworkingTime:累计非工作时长,数值型,初始值为0noworkingTimeStart:当前非工作时段的起始时间,数值型,初始值为0isNoworking:布尔型状态标记,标记当前是否处于非工作时段,初始值根据模型启动时工人资源池的状态设置:若启动时无活跃工人则设为true,同时将noworkingTimeStart设为启动时间time(),否则设为false
第二步:绑定资源池状态事件
不要将统计逻辑写在流程节点中,改为绑定到workers资源池的状态变化事件上,只要资源池状态变化就触发统计逻辑:
- 在资源池的资源单元变为不可用事件中添加如下代码:
// 最后一名活跃工人变为不可用,正式进入非工作时段 if(workers.sizeActive() == 0 && !isNoworking){ isNoworking = true; noworkingTimeStart = time(); }
- 在资源池的资源单元变为可用事件中添加如下代码:
// 第一名工人恢复可用,正式退出非工作时段 if(workers.sizeActive() > 0 && isNoworking){ isNoworking = false; noworkingTime += time() - noworkingTimeStart; }
第三步:补全边界统计逻辑
如果需要在模型运行结束时统计全周期OEE,需要在模型停止事件中添加如下代码,避免统计终止时仍处于非工作时段的未结算时长:
if(isNoworking){ noworkingTime += time() - noworkingTimeStart; }
OEE计算说明
后续计算OEE使用的有效生产时长直接套用公式:有效生产时长 = 总观测时长 - noworkingTime
即可排除休息、周末等非工作时段的影响。
内容的提问来源于stack exchange,提问作者Manu_CS
相关产品推荐
相关产品推荐

