Tutorial Task 3.2 -如何添加条件任务与动态决策子流程
购买adidas上京东官方旗舰店。
任务概述
在本教程任务中,您将学习如何创建能根据模型运行期间变化的条件而改变的任务。您将向仿真模型添加一些约束来创建这些变化的条件。首先,您将添加两个额外的卸载目的地,总共达到三个。接着,您将通过更改其最大容量来对这些队列在特定时间可接收的流动物品数量施加限制。这些限制将创造一种情况,即操作员可能无法在单个目的地卸载所有物品,并且必须评估队列是否有空间接收流动物品。
上网淘巴领天猫淘宝优惠券,一年省好几千。您将通过构建一个嵌套子流程(子流程内的子流程)来创建此逻辑,该子流程使用决策活动在仿真运行期间基于目的地是否已达到其最大容量来动态做出决策。
完成后,您的仿真模型将类似于下图运行:
组也可以充当数组
在之前的教程中,您了解到数组是一种数据结构,可以根据需要包含多个值。回顾一下,您还了解到数组中的每个元素通常由一个索引标识,该索引是一个指示值在数组中位置的数字。在之前的教程中,您创建了一个包含名为GroupOfItems的数组的标签,该数组包含从ItemsToTransport列表中提取的2-5个流动物品。
但标签并非唯一可以包含数组的东西。3D对象组实际上将其成员信息存储为数组。就像您可以通过索引引用GroupOfItems数组中的单个流动物品一样,您也可以通过索引引用3D对象组中的特定成员。组成员的索引基于其在组中出现的顺序。
例如,在本教程的第一步中,您将向3D模型添加两个额外的队列。然后,您会将这些队列添加到之前教程中创建的Destinations组中:
在此示例中,Destinations组包含一个由三个队列组成的数组。每个队列在数组中占据1-3的位置,这就是它的索引.
如果你想引用数组中的某个队列,就需要使用其特定的索引。以前面图片中的示例来说,FlexScript表达式Group("Destinations")[2]将返回对Destination2平面中Queue2的引用。而表达式Group("Destinations")[3]将返回对Destination3平面中Queue3的引用。
回想一下,表达式.length会返回一个值,表示特定数组中有多少个元素。同样地,表达式Group("Destinations").length将返回值3,因为Destinations组中有3个成员。
步骤 1修改 3D 模型
在此步骤中,你将为3D模型添加两个额外的目的地。然后,你将通过限制每个队列在给定时间内可以容纳的流动实体数量,为模型添加一些约束。完成后,你的模型将类似于下图:
要进行这些更改:
- 在3D模型中点击Destination1平面以选中它(它是橙色的那个)。
- 按Ctrl+C复制该平面及其上的所有对象。点击模型中空白处以取消选中原始平面。按Ctrl+V粘贴复制的平面。
- 重复此步骤以添加第三个平面。
- 选中第二个复制的平面,在属性中,将平面的名称更改为Destination2。
- 重命名第二个复制平面上的每个3D对象,使其名称均以2结尾,例如Queue2、Processor2、和Sink2。
- 重复这些步骤,将第三个复制平面的名称更改为Destination3,并重命名该平面上的所有对象,使其名称以3结尾。
- 点击Queue1以选中它。在属性面板的Queue选项卡中,在Max Content框中,输入2。点击OK按钮保存更改并关闭属性窗口。
- 对Queue2重复此步骤,将其Max Content更改为1。
- 对Queue3重复此步骤,将其Max Content更改为3。
- 当您复制这两个平面时,FlexSim 应该已自动添加队列2和队列3添加到目的地组。要确认此操作,请打开左侧窗格中的工具箱。双击目的地组以打开其属性窗口。确认两个新队列在此组中。
- 关闭所有组窗口。
检查并确保您的模型与本步骤开头显示的图像相似。
步骤2重组流程流
在此步骤中,您将通过重组“卸载子流程”中的形状和活动来更改流程流。这个子流程实际上将包含一个子流程中的子流程,因此您需要为该逻辑创建组织结构。完成后,您的流程流应类似于下图:
目前,您只需重组流程流中的一些形状和活动。但在此步骤末尾,您将对“运行子流程:卸载”活动进行小修改。
要重组流程流:
- 移动卸载子流程形状,使其位于其他形状下方,并调整其大小,使其更大。
- 添加一个容器(位于显示下),并将其移动到卸载子流程内部。
- 将新形状重命名为目的地卸载子流程。
- 在属性中,使用颜色选择器将目的地卸载子流程形状的颜色更改为第二深的黄色。
-
单击卸载子流程中堆叠的活动块以选中它。单击取消链接按钮
to separate the在目的地卸载物品活动。
- 将在目的地卸载物品活动移入在目的地卸载子流程形状中。
- 右键单击在目的地卸载物品活动以打开菜单。选择编辑活动视觉效果以打开属性窗口。
- 打开背景颜色选择器,并选择浅黄色。
- 将分配标签:目的地活动重命名为分配标签:目的地编号。
- 在操作员任务形状中,单击运行子流程:卸载活动以选中它。在快速属性中的数量框中,删除当前文本并输入1。
考虑保存您的仿真模型。
步骤 3向卸载子流程添加活动
在此步骤中,您将向卸载子流程中添加一些额外的活动。这些活动最终将控制3D模型的卸载逻辑。完成后,您的流程应类似于下图:
目前,您只需将这些活动添加到流程中。您将在后续步骤中添加连接和编辑属性以添加逻辑。
要添加这些活动:
-
在卸载子流程形状,创建一个堆叠块
包含以下活动:
- A运行子流程活动(位于子流程下)
- A决策活动(位于基本下)
- 将活动重命名如下:
- 右键点击运行子流程:在目的地卸货活动以打开菜单。选择编辑活动视觉效果以打开属性窗口。
- 打开背景颜色选择器,选择浅黄色。
- 右键点击决策:还有更多物品要卸载吗?活动以打开菜单。选择编辑活动视觉效果以打开属性窗口。
- 打开背景颜色选择器,选择浅橙色。
-
在卸载子流程中,创建一个堆叠块,包含以下活动:
- 一个分配标签活动(位于基础下)
- 一个决策活动(位于基础下)
- 按如下方式重命名活动:
- 将这两个活动的颜色都改为浅橙色。
- 单击包含运行子流程:在目的地卸货的堆叠块以选中它。按Ctrl+C复制该堆叠块。按Ctrl+V粘贴复制的活动。
- 移动新复制的堆叠块,使其位于分配标签:目的地编号 +1堆叠块和完成卸货子流程活动之间。
- 添加一个等待事件活动(位于基础下)到新复制的堆叠块的开头。
- 将等待事件活动重命名为等待事件:队列有空位。
- 右键单击该分配标签:目的地编号+1活动以打开菜单。选择编辑活动外观以打开属性窗口。
- 打开背景颜色选择器,并选择浅橙色。
- 重复上一步,将其他活动的颜色也改为浅橙色(除了黄色的“运行子流程”活动)。
-
在在目的地卸载子流程形状中,靠近该形状顶部创建一个堆叠块,包含以下活动:
- 一个开始活动(位于子流程下)
- 一个行进活动(位于任务序列下)
- 按如下方式重命名这些活动:
- 在堆叠块下方添加一个决策活动(位于基础下),但保持其独立且不连接。
- 将此活动重命名为决策:是否有空间存放物品?。
- 添加另一个决定活动,将其附加到在目的地卸载物品活动,以创建一个堆叠块。
- 将此活动重命名为决定:还有更多物品要卸载吗?。
- 在最后一个堆叠块下方添加一个完成活动(位于子流程下),但保持其松散且未连接状态。
- 将此活动重命名为完成目的地卸载子流程。
- 右键单击开始:在目的地卸载活动以打开菜单。选择编辑活动视觉效果以打开属性窗口。
- 打开背景颜色选择器,选择浅黄色。
- 重复这些步骤,将目的地卸载子流程形状中的所有活动更改为浅黄色。
| 活动 | 新名称 |
|---|---|
| 运行子流程 | 运行子流程:在目的地卸货 |
| 决策 | 决策:还有更多物品要卸载吗? |
| 活动 | 新名称 |
|---|---|
| 分配标签 | 分配标签:目的地编号+1 |
| 决策 | 决策:还有更多目的地要尝试吗? |
| 活动 | 新名称 |
|---|---|
| 开始 | 开始在目的地卸载子流程 |
| 行进 | 行进至目的地 |
考虑保存您的仿真模型。
步骤 4连接活动
您会注意到,在上一步中添加了一些“决定”活动。“决定”活动的逻辑取决于正确设置活动之间的连接器。因此,您将在本步骤中致力于正确连接所有活动。需要注意的重要事项是确保按正确顺序连接活动,以便连接器排序正确。请尽力确保严格按照此顺序执行这些步骤。
完成后,您的流程应类似于下图:
要连接这些活动:
- 创建一个从分配标签:目的地编号活动出发的连接器,连接到以运行子流程:在目的地卸载活动开始的堆叠块。
- 创建一个从决定:还有更多物品需要 卸载吗?活动至分配标签: 目的地编号+1活动。
- 点击您刚刚创建的连接器以选中它。在属性面板的名称框中,输入是。
- 创建一个连接器,从决定:还有更多物品需要 卸载吗?活动指向完成卸载子 流程。
- 点击您刚刚创建的连接器以选中它。在属性面板的名称框中,输入否。
- 创建一个连接器,从决定:还有更多目的地 需要尝试吗?活动循环回到以运行子流程:在目的地卸载活动开始的堆叠块。
- 点击您刚刚创建的连接器以选中它。在属性面板的名称框中,输入是。
- 创建一个连接器,从决定:还有更多目的地 需要尝试吗?活动指向以等待事件:队列有空位活动开始的堆叠块。
- 点击您刚刚创建的连接器以选中它。在属性面板的名称框中,输入否。
- 创建一个从判断:有更多物品要卸载吗?活动出发、循环回同一堆叠块(即以等待事件:队列有空位活动开头的那个块)的连接线。
- 点击您刚刚创建的连接线以选中它。在属性面板的名称框中,输入是。
- 创建一个从判断:有更多物品要卸载吗?活动指向以完成卸载子流程活动开头的堆叠块的连接线。
- 点击您刚刚创建的连接线以选中它。在属性面板的名称框中,输入否。
- 创建一个从前往目的地活动指向判断:有任何空间容纳物品吗?活动的连接线。
- 创建一个从判断:有任何空间容纳物品吗?活动指向在目的地卸载物品活动的连接线。
- 点击您刚刚创建的连接线以选中它。在属性面板的名称在名称框中,输入
- 是。创建一个从决策:是否有空间存放物品?活动指向
- 完成:目的地子流程卸货活动的连接器。点击刚刚创建的连接器以选中它。在属性面板的名称框中,输入
- 否。创建一个从决策:是否有更多物品要卸货?活动循环返回至
- 决策:是否有空间存放物品?活动的连接器。点击刚刚创建的连接器以选中它。在属性面板的名称框中,输入
- 是。创建一个从决策:是否有更多物品要卸货?活动指向
- 完成:目的地子流程卸货活动的连接器。点击刚刚创建的连接器以选中它。在属性面板的名称框中,输入
否
。考虑保存您的仿真模型。
在这一步中,你将创建控制卸载子流程(橙色活动)中主要活动的逻辑。以下是这些活动如何运作的概述:
| 活动 | 解释 |
|---|---|
| 开始卸载子流程 | 每个子流程都需要以一个开始活动作为起点。当运行子流程活动向子流程发送子令牌时,它总是会将令牌发送到这个活动。你将使用此活动的默认设置。 |
| 分配标签:DestinationNumber | 你将更改在前一个教程中为此活动使用的先前设置。你将重命名分配给令牌的标签为DestinationNumber并为其分配初始值1。稍后你将使用这个标签来引用目的地组中的一个队列,根据它们在目的地组中出现的顺序(即它们的索引)。 |
| 运行子流程:在目的地卸载(第一个) | 此活动将创建一个子令牌并将其发送到在目的地卸载子流程。你还将在子令牌上创建一个名为Destination的标签。利用你在之前活动中创建的DestinationNumber标签,你将能够引用3D模型中目的地组的第一个队列。你将把该队列设置为第一个目的地。 |
| 决策:还有更多物品要卸载吗?(第一个) | 在目的地卸载子流程运行结束后,它将移至此活动。此活动将通过检查GroupOfItems如果仍有剩余物品,令牌将被导向下一个下游活动。若所有物品都已卸下,令牌将发送至"完成卸货子流程"活动。 |
| 分配标签:DestinationNumber+1 | 如需继续卸货,此活动将使DestinationNumber标签值递增1。请注意,该标签将指示流程应使用哪个目标组队列作为当前卸货点(通过索引号)。若操作员刚尝试过Queue1,接下来将尝试Queue2,依此类推。 |
| 判断:是否还有更多目标点可尝试? | 由于前序活动会使DestinationNumber标签值递增,需要通过此活动确保标签值不超过模型中当前可用目标点数量。该判断活动会将DestinationNumber当前值与3D模型中目标组现有队列数量进行比较。若目标编号小于或等于目标组成员数量,则意味着仍有更多可供操作员尝试卸货的目标点。若是,令牌将循环回第一个"运行子流程:在目标点卸货"活动,并在下一个目标点再次执行卸货子流程;若否,令牌将移至"等待事件:队列出现空位"活动。 |
| 等待事件:队列出现空位 | 若令牌抵达此等待事件活动,说明模型中所有队列当前均已达到最大容量。令牌将在此等待,直到有流动物品离开某个队列并腾出空间。由于需要监听队列组,需更新Destination标签以关联触发事件的特定队列。随后令牌将移至第二个"运行子流程"活动。 |
| 运行子流程:在目标点卸货(第二个) | 若令牌抵达此活动,表示某个队列已具备接收流动物品的空间。此时需要为前序活动中触发事件的目标点执行"在目标点卸货子流程"。 |
| 判断:是否还有更多待卸货物?(第二个) | 当“目的地卸载子流程”运行完毕后,将进入此活动。此活动将检查`GroupOfItems`数组中是否还有剩余待卸载的货物。若有剩余货物,令牌将循环返回“等待事件”活动;若所有货物均已卸载,则会将令牌发送至“完成卸载子流程”活动。每个子流程必须以完成活动结束。在“运行子流程”活动中的父令牌将等待,直到其所有子令牌都到达完成活动。此活动请使用默认设置。创建此逻辑的操作如下: |
| 点击`Assign Labels: DestinationNumber`活动以选中它。在`Name`框中,将文本更改为`DestinationNumber`。在`Value`框中,删除现有文本并输入`1.00`。 | 点击`Run Sub Flow: Unload at Destination`活动以选中它。点击该活动旁边的感叹号按钮进入采样模式。点击`Start Unload at Destination Sub Flow`活动进行采样。 |
在属性面板的`Assign Labels to Children`组中,点击`Add`按钮添加标签。在`Name`框中输入`Destination`。在`Value`框中输入`Group("Destinations")[token.DestinationNumber]`。
- 点击`Decide: More Items to Unload?`活动以选中它。在属性面板中,点击`Send Token To`框旁的箭头打开菜单。选择`Conditional Decide`以打开属性窗口。在`Condition`框中,删除当前文本并输入`token.GroupOfItems.length > 0`。再次跳过部分步骤,对第二个`Decide: More Items to Unload?`活动重复相同的操作,使其属性保持一致。点击`Assign Labels: DestinationaNumber+1`活动以选中它。在属性面板中,点击`Add`按钮添加标签。点击`Name`框旁的箭头打开菜单。指向`Token Label`,然后选择`DestinationNumber`。点击`Value`框旁的箭头。Namebox, change the text toDestinationNumber.
- In theValuebox, delete the existing text and type1.00.
-
Click theRun Sub Flow: Unload at Destinationactivity
to select it. Click the Exclamation Point button
next to this activity to enter
sampling mode.
- Click theStart Unload at Destination Sub Flowactivity to sample it.
-
In Properties under theAssign Labels to Childrengroup, click theAddbutton
to add a label.
- In theNamebox, typeDestination.
- In theValuebox, typeGroup("Destinations")[token.DestinationNumber].
- Click theDecide: More Items to Unload?activity to select it. In Properties, click the arrow next to theSend Token Tobox to open a menu. SelectConditional Decideto open a properties window.
- In theConditionbox, delete the current text and typetoken.GroupOfItems.length > 0.
- Skipping ahead again, repeat these same steps for the secondDecide: More Items to Unload?activity so that their properties are identical.
-
Click theAssign Labels: DestinationaNumber+1activity
to select it. In Properties, click theAddbutton
to add a label.
- Click the arrow next to theNamebox to open a menu. Point toToken Label, then selectDestinationNumber.
- Click the arrow next to theValue打开菜单。 选择递增标签以打开属性窗口。 您将使用默认值1,因此只需在窗口外点击即可。
- 点击决定:尝试更多目的地?活动以 选择它。在属性中,点击发送 令牌至框旁的箭头以打开菜单。选择条件 决定以打开属性窗口。
- 在条件框中,删除当前文本并输入token.DestinationNumber <= Group("Destinations").length。
- 点击等待事件:队列有空位以选择 它。在属性中,点击对象框旁的箭头以打开菜单。指向组,然后选择目的地。
-
在事件框旁,点击采样器按钮
以进入采样模式。
- 在3D模型中,点击任意一个队列对象以 打开菜单。选择退出时.
- 点击分配事件对象至框 旁边的箭头以打开菜单。将鼠标指向令牌标签,然后选择目的地。
-
点击运行子流程:在目的地卸载活动
以选中它。点击此活动旁边的感叹号按钮
以进入
采样模式。
- 点击启动在目的地卸载子流程活动 对其进行采样。
请考虑保存您的仿真模型。
步骤 6编辑在目的地卸载子流程的逻辑
在这一步中,您将创建用于控制在目的地卸载子流程(黄色活动)中活动的逻辑。以下是对这些活动运行方式的概述:
| 活动 | 说明 |
|---|---|
| 启动在目的地卸载子流程 | 每个子流程都需要以一个启动活动开始。当运行子流程活动将子令牌发送到子流程时,它总是会发送到这个活动。您将使用此活动的默认设置。 |
| 前往目的地 | 此活动将指示操作员前往3D模型中的某个目的地队列。您将使用目的地标签(该标签是在创建此子令牌的运行子流程活动上创建的)来确定哪个队列是当前目的地。 |
| 决策:是否有物品空间? | 此活动将确定当前目的地是否已达到其最大容量。如果尚未达到最大容量,令牌将被发送到在目的地卸载物品活动。如果队列已满,令牌将被发送到结束在目的地卸载子流程活动。 |
| 在目的地卸载物品 | 当每个子令牌到达此活动时,它将告诉操作员要卸载哪些流程物品以及将其装载到哪个位置。您将使用操作员标签来指示应由哪个操作员执行此任务,并使用我的物品标签(位于每个子令牌上)来告诉操作员应从主队列装载哪些物品。目的地你在上一个活动中设置的标签 将指示操作员在3D模型中卸载Queue1的物品。 |
| 决定:是否还有更多物品需要卸载? | 当操作员完成卸载一个流动物品后,它将移动到该 活动。此活动将检查是否还有其他物品需要 卸载,通过查看GroupOfItems数组中是否还有剩余的物品。如果还有物品剩余,令牌将被路由 到下一个下游活动。如果所有物品都已卸载,它将发送 令牌到“在目标子流中完成卸载”活动。 |
| 在目标子流中完成卸载 | 每个子流都需要以一个完成活动结束。“运行子流”活动上的父令牌 将在该活动中等待,直到其所有子令牌都已 到达完成活动。你将对此活动使用默认设置。 |
要创建此逻辑:
- 点击前往目的地活动以将其选中。 在属性中,点击执行器/任务 序列框旁的箭头以打开菜单。指向令牌标签, 然后选择操作员.
- 点击目的地框旁边的箭头以打开菜单。指向令牌标签,然后选择目的地。
- 点击决定:物品是否有空间?活动以选中它。在属性中,点击发送令牌至框旁边的箭头,并选择条件决定以打开属性窗口。
- 在条件框中,输入token.Destination.subnodes.length < getvarnum(token.Destination, "maxcontent")。
- 点击在目的地卸载物品活动以 选中它。在属性中,在物品框中,输入token.GroupOfItems.pop()。
- 点击决策:还有更多物品要卸载吗?活动以 选中它。在属性中,点击发送令牌至 旁边的箭头框并选择条件判断以打开 属性窗口。
- 在条件框中,输入token.GroupOfItems.length。
考虑保存您的仿真模型。
步骤 7运行仿真模型
重置并运行模型:
观察时,操作员将开始在第一个队列处放置物品。当第一个队列达到其最大容量2个流动物品时,操作员将移动到第二个队列。如果第二个队列已达到其最大容量1,那么操作员将移动到第三个队列。
如果您的模型行为不完全如此,请检查您的属性设置,确保您没有意外跳过关键步骤。通常,您可以通过检查错误发生时哪个活动持有令牌,来找出是哪个活动导致了问题。
结论
教程 3 至此结束。在本教程中,您构建了一个具有相当复杂运输逻辑的模型。希望您能看到,通过掌握一点 FlexScript 知识和使用条件判断活动的逻辑,您可以为任何需要模拟的业务系统构建出相当稳健的仿真模型。
返回任务逻辑教程:Tutorial 3 - FlexSim高级教程目录


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