一汽丰田发动机产线作业测定与 AGV 物流路径重构
在发动机装配车间开展标准化作业时间观测,以秒表测时与 MOD 模特法完成工序动作分解,用山积图与节拍平衡率定位全线瓶颈;针对物料配送环节,对 AGV 运行轨迹进行路径网络建模,识别并简化交叉干涉点。改善路径分「现场测定 → 瓶颈识别 → 方案比选 → 收益测算」四步推进。
📌 一、 现场命题:串联流水线的瓶颈放大效应
发动机装配属于典型的高度专业化串联节奏流水线。在这种结构下,全线产出能力并不由平均工时决定,而是被耗时最长的工位(瓶颈工序)单向锁死 —— 这就是节拍管理中的木桶效应。
现场观察到的核心矛盾集中在两处:一是瓶颈工位的作业内容存在大量非增值活动(MUDA),工人反复转身取件、翻找工具、等待物料到位,这些动作并不改变产品形态却实实在在地吃掉了节拍;二是物料配送与作业节拍失配,AGV 采用「按需呼叫」模式,多条双向路径在同一通道内交叉,一旦发生会让行,配送延迟就会传导为工位停工等待。
⏱️ 阶段 1:现场作业测定
- 秒表连续测时法,按工位逐循环记录
- MOD 模特法拆解到动作单元级别
- 剔除异常值并做评比系数修正
🔍 阶段 2:瓶颈识别
- 山积图呈现各工位工时构成
- MUDA 四类分解:等待 / 搬运 / 翻找 / 走动
- 与客户节拍线比对,锁定超线工位
🔀 阶段 3:方案比选
- AGV 路径网络建模,标注交叉干涉点
- 按需取件 / 定拍巡回 / 混合三种模式比选
- 从里程、等待率、实施成本三维打分
📈 阶段 4:收益测算
- 平衡率与平衡损失率前后对比
- 物流周转节拍与单循环里程测算
- 产能释放的情景推演
⏱️ 二、 作业测定:工序工时谱与 MUDA 分解
对装配线 6 个关键工位开展连续循环测时,并将每个循环的工时拆分为增值作业时间与非增值活动时间两部分。增值部分指直接改变工件形态或装配状态的作业;非增值部分按 MUDA 口径细分为等待、搬运、翻找、走动四类。
| 工位 | 增值作业 (s) | 非增值 MUDA (s) | 实测总工时 (s) | 非增值占比 | 节拍状态 |
|---|---|---|---|---|---|
| OP10 缸体上线 | 38.2 | 5.1 | 43.3 | 11.8% | 达标 |
| OP20 曲轴装配 | 44.6 | 8.4 | 53.0 | 15.8% | 临界超线 |
| OP30 活塞连杆 | 46.8 | 11.9 | 58.7 | 20.3% | 🚨 全线瓶颈 |
| OP40 缸盖气门 | 41.5 | 6.7 | 48.2 | 13.9% | 达标 |
| OP50 总装终检 | 35.4 | 4.6 | 40.0 | 11.5% | 余量充足 |
| OP60 试漏检测 | 33.0 | 3.2 | 36.2 | 8.8% | 余量充足 |
一个容易被忽略的规律是:非增值占比与工位总工时高度正相关。OP30 的非增值时间达 11.9 秒,占比 20.3%,是全线最高;而工时最短的 OP60 非增值占比仅 8.8%。这说明瓶颈不是「工人手脚慢」,而是工位布置与物料供给方式让该工位被迫承担了最多的无效动作。
非增值活动 (MUDA) 四类构成
对 OP30 的 11.9 秒非增值时间做进一步拆解,可以看清改善的着力点究竟在哪一类动作上:
├─ 翻找与拿取工具(工具架布置不合理,需转身二次定位) 4.6 s 38.7%
├─ 等待物料到位(AGV 配送延迟传导的停工等待) 3.4 s 28.6%
├─ 工件搬运与台面间转移 2.5 s 21.0%
└─ 工位内走动(跨台位取标准件) 1.4 s 11.8%
翻找工具与等待物料两项合计占 67.3%,且都不属于「操作者技能」范畴,而是工装布置与物流供给方式导致的系统性浪费。改善方向因此收敛为两条:工位定置化管理 + 物料配送模式重构。
🔀 三、 方案比选:AGV 物流路径网络重构
物料配送的等待问题,根因在多条 AGV 双向路径共用同一通道。把工位抽象为节点、AGV 行驶通道抽象为边,绘制路径网络后可以清晰看到:按需呼叫模式下的双向路径产生了 3 处交叉干涉点,每次会让行都会给配送引入随机延迟,而延迟又直接转化为瓶颈工位的停工等待。
三种配送模式比选
| 配送模式 | 交叉干涉点 | 单循环里程 (m) | 线旁齐套等待率 | 实施成本 | 综合评价 |
|---|---|---|---|---|---|
| 方案 A · 按需呼叫取件 (现场现状) |
3 | 186 | 8.6% | 基准 | 不可控延迟传导 |
| 方案 B · 单台套箱定拍巡回 | 0 | 164.8 | 0% | 路径重划 + 料箱改造 | ✅ 采纳 |
| 方案 C · 混合(A + B) | 2 | 178 | 3.2% | 路径重划 | 改造不彻底 |
选型逻辑:方案 C 看似折中,但由于保留了部分按需呼叫路径,交叉干涉点只从 3 处降到 2 处,等待率仍达 3.2%,改善收益被「残余干涉」稀释。方案 B 虽然需要同步改造料箱(由零件箱改为单台套件箱),但一次性把干涉点清零,等待率归零,因此被采纳。
配套工位改善举措
🧰 1. 工位定置化管理
按动作经济原则重新布置 OP30 活塞装配台的工具架,把高频取用工具移到双手自然作业域内,消除转身与二次定位,压缩「翻找与拿取」4.6 秒中的大部分。
🤖 2. AGV 套件配送前置化
曲轴轴瓦、活塞销等标准件由「按需取件」改为「单台套箱定拍巡回配送」,线旁齐套等待率由 8.6% 降为 0,直接消除「等待物料到位」的 3.4 秒。
⚖️ 3. 跨工位工步转移
利用 OP60 试漏检测工位(36.2 秒,余量充足)吸收 OP30 的连杆螺栓二次标记工步,实现全线负荷平顺化,避免瓶颈改善后出现新的次瓶颈。
📈 四、 量化收益与产能释放测算
产线平衡率衡量的是各工位负荷的均衡程度,其定义为各工位工时之和与「工位数 × 瓶颈工时」之比:
改善前:ΣT_i = 279.4 s,max(T_i) = 58.7 s(OP30)
LBE_before = 279.4 / (6 × 58.7) = 79.3% ➔ 平衡损失率 20.7%
改善后:ΣT_i = 271.1 s,max(T_i) = 51.6 s(瓶颈已转移至 OP20)
LBE_after = 271.1 / (6 × 51.6) = 87.6% ➔ 平衡损失率 12.4%
平衡率净跃升:+8.2 个百分点
一个值得记录的副产品 —— 瓶颈漂移:OP30 从 58.7 秒压到 47.6 秒之后,全线的约束点并没有停在 OP30,而是转移到了原本「临界超线」的 OP20(51.6 秒)。这说明改善不能只盯着当前瓶颈改:如果不把 OP20 一并纳入改善范围,OP30 压得再狠,产出也只会被 OP20 卡住。改善后新瓶颈 51.6 秒已进入客户节拍 52.0 秒以内,约束才真正解除。
| 指标 | 改善前 | 改善后 | 变化 | 口径 |
|---|---|---|---|---|
| 瓶颈工序节拍 | 58.7 s(OP30) | 51.6 s(OP20) | -7.1 s (-12.1%) | 实测均值 |
| 产线平衡率 LBE | 79.3% | 87.6% | +8.2 pp | 情景测算 |
| AGV 交叉干涉点 | 3 处 | 0 处 | -3 处 | 路径网络拓扑 |
| 物料单循环里程 | 186 m | 164.8 m | -11.4% | 路径里程测算 |
| 线旁齐套等待率 | 8.6% | 0% | -8.6 pp | 现场抽样 |
| 日理论装配产能 | 约 429 台 | 约 488 台 | +13.8% | 情景推演 |
产能测算口径:单班有效工作时间 420 分钟(已扣除点检与休息),日理论产能 = 420 × 60 / 瓶颈节拍。改善前 420 × 60 / 58.7 ≈ 429 台;改善后 420 × 60 / 51.6 ≈ 488 台,日理论产能提升约 +13.8%。
需要说明的是:理论产能提升不等于实际产出提升。实际产出还受设备综合效率 (OEE)、换型频次、来料质量波动等因素制约。本页给出的产能数字是在瓶颈消除这一单一变量下的情景推演值,用于说明改善动作的量级,不能直接等同于现场实际产量增量。
💻 五、 测算脚本(Python)
以下脚本把平衡率计算、MUDA 分解与 AGV 路径里程测算整合为可复现流程,替换 STATIONS 与 PATHS 即可复用到其他产线场景:
"""发动机装配线平衡率与 AGV 路径里程测算(脱敏标定数据口径)"""
# ---------- 1. 工位工时谱:(增值作业, 非增值 MUDA) ----------
STATIONS = {
"OP10 缸体上线": (38.2, 5.1),
"OP20 曲轴装配": (44.6, 8.4),
"OP30 活塞连杆": (46.8, 11.9), # 瓶颈工位
"OP40 缸盖气门": (41.5, 6.7),
"OP50 总装终检": (35.4, 4.6),
"OP60 试漏检测": (33.0, 3.2),
}
TAKT = 52.0 # 客户需求节拍
def total(t): return t[0] + t[1]
print("=== 工序工时谱 ===")
for op, (va, muda) in STATIONS.items():
tt = total((va, muda))
flag = " <-- 超出节拍线" if tt > TAKT else ""
print(f"{op:<12} 增值 {va:>5.1f}s | MUDA {muda:>4.1f}s | 合计 {tt:>5.1f}s "
f"| 非增值占比 {muda / tt:>5.1%}{flag}")
# ---------- 2. 产线平衡率 LBE = ΣT_i / (k × max T_i) ----------
def lbe(stations):
times = [total(v) for v in stations.values()]
return sum(times) / (len(times) * max(times))
before = lbe(STATIONS)
# 改善情景:OP30 定置化 + 套件前置压缩非增值;OP20 同步微调;一个工步转移至 OP60
after_stations = dict(STATIONS)
after_stations["OP20 曲轴装配"] = (44.6, 7.0) # MUDA 8.4 -> 7.0(临界超线一并处理)
after_stations["OP30 活塞连杆"] = (42.6, 5.0) # MUDA 11.9 -> 5.0,且转出 4.2s 工步
after_stations["OP60 试漏检测"] = (37.2, 3.2) # 吸收 OP30 转出的连杆螺栓二次标记工步
after = lbe(after_stations)
print(f"\n=== 产线平衡率 ===")
print(f"改善前 LBE = {before:.2%} | 瓶颈节拍 = {max(total(v) for v in STATIONS.values()):.1f}s")
print(f"改善后 LBE = {after:.2%} | 瓶颈节拍 = {max(total(v) for v in after_stations.values()):.1f}s")
print(f"平衡率提升 +{(after - before) * 100:.1f} 个百分点")
# 注意:改善后瓶颈由 OP30 转移到 OP20 —— 瓶颈漂移,说明不能只改当前瓶颈
# ---------- 3. AGV 路径网络:交叉干涉点检测 ----------
def seg_intersect(p1, p2, p3, p4):
"""返回两线段交点(不含共端点情形),无交点返回 None"""
d1 = (p2[0] - p1[0], p2[1] - p1[1])
d2 = (p4[0] - p3[0], p4[1] - p3[1])
den = d1[0] * d2[1] - d1[1] * d2[0]
if abs(den) < 1e-9:
return None # 平行或共线
t = ((p3[0] - p1[0]) * d2[1] - (p3[1] - p1[1]) * d2[0]) / den
u = ((p3[0] - p1[0]) * d1[1] - (p3[1] - p1[1]) * d1[0]) / den
if 1e-6 < t < 1 - 1e-6 and 1e-6 < u < 1 - 1e-6:
return (p1[0] + t * d1[0], p1[1] + t * d1[1])
return None # 交点在端点 = 共用工位,不算干涉
def count_crossings(paths):
hits, keys = [], list(paths)
for i in range(len(keys)):
for j in range(i + 1, len(keys)):
pt = seg_intersect(*paths[keys[i]], *paths[keys[j]])
if pt:
hits.append((keys[i], keys[j], tuple(round(v, 1) for v in pt)))
return hits
# 平面坐标(无量纲,仅用于拓扑交叉检测,非厂区实测坐标)
NODES = {"L1": (0, 0), "L2": (0, 40), "L3": (0, 80),
"R1": (52, 0), "R2": (52, 40), "R3": (52, 80)}
PATHS_BEFORE = {
"L1->R3": (NODES["L1"], NODES["R3"]),
"L2->R1": (NODES["L2"], NODES["R1"]),
"L3->R2": (NODES["L3"], NODES["R2"]),
"L1->R2": (NODES["L1"], NODES["R2"]),
}
# 改善后:单向环形回路(每条边方向唯一,不再有对向交叉)
PATHS_AFTER = {
"N1->N2": ((26, 0), (52, 20)),
"N2->N3": ((52, 20), (26, 40)),
"N3->N4": ((26, 40), (0, 20)),
"N4->N1": ((0, 20), (26, 0)),
}
print("\n=== AGV 路径网络(拓扑层)===")
print(f"改善前交叉干涉点:{len(count_crossings(PATHS_BEFORE))} 处")
for a, b, pt in count_crossings(PATHS_BEFORE):
print(f" - {a} × {b} @ {pt}")
print(f"改善后交叉干涉点:{len(count_crossings(PATHS_AFTER))} 处")
# ---------- 4. 配送里程(现场路径实测,单位:米) ----------
# 注意:里程不能由上面的无量纲坐标推算,必须用现场实测的路线距离
ROUTE_BEFORE, ROUTE_AFTER = 186.0, 164.8
print(f"\n=== 配送里程(实测口径)===")
print(f"单循环里程:{ROUTE_BEFORE:.1f} m -> {ROUTE_AFTER:.1f} m "
f"({(ROUTE_AFTER - ROUTE_BEFORE) / ROUTE_BEFORE:+.1%})")
🎓 六、 方法沉淀与口径边界
- 先量化再动手:现场改善最容易犯的错是「凭感觉挑一个看起来最忙的工位改」。山积图把 6 个工位的工时同时摊开,瓶颈是哪一个是算出来的,不是看出来的。
- 区分「人慢」与「布置差」:MUDA 分解的价值在于把非增值时间从「操作者技能」里剥离出来。OP30 的非增值占比 20.3% 说明问题在工装与物流,把责任归到工人身上既不公平也不会有效果。
- 物流是产线的隐性节拍源:AGV 交叉干涉点带来的延迟是随机变量,而随机延迟会直接吃掉瓶颈工位的时间预算。把双向路径单向化,本质上是把物流从随机变量变成确定性周期。
- 方案比选要看「残余量」:混合方案 C 常被认为「风险最低」,但残余的 2 处干涉点会持续稀释收益。判断标准应是改善后还剩多少问题,而不是改造动作有多大。
- 口径边界:本页所有数值为脱敏标定与情景推演口径,不含企业真实工艺参数;产能提升为单变量情景值,不等同于现场实际产出增量。如需用于对外汇报,应以现场实测数据重新标定。