通过我们的白皮书,了解仿真如何改进物料处理操作!
从AnyLogic 8.3 起我们新增了物料搬运库,为了让您了解如何使用它,我们在博客上发布了一系列专题文章。通过实际生产案例说明物料搬运库的主要功能及其组件——模块和空间标记元素。
此系列文章的第 1 部分主要是说明输送带部分的,而本篇博客接上篇是关于其他的货物移动方式——运输车。 其中包括叉车,以及搬运机器人和机械手推车——自动导引车 (AGV)。
在 AnyLogic 中,物料搬运库有助于对设施中的运输操作进行建模。建模通过在 TransporterFleet、MoveByTransporter、SeizeTransporter和 ReleaseTransporter模块以及空间标记元素的帮助下完成的。您可以在 AnyLogic 的“欢迎页面”的“示例模型”部分找到相关功能演示模型。
对于最新版本的模型,请确保您至少安装 AnyLogic 8版本的软件。 好的,让我们开始吧!
MoveByTransporter
在 MoveByTransporter 模型中,不同颜色的箱子通过三条输送带到传送到目标装载位置, 检测到箱子到达传送位置,AGV会将箱子转移到预设颜色编码的输送带。在本模型中,箱子的颜色对应目标输送带的颜色。
运输车可以由路径引导,例如由电磁感应引导的路径网络。 这些路径和网络在 AnyLogic 中使用空间标记元素进行建模。为此,从物料搬运库-面板的空间标记部分选择路径元素,然后在主画布上绘制网络。 注意:如果在端点以外的任何点将两条轨迹链接到一起,会创建点节点。在AnyLogic 8.3中,这些已经演变为交叉点。AnyLogic会自动绘制所有路径所需的转弯路径。如果元素对象的半径增加,则交点内的路径也会相应改变。 交点所占面积的大小取决于元素对象的半径。
除了可视化轨迹之外,交叉点还执行另一项重要任务——调节运输工具的分离,防止它们相互碰撞碾压。 如果您不想使用此功能,可以将交叉点压缩为通常的点节点。

要注意的是,运输车的所有路径都必须以以下元素之一结尾:点节点、矩形节点或多边形节点。运输车通过这些节点能够掉头并朝相反的方向行驶。 在这个模型中,我们用两个矩形节点作为 AGV 的基本位置(归属位置)。其中的吸引子指示每个运输车的位置和方向,并且在运输车所在的区域中,吸引子的数量必须等于或大于运输车总数。
路径构建完后,我们需要创建一种新的智能体类型来模拟 AGV 的行为。 我们使用物料搬运库中的运输车类型智能体创建AGV并使用内置助手进行配置。在这个模型中,我们仅配置了 AGV 的动画(仓库和集装箱码头部分中的AGV)。
要创建一个或一组相同的运输车(尺寸和速度相同),可以使用 TransporterFleet 模块。选择智能体 Transporter作为模型中的运输车类型(在运输车属性栏的新运输车选项列表中选择 Transporter)。 在这个模型中一共会使用 12 个运输车:在属性窗口的容量设定相应的值。使用空间标记矩形节点元素绘制两个矩形区域表示运输车的归属位置。您也可以使用常规的点节点元素作为运输车的基本归属位置。
在模块中设置尺寸和速度参数:
- 在AnyLogic中在计算与障碍物或其路径上其他运输车的距离时,会考虑运输车的长度。
- 运输过程中待运货物的位置由运输车的高度决定:默认情况下,在 3D 视图中,货物位于运输车智能体坐标的中心,高度到运输车的高度。 如果负载并不位于中心位置,您可以使用自定义函数 setCargoPosition进行自定义,准确指定其相对于运输车的位置。 顺便说一下,运输车的尺寸也可以在运输车类型智能体中设置。 在 Transporter智能体属性的尺寸和移动中进行设置。
接下来,创建一个命名为Item的智能体,作为在 AGV 和输送带中移动的箱子——详细的流程图描述(见下文)。箱子的颜色使用API函数随机设置,尺寸用数字指定。
为了确定开始和结束输送带,在 Item 智能体中创建了 2 个变量 — sourceConveyor 和 targetConveyor。 当Item离开 Source模块时,使用自定义函数 getSourceConveyor 和 getTargetConveyor 获得开始和结束输送带的值:就好像给每个箱子贴上条形码,条形码带有开始和结束输送带的指示。
最后,创建流程图的其余部分,建模智能体沿着输送带系统和 AGV 路线移动的过程。
Source模块(模块的智能体属性中的新智能体项设置为Item)生成箱子。convey和convey1模块模拟箱子沿输送带移动的过程。在本模型中, 箱子智能体将沿着其变量(sourceConveyor)中指定的输送带移动。想要了解更多关于 Convey模块的设置操作,可以在我们发布的关于模型输送带的博客。
接下来是新模块moveByTransporter。 当AGV装载和卸载货物可以通过简单的延迟模拟时,所有的运输任务都可以由这个模块来定义。 在模块属性的获取运输车部分,勾选获取运输车,在车队项选择transporterFleet(类型为TransporterFleet)的运输车组,这些智能体(箱子)通过moveByTransporter模块运输,这里将装载时间设置为 5 秒。运输车拾取智能体的位置即拾起位置是,可以设置为:
- 智能体——命名为transporter的智能体;
- 节点——空间标记点;
- 吸引子;
- 路径——从起点或终点具有指定偏移量的路径;
- 输送带——从起点或终点具有指定偏移量的输送带;
- 输送带上的位置;
- 输送站;
- 图形编辑器中点的坐标。
当装载点不在运输车的路径上时,AnyLogic 会自动确定运输车路径上最接近装载点的位置并将运输车送达那里。 在我们的模型中,在 拾起位置是属性中选择了智能体 选项。
AGV收到智能体的装载信号,并确定装载位置后,必须设置目的地。这个过程与选择装载地点类似。在这个模型中,会选择接收所装载类型货物的输送带始端作为目的地。要做到这一点,需要在moveByTransporter模块的属性中,将目的地是选择输送带,然后在输送带字段中输入agent.targetConveyor——这样就可以实现将负载发送到相同颜色的输送带。默认情况下,运输车会自己确定网络上的最短路线,并防止与其他 运输车发生冲突。
如果无法避免运输车路径交叉的情况,相遇的运输车会在 10 秒后相互通过。复杂的 AGV 路口,通常有操作员或自动系统远程控制的过程,可以使用延迟来进行模拟。更详细的 AGV 路由请期待我们未来的版本。
接下来是释放运输车的过程。 这个过程可以在释放运输车部分中设置。 勾选释放输送车选项,设定卸载时间属性为 15 秒。 释放的运输车可以设置为:
- 每次返回到归属地位置;
- 如果无其他任务返回到归属地位置;
- 停留在原地。
在本模型中,AGV 一到达取货点就开始装载和移动智能体。 同样,AGV会在智能体到达目的地卸载后立即释放,中间无其他任务。
AGV 从输送带上拾取负载时,AGV会通过可用路径尽可能选择最近的位置。即便在最接近输送带的运输路径上没有指定点时,运输车也会自主确定离目标输送带最近的点。
SeizeTransporter 和 ReleaseTransporter
当模型中的装载和卸载任务非常简单,且运输车只将货物运送到终点而不进行中间停留(例如,车站),那所有的逻辑都可以通过 MoveByTransporter模块来描述。如果装载或者卸载过程也起着重要作用,需要详细建模时,则使用 SeizeTransporter和 ReleaseTransporter模块会更方便。
下面我们通过 SeizeTransporterand ReleaseTransporter模型来说明一下这种情况的建模。 在这个模型中,专用 AGV 用于重物(这里是涂布纸卷)运输,纸卷由起重机执行装载和卸载过程(执行逻辑使用流程建模库进行定义)。
在模型中,运输网路和基本站点通过路径、点节点和矩形节点定义。使用运输车类型智能体创建新智能体 - AGV。同时,还添加了一个 agvFleet模块(类型为TransporterFleet)表示纸卷运输车组,并对其进行属性设置。该组包括三个 AGV(容量设置为 3,属性新运输车选择AGV)。AGV 的尺寸 通过勾选设置尺寸属性,设置长度字段 为 2.5 米。
Source模块生成对象(在本模型中是纸卷)并将它们放置在起重机下方的区域(即node 1)。 当 AGV 到达装载点时,起重机会抓取一个纸卷,将纸卷装载到AGV上。起重机抓取卷筒的过程,运输车必须在现场等待。在模型中要对这个过程进行建模,请按如下方式配置 seizeAGV (类型为SeizeTransporter) 模块。
在车队属性中,指定AGV 组,也就是agvFleet。目的地设置为智能体。这样,当AGV在其路径上最靠近智能体的点时,纸卷智能体会抓取AGV。
优先级部分用于设置 AGV 组的任务顺序。
- 任务优先级参数是一个数值,反映请求的重要性。
- 任务可以抢占反映了 AGV 被更高优先级智能体拦截的可能性。
- 任务抢占策略用来确定如何处理被取代的任务——等待最初抓取的资源或使用空闲运输车。
下一部分是高级属性的设置,您可以选择搬运工来移动智能体。如果勾选自定义运输选择参数,您可以在运输车选择条件中用动态值设置自己的 AGV 调动策略。 许多运输车可能适用于某个自定义的条件(尤其是在未指定选择条件的情况下,因为我们仍然拥有完整的 AGV 车队)。因此,可以通过输送车的调度策略属性 ,从默认组中选择AGV的调度策略:
- 到匹配条件最近
- 与动态字段中的函数做成对比较
- 具有动态字段中函数指定的属性的最大值
- 随机,第一个匹配条件(关闭(选择一些匹配的输送车))
在我们的模型中,所有这些属性都是默认设置的。
请注意,智能体在运输车到达装载点前在seizeAGV 模块中。 只有运输车到达装载点后,智能体才会继续沿着流程图移动,而其AGV 会在指定点等待它。
之后,纸卷智能体进入以下模块:
- seizeLoadCrane(类型为Seize),智能体通过起重机进行装载;
- craneLoading(类型为Delay),负责吊装;
- toAGV(类型为MoveTo),将智能体移动到AGV;
- agvLoading(类型为Delay),负责装载到等待的AGV 上。
接下来是 CraneToHome模块(类型为 resourceSendTo),为避免干扰 AGV 通道,将起重机移动回其原始位置,并由releaseLoadCrane模块(类型为Release)释放所捕获的智能体。
现在,纸卷已经放置在 AGV 上,接下来通过AGV将其送到车间的另一部分,在那里通过另一台起重机将纸卷放置在输送带上。这个过程要用到我们熟悉的模块 moveByAGV(类型为MoveByTransporter)进行移动。 这里我们没有选择Seize Transporter模块,因为此时的 AGV 已经到达装载地点并装载了货物。然后,我们将模块的目的地是属性设置为纸卷的交付位置 - Conveyor。
如果在这个模块中选择了释放运输车属性,AGV 将在到达最靠近输送带的位置后,进行短暂延迟之后放下负载。 但是,在本案例中我们使用起重机进行卸载操作,那就无需如此设定。 因此,取消选中释放运输车 属性。让AGV与智能体(纸卷)在其到达目的地时仍保持关联。
接下来智能体移动到seizeUnloadCrane模块(类型为Seize),捕获负责装载的起重机(负责将货物运送到输送带上),并使用 agvUnloading模块 (类型为Delay)从 AGV 中移除智能体。 之后,智能体使用 releaseAGV模块(类型为ReleaseTransporter)释放 AGV。 在模块中指定运输车的一个设置,使 AGV在无需执行其他任务时,直接返回到其归属地位置。 如果不是这种情况,AGV会停留并阻止其他 AGV。
AGV释放后,纸卷智能体进入 toConveyor模块 (类型为MoveTo) ,通过此模块纸卷会与起重机一起移动到输送带的起点。 然后通过 craneUnloading模块(类型为Delay)将纸卷放置在输送带上,并使用 releaseUnloadCrane(类型为Release)模块释放起重机。 最后,纸卷穿过Convey模块离开运输系统。
现在您应该已经了解到在物料搬运库的帮助下如何进行货物移动建模。
其中有几个关键点需要注意:
- 您可以借助点节点元素,直观地表示交叉路口中涉及的所有路径。
- 如果装载和卸载过程可以用简单的延迟表示,并且在到达目标的运输过程中没有中间停止,则可以选择 MoveByTransporter 模块进行建模。当装载和卸载过程非常重要,需要详细的模拟,则最好另外使用 SeizeTransporter和 ReleaseTransporter模块进行建模。
- 在AnyLogic 中的输送车只能由需要交付的智能体控制。这意味着运输车未携带物品的状态,除了可以移动到有待交付货物的地点,不能发送到其他特定地点。这听起来可能有点奇怪,但是如果您开始实际应用,很快,您就会发现它很有意义。
- 如果智能体的交付位置在运输车移动网络之外,运输车可以在移动网络上最靠近智能体的点装卸智能体。此策略可以通过选项 目的地是 (SeizeTransporter模块) 或 拾起位置是(MoveByTransporter模块) 进行设置。
- 在建模运输工具的工作流程时有几点需要注意。要提前确定运输车释放后它应该做什么。可以使用 MoveByTransporter模块的属性设置来控制运输车操作。
本系列的下一篇博客会更加复杂,其中包含不同类型模块使用方法和一些重要提示——太阳能光伏电池板生产:如何使用物料搬运库。不要忘记阅读有关输送带建模的文章:这有助于您更轻松的了解我们的其他文章。 可以在我们的 AnyLogic物料搬运库邮件包中找到收集的 MHL 材料,以深入了解物料处理仿真。