多品种小批量排产实战:开源APS如何破解有限产能与换型难题
多品种小批量排产这件事凡是干过生产计划的人都知道是个硬骨头。我自己的车间里就遇到过这种场景同一个平台下有几十种变型规格每个规格还可能拆出五六个选装配置看起来只是型号尾巴差了几个字母工艺路线、加工时长、换型要求完全是对着另一个脾气。订单来了不是几百台一起压下来而是隔三差五来几十台交期还都不短不长的。以前用Excel排排完自己都不敢看后来换了个思路搭了一套开源APS系统做有限产能排产才算是把这摊乱账给捋明白了。这篇文章就聊聊我是怎么理解多品种小批量排产这个需求的以及开源APS在面对N种规格、动态订单、换型损耗这些实际问题时到底能精准到什么程度。想看现成方案照抄的可以直接跳到第4部分想搞清楚排产模型为什么这么搭的建议从第1部分顺着读下去。1. 多品种小批量排产到底难在哪需求拆解与问题边界1.1 多样化需求下的三种排产困境很多人以为排产难是因为订单太多其实不是。订单多但品种单一Excel都能干。真正难的是多样化这三个字带来的连锁反应。我们车间遇到的情况很有代表性产品按系列分有十几个每个系列下面又有3到4种规格再叠加颜色、电压、接口、包装形式这些可选属性最终落地的SKU规格能有上百种。看起来每个规格之间只是改了某个零件但瓶颈工序的加工时间、所需工装、换型时间全都不一样。第一个困境是抢资源。多品种意味着订单会分散到不同的工艺流程上但最终一定会汇聚到几个共用瓶颈工序上比如CNC加工中心、老化测试台、专用焊机。几百个订单同时涌过来瓶颈资源上到底先做哪个、后做哪个直接影响交付。第二个困境是换型损耗。规格切换频繁设备就要反复换刀、换夹具、调整参数。我们实测过某些精密设备换一次型要30到45分钟如果一天切换8次光换型就消耗4个小时产能白白没了。第三个困境是交期承诺。多品种小批量订单往往交期紧计划员手动排的时候只能按经验挤出一个时间但这个承诺到底靠不靠谱没有任何数学模型来验证。这三个困境叠加在一起其实就是一句话需要在有限产能、复杂换型、多交期约束下找到一套能按期干完且损耗最小的生产顺序。这已经不是手工排产能解决的事了。1.2 什么叫精准排产为什么Excel和MRP不够用精准排产不是把订单排到某一天而是要把每个工序、每台设备、每个时段都明确下来。你排到3号开始加工和排到3号上午10点到下午3点在CNC-02上加工4号上午换夹具转规格B是两种完全不同的精细程度。真正可执行的计划必须精确到资源、到工序、到起止时间否则车间执行时还要二次解读一解读就乱。Excel排产最大的问题是没有容量约束的概念。它只能做时间上的排队不能回答这台设备今天已经超负荷了你的新订单该往哪儿塞这类问题。MRP系统解决的是物料需求它假设产能是无限的算出来的计划往往让设备一天干30个小时自然没法落地。开源APS则不同它先把设备、人员、日历、换型时间都建模成约束再通过算法在约束范围内寻找可行解。它输出的是一个在现有条件下真正能干出来的计划这跟Excel、MRP相比是方法论上的差别。2. 开源APS系统的核心组成与选型思路2.1 开源APS不是一个软件而是一套组合很多人一听到开源APS下意识觉得是可以直接下载一个安装包装完就有排产界面了。实际上我用了这么多年的体会是开源APS更像是一个排产引擎业务数据集成可视化界面的组合体。引擎负责算业务层负责管工单和资源界面负责让人能看懂和干预结果。真正跑起来的系统通常由三块拼起来一是排产求解引擎负责把约束和优化规则变成数学模型二是MES或ERP里的基础数据包括工单、工艺路线、设备日历三是一个能让计划员手动调整、锁定任务的交互界面。我们落地的时候刚开始以为难点在算法上后来发现大部分时间花在数据梳理和流程对齐上。算法再强如果设备日历是错的、工艺时长是拍脑袋估的排出来的计划照样没法用。所以选型前先别盯着哪个开源项目的界面好看先盘清楚自己的数据和流程能不能支撑一个排产系统。2.2 选型前必须弄清楚五个问题第一个问题你的瓶颈资源是什么。如果车间里设备类型很多但真正卡脖子的一直就那几台那排产模型可以做得轻一点如果多条产线互相牵扯、没有固定瓶颈那模型要复杂很多。第二个问题换型时间是需要精确到工位级别的还是按产线级别的近似值就行。有些企业换型时间对总产能影响不大那可以在规则里简化像我们这种换型半小时起步的必须建模而且要区分同类规格快速切换和跨系列完全换型。第三个问题生产节奏是连续式的还是离散式的。多品种小批量通常会涉及批量和拆分一个订单可能拆成多个批次也可以多个订单合并成一个批次生产这决定了系统里批量相关参数怎么配。第四个问题是否需要逆向排产按交期倒推还是正向排产尽早开工就够用了。第五个问题计划员是否要求能手动干预。很多车间计划员都有自己的一套经验顺序开源系统要支持先自动算再手动锁定再重算未锁定部分否则再好的计划也会被抵触。2.3 常用开源组件对比参考市面上的开源APS和排产引擎各有侧重这里分享几个我实际调研过的方向仅供参考。组件类型典型方向适合场景不足通用开源求解器OR-Tools、OptaPlanner离散排产、约束优化、路径优化需要自己写业务模型和界面开源APS平台部分基于Web的有限产能排产项目快速搭建、看板管理成熟度参差插件和文档未必全轻量排产模块某些开源ERP/MES中的排产插件与ERP数据天然打通模型深度有限复杂换型难处理我们最终选型的原则是不求算法最强大只求数据贴合和可控性。业务千差万别过重的平台有时反而限制发挥。我自己偏向用通用求解器做引擎再用Python写一层面向业务人员的规则这样既保留灵活度也能让计划员理解排产逻辑的边界。3. 先把排产模型搭对资源、日历、工艺路线与批量策略3.1 生产能力建模资源是什么日历怎么定排产模型的地基是资源模型。资源不等于一台设备它可能是单独一台机器也可能是一台机器加一个操作工还可能是一组互相备份的设备。建模时想清楚这一个点能少走很多弯路。我们在系统里把资源分成了两类瓶颈资源和非瓶颈资源。瓶颈资源比如CNC加工中心每种设备单独建模日历跟着实际班次走非瓶颈资源比如普通检验台因为理论上富余就合并成一个无限容量的资源池不参与排产计算。这样做的目的是降低模型复杂度让引擎把算力集中在真正影响交付的关键资源上。日历方面除了常规的上班时间还要把设备保养、节假日、计划内停机都录进去。很多排产结果失真的原因就是漏了设备的保养窗口。参数选择这里有个经验值资源可用率不要按100%算至少要留10%-15%的缓冲用于处理设备故障、临时抽检、员工培训这些计划外事务。比如一台设备每天两班倒可用16小时考虑85%的可用率排产时一天最多只能塞进13.6小时的工作量剩下的2.4小时就是安全垫。3.2 工艺路线的颗粒度决定排产精度同样的产品工艺路线可以定义得很粗比如下料-加工-喷涂-装配四道工序也可以定义得很细比如把加工拆成CNC粗车- CNC精车-去毛刺-清洗四道子工序。颗粒度越细排产精度越高但数据维护量和计算时间也会成倍上升。怎么平衡取决于瓶颈所在。我的建议是凡是要经过瓶颈资源的工序必须细化到工序级不经过瓶颈的工序合并到上一道工序里也没关系。有的车间把工艺路线维护得非常细每道工序都精确到秒但瓶颈设备只有那两台其他工序全都是富余的结果模型参数多到没人维护最后排产结果反而不准。先粗后细把瓶颈工序吃透比追求全流程精细更实际。工艺路线还有一个容易忽略的点平行工序。比如两台设备可以同时加工同一个工单的不同批次如果系统里把所有工序都变成串行关系排产时间会被严重拉长。正确做法是定义好合并和拆分规则同一个工单内如果没有前后的物理约束可以让它在多台设备上并行开工。这点在开源引擎里通常用工序类型参数区分排产前一定要检查默认值。3.3 批量合并与换型时间的处理多品种小批量排产必须处理批量策略否则规格一多每台设备都会频繁换型。我们先算了一笔账假设设备一天可用13.6小时换型一次要40分钟如果一天换8次型可用时间就只剩8.3小时产能直接掉一大截。所以批量策略的核心就是要在降低换型次数和满足交期之间找平衡。具体做法是设置最小批量和最大批量两个参数。最小批量用于防止订单被拆得过于零碎最大批量用于防止一个批次大到把交期拖延。如果几个订单的规格相同或接近并且换型时间接近零系统会自动把它们合并成一个生产批次如果规格切换代价大则尽量把同规格订单集中排在一起把换型次数压到最少。这个逻辑在系统里通常表现为换型矩阵同一系列从A规格切到B规格换型时间只有5分钟从A系列切到C系列要45分钟。有了这个矩阵算法才知道怎么排列组合最划算。setup_matrix: desc: 换型时间矩阵分钟 values: A-A: 0 A-B: 5 A-C: 45 B-A: 10 B-B: 0 B-C: 35 C-A: 40 C-B: 30 C-C: 0我踩过的坑是一开始把换型时间全录入成平均值结果算法里所有规格切换都按同一种损耗处理排出来的计划表面好看实际执行时发现有些切换根本来不及。后来改成矩阵式录入排产结果才真正贴近车间。4. 实操过程从数据清洗到跑出第一版排产计划4.1 数据准备阶段先处理这三类脏数据再好的算法也怕脏数据。我建议在第一次跑排产之前先集中清理三类数据工艺时长、资源绑定、工单状态。工艺时长是排产精度的根本。我们车间一开始直接沿用工艺卡上的标准工时结果发现有些规格改了设计后工时没更新排产算出来产能富余实际做起来却天天加班。后来我组织人把瓶颈工序的近三个月实际加工时长翻出来和标准工时做了一次对比偏差超过15%的全部修正。资源绑定是另一个重灾区。系统里有些设备编号已经报废了但工单仍然绑在这台设备上有些新设备已经进场工艺路线却一直没更新。这类问题不清理排产引擎会以为自己只有两台设备可用白白浪费产能。工单状态更不用说。已经关闭的工单、被挂起的工单、重复录入的测试工单如果不筛掉排产结果会出现一大堆占着资源却不产出的幽灵任务。我们当时用一条简单SQL就把无效工单挑了出来状态列不在正常集合里的全部归档只保留待下达和执行中两类参与排产。4.2 配置工单优先级与交期约束数据清理完接下来就是给工单排优先级。优先级直接决定资源不够时谁先做。我们最开始时用了一个很粗的规则交期越早越优先。但跑出来的结果很尴尬——某个不重要的小订单只因为交期近把大客户订单的瓶颈资源抢走了导致整体交付更差。后来我们把优先级改成组合权重交期紧迫程度占大头客户等级和订单金额作为附加权重同时加了一个不允许超过交期的硬约束除非手动解锁。权重参数不是拍脑袋定的我们用历史订单跑了几轮模拟对比按期交付率才把三者的比例定下来。排产时系统会优先分配瓶颈资源给高权重订单同时利用小批量订单的灵活性填缝。优先级配置原则上还要避免全部都是高优先级。如果每个订单都被标成紧急那排序规则就失效了。系统里我通常只允许15%的订单是最高优先级其余按正常规则排这样才能保证算法有腾挪空间。4.3 运行第一次排产看甘特图到底看什么第一次跑完排产打开甘特图的时候大多数人会先看每台设备的任务排得满不满。其实我建议先看三类东西。第一看瓶颈资源上有没有大段空白。如果有空白说明要么是日历设置错了要么是前置工序没完成导致资源等待。第二看换型是否过于频繁。甘特图上如果同一天内同一个设备上的颜色换来换去说明批量策略没有生效算法在拼命满足交期但牺牲了换型损耗。第三看交期违约情况。第一版计划通常会有少量订单超过交期这很正常重点不是去骂系统而是看它是哪些订单、因为卡在哪道工序上从而判断是产能不足还是规则不合理。我在看甘特图时还会打开负载率视图。负载率设备被分配的总工时/可用工时。如果瓶颈设备负载率超过100%系统当然跑不出来如果低于70%说明排产条件太宽松还有接单空间。这个数字是跟销售、计划员沟通最有效的依据。4.4 用约束条件逐步逼近可执行计划开源APS排产往往是一次跑完再调优而不是按一个按钮就万事大吉。我的节奏是这样的第一版先只跑交期约束看看瓶颈设备到底缺多少产能第二版加入换型矩阵把同规格订单尽量靠在一起第三版加入人工锁定的已开工任务让系统把剩余订单塞进可用时间。每加一层约束排产结果就更贴近真实但计算时间也会变长。计算时间这块要给足耐心。几百个工单、几十台设备小规模排产在普通电脑上几十秒到几分钟都是正常的。如果超过半小时还没出来通常不是算力不够而是模型里加了太多无用的细节或者约束之间存在矛盾导致求解器一直在找可行解。这时候我会砍掉非瓶颈资源的详细建模或者把工单中已经完成的前置工序直接忽略只从当前工序开始排。这个滚动窗口的做法能让计算时间从几十分钟降到几分钟实用效果也不差。排产结果出来后我习惯让车间主任先从经验角度挑三个毛病再决定要不要调整权重。系统是帮人干活的不是替人做主。计划员永远有权用经验推翻某一条规则只是推翻之后要把原因补进规则说明里下次算法才能学得更聪明。5. 常见问题与排查技巧实录5.1 排产结果看似合理实际没法干这是我遇到最多的问题现象是甘特图上每台设备排得满满的但计划员一看就说这干不了。排查方向通常有两个一是资源模型没有考虑辅料和工装比如某台设备同时要配一台专用夹具系统里夹具没建模导致设备空闲但任务被安排上去二是没有设置同一设备上的订单间切换时间只排了生产时间忽略了清洁、首件检验这些附加动作。解决方法是把所有资源相关的约束性附件都建模或者在工序时间上统一加一个宽放系数。5.2 一台设备被排到上个工序还没干完表现是甘特图上某个设备的生产任务从上午10点开始但它的前道工序下午2点才结束形成了明显的时间倒挂。这个问题出在工序间的传递关系配置有误或者系统没有启用工序间等待时间。比如工件加工完需要冷却4小时才能进入下一道工序这个冷却时间必须作为工序间隔录入否则算法默认上一道结束下一秒就能开始下一道。我把这些固化要求整理成一个间隔时间字典每种物料类型对应一个等待值之后这种倒挂就很少出现了。5.3 排产太慢或长时间不结束遇到计算时间暴涨先检查是不是非瓶颈资源也被详细建模了。有些设备明明富余50%以上但因为模型里把它和瓶颈设备放在同一优先级上导致求解变量数量暴增。我的做法是在预处理阶段就把非瓶颈资源直接从排产模型里移除只在最后用来提醒该资源负载过高这样计算量会小很多。还有一个常见原因是最小批量和工序拆分设置互相冲突比如系统可以把工单拆成10批但每批又要小于某个值这种互相矛盾会逼着求解器无限搜索。遇到这种情况先把拆分逻辑改为不拆分确认排产正常后再逐步放开。5.4 N种规格太多导致内存溢出规格多并不直接导致内存溢出真正导致溢出的是规格之间的组合关系太多。排产引擎要为每种规格、每台设备、每个时间段建立变量如果规格有几百种每种又有七八道工序变量数量很容易上千万。我的处理办法是分两步第一步先按瓶颈资源做粗排只排瓶颈工序得到一个大致的优先级顺序第二步再把这个顺序作为约束细化到全工序逐步生成精确计划。也就是先粗后细、分步排产大幅减少同时计算的变量数量。5.5 常见问题速查表现象常见原因处理办法设备排满但车间执行不了缺少工装/辅料约束把关键附件建模为资源工序之间时间倒挂缺少间隔时间和传递约束补充工序间隔字典排产超时非瓶颈资源参与计算预处理移除富余资源规格多导致内存不足组合关系爆炸分步排产、缩小时间窗口换型太频繁批量策略未启用设置最小/最大批量并启用换型矩阵个别订单一直排不上优先级权重失衡降低非关键订单优先级并检查硬约束排产计划天天变基础数据没人维护建立数据责任人机制每周核对一次工时和日历6. 个人体会开源APS的落地节奏与投入产出开源APS真正值钱的地方不是省了软件采购费而是把原来藏在老师傅脑子里的经验变成了可以验证、可以调整、可以传承的规则。以前车间里换一个计划员整个排产节奏要乱两三个月现在只要规则文件还在谁接手都能在系统里看到每一个任务为什么这么排。落地节奏上我强烈建议别一上来就追求全局最优。先把瓶颈资源加进去跑出人工计划70分的水平让车间看到系统确实能排出可执行的计划再逐步加换型、加批量、加多目标优化。每一步加规则之前都跟车间对一次结果确认没有引入新的问题。我们就是这样从最初5台瓶颈设备开始到现在覆盖整个车间几十台设备和几百种规格前后迭代了近半年但每一步都走得比较稳。最后再分享一个实用小技巧每次调整排产规则前先把上一版计划导出一份存档再在系统里开一个新的规则版本去跑。这样如果新版结果变差了随时能回滚到旧版还能对比两个版本之间的差异。我们在迭代过程中至少有一半的规则调整是靠这种版本对比来验证的。开源APS的灵活就在这里它允许你不断地试错、不断地逼近真正适合你车间的最优解。