Tutorial Task 5.1 - Create a Custom Fixed Resource
任务概述
在本教程任务中,您将学习如何使用对象流程流为固定资源设计自定义逻辑。您将在模型中添加一个 BasicFR 对象,并将其连接到对象流程流,该流程流将接收并批量处理流动物体。本教程还将涵盖设计自定义固定资源时常见的难题与陷阱。完成后,您的模型将类似于下图所示:

接收与释放物体
BasicFR 对象是一张白纸,这意味着它们自身不具备接收和释放物体的逻辑。您需要通过创建对象流程流,将相关逻辑显式添加到 BasicFR 对象中。您将使用事件监听活动中的“接收物体”和“释放物体”选择列表来处理此逻辑。
请注意,如果您要将标准固定资源(如队列或处理器)连接到流程流,则不应使用“接收物体”和“释放物体”选择列表。而应使用“关闭端口”和“打开端口”选择列表。具体示例可参考教程 2 - 任务序列中相关选择列表的应用场景。
步骤 1构建 3D 模型
在这一步中,你将构建一个基础的3D模型。完成时,你的3D模型应 看起来与下图类似:

构建此模型的步骤如下:
- 从库中拖拽以下对象:
- 1Source(源)
- 2Queues(队列)
- 1BasicFR(基础FR)
- 1Operator(操作员)
- 3Processors(处理器)
- 1Sink(接收器)
- 1Plane(平面)
- 移动这些对象,使它们大致按照本步骤开头图片所示的布局排列。
- 为清晰起见,请按以下方式重命名对象:
- 点击批次以选中它。
- 在属性中,按如下方式更改批次的尺寸:
- X尺寸:
3.00 - Y尺寸:
1.50 - Z尺寸:
0.50
- X尺寸:
- 创建端口连接(A-连接),从:
- 源到队列1
- 队列1到批次
- 批次到处理器1
- 处理器1到队列2
- 队列2到处理器2和处理器3
- 处理器2和处理器3到接收器
- 创建一个中心端口连接(S-连接)从队列2到运算符
- 点击队列2以在右侧打开其属性。
- 在输出部分下,勾选使用 传输勾选复选框并确认此队列将使用连接到其中心端口的操作员。
| 对象 | 新名称 |
|---|---|
| Source1 | Source(源) |
| BasicFR1 | 批次 |
| 操作员1 | 操作员 |
| 接收器1 | 接收器 |
| 平面 | 休息室 |

检查以确保您的模型与本部分开头显示的图像类似。
步骤 2向对象流程中添加活动
在此步骤中,您将向对象流程中添加活动,以构建一个自定义的固定资源,该资源将接收三个流动物品,批量处理这些物品,然后将它们释放到下一个下游资源。完成后,您的流程应类似于下图:

目前,您只需将这些活动添加到流程中并进行连接。您将在后续步骤中编辑属性以添加功能。
要添加并连接这些活动:
- 在主工具栏上,单击流程按钮以打开菜单。指向添加对象流程,然后选择空白。
- 在属性面板的流程名称框中, 删除当前文本并将该流程重命名为BatchLogic。
- 从库中,添加一个计划源活动 (位于令牌创建下)。
- 从库中,添加一个等待事件活动,并 在其末尾添加一个延迟活动,以创建一个 堆叠块。
- 重复上一步两次,再创建两个相同的堆叠块。
- 从库中,添加以下活动以再创建一个堆叠块:
- 一个延迟活动(位于基础下)
- 3个等待事件活动(位于基本)
- 为了清晰起见,将这些活动重命名为:
- 根据以下活动创建一个连接器:
- 从源:开始模拟到等待事件:接收项目1活动
- 从延迟:处理项目1到等待事件:接收项目2活动
- 从延迟:处理项目2到等待事件:接收项目3活动
- 从延迟:处理项目3到延迟:处理所有项目活动
- 创建一个从等待 事件:释放物料 3活动到等待事件: 接收物料 1活动的连接器。
| 活动 | 新名称 |
|---|---|
| 来源 | 来源:开始模拟 |
| 首次等待事件 | 等待事件:接收项目1 |
| 首次延迟 | 延迟:处理项目1 |
| 第二次等待事件 | 等待事件:接收项目2 |
| 第二次延迟 | 延迟:处理项目2 |
| 第三次等待事件 | 等待事件:接收项目3 |
| 第三次延迟 | 延迟:处理项目3 |
| 第四次延迟 | 延迟:处理所有项目 |
| 第四次等待事件 | 等待事件:释放项目1 |
| 第五次等待事件 | 等待事件:释放项目2 |
| 第六次等待事件 | 等待事件:释放项目3 |
请考虑保存您的仿真模型。
步骤 3编辑接收活动
在此步骤中,您将编辑流程中处理接收物料活动的属性。首先,您需要将 Batch 作为一个实例附加到流程中。这将使您能够使用current关键字来动态引用 Batch。这使得扩展更复杂的模型变得更加容易:您可以添加额外的 BasicFR 对象作为流程的附件,而无需为每个对象复制流程。
以下是每个活动功能的概述:
| 活动 | 说明 |
|---|---|
| 源:开始仿真 | 此计划源活动将在仿真开始后立即创建一个令牌,并将其发送至"等待事件"活动。生成此令牌后,它将不再创建任何额外令牌。该令牌将在其他活动之间持续循环,直至仿真结束。请为此活动使用默认属性设置。 |
| 等待事件:接收物料 | 等待事件活动属于事件监听型活动。这意味着令牌将在此活动处等待,直到被监听的事件发生。在此流程中,前三个等待事件活动将监听批次对象的"进入时"事件。由于批次属于基础固定资源对象,您需要明确指示其接收流动物料。当批次接收到流动物料时,您需要为其分配一个名为Item1、Item2或Item3的标签,该标签将存储触发事件的流动物料的引用。 |
| 延迟:处理时间 | 您将添加5秒延迟,用以表示批次处理每个流动物料所需的时间。 |
编辑这些属性的方法:
- 点击流程中的一个空白区域,确保未选中任何内容。在"快速属性"面板的流程实例分组下,找到附加对象(实例)列表。点击采样器按钮
进入采样模式。 - 在3D模型中,点击批次进行采样。
- 点击等待事件:接收物品1活动以选中它。在属性面板中,确认对象框显示为
当前 (无 实例)。 - 在事件方框中,点击采样器按钮
进入采样模式。 - 在3D模型中,点击批次打开菜单。选择进入时对此事件进行采样。
- 现在找到标签匹配/分配表格。在进入项行,位于标签名称列下,输入
Item1。 - 点击操作列下的单元格以打开菜单。选择分配。
- 在监听器初始化时框,点击添加按钮
以打开菜单。指向控制,然后BasicFR,接着接收项目以打开拣选列表选项。 - 您将使用默认设置,因此请确认拣选列表选项与下图类似:
- 对等待事件:接收项目 2和等待事件:接收项目 3活动重复步骤4-11,但在第8步应使用标签名称项目2和项目3
- 。点击延迟:处理项目 1活动以选中它。在属性面板的框,删除
当前文本并输入
5.00。 - 对延迟:处理项目2和延迟:处理项目3活动重复上一步操作。



考虑保存您的仿真模型。
步骤4编辑释放活动
在此步骤中,您将编辑流程中处理项目释放活动的属性。以下是每个活动功能的概述:
| 活动 | 说明 |
|---|---|
| 延迟:处理时间 | 您将添加5秒的延迟,以表示批次处理每个流项目所需的时间。 |
| 等待事件:释放项目 | 最后三个“等待事件”活动与前三个“等待事件”活动形成镜像对应关系。这三个活动将监听批次的“On Exit”事件。由于批次属于BasicFR对象,您需要在物料处理完毕后明确指示其释放物料。为确保批次释放正确的物料,您需要引用前三个“等待事件”活动创建的名为Item1、Item2或Item3的标签。 |
按以下步骤编辑属性:
- 点击Delay: Process All Items活动以选中它。在属性面板的Delay Time框中,删除当前文本并输入
10.00。 - 点击Wait for Event: Release Item 1活动以选中它。在属性面板中,确认Object盒子
显示
当前 (无 实例)。 - 在事件框旁,点击采样器按钮
进入采样模式。 - 在3D模型中,点击批量打开菜单。选择退出时对此事件进行采样。
- 在监听器初始化时框旁,点击添加按钮
打开菜单。指向控制,然后BasicFR, 然后释放项目以打开选项列表。 - 在指定要释放的项目框中,将当前文本更改为
令牌。项目1。 - 针对等待事件:释放项目2和等待事件:释放项目3活动重复步骤3-8,但在第8步中应使用标签名称
令牌。项目2和令牌。项目3。


考虑保存您的仿真模型。
步骤5测试模型
你可能还没意识到,但你的自定义固定资源目前存在一些问题。尝试重置并运行模型,看看是否能自己发现问题所在。如果卡住了,本步骤的其余部分将解释问题所在。

如果你仍然不确定问题所在,请尝试以下操作:
- 重置并运行模型。
- 等到批量处理器将流动实体推送到处理器1。
- 暂停仿真模型,尝试移动处理器1上的一个流动实体。你会发现处理器中实际上有三个实体:

这里实际上存在两个问题。首先,你在批量处理器中看不到箱子。由于流程流没有明确设置箱子的位置,它们被批量处理器“吞没”而无法被看到。如果你能在批量处理器中看到它们,你还会发现所有三个流动实体都出现在同一空间(就像它们在处理器1中一样)。这与FlexSim自动偏移对象的方式有关。
其次(也是更重要的),你会发现批次对象同时释放了所有三个流动物体,然后直接跳转到下一批次的开始。同时释放流动物体导致处理器同时处理三个物体,这是错误的行为。这种行为是由FlexSim事件处理机制的工作方式引起的。
你将在接下来的两个步骤中学习如何解决这两个问题。
步骤 6更改流动物体视觉效果
在这一步中,你将修复批次对象中流动物体视觉效果的问题。你将通过添加三个“更改视觉效果”活动(每个物体一个)到控制批次接收物体的活动块中来解决这个问题。你将使用“更改位置”下拉选项来设置在批次活动中流动物体的偏移量。完成后,你的过程流将类似于下图:

在这一步中,你会看到一个FlexScript表达式,即当前.尺寸.z表达式。这个表达式获取包含流动物体的物体(即批次)的Z位置,并将流动物体放置在容器物体的顶部,使其不会被物体“吞没”。
要更改流程项目相对于批次的视觉效果:
- 将鼠标悬停在分隔等待事件: 接收项目1与延迟:处理项目1活动之间的线条上。当线条变为黄色时,双击它以打开快速库。
- 在视觉效果组下,点击更改视觉效果按钮
来添加此活动。 - 重复这些步骤,在接下来的两个堆叠块之间也插入更改视觉效果活动。
- 为清晰起见,将这些活动重命名为:
- 点击视觉变化:项目1位置以选中它。在
属性面板中,紧邻视觉变化框,点击添加按钮
以打开菜单。选择设置位置以打开一些选择列表选项。 - 按如下方式设置选择列表选项:
- 在对象框中,输入
token。项目1 - 在X坐标框中,输入
0.6 - 在Y坐标框中,输入
-0.8 - 在Z位置框中,输入
current.size.z

- 在对象框中,输入
- 对更改视觉效果:项目2
位置重复之前的步骤,但这次请使用以下设置:
- 在对象框中,输入
token.Item2 - 在X位置框中,输入
1.5 - 在Y位置框中,输入
-0.8 - 在Z 位置框中,输入
当前.尺寸.z

- 在对象框中,输入
- 对更改视觉:项目 3
位置重复前面的步骤,但这次使用以下设置:
- 在对象框中,输入
token.Item3 - 在X 位置框中,输入
2.4 - 在Y 位置框中,输入
-0.8 - 在Z坐标位置框中,输入
当前。尺寸。z

- 在对象框中,输入

| 活动 | 新名称 |
|---|---|
| 第一个更改视觉效果 | 更改视觉效果:项目1位置 |
| 第二个更改视觉效果 | 更改视觉效果:项目2位置 |
| 第三项视觉变化 | 视觉变化:项目3位置 |
尝试运行模型,观察这会如何改变流程物料在批处理器中的堆叠方式:

步骤7在流程中添加呼吸活动
您可能还记得在测试模型的步骤中,批处理器存在一个问题:它会将所有流程物料同时释放到下游处理器。这个问题是由FlexSim的事件处理机制导致的。具体来说,当处理器准备接收下一个物料时,它会打开输入端口,这导致第一个物料离开批处理器。当批处理器的“退出时”事件触发时,它会同时触发所有“等待事件”活动,从而一次性释放所有物料。所有这些事件监听逻辑甚至在处理器意识到已接收物料并关闭输入端口之前就已经发生。因此,在处理器输入端口仍处于开启状态时,所有物料都会被立即释放并离开。
同样的问题也可能出现在其他场景中。在流程流工具中,这种情况通常发生在监听事件在"等待事件"或"事件触发源"上触发后,紧接着一个或多个其他活动可能引发模型中其他事件的触发,且原始触发事件与后续事件触发逻辑之间没有任何延迟。逻辑执行速度过快,导致原始事件没有足够时间"喘息"并完成其正在执行的操作。在这些情况下,您可以通过添加一个喘息活动来解决问题,该活动是一个延迟时间设置为0秒的延迟活动。这将允许原始触发事件在令牌继续前进之前完成其正在执行的操作。
完成后,您的流程流将类似于下图所示:

要添加这些喘息活动:
- 将鼠标悬停在分隔等待事件:释放物品1和等待事件:释放物品2活动的线上。当线条变为黄色时,双击它以打开快速库。
- 在基础组下,点击延迟按钮
以添加此活动。 - 重复这些步骤以再添加两个延迟活动 在等待事件:释放项目 2和等待事件:释放项目 3活动之后。
- 为清晰起见,将这些活动重命名为:
- 在属性中,将所有三个延迟时间为呼吸活动设置为
0.00。
| 活动 | 新名称 |
|---|---|
| 第一个延迟 | 呼吸 1 |
| 第二个延迟 | 呼吸 2 |
| 第三个延迟 | 呼吸 3 |

尝试重置并运行模型。这次您会注意到,流程项会逐个离开批次,而非一次性全部离开:

您可能需要使用“等待事件”活动来接收和释放项,这似乎有点反直觉。您可能会问自己,如果在每个“等待事件:释放项”活动之前,在自定义代码活动中使用releaseitem()命令,是否会更简单。
这种方法的问题在于,它实际上可能导致项在命令执行完成之前就退出。等到令牌到达“等待事件:释放项 1”活动时,项 1 可能已经退出了。由于监听的事件可能已经触发,令牌将永远卡在等待状态。
这个问题的解决方案是在“等待事件”活动上使用 OnListenerInitialized 触发器。这允许您以正确的顺序执行逻辑:先执行事件监听逻辑,然后执行接收/释放项的逻辑。
结论
到目前为止,您已经学会了如何在流程流工具中为自定义固定资源创建逻辑。在下一个任务中,您将学习如何为自定义任务执行器创建逻辑。请继续前往教程任务 5.2 - 创建自定义任务执行器.
Cookie preferences
May we collect and use your data?
Learn more about the Third Party Services we use and our Privacy Statement.THIRD PARTY SERVICES
Strictly necessary – required for our site to work and to provide services to you
Improve your experience – allows us to show you what is relevant to you
Customize your advertising – permits us to offer targeted advertising to you
Are you sure you want a less customized experience?
Your experience. Your choice.
May we collect and use your data to tailor your experience?
Explore the benefits of a customized experience by managing your privacy settings for this site or visit our Privacy Statement to learn more about your options.


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