FlexSim Knowledge Base
Announcements, articles, and guides to help you take your simulations to the next level.
Sort by:
Cams Module flexcon-cams v17.0.zip This module permits to place cameras in the model and so to follow an object using the nearest camera. How to install it: put the "Cams Module" folder into the Flexsim "modules" folder run Flexsim This module adds: the "Camera"object into the "Visual" section of the Flexsim standard library "Cams" menu button How to use it: insert cameras into your model where you want and adjust z locations (it's not important where camera is looking) highlight the object (maily a task executer) you want to follow click on the Cams menu voice: "Set Cam focus to highlighted" click on the Cams menu voice: "Camera activate" run the model the nearest camera to the focused object follows it click on the Cams menu voice: "Hide Cams and Camera Manager" to hide or unhide cameras Example:
View full article
Hi everyone, I had a discussion with @Jordan Johnson recently and I also wanted to share with the distributors group some thoughts about the autosave feature: Comment #1: there is no autosave if your model is in a run state every 10 minutes When a user reads this checkbox, he thinks that FlexSim will "autosave a model backup every 10 minutes" exactly as it is written. But it does not. As explained in the user manual: "AutoSave will only save your model if it is reset and not running." (https://docs.flexsim.com/en/20.1/Reference/GeneralModelSettings/GlobalPreferences/#environment) Let's take an example: a user saves his model file at 10:00 am. The first autosave is scheduled at 10:10 am. The user starts building his model, then runs his model between 10:09 and 10:11. As at 10:10 am his model was running, there was actually no autosave. So the first autosave is postponed at 10:20 am. The user does some modifications in his model, then resets and runs his model between 10:19 and 10:21. As at 10:20 his model was running, there was actually no autosave. So the first autosave is postponed at 10:30 am. And so on... So after 1 hour of work, a user could actually have no autosave of his model. And I already have seen this with some users. If FlexSim crashes, then the user looses his work since he forgot to regularly save his model. So he looks for the autosave file, but there is none, even after 1 hour. You might answer me that users are supposed to save their model more regularly, but if they would do so then there would be no need to have an autosave feature. Idea: if the model is in a run state when the autosave is scheduled, the autosave should not be postponed in 10 minutes, but instead the autosave should be triggered at the next model reset. Comment #2: there is no autosave if you save your model at intervalls less than 10 minutes Let's take an example: a user saves his model file at 10:00 am. The first autosave is scheduled at 10:10 am. But the user saves his model at 10:09. So the first autosave is postponed at 10:19 am, there is no autosave at 10:10. Then the user saves his model at 10:18. So the first autosave is postponed at 10:28 am, there is no autosave at 10:19. And so on... So after 1 hour of work, a user will also have no autosave file if he saves regularly his model. I am not shocked by this behaviour, but again when a user reads that FlexSim will "autosave a model backup every 10 minutes" , he thinks that FlexSim does autosave a model backup every 10 minutes as written on the checkbox. If saving the model postpones the next autosave, then the label of this checkbox should be more precise. And there should also be at least a tooltip on the checkbox and one more sentence in the user manual to explain that the autosave is postponed everytime the user saves his model. I know that you are all experienced users and you save regularly your models. But I would be interested if you have already seen some of your users loosing their work, and then when looking for an autosave file there was none, or the autosave file was much older than 10 minutes. Don't hesitate to add comments to this post.
View full article
The FloWorks module has been updated for FlexSim 2017 and is now available (December 2016). Update 1: Bug fix update 1 was released on Jan 23, 2017. Update 2: Bug fix update 2 and FloWorks 17.1 for FlexSim 2017 Update 1 were released on Apr 11, 2017. FloWorks is a 3rd party module developed and maintained by Talumis BV ( talumis.com). It provides faster and more accurate modelling and calculation of fluid systems than the default FlexSim fluid library. It is especially useful within the oil, gas, and bulk industry both for production and supply chain optimization. This module requires a FloWorks license. For any questions, please email support@talumis.com. Release notes FloWorks version 2017.0.1 (Jan 23, 2017) Bug fix: Missing names and items in Flow Item Bin fixed. Bug fix: Properties window for Flow Tank flow item now opens correctly. Bug fix: Resolved some minor issues with "Add to dashboard" pins. FloWorks version 2017.0.0 (Dec 22, 2016) FloWorks updated for FlexSim 2017 Flow Mixer now has a manual mode, that will put it in Idle mode after each batch until you manually call StartMixerRecipe. Allow Input Rate and Output Rate to be plotted versus time. New Workability and Level Triggered Event objects added with focus in particular on modelling of ports and offshore processes. Unfilled part of Flow Tank is no longer necessarily gray but takes the object color. When Impact Events are active on a FloWorks object, they will show a box around the object similar to the "stopobject" behavior in standard FlexSim. The color of the box varies from red (0) through yellow to green (1) to black (infinity) depending on the impact factor of the event. Dropdown lists for port actions improved. For example, you can now open or close a single port (OpenFlowIp c.s.), select an individual port to open, close input and open output, etc. Increased limits on number of objects and events when running unlicensed version in FlexSim Educational version. Bug fix: Can now add Object Groups to FloWorks charts. Bug fix: When changing a Flow Task Executer from vessel to truck, the TE's flow tank is correctly scaled and positioned on reset. Bug fix: The State display in the Quick Properties did not correctly show the state of the Loading Arm. Bug fix: Arrow heads can now be dragged by holding 'X' key instead of Alt. User commands consolidated and documentation updated: ConnectFlowObjectToOtherObject command rewritten and documented. All documentation in modules\FloWorks\help\Commands reformatted and automatically generated based on actual user commands. These help pages often provide more explanation on the parameters and their optional values, the return types, and more extensive examples than the FlexSim Command Helper pages. Integration with the Process Flow module: FloWorks options added to "Listener Initialized" trigger of "Wait for event" action. Dropdown lists for port actions improved. For example, you can now open or close a single port (OpenFlowIp c.s.), select an individual port to open, close input and open output, etc. Backwards Compatibility Note: the following change may slightly change the way updated models behave. The Item To Flow's OnItemEmptied trigger is now fired before the actual item is destroyed, so that you are still able to reference it in the trigger code.
View full article
This model shows a two-floor healthcare facility with an elevator connecting the two floors. Patients are moved on a gurney from different rooms and across floors. There is a dashboard with two checkboxes so you can turn on and off the visuals for the different floors. One unique feature of this model is that each patient has a constant companion who follows them throughout their care process. This could be used either to demonstrate that companions can be modeled in FlexSim, or as a basis for another modeler to copy. FlexSim-HC-2023-MultiFloor_With_Companion.fsm
View full article
We recently had a customer ask how to draw a flow item label on the flow item object. I thought that this information would be useful to other FlexSim users as well. In the 3D model, drag and drop a Text visual from the Library. Select the text in the 3D model, then copy it to the clipboard using Ctl + C Go to the Toolbox tab, open the FlowItem Bin, and double click the Flow Item of interest. Right click the 3D flow object, and click "Explore Tree" Click in the white space underneath the Flow Item's node, and use Ctl + V to paste the text as a subnode to the flow item. If you zoom out in the Flow Item's 3D view, you will see the text. You can double click on the text and use the General tab to position it wherever you would like. Double click the 3D Flow Item. Underneath the Labels tab, select the green plus sign to add your label. In my example, I added a number label called "Type" with a default setting of 0. Click "OK". Double click the text that you added in step 5 and 6. Underneath the Display tab, click the custom code button next to Text Display. Within the custom code type something like the following: /**Custom Code*/ Object current = ownerobject(c); treenode textnode = param(1); textnode.value = "Type: " + string.fromNum(current.up.Type); //Note: If your label is called something other than "Type", make sure to replace it in both places. Click out of the "FlowItem Bin" tab and back into the "Model" tab. Double click the source where your Flow Item is being created. Underneath the Triggers tab, add an On Creation trigger. Click the green plus next to the On Creation trigger. Hover over Data and select "Set Label". Make sure the text next to the Label field matches the text of the label you set in step 7 and 8. By following these steps, each Flow Item will have a text label that displays the Flow Item label next to the Flow Item object. Please see the attached gif for a demonstration. flowitem-label.gif
View full article
FlexSim 2022 Update 1 Beta is now available. (Updated March 28) FlexSim 22.1.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. Subsequently 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
Here on Answers it's often helpful to post code in a question or an answer. When you do so, there are certain steps that should be taken to avoid being blocked by Answers' internal security mechanisms. This article describes the proper way to submit code without arousing suspicion from our threat detection software. Some of our customers are all too familiar with the screen below after asking a question or adding a comment that includes code. What is Cloudflare? Cloudflare is a 3rd party threat detection software specifically designed to detect malicious code/software that may threaten a website. Once you've seen this screen above, there is no way for us to un-block you, as it is an automated 3rd party software. Unfortunately, at this point you have to wait a variable amount of time until Cloudflare decides your IP address is no longer a threat and you will again be allowed access to answers.flexsim.com. What am I doing wrong? This warning usually presents itself when code has been typed or pasted directly into the body of your post, like this: How do I properly format my code? First paste or type your code into the body of your post. Then, highlight your code and click the Code button in the toolbar. It looks like this: < > How can I tell if my code is properly formatted? After highlighting your code and clicking the code < > button, you will see that your code now has a border and light background: Remember, if you have multiple blocks of code, you can select just the code you want to be grouped together in the first block, hit the code button in the toolbar, and then select the second group of code and again hit the code button to make the second code block, etc. After you submit your post, you will see your code formatted with syntax highlighting, a mono-spaced font, and the lines numbered, like this: Conclusion Adding code to your post is an essential task for many of our customers. If you follow these guidelines, you should be able to avoid being blocked and ensure you have uninterrupted service on our answers site. If you feel you have properly entered code and are still being blocked, please inform us and include the code and method of formatting you were using when you were blocked. We'll gladly look into it. As a fallback, you can take a screenshot of your code and add it to your post as an image, but still let us know there was an issue, and we'll look into it. Finally, if you're in a hurry and Answers troubles are keeping you from getting the help you need, remember to contact your local FlexSim representative directly by phone or email.
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
What is ODBC? FlexSim can use ODBC, and ODBC can connect to many different kinds of data sources, including files (like Excel) and databases. It allows you to use SQL queries to get data from any supported data source. ODBC uses a driver determine how to get data from a given data source. A driver is translator between ODBC and whatever data source you are querying. For example, there is a driver for Excel files. If you have that driver on your system, you could use ODBC to query data from Excel files. As another example, there is a driver for SAP HANA, the database for SAP. If you have that driver, then ODBC will know how to talk to SAP. This means that if the correct driver is installed, and is working correctly, that you can use FlexSim to query any ODBC data source. Using the Database Connector FlexSim has a tool called the Database Connector. You can use it to configure a connection to a database. This article uses that tool. For more information, see https://docs.flexsim.com/en/20.2/Reference/Tools/DatabaseConnectors/ As an example, let's say that you want to connect to Excel using ODBC. Assuming you have the Excel ODBC driver installed on your system, you can configure a Database Connector to look like this: Note that you must specify the full connection string. In the connection string, you can see that the driver and the file are specified. Then you can query the data in a given sheet with a query like this: SELECT * FROM [Sheet1$] You can find more information on querying Excel files at websites like this: https://querysurge.zendesk.com/hc/en-us/articles/205766136-Writing-SQL-Queries-against-Excel-files-Excel-SQL- If you use Office 365, you may need to install the Microsoft Access Database Engine 2016 Redistributable. This includes newer drivers for Excel and Access Be sure to install it with the /quiet flag on the command line. Instructions can be found in this troubleshooting guide: https://docs.microsoft.com/en-us/office/troubleshoot/access/cannot-use-odbc-or-oledb Note that FlexSim has an Excel tool, which is usually easier to use. This tool requires Excel to be installed, but does not require the ODBC driver for Excel to be installed on your computer. For more information, see https://docs.flexsim.com/en/20.2/Reference/Tools/ExcelInterface/. Excel makes a good example because most people have it, and it's easy to get the driver for it. Connection Strings Different kinds of connections require different connection strings. The following list has an example connection string for a few data sources: Excel Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=Path\To\Excel\File.xlsx Access Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=Path\To\Access.accdb SQLite Driver={SQLite3 ODBC Driver};Database=Path\to\sqlite.db SAP HANA DRIVER={HDBODBC};UID=myUser;PWD=myPassword;SERVERNODE=myServer:30015 Checking for Drivers Note that each connection string specifies a driver, and then additional information. The additional information depends on the driver you are using. In order to determine which drivers are on your system, you need to open the ODBC Data Sources Administrator window. To do that, hit the windows key, and then type ODBC. Then choose the option called ODBC Data Sources (64 bit). If you are running 32-bit FlexSim, open the 32 bit version. Go to the Drivers tab. Here is what my Drivers tab looks like: You can see I have drivers for Access, Excel, SQL Server, and SQLite3. I don't have drivers for SAP HANA. If I did, you'd see a driver named HDBODBC in the list. To access that kind of database, I'd need to install that driver. You can also see that the name of the driver used the the connection string must match exactly to what is shown here. Other Info You may see an exception appear when you test the connection to your database. If the view shows that the connection succeeded, then it has succeeded. The exception happens because FlexSim tries to get a list of tables from the database that it's querying. FlexSim may not guess correctly for your particular data source. That exception can be safely ignored. If you used the old db() commands in the past, consider upgrading to using the Database Connector. It will be orders of magnitude faster to read in an entire table.
View full article
FloWorks 22.0.0 is now available (21 December 2021). This version of FloWorks is intended for use with FlexSim 2022. If you are using FloWorks with FlexSim 2021 (LTS) you can upgrade to FloWorks version 21.0.5. If you are using FlexSim 2021 Update 2, you can upgrade to FloWorks version 21.2.1. All versions can be found in the Downloads section of your FlexSim account on the 3rd party modules tab. Please do not hesitate to report any bugs, usability improvements and feature requests to support@talumis.com. About FloWorks FloWorks is a 3rd party module developed and maintained by Talumis BV ( talumis.com). It provides faster and more accurate modelling and calculation of fluid systems than the default FlexSim fluid library. It is especially useful within the oil, gas, and bulk industry both for production and supply chain optimization. This module requires a FloWorks license with active maintenance. For any questions, please email support@talumis.com. Release notes FloWorks 22.0.0 Fixed and updated statistics pins. Tutorials revised and updated (thanks, @Clair!). All bug fixes in FloWorks 21.2.1 below. All bug fixes in FloWorks 21.0.5 below. FloWorks 21.2.1 New: (segmented) flow pipe has option to suppress "Product Out Changed" event from product 0 to initial product. Bug fix: changed wording in tutorial 2 so it can be completed again. Bug fix: FlowVessel and FlowTruck flow item issues fixed All bug fixes in FloWorks 21.0.5 below. Backwards Compatibility Note: The following change may change the way updated models behave. (Segmented) flow pipe no longer fires the "Product Out Changed" event for zero-width layers (e.g. as created by the Pass Product Downstream trigger). FloWorks 21.0.5 Bug fix: when impact event ends, when no recalculation is necessary, the flow object state is now re-determined. Bug fix: SetFlowConveyorSpeed function fixed. Bug fixes to solver: incorrect flow with full tank-type objects. Bug fix: FlowConveyor approximately full/empty issues fixed. Bug fix: FlowConveyor settings (width, speed, ...) could not be set in quick properties.
View full article
We have released a beta version of our bottling module. The module adds two new objects to the FlexSim 3D Library. The Mass Flow Conveyor (MFC) and the MFC Motor. The Mass Flow Conveyor allows you to define multiple lanes for flow items to move along. It is often used in bottling lines. Help files are included in the FlexSim User Manual to assist you. This beta version must be installed with FlexSim 2017 Update 2. 32-bit and 64-bit installers can be downloaded through the downloads section in the Modules tab of the FlexSim website: FlexSim Downloads The following are known issues: Acceleration implementation is not complete. Crossline Multiplier implementation is not complete. MFC.Motor property 'sections' is not working. Please post any feedback or bug reports either as a comment to this article or you can email them to dev@flexsim.com
View full article
FloWorks 18.1.0 is now available (10 April 2018). This version of FloWorks is intended for use with FlexSim 2018 Update 1. Update: Bug fix version 18.1.1 has been released on 18 April. In addition, FloWorks 18.0.2 has been released, containing bug fixes for FlexSim 2018 (LTS) users. All versions can be found in the Downloads section of your FlexSim account on the 3rd party modules tab. Please do not hesitate to report any bugs, usability improvements and feature requests to support@talumis.com. About FloWorks FloWorks is a 3rd party module developed and maintained by Talumis BV ( talumis.com). It provides faster and more accurate modelling and calculation of fluid systems than the default FlexSim fluid library. It is especially useful within the oil, gas, and bulk industry both for production and supply chain optimization. This module requires a FloWorks license with active maintenance. For any questions, please email support@talumis.com. Release notes Changes in FloWorks 18.1.1 Bug fix: "Change" field should be hidden on all Task Executers except Flow Task Execture. Bug fix: Changing configuration of Flow Task Executer would cause strange behavior because the window was closed before all scripts had finished executing. Bug fix: Some objects like Berth and Loading Arm no longer worked because code properties got untoggled. Changes in FloWorks 18.1.0 Pumps, valves, blenders and splitters are now different shapes of the same "Flow Processor". Truck loading points and Berths are now different shapes of the same "Loading Point". Cylindrical tanks, rectangular tanks, tanks with polygon base area and flow piles are now different shapes of the same "Flow Tank". Added button to flow tank to calculate physical size based on specified max. content. Flow pipe has animation to help visualize if material is flowing and how fast. Added post-step delay and trigger to multi-compartment loading controller steps. Added Start Impact Event and End Impact Event triggers. FloWorks chart templates have been added to the library. All changes to version 18.0.2 listed below. Changes in FloWorks 18.0.2 (for FlexSim 2018 LTS) Bug fix: Conveyor sometimes stops incorrectly. Improvement: Objects try to avoid On State Change when state has not changed.
View full article
FlexSim 2016 Update 2 Beta is available. To get it, 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 support for STEP and IGES 3D shapes. Added a Quick Library popup when you double-click on empty space or A/S Connect to empty space in the 3D view. Improved object rotation manipulation in the 3D view. Added sorting to toolbox for top level items. Added the ability to use the query() command with partitioned lists, using ListName.$1 or ListName.PartitionIDStr syntax. Added support for the ON clause in SQL queries using the query() command. Added support for the ARRAY_AGG() aggregation function in SQL queries using the query() command, in the manner of PostgreSQL. Added an "Allow Multiple Pushes Before Back Order Fulfillment" setting to lists. Added a "Reevaluate All Values On Push" setting to lists. Added a Date Based feature to gantt charts. Updated the auto-numbering mechanism when naming new objects. Updated file browse dialogs to remember the last used directory. Changed the default directory for opening and saving user libraries to be within documentsdir(). Added a colors tab to the tracked variable dashboard chart. Updated the Presentation Builder interface to make the timeline more useable. Updated the Animation Creator interface. Updated the Stop Time interface. Added range and type validation to many edit fields. Added functionality to the Webserver to restrict access to certain models using Windows Authentication. Fixed a bug with the window docking system that caused sizing to not work properly sometimes. Fixed TimeTable Excel Import bug not working with Daily/Weekly Repeat table. Fixed the Visual Studio project files so they don't give you the linker errors when you compile flexsimcontent.dll with Visual Studio. Fixed a bug with cell heights and widths when inserting and deleting table rows or columns. Fixed line charts continuing to collect data beyond their collect time. Fixed the query() command so that it can be called within List fields. Process Flow Improved Process Flow view performance. Added Split, Join, and Synchronize activities. Added right-click options for re-ranking activities in a block and removing an activity from a block. Added tooltips to activities that show you the activity type. Added copy and paste options to the Process Flow right-click menu. Populated field names of lists for SQL drop-down menu options. Updated Text editing interface to be more user friendly. Added an "Assign Event Object To" option to the Wait For Event and Event-Triggered Source. AGV Added new agvinfo() command options. Updated paths so that they can be contained within visual tools. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Fixed issues with routing through path junctions where 3 or more paths connect.
View full article
FlexSim 2017 Update 1 is available. 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 Changed FlexSim to store strings using UTF-8 encoding. Added support for Oculus Touch controllers. Implemented OpenVR for HTC Vive compatibility. Improved the shadow frustum calculation in VR so that shadows look better. Added a global preference for changing the resolution of the shadow map. Added support for nested queries in SQL. Added ROW_NUMBER as a SQL keyword. Implemented F2 and Esc functionality in tables. Updated the table view and labels tab to be more robust with different datatypes. Added Table(name) method for referencing Global Tables. Added more FlexScript classes, including List, AGV, Conveyor, and TrackedVariable. Added more properties and methods to existing FlexScript classes, including Object stats and additional string methods. Improved scientific notation for literals in FlexScript. Added a start value to tracked variables. All tracked variables in the model now reset on model reset. Changed itemtype references to referencing an item's type label instead. Improved the Person flowitem's 3D shape. Added repeating events to time tables. Added a short description field to user commands. Made the gantt charts and time charts scroll with a fixed time window. Removed the global table Clear on Reset checkbox and replaced it with a reset trigger. Added new visualization options for the Rack. Added duplicate buttons to the Excel Interface window. Added a duplicate option to the Toolbox's context menu. Taskbar now shows experimenter/optimizer status and runtime based upon stop time. Disabled deleting objects while the model is running. Fixed an issue with the undo history when pasting over nodes with pointer data. Fixed issues with using the ternary operator after properties. Fixed an issue with writing to Access databases with read-only fields. Included fixes listed in 17.0.4. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Removed the FlexSim WebServer application from the default installation and developed a new WebServer application using Node.js that streams the 3D view much faster. The new WebServer can be downloaded through FlexSim's Online Content. Existing models will continue to work with itemtype, but new models should be built using a type label instead of the itemtype attribute and commands. Process Flow Added an Assign Released Resource(s) To field on the Release Resource activity. Added functionality to allow you to Ctrl+Drag activities in an activity block. Added a right-click menu option and Alt+Click to open the Token View. Added a sampler to the assign labels Label Name field so you can sample other activities or tokens to get label names. Added a right-click menu option to open multiple views of a Process Flow. Added an Assign To property to the Create Tokens activity. Added a Make Array label aggregation type to the Batch. Added Center in View buttons for fields with pointer data. Added a name property to the Token FlexScript class. Fixed a bug with duplicating Process Flows using the Toolbox. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Updated the Pull From List activity so it does not assign a null label when nothing was pulled or the token was released early (manually). Previously, if you used a Max Wait Timer or Max Idle Timer (or some other mechanism) to release a token from a Pull from List prematurely, the label specified in the Assign To field would be created with a value of NULL. Now, the label will not be created. This may break other models that are checking to see if the label value exists. For example, saying objectexists(token.pulled) will throw an exception if the pulled label is never created. This can be easily remedied by changing the code to objectexists(token.pulled?). The ? will cause the value returned to be nullvar when the pulled label does not exist. Universal Edit fields are now more strict when accessing labels on a token. Previously, typing token.labelThatDoesNotExist would happily return NULL and move on. Now the Universal Edit will throw an exception if the label doesn't exist. This does not include Universal Edit fields that assert labels, for example the Assign To fields.
View full article
Attached is a sample model that tracks social distancing metrics. I just grabbed one of our testing models, so it's not necessarily eye popping as far as visuals, but the basic concepts of social distancing metric tracking are in there. This model is implemented in the new 20.2 beta. It uses the new Agent module to detect proximity between objects. I added a proximity system, and added each operator as an agent in the system. I created an object that draws a "heat map" where proximity points happen. This is a visual tool called "HeatMap" in the model. If you send a message to the object it will add a "hot point" at the location of the sending object. I implemented the object's OnReset, OnMessage, and OnDraw triggers to do this. Once the heat map is set up, I have the proximity system send a message to the HeatMap from the involved agent object as part of it OnEnterProximity trigger. Second, I do some statistical tracking using a statistics collector named ProximityTimes. This listens to the agent proximity system's OnEnterProximity and OnExitProximity events, and collects data accordingly. The trickiest part to setting this up was sampling the actual event. For now (hopefully we'll get a better system in the future) you have to sample the event in the tree. In the Events tab of the statistics collector, press the sampler button, then in the tree navigate to the node at MODEL:/ProximitySystem>variables/behaviors/Proximity Behavior and hover the cursor over it to get the list of events. The ProximityTimes statistics collector collects individual times. This allowed me to add the "Time In Proximity" dashboard chart. For the other charts, I needed a calculated table to aggregate the values. The ProximityAggregates table aggregates the data needed for the other three dashboard charts: Total Proximity Time, Proximity Count, and Average Time In Proximity. SampleSocialDistancing.fsm
View full article
Tokens and Flow Items can be very difficult to add to a chart. This is true because they don't exist on Reset, making them difficult to select. This article shows how you can use a Process Flow to allow a Statistics Collector to record a token's changing label value, and also to chart that value over time: The model for this example is attached (graphlabeldata.fsm). It is a very simple model: The Scheduled Source creates three tokens, each of which create a label called data. This label is created by choosing "Add Tracked Variable" for the value, which opens this dialog box: The reason we want the label to be a Tracked Variable is that Tracked Variables emit an OnChange event. We want to listen to that event. If you use the time interval collection method, discussed later in this article, you don't need to make the label a Tracked Variable. Each token then goes through a loop, where it waits, and then updates the value. This is meant to represent a much more complicated model, where the token travels through many activities, any of which could change its label value. For this example, the model randomly changes the value on the label. Now that we have a token and a label whose value is changing as the model runs, we can work on making a chart. We want to eventually make a Statistics Collector, but Statistics Collectors can only listen to events of objects that exist after the model has been reset. Tokens and FlowItems (along with their labels) are destroyed on reset, and so we can't listen directly to them. However, some Process Flow activities can listen to events on tokens and flowitems, and the Statistics Collector can listen to those events. For that reason, we make a second Process Flow: This flow has an Event-Triggered Source, which listens for tokens to leave the "Init Tracked Variable" activity in the first flow. When that happens, the source creates a token, and that token immediately gets a reference to the label node (note that this is different than the value of the label node). Next, the new token goes to a Start activity. The Start activity called "Log Change." This activity is just a placeholder. While you could technically live without this activity, it makes things a little clearer, as we will discuss later. Other than providing OnEntry and OnExit events, the Start activity has no internal logic whatsoever. After passing through the Log Change activity, the new token waits for the label value to change: In order to listen to this event, you can first sample a Tracked Variable in the Toolbox. This provides the OnChange event. Then you can update the Object field to the code shown above. Notice that every time this event happens, the token simply passes through the Log Change activity, and then resumes listening. When the original label value changes, it emits an OnChange event. When that event fires, the token listening to that even travels through the Log Change activity, which emits OnEntry and OnExit events. We can use these events in the Statistics Collector. The key to this technique is that we used Process Flow, which is good at listening to token and flowitem events, to generate Activity events, which can be used in the Statistics Collector. In the attached model, the first Statistics Collector is configured like this: It simply listens to the On Entry of the Log Change activity. The columns are defined as follows: The first two columns are simpler; the Time column uses the Model Date/Time option: The second column gets the ID of the token as an integer: The third column gets the current value of the Data label: Now that the Statistics Collector is set up, we can configure the chart to use this collector, and split by the Token ID. The process to record the label value every interval (rather than on every change) is very similar. The downside is that the data is less granular, but the upside is that a label doesn't have to be a Tracked Variable to be charted. The example model simply uses a Split activity to copy the data from the Event Triggered Source, and sends it to a similar listening loop: Instead of waiting for the value to change, the second token waits for a fixed time interval. A similar Statistics Collector will allow you to create the following chart: This approach works for every token created by the scheduled source. No matter how many tokens you create, each will show up on the chart:
View full article
FlexSim 2016 Update 1 is available. Download it from: https://www.flexsim.com/account/#/downloads 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 FlexSim 16.1.0 Added group commands (groupaddmember(), groupmember(), groupnummembers(), groupremovemember()). Global Lists will now update their Initial Content on reset when connected to a Group if the group's members change. Added support for the UPDATE clause in SQL. Added support for the RAND expression in SQL (uses stream 0 and will always be the same for a given query/row selection combo). Improvements to speed and memory usage when performing SQL inner joins. Tracked variables with type Categorical can now store arbitrary states. Added a Kinetic Level tracked variable type (e.g. Battery Level). You can now hold down the Alt key while clicking and dragging in the 3D view to ignore all objects. You can now resize objects while maintain their aspect ratio by pressing both the left and right mouse buttons down on a sizer arrow. Updated dashboard charts to support x-axis scaling. Added OnStop and OnResume events to 3D objects for use with event listening objects (Wait for Event and Event-Triggered Source in Process Flow). Video Recorder can now record Dashboards. Time Tables, MTBF/MTTR and User Events can now be disabled. Experiment variables can be set to enable/disable these objects. Fixed an issue with the VideoRecorder not loading properly. Fixed issues with windows and popups not opening on the correct monitor when using a multiple monitor setup. Fixed Fluid Conveyor throwing exceptions on reset. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Updated to OpenGL 3.1. Deprecated OpenGL functions, such as glBegin(), glEnd(), glVertex(), glNormal(), and glTexCoord(), may no longer work correctly on some graphics cards. You should instead use the mesh api. Changed the way that fixed resources (except the Combiner) receive items when they are being transported in. Previously, when they were notified that an item was being transported in, they would close their inputs and create an event to receive the next item. This would cause problems if the upstream objects had multiple items to send because their routing strategy would work differently when transporting vs not transporting. We have fixed this so that routing strategies will work the same when transporting as when not transporting. This may change the way that old models work because it changes the events that are created, and, obviously, it fixes routing strategy logic. menumain(), menubelow() and getviewmenu() have changed. Instead of returning a double, they now return a var. Any calls to these commands will need to be updated to use var or the value returned will be 0. double myMenu = getviewmenu(); Changes to: var myMenu = getviewmenu(); Conveyor Added Ports to the Entry and Exit Transfers. Added a Restart Delay setting to Conveyor Types. Fixed the Join Conveyors Tool when connecting conveyors with a custom conveyor type. Various bug fixes and improvements specifically with regards to items moving between conveyors and transfers. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Changed the way stopping a non-accumulating conveyor works when propogating stops to straddled conveyors. When a conveyor is stopped, it will act the same as if an item on the conveyor were stopped. Process Flow Added Preemption activities (Save Token Context, Release Token and Restore Token Context). Added gettokens() and getbatch() commands. Added Templates for Fixed Resource and Task Executer Process Flows. Added a Token Data to Preserve option to the Sink and Finish activities. In the Tokens window you can view Dead tokens and explore their data. Token Trace History is now stored as a label on the token. Added a Speed Type and Repeat Type to the Run Animation activity. A lot of improvements to the Zone. Updated the evaluation of the Return Value from the Finish activity so that executesubflow() can get a return value from multiple Finish activities. Added Activity Profiles to the token trace histories. Fixed a bug causing the Wait for Event to evaluate its Max Wait Timer even if the token left the activity. Fixed issues with the releasetoken(), createtoken(), and releasebatch() commands working differently when running vs stepping. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Changed the way that a token manually released (preempted) from waiting in a task sequence activity manages the task that it's waiting on. Now the task will be removed, and the task executer preempted if currently working on it. This may change older models that release tokens in task sequence activities. AGV Added Event info to AGVs and Control Points for use with event listening objects (Wait for Event and Event-Triggered Source in Process Flow). Added AGV templates to Process Flow. Fixed bug with way points not firing their OnArrival for redirected AGVs. Fixed issue with arrival waypoints not firing correctly with non-zero end speed travel tasks. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Fixed the order by which AGV trailers are attached to their AGV. This will affect old model trailer ordering.
View full article
FlexSim 2016 Update 1 Beta is available. Download FlexSim 2016 Update 1 Beta (updated 17 June 2016) 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 FlexSim 16.1.0 Added group commands (groupaddmember(), groupmember(), groupnummembers(), groupremovemember()). Global Lists will now update their Initial Content on reset when connected to a Group if the group's members change. Added support for the UPDATE clause in SQL. Added support for the RAND expression in SQL (uses stream 0 and will always be the same for a given query/row selection combo). Improvements to speed and memory usage when performing SQL inner joins. Tracked variables with type Categorical can now store arbitrary states. Added a Kinetic Level tracked variable type (e.g. Battery Level). You can now hold down the Alt key while clicking and dragging in the 3D view to ignore all objects. You can now resize objects while maintain their aspect ratio by pressing both the left and right mouse buttons down on a sizer arrow. Updated dashboard charts to support x-axis scaling. Added OnStop and OnResume events to 3D objects for use with event listening objects (Wait for Event and Event-Triggered Source in Process Flow). Video Recorder can now record Dashboards. Time Tables, MTBF/MTTR and User Events can now be disabled. Experiment variables can be set to enable/disable these objects. Fixed an issue with the VideoRecorder not loading properly. Fixed issues with windows and popups not opening on the correct monitor when using a multiple monitor setup. Fixed Fluid Conveyor throwing exceptions on reset. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Updated to OpenGL 3.1. Deprecated OpenGL functions, such as glBegin(), glEnd(), glVertex(), glNormal(), and glTexCoord(), may no longer work correctly on some graphics cards. You should instead use the mesh api. Changed the way that fixed resources (except the Combiner) receive items when they are being transported in. Previously, when they were notified that an item was being transported in, they would close their inputs and create an event to receive the next item. This would cause problems if the upstream objects had multiple items to send because their routing strategy would work differently when transporting vs not transporting. We have fixed this so that routing strategies will work the same when transporting as when not transporting. This may change the way that old models work because it changes the events that are created, and, obviously, it fixes routing strategy logic. menumain(), menubelow() and getviewmenu() have changed. Instead of returning a double, they now return a var. Any calls to these commands will need to be updated to use var or the value returned will be 0. double myMenu = getviewmenu(); Changes to: var myMenu = getviewmenu(); Conveyor Added Ports to the Entry and Exit Transfers. Added a Restart Delay setting to Conveyor Types. Fixed the Join Conveyors Tool when connecting conveyors with a custom conveyor type. Various bug fixes and improvements specifically with regards to items moving between conveyors and transfers. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Changed the way stopping a non-accumulating conveyor works when propogating stops to straddled conveyors. When a conveyor is stopped, it will act the same as if an item on the conveyor were stopped. Process Flow Added Preemption activities (Save Token Context, Release Token and Restore Token Context). Added gettokens() and getbatch() commands. Added Templates for Fixed Resource and Task Executer Process Flows. Added a Token Data to Preserve option to the Sink and Finish activities. In the Tokens window you can view Dead tokens and explore their data. Token Trace History is now stored as a label on the token. Added a Speed Type and Repeat Type to the Run Animation activity. A lot of improvements to the Zone. Updated the evaluation of the Return Value from the Finish activity so that executesubflow() can get a return value from multiple Finish activities. Added Activity Profiles to the token trace histories. Fixed a bug causing the Wait for Event to evaluate its Max Wait Timer even if the token left the activity. Fixed issues with the releasetoken(), createtoken(), and releasebatch() commands working differently when running vs stepping. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Changed the way that a token manually released (preempted) from waiting in a task sequence activity manages the task that it's waiting on. Now the task will be removed, and the task executer preempted if currently working on it. This may change older models that release tokens in task sequence activities. AGV Added Event info to AGVs and Control Points for use with event listening objects (Wait for Event and Event-Triggered Source in Process Flow). Added AGV templates to Process Flow. Fixed bug with way points not firing their OnArrival for redirected AGVs. Fixed issue with arrival waypoints not firing correctly with non-zero end speed travel tasks. Backwards Compatibility Note: the following changes may slightly change the way updated models behave. Fixed the order by which AGV trailers are attached to their AGV. This will affect old model trailer ordering.
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
Railworks 24.0.1 is now available (02 April 2024). This version of RailWorks is intended for use with FlexSim 2024. Railworks 2023.0 will become LTS, for any use cases with updated bug fixes use the latest 23.0 version available. If you are using RailWorks with FlexSim 2023 (LTS), please use RailWorks version 23.0.6 (LTS). If you are using RailWorks with FlexSim 2023 Update 2, please use RailWorks version 23.2.3. All versions can be found in the Downloads section of your FlexSim account on the 3rd party modules tab. Please do not hesitate to report any bugs, usability improvements and feature requests to dev@flexsimbrasil.com.br. Signal: New feature in railworks This new feature adds a 3D object called Signalized Rail, a track with signals that can control train traffic with precise speed changes, sight and safety distances for rail reservations and signal advances. You can configure signal aspects, sight distance and train safety distance with just this object.For more information read 3Dobjects. Importance of the Signal A signal in a railroad system is a way of controlling train traffic speeds, ensuring safety and maximizing the flow. There are different types of signals for different cases and countries, the most common being speed control signals on sections to prevent train collisions. These signals change their appearance in order to indicate a reduction in speed, and can have different aspects for different speed changes. This type of sign is the new railworks feature. About Railworks The FlexSim Brazil RailWorks module consists of premade custom objects, designed to represent a real environment for the Rail problem modeling, with less configuration. Our approach is to unite 3D modeling with the Process Flow functionality, allowing object configuration and visualization through the native 3D FlexSim solution, and the rail system events to be triggered by the Process Flow, using not only defaults FlexSim Process Flow activities, but also new ones developed by our team. Release Notes View the full release notes in the online documentation. RailWorks 24.0.1 (02 April 2024) Bug-Fixes All bug fixes in RailWorks 23.2.3 below. Features New object:Introducing signalized rails - tracks equipped with signs at their ends for improved traffic control and safety at critical network points. Learn more about signaled rails and practice using them on the 3D objects page. Feature:Take control of your rail network with the new rail signaling control feature. Configure aspect signals, customize their colors, set speed correspondences, and define safety or sighting distances for a more realistic train operation experience. Feature: New picklist options to set destination in MoveTrain and MoveWagon activities. RailWorks 23.2.3 (18 March 2024) Bug-Fixes All bug fixes in RailWorks 23.0.6 below. MoveWagon Label Control Improvements: Enhanced the user interface for the MoveWagon label control. OnPass Speed Alteration Fix: Compositions with wagons attached change speeds correctly and consistently. AssingTo labels on MoveWagon Fix: The creation of a new label works with individual wagons on MoveWagon. RailWorks 23.0.6 (18 March 2024) Bug-Fixes Consistent Parked Wagons Positioning: Wagons now position themselves alongside other wagons more consistently. Rail Reservation Logic Optimized: Improved logic for rail reservation to ensure smooth operation. Refined Rail Control Point Triggers: More precise behavior for RailControlPoint's onPass, onContinue, and onArrival triggers. Smoother Undo Functionality: Improved responsiveness and reliability of the undo function (Ctrl+Z). Automatic Brakes Optimized: Automatic brakes now stop on the correct rail for better train control. Wagon Creation Streamlined: Wagon creation now adapts its position automatically when placed on multiple rails. Copy & Paste Errors Resolved:Fixed exceptions that occurred during copy and paste operations. Train Creation Collisions Addressed: Inconsistent collisions during train creation have been eliminated. Enhanced Locomotive Interaction: Improved interaction between compartments and leading locomotives for more realistic behavior. Departure Rail Control Point Fix: Fixed an issue where moving a wagon wouldn't release the departure Rail Control Point. Automatic Braking Refined: Improved automatic braking for scenarios with low acceleration and high speeds. Multiple Rail Braking Enhanced: Resolved issues with braking zones spanning multiple rails. Limited Station Parking: Locomotives destined to a Station no longer allowed to enter while occupied. Better Composition Positioning on Curved Rails: Movement on CurvedRails is now smoother. Added Locomotive and Wagon icons to FlowItemBin. Modelling fixes: Preventive fixes to improve modelling experience. Performance Enhancements Faster Rail Connections: Optimized rail automatic connection for improved performance. MoveWagon Streamlined: Object selection offers more consistent behavior when detaching wagons from larger compositions. Streamlined ConnectPoint Creation: Made changes to ConnectPoint creation for better performance. Optimized Pathfinding: Enhanced path discovery algorithms to improve overall performance. Status Window Consolidation: Review and behavior correction of status bubble on flowitems and task executers.
View full article
Top Contributors