如何为仓储和制造建立简单的AGV充电模型

在这篇博客中,我们将详细介绍AGV充电仿真模型。

我们建议您 下载示例模型源文件 并在AnyLogic中打开,以便与本文一起使用。


AGV充电模型

该模型使用AnyLogic 8.7.12开发,具有 新的物料搬运库功能,例如新的存储架和相应的 StoreStorageSystem模块,有助于对仓库操作进行建模。

本示例模型描述了货车卸货过程以及根据仓库中可用的存储区放置SKU的过程。在此基础上,该模型由离散事件和基于智能体的建模方法开发。

对于离散事件建模,AnyLogic以各类内置资源库的方式提供。在本模型中,使用其中一个库—— 流体库——用于仿真电池充放电循环。另一个库—— 物料搬运库 ——对于制造和仓储建模特别有用,在本模型中,它有助于建模AGV(运输车)和货架。

AGV充电模型描述

AGV充电模型的布局

AGV充电模型的布局

模型的布局非常简单,但可以作为一个很好的例子,用来说明智能体的性质与其使用流体库建模的离散事件行为之间的相互联系。

在左下角,有一个AGV基地和一个充电站。在仓库的右侧,有一个卸货门,在那里可以看到运输车的任务。模型逻辑中最重要的部分是AGV智能体内部充电相关的过程。

任务分配

描述AGV任务分配的流程图:放置SKU
描述AGV任务分配的流程图:放置SKU(点击放大)

如图所示,第一个流程图用于生成SKU。然后运输机抓取它们进行“to-rack”运送。同时,第二个流程图有更多的动作,并从Enter模块, 开始,模拟了一个手动创建的查询——“СhargeTask”。

AGV充电模型的逻辑——chargetask 模块的属性
AGV充电模型的逻辑——chargetask 模块的属性(点击放大)

由于在chargetask 模块的属性中选择了“任务可以抢占(task may preempt)” 策略,因此该查询将中断卡车卸载过程。“任务优先级(task priority)”参数值等于1000,使它比卸载任务更重要。根据流程图中描述的逻辑,一旦充电任务完成,AGV将返回其主任务。

使模型正确工作的另一个步骤是将Delay模块的模式(类型)更改为“直至调用 stopDelay()”。稍后,您可以使用Java代码从AGV的状态图调用stopDelay()函数。

AGV智能体类型内的电池流程图

另一个简单的流程图用于描述电池充放电循环。流体库有助于仿真大量离散项(例如液体、谷物和能量)的存储和传输。

在这个模型中,Tank  模块帮助仿真AGV电池电量(以 % 为单位)和 Valve  模块一起模拟电池的充电和放电。让我们详细看看Battery(电池)的性能。

仿真电池充放电循环和Battery(电池)属性的流程图
仿真电池充放电循环和Battery(电池)属性的流程图(点击放大)

电池容量设置为1000 升(liters)(我们从流体库的单位列表中选择了升作为单位)。运输车首次启动时的初始电池电量是随机的,并根据三角概率分布 和参数(最小、最大、模式)分配。

更有趣的是, Battery属性的“行动”部分显示了智能体的状态图和SKU的流程图在Main中的联系。当电池充满时,将发送信息“GoOperate”给AGV智能体,使其在完成充电后继续卸载任务。

当电池电量低于350(也就是35%)时,触发低于时动作,创建ChargeTask对象实例,并将其发送到位于Main的SKU的流程图(也就是Enter 模块)。AGV智能体停止执行卸载任务并前往充电站。

但是,Enter流程模块如何知道为哪个AGV创建充电任务?换句话说,哪个AGV应该去充电站?

Battery 模块(AGV智能体内部)中执行的代码:


currentChargeTask = new ChargeTask(this);
main.enter.take(currentChargeTask); 
    

第1行:创建一个与特定AGV相关的智能体类型命名为ChargeTask

第2行:将此ChargeTask智能体类型添加到Main中SKU的流程图中。

ChargeTask智能体中有一个类型为“AGV”的“transporter”参数。运行代码时(在AGV智能体内),“this”标识ChargeTask智能体属于父对象。

这就是如何在流程图中获得新的ChargeTask智能体的设置。智能体会记住哪辆运输车需要去充电站。

ChargeTask智能体中的“Transporter”参数
ChargeTask智能体中的“Transporter”参数(点击放大)

“描述AGV任务分配的流程图:充电任务
描述AGV任务分配的流程图:充电任务(点击放大)

通过第二个流程图,ChargeTask智能体应获取正确的AGV。在chargetask 模块也就是MoveByTransporter的属性中, “运输车选择条件”保证所需AGV将停止执行例行的SKU交付任务。取而代之,新的充电查询将使AGV前往充电站。

Chargetask模块设置,包括“运输车选择条件”
Chargetask模块设置,包括“运输车选择条件”( 点击放大)

智能体的状态图及其与电池电量的连接

我们已经讨论了电池逻辑和AGV移动逻辑(当AGV需要充电时)。然而,该模型缺少控制AGV行为的高级管理组件,在这里我们使用 状态图

如你所想,智能体之间最流行的通信方式是消息传递,并可能由此触发智能体状态的更改。状态的变化称为变迁,在变迁期间,可以执行动作,例如打开和关闭能量流阀。

AGV收到“start”消息开始充电
AGV收到“start”消息开始充电(点击放大)

AGV的一组状态,也就是在黑框内的组件,称为复合状态。它由定义AGV行为的较小状态组成。

例如,每个AGV智能体可以具有“Operate(操作)”、“Charging(充电)”和其他状态。状态更改取决于智能体接收到的消息。其中,AGV 接收到“start”消息所发生的状态变迁,是使 AGV 智能体关闭流出阀并打开流入阀为电池充电。

它也可以反过来工作——接收到“GoOperate”消息关闭流入阀,也意味着充电结束。

整体算法:

  1. 运输车在开始时具有一定的初始电量。
  2. 当电量下降到35%以下时,Battery模块将初始化充电任务创建——一个新的ChargeTask 智能体。
  3. chargeTask 模块将充电任务优先于AGV的常规任务,并占用AGV。
  4. ChargeTaskMoveByTransporter获取AGV时,将向AGV发送 “GoCharging” 消息。
  5. “GoCharging”消息使AGV的状态图,从“Operate(操作)”更改为“MovingToChargingStation(移向充电站)”。
  6. MoveByTransporter中,在“行动”选项卡中有一个“装载完成时”字段。此字段包含发送“start”消息的函数。AGV到达充电站时,代码调用此功能。
  7. “start”消息触发AGV向“Charging(充电)”状态的变迁,并打开和关闭相应的电池阀门。
  8. 电池开始充能,当电池充满时,它向AGV发送信息“GoOperate”。
  9. “GoOperate”消息触发打开和关闭相应的阀门。充电结束,电池放电过程开始,AGV状态变为“ReadyToWork(准备工作)”。
  10. 在给定的超时时间(1 秒)下,自动触发状态转换, AGV 的状态再次转换为“Operate(操作)”。
  11. 从“ReadyToWork”到“Operate”的转换将AGV从Delay模块中释放出来,因此它可以返回到主例行任务,直到下一个充电过程。

通过本文对AGV充电模型的描述将帮助您了解该模型是如何在AnyLogic中构建的。但是,眼过千遍,不如手过一遍。所以,欢迎查看AnyLogic Cloud中的AGV充电模型及其源文件,并自己实践。

未来的商业应用

本博客中描述的逻辑可以作为AGV充电优化项目的切入点。例如,您可以确定将AGV发送到充电站的最合适的电量。此外,您可以使用该模型测试各种假设情况,例如现场决定充电是否比预定队列的机器人充电更好。

相关文章