FlexSim Knowledge Base
Announcements, articles, and guides to help you take your simulations to the next level.
Sort by:
This small model shows how to batch various parts together to form 'valid' combinations as they become available. This differs from a regular combiner where the component quantities are set in advance of the components being accepted in the combiner (often based on the type of item on port 1 entry). The valid combinations are shown as the quantities required for a number of products in a global table "ProductPartQuantitiesGrid": By referencing the first picture and this table, you may be able to see that the model first constructs 4x Product2 followed by one product1 and a Product3. In the background process we are creating a token for each product which is then trying to pull all the parts needed while competing with the other products. This part of the process could be constrained in some way, for example where there is a target for the number of each product to produce over a time period. So these tokens are being created in the Object Process Flow of the object we're calling OpportunityCombiner at time zero based on the table shown above: Instead of the normal array generation this model creates a table label of the required parts for a product and stores it on the token. For Product1 that looks like this: Tables aren't quite fully supported as labels yet so the syntax is a little odd when using them - in this case we do it like this: Table(token.partsTable)[1]["Part"]  // evaluates to 'F' Setting the labels up so that syntax works is a bit more complex. Note that the partsTable label is actually a pointer to the data table label on the token - called partsTableData. To get the view shown above you need to right click on the label partsTabelData and select "Explore As Table". Hopefully in the future this may be more streamlined if more people start using labels as tables. The grid table doesn't play nice with sql, so another table creates itself at reset with a structure that is sql friendly: That means the label table can be created with this query: SELECT Part,Quantity FROM ProductPartQuantities WHERE Product=$1.product What remains for the product token just involves getting the parts (a subflow) and them moving the array of all items to the combiner (a queue in the example); stacking them together and releasing to the conveyor before looping back to try and produce another. Below you see the main flow with four tokens - one for each product defined in the grid. The subflow to get parts reads the token's table of parts for its product, and tries to get the correct quantities for each. This is similar to @Jordan Johnson 's solution for pulling from multiple lists, but is instead considering the table of parts from one list rather than arrays of resource lists and quantities. The key aspects of this flow are that 1. the first loop in the check section leaves the parts on the list, while the 'commit' section removes them 2. we exit the check loop by using the pull timeout when we fail to pull the required quantity of a part type 3. those that fail listen for pushes to the parts list 4. success full product pulls insert the items pulled to the tokens label 'allItems' for later use. Attached is the model. It should be relatively simple to transfer the process and tables to another model. OpportunisticCombiner.fsm
View full article
Neste Tutorial iremos demonstrar como funciona a ferramenta Model Layouts no FlexSim. Esta ferramenta permite que você crie e edite diferentes Layouts para um mesmo modelo. Você pode modificar a posição dos objetos e criar uma nova opção de Layout. Por exemplo você pode salvar um Layout inicial de seu processo e após montar propostas a serem estudadas, como um Layout com diferentes posições, redução de transporte, etc... O Model Layouts permite que você possa fazer isso. modellayouts-example-model.fsm Ferramenta útil para estudar comparativamente os resultados gráficos dos Layouts criados apenas rodando o modelo para cada um dos Layouts, e ou para criar a variável Layout para inclusão das opções de Layouts em um experimento. As informações de Layout são armazenadas em cada um dos objetos individuais. Um nó é adicionado aos atributos de objeto chamados Layouts. Para cada Layout criado, uma cópia das informações espaciais atuais do objeto (posição, tamanho, rotação) é armazenada. Janela Model Layout Esta janela pode ser acessada em: View Menu / Model Layouts Layout List - Exibe a lista de Layouts atuais. Selecione um layout para atualizar imediatamente o modelo desse Layout. Você pode renomear um Layout digitando um novo nome neste campo. Add Layout - Adiciona um novo Layout. Quando você adiciona um Layout, ele salva o Layout atual do modelo. Delete Layout - Remove o Layout selecionado. Set - Opção para atualizar o Layout do modelo selecionado para corresponder ao Layout atual do modelo indicado na lista (Layout List).
View full article
This article explores creating Fluid Tanks from a Basic FR and Process Flow. This turned out to be a lot more complicated than I thought. If you need fluid objects in FlexSim, use the standard fluid objects in the library or buy FloWorks. The approach in this article requires a lot of up-front work just to get started, and you probably want to spend that time configuring well-tested objects instead of cutting your own path. This article is directed at two audiences: Those who don't want to use the fluid library or FloWorks (they have elected the way of pain) Those who like learning from example models If you are still interested, read on! TankDemo_10.fsm Kinetic Tracked Variables Tracked Variables hold a number. As you change the value, the Tracked Variable tracks the min, max, average, etc. You can optionally track the history of the value over time (this history) or the amount of time spent at specific values (the profile). You can also listen to when a Tracked Variable changes. A special kind of Tracked Variable is a Kinetic Tracked Variable (KTV). A KTV lets you set a rate. The rate is the ratio of the change in value divided by the change in model time units. If you set a rate, the KTV records when you set the rate and the initial value. In this way, you can as a KTV for its value at any point and get the exact continuous value. KTVs are the heart of this model. You can use a KTV as a label value. Each tank has a label called "Level" that is a KTV that holds the level of the tank. They are also used to represent the progress of a transfer of fluid between tanks. Custom Draw The fluid tanks you see in the model are BasicFR objects. The shape of the object is set to a cylinder. The color of the object determines the color of the fluid. To draw the changing fluid level, the OnDraw trigger of the tanks use the Level label to determine the height of the fluid. Then the OnDraw trigger draws a cylinder covering the remainder of the tank. Because the draw code accesses the Level label's value, the cylinder will change as the value of the Level label changes. Tank: An Object Process Flow Most of the logic in this model is defined in an Object Process Flow called Tank. I used an Object Process Flow so that it would be easy to attach other objects to the flow to imbue them with fluid tank logic. In a way, it's like defining a programming class. When you attach an object, you create an instance of that class. The Tank flow defines behavior for a general fluid tank: A Tank can have fluid transferred in, out, or both A transfer indicates a source tank and a destination tank, and amount, and a rate. If the source tank is null, then the fluid is generated in the tank. If the destination tank is null, fluid is consumed in the tank. A tank can have as many active transfers as the user adds to it. There's not an accompanying concept of "pipes" in this setup. Each transfer changes the rate of the Level KTV for each tank. If the tank gets full, input transfers are paused until the the tank empties below a threshold (95% of its capacity). If the tank gets empty, output transfers are paused until the tank fills above a threshold (5% of its capacity). If the tank is stopped, both input and output transfers are paused until the tank is resumed. The Model Logic The model logic is contained in the process flow called Process Flow. It picks a random recipe from the Recipes table and uses that to create transfers into the Mixer tank. Once those transfers are complete, the Mixer tank empties itself. When it's completely empty, the tank produces an item. Then that process repeats. By using an Object Process Flow, the logic for "how to tanks work in general" is separated from "what are the tanks doing." Pros and Cons The main con is that you would need to implement this logic yourself rather than starting with an object. This includes finding and fixing bugs. I have found and fixed many bugs in this demo model, but I'm fairly confident there are more. It turns out creating an object is tricky. However, there are a few pros: Compared to the fluid library, there is no ticker. The fluid library relies on a ticker to handle changes in level. This approach uses KTVs instead. KTVs are newer than the fluid library. A ticker adds a frequent event to the model and loops through fluid objects checking for changes. It is possible that the approach in this article is more accurate and faster to run. It's also possible that it's slower, due to the number of process flow activities. Compared to FloWorks, there is no monetary cost. This may actually be a con as time spent developing logic is an expense. This approach will take 10x longer or worse to get right. Your future self will thank you for just buying it. You have full control over the behavior. If you don't like how something works, or you want to add additional logic, the logic is all available for you to edit. Again, this might be a con, because you have to fix bugs as you make them. Conclusion Overall, this demo model shows lots of FlexSim features working together. That is valuable in itself. As a replacement for fluid objects, this demo model isn't a great route, unless you have very specific needs. As I built this model, I realized that I was probably solving the same set of issues that the developers of the fluid library were solving. What I thought was going to be somewhat simple turned out more complicated. I still think this is doable, but I'd look at other options very carefully first.
View full article
The attached model draws a heatmap based on the total time AGVs are blocked in a particular location.   Approach Outline This model creates the output graphics as follows: There is a Group of all AGVs. A Statistics Collector listens to all state changes on all AGVs in the group. Each time an AGV goes into the “Blocked” state, the Statistics Collector adds a row, recording the location of the AGV and the current time. Each time an AGV leaves the “Blocked” state, the Statistics Collector updates the row for that AGV to calculate the total time the AGV was blocked. A Shape object (called CongestionHeatmap) reads the data in the Statistics Collector and draws the heatmap. All block times in the table are grouped into spatial “Pixels” based on the block location. Note: this article uses the word Pixel to mean the squares in the heatmap. For each Pixel, the shape sums the total block time in that Pixel. Pixels are colored relative to the Pixels with the most and least block time. Design Points The legend, drawn near the CongestionMap shape object, shows the numerical values for the min and max block time. To disable the heatmap, disable the Statistics Collector. To clear the heatmap, reset, then step, then reset again. Alternatively, you can call the resetheatmap() user command. The heatmap is cleared in the OnSimulationStart trigger of the CongestionMap shape. This way, the heatmap can be viewed when the model is reset. This way, the heatmap is visible without obscuring (or being obscured by) the AGVs. To change the Pixel size, set the PixelSize label on the CongestionMap shape object in the model. There isn’t  much of a performance impact to changing the pixel size. Choosing a good size is more like choosing a good bucket size for a histogram. If the Pixels are too large, it will be hard to tell where the congestion is truly happening, as a single Pixel might cover many areas of the network. If the Pixels are too small, congestion accumulation may be spread between many pixels, making the hotspots harder to see. You can change the pixel size during the model run if you change the label and call the  resetheatmap command. Performance is good. The biggest impact is from listening to the On State Change event of the AGVs. This model starts a real-time timer in the On Run Start model trigger and stops the timer in the On Run Stop model trigger. The output console shows the duration. You can compare model performance with and without the heatmap this way. This approach is most helpful with AGVs. However, it works with any object that goes in the Blocked state. AGVs just happen to go into a blocked state when they accumulate or when they can’t acquire control points/areas. The heatmap is drawn using a mesh. The mesh is more complicated to create, but is much, much faster to draw than using other draw commands. Meshes are used to draw triangles. Each Pixel is drawn as two triangles that form a square. All vertices of that square are set to the same color. Using a mesh also made drawing the legend simple. Meshes always interpolate colors between vertices. The legend draws squares where the top vertices are set to one color and the bottom vertices are set to another. Moving the CongestionMap object does not move the Pixels, so you can place it anywhere in the model. The legend won’t move until the next model run. How To Recreate in Another Model Create a group containing all the objects (AGVs) that should contribute to the heatmap. Create a Statistics Collector to record the location and duration of the block time For the On State Change event, the Statistics Collector responds twice. First, to finish the existing row and second to start a new row. When a row is added, the Statistics Collector adds a row label to record when the block started. When a row is updated, the BlockTime column is set to the current time minus the start time. Create a Shape object. Shape Object Details The shape object has the following labels: PixelSize – the size (in model units) of a Pixel. MeshZ – the height of the heatmap. If you set this to a non-zero value, be sure to reset the 3D view’s rotation and uncheck the “Perspective Projection” box. mesh – this label contains the mesh data. MeshMap – this label holds a Map (a collection of key-value pairs). Each key is an array containing the x and y coordinates of the Pixel. Each value is an array of the vertex numbers for that pixel. VertCount – the total number of vertices contained in the mesh. The mesh grows as blocks occur in more places. MaxBlockTime – the maximum block time in any Pixel MinBlockTime – the minimum block time in any Pixel The shape object as the following triggers: On Simulation Start – clears the mesh, MeshMap, VertCount, MaxBlockTime, and MinBlockTime labels. It also adds vertices to draw the legend. On Pre Draw – adds vertices (if needed) to the mesh and changes the vertex colors. This is the most complicated part. First, loop over the data in the Statistics Collector. For each “block” record: Use the exact location to calculate the Pixel location. Using a map, increment the running total of block time at that Pixel Keep track of the min and max values. Then, loop over the pixel/block time map If the MeshMap doesn’t have vertices for the desired Pixel, add them to the mesh and to the map Based on the color from the color palette, set the color for all six vertices. On Draw – draw the triangles of the mesh. Important: OnDraw should not change the mesh. OnDraw is called many times per draw to calculate shadows. OnPreDraw is only called once. Disable lighting – colors are not “shadowed” and the Pixels don’t draw shadows. Set the PolygonOffset so the mesh is always drawn above the grid.
View full article
One of the most powerful commands in FlexSim is the query() command. It allows you to run SQL-like queries on virtually any data structure in the tree. If you don't know what that means, or what SQL is, or why it would be good to have SQL in FlexSim, this article is for you. If you have general ideas, but you would like to know more, then this article is for you. This article is not about connecting FlexSim to an external database. If that is your goal, then this article is not for you. Basics - Tables Data is often arranged in a table, which very loosely means that data is organized into rows and columns. However, SQL (and therefore the query() command) was designed to work only on certain kinds of tables, that look something like this: Name Age Fur Color Scooter 6 Brown Spot 3 Brown Whizby 4 Black Notice the following points about this table: Each column has a unique name There are no row headers (although if your table in FlexSim has data in the row header, that's okay; we'll get to that later) The table is a list of things, and each row in the table represents a single thing. The columns tell you the data that is stored about each thing. In this table, each thing is a pet, and each row stores the name, age, and hair color (the columns) of each pet. If our data included another pet, it would make another row in the table. In database lingo, a row in a table is called a record. One other thing you need to know about this table is that it has a name (in this case, "Pets"). All tables in SQL have a name, and follow the format described previously. Basics - Tables In FlexSim FlexSim has several different ways you can store data. Most users employ Global Tables and Lists (found in the toolbox) to manage data in their model. More advanced users sometimes create tables or bundles on labels. Then there's the model itself, which stores your object's locations in a tree data structure. All the data about where and object is, and how big it is, is stored in the model tree. So which of these data structures meet the standards for a SQL table? As far as the query() command is concerned, all of them do. The query() command is flexible enough to handle any data structure. The trick is to imagine your data as a table. To do this, you need to be able to answer the following questions: How many rows are there? What columns will the table have? How do you get the data for each cell? Phrased another way, given a row and a column, how do you put data in the table cell? If you can answer these questions, you can use the query() command. Let's apply these questions to two data structures in FlexSim: the Global Table, and the Global List. For the Global Table, the answers are very straightforward, but follow along to get the hang of it: Q: How many rows are there? A: The number of rows in the Global Table. Q: What columns with the table have? A: The same columns as in the Global Table. Q: How do you get the data for each cell? A: Given the row and column, look up the value in the Global Table For the Global List, things get a little more interesting: Q: How many rows are there? A: The number of entries on the list. Q: What columns with the table have? A: There is a value column, and there is a column for each field on the list. Q: How do you get the data for each cell? A: Remember that each row represents an entry on the list. For the value column, I get the value that was pushed on to the list to create the entry. For each field column, I get the value of the field for that entry. For example, suppose you have this list: Then supposed that you pushed a 5, 23, -12, 7, and 2 on to this list. When you view the entries on the list, you can see the data on this list laid out as a table: Notice that the value column has the values that were pushed on the list. The field columns (Doubled, Tripled, OddOrEven, and IsNegative) are each filled with the values of that field. The query() command has built-in support for Global Tables and Global Lists. However, it is always important to remember that to the query() command, the data is laid out in a table. If the data is not laid out in a table, you can still use the query() command, but you will need to use the methods explained in the Explicitly Defined Tables section. Basics - Queries SQL stands for Structured Query Language, so we can guess that it is a language for making queries. So what is a query? In a general sense, a query is a question. In SQL, a query is a question with two parts: who are you asking, and what do you want to know? There is a general answer to both parts of the question, and this is where tables come in. The answer to the first part (who are you asking?) is always a table. A SQL query is always directed at one (or more) tables. The answer to the second second part (what do you want to know?) is usually a new table. A SQL query takes in a table, and gives back a new table. The power in SQL comes from the new tables you can make. You can make a table that is a sorted version of the old table, like sorting data in excel. For example, if you have a list of items that need to be processed, you can sort that list by the item's priority. You can also make a table that is a filtered version of the old table, meaning you only kept certain rows. For example, if certain operators can only do certain tasks, you can make sure to only include the tasks that operator can do. In fact, you can make a table that is filtered, sorted, and modified in several other ways all with one query statement. Basics - Queries in FlexSim Let's look at examples of the query() command. You can follow along using the attached model ( numberlist.fsm). That model has a script that pushes values on to the list, and then queries the list. It also puts the result into the Global Table called QueryResult. Let's look at the line of that script with the query() command: int newTableRows = query("SELECT value FROM NumberList"); This line has a lot of new material. You can see that the query() command takes at least one argument, which is the text of a SQL query. We'll discuss the query itself in a moment. The query() command takes in the SQL query, and creates an internal (and invisible) temporary table that contains the result of the SQL query. It then returns the number of rows in the temporary table. Since you can't readily see the new table made by the query() command, you may want to copy the temporary table to a global table, using the dumpquery() command, as the script does: dumpquery(reftable("QueryResult"), 1); The temporary table lasts until you run the query() command again. Now for the query itself. You can see two parts of this query. The question "What do you want to know?" is answered by the SELECT statement. The question "Who are you asking?" is answered by the FROM clause. In this case, the FROM clause just lists one table, the NumberList. Recall that even though the NumberList isn't technically a table, you can visualize it's data as a table, which is what the query() command does (you can always right-click the NumberList in the Toolbox and choose the "View Entries" option to see the data as a table). In this example, the SELECT statement lists a column name. This means that the resulting table will have 1 column, because only one is required by the SELECT statement. When you run the script, it will put the result of the query in the QueryResult table: Notice that this table has only one column, the value column. If you look at the NumberList entries, you will see that this column is identical to the value column in that table. Examples To give you a general idea of what you can do with queries, these examples show a few common tasks. The examples all query the NumberList, which can be visualized as the following table: Selecting Multiple Columns SELECT value, IsNegative FROM NumberList Filtering SELECT value, IsNegative FROM NumberList WHERE IsNegative == 1 SELECT value, OddOrEven FROM NumberList WHERE value >= 5 Sorting SELECT value, Doubled FROM NumberList WHERE value >= 5 ORDER BY value Advanced - Callback Values It is often necessary to create a dynamic query. In FlexSim (not in regular SQL), you can do this by replacing a value in a query with a $n variable. This variable corresponds to additional parameters in the query() command. If you specify $1, then the value in the query will be the first additional parameter in the query() command, $2 will correspond to the second, and so on, up to $9. For example: query("SELECT Col1, Col2 FROM MyTable WHERE Col1 > $1 AND Col2 < $2", 10, 20) This query creates a table with Col1 and Col2, but only the rows where Col1 is greater than 10, and Col2 is less than 20. It is possible to include the values 10 and 20 in the query text. However, the $ variables allows you to easily change the value in the query, and replace them with more complicated expressions. Note that using callback values in a query where the FROM value is a Global List is not supported before versions 16.0.6/16.2.1. Advanced - Explicitly Defined Tables and the $iter() command Another FlexSim-specific feature of the query() command is the ability to explicitly define a table. This means you can query data that isn't arranged in the table format. In order to do so, you will need to answer the questions posed above, but shown again here: How many rows are there? What columns will the table have? How do you get the data for each cell? Once these questions are answered, the query() command can treat your data like a table. Each of the following subsections will answer these questions in detail. Defining the Number of Rows Let's start with a simple example: query("SELECT 1 FROM $1", 5) Notice that we are selecting from a number, not a Global Table or Global List. When the query() command sees a number instead of a table in the from statement, it assumes that you are querying a table with that number of rows. The statement above yields the following table (after a call to the dumpquery() command): This table has five rows, because $1 (the first additional parameter) evaluates to 5. All the rows have the value 1 because SELECT can handle expressions as well as column names (or expressions involving column names). Note that defining a table will only work if you use callback variables. A from statement like FROM 5 is not valid. To determine the number of rows in the table, use callback variables in the FROM statement. Defining the Columns To define the columns of your table, use the SELECT statement. Each expression in the SELECT statement will result in a column. When you are explicitly defining a table, you will often use callback variables as columns. This is where we can take advantage of the query() command. The query() command is very different from most other commands, because most commands only evaluate their parameters once. The query() command, however, can evaluate its parameters as many times as it needs to. Let's look at another example: query("SELECT $2 FROM $1", 5, normal(0, 1)) The result of this query is the following table: Notice that the second parameter, corresponding to $2, was re-evaluated as many times as the query needed it. Getting the Value in Each Cell Finally, we need a way to access the correct value for a given row and column. To do that, we need a way to know which row we are currently dealing with. This is where the $iter() command comes in. For example: query("SELECT $2 FROM $1", 5, $iter(1)) The $iter() command accepts an argument. That argument should match the value of the callback variable, e.g. if you used FROM $1, then the $iter() command should take a one as an argument. The $iter() command is linked to the query() command, so that its return value depends on which row is being evaluated. The above query results in the following table: Notice that $iter(1) returned the row number for each row. Now we can begin to query the tree, as if it were a table. Let's start with a simple example. Suppose you wanted a table of all the names of the first-level subnodes of the model tree. Let's start by answering the three questions: Q: How many rows are there? A: The number of first-level subnodes of the model Q: What columns with the table have? A: A column for the name of each of those subnodes Q: How do you get the data for each cell? A: Given the row number, get the name of that object Let's translate those answers into a query. First, we need to query something that isn't in table format already, so we know we need to use callback variables in the FROM statement: query("SELECT ... FROM $1", ..., ...) Next, we need a column for the names of all the subnodes, so we add one to the select statement: query("SELECT $2 FROM $1", ..., ...) Next, we need to answer the question of how many rows there are. Since this is the number of subnodes, you can write that as content(model()): query("SELECT $2 FROM $1", content(model()), ...) Finally, we need a way to get the name of each of the subnodes. We know that $iter(1) will give us the values from 1 to content(model()), so we can use those values in the rank() command, and we can pass the result of the rank() command to the getname() command: query("SELECT $2 FROM $1", content(model()), getname(rank(model(), $iter(1))) ) After dragging in a few random objects into the model, you can run that query. If you use the dumpquery() command, you can get a table like this: In the previous example, we used the value from $iter(1), and passed it in to rank(), and from rank() to getname(), all to get the name of the nth subnode of the model. Since querying a node in this way is fairly common, the query() command also allows you to specify a node as a table, rather than a number. In this case, $iter(1) will iterate over all the subnodes of $1, rather than the values 1 to $1. This makes our query much simpler: query("SELECT $2 FROM $1", model(), getname($iter(1))) Advanced - Flattening Data There is another option for what you can query in a FROM statement. If you use a callback variable (like $1) as your table, then you can use flattening syntax, shown in the following example: query("SELECT $3, $4 FROM $1x$2", 3, 2, $iter(1), $iter(2)) This query makes the following table: Notice that for every possible value of $1, there is a row for every possible value of $2. That is the purpose of the x (called the flattening operator); it ensures that there is a row for each permutation of all the callback variables involved. A query containing FROM $1x$2x$3x$4 would produce a table with enough rows for each unique combination of $iter(1), $iter(2), $iter(3), and $iter(4), and then execute the query on that table. The user manual contains an excellent example of when flattening syntax might be helpful, shown in the help manual in Miscellaneous Concepts > SQL Queries > Example.
View full article
FlexSim 2024 Update 2 Beta is now available. FlexSim 24.2.0 Release Notes To get the beta, log in to your account at https://account.flexsim.com, then go to the Downloads section, and click on More Versions. It will be at the top of the list. The More Versions button does not appear when logged in as a guest account. The beta is available only to licensed accounts and accounts that have a license shared with them. Learn more about downloading the best version of FlexSim for your license here. If you have bug reports or other feedback on the software, please create a new post in the Bug Report space or Development space.
View full article
FlexSim 2022 Update 2 is now available for download. For more in-depth discussion of the new features, check out the official software release page: Official Software Release Page - FlexSim 2022 Update 2: AMR Modeling, AI with Bonsai, and more You can view the Release Notes in the online user manual. FlexSim 22.2.0 Release Notes If you have bug reports or other feedback on the software, please email dev@flexsim.com or create a new idea in the Development space.
View full article
This article borrows from @jordan.johnson's original guide for deploying a distributed experiment/optimization with Amazon. Distributed Terminology Please be familiar with the terminology related to experiments and optimizations. Replication - a distinct model run. We'll use this term below for both replications (experimenter) and solutions (optimizer). Instance - a system, whether virtual or bare-metal, local or remote, meeting FlexSim's recommended requirements, and used for running distributed replications. Main PC - the system from which the user configures and initiates the distributed experiment or optimization. The Cloud - a shorthand term for remote servers/systems hosted in a data center, sometimes by a 3rd party such as Amazon, Microsoft, Google, or others. Background Concepts In discussing distributed experiments or optimization, you should start with a good understanding of both the Experimenter and the Optimizer. Please read and understand this user manual entry which includes explanations of key concepts that will be important as you continue. Other user manual articles provide additional guidance on configuring your own experiments or optimizations. Search the online user manual and this community if you have additional questions regarding experiments or optimizations, as needed. Using the experimenter requires a FlexSim license. The optimizer requires a license for the OptQuest add-on. Please contact your local distributor for more information or to request a test license for FlexSim and/or OptQuest. What are distributed experiments or optimizations? Experiments or optimizations can create dozens, hundreds, or even thousands of distinct model runs (or replications) to test various scenarios, build confidence intervals of the results, or zero-in on an optimal solution. A distributed experiment or optimization takes those individual model runs and assigns them (distributes them) to run across a group of computers. If you needed to run 1000 replications, and you have 4 computers available, each computer could run 250 replications, getting your results 4 times faster. When should you distribute? Using distributed replications can significantly reduce the required time to run an experiment if: The single-run time for your model is high (a couple minutes or more) You anticipate running a high number of replications If the time per replication is short, then the increased communication overhead may outweigh the benefit of using distributed replications. The communication overhead increases because all distributed replications still report results to a single FlexSim process on the Main PC, and that communication occurs over the network (local instances) or internet (remote instances), rather than on a single computer. If an experiment or optimization completes in an acceptable amount of time, you may not need to use distributed replications. Financial Costs 3rd party cloud providers such as Amazon, Microsoft, Google, and others, charge for their services. Your cost is usually based on the hardware you provision for your Windows instances, and the length of time those instances are live. Typically you only run your instances when running your experiment or optimization, and cancel or decommission your instances when your replications are complete. In this way you minimize the cost of your distributed experiment or optimization. The costs and process of decommissioning your provisioned instances differ based on which 3rd party cloud provider you use. You may have access to local computing resources that could be configured for use in your FlexSim experiments or optimizations. In this case you may avoid additional costs relating to 3rd party cloud providers by using your own on-premises computers. Licensing for distributed Windows instances Windows instances used solely for distributed replications DO NOT need an individual FlexSim license. Only the FlexSim installation on the Main PC must be licensed. System requirements for distributed Windows instances Graphics A Windows instance should meet or exceed FlexSim's recommended requirements. However, because replications run as background processes without graphics, they need not meet the graphics requirements and do not need hardware accelerated graphics. CPU An instance can run as many concurrent replications as it has CPU cores. If, for example, an instance has 32 CPU cores, it can run 32 replications of your model simultaneously. RAM For this example of a 32-CPU Windows instance, if you want FlexSim to run 32 replications simultaneously - one on each core - then the instance must also have enough RAM to handle 32 concurrent model runs. On your Main PC, use Windows Task Manager to watch a single model run's RAM usage to determine its peak RAM utilization. If your model's RAM utilization peaks at 3GB throughout the course of a model run, you should make sure your 32-CPU system has at least 32*3 = 96GB of RAM for replications alone, along with a good ~10% more for additional overhead used for the Webserver and the statistics gathering and reporting from all the replications (this number could be more or less, depending on the model's stats gathering). In addition, you must account for your system's baseline RAM utilization - how much RAM it uses just to run the operating system and all its background processes. You can find this baseline by checking the Task Manager at a moment when you're not running any simulations. Add all these together to see how much RAM would be necessary to run a replication on each core of the instance. If your instance doesn't have enough RAM to handle that many simultaneous replications, you'll need to limit the number of CPUs FlexSim will use when configuring your Cloud Computing settings from the Main PC. Disk Disk space is usually not an issue. However, if you are using the Store Data on Hard Drive option in the Statistics Collector, you will need to be sure that there is enough disk space to run the model to completion on the hard drive, multiplied by the number of cores. The amount of disk space on each instance may affect the total cost of using a 3rd party cloud provider. More information See the related sections in the article Recommended System Requirements for a more in-depth discussion of system components such as CPU and RAM, and how they relate to running your simulations and experiments. Provisioning distributed Windows instances The process of provisioning 3rd party cloud instances for running distributed FlexSim replications will differ from provider to provider. FlexSim has guides for the following cloud providers: Amazon Web Services Wherever you decide to host your instances, the important part is that eventually you end up with a group of Windows instances, each with a unique IPv4 address accessible from the Main PC. A custom Windows image Your 3rd party cloud provider probably allows you to save a custom Windows image that can include software and settings that you need for each Windows instance. Doing this once for a custom Windows image saves you time when starting new instances - each instance will start with the software and settings preconfigured for your purpose. On your custom image, do the following Download and install FlexSim. Use the same version of FlexSim as is licensed on the Main PC. Remember, you DO NOT need to activate a license. Run FlexSim. This creates a directory that is needed later. After FlexSim finishes its first start, close FlexSim. Download and install the FlexSim Webserver for your installed version of FlexSim. Edit the Webserver's configuration file appropriately for your situation. Default location is here: "C:\Program Files (x86)\FlexSim Web Server\flexsim webserver configuration.txt" Start the FlexSim Webserver from your Windows Start menu, or manually from the default location here: "C:\Program Files (x86)\FlexSim Web Server\flexsimserver.bat". The Webserver will download necessary files the first time it is run. Close the Webserver after it has completed its initial startup. Allow both FlexSim and node.js through the Windows Firewall. To do so, use Windows' Allow an App through the Windows Firewall tool. You will need to browse for both FlexSim and Node.js. Example locations (exact locations may vary by version): C:\Program Files\FlexSim 2023\program\flexsim.exe C:\Program Files\nodejs\node.exe If you are not familiar with the FlexSim Webserver, please review its documentation and test it out on a local machine to understand what it does, its configuration options, etc. If you cannot configure a custom Windows image, you will need to do the above on each instance individually. Initialize instances Launch your instances. On each instance, do the following: Log in to the instance with Remote Desktop or some other solution. Start the FlexSim Webserver from your Windows Start menu, or manually from the default location here: "C:\Program Files (x86)\FlexSim Web Server\flexsimserver.bat". Note the instance's IPv4 address. Once all instances are running the Webserver, you are ready to configure a distributed experiment or optimization from the Main PC. Author's Note: There is probably a way to make it so that when instances start up, they automatically run the Webserver, so that you don't have to manually connect to each one. I welcome any suggestions or steps for how to make that happen. Configuring a distributed experiment or optimization Once you have a list of running instances available, launch FlexSim on the Main PC. Open the experimenter interface from FlexSim's Main Menu > Statistics > Experimenter. Configure your experiment. As part of your configuration, under the Advanced tab, select the option to Use Distributed CPUs. Press the button to Configure Cloud Nodes. This will open the Global Preferences' Environment tab. Enter the IP addresses of your instances into FlexSim. Enter the port numbers you configured in their FlexSim Webservers. If your instances will max out RAM before CPUs, enter a CPU count representing the maximum number of concurrent replications your instance can handle. For more information on using remote computers for Experiment Jobs, see Running Jobs on the Cloud for more information.
View full article
The instructions below are for offline/Manual XML licensing. If your server successfully connects to the Internet and to FlexSim's main license server, you can try our simpler online license return instructions. Assumed configurations All steps below assume that you followed the installation instructions as described in our license server installation instructions, and that all FlexSim's license server files were extracted to the location C:\FlexSim_LMTOOLS. Throughout these instructions we will reference files inside that folder. Find your fulfillment ID On your license server, run the flexsimserveractutil.exe program (C:\FlexSim_LMTOOLS\flexsimserveractutil\flexsimserveractutil.exe) by right-clicking and selecting Run as Administrator. In the FlexSim ServerActUtil program, go to Tools > View License Rights. Copy the Fulfillment ID for the Activation ID you are returning/upgrading by highlighting the Fulfillment ID and pressing Ctrl+C. Generate return request If your license server cannot connect to the Internet, you need to return manually. In the FlexSim ServerActUtil program, select Tools > Manual Activation > Generate Request. Choose the Return option. Paste the Fulfillment ID into the field using Ctrl+V. Browse to select a location and file name for your XML return request. Press the Generate button. Repeat for all licenses you wish to upgrade. This creates a return request XML file for each license you are upgrading. Copy the XML return request files to a location with Internet access. Log in to your FlexSim Account. Use the top page navigation to select your Licenses page, then choose Manual XML in the Licenses submenu: Drag your XML requests onto the dropzone (alternatively you can click the dropzone and browse to a file to upload). Your XML request will be uploaded and processed. If there are any errors, you will get more information about the problem which you can use in contacting your local FlexSim representative for help. If the XML request is successfully processed, you will be prompted to download the response XML file. Download your XML responses and transfer them back to your license server. Process each response XML file by opening flexsimserveractutil.exe and going to Tools > Manual Activation > Process Response. Browse to each response XML file and Process. Your licenses should be successfully returned. If you have any questions or problems, please search our Answers Community for possible solutions. There is a good chance someone else has already asked your question. Still not finding what you're looking for? Submit a new question and we'll check it out. If you're including any confidential information, such as license codes, be sure to mark your question as private! You can also contact your local FlexSim distributor for live phone, web, or email help.
View full article
It may be necessary in rare circumstances to manually delete a fulfillment from your license server. You may need to do this if you mistakenly requested a force-return of your license, if FlexSim's main license server was rolled back to an earlier point in time, or some other rare circumstance.   This manual process occurs exclusively on your license server without any communication with FlexSim's main license server. This procedure applies to both online and offline/secure/air-gapped license servers.   Assumed configurations   All steps below assume that you followed the installation instructions as described in our license server installation instructions, and that all FlexSim's license server files were extracted to the location C:\FlexSim_LMTOOLS. Throughout these instructions we will reference files inside that folder.   Find your fulfillment ID   On your license server, run the flexsimserveractutil.exe program (C:\FlexSim_LMTOOLS\flexsimserveractutil\flexsimserveractutil.exe) by right-clicking and selecting Run as Administrator.     In the FlexSim ServerActUtil program, go to Tools > View License Rights.     Copy the Fulfillment ID for the Activation ID you intend to manually delete by highlighting the Fulfillment ID and pressing Ctrl+C.     Delete the fulfillment   In the FlexSim ServerActUtil program, go to Connect > Delete.     Paste your fulfillment ID into the field. Press the Delete button.     You should receive an indication of success.     If you have any questions or problems, please search our Answers Community for possible solutions. There is a good chance someone else has already asked your question. Still not finding what you're looking for? Submit a new question and we'll check it out. If you're including any confidential information, such as license codes, be sure to mark your question as private! You can also contact your local FlexSim distributor for live phone, web, or email help.
View full article
FlexSim 2023 is now available for download. For more in-depth discussion of the new features, check out the official software release page: FlexSim 2023: Enhancements to Bonsai Integration (AI), Emulation, AGV/AMR, and more You can view the Release Notes in the online user manual. FlexSim 23.0.0 Release Notes If you have bug reports or other feedback on the software, please email dev@flexsim.com or create a new idea in the Development space.
View full article
This demo model shows the type of material handling logic that would be found in Bombay sorter system. This tiered conveyor system has products lined up in rows, then drop onto the next conveyor below while staying as a row. More a proof of concept than a fully-featured sample model, FlexSim users can use this as a springboard for more complex horizontal loop conveyor systems. A Bombay sorter (also known as a flat sorter) is a horizontal loop-style sorter. It's used for high-speed automated sortation of small, lightweight items, such as pharmaceuticals, books, and other small parcels. The chutes or cartons are located below the sorter, and when the product is in position, the doors swing open like a trap door to divert the product to the correct location. Bombay-sorter-demo.fsm
View full article
A.Hello everyone, Some people we very impressed by FlexSim in a logistics fair and they asked me why are we using Plant Simulation in stead of FlexSim ? I've never heard about this software before, so I had a look on youtube. And to be honest I was impressed by the 3D view and how easy was constructing an automated storage in few seconds without code. I'd like to ask if anybody have used this software ? And what do you think about it ? Thank you very much.
View full article
Not sure about the differences between network and standalone licenses? No worries! Read on for an in-depth explanation of each license model: Standalone Licensing (Client-Activatable) Network Licensing (Server-Concurrent) You can also download our printable reference, which includes some example scenarios: Standalone vs Network Licensing.pdf. Standalone Licensing (Client-Activatable) Once a standalone license is activated to a PC it remains there permanently until it is returned. The PC could be rebooted, taken offline, or even have FlexSim uninstalled - the license remains on the PC. The steps to activate and return a license are user-accessible from within FlexSim software. Once FlexSim is installed, there are no special PC permissions required to activate or return licenses. See our licensing procedures article for instructions for managing your standalone licenses (activate, return, repair, upgrade). User-managed license movement The ability for the user to activate and return their license at will is a big advantage. It allows teams the freedom to share a license, while still giving individuals the freedom to take a license off-site or off-Internet. As long as a team sharing a license communicates effectively, the license can be passed around to whoever needs it at the moment, by returning the license from one PC and activating to another. History Log FlexSim's main license server logs a license's activation/return history, including who last activated (in case you need to contact someone about returning it!). The license history log can be viewed by any FlexSim account that can view the license. This includes the license owner and any account the owner has shared with. Your activation IDs (the license codes copied into FlexSim to activate your license) can be shared and visible - including the activation history - with every member of your group. See the Sharing tab on your FlexSim account's Licenses page. Trusted Storage Your standalone FlexSim licenses are activated to a special holding area on your computer called Trusted Storage, which exists outside and independently of FlexSim software. FlexSim's activation process will authenticate your computer with our main license server and store your license credentials in Trusted Storage, completely outside of any FlexSim installation. You could uninstall FlexSim, but your license will still reside in your computer's Trusted Storage. You would need to reinstall FlexSim in order to access the return functionality to move your license off of your computer. So, you can go ahead and use ANY version of FlexSim to activate ANY version of your license so that it will be stored in your computer's Trusted Storage. Whether the activated license will enable features in your version of the software is a separate question - and as a quick reminder, FlexSim's licenses are backward-compatible, meaning that if you have a 21.2 license, you can use that with any version of the software up to version 21.2.x, including all older versions back to 5.0. The crux is, your standalone license can be accessed by any version of FlexSim installed on your computer, regardless of what version was used when activating the license, because all versions just put your license into Trusted Storage, and all versions check license rights by reading out of Trusted Storage. Standalone pros User-level control of the license gives flexibility in who has the license at any given moment. FlexSim maintains the license server, so you don't have to (avoids complexity of installing, configuring, maintaining, and upgrading your own separate license server). Online tools to see the license history and who currently has the license (via your FlexSim Account). In-software auto-upgrades makes upgrading your license easy. Standalone cons People sharing the license need to coordinate who will use it when and remember to return the license when unused. Lost, stolen, or broken licenses require interaction with your local FlexSim rep to fix. Network Licensing (Server-Concurrent) Let's begin with an overview of the setup (simplified from our license server installation instructions😞 Provision a computer/VM to act as the license server. It should remain powered on and attached to the network at all times. Activate your FlexSim licenses to your local license server. Install and configure the license manager software. Configure firewalls and permissions on the server and/or network to allow communication with FlexSim client PCs. Next, the client PCs: Install FlexSim on the client PC. Configure licensing settings in the client software to point to the license server. Configure firewalls and permissions on the client PC and/or network to allow communication with the license server. The network connection between client and server must be maintained throughout use of FlexSim software. If the network connection breaks, FlexSim software reverts to the feature-limited Express mode. This sort of setup is great for computer labs at universities, for instance, where there are many client PCs, and license server hardware or virtual machine is easy to obtain or already exists. Also, where the client PCs are stationary and always on the network, and where network topology makes it easy for the clients to stay connected to the server. Opening FlexSim software requests a seat from the organization's license server. Closing the software returns the seat. Network pros Allows for management of many licenses (seats) from a single location. Some server settings are customizable (Options files can be quite powerful - see chapter 13). Licenses can never become lost or stranded on client PCs. If a client PC loses its connection to the server, the server will reclaim the seat after a timeout period (default timeout is 15 minutes). Network cons Complexity of installing, configuring, maintaining, and upgrading a separate license server. Client PCs must maintain a constant connection to the server. No online record of activations/returns (but you can examine your own raw server logs).
View full article
FlexSim 2018 Update 1 Beta is available. (updated 28 March 2018) To get the beta, log in to your account at www.flexsim.com, then go to the Downloads section, and click on More Versions. It will be at the top of the list. If you have bug reports or other feedback on the software, please email dev@flexsim.com or create a new idea in the Development space. Release Notes Added a Database Connector tool and Database FlexScript API. Updated the Emulation module and added it to the toolbox. Updated object triggers to be dynamically added and executed to improve performance and flexibility. Added an option to store StatisticsCollector bundle data on the hard drive. Added a global preference for date and time formats, which will default to the system's locale settings. Updated the stick() command to be able to get information about the VR headset by passing -1 for the stick number. Added a Box Plot chart type. Added a visual Walls object, which can be connected to A* as a member. Added an option to reverse rows on a gantt chart. Updated how the gantt chart handles colors. Added a time window option to several charts. Improved axis title options on several charts. Added a y-axis range option to the time plot. Output, system, and compiler consoles now wrap lines. Fixed a bug with using local variable "a" within FlexScript lambda commands, such as findmatch(). Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Removed FlowNode, Reservoir, WatchList, and other unused library class objects. Changed transportincomplete() to be more fail-safe so that it only affects the object when called correctly. Fixed an issue with the Rack sometimes receiving items out of order when the upstream object is using a transport. Process Flow Added a Variable shared asset. Updated the Event-Triggered Source and Wait for Event activities to be able to match values. People Added a Waiting Line object and a Wait in Line activity. AGV Fixed a bug with preempting an AGV during a pre-arrival event. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Improved AGV proximity detection for stop-space-based accumulation. Fixed an issue with reversing direction on accumulating paths. A* Added a routing mode for traveling at right angles only. Added an option for stopping and turning when changing directions. Added an option for routing by travel time. Improved the usability of creating and editing barriers and dividers. Added an option for snapping dividers between grid points. Fixed some visual issues with various components. Fixed a bug with distancetotravel(). Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Improved the accuracy of the calculation of which grid points are affected by dividers. The mechanism for recovering from deadlock has been changed. The path costing system was slightly changed to allow for travel-time-based routing.
View full article
Node-locked Node-locked can only be activated once. Be sure that you install the license where you would like it to be installed for the next year. FlexSim can assist with one migration for extenuating circumstances, such as a crashed computer, but there will be fees for any additional migrations. Please contact your distributor to receive assistance with moving your license. The node-locked license feature of terminal server usage (remote desktop) is disabled and cannot be enabled. Transferable There is no limit to the number of times a license seat can be activated and returned. If the transferable license is not a network license, then by default the license feature of terminal server usage (remote desktop) is disabled.    Please reference other articles or our documentation for further information about licensing.
View full article
FlexSim 2017 Update 1 or later is compatible with Windows Mixed Reality headsets and controllers, such as the Samsung HMD Odyssey. To configure such devices, you use the Windows Mixed Reality Portal app in Windows 10 and SteamVR. FlexSim uses SteamVR's OpenVR API to communicate with these devices. Microsoft provides instructions for how to Play SteamVR games in Windows Mixed Reality. I will provide additional summarized steps below: 1. Configure your hardware with the Windows Mixed Reality Portal app in Windows 10. 2. Install Steam. 3. Within Steam, install SteamVR and Windows Mixed Reality for SteamVR. 4. If you are able to do the SteamVR tutorial with your headset, then you should now be able to use VR Mode in FlexSim: Note: While using a Windows Mixed Reality HMD (head-mounted display), pressing the Windows button on the controllers may take you to the Windows Mixed Reality Portal Home: If you end up here, you can take the headset off and put it back on to transfer back to FlexSim: Also, if you appear to be floating far above the ground, you can recenter the headset pose with this script, which you could map to a Custom Button on your toolbar: applicationcommand("recenteroculusrift");
View full article
FlexSim 2023 Beta is now available. FlexSim 23.0.0 Release Notes To get the beta, log in to your account at https://account.flexsim.com, then go to the Downloads section, and click on More Versions. It will be at the top of the list. The More Versions button does not appear when logged in as a guest account. The beta is available only to licensed accounts and accounts that have a license shared with them. Learn more about downloading the best version of FlexSim for your license here. If you have bug reports or other feedback on the software, please email dev@flexsim.com or create a new idea in the Development space.
View full article
This article reviews one method for making a state Gantt chart for the default and alternate state profiles: Example Model You can download the model for this walkthrough ( stateganttdemo.fsm). The model has two multiprocessors, in a Group called Multiprocessors. Each multiprocessor has two processes: Process1 and Process2. To make the chart, we will first make a Statistics Collector, and then a Calculated Table. Making the Statistics Collector Make a new Statistics Collector. On the Event Listening tab, use the Sampler to listen to On State Change of the group of multiprocessors. You can leave the parameter names alone. However, we need to add a label, so we can record the profile number. Select the new event, and then use the green plus button in the Event Labels area to add a label for this event. Set its name to ProfileNum, and its value to the following code: data.StateProfileNode?.rank The event settings should look something like the following: Next we need to set the row mode. Make sure it's set to Add Per Event, with no row value. As the final configuration step for the statistics collector, we need to set up the columns. There should be four columns in this collector: Time - In the pick options, select Time, then Model Date/Time Object - In the pick options, select IDs, then ID of Event Object Profile - Type data.ProfileNum for the value. The default storage and display format are fine. State Type the following code: data.eventNode.as(Object).stats.state(data.ProfileNum).profile[data.ToState + 1][1] Set the Storage Type to String The code is necessary because On State Change occurs before the state is set to the new state. So the code is looking up the name of the future state in the profile table. When you reset and run this model, you will see a table like the following: Making the Calculated Table Make a new Calculated Table, and give it the following query: SELECT Object, Time as StartTime, LEAD(Time) OVER (PARTITION BY Object) AS EndTime, State FROM StatisticsCollector1 WHERE Profile = 1 This query creates an Object column as well as a Time column. To get the time that the current state ends, we look to when the next state begins. The LEAD() function looks ahead in the table, and the OVER(PARTITION BY Object) clause makes sure that LEAD() makes sure to look to the next row with the same Object. We also record the state column, and filter out the standard state profile, keeping the special multiprocessor state profile. Once you get this query to work, change the Update Mode to By Interval, and set the interval to 20 or 30. Since the Statistics Collector table will get longer and longer, the query will become more and more expensive as the model runs. To control how much time is spent running the query, we use an interval. The final configuration of the Calculated Table should look like this: You will need to set the Display Format of each column on the Display Format tab (Object, Date/Time, Date/Time, and Raw). Making the Chart Make a new dashboard, and create a Gantt chart. Point it at the Calculated Table. When you do that, the chart should fill in all the other columns correctly. Charting Both State Profiles for Both Objects In order to chart both profiles on the same chart, we first need to add a column to the Statistics Collector, and then update the query in the Calculated Table. The new column should be named ObjectAndProfile, and a Storage Type of String. Use the following code for a value: data.eventNode.name + " - " + string.fromNum(data.ProfileNum.as(int)) Then change your query to the following: SELECT ObjectAndProfile, Time as StartTime, LEAD(Time) OVER (PARTITION BY ObjectAndProfile) AS EndTime, State FROM StatisticsCollector1 With these changes, you should be able to view both profiles for both multiprocessors.
View full article
Note: these demo models have been designed for the French-speaking FlexSim user community (all explanations and statistics shown in dashboards are labeled in French). However as 3D animation is a universal language, feel free to download these models whatever language you speak. Manutention de marchandises / Material handling download link: https://redirect.flexsim.fr/download_demomanutention niveau: ★☆☆ Ce modèle donne une vue d'ensemble sur les ressources disponibles dans la librairie FlexSim pour transporter des produits: AGV, opérateur, cariste, ascenseur, robot 6 axes, pont roulant, transtockeur. This model gives an overview of available resources in the FlexSim library to transport products: AGV, operator, forklift, elevator, 6-axis robot, crane, ASRS. Triage sur convoyeur / Conveyor sorting system download link: https://redirect.flexsim.fr/download_demotriage niveau: ★★☆ Dans ce modèle, des colis arrivent sur un carrousel et sont triés sur un des 6 convoyeurs de sortie en fonction de leur référence de commande. Si la cellule photoélectrique du convoyeur de sortie est saturée, les colis font un tour de carrousel supplémentaire. In this model, packages arrive on a carousel and are sorted on one of the 6 exit conveyors, according to their order reference. If the exit conveyor's photocell is saturated, packages make an additional carousel lap. AGV - Automated Guided Vehicle download link: https://redirect.flexsim.fr/download_demoagv niveau: ★★★ Ce modèle illustre une application des capacités de simulation d'AGV de FlexSim. Des caisses y circulent entre divers modules via des AGVs. This model demonstrates a subset of FlexSim's AGV simulation capabilities. Loads are transported by AGVs between several modules. Workshop download link: https://redirect.flexsim.fr/download_demoworkshop niveau: ★★★ Ce modèle présente une approche possible pour simuler des gammes de fabrication. Une gamme est assignée à chaque produit entrant dans le modèle. Le produit traverse ensuite chaque étape de sa gamme. This model presents a possible approach for data-driven product routing. Each product moves through a series of processing steps defined in a table. Clinique / Clinic download link: https://redirect.flexsim.fr/download_democlinique niveau: ★☆☆ Ce modèle est un exemple de parcours patient dans une clinique: enregistrement, triage par une infirmière, examen par un médecin, soins (ECG, radio ou IRM) et enfin présentation du diagnostic au patient avant raccompagnement vers la sortie. This model is an example of patient flow in a clinic: sign in, triage by a nurse, consult with a doctor, treatment (EKG, X-ray or MRI) and finally patient education before escorting him to the exit.
View full article
Top Contributors