4. 多设备约束表达

在多设备多工序排产中,设备不是“永远在线、随时可用、一次只干一件事”的理想资源。真正决定排产结果是否可执行的,往往是设备侧的五类约束:可用性(这台设备在计划期内到底能不能用)、切换时间(换产品、换模具、换程序要花多久)、并行能力(一台设备能同时承载几个任务或几件料)、维护窗口(计划性保养占用的固定时段)、故障停机(非计划停机的随机占用)。本节把这五类约束统一落到“时间轴上的资源占用”这一共同语言上,使它们能被同一套排产模型处理。

一、把设备抽象成“带时间窗的容量资源”

建模的第一步是统一对象。对每台设备 m,定义三个基本量:

  • 可用时间窗集合 Avail[m] = {[s₁,e₁], [s₂,e₂], …}:只有落在这些区间内的时刻,设备才可能被安排任务。计划期外的时段、班次外时段、已封存时段都不在其中。
  • 容量 Cap[m]:设备可同时承载的任务数或料位数。单工位设备 Cap=1,多工位/多腔/多托盘设备 Cap>1。
  • 不可用区间集合 Down[m]:维护窗口与故障停机都折算为不可用区间,从可用时间窗中扣除。

这样,任何任务 j 在设备 m 上的占用都可写成三元组 (m, [t_start, t_end), q),其中 q 是占用的容量单位数。排产可行性判断就变成:对任意时刻 t,所有落在 t 上的占用容量之和不超过 Cap[m],且 t 必须落在 Avail[m] 内。

二、设备可用性:不是布尔值,而是时间窗

很多初学者把“设备可用”写成 available = true/false,这在单班、单设备场景勉强够用,但一旦出现多班次、跨天、设备共享,就会失真。正确做法是把可用性表达为时间窗列表。例如某注塑机在计划期 3 天内实行两班制,则:

Avail[M01] = [
  [D1 08:00, D1 20:00],
  [D2 08:00, D2 20:00],
  [D3 08:00, D3 20:00]
]

若该设备在 D2 夜班被借调给另一车间,则只需从列表中扣除 [D2 20:00, D3 08:00)。可用性用时间窗表达后,排产算法只需做区间求交,而不必为每种“可用/不可用”组合写特例。

三、设备切换时间:与顺序相关的“隐性工序”

切换时间 ST[m][i][j] 表示设备 m 从加工完产品 i 切换到开始加工产品 j 所需的时间。它有三个关键性质:

  • 顺序相关:ST[m][A][B] 与 ST[m][B][A] 通常不相等,不能简化为一个常数。
  • 可合并:若连续生产同族产品,切换时间可能为 0 或很小;跨族切换则显著增大。
  • 占用设备:切换期间设备不能加工,因此切换时间应作为一段“无产出占用”插入时间轴。

建模时,把切换视为一道零产出工序,其前置是上一任务的结束,后置是下一任务的开始。若设备 m 上任务序列为 j₁ → j₂ → j₃,则约束为:

start(j₂) ≥ end(j₁) + ST[m][prod(j₁)][prod(j₂)]
start(j₃) ≥ end(j₂) + ST[m][prod(j₂)][prod(j₃)]

示例参数:某 SMT 贴片线换钢网,同产品切换 0 min,同系列不同产品 15 min,跨系列 45 min。若排产忽略这 45 min,计划看似紧凑,实际执行时必然拖期。

四、设备并行能力:容量约束而非时间约束

并行能力描述“同一时刻能同时做几件事”。它不改变时间轴,而是改变容量维度。典型场景:

  • 多腔注塑机:一模出 4 件,Cap=4,但 4 件必须同进同出,属于“绑定并行”。
  • 多托盘热处理炉:Cap=6,6 个托盘可独立进出,属于“独立并行”。
  • 多轴加工中心:Cap=2,两个主轴可加工不同零件,但共享换刀时间。

绑定并行与独立并行的建模差异很大:绑定并行要求同一批次内所有任务同时开始、同时结束,可视为一个“超级任务”;独立并行则允许各任务起止时间不同,只需满足任意时刻占用数 ≤ Cap。排产时若把绑定并行误当独立并行,会排出物理上无法执行的计划。

五、维护窗口与故障停机:计划性与非计划性的统一表达

维护窗口是已知的、计划性的不可用区间,例如“每周日 00:00–06:00 保养”。故障停机是未知的、随机性的不可用区间,例如“平均每 200 h 故障一次,平均修复 4 h”。两者在排产模型中的处理方式不同:

  • 维护窗口:直接写入 Down[m],作为硬约束从可用时间窗中扣除,排产前即可确定。
  • 故障停机:不能精确预知,通常用两种方式处理——一是预留缓冲,在设备可用时间中按 MTBF/MTTR 折算扣除一定比例;二是鲁棒排产,生成对一定时长停机不敏感的计划,并在执行中动态重排。

示例:某设备 MTBF=180 h,MTTR=6 h,计划期 720 h,则预期故障停机约 720/180×6 = 24 h。若直接按 720 h 满负荷排产,实际可用仅约 696 h,缺口 24 h 需通过预留或加班弥补。维护窗口则不同,例如每周 6 h 保养,4 周共 24 h,必须精确扣除,不能“平均化”。

设备约束在时间轴上的统一表达(示例:设备 M01,计划期 3 天) D1 00:00 D1 12:00 D2 00:00 D2 12:00 D3 00:00 可用时间窗 D1 白班 D1 夜班 D2 白班 D2 夜班 维护窗口 保养 6h 保养 6h 保养 6h 保养 6h 故障停机 MTBF 180h / MTTR 6h MTBF 180h / MTTR 6h MTBF 180h / MTTR 6h MTBF 180h / MTTR 6h 切换时间 同族 0 / 跨族 45min 同族 0 / 跨族 45min 同族 0 / 跨族 45min 同族 0 / 跨族 45min 并行能力 Cap = 2(双主轴) Cap = 2(双主轴) Cap = 2(双主轴) Cap = 2(双主轴) 实际可排产 扣除维护/故障/切换后 扣除维护/故障/切换后 扣除维护/故障/切换后 扣除维护/故障/切换后 可用时间窗 维护窗口 故障停机 切换时间 并行容量 实际可排产

六、五类约束的联合建模要点

把五类约束放在一起时,最容易出错的是顺序与叠加关系。正确的处理顺序是:

  1. 先由班次、借调、封存生成基础可用时间窗 Avail[m]。
  2. 从 Avail[m] 中扣除维护窗口,得到计划性可用时间。
  3. 按 MTBF/MTTR 或历史故障率,对计划性可用时间做故障缓冲折算,得到可承诺产能时间。
  4. 在可承诺产能时间上,按任务序列插入切换时间,形成带切换的占用链。
  5. 最后用容量 Cap[m] 做并行校验,确保任意时刻占用数不超限。

这五步中,第 2 步是硬扣除,第 3 步是概率性折算,第 4 步依赖排序结果,第 5 步是全局校验。若把第 4 步的切换时间放到第 2 步之前扣除,就会重复扣减;若把第 3 步的故障缓冲当成硬约束,又可能过度保守。工程上通常把维护窗口设为硬约束、故障停机设为软约束或缓冲,二者在模型中的“硬度”不同。

实践提示:在排产系统里,建议为每台设备维护一张“资源日历”,字段包括:设备号、时间窗起止、类型(班次/维护/故障/借调)、容量、切换矩阵版本。排产前先做一次日历一致性校验,确认无重叠、无空洞、容量非负,再进入排产计算。这样能把大量设备侧错误挡在排产之前。
常见误区:把切换时间算进工序工时、把故障停机当成固定扣减、把绑定并行当独立并行,是设备约束建模中最常见的三类错误。它们共同的特点是“看起来省事”,但会让排产结果与现场执行严重脱节。

小结:设备可用性用时间窗表达,切换时间用顺序相关的零产出工序表达,并行能力用容量约束表达,维护窗口用硬性不可用区间表达,故障停机用概率缓冲或鲁棒排产表达。五者统一到“时间轴 + 容量”的占用模型后,多设备约束就能与工序约束在同一框架下求解。