You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SimPy的机器人工厂单元建模:资源调度问题排查

问题诊断与解决方案

你的核心问题是工件生产流程是串行启动的——production_loop函数里的for循环会等待前一个工件的所有工序(从Fixture01上料到最终入库)全部完成后,才会启动下一个工件的流程。这就导致机器人在处理Fixture02的工件时,操作员处于空闲状态,因为下一个工件的流程还没开始。

你的资源请求方式(同时请求操作员/机器人+夹具)本身是合理的,不需要调整。要实现操作员和机器人并行工作,关键是让不同工件的流程同时推进。

修改后的核心代码

重构工件流程函数

把原来串行处理所有工件的production_loop拆成单个工件的流程函数:

def part_process(env, robot, operator, fixture_01, fixture_02, part_num):
    part = f'Part-{part_num:02}'
           
    # Operator loads part into Fixture 1
    yield env.process(operator.load_part(part, 41, fixture_01))

    # Robot spot welds on Fixture 1
    yield env.process(robot.spot_weld(part, qty = 35, fix=fixture_01))

    # Operator unloads part from Fixture 1
    yield env.process(operator.unload_part(part, 51, fixture_01))

    # Operator loads part into Fixture 2
    yield env.process(operator.load_part(part, 38, fixture_02))

    # Robot spot welds on Fixture 2
    yield env.process(robot.spot_weld(part, qty = 65, fix=fixture_02))

    # Operator unloads part from Fixture 2
    yield env.process(operator.unload_part(part, 58, fixture_02))

    # Operator puts away part
    yield env.process(operator.put_away_part(part))

并行启动所有工件流程

替换原来的启动逻辑,为每个工件单独启动SimPy进程:

# Setup simulation environment
env = simpy.Environment()
robot = Robot(env, 'Robot-1')
operator = Operator(env, 'Operator-1')
fixture_01 = Fixture(env, 'Fixture-01')
fixture_02 = Fixture(env, 'Fixture-02')

# 为每个工件单独启动进程,实现并行生产
for part_num in range(1, sim_cycles + 1):
    env.process(part_process(env, robot, operator, fixture_01, fixture_02, part_num))

# Run simulation
env.run()

关键修改说明

  1. 并行化工件流程:每个工件的生产流程成为独立的SimPy进程,不再等待前一个工件完成所有工序才启动。当Part-01进入Fixture02的焊接工序时,Part-02可以立即开始Fixture01的上料,充分利用空闲的操作员和夹具资源。
  2. 保留原有资源逻辑:原有的资源请求方式(同时锁定操作员/机器人+夹具)无需修改,它能确保同一时间只有一个操作(上料/焊接)占用夹具。

可选优化:模拟实际投料节奏

如果需要更贴近真实生产的投料间隔(比如每隔一段时间投一个工件),可以在启动时添加时间间隔:

def start_production(env, robot, operator, fixture_01, fixture_02, sim_cycles):
    for part_num in range(1, sim_cycles + 1):
        env.process(part_process(env, robot, operator, fixture_01, fixture_02, part_num))
        yield env.timeout(10)  # 每隔10个时间单位投一个工件

# 启动投料进程
env.process(start_production(env, robot, operator, fixture_01, fixture_02, sim_cycles))

内容的提问来源于stack exchange,提问作者Frosty1542

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:28:14