question

Mitesh Dama avatar image
0 Likes"
Mitesh Dama asked Felix Möhlmann commented

Task sequence/ process flow for transporter in 3D model

I want to create a custom task sequence in 3D model for transporters(dispatcher) with process flow.

What is the process/ goal - To run experimenter/ optimization model to calculate number of forklifts needed.

What is the process -

1. Transporter pick 2 pallets from Que.

2. Drop to buffer - 2 pallets at at a time

3. From same place, pick two empties if available

4. Drop back to Que - 2 empty pallet at a time

Is there a way where I can create a process flow just for this operation of transporters? Any model depicting this process will be really helpful (using FlexSim 22.0.5)


FlexSim 22.0.5
processflowexperimenterdispatcherstrasnporter
5 |100000

Up to 12 attachments (including images) can be used with a maximum of 23.8 MiB each and 47.7 MiB total.

Felix Möhlmann avatar image
0 Likes"
Felix Möhlmann answered Felix Möhlmann commented

Here you go.

PalletTransport_fm.fsm

The queues push the items on a global list (one for each queue), partitioned by the pallet status (Full/purple or Empty/orange).

The tokens in the process flow represent the transporters. First they drive to Queue1, pull to full pallets and bring them to Queue2. Then they try to pull two empty pallets. If successful, they load those and bring them to Queue1. Otherwise they return to Queue1 empty.

The loading and unloading is handled in subflows, so the number items transported at once can easily be changed by adjusting the required number of pulls in the "Pull from List" activities.

The Process Flow Source is set up to create one token for each object in the "Transporters" group and assign the respective object to the label "Transport".

1665499900290.png

The second part of the process flow cycles the status of the pallets to keep the model running indefinitely.


· 4
5 |100000

Up to 12 attachments (including images) can be used with a maximum of 23.8 MiB each and 47.7 MiB total.

Mitesh Dama avatar image Mitesh Dama commented ·

Really liked the solution. Can you explain a bit more about Process flow source?

1. How did you set up the quantity in table?

2. What is meaning of - Group("Transporters").length?

3. What does token index do here? - Group("Transporters")[tokenIndex]

0 Likes 0 ·
Felix Möhlmann avatar image Felix Möhlmann Mitesh Dama commented ·

1./2. Instead of writing a fixed number as the token quantity I used the expression you mention. Group("Transporters") gives a reference to the group to which I added the Transporter (see Toolbox). "length" then returns the number of objects within that group. So if you were to add more transporters to the group, the source would automatically scale up the quantity and create one token per object in the group.

3. To have each token represent a different member of the group, each one is assigned a member by its rank in the group. Group("Transporters")[2] would for example return a reference to the second object in the group, that is then assigned to the label. If more than one token is created by a single row in the Schedule Source, the parameter tokenIndex can be used to determine the position of a token within that quantity. The first created token would have an index of 1, the second of 2 and so on. So by combining the expressions together each token is assigned the corresponding member of the "Transporters" group as a label.

creationRank in the Run Sub Flow activities functions similarly to tokenIndex. Because the token pulls more than one item, the label they are assigned to will be an array of values. By using creationRank, each Sub Flow Token is assigned one of the values (items) from the array. These single values are then used in the Load and Unload activities.

0 Likes 0 ·
ged0313 avatar image ged0313 commented ·

@Felix Möhlmann

Hello,

I’ve encounter some problem when building up process flow and setting up the destination. My layout is that I have several processors as destination of the destination. So I assign label to the group of processors as below:

Group("Processors")[duniform(1, Group("Processors").length, getstream(activity))]direct

But I found some problem that it will only get the processors randomly. So I am wondering if there’s a way to record or fetch the backorder of list that I can set the value of assign label to backorder?

0 Likes 0 ·
Felix Möhlmann avatar image Felix Möhlmann ged0313 commented ·

The purpose of that expression is to acquire a random processor. If you want to acquire a specific processor, you can refer to it in the query field through a label on the token.

Apparently you and @kkkk are either the same person or at least work on the same assignment. I will provide some additional information on this post.

0 Likes 0 ·
Mitesh Dama avatar image
0 Likes"
Mitesh Dama answered Felix Möhlmann commented

Thanks for the clarification. Here is my model that I want to simulate -

Fleet 1 -

1. load 2 full box from Queue14

2. unload in 6 conveyors according to the type (Group - Flowrack in)

3. if empty pallet available at Queue E1, E2, E3, E4 (Group - E Flowrack out)- load 2 empty

4. unload two empties in Queue 15

5. Repeat this cycle from Step-1


Fleet 2 is similar to Fleet 1 -

1. Load 1 full from Group Flowrack out

2. Unload at Straight conv 1

3. If empty available at Queue3, load empty

4. Travel back and drop empty at straight conv 25, 26, 27 ,28


I am getting few errors right now - Can you help here?

Manual Process_Forklifts_10.fsm


· 7
5 |100000

Up to 12 attachments (including images) can be used with a maximum of 23.8 MiB each and 47.7 MiB total.

Felix Möhlmann avatar image Felix Möhlmann commented ·

- Check you label references: You are assigning pulled items to "token.Pulled" in one Pull from List activity instead of "token.box". And you are using "token.box" in the Load and Unload activties when the reference to the individual items is given as "token.item" (see labels created in the sub flows) at that point.

- You can't refer to a whole group of objects as a destination. It has to be a single object. To choose a random member of the group, youi can use the following, for example.
("Group(...)[n]" accesses the n-th member of the group, instead of a fixed number, the expression uses a distribution to return a number between 1 and the number of objects in the group)

Group("Flowrack in")[duniform(1, Group("Flowrack in").length, getstream(activity))]

- You also can't use conveyors as unload destination directly. Use the Entry Transfers instead.

manual-process-forklifts-11.fsm

0 Likes 0 ·
Mitesh Dama avatar image Mitesh Dama Felix Möhlmann commented ·

After simulating fleet 2 AGVs, the simulation runs without error now. Few things that I am struggling to do -

1. Fleet 1 and Fleet 2-

According to the list and orders, the Forklifts picks the full and empty pallet in sequence generated in the list. I want to modify the process further. No matter what sequence is generated in list, the forklift should never return empty to home position if there are empty pallets - See pic attached,

1666818868216.jpeg

2. I want to run an experimenter and optimizer to check the number of forklifts needed in fleet 1 and fleet 2 separately to do 110 boxes supply and 110 empty boxes return.

Can you please help?

Manual Process_Forklifts_11.fsm

Thanks in advance!

0 Likes 0 ·
Felix Möhlmann avatar image Felix Möhlmann Mitesh Dama commented ·

The screenshot and model didn't upload correctly, could you try again?

2. When you put the forklifts into groups you can use the "Delete and Copy Group Members" option in the parameter table (use the sampling tool on the group to see the option)

1666869851743.png

0 Likes 0 ·
1666869851743.png (34.4 KiB)
Show more comments