In this tutorial task, you'll learn how to create tasks that can change based on varying
conditions during a model run. You'll add some constraints to the simulation model that will
create these varying conditions. To start, you'll add two additional unloading destinations,
for a total of three. Then, you'll add some restrictions to the number of flow items that
these queues can accept at a given time by changing their maximum capacity. These
limitations will create conditions in which an operator might not be able to unload all the
items at a single destination and will have to evaluate whether the queues have room to
accept flow items.
You'll create this logic by building a nested sub flow (a sub flow within a sub flow)
that uses Decide activities to make decisions dynamically during a simulation run based on
whether the destinations have reached their full capacity or not.
When you're finished, your simulation model will operate similar to the following
image:
Groups Can Also Act as Arrays
In the previous tutorial, you learned that arrays are data structures that can
contain more than one value if needed. To review, you also learned that each element in that
array is usually identified by an index, which is a number that indicates the
position of the value in the array. In the previous tutorial you created a label that
contained an array called GroupOfItems that contained 2-5 flow items that were
pulled from the ItemsToTransport list.
But labels aren't the only thing that can contain arrays. 3D object groups actually store
information about their members as arrays. Just like you can reference individual flow items
in the GroupOfItems array by their index, you can also refer to specific members of
a 3D object group by their index. A group member's index is based on the order in which it
appears in the group.
For example, in the first step in this tutorial, you'll add two additional queues to the
3D model. Then, you'll add these queues to the Destinations group you created in the
previous tutorial:
In this example, the Destinations group has an array that contains three queues. Each
queue occupies a position between 1-3 in the array, which is its index.
If you want to reference one of the queues in the array, you will need to use its
specific index. Using the example in the preceding image, the FlexScript expression
Group("Destinations")[2] would return a reference to Queue2 in the
Destination2 plane. The expression Group("Destinations")[3] would return a
reference to Queue3 in the Destination3 plane.
Recall that the expression .length will return a value that indicates how
many elements are in a specific array. In this same way, the expression
Group("Destinations").length would return a value of 3 because there are 3
members in the Destinations group.
Step 1 Modify the 3D Model
In this step, you'll add two additional destinations to the 3D model. Then, you'll add
some constraints to your model by restricting how many flow items each queue can hold at a
given time. When you're finished, your model will look similar to the following image:
To make these changes:
Click the Destination1 plane in the 3D model to select
it. (It's the orange one.)
Press Ctrl+C to copy the plane and all the objects on it. Click somewhere blank in
the model to de-select the original plane. Press Ctrl+V to copy the plane.
Repeat this step to add a third plane.
With the second copied plane selected, in Quick Properties, change the name of the
plane to Destination2.
Rename each of the 3D objects on the second copied plane so that they all end in a
2, such as Queue2, Processor2, and Sink2.
Repeat these steps to change the name of the third copied plane to
Destination3 and renaming all the objects on the plane so that they end in
3.
Click Queue1 to select it. In Quick Properties in the
Queue tab, in the Max Content
box, type 2. Click the OK button to save the
changes and close the properties window.
Repeat this step for Queue2, changing its
Max Content to 1.
Repeat this step for Queue3, changing its
Max Content to 3.
When you copied the two planes, FlexSim should have automatically added
Queue2 and Queue3 to the
Destinations group. To confirm this, open the Toolbox in
the left pane. Double-click the Destinations group to open
its properties window. Confirm that the two new queues are in this group.
Close all of the group windows.
Check to ensure your model looks similar to the image shown at the beginning of this
step.
Step 2 Reorganize the Process Flow
In this step, you'll change the process flow by reorganizing the shapes and activities in
the Unloading Sub Flow. This sub flow is actually going to contain a sub flow within a sub
flow, so you'll create the organization for that logic. When you're finished, your process
flow should look similar to the following image:
For now, you'll merely reorganize some of the shapes and activities in the process flow.
But you will make a small change to the Run Sub Flow: Unloading activity at the end of this
step.
To reorganize the process flow:
Move the Unloading Sub Flow shape so that it is below
the other shapes and resize it so that it is much larger.
Add a Shape (under
Flowchart) and move it so that it is inside the
Unloading Sub Flow.
Rename the new shape Unload at Destination Sub Flow.
In Quick Properties, use the color selector to change the color of the
Unload at Destination Sub Flow shape to the second darkest
yellow.
Click the stacked block of activities in the Unloading Sub
Flow to select it. Click the Unlink buttons
to separate the
Unload Items at Destination activity.
Move the Unload Items at Destination activity into the
Unload at Destination Sub Flow shape.
Right-click the Unload Items at Destination activity to
open a menu. Select Edit Activity Visuals to open a
properties window.
Open the Background Color selector and choose the light
yellow color.
Rename the Assign Labels: Destination activity as
Assign Labels: DestinationNumber.
In the Operator Tasks shape, click the
Run Sub Flow: Unloading activity to select it. In Quick
Properties in the Quantity box, delete the current text and
type 1.
Consider saving your simulation model.
Step 3 Add Activities to the Unloading Sub Flow
In this step, you'll add some additional activities to the Unloading Sub Flow process
flow. These activities will eventually control unloading logic for the 3D model. When you're
finished, your process flow should look similar to the following image:
For now, you'll merely add these activities to the process flow. You'll add connections
and edit the properties to add the logic in a later step.
To add these activities:
In the Unloading Sub Flow shape, create a stacked block
with the following activities:
A Run Sub Flow activity (under
Sub Flow)
A Decide activity (under
Basic)
Rename the activities as follows:
Activity
New Name
Run Sub Flow
Run Sub Flow: Unload at Destination
Decide
Decide: More Items to Unload?
Right-click the Run Sub Flow: Unload at Destination
activity to open a menu. Select Edit Activity Visuals to
open a properties window.
Open the Background Color selector and choose the light
yellow color.
Right-click the Decide: More Items to Unload? activity
to open a menu. Select Edit Activity Visuals to open a
properties window.
Open the Background Color selector and choose the light
orange color.
In the Unloading Sub Flow create a stacked block with
the following activities:
An Assign Labels activity (under
Basic)
A Decide activity (under
Basic)
Rename the activities as follows:
Activity
New Name
Assign Labels
Assign Labels: DestinationNumber+1
Decide
Decide: More Destinations to Try?
Change the color of both these activities to light orange.
Click the stacked block with the Run Sub Flow: Unload at
Destination to select it. Press Ctrl+C to copy the stacked. Press Ctrl+V to
copy the activities.
Move the newly copied stacked block so that it is between the
Assign Labels: DestinationNumber +1 stacked block and the
Finish Unloading Sub Flow activity.
Add a Wait for Event activity (under
Basic) to the beginning of the newly copied stacked
block.
Rename the Wait for Event activity as Wait for
Event: A Queue Has Space.
Right-click the Assign Labels: DestinationNumber+1
activity to open a menu. Select Edit Activity Visuals to
open a properties window.
Open the Background Color selector and choose the light
orange color.
Repeat the previous step to change the color of the rest of the activities to light
orange (except for the yellow Run Sub Flow activities).
In the Unload at Destination Sub Flow shape, create a
stacked block with the following activities near the top of the shape:
A Start activity (under
Sub Flow)
A Travel activity (under
Task Sequences)
Rename the activities as follows:
Activity
New Name
Start
Start Unload at Destination Sub Flow
Travel
Travel to Destination
Add a Decide activity (under
Basic) under the stacked block, but leave it loose and
unconnected.
Rename this activity Decide: Any Space for Items?.
Add another Decide activity, appending it to the
Unload Items at Destination activity to create a stacked
block.
Rename this activity Decide: More Items to Unload?.
Add a Finish activity (under Sub
Flow) under the last stacked block, but leave it loose and unconnected.
Rename this activity Finish Unload at Destination Sub Flow.
Right-click the Start: Unload at Destination activity
to open a menu. Select Edit Activity Visuals to open a
properties window.
Open the Background Color selector and choose the light
yellow color.
Repeat these steps to change all the activities in the Unload at
Destination Sub Flow shape to a light yellow color.
Consider saving your simulation model.
Step 4 Connect the Activities
You'll notice that in the previous step you added some Decide activities. The logic of
Decide activities depends on setting up the connectors between your activities correctly.
For that reason, you'll work on connecting all the activities correctly in this step. The
important thing to pay attention to is making sure you connect the activities in the right
order so that the connector rankings are correct. Do your best to ensure that you follow
these steps in this exact order.
When you're finished, your process flow should look similar to the following image:
To connect these activities:
Create a connector going out from the Assign Labels:
DesinationNumber activity to the stacked block starting with the
RunSub Flow: Unload at Destination activity.
Create a connector going out from the Decide: More Items to
Unload? activity to the Assign Labels:
DesinationNumber+1 activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type Yes.
Create a connector going out from the Decide: More Items to
Unload? activity to the Finish Unloading Sub
Flow.
Click the connector you just created to select it. In Quick Properties in the
Name box, type No.
Create a connector going out from the Decide: More Destinations
to Try? activity looping back to the stacked block starting with the
Run Sub Flow: Unload at Destination activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type Yes.
Create a connector going out from the Decide: More Destinations
to Try? activity to the stacked block starting with the
Wait for Event: A Queue Has Space activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type No.
Create a connector going out from the Decide: More Items to
Unload? activity looping back to the beginning of the that same stacked block,
the one starting with the Wait for Event: A Queue Has Space
activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type Yes.
Create a connector going out from the Decide: More Items to
Unload? activity to the stacked block starting with the
Finish Unloading Sub Flow activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type No.
Create a connector going out from the Travel to
Destination activity to the Decide: Any Space for
Items? activity.
Create a connector going out from the Decide: Any Space for
Items? activity to the Unload Items at Destination
activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type Yes.
Create a connector going out from the Decide: Any Space for
Items? activity to the Finish: Unload at Destination Sub
Flow activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type No.
Create a connector going out from the Decide: More Items to
Unload? activity looping back to the Decide: Any Space for
Items? activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type Yes.
Create a connector going out from the Decide: More Items to
Unload? activity to the Finish: Unload at Destination Sub
Flow activity.
Click the connector you just created to select it. In Quick Properties in the
Name box, type No.
Consider saving your simulation model.
Step 5 Edit the Main Unloading Sub Flow Logic
In this step, you'll create the logic that will control the main activities in the
unloading sub flow (the orange activities). The following is an overview of how the
activities will function:
Activity
Explanation
Start Unloading Sub Flow
Every sub flow needs to begin with a Start activity. When the Run Sub Flow
activity sends child tokens to a sub flow, it will always send them to this
activity. You'll use the default settings for this activity.
Assign Labels: DestinationNumber
You'll change the previous settings you used for this activity in the previous
tutorial. You'll rename the label that is assigned to tokens to
DestinationNumber and assign it an initial value of 1. You'll use this
label later to refer to one of the queues in the Destinations group by the order in
which they appear in the Destinations group (their index).
Run Sub Flow: Unload at Destination (first one)
This activity will create one child token and send it to the Unload at
Destination Sub Flow. You'll also create a label on the child token called
Destination. Using the DestinationNumber label you created in the
previous activity, you'll be able to reference the first queue in the Destinations
group in the 3D model. You'll set that queue as the first destination.
Decide: More Items to Unload? (first one)
After the Unload at Destination Sub Flow finishes running, it will move to this
activity. This activity will check to see if there are any other items that need to
be unloaded by seeing if there are any items left to unload in the
GroupOfItems array. If there are items left over, the token will be routed
to the next downstream activity. If all the items have been unloaded, it will send
the token to the Finish Unloading Sub Flow activity.
Assign Labels: DestinationNumber+1
If there are more items to unload, this activity will increase the
DestinationNumber label by one. Recall that this label will tell the
process flow which queue in the Destination group is the current destination that
the operator should attempt to unload items at (using its index number). If the
operator just tried Queue1, it will try Queue2, and so forth.
Decide: More Destinations to Try?
Since the previous activity will increase the DestinationNumber label
by one, you'll need this activity to make sure that this label doesn't increase
beyond the number of Destinations that are currently available in the model. This
Decide activity will compare the current value of the DestinationNumber
value against the number of queues that are currently in the Destinations group in
the 3D model. If the destination is less than or equal to the number of members in
the Destinations group, that will mean there are still more destinations at which
the operator can attempt to unload items. If so, the token will be looped back to
the first Run Sub Flow: Unload at Destination activity and the unloading sub flow
will run again at the next destination. If not, the token will move to the Wait for
Event: A Queue Has Space activity.
Wait for Event: A Queue Has Space
If a token reaches this Wait for Event activity, it's because all of the queues
in the model were currently at their maximum capacity. The token will wait here
until a flow item exits one of the queues and clears up space for that flow item.
Since you'll be listening to a group of queues, you'll update the
Destination label so that it will have a reference to the specific queue
that triggered the event. Then, the token will move to the second Run Sub Flow
activity.
Run Sub Flow: Unload at Destination (second one)
If a token reaches this activity, it means that one of the queues now has space
to receive a flow item. It will then need to run the Unload at Destination Sub Flow
for the Destination that triggered the event in the previous activity.
Decide: More Items to Unload? (second one)
After the Unload at Destination Sub Flow finished running, it will move to this
activity. This activity will check to see if there are any other items that need to
be unloaded by seeing if there are any items left to unload in the
GroupOfItems array. If there are items left over, the token will be looped
back to the Wait for Event activity. If all the items have been unloaded, it will
send the token to the Finish Unloading Sub Flow activity.
Finish Unloading Sub Flow
Every sub flow needs to end with a Finish activity. The parent token on the Run
Sub Flow activity will wait at that activity until all of its child tokens have
reached the Finish activity. You'll use the default settings for this activity.
To create this logic:
Click the Assign Labels: DestinationNumber activity to
select it. In the Name box, change the text to
DestinationNumber.
In the Value box, delete the existing text and type
1.00.
Click the Run Sub Flow: Unload at Destination activity
to select it. Click the Exclamation Point button
next to this activity to enter
sampling mode.
Click the Start Unload at Destination Sub Flow activity
to sample it.
In Quick Properties under the Assign Labels to Children
group, click the Add button
to add a label.
In the Name box, type Destination.
In the Value box, type
Group("Destinations")[token.DestinationNumber].
Click the Decide: More Items to Unload? activity to
select it. In Quick Properties, click the arrow next to the Send
Token To box to open a menu. Select Conditional
Decide to open a properties window.
In the Condition box, delete the current text and type
token.GroupOfItems.length > 0.
Skipping ahead again, repeat these same steps for the second
Decide: More Items to Unload? activity so that their
properties are identical.
Click the Assign Labels: DestinationaNumber+1 activity
to select it. In Quick Properties, click the Add button
to add a label.
Click the arrow next to the Name box to open a menu.
Point to Token Label, then select
DestinationNumber.
Click the arrow next to the Value box to open a menu.
Select Increment Label to open up a properties window.
You'll use the default value of 1 so just click outside of the
window.
Click the Decide: More Destinations to Try? activity to
select it. In Quick Properties, click the arrow next to the Send
Token To box to open a menu. Select Conditional
Decide to open a properties window.
In the Condition box, delete the current text and type
token.DestinationNumber <= Group("Destinations").length.
Click the Wait for Event: A Queue Has Space to select
it. In Quick Properties, click the arrow next to the Object
box to open a menu. Point to Group, then select
Destinations.
Next to the Event box, click the
Sampler button
to enter sampling mode.
In the 3D model, click any one of the Queue objects to
open a menu. Select On Exit.
Click the arrow next to the Assign Event Object To box
to open a menu. Point to Token Label, then select
Destination.
Click the Run Sub Flow: Unload at Destination activity
to select it. Click the Exclamation Point button
next to this activity to enter
sampling mode.
Click the Start Unload at Destination Sub Flow activity
to sample it.
Consider saving your simulation model.
Step 6 Edit the Unload at Destination Sub Flow Logic
In this step, you'll create the logic that will control the activities in the Unload at
Destination Sub Flow (the yellow activities). The following is an overview of how the
activities will function:
Activity
Explanation
Start Unload at Destination Sub Flow
Every sub flow needs to begin with a Start activity. When the Run Sub Flow
activity sends child tokens to a sub flow, it will always send them to this
activity. You'll use the default settings for this activity.
Travel to Destination
This activity will tell the operator to travel to the one of the destination
queues in the 3D model. You'll use the Destination label that was created
on the Run Sub Flow activity that created this child token to determine which queue
is the current destination.
Decide: Any Space for Items?
This activity will determine whether the current destination has reached its
maximum capacity or not. If it has not reached its maximum capacity, then the token
will be sent to the Unload Items at Destination activity. If the queue is full, the
token will be sent to the Finish Unload at Destination Sub Flow activity.
Unload Items at Destination
When each child token reaches this activity, it will tell the operator which
flow items to unload and which location to load them at. You'll use the
Operator label to indicate which operator should perform this task and
you'll use the MyItem label on each child token to tell the operator which
items it should load from the MainQueue. The Destination label that you set
in the previous activity will tell the operator to unload the items at Queue1 in the
3D model.
Decide: More Items to Unload?
After the operator has finished unloading one flow item, it will move to this
activity. This activity will check to see if there are any other items that need to
be unloaded by seeing if there are any items left to unload in the
GroupOfItems array. If there are items left over, the token will be routed
to the next downstream activity. If all the items have been unloaded, it will send
the token to the Finish Unload at Destination Sub Flow activity.
Finish Unload at Destination Sub Flow
Every sub flow needs to end with a Finish activity. The parent token on the Run
Sub Flow activity will wait at that activity until all of its child tokens have
reached the Finish activity. You'll use the default settings for this activity.
To create this logic:
Click the Travel to Destination activity to select it.
In Quick Properties, click the arrow next to the Executer / Task
Sequence box to open a menu. Point to Token Label,
then select Operator.
Click the arrow next to the Destination box to open a
menu. Point to Token Label, then select
Destination.
Click the Decide: Any Space for Items? activity to
select it. In Quick Properties, click the arrow next to the Send
Token To box and select Conditional Decide to open
a properties window.
In the Condition box, type
token.Destination.subnodes.length < getvarnum(token.Destination,
"maxcontent").
Click the Unload Items at Destination activity to
select it. In Quick Properties, in the Item box, type
token.GroupOfItems.pop().
Click the Decide: More Items to Unload? activity to
select it. In Quick Properties, click the arrow next to the Send
Token To box and select Conditional Decide to open
a properties window.
In the Condition box, type
token.GroupOfItems.length.
Consider saving your simulation model.
Step 7 Run the Simulation Model
Reset and run the model:
As you watch, the operator will start dropping off items at the first queue. When the
first queue reaches its maximum capacity of 2 flow items, the operator will move on to the
second queue. If the second queue has reached its maximum capacity of 1, then the operator
will move to the third queue.
If your model isn't behaving exactly this way, check your properties to make sure you
didn't accidentally skip a crucial step. Generally you can figure out which activity is
causing problems by checking which activity has tokens at the time an error occurs.
Conclusion
This concludes Tutorial 3. In this tutorial, you built a model with some fairly complex
transportation logic. Hopefully you can see how with a little bit of knowledge of FlexScript
and some conditional logic using Decide activities, you can make some pretty robust
simulation models for any kind of business system you need to simulate.