在本文中,我介绍了一个简单的 AGV仿真模型。它旨在作为如何在工厂中模拟零件路由的示例。我在 AnyLogic 中实现了模拟。
我已经提供了一些其他的 AnyLogic 基本介绍。更具体地说,我之前在一系列 YT 视频中介绍了一些基本的输送机模型。以下是 AnyLogic 仿真建模的一些基本介绍列表:
- 链接:AnyLogic 中的简单输送线模型
- 链接:AnyLogic 中带支线的输送线
- 链接: AnyLogic 中带工作站的输送线
- 链接: AnyLogic 中装配工人的输送线
- 链接:AnyLogic 输送机工作站的批量组装过程
- 链接:AnyLogic 中的移动装配工人
我在下一段的下图中进一步说明了 AGV 模拟的概念布局。
使用 AnyLogic 进行带有路由的 AGV 仿真
在本博客之前的文章中,我已经介绍了各种离散事件仿真软件选项。我在下面列出了一些例子。显然,我喜欢免费和开放的模拟工具和框架(参见例如“simmer”)。然而,AnyLogic 是一个商业工具。
- 链接:R中煨的停车场模拟器
- 链接:ProModel AutoCAD仿真版
- 链接:Visual Components财务KPI模拟
- 链接:在 R 中进行 Simmer 进行离散事件仿真
- 链接:用 simmer 模拟收货检验
- 链接:FIFO生产积压模拟
在各种模拟项目中,我使用了各种离散事件模拟工具,而不仅仅是上面列出的那些。但是,对于嵌入到材料流研究中的 AGV 仿真,我发现 AnyLogic 和 Simio 是最好的离散事件仿真工具之一。我还看到了 FlexSim 和 Plant Simulation 在 AGV 仿真方面的功能,您也可以使用这些功能。但是,就能够自定义而言,我更喜欢 AnyLogic。主要是因为它的结构、文档和透明度——以及 AnyLogic 是用 JAVA 编码的事实。
模拟研究需要程序模型
当供应链分析师进入仿真时,我经常观察到的一个常见错误是他们直接跳到建模。但是,只有明确定义了仿真研究的目标,才能开发出好的仿真模型。此外,这通常只有在所有相关方都完全理解了底层系统或问题后才有可能。我建议对任何模拟研究使用过程模型。下图说明了我的过程模型。
其实我应用的程序模型在之前的博文中已经在这个博客上发表过。以下是两篇相关的相关文章:
- 链接:离散事件仿真过程模型
- 链接:基于模拟的容量规划
因此,在模拟研究的早期阶段,充分了解情况很重要。此步骤的适当术语是例如情况分析、差距分析和问题定义。数据收集是此步骤的一部分。之后,我通常会明确定义要开发的仿真模型中什么是什么,什么不是。例如,我曾经模拟了苏黎世(瑞士)的电车运营和电车时刻表。我决定在那个项目中,不会详细实施阻塞电车轨道的人流。相反,我用随机分布曲线描述了铁路阻塞频率和持续时间。
最终,仿真研究通过开发布局和概念模型进行。概念建模涉及例如流程图以及相关设备的状态转换图的定义。这使得实际的仿真建模实现更加容易,并确保代码结构良好。
我画了一个简单的 AGV 模拟布局
根据我从事的项目,我通常会自己绘制一个粗略的布局。或者,我将依赖客户工程团队提供给我的 AutoCAD 图纸(或类似图纸)。
上图描绘了一个中央接收区域,该区域通过辊道传送接收的输入材料。起重机或机器人将零件放置在传送带末端的 AGV 上。
AGV 促进了初始接收的材料流动
AGV 代表 AnyLogic 中此 AGV 模拟的核心,将零件路由到工作区域。这个路由过程可能需要做出决策,可能在非常复杂的层面上。
例如,我可能想将最近的 AGV 分配给任务,或者使用利用率最低的 AGV。我可能还面临一种情况,我想模拟实际的路由决策。即一台AGV走A路,另一台AGV走B路,通过AGV车道网络。
在 AnyLogic 中实现 AGV 仿真
我在 AnyLogic 中实现了这个 AGV 模拟。该模型的屏幕截图如下所示。
本质上,该模型由生成零件到达的源组成。这些零件到达被转发到传送带。一旦零件到达传送带的定义末端位置,运输任务就会被释放。实际上,这个任务调度流程是一个默认的 AnyLogic 流程。但是,我可以使用 JAVA 实现自定义任务调度逻辑。
一旦将其中一个 AGV 分配给运输工具,使用如上所述的默认 AnyLogic 逻辑,模型将决定将零件运输到哪个工作区域。为此,我为演示目的实现了一个自定义但简单的决策逻辑。我将在下面的章节中描述这个定制的逻辑。
这是一个简单的例子,我没有详细实现工作区。此外,我也没有详细实施机器人或起重机在传送带出口处的拾取和放置操作。参考我的程序模型,这完全没问题。我被“允许”在更高的抽象级别上实现这些过程步骤,只要研究目标和问题定义不表明我需要以指定的细节实现这些过程步骤。拾取和放置操作可以例如用时间延迟建模。如果适合所选的物料搬运设备,该时间延迟可以随机分布。
事实上,另一个抽象是我没有可视化工作区域,也没有实现任何自定义对象来表示它们。相反,我只是使用了 AnyLogic 的默认节点对象。当前活动的目标节点,即当前相关的工作区,由站变量引用。此变量由自定义路由算法更新。我将在本文中进一步解释这一点。
一旦零件到达工作区,零件就会在工作区停留一段指定的默认时间。最终,零件进入水槽。接收器删除零件,从而将其从模型中移除。
使用 JAVA 实现自定义路由决策
在实施 AGV 模拟时,我想影响的一件事是路由决策。显然,这是因为路线有助于任何材料流动。在这种情况下,如果我假设从收货处到达的每个零件都代表相同的输入材料,例如用于铣削或其他加工的原材料,我不能只根据材料类型进行路由。相反,我可能想根据工作中心利用率或其他一些标准进行路由。关键是,路由决策必须易于定制。我写这篇博文是为了提供一个简单的例子,说明如何在 AnyLogic 中进行此操作。
在这个简单的 AGV仿真模型中,我使用 4 个变量和 1 个函数来促进自定义路由:
- output_01到output_03测量交付到相应工作区的零件总数
- 站引用零件目标工作区(AnyLogic 节点对象)
- set_route是一个有助于定制路由决策的函数
下面的屏幕截图显示了set_route函数的内容。
set_route函数只是实现循环路由。也就是说,第一部分转到station_a,第二部分转到station_b,依此类推。但是,如果需要,我可以指定其他函数和变量,以及其他类型的决策。最后,实现的逻辑取决于具体情况。
每当代理进入逻辑块链下的moveTo_a块时,就会调用set_route函数。
此逻辑块链实现以下流程:
- src生成间隔时间随机分布的零件
- 传送从传送带标记的开始到结束位置传送零件
- get_transport请求 AGV 从传送带出口拾取零件
- moveTo_a调用set_route并将部分传输到站中的节点引用
- 延迟使零件在节点(代表工作区)中停留一段时间
- sink从模型中移除零件
我可以在 moveTo_a 块的 OnEnter 部分指定函数调用。请参阅下面的屏幕截图。
结论及相关内容
在这个简单的 AGV 模拟示例中,我演示了如何在 AnyLogic 中自定义部件路由。此示例中使用的路由标准和路由逻辑非常简单。真正的路由算法通常会更加复杂,并针对其所在工厂的要求量身定制。此类路由算法将很快变得复杂并且可能具有挑战性。
在整篇文章中,我已经提供了各种指向相关内容的链接。不过,这里有一些额外的文章,我想与感兴趣的读者分享:
- 链接:排队系统解析解决
- 链接:Python中基于代理的模拟
- 链接:机器学习和离散事件模拟
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply