Anylogic如何关联Wait块与船舶离港调度表实现提前2分钟停检
船舶客运仿真Wait块与离港调度关联实现方案
核心是在原有放行判断规则基础上,增加离港前2分钟的截流校验,同时补全放行逻辑的触发时机,避免仅靠Wait块进入动作触发导致的漏放、晚放问题。
前置配置:添加截流状态标记
在流程所在的顶层Agent(通常是Main)中新增布尔型自定义变量:
- 变量名:
isBoardingClosed - 默认值:
false - 用途:标记当前航次是否已停止向码头放行乘客
第一步:配置离港调度表schDepartureBoat1的关联动作
调度表按每2小时生成离港时点,给每个离港时点绑定两个偏移触发动作:
- 离港时点前2小时(即船舶完成靠泊、正式开放登船的时点):
将isBoardingClosed赋值为false,执行一次放行检查 - 离港时点前2分钟(即截流停止放行的时点):
将isBoardingClosed赋值为true,此时不再触发Wait块释放,停止所有往码头的乘客放行
如果使用的仿真工具不支持调度表直接配置偏移时间动作,可以在调度表的触发事件中,先获取当前航次的计划离港时间,通过两个延时事件分别对应登船开始、截流两个时点执行上述动作,效果一致。
第二步:抽离并补全放行判断逻辑
不要仅在waitForBoat1的On enter动作中写判断——如果乘客先进入Wait块等待,后续船舶才靠泊,没有触发动作的话Wait块内的乘客会被持续卡住。
将放行判断抽为独立自定义函数(命名为checkBoardingRelease即可),函数代码如下:
// 三个条件同时满足方可放行 if( cllBoatDock1.size() > 0 // 码头有船舶靠泊 && !isBoardingClosed // 未到离港前2分钟的截流时点 && (cllPedOnDock1.size() + cllPedOnBoat1.size()) < 1750 // 总载客数未达额定上限 ) { waitForBoat1.freeAll(); }
将这个函数挂载到所有会改变放行条件的节点动作上,确保条件满足时能及时触发释放:
waitForBoat1的On enter动作:直接调用checkBoardingRelease()- 泊位集合
cllBoatDock1的On enter动作(即船舶完成靠泊进入泊位时):调用checkBoardingRelease() - 登船流程块的On exit动作(即乘客完成登船,船上空余载客位变化时):调用
checkBoardingRelease() - 调度表中登船开始时点的动作:重置
isBoardingClosed为false后,调用checkBoardingRelease()
逻辑验证
配置完成后,放行规则会自动覆盖所有约束要求:
- 船未靠泊、载客数满额时不会放行
- 离港前2分钟自动锁死放行通道,哪怕船还在泊位、还有空余载客位,也不会再放乘客从等候区出发,完全匹配步行耗时和安全规程要求
- 不会出现乘客在Wait块内等待但条件满足时未被释放的卡滞问题
内容的提问来源于stack exchange,提问作者Lorenzo Martello
相关产品推荐
相关产品推荐

