Has anyone tried create simulation of system AutoStore or some shuttle in FlexSim?
I'm not aware of one yet. Though I'm sure it could be done, either with a flat horizontal rack, or a matrix of queues, and then using some sort of AGV or Network Node logic to control how and where the machines could travel.
For clarification to the community. Here is a video of AutoStore:
I know this is a very old post but if people look for Autostore, the German FlexSim distributor has made an Automated Storage model. It is not called Autostore but everybody can see that it acts as one.
@steven.hamoen do you by any chance know if there a description of operation available for this model?
@Amit Kulkarni , what exactly do you want to know about it? We´ve created the model.
Hi @Amit Kulkarni, attached you find the model. AutomatedStorage_FlexSim20202_FM_0_2_0.fsm
The model is driven to a large extent by self-written code. If you are not familiar with Flexscript/Basic programming it will be hard to follow and replicate how the model functions. (The model was build as a concept; there are sadly no comments in the code)
The creation of the storage happens in the reset trigger on the "AutoStoreMainNode" object. It copies the base cell which is hidden in negative-z-space and populates the bundle labels on the object which serve as lookup/reference for storage cells, ports and stored boxes.
The rest of the logic happens in the "AutoStore" process flow. Custom code blocks will locate free cells to store a new box into or find in what spot a requested box is stored. The "robots" travel by using basic travel activities, the boxes are lowered and raised using kinematics.
An important thing to note is that the cell coordinates are saved as one number, the "RowColSum", where the row number is multiplied by 100 and the column added to that number. This identification method obviously only works up to a size of 99x99 cells.
A basic description of how to control the model can be found in the attached pdf-document.
AutomatedStorage concept model overview.pdf
It is a very early concept state, to bring you in the position to go on.
Since we do simulation projects, there is also a finished version, but I´m not allowed to share it.
@sebastian.hemmann Thank you so much for this! Your model is a perfect start point for me. Is it okay if I send any questions your way during my model development?
Many thanks!
Amit
@Amit Kulkarni don´t hesitate to ask. But I can´t promise how detailed/ fast me or our team can answer these days.
could you please tell me how to adjust the number of robots and bins in your model?
To change the number of totes you need to change the process flow Label "BoxQuantity" in the FillStorage/ReequestExample process flow. The model uses that label to create the totes at the beginning of the model.
Thanks for helping out with your comment @Jacob W2!
To change the number of robots you can actually just change the respective label on the storage object (the grey box at one corner). Then also set the "FirstReset" label to 1. This causes the storage to generate again according to the current settings on the labels and in the layout table. The number of robots should also be adjusted by doing this.
Then hit reset again before runnning the model, so the new storage and robots are set up properly in the background.
Moving the totes back into the same stack they were taken from is currently not supported (though it can of course happen by coincidence).
You could alter the way the logic in the Entry section of the AutoStore flow looks for a slot. The AutoStore_FindSlot user command lets you pass in a slot as the second parameter and will then return the nearest available slot (which will be the slot itself if it is available). So you could store the slot of the requested item in a label on said item (the slot would have to be read from the Boxes bundle label before it is removed from storage) and if that label is present on the item, adjust the logic so it passes this into the command to find a slot.
Essentially look at how the 'digging' logic to move totes out of the way and then move them back ('clean up') works and implement that or a similar system for requests/entries.
sorry but I can't understand exactly about your words "move the item back into the same port in the FillStorage/RequestExample flow".Could you please be more specific?
The activities marked in red determine which input/universal port is used to put the item back into storage (random at the moment) and then move the item into it which triggers the robots to put it into the storage.
If you use the same universal here that was used as the output (and mark the Preserve Global Position option in the activity marked in green it should look like as though the item never left the port.
@Felix Möhlmann @Sebastian Hemmann is it possible to start the model with a specific number of empty bins inside the autostore? My autostore is huge and has approximately 90,000 bins in it.
And secondly, how can I modify the movement of robot in travel activity in process flow so it doesn't travel on the gaps where the column doesn't exist?
You should be able to create a number of items per slot when the model starts by mimicking what the process flow does when it moves an item into the storage (create an item in code, position it accordingly and adjust the bundle labels).
It could look something like the code below. This assumes it is run from the autostore process flow, so that "current" points to the AutoStoreMainNode object. It uses the standard "Box" object. Having 90k objects in the model will make it run slow regardless, but using a simpler shape might still be better than using the "Tote".
treenode slotBundle = current.labels["Slots"]; treenode boxBundle = current.labels["Boxes"]; treenode boxItem = Model.find("/Tools/FlowItemBin/Box/Box"); int idCount = 1; int numRows = getbundlenrentries(slotBundle); for(int i = 0; i < numRows; i++) { int row = getbundlevalue(slotBundle, i, 0); int col = getbundlevalue(slotBundle, i, 1); int rowcol = getbundlevalue(slotBundle, i, 2); for(int j = 1; j <= 5; j++) { // Create a new box Object box = createcopy(boxItem, model()); box.ID = idCount; idCount++; // Adjust the position (would have to calculate from the row and column values) // ... // Adjust slot bundle and create entry in boxes bundle setbundlevalue(slotBundle, i, "FillLevel", j); addbundleentry(boxBundle, row, col, rowcol, j, box.ID, box, 0); } }
Since the A* grid can have rectangular cells since *some versiona ago*, you could try upgrading the model to a current version of FlexSim (if you haven't already) and use the A* navigator with barriers set up in the gaps.
@Sebastian Hemmann I went through your model and it's exactly what I was looking for to get started on a project. I have a question though. I am looking to go beyond 99x99 cells. Where all in the model should I make those changes for it to work, so it doesn't throw any errors. Thanks!
In a lot of places unfortunately. Since the model was only a proff-of-concept we didn't build it to be very flexible. Whenever you see the number "100" in conjunction with "row" or "TargetSlot[1]" in the code of a process flow activity, the reset trigger of the MainNode object or the FindSlot usercommand, it has to be replaced/increased.
I think I got all occurences in the attached model, but no guarantees. (Increase 100 -> 1000, so up to 999x999 cells now)
16 People are following this question.
FlexSim can help you understand and improve any system or process. Transform your existing data into accurate predictions.
FlexSim is a fully 3D simulation software environment. FlexSim can be used to simulate any process in any industry.
FlexSim®, FlexSim Healthcare™, Problem Solved.®, the FlexSim logo, the FlexSim X-mark, and the FlexSim Healthcare logo with stylized Caduceus mark are trademarks of FlexSim Software Products, Inc. All rights reserved.
Privacy | Do not sell or share my personal information | Cookie preferences | Report noncompliance | Terms of use | Legal | © Autodesk Inc. All rights reserved