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

AnyLogic:如何让AGV单独休眠?AGV故障无停顿问题排查

AnyLogic AGV故障模拟失效问题

我用AnyLogic的TransporterFleet创建了10台沿导引路径行驶的AGV,给每台AGV单独设置了生成故障随机时间和持续时长的函数及事件(未放在main()中)。预期每台AGV在模型时间等于nextTimeToFailure时停止,持续nextFailureDuration时长,且该休眠操作不影响其他AGV运行,但当前AGV无停顿仍正常行驶。

现有设置代码

函数timeToFailure()

double timeToFailure = exponential(0, 60, 0, 10);
return timeToFailure;

函数failureDuration()

double duration = exponential(0, 15, 0, 3);
return duration;

触发条件为time() == nextTimeToFailure的事件代码

if(nextTimeToFailure == 0){
System.out.println("nextFailureDuration is 0 ");
    nextTimeToFailure = time() + timeToFailure();
    nextFailureDuration = failureDuration();    
}

setSpeed(reducedSpeed()); //reduceSpeed()函数返回0
rectangle.setFillColor(red);
try {
    Thread.sleep((long)nextFailureDuration);
} catch(InterruptedException e) {
    System.out.println("got interrupted!");
}

nextTimeToFailure = Double.NaN;
nextFailureDuration = Double.NaN;

nextTimeToFailure = time() + timeToFailure();
nextFailureDuration = failureDuration();    

rectangle.setFillColor(lime);

问题根源与修复方案

核心问题

  1. Thread.sleep()用法完全错误:AnyLogic是离散事件仿真框架,Thread.sleep()会阻塞整个仿真线程,不是模拟模型时间的停顿;而且直接把模型时间(通常为秒单位)转成毫秒休眠,数值逻辑也不对,这么做只会卡住整个模型,根本实现不了单AGV停顿。
  2. 触发条件time() == nextTimeToFailure不可靠:仿真时间是步进推进的,大概率会跳过这个精确相等的时刻,导致事件根本触发不了。
  3. 事件逻辑混乱:初始化逻辑塞在事件里,故障处理后直接覆盖nextTimeToFailure,顺序和逻辑都有问题。

修复步骤

1. 替换Thread.sleep(),用AnyLogic延迟事件实现停顿

删掉Thread.sleep()那段代码,改用框架原生的延迟事件处理故障时长:

  • 故障触发时,设置AGV速度为0、标记红色后,创建一个延迟事件,延迟时长设为nextFailureDuration,在延迟事件里恢复AGV速度、改回绿色,并生成下一次故障时间。

2. 修正事件触发逻辑

把原事件的触发条件改成time() >= nextTimeToFailure,或者更稳妥的方式:初始化时直接调度第一个故障事件到nextTimeToFailure时刻,故障恢复后再调度下一次的事件。

3. 重构事件与初始化逻辑

推荐把初始化逻辑放在AGV的onStartup动作里,而非事件中:

  • 在AGV的onStartup中执行:
    nextTimeToFailure = time() + timeToFailure();
    nextFailureDuration = failureDuration();
    scheduleEvent(this, "triggerFailure", nextTimeToFailure);
    
  • 故障事件triggerFailure的代码简化为:
    // 触发故障状态
    setSpeed(0);
    rectangle.setFillColor(red);
    
    // 调度恢复事件
    scheduleEvent(this, "recoverFromFailure", time() + nextFailureDuration);
    
    // 提前生成下一次故障参数
    nextTimeToFailure = time() + nextFailureDuration + timeToFailure();
    nextFailureDuration = failureDuration();
    
  • 新增recoverFromFailure函数(或事件):
    // 恢复正常运行
    setSpeed(yourNormalSpeed); // 替换成你的AGV正常速度值
    rectangle.setFillColor(lime);
    
    // 调度下一次故障事件
    scheduleEvent(this, "triggerFailure", nextTimeToFailure);
    

4. 确保AGV参数独立性

确认nextTimeToFailure、nextFailureDuration是AGV代理的实例变量(而非全局变量),这样每台AGV的故障参数才不会互相干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:27:39