尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

APS生产计划培训手册:有限产能排产调度核心逻辑

APS生产计划培训手册:有限产能排产调度核心逻辑 简介面向制造业生产计划与供应链管理人员的APS生产计划培训手册以Hitachi Consulting的ASCP高级计划排程模块为主线系统讲解从需求整理、数据准备、计划制定到结果分析与工单下达的完整业务闭环。手册包含ASCP业务流与数据流总览、计划参数设置、例外分析与EDD/ECC结果解读、跟单件与共享件的基础设置及业务操作、中央空调虚拟生产过账方案、预测与产销平衡等内容适合需要掌握APS/ASCP落地方法的生产计划员、IT实施顾问及制造业管理者。资源为单个PPTX培训教材压缩包大小3.74MB目前已有190人学习。读者可借此快速理解ASCP在Midea等企业中的实际数据结构与操作流程获得从数据收集架构、计划参数配置到计划单处理、权限设置的完整方法论可直接用于内部培训或项目参考。1. APS 生产计划培训手册到底在讲什么APS 排产调度要回答的问题在制造车间里从来不是“缺什么料”而是“这台设备明天早上到底先干哪个单”。ERP 的 MRP 计划把 BOM 展开、按提前期倒推给出了数量和日期却默认产能无限APSAdvanced Planning and Scheduling高级计划与排程把这个假设拆掉把工单、工序、设备、班次、模具和优先级全部压到一条时间轴上做有限产能排产。培训手册的读者恰好横跨三拨人计划员要搞懂优先级和插单规则调度员要会读排产甘特图和设备负荷IT 实施顾问要理解数据模型和参数含义。手册的真正作用是把这三类人拉到同一张能落地的排产结果上而不是各编各的 Excel 表。2. APS 排产调度核心逻辑从无限产能到约束网络2.1 MRP 为什么算不出可执行的工序计划MRP 的核心动作是按 BOM 逐层展开需求再用固定的提前期向前或向后推移输出物料和采购建议。它默认每台设备随时可用、产能可以任意放大这跟车间现实明显不符。车间里的每台设备有班次、有速度、有换型时间同一时间只能做一道工序瓶颈设备前必然排队。排产调度要干的正是把“排队顺序”和“开始时间”定下来。培训手册里通常放一张对比表我按经验精简成六行对比维度MRP 计划APS 排产调度产能假设无限产能有限产能按设备/班次约束计划对象物料需求工单工序与资源占用输出形态需求日期每台设备上的时间甘特图优先级只有交期倒推多规则加权 紧急插单变更响应全局重算计划震荡冻结期外局部重排回到车间仅作参考直接指导开工和完工这张表想说明一件事APS 排产调度不是把 MRP 的报表换个界面而是把“计划”从数量维度推进到时间维度。计划员如果把 MRP 数量当排产输入、再把 APS 结果当 MRP 的补充报表多半会把项目做成一个昂贵的数据搬运工具。2.2 约束建模工单、工序、资源三者如何对齐APS 排产调度的建模对象无论哪种系统都能拆成三层。第一层是排产单元通常以工单为主键工单下挂工序。工序之间有先后关系也可能有并行关系比如同一订单的多个部件同时在不同设备上加工。第二层是资源包括设备、模具、工装和人员每个资源都有可用日历和产能上限。第三层是约束设备约束、物料齐套约束、时间窗口约束、人工干预的固定锁定约束。这三层组合出一张约束网络。排产调度的过程就是在网络中寻找一个可行时间表让每道工序都拿到资源、都不穿越禁用的时间窗口然后在这个基础上优化。系统是不是“真 APS”看它是否真的把设备和工序一一匹配而不是只在工单上加一个计划完工日期。真排产会产出工序级甘特图伪排产只给你一个日期后面的时间全部由计划员脑补。2.3 优先级规则和“越急越优先”的权重设计“越急越优先”听起来像把紧急工单往前挪真正落地却要回答一个问题急怎么量化。常见规则有 EDD交期最早优先、SPT加工时间最短优先、FCFS先到先服务、CR剩余时间与剩余加工时间的比值。工厂里很少单用一条规则更多是把它们合并成一个加权分priority_score w1 × (1 / critical_ratio) w2 × urgent_flag w3 × 客户等级权重其中 critical_ratio 是剩余可用时间除以剩余加工时间比值越小说明越危险urgent_flag 是 0/1 的插单标记客户等级权重由销售策略决定。w1、w2、w3 是排产参数越怕延期就把 w1 调大越重视重点客户就把 w3 调大。用代码表示也就是# 排产优先级交期系数 急单加权 客户权重 def priority_score(job, clock): critical_ratio (job.due_date - clock) / max(job.proc_time, 1) return w1 / critical_ratio job.urgent * w2 job.customer_weight * w3critical_ratio 小于 1 意味着按当前加工能力已经来不及按期完成这一项会把分数迅速拉高urgent 字段是急单的硬标记客户权重则是把销售端的议价能力带进排产。真正项目里这三个权重不是一次性定死的上线头一个月基本都在调它们。需要提醒的是紧急插单不能无限制使用。每次插单都会挤占其他工单的资源插得越多系统越接近“全线紧急”这时优先级规则事实上失效。培训时要给出一条纪律紧急插单必须附带重新确认被影响工单交期是否仍然成立的步骤。提示不要把“越急越优先”做成一刀切的强制置顶。生产中更稳的做法是给紧急订单一个高权重让它在排产算法里“大概率排在前面”而不是“必然排在最前”。强制置顶往往会卡住瓶颈设备反而扩大整体延期。3. 用 Python 本地跑通 APS 排产调度最小演示3.1 用最小数据模型描述一张排产任务很多系统上线前顾问先用 Python 或 Excel 验证排产逻辑是否合理。这里给一个可直接运行的最小排产调度演示核心逻辑只有 40 行左右。先定义工单数据结构from dataclasses import dataclass dataclass class Job: job_id: str arrive_time: int # 可开始时间小时 due_date: int # 承诺交期 proc_time: int # 占用设备时长 priority: float # 基础优先级越大越优先 urgent: bool False # 是否紧急插单字段的含义要逐个讲清。arrive_time 表示工单具备开工条件的最早时刻物料没齐、前工序没完成都体现在这里due_date 是排产必须尽量满足的硬约束proc_time 是工序在设备上的加工时间不含等待priority 是业务给的常规优先级urgent 字段用来模拟“越急越优先”的插单场景。业务人员不关心字段名但要能对应到自己提交给系统的排产参数。3.2 用 heapq 实现一个基于优先级的排产调度器下面的函数在有限设备数下逐小时推进时间把已到工序放入待排池再按“高优先级优先、同优先级按交期早优先”的规则分配设备import heapq def schedule_by_priority(jobs, machine_count3): jobs sorted(jobs, keylambda j: j.arrive_time) result {} # job_id - (开始, 完工, 设备号) avail_at [0] * machine_count # 每台设备下次可用的时刻 pool [] # 待排池用小根堆实现优先级排序 idx 0 clock 0 while idx len(jobs) or pool: # 把当前时刻前已到达的工单压入待排池 while idx len(jobs) and jobs[idx].arrive_time clock: job jobs[idx] urgent_bonus 1000 if job.urgent else 0 # 负号是为了用最小堆实现最大堆括号里是排序键 heapq.heappush(pool, (-(job.priority urgent_bonus), job.due_date, idx)) idx 1 if not pool: clock jobs[idx].arrive_time continue _, _, job_idx heapq.heappop(pool) job jobs[job_idx] # 选择最早空闲的设备 machine min(range(machine_count), keylambda m: avail_at[m]) start max(clock, avail_at[machine]) end start job.proc_time result[job.job_id] (start, end, machine) avail_at[machine] end clock end return result这段代码的三个设计点需要展开讲。第一urgent_bonus 是显式的急单加权1000 是一个演示值目的是确保急单在堆里排到普通单前面真实系统里这个权重需要与 w2 对齐不是越大越好。第二堆的排序键是(-(priority urgent_bonus), due_date)先比优先级再比交期这意味着同一优先级下交期越近越先被取出这是 EDD 与业务优先级的自然合并。第三start max(clock, avail_at[machine])保证工序不会在同一设备上重叠也不会早于系统时钟开工这是最小可行排产的正确时空逻辑。这段贪心逻辑只是排产调度算法的一类。真实系统在工序数量大、约束交错时会换用约束满足CP或元启发式搜索遗传算法、模拟退火等但所有复杂算法的目标仍然是同一件事在资源时间轴上给出可行且尽量贴近交期的排布。培训时从贪心讲起学员最容易理解优先级和约束这两个基本概念。3.3 紧急插单对比实验看结果再下结论用两组数据验证“越急越优先”的实际效果base_jobs [ Job(A, 0, 10, 3, 1), Job(B, 1, 6, 2, 2), Job(C, 1, 8, 4, 1), Job(D, 2, 12, 2, 1), Job(E, 3, 7, 2, 1), ] normal schedule_by_priority(base_jobs, machine_count2) urgent_jobs base_jobs [ Job(U, 2, 4, 1, 0, urgentTrue), ] urgent schedule_by_priority(urgent_jobs, machine_count2) for jobs, name in ((normal, 普通排产), (urgent, 紧急插单)): print(f {name} ) for jid in sorted(jobs): s, e, m jobs[jid] print(f{jid}: {s}h - {e}h 设备{m})运行后可以看到普通排产里 B 和 E 因为交期早排在前插入 U 之后U 因 urgent 权重极高被很快安排到空闲设备上普通单 C、D 的开工时间被向后推移其中 D 的计划完工时间越过交期。这个对比要讲给学员的不是“U 被插队了”这个表面事实而是D 的完工时间是否仍小于 due_date如果不满足就要触发交期确认流程。APS 排产调度的价值不是保证所有单都不延期而是把延期后果显式暴露出来让计划员提前决策。4. APS 生产计划手册里关键参数与数据取数方法4.1 排产参数从哪来五份基础数据真实项目里APS 的输入数据远不止工单。设备台账、班次日历、工艺路线、换型矩阵、物料齐套时间五份数据缺一不可。设备台账给出设备编号、所属产线、可用状态班次日历决定哪些时段是可排产时间工艺路线提供标准工序和工时换型矩阵描述同一设备上不同产品切换的准备时间物料齐套时间来自 ERP 的采购承诺与库存可用量。这套数据里最容易出问题的是物料齐套时间。ERP 里的到货日期经常是采购承诺而不是实际到货APS 排产调度一旦把这个日期当真排出来的开工时间就可能和仓库实际对不上。所以在培训手册里我建议先做数据体检随机抽 20 个近期已完工工单把系统里的工序工时与实际记录对比偏差超过 20% 的字段先修正。4.2 三个必调参数优先级权重、提前期缓冲、设备负载率APS 项目上线后头两个月通常都在调参。按照我参与实施的经验最先动的是下面三个参数初始建议调大的效果调小的效果紧急/普通优先级权重差100 : 1急单几乎立即上线普通单等待变长插单效果不明显急单保障不足工序间接驳缓冲历史等待时间 P80计划更稳等待时间占比上升计划更紧凑执行偏差率上升设备最大负载率85%~90%留有余量能容纳临时插单排产更“满”波动一来全线崩溃三个参数的共性在于它们都是“留白”手段。负载率调低是给设备留白缓冲调大是给工序间留白优先级权重差则是给急单留白。很多工厂一上来想把设备负载率排到 95%结果一个急插单就能让当天的排产全线重排。现实里排产调度追求的不是最大利用而是尽可能稳定地执行。4.3 换型时间手册里必须单独讲的隐藏参数换型时间setup time在排产调度中容易被忽略却往往对结果影响最大。同一台设备加工 A 产品再切换 B 产品中间要清洁、换模、调试几分钟到数小时不等。不同品种之间的切换时间还可能不对称比如从白色切换到黑色可能只要 10 分钟反过来要 40 分钟这才是换型矩阵存在的意义。用代码表示就是# 换型矩阵二维字典(前产品, 后产品) - 换型分钟数 setup_matrix { (A, A): 0, (A, B): 10, (B, A): 40, (B, B): 0, } def setup_time(prev_product, next_product): # 查不到时给一个保守默认值避免排产把换型算成 0 return setup_matrix.get((prev_product, next_product), 15)培训时用一个 2×2 矩阵就能讲清两个产品、一台设备按什么顺序排取决于切换时间的总和。把这个矩阵教给计划员他们才会理解为什么排产系统有时会让一台设备连续做同一品种而不是按交期先来后到。在代码里体现这一点的常见做法是把换型时间加进设备上的工序间隔也就是在avail_at[machine]上额外累加换型时长。4.4 冻结期和插单重排的边界排产结果不能每小时都变否则车间没法执行。因此系统需要冻结期frozen horizon在一段时间里已经下达的工序保持锁定只有锁定区间外的订单参与滚动重排。插单发生时急单首先要看是否落在冻结期外落在冻结期内则不能直接创建必须走人工强制变更流程。这条边界写进培训手册能避免绝大多数“昨天刚排今天就全变”的投诉。5. 排产结果的收货验证三道检查和一个基线对比技巧5.1 约束检查和交期检查怎么在本地做得到排产结果后不要在甘特图上看一眼就宣布完成。我一般写一个十几行的校验函数把所有工序过一遍def validate(result, machines): violated [] for jid, (s, e, m) in result.items(): if s 0 or e s: violated.append((jid, 时间非法)) if m not in range(machines): violated.append((jid, 设备越界)) return violated这段代码检查的是基本的时间与设备约束。真实系统里还要叠加班次日历校验即确认工序的每个时间段都落在设备的可用班次上。交期检查则是把 result 里每个 job 的结束时间与 due_date 对比超出部分归到交期偏差集合。把这两步做成函数放进排产任务的回归用例里今后每次调参都能自动跑一遍防止几个星期前的参数改坏今天的排产。5.2 执行偏差检查的量化口径执行偏差检查的口径有三种开工时间偏差、完工时间偏差、设备占用时长偏差。最简单的是完工时间偏差取“实际完工时间 - 计划完工时间”的均值再除以平均计划加工时长得到一个无量纲的偏差率。偏差率低于 10% 表示排产计划对现场有指导力超过 30% 表示基础数据或排产参数已经失真需要回头排查工时表和设备速度。这个口径要在培训手册里写明否则每个部门按自己的口径统计结果永远对不上。5.3 一个向学员演示排产价值的技巧先跑无优先级基线最后分享一个我每次培训都会用的演示技巧先跑一遍所有工单优先级相同的排产再跑一遍按正式权重排产的版本把两个结果放在同一张设备负荷表里对比。操作上只是把schedule_by_priority的调用参数全部设为相同常数不需要改代码。对比的观察点有三个急单是否被提前、普通单的等待是否过长、设备负载是否更均衡。如果两组结果几乎一样说明当前订单池并不拥挤APS 的优先级机制还处在“有机制但这批订单未触发”的状态如果差异明显说明“越急越优先”真正改变了当天的生产顺序。这个基线方法除了演示也可以用于每次排产后的复盘用来判断优先级策略是否需要调整。本文还有配套的精品资源点击获取
返回列表