Tutorial Task 1.4 - FlexSim全局列表教程:掌握任务序列与操作员调度
购买adidas上京东官方旗舰店。
任务概述
在这个教程任务中,你将学习一个使用全局列表和任务序列来构建任务的系统。任务序列是一个最终将被分派给任务执行器的完整任务系列。当任务执行器处理任务序列时,它将一个接一个地完成序列中的所有任务,不会中断(除非被抢占)。你可以将任务序列推送到全局列表,然后任务执行器可以在准备好处理另一个任务时,从列表中拉取任务。(关于全局列表与局部列表的区别,请参阅下一节的解释。)
你可以把任务序列看作操作员将从工作板上拉取的完整"待办事项"列表。操作员将按照列出的顺序完成任务序列中的所有任务。当任务序列完成后,操作员将返回工作板,获取一个新的"待办事项"列表(任务序列)来处理。
完成后,你的仿真模型将类似于以下模型运行:
什么是全局列表?
在本教程中,全局列表与局部列表有何不同?通常,局部列表和全局列表的区别在于列表在仿真模型各个元素中的可访问性。你在上一个教程中构建的列表是一个局部列表,因为它只能通过通用流程在内部访问。这意味着只有该局部流程内部的令牌才能从列表中推送和拉取项目。还要注意,你只是通过将列表共享资产拖入流程来设置列表,但你没有更改其任何默认设置,也没有做任何使其可以在该流程外部访问的操作。
在本教程中,你将在工具箱中创建一个全局列表,然后将其链接到流程中的列表共享资产。一旦使列表全局可访问,它就可以同时被流程和3D模型中的对象使用。流程将能够将任务序列推送到列表,然后3D模型中的操作员在准备好处理新任务时,将能够直接从列表中拉取任务序列。操作员将与全局列表交互,完全独立于流程。
步骤 1复制并修改 3D 模型
在此步骤中,你将复制用于构建列表逻辑的系统。完成后,你的 3D 模型应类似于下图:
要复制平面:
- 单击ListLogic平面以选择它。(它是红色的那个。)
- 按 Ctrl+C 复制该平面及其上的所有对象。在模型中的空白处单击以取消选择原始平面。按 Ctrl+V 粘贴复制的平面。
- 移动新复制的平面,使其位于 StandardLogic 平面(黄色的那个)上方。
- 选中复制的平面,在属性中,将平面的名称更改为GlobalListLogic。
- 单击颜色框旁边的箭头以打开颜色选择器菜单。选择最浅的绿色阴影。
- 重命名复制平面上的每个 3D 对象,将任何3数字替换为4,例如Queue4、Operator4A、Processor4A等。
- 右键单击Processor4A以打开菜单。指向对象组并单击ListProcessors以将该操作员从该组中移除。
- 重复上一步,将Processor4B从ListProcessors组中移除。
- 右键单击Processor4A以打开菜单。指向对象组并选择添加到新组。
- 在组属性窗口中,将组的名称更改为GlobalListProcessors。
- 关闭组属性窗口。
检查以确保你的 3D 模型看起来类似于本步骤开头显示的图像。
步骤 2创建全局列表
在此步骤中,你将设置用于存储任务序列的全局列表,并将其链接到流程中的列表。你还将设置操作员在其"资源可用时"触发器触发时,从该列表中拉取任务序列。每当操作员完成任务并空闲可以处理另一个任务时,此触发器就会触发。
要创建此逻辑:
- 在左侧窗格中,单击工具箱选项卡以切换到工具箱。
-
单击添加按钮
以打开菜单。指向全局列表,然后选择任务序列列表。
- 在列表属性中,将列表的名称更改为可用任务。暂时将字段保留为默认设置。
- 单击积压订单选项卡,并勾选推送时重新评估所有值复选框。
- 按确定按钮以保存更改并关闭窗口。
- 在 3D 模型中,单击Operator4A以在右侧显示其属性。
-
在触发器部分下,单击添加按钮
以打开菜单。选择资源可用时。
-
在资源可用时框旁边,单击添加按钮
以打开菜单。指向使用列表,然后选择从任务序列列表拉取。
- 在选取列表属性窗口中,确认可用任务被列为操作员将使用的全局列表。
- 对Operator4B重复上述步骤。
考虑在此时保存你的模型。
步骤 3使用全局列表创建任务
在此步骤中,你将向通用流程中添加活动,以构建一个使用全局列表创建运输任务逻辑的流程。
完成后,你的流程应类似于下图:
目前,你只需将这些活动添加到流程中并进行连接。你将在后续步骤中编辑属性以添加功能。
要添加并连接这些活动:
- 在工具栏上,单击流程按钮以打开菜单。选择添加通用流程。
- 单击流程中的空白区域,以便不选择任何内容。在快速属性中,将流程的名称更改为GlobalListLogic。
- 在流程打开并处于活动状态时,将容器形状(在显示下)拖入流程。
- 在属性中,将形状的名称更改为使用全局列表的任务。
- 单击颜色框旁边的箭头将其更改为深绿色。使用绿色是因为它与 GlobalListLogic 平面的颜色匹配。
-
在使用全局列表的任务形状内,添加以下活动以创建一个堆叠块:
- 一个事件触发源(在令牌创建下)
- 一个创建任务序列(在任务序列下)
- 一个装载(在任务序列下)
- 一个行进(在任务序列下)
- 一个延迟(在任务序列下)
- 一个卸载(在任务序列下)
- 一个完成任务序列(在任务序列下)
- 一个推送到列表(在共享资产下)
- 一个吸收器(在基础下)
- 将一个列表共享资产添加到堆叠块的右侧。
- 重命名活动和共享资产如下:
| 活动 | 新名称 |
|---|---|
| 列表 | 列表:可用任务 |
| 源 | 源:项目进入队列 |
| 创建 TS | 创建 TS:运输任务 |
| 装载 | 从队列装载项目 |
| 行进 | 行进至扫描站 |
| 延迟 | 延迟:扫描项目 |
| 卸载 | 在处理器处卸载项目 |
| 推送到列表 | 推送到列表:可用任务 |
| 吸收器 | 吸收器:任务序列已拉取 |
检查以确保你的流程看起来类似于本步骤开头显示的图像。
步骤 4创建全局列表逻辑
在此步骤中,你将设置将控制这些任务的流程逻辑。此流程将与你在上一个教程任务中构建的基于列表的流程非常相似,但会有一些关键区别。主要区别在于,你将构建一个任务序列,然后将该任务序列推送到列表上。任务序列将包含完成与任务序列关联的流项目的运输任务所需的所有不同任务。然后,操作员在准备好处理任务时,将从列表中拉取任务序列。
以下是每个活动和共享资产将如何运作的概述:
| 活动 | 说明 |
|---|---|
| 列表:可用任务 | 此列表将存储所有可供操作员处理的运输任务序列的引用。你将在下一步将此内部列表链接到全局列表。 |
| 源:项目进入队列 | 事件触发源是一个监听 3D 模型中事件的活动。当流项目进入 Queue4 时,此活动将创建一个令牌并将其释放到下一个下游活动。你将为此令牌分配一个名为ItemToTransport的标签,其中将包含触发事件的特定流项目的引用。 |
| 创建 TS:运输任务 | 此活动将创建一个名为TransportTasks的任务序列。此时该任务序列将是空的,但随着令牌在流程的其余部分移动,这些任务将被添加到此任务序列中。任务序列将按应完成的顺序存储运输任务。稍后,任务序列将被推送到全局列表。 |
| 从队列装载项目 | 此活动告诉操作员需要拾取哪个流项目以及它位于何处。 |
| 行进至扫描站 | 此活动将告诉操作员行进到 ScanStation4 对象。 |
| 延迟:扫描项目 | 此活动将模拟在计算机中扫描流项目所需的时间。你将延迟设置为 1 秒。 |
| 在处理器处卸载项目 | 此活动告诉操作员在哪里卸载流项目。目前,你将设置此活动仅将流项目放到 Processor4A。 |
| 完成 TS | 此活动声明任务序列的结束。 |
| 推送到列表:可用任务 | 此活动将把TransportTasks任务序列中的任务推送到可用任务全局列表。 |
| 吸收器:任务序列已拉取 | 此活动从流程中移除令牌。你将使用其默认设置。 |
要创建此功能:
- 在流程中,单击列表:可用任务共享资产以选择它。在属性中,单击列表框旁边的箭头以打开菜单。指向全局列表,然后选择可用任务。
-
单击源:项目进入队列活动以选择它。单击活动旁边的感叹号按钮
以进入采样模式。
- 在 3D 模型中,单击Queue4以打开菜单。选择Queue4:进入时。
- 在属性中,在标签分配表中,单击进入项目行下标签名称列中的单元格。输入ItemToTransport。
- 单击进入项目行下运算符列中的单元格以打开菜单。选择分配。
-
单击创建 TS:运输任务活动以选择它。在属性中,在任务执行器/分派器框旁边,单击删除按钮
。
- 在分配给选项下的框中,删除当前文本并输入token.TransportTasks。
- 确保调度并等待复选框 未被勾选。
- 点击从队列装载物料活动以选中它。 在属性面板中,点击任务执行器 / 任务序列框旁边的箭头以打开菜单。指向令牌标签并选择TransportTasks。
- 点击物料框旁边的箭头以打开菜单。 指向令牌标签并选择ItemToTransport。
- 点击前往扫描站活动以选中它。 在属性面板中,点击任务执行器 / 任务序列框旁边的箭头以打开菜单。指向令牌标签并选择TransportTasks。
-
在目的地框旁边,点击取样器按钮
以进入取样模式。
- 在3D模型中,点击ScanStation4以打开菜单。 选择GlobalListLogic/ScanStation4。
- 点击延迟:扫描物料活动以选中它。在 属性面板中,点击任务执行器 / 任务序列框旁边的箭头以打开菜单。指向令牌标签并选择TransportTasks。
- 在延迟时间框中,删除当前文本并输入1.00。
- 点击卸载:在处理器处的物料活动以选中 它。在属性面板中,点击任务执行器 / 任务序列框旁边的箭头以打开菜单。指向令牌标签并选择TransportTasks。
- 点击物料框旁边的箭头以打开菜单。 指向令牌标签并选择ItemToTransport。
-
在工作站框旁边,点击取样器按钮
以进入取样模式。
- 在3D模型中,点击Processor4A以打开菜单。 选择GlobalListLogic/Processor4A。
-
点击推送到列表:可用任务活动以
选中它。点击活动旁边的感叹号按钮
以进入
取样模式。
- 点击列表:可用任务共享资产以选中 它。现在会有一条蓝线将此活动连接到共享资产。
- 在属性面板中,点击推送 值框旁边的箭头以打开菜单。指向令牌标签, 然后选择TransportTasks。
点击结束任务序列活动以选中它。在快速 属性面板中,点击任务序列下方的框, 并在框中输入token.TransportTasks。
重置并运行模型:
如您所见,没有任何事情发生。箱子只是在队列内堆积起来, 操作员也静止不动。哪里出错了?
如果您查看流程流,就会找到线索:请注意,令牌正在 在"从队列装载物料"活动内部形成瓶颈。这意味着该活动中发生了某些情况, 阻止令牌移动到下一个下游活动。在下一步中,您将了解为什么会发生这种情况以及如何解决这个问题。
第5步排查瓶颈问题
在此步骤中,您将修复流程流中发生的令牌瓶颈。要 解决此问题,您需要记住此流程流中的逻辑与 您在本教程中迄今为止构建的其他类型的流程流中使用的逻辑有何不同。
在您构建的其他流程流中,操作员在令牌 实时流经流程流中的各种活动时执行每个任务。在此流程流中, 您使用了不同的方法。任务不是实时完成,而是 被添加到任务序列中,然后被推送到全局列表。
正如本教程开头提到的,您可以将任务序列视为 一个完整的"待办事项"列表,将被发布到集体工作板(全局 列表)。您在此流程流中所做的是为任务执行器 稍后执行构建指令。任务序列将在全局列表上等待,直到任务执行器 将其从列表中取出并开始处理它。
全局列表流程流遇到瓶颈的原因是"从队列装载物料" 活动不会将令牌释放到下一个下游活动。默认情况下, 该活动应该等待任务完成才能继续。 由于这些任务不会实时完成,您需要调整属性,以便 在令牌可以移动到下一个活动之前,此任务不必完成。
要进行这些更改:
- 点击从队列装载物料活动以选中它。 在属性面板中,清除等待直到完成复选框。
- 点击前往扫描站活动以选中它。 在属性面板中,清除等待直到完成复选框。
- 点击延迟:扫描物料活动以选中它。在 属性面板中,清除等待直到完成复选框。
- 点击卸载:在处理器处的物料活动以选中 它。在属性面板中,清除等待直到完成复选框。
重置并运行模型:
如您所见,现在瓶颈已修复,并且其运行方式几乎与使用不同方法设置逻辑的其他 仿真模型相同。
当然,在这一点上,您还没有设置处理第二个处理器的能力 或如何应对高优先级流动实体。还请注意,有时操作员会装载 多个流动实体到处理器上,因为它目前不受获取资源活动的限制。您将在本教程的 其余部分设置逻辑来处理这类问题。
第6步添加任务序列优先级
由于将任务序列推送到全局列表允许您与 标准逻辑系统混合搭配,这意味着您还可以将任务序列与 标准逻辑系统的优先级和抢占能力集成。您将在本步骤中设置该逻辑。 您将使用流动实体上的RushOrder标签来为每个任务序列分配优先级, 然后再将它们推送到列表上。您还将看到这些优先级级别如何与标准逻辑交互。
完成后,您的流程流将类似于下图:
以下是新增或编辑的活动和共享资产将如何 运行的概述:
| 活动 | 说明 |
|---|---|
| 分配标签:复制 RushOrder | 此活动将复制流动实体上的RushOrder标签,以便 它也在令牌上。 |
| 创建任务序列:TransportTasks | 您将编辑此活动,以便它根据RushOrder标签的优先级为每个任务序列分配优先级级别。 |
| 列表:可用任务 | 您将向此列表添加一个额外字段,以跟踪任务序列的 优先级级别。 |
要创建此逻辑:
- 在流程流打开且处于活动状态的情况下,在源头:物料进入队列活动之后插入一个分配 标签活动(位于基础下)。
- 将此活动重命名为分配标签:复制 RushOrder。
-
在此活动的属性面板中,点击添加按钮
以添加新标签。
- 在名称框中,输入RushOrder。
- 在值框中,输入token.ItemToTransport.RushOrder。
- 点击创建任务序列:TransportTasks活动以选中 它。在属性面板的优先级框中,删除 当前文本并输入token.RushOrder。
- 点击列表:可用任务共享资产。在快速 属性面板中,点击高级按钮以打开列表的 属性。
-
在字段选项卡上,点击添加按钮
以打开菜单。选择priority以添加此字段。
- 按下确定按钮以保存更改并关闭 属性窗口。
- 在3D模型中,点击Operator4A以调出其 右侧的属性。
-
在触发器部分中,在资源
可用时触发器旁边,点击编辑
属性按钮
以打开
选取列表选项。
-
在查询框旁边,点击添加按钮
以打开菜单。指向ORDER BY (排序),然后选择priority。将ASC更改为DESC。
- 为Operator4B重复上述步骤。
重置并运行模型。
全局列表系统可以像使用本地列表的系统一样很好地处理优先级。 然而,它还有一个额外的优势,即能更好地与标准逻辑的优先级级别协同工作。换句话说,您可以开发更复杂的优先级和 抢占系统,将标准逻辑元素与流程流逻辑相结合。
第7步添加第二个处理器
在这最后一步中,您将把第二个处理器加回来。不幸的是,当您添加 第二个处理器的功能时,您将开始看到构建任务序列然后将其推送到全局任务序列列表的一些缺点。
完成后,您的流程流将类似于下图:
以下是新增和编辑的活动及共享资产将如何 运行的概述:
| 活动 | 说明 |
|---|---|
| 资源:处理器 | 您将把此共享活动链接到3D模型中的GlobalListProcessors组,以便可以获取此组中的处理器, 限制它们一次只能处理一个流动实体。您还将设置资源的队列策略,以便它 优先处理RushOrder值为1的流动实体。 |
| 获取处理器 | 此活动将在构建任务序列之前尝试获取一个处理器。 如果处理器可用,令牌将获取该资源并 将令牌释放到下一个下游对象。当资源被获取时, 您将为令牌分配一个名为Processor的标签,该标签将包含一个 指向3D模型中已获取的处理器的引用。 |
| 在处理器处卸载物料 | 您将编辑此活动,以便它将使用Processor标签来 确定哪个处理器应接收流动实体。 |
| 等待事件:处理完成 | 这是一个事件监听活动,这意味着它将监听3D模型中的一个对象, 并在事件发生时将令牌释放到下一个下游活动。此活动将等待处理器完成对物料的处理, 然后再将令牌释放到下一个活动。 |
| 释放处理器 | 此活动将释放处理器,以便它可以接受另一个流动实体。 它将使用Processor标签来释放处理器。 |
要添加第二个处理器:
- 在3D模型中,右键单击Processor4B以打开 菜单。指向对象组,然后选择GlobalListProcessors以将此处理器添加到此 组。
- 在流程流中,在分配标签:复制 RushOrder活动之后插入一个获取资源活动(位于共享资产下)。
- 在您刚刚添加的推送到列表: 可用任务活动之后插入一个等待事件活动(位于基础下)。
- 在您刚刚添加的等待 事件活动之后插入一个释放资源活动(位于共享资产下)。
- 添加一个资源共享资产(位于共享资产下),并将其放在堆叠活动块的右侧。
- 重命名以下活动和共享资产:
- 点击资源:处理器共享资产以选中它。在属性中,点击引用框旁边的箭头以打开菜单。指向组,然后选择GlobalListProcessors。
- 在队列策略框中,输入ORDER BY Puller.RushOrder DESC。
-
点击获取处理器活动以选中它。点击活动旁边的感叹号按钮
以进入采样模式。
- 点击资源:处理器共享资产以采样它。现在将有一条蓝线将此活动连接到共享资产。
- 在属性中,在分配给标签框中,删除当前文本并输入token.Processor。
- 点击卸载:处理器处的实体活动以选中它。在属性中,点击站点框旁边的箭头以打开菜单。指向令牌标签并选择Processor。
- 点击等待事件:处理完成时活动以选中它。点击对象框旁边的箭头以打开菜单。指向令牌标签并选择Processor。
-
在事件框旁边,点击采样器按钮
以进入采样模式。
- 在3D模型中,点击Processor4A以打开菜单。选择处理完成时。
- 点击释放处理器活动以选中它。点击分配给资源旁边的箭头以打开菜单。指向令牌标签,然后选择Processor。
| 活动 | 新名称 |
|---|---|
| 资源 | 资源:处理器 |
| 获取 | 获取处理器 |
| 等待事件 | 等待事件:处理完成 |
| 释放 | 释放处理器 |
| 接收器:任务序列已拉取 | 接收器:实体已释放到接收器 |
重置并运行模型。
虽然全局列表系统可以毫无问题地处理增加一个处理器的情况,但您不幸地失去了全局列表系统的一些优势。例如,请注意,流程流一次只创建并将两个任务序列推送到列表中。一次只能有两个任务序列被推送到列表中,因为一次只能获取两个处理器。这降低了全局列表的效率,因为当操作员可以从许多任务中进行选择,并专注于根据匹配特定条件的任务来拉取任务时,它的效果更好。
如果处理器能在操作员从全局列表拉取任务序列的那一刻动态分配,而不是在任务序列被推送到列表之前就分配好,那么这个问题就可以避免。然而,目前在FlexSim中还没有简单的方法来实现这一点。
幸运的是,在下一步中,您将学习如何针对此问题实施一个相当简单的变通方法。
步骤8排查处理器问题
在此步骤中,您将针对上一步尝试添加第二个处理器时遇到的问题添加一个变通方法。您可能还记得,问题在于无法在操作员从全局列表拉取任务序列时动态分配处理器。
变通解决方案是在两个处理器前面放置一个队列,以便在操作员卸载实体时可以存储它们。然后,您将设置处理器在准备处理下一个实体时从队列中拉取流实体。您还将设置新队列,以便处理器优先拉取加急订单实体。最后,您将修改流程流,删除不必要的活动,并更改流实体的卸载目的地。
要进行这些更改:
- 在3D模型中,向GlobalListLogic平面添加另一个队列,将其放置在两个处理器附近。(您可能需要移动Scanstation4形状以腾出空间。)
- 将新队列重命名为Destination4。
- 从Destination4到Processor4A和Processor4B创建端口连接(A连接)。
- 点击Processor4A以在右侧打开其属性。在输入部分下,勾选拉取框。点击确定按钮以保存更改并关闭窗口。
- 对Processor4B重复上述步骤。
-
点击Destination4以打开其属性窗口。在触发器部分下,点击添加按钮
以打开菜单。选择进入时。
-
在进入时框旁边,点击添加按钮
以打开菜单。指向控制,然后按表达式排序以打开选择列表窗口。
- 在表达式框中,删除当前文本并输入item.RushOrder。
- 确认顺序菜单当前显示为降序。
-
在流程流中,删除以下活动和共享资产:
- - 共享资产资源:处理器- 活动
- 获取处理器- 活动等待事件:处理完成
- - 活动释放处理器 点击
- 卸载:处理器处的实体以选中它。在属性中,点击站点
-
框旁边的采样器按钮以进入采样模式。在3D模型中,点击Destination4队列以打开菜单。选择
GlobalListLogic/Destination4
- 以采样它。重置并运行模型:现在任务列表一次可以容纳远多于两个任务,因为系统不再有限制要求您在任务序列构建并推送到列表之前分配处理器。如果实体开始在Destination4队列中累积,处理器将优先拉取加急订单实体。(如果您愿意,可以通过尝试更长的处理时间来测试这一点。)结论现在您已经使用流程流中的列表构建了运输任务,您可以看到它有几个优势:
设计"寻找工作"任务系统
- 使用全局列表,您可以将任务序列推送到列表,然后让操作员在任务序列可用时根据特定条件拉取任务序列。在此示例中,您让操作员优先拉取更高优先级的任务,但您可能还可以为系统增加更复杂的逻辑。例如,您可以安排具有特定专长的操作员拉取需要该专长的任务序列。
模型可扩展性
- 这种"寻找工作"系统可以很好地扩展,因为您可以将模型设置为将来自许多不同系统的可用任务序列放在一个全局列表中,并由一个操作员池访问。
- 与标准逻辑混合搭配- 如果您需要设计一个同时利用流程流和标准逻辑优势的任务系统,使用任务序列方法可能会有所帮助。
- 优先级和抢占- 其他流程流系统没有一种方法可以为任务分配与标准逻辑配合良好的优先级或抢占值。分配优先级和抢占的唯一方法是构建一个任务序列,为该序列分配优先级或抢占值,然后将其推送到全局列表。
- 然而,使用列表构建任务逻辑也有一些缺点:缺乏动态决策能力
- - 该系统的一个缺点是,任务序列一旦被推送到全局列表,就无法动态更改或更新。一旦任务序列被推送到全局列表,就无法更改。例如,操作员无法动态决定将实体卸载到哪个处理器,因为这必须在任务序列构建并推送到列表时预先确定。全局列表系统的这个特定弱点可能会消除该系统的优势。任务逻辑教程到此结束。现在,您应该对在仿真模型中构建任务逻辑的不同方法的优缺点有了很好的了解。当您考虑在仿真项目中使用哪种系统时,请考虑您系统的独特需求以及最适合该项目的任务逻辑方法。
- 无法进行动态决策——该系统的缺点之一是,任务序列一旦被推送到全局列表中后,就无法再进行动态更改或更新。任务序列被推送到全局列表后即不可更改。例如,操作员无法就从哪个处理器卸载流程项做出动态决策,因为这必须在构建任务序列并将其推送到列表时预先确定。全局列表系统的这一特定弱点可能会抵消该系统本身的优势。
返回任务逻辑教程:Tutorial 1-任务逻辑工具目录


微信扫一扫,打赏作者吧~