AnyLogic仓库模型:如何识别各运输器(叉车/AGV)行驶距离并展示
AnyLogic运输器行驶数据:区分、实时显示与日志记录
1. 区分单台叉车/AGV的行驶数据
在车队的on release事件中,打印时带上运输器的名称或自定义标识,就能明确对应哪台设备:
- 直接使用内置名称属性(AnyLogic自动给车队里的运输器命名为
forklift1、forklift2等):traceln(transporter.getName() + " 累计行驶距离: " + transporter.getDistanceTravelled(METER) + " 米"); - 自定义标识(更灵活,比如区分车队类型):在车队的
On create transporter事件中给运输器赋值自定义参数:
之后打印时调用这个参数:// 叉车车队的创建事件 transporter.setParameter("transporterTag", "叉车-" + (forkliftFleet.size() + 1)); // AGV车队的创建事件 transporter.setParameter("transporterTag", "AGV-" + (agvFleet.size() + 1));traceln(transporter.getParameter("transporterTag") + " 累计行驶距离: " + transporter.getDistanceTravelled(METER) + " 米");
2. 实时显示到对应EditBox
需要把每个运输器和UI上的EditBox绑定,步骤如下:
- 在主Agent中创建两个List集合,分别存储叉车和AGV对应的EditBox:
public List<EditBox> forkliftEditBoxes = new ArrayList<>(); public List<EditBox> agvEditBoxes = new ArrayList<>(); - 在模型启动时(比如
Main的On startup事件),把UI上的EditBox添加到对应集合:
(注:forkliftEditBoxes.add(ebForklift1); forkliftEditBoxes.add(ebForklift2); forkliftEditBoxes.add(ebForklift3); agvEditBoxes.add(ebAGV1); agvEditBoxes.add(ebAGV2); agvEditBoxes.add(ebAGV3);ebForklift1等是你UI上EditBox的实际名称) - 在车队的
on release事件中,根据运输器在车队中的索引找到对应EditBox并更新:- 叉车车队事件:
int idx = forkliftFleet.indexOf(transporter); forkliftEditBoxes.get(idx).setText(String.format("%.2f 米", transporter.getDistanceTravelled(METER))); - AGV车队事件:
int idx = agvFleet.indexOf(transporter); agvEditBoxes.get(idx).setText(String.format("%.2f 米", transporter.getDistanceTravelled(METER)));
- 叉车车队事件:
3. 将行驶数据写入日志
方法1:使用AnyLogic内置日志
在on release事件中调用log()方法,数据会自动进入模型日志:
log(Level.INFO, transporter.getName() + " | 累计行驶距离: " + transporter.getDistanceTravelled(METER) + " 米");
(可通过模型的「日志」面板查看,或导出为文件)
方法2:自定义日志文件
如果需要输出到独立的文本文件,用FileWriter实现追加写入:
try { // 日志文件路径,可自定义 FileWriter writer = new FileWriter("transporter_distance_log.txt", true); // 写入时间、设备标识、距离 writer.write(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " | " + transporter.getName() + " | 行驶距离: " + transporter.getDistanceTravelled(METER) + " 米\n"); writer.close(); } catch (IOException e) { traceln("日志写入失败: " + e.getMessage()); }
内容的提问来源于stack exchange,提问作者Priti Dhall
相关产品推荐
相关产品推荐

