函数与moveTo模块实例调用失败:AGV与Package类型匹配问题
AnyLogic中moveTo模块调用函数匹配AGV与Package类型并填充饼图问题
问题背景
需要填充饼图,但在无返回值函数AGVundTyp及moveTo模块中无法正确调用实例,原函数代码如下:
if ((Package)agent.p_type==0 && ((AGV)agent.p_type==0)) { AGV1_Type1++; } else if ((Package)agent.p_type==1 && ((AGV)agent.p_type==0)){ AGV1_Type2++; } else if ((Package)agent.p_type==2 && ((AGV)agent.p_type==0)){ AGV1_Type3++; } else { error ("error"); } if ((Package)agent.p_type==0 && ((AGV)agent.p_type==1) ){ AGV2_Type1++; } else if ((Package)agent.p_type==1 && ((AGV)agent.p_type==1)){ AGV2_Type2++; } else if ((Package)agent.p_type==2 && ((AGV)agent.p_type==1)){ AGV2_Type3++; } else { error ("error"); } if ((Package)agent.p_type==0 && ((AGV)agent.p_type==2)) { AGV3_Type1++; } else if ((Package)agent.p_type==1 && ((AGV)agent.p_type==2)){ AGV3_Type2++; } else if ((Package)agent.p_type==2 && ((AGV)agent.p_type==2)){ AGV3_Type3++; } else { error ("error"); }
当前错误
- agent无法解析为变量
- AGV与int操作数类型不兼容
- Package与int操作数类型不兼容
场景说明
AGV类和Package类均包含int类型参数p_type:
- Package类型在Source创建时初始化
- AGV类型对应3个ResourcePool,每个Pool初始化对应类型
- 函数需在moveTo算子中调用,用于对比AGV与Package的类型,但因参数名相同无法明确区分实例
解决方案
1. 修正函数参数,明确区分实例
修改AGVundTyp函数,直接接收Package和AGV实例作为参数,避免混淆:
void AGVundTyp(Package pkg, AGV agv) { // 校验实例非空 if(pkg == null || agv == null) { error("Package或AGV实例为空"); return; } int pkgType = pkg.p_type; int agvType = agv.p_type; // 按AGV类型分类统计 if(agvType == 0) { switch(pkgType) { case 0: AGV1_Type1++; break; case 1: AGV1_Type2++; break; case 2: AGV1_Type3++; break; default: error("未知Package类型: " + pkgType); } } else if(agvType == 1) { switch(pkgType) { case 0: AGV2_Type1++; break; case 1: AGV2_Type2++; break; case 2: AGV2_Type3++; break; default: error("未知Package类型: " + pkgType); } } else if(agvType == 2) { switch(pkgType) { case 0: AGV3_Type1++; break; case 1: AGV3_Type2++; break; case 2: AGV3_Type3++; break; default: error("未知Package类型: " + pkgType); } } else { error("未知AGV类型: " + agvType); } }
2. 在moveTo模块中正确调用函数
在moveTo模块的On exit事件(AGV完成移动后统计)中,传入当前Package和对应的AGV实例:
// 获取当前Package实例和分配的AGV实例 Package currentPkg = (Package)getAgent(); AGV assignedAgv = (AGV)getResource(); // 调用统计函数 AGVundTyp(currentPkg, assignedAgv);
如果是Package对象的流程内调用,可直接用this指代当前Package:
AGV assignedAgv = (AGV)this.getAssignedResource(); AGVundTyp(this, assignedAgv);
3. 错误原因解析
agent无法解析为变量:原函数未定义agent变量,必须明确传入具体的Package和AGV实例AGV/Package与int操作数类型不兼容:原代码错误地将agent.p_type(int类型)强制转换为AGV/Package类型,正确方式是直接获取对应实例的p_type属性
内容的提问来源于stack exchange,提问作者anylogicuser
相关产品推荐
相关产品推荐

