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

