Simio Reference Guide
Simio Reference Guide
Welcome
Refer to the Appendix for the License Agreement, and Academic and Runtime Use Policies. There are links on the bottom of
each page that allow you to send us feedback about the content. This book accompanies Simio software version 12.205.21521.0
1 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
2 / 1277
Simio Reference Guide
Contents of Documentation
Welcome
Simio Product Family
Getting Started
User Interface
Simio Concepts
Object Hierarchy
Object Types
Processes
Projects and Models
Queues
Tokens and Entities
Learning Aids
SimBits
Modeling in Simio
Navigation
Project Window
Model Windows
The Facility Window
The Processes Window
Steps
The Definitions Window
Elements,Properties,States,Events,Lists,Tokens,ExternalConsole
The Data Window
Tables,Schedules,Changeovers
The Results Window
Interactive Verses Experiment,Pivot Table,Reports,Exporting
Standard Object Library
Project Library
Assigning States
Secondary Resources
Add-on Process Triggers
Reliability
Creating New Objects
Animation
Expression Editor, Functions and Distributions
Running the Model
Experiments
Controls orResponses and Constraints
Analysis - Experiment Properties
Experiment Response Chart ( SMORE Plot)
OptQuest Add-In
Scenario Subset Selection
Select Best Scenario Using KN Add-In
An Example Model with an Experiment
Model Summary Report
Custom Simio Extensions (i.e. Custom Steps and Elements)
3 / 1277
Dynamic Selection Rules
Protection
Appendix
System Requirements
Installation Instructions
Check For Updates
Academic Use Policy
Run Time Capability
End User License Agreement
4 / 1277
Simio Reference Guide
5 / 1277
Simio Reference Guide
Getting Started
Understanding the Simio Modeling Approach
Before you begin to build your first model with the instructions below, you might want to first familiarize yourself
with the basic Simio Concepts since modeling in Simio is based on an object orientated approach, which might be
different than other modeling software programs you have used in the past.
After Dropping a Source, Server, and Sink into the Facility Window
Your next step is to connect the objects. The diamond shapes on the objects are called Nodes. They represent places
that Entities can enter and leave. Although we won’t be changing anything now, to review or change Node
properties, you may click on the diamond shape and you will see its properties appear in the Properties Window in
the bottom right side of the interface. Node properties are used to specify Entity destination and Transporter
selection logic. Selecting a node in the Facility Window is a bit different from other objects because there are three
modes of selection. The first two are common to most objects, the third is unique:
• Click – Selects Node and displays its properties
• Click and drag – Moves the Node to a different screen location. Note that it is still “attached” to it associated
object if any (for example, a Server), and if that associated object is moved, the Node position will also change.
• Ctrl+Shift+Click and move – Initiates the creation of a Link between Nodes. The Link type may be preselected in
the library panel (as described in third paragraph below)or it will be prompted for when the Link is terminated by
clicking on a Node (as described immediately below).
We will now connect the objects with Paths. Press and hold the Ctrl and Shift buttons on the keyboard while clicking
the left mouse button on the Transfer Node of Source1. Move the cursor to the left Node of Server1, and click the left
mouse button again. A menu will appear to select the Link type, select Path.
Selecting the Path option after drawing a Link between two objects
6 / 1277
Now press the Ctrl+Shift buttons and click the left mouse button on the right Node of Server1. You may place mid-
points for the connection by clicking various places in the Facility Window, or you can finish the connection by
clicking on the Node of Sink1. If you change your mind about where you are placing the line before finishing the
connection and want to remove the connection altogether, then click on the right mouse button. A menu will appear
for you to select the Link type, select Path.
There is another method to use if you want to place Links. Click on the Link type of your choice in the Standard
Library and then you can left click on the Nodes of your choice. See the circled items in the following screen shot:
Double clicking on an object, such as a Path, will put you in a mode to apply that action multiple times sequentially.
For example, double clicking on the Path will allow you to connect the Source to the Server and then the Server to
the Sink without selecting it again from the library. This is the case with all of the Standard Library objects, as well as
many other items in the user interface.
Congratulations, you have built your first Simio model! If you would like to save your model/project, click on the File
tab at the top left corner of the main Simio window. Then select the Save As item from the Backstage view. Use the
Windows Explorer window to complete the saving of your file. Note: There is an alternative way to add a standard
Source, Server and Sink into the Facility Window. It was important to teach you the manual steps as a learning
process, but as a time saver for the future, you can simply select the Source/Server/Sink option from the Actions
(Add-Ins) icon on the Project Home ribbon. This will add these three objects all connected by Paths.
Now you can click on the Run button located on the Project Home tab to run your model.
See the User Interface help topic for additional information on how to navigate through Simio's User Interface.
7 / 1277
Object and Element Name Identifiers
When naming Objects within the Facility window of a model (such as Source, Server, Sink), as well as Elements within
the Definitions window (such as Properties, States, Materials), there are certain naming conventions that should be
used. In Simio sprint 156 and prior, all names were required to start with a letter and could contain letters, digits and
underscores. In Simio sprint 157+, names may begin with a number. They may still contain letters, numbers and
underscores, but may not resolve to an absolute number. For example, the Name of a Server can be '123ABC' but
may not be '123'. Note that a name such as '3e4' is not allowed as it exponential notation for 3 x 10^4.
Simio has a number of available characters that are valid, such that all Unicode uppercase and lowercase letter
categories as well as others are supported. (As an example, here is a listing of the Unicode lower case letter category
http://www.fileformat.info/info/unicode/category/Ll/list.htm).
Queues in Simio
Queues can be found in many different places throughout Simio. Some queues are animated by default, such as the
Station queues associated with the Standard Library objects, but others are not. To learn more about which queues
exist in Simio and how to animate a queue, visit the Queues help page.
Adding Plots, Gauges, Stacked Bars or Status Labels to View During an Interactive Run
Plots, Gauges, Stacked Bars or Status Labels can be added to a model so the user can have a dynamic view of how
the object's state changes over time. The Console Window is where the user can place displays that will report the
status of an object during the run. These objects can also be placed in the Facility window and the External panel and
attached to objects in the Facility window.
8 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
9 / 1277
Simio Reference Guide
User Interface
The File Tab
The File Tab in the top left corner of the interface, is where the user can open, close or save a new project. The most recent
projects can be found here as well. The New From Template option is available for opening a project template which may
consist of existing tables and/or objects. The Licensing option is available for loading, removing or changing a Simio
license. See section below on Application Settings for more information on the Settings option.
File Tab
The Ribbon
The Ribbon contains multiple ribbon tabs and within each tab there are groupings of icons, or panels. The ribbon tabs that
are visible vary depending on which window the user is viewing in the main part of the application. Below are a few of the
ribbon menus.
10 / 1277
used for viewing and editing properties of selected types of objects. The Render to Oculus icon enables or disables
rendering the active 3D view to an attached Oculus HMD device.
When the Project is selected and highlighted, the Project window is displayed. This window lists all the models that exist
within this project. By clicking on the panels on the left side of this window, the user can view the Experiments, the Symbols,
the Textures and the Path Decorators that exist within this project.
The Properties Window: Viewing and Changing the Properties of an Object
To view the properties of a particular object in the Facility window, click on the object and you will see the object's specific
properties in the Properties window. Each object has properties that control its behavior; e.g. the Source has an inter-arrival
time, the Path has a property to control entity passing, and the Server has a processing time.
Prior to Simio sprint 169, Simio provided a Show Commonly Used Properties Only checkbox at the top of the Properties
window. When this mode was enabled, the display was limited to the key set of properties that defined the core behavior
of each object. Many standard features such as failures, state assignments, secondary resource allocations, financials, and
custom add-on process logic that are provided by the Standard Library objects were not displayed. This mode is no longer
available, thus all properties for objects are displayed.
The Properties Window: Viewing and Changing the Properties of a Model
The properties of a model can be accessed by selecting the appropriate model within the Navigation window, right
clicking and choosing Model Properties.
Model Properties
The Properties Window: Viewing and Changing the Properties of the Project
The properties of the project can be accessed by selecting the project name within the Navigation window, right clicking
and choosing Project Properties. Project properties include important information such as the Date Saved and Saved in
Version.
Project Properties
11 / 1277
Right Clicking in The Facility Window
Right clicking on an object in the Facility Window brings up a menu allowing the user to add a Breakpoint to the object or
to open the Console window for that object. Depending on the type of object, the user will have different options.
For example, right clicking on a Vehicle or Worker object allows the user to Add To Transporter List. Right clicking on a
Node or group of Nodes allows the similar option to Add to Node List. Nodes also have an option for Binding to other
nodes (see External Window page for more information on binding and hierarchy).
Right clicking on a link provides options to add or remove this link from a network, change the starting or ending node or
convert this link to a different type of link. The link can be added to any networks that currently exist or the user can create
a new network from this menu. Allowing the user to change starting/ending node or convert the link to a different type of
link with a simple right click allows the user the ability to change the model logic quickly and easily. See Animating Links
page for more information.
All objects have the right click option for converting to a different object, such as Server to Combiner or BasicNode to
TransferNode. A connected object will give fewer options than an unconnected object as Simio keeps any links between
objects. See the Converting Objects page for more information.
The right click on fixed and agent objects, such as Server, Combiner, Worker, or Vehicle, for example, also provides the
option to 'Create Object From This'. This will create a new subclassed object of the object type, load its default values with
the values from the properties of this object and replace the object with an instance of the new subclassed object. The
subclassed object will be placed within project Navigation window and may placed again in the model by using the
project window. Subclassed objects that are created in the manner will then also have the option to 'Update ** Property
Defaults From This' to update any changed property values. See the Creating New Objects page for more information.
In addition to being able to set breakpoints and watch objects through the Right click menu, the options to make the
object 'Externally Visible', as well as to 'Resize to Graphic Size' are also available for selection. When an object is 'Externally
Visible'('on' as a default), it is visible within the External window and will be seen if this object is used in hierarchy. The
'Resize to Graphic Size' is available when the graphic for the object has been changed from its original size. The 'Resize to
Graphic Size' can be used to resize the object graphic(s) to the original size(s). This is useful in hiearchical models as well,
as if an object in hierarchy has been changed such that the External view of the object is different, any models with that
object in it will be sized based on the original object. The 'Resize to Graphic Size' can be then used to restore objects to
their original sizes.
If an object's symbol has been changed from its default symbol to another graphic symbol, the option to 'Apply External
View Symbol' is made available through the right click menu. This will change the new symbol back to the original symbol
as defined through the External View of the object.
12 / 1277
The Grid System
The Grid system that is available in the Facility Window, the External Window and the window that is displayed for a New
Symbol, has tick marks as well as labels to help you figure out spacing and placement. In Simio's grid system, one unit = 1
meter. Simio’s grid displays labels of tens and then as you zoom out, it displays labels by hundreds. Continue zooming out
and it will display kilometers. The zoom function is performed by right clicking within the grid and moving the mouse up
and down. Or if you have a mouse with a scroll wheel, simply spin the wheel up or down for standard zoom in or out. Using
the Alt+Scroll wheel provides 10x finer zoom than the standard scroll wheel zoom.
Arranging the Windows
It is possible to display multiple windows such as the Facility window and the Processes window at the same time. In order
to access these windows and organize them as you desire, start by right-clicking on the tab of any window. A drop down
menu will appear. In the example below, the Facility window was hidden behind the Process window because the user is
working in the Processes window, which is the default behavior. Upon right clicking at the top of the Processes model tab,
the user selects New Vertical Tab Group.
Multi-Select
Simio supports Multi-select in the Facility window, as well as the Console and External windows of the Definitions tab.
Multi-select allows users to select multiple objects for the purpose of moving, copying and/or deleting them. Ctrl+click and
drag in free space will do a box select, meaning it will select all objects within the box. Ctrl+click on any object adds (or
removes) it to the selection set. While multiple objects are selected, they may be moved, copied or deleted.
Multi-select is also very useful for editing similar properties of objects within the above specified windows. Multi-select is
also available within the Processes window for selecting Steps for the purpose of property editing. You can select multiple
objects and the intersection of their set of properties will appear in the Properties window. If the objects share values for a
property, the value will show up, otherwise the value will be blank. This feature is useful for editing multiple items, such as
selecting multiple conveyors and changing the desired speed, selecting multiple links and changing them to bidirectional
or selecting several transfer nodes and changing the transport logic to ride on a given vehicle. The Properties Spreadsheet
Window is also useful for making edits to multiple objects and is available for the Facility window objects, as well as for the
Processes window processes and steps.
13 / 1277
Simio also supports Ctrl-X (Cut), Ctrl-C (Copy) and Ctrl-V (Paste) for all of the items on the Drawing and Animation
Ribbon tabs, as well items within the Facility and Process Windows. Ctrl-D (Delete) is currently supported only within the
Facility window.
Undo / Redo
Simio supports comprehensive undo and redo capability across the product to make it easier to safely explore and to
recover from any accidents. The Undo and Redo buttons are located on the quick access toolbar on the upper left. Ctrl-Z
and Ctrl-Y also work.
ShortCut Keys
14 / 1277
Understanding the Content of the Windows
If you would like more information on where to find something in the interface, visit the Windows page to learn what can
be found in each Simio Window, such as the Facility Window, the Definitions Window, the Processes Window, etc.
Application Settings
Within the File menu is a Settings option which will open the Application Settings window as shown below. The window is
divided into separate categories.
The Graphics grouing includes the Graphics Type, which indicates the graphics driver to use for 3D display. Changes in this
setting will take effect the next time Simio is started. General selections (like DirectX) will automatically choose a specific
implementation (like DirectX9 or DirectX11). The DirectX Rendering Device indicates the type of graphics driver to use for
the 3d display. The Compressed Texture Hardware Support indicates if hardware support for compressed textures should be
used. The 'Auto' setting will disable it for known bad graphic drivers. Users can manually enable or disable the hardware
support for compressed textures. Changes to this setting will take effect the next time Simio is started. The Hardware
Instancing Draw Support setting indicates if hardware support for instanced drawing should be used. Instanced drawing
improves performance by making less draw calls for repeated geometry on the screen. The 'Auto' setting will disable it for
unsupported hardware. The Anti-aliasing Support setting indicates if hardware support for anti-aliased drawing should be
used. Anti-aliased drawing improves the visual fidelity of what is drawn at the expense of performance and memory. The
'Auto' setting will disable it for potentially weaker or unsupported hardware or graphics types (i.e., this is enabled for
DirectX11 by default and disabled for everything else). Changes to this setting will take effect the next time Simio is
started. The Hardware Skeletal Animation option indicates if hardware support for skeletal animation should be used.
Hardware skeletal animation can offload the processing needed for skeletal pose animations (like walking people) to the
GPU. The 'Auto' setting will disable it for potentially weaker or unsupported hardware or graphics types (i.e., it is enabled
for DirectX11, disabled for others). Changes to this setting will take effect the next time Simio is started.
This window also includes a Libraries grouping which allows the user to specify whether or not to Load Standard Library
and/or Load Flow Library upon opening Simio. By default, these libraries are both loaded. The Additional Libraries To Load
option may also be indicated and may include a semi-colon separated list of fully qualified path names to additional
libraries to load when opening a model.
The Simio Portal grouping includes the Simio Portal URL property, which determines the URL for the Simio Portal
installation. For example, "https://mysimioserver". Portal functionality is only available for Simio RPS Edition.
The Experimentation grouping provides a place for a user to specify a list of addresses where Simio will look to find
replication runners to be used with distributed runs in an experiment. This is useful if the replication runners you have will
not work with the automatic WS-Discovery protocol or if you are connected via VPN. To enter an address, open the repeat
group window for the Replication Runner Addresses line and type in the computer name or address and port where the
Simio Replication Runners exist.
The GUI grouping includes the option to Restore Docking Window Locations in the software. If set to true, Simio will
attempt to restore the top level docking windows to the same location they were when Simio last shut down. It also
includes the ability to Display Deprecated Steps In Processes Windows Panels. When this setting is changed, it will require
closing and re-opening Simio if the Processes window had already been opened. The option to Display Deprecated
Properties in Properties Window is also available. This grouping includes the ability to Display Deprecated Object Or
Element Types, where a change may require restarting Simio. Finally, this GUI grouping includes the Font Scale (percentage)
indicating how much to scale the fonts used in various parts of the UI. A value of 100 is the default size, while using a larger
size may help when using the UI on a projector in front of large groups.
The Workflow grouping has the option to Start In Scheduling Mode. If this option is set to true and Simio is opened with a
license that supports it (Simio RPS (Enterprise), for example), Simio will open in 'scheduling mode'. If you change this
option, you have to restart Simio for it to take effect. Users can also use the -start-in-scheduling-mode command line
option.
The Runtime grouping includes the option to Use Scheduled Breakpoints, which, if set to 'True', the breakpoints will be
scheduled onto the event calendar, instead of suspending the run directly. Enabling this may make runs with breakpoints act
differently than runs without breakpoints.
The Add-ins grouping has an option that was added to Sprint 154 for compatability reasons, which will Allow Add-ins To
Create Properties With Invalid Names (i.e., such as those with spaces). This option is set to false by default.
The Project Recovery grouping was added to Sprint 187 and includes two options. Minutes Between Recovery Save
indicates the number of minutes between automatically saving the active project for recovery. A value of '0' indicates that
no recovery saves should take place. Save For Auto-Recovery Before Run, if set to 'True', will save the active project for
recovery before the start of an interactive or experiment run. Project Recovery is used to restore potentially lost work after
an unexpected Simio shutdown, such as an unexpected computer shutdown. A notification in the bottom right corner of
Simio will be shown when autosaving. If Project Recovery is used, then when opening Simio after an unexpected Simio
shutdown, the user will be asked if the recovery file should be used. Clicking OK opens the recovery save, saves it in a new
file named [ProjectName]_Recovered, and deletes the recovery save. Clicking Cancel keeps the recovery save. Users can
explicitly delete them by deleting the contents of the %localappdata%\Simio\Recovery directory, where %localappdata%
is configured on most systems to be C:\Users\[user name]\AppData\Local. As of Sprint 200, if the user clicks Cancel on
opening the recovery save file, a dialog will then prompt for deleting the project recovery save data.
15 / 1277
Simio Reference Guide
Search Window
Searching the Model
The Search icon within the Project Home window opens up the Search window to allow the user to search for any given
text string.
When you type something into the Search window’s text box, the window will display everything that it finds that contains
that text. There are four columns in the search results:
“Value” is the actual piece of text containing the search string, with the search string highlighted.
“Item” is the name for this piece of text; i.e. “Name” if it is the name of some object, or “Time To Repair” for a
property.
“Object Name” is the object containing the piece of text.
“Project Item Name” is the top-level model containing the object.
Double-clicking on a row in the results will take the user to the window containing the item where the text is found, select
the item, and then (if possible) select the property where the text is found. If the text found is a property value and that
value is currently switched out, the user is simply taken to the item that contains that value. Currently, the Search window
will search “Simio property” values (that is, property values on Steps, Elements, Processes, Object Instances), and Object
names (where “Object” refers to any of the things a user names, such as aforementioned, but also the object in the
Definitions, and Data windows). Search is not yet supported in Schedule item text, Changeover matrices, or Lookup / Rate
table values.
The columns within the Search window can be manipulated to sort and rearrange, as well as to filter them. To use this, click
the filter glyph in a column header, and select an option from it.
When filtering, only those rows matching the filter criteria are displayed, and a filter bar appears the bottom.
The user may also right click on a column to sort, group or filter items in the column.
16 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
17 / 1277
Simio Reference Guide
When the Properties Spreadsheet window is first opened, the 'Click here to select an object type' button in the top right
may be used to select from a list of objects currently in the Facility window, Process names within the Processes window or
Steps within the Processes window.
Within the Facility window, for example, if the model has a Source, two Servers and a Sink, connected by multiple Paths, the
list of objects will include Source, Server, Sink, BasicNode, TransferNode and Path. Click on the object type to view a list of
those particular objects in a spreadsheet format. Alternatively, if you have a particular object highlighted within the Facility
window (i.e., such as a Server), if you right click on that highlighted object you will see the option to 'Open properties
spreadsheet view for all objects of this type...' which will present those objects in the window.
Similarly, within the Processes window, if the model has multiple steps, the list of possible steps may be accessed using the
'Click here to select an object type' and selecting the particular step type desired. Alternatively, right-clicking on a
particular type of step, for example an Assign step, will open the properties spreadsheet for all Assign steps in the model
for editing. Ctrl-click of multiple steps in the Processes window also allows editing of similar properties of those steps
through the Properties window on the right.
Within the Properties Spreadsheet window, you can edit single property entries for a given object or copy/paste values into
multiple columns. To select multiple entry rows, you may click a row, then use Ctrl-click to highlight additional rows –
editing of multiple rows simultaneously can continue to be done within the Properties window on the right.
The columns within the Properties Spreadsheet window can be manipulated to sort as well as to filter them. To filter, click
the filter glyph in a column header, and select an option from it.
18 / 1277
When filtering, only those rows matching the filter criteria are displayed, and a filter bar appears the bottom.
The user may also right click on a column to see the sort arrow for displaying items in the column alphabetically.
Right-clicking on a particular object's row (i.e., such as Server2 in a list of Servers) will highlight and allow you to 'navigate
to' that particular object within the Facility or Processes window.
19 / 1277
Simio Reference Guide
Converting Objects
Convert To Type
Within the Facility window, the right-click option on an object allows the user to select 'Convert To Type' to convert the
current object to a different object of a similar class. For example, a Path may be converted to any other type of 'Link' class,
such as Connector, TimePath, Conveyor, FlowConnector or Pipe.
There are several rules that Simio uses to determine how to convert the data within an object from one object to another.
Let's take the conversion from a Server to a Combiner for example. When 'Convert To Type' is used, Simio will look for a
common base class between the From (Server) and To (Combiner) object (in this case Fixed).
For each property of that base class:
1. If the from object has a different value than its default value, copy the value over to the to object.
2. If the to object has a value equal to its default (it should, it's a new object), and the to object does NOT have type
information (i.e. does NOT contain something like "Server.Whatever"), and the from object DOES have type
information, then do NOT copy the value over. Simio assumes this means that the from object has type information
for which the to object makes no sense.
3. If the to object has any type information, do NOT copy value over. Simio assumes it is there for a specific reason and
so that information is kept.
4. Otherwise, if the from value and to values are different, and they are both switched and visible, copy the value over.
20 / 1277
Simio Reference Guide
Oculus Support
Render to Oculus button found on the Project Home ribbon will enable or disable rendering the active 3D view to an
attached Oculus HMD device. Simio supports the Oculus Consumer Edition but currently does not support Oculus Touch
controls.
In order to use the software with an Oculus HMD devide, Simio must first be run in DirectX 11 or OpenGL mode. This can
be set by going to File > Settings and changing the Graphics Type (under Graphics heading). You may also have to
explicitly specify the device the Oculus is attached to in File > Settings > DirectX Rendering Device. When running under
DirectX 11, a list of possible device names can be found in the Simio3DStatus.log file in the "My Documents" directory, on
the line starting "Available rendering devices are". Simio must be restarted for any graphics changes to take place. Users
may have to go to the Oculus Home app and enable "Unknown Sources". On certain multi-GPU setups, like Optimus, users
may need to start Simio by running it under a specific GPU. Under Optimus, this can be done by right-clicking on Simio
and selecting "Run with graphics processor" and selecting the one in which Oculus is using. On more advanced GPU setups
(for example, laptops with both integrated and discrete GPUs, plus an external GPU), you may need to disable one or more
of those GPUs in windows Device Manager to get multi-gpu runtimes like Optimus correctly assigning Simio to the GPU
the Oculus is attached to.
Since the Oculus view in Simio is simply a view, no simulation modeling can be done in this mode. To move around in the
Oculus view, the desktop 3D view should be focus (users may need to click in it), and then the following keyboard controls
may be used:
W – Forward
S – Back
A – Strafe left
D – Strafe right
Q – Turn left
E – Turn right
R – Rise (in elevation)
F – Fall (in elevation)
V – Reset elevation
Users with an XInput controller plugged in ( Xbox 360, Logitech F310, etc.) may also use the following movement controls:
21 / 1277
Simio Reference Guide
Simio Concepts
The Simio Object Paradigm
Simio is a SImulation Modeling framework based on Intelligent Objects. This may be a bit different than other simulation
packages that you may be familiar with, even those that market themselves as object oriented. Simio is designed from the
ground up to support the object modeling paradigm; however it also supports the seamless use of multiple modeling
paradigms including a process orientation and event orientation. It also fully supports both discrete and continuous
systems, along with large scale applications based on agent-based modeling. These modeling paradigms can be freely
mixed within a single model.
The intelligent objects are built by modelers and then may be reused in multiple modeling projects. Objects can be stored
in libraries and easily shared. A beginning modeler may prefer to use pre-built objects from libraries; however the system is
designed to make it easy for even beginning modelers to build their own intelligent objects for use in building hierarchical
models. An object might be a machine, robot, airplane, customer, doctor, tank, bus, ship, or any other thing that you might
encounter in your system. A model is built by combining objects that represent the physical components of the system. A
Simio model looks like the real system. The model logic and animation is built as a single step. An object may be animated
to reflect the changing state of the object. For example, a forklift truck raises and lowers its lift, a robot opens and closes its
gripper, and a battle tank turns its turret. The animated model provides a moving picture of the system in operation.
Objects are built using the concepts of object orientation. However unlike other object oriented simulation systems, the
process of building an object is very simple and completely graphical. There is no need to write programming code to
create new objects. The activity of building an object in Simio is identical to the activity of building a model – in fact there
is no difference between an object and a model. This concept is central to the design of Simio. Whenever you build a
model it is by definition an object that can be instantiated into another model. For example, if you combine two machines
and a robot into a model of a work cell, the work cell model is itself an object that can then be instantiated any number of
times into other models. The work cell is an object just like the machines and robot are objects. In Simio there is no way to
separate the idea of building a model from the concept of building an object. Every model that is built in Simio is
automatically a building block that can be used in building higher level models.
Each object in Simio has its own Processes, Elements, Properties, States, and Events. It also has an External view, which
determines how the object will appear when placed into another model in the Facility Window of another model.
Therefore, each object found in Simio’s Standard Library has its own Processes, Elements, Properties, States, Events and
External View. And since the main model is also an object in itself (a fixed object type), it also has it’s own Processes,
Elements, Properties, States, and Events.
When a user is working with multiple models within a project, it is important to remain aware of which model is the current
active model. This can be found by looking in the Navigation window, found in the top right side of the interface, and
finding the highlighted model. This is the active model. This means that the windows which are displayed in the main part
of the interface are the windows associated with that active model. To view the windows for a different model, simply click
on the appropriate model in the Navigation window and you will see a different set of tabs(windows) in the main part of
the interface. The following image shows the model tabs for the active model called SubModel.
Even though each object within the standard library has its own Processes, Elements, Properties, States, and Events, the user
cannot see those components of the object. Simio hides these details to prevent the user from making any changes to the
logic of the standard objects. The standard objects were built to provide standard functionality that will meet most basic
modeling needs, so hiding the details of these objects brings simplicity. If the user would like to see the Processes,
22 / 1277
modeling needs, so hiding the details of these objects brings simplicity. If the user would like to see the Processes,
Elements, Properties, States, and Events of an object, they would need to subclass the object from the standard library into
their own Project Library. Once the object is in the Project Library, the model windows of that object can now be viewed by
making it the active model in the project, which is done by selecting the model in the Navigation window. This is where the
user could see the Processes of any standard object (from the Processes Window) or the States and Properties of each
object (from the Definitions Window). Now that the object is part of the Project Library, it can be modified (i.e. new
properties, new states, new tables, etc). If the user would like to modify a Process, they first need to select the Process from
within the Processes Window and click on the Override button in the Ribbon. By overriding a Process and making changes,
the user is changing the logic that Simio put into this object to make it work as it does in our Standard Library.
View the Object Hierarchy
Read about the different Object Types that exist in Simio and examples of each
Read about Processes, what they are and how they can be used in your model.
Read about Projects and Models and the difference between the two.
Read about Queues and see where they exist in the product.
Read about Tokens and Entities and how they differ.
23 / 1277
Simio Reference Guide
Object Hierarchy
What is an Object?
Simio employs an object approach to modeling, whereby models are built by combining objects that represent the
physical components of the systems. An object is a self-contained modeling construct that defines that construct's
characteristics, data, behavior, user interface, and animation. Objects are the most common constructs used to build
models. You've already used objects each time you built a model using the Standard Library --- the general-purpose set of
objects that comes standard with Simio.
An object has its own custom behavior that responds to events in the system as defined by its internal model. For example,
a production-line model is built by placing objects that represent machines, conveyors, forklift trucks, and aisles, while a
hospital might be modeled using objects that represent staff, patient rooms, beds, treatment devices, and operating rooms.
In addition to building your models using the Standard Object Library objects, you can also build your own libraries of
objects that are customized for specific application areas. And you can modify and extend the Standard Library object
behavior using process logic. Refer to Simio Concepts for additional information on the specifics of an object.
Object Hierarachy
One of the important and unique internal design features of Simio is the use of a three tier object structure that separates
an object into an object definition, object instance, and object realization.
Object Hierarchy
Object Definition
An object definition is a Library Object that is supplied by Simio or created by the Modeler. An object definition is just
that - a definition of how the object is to act by making use of specific Processes, Events, States, and Properties that work
together to define how the object interacts with Entities and other Objects. An object definition specifies the behavior of
that object and is shared by all instances of the object in all models in which it is used. Object definitions reside in a library,
either the Standard Library, a custom library, or a project library. New object definitions can be made by selecting New
Model and selecting the class of model to be built. Alternatively, a new object definition can be generated by ‘sub-classing’
an object from an existing library object.
24 / 1277
Vehicle Definition (Properties)
Object Instance
An Object Instance is simply an occurrence of an Object Definition within a parent object, such as a model or another
object definition. This is what you get when you place a definition into the Facility window.
In the SimBit example below, the ‘model’ (which is an object definition), contains a number of object instances within the
Facility window. Each Server (Server1, Server2, and Server3) is an Instance of the Object Definition named ‘Server’.
Similarly, Source1, Sink1, all Paths, Vehicle1, and all Input/output Nodes are all Instances of Source, Server, Path, Vehicle,
BasicNode, and TransferNode Object Definitions.
Each instance of an Object Definition is differentiated by customizing property values and/or creating Add-On processes
within the Instance. In this example, each Server has a different Processing Time property value. Also, some TransferNodes
have Ride on Transporter set to True while others are set to False. This instance data is in turn shared by all object
realizations.
SimBit 'DynamicallyCreatingVehicles'
25 / 1277
Object Realization or Object Runspace
Once a simulation run is started, Object Instances are represented with object realizations. Object realizations hold the
state values for that object instance. Each realization of an object instance is unique because of its unique combination of
state and function values.
All objects have a fixed runspace. A fixed runspace is the physical X,Y,Z location where an object instance is created once a
run is started and is located where the object instance was placed in the Facility window. Dynamic Objects are created at
this location and then are transferred to another location. Below, Vehicle1’s fixed runspace is located at the bottom left
hand corner of the screen, the stationary vehicle labeled Vehicle1.
In the case of dynamic objects, there is also a dynamic runspace created to represent the number in system for a particular
object instance. Each dynamic runspace has independent values for states and functions. You can see the three dynamic
runspace instances of Vehicle1 moving throughout the system. Each of these three vehicles have different X,Y,Z locations,
they are doing different tasks – one of them is going to pick up an entity while another is carrying an entity to its
destination – and therefore have different values for their Destination, RideStation.Capacity.Remaining function, etc.
In summary, the Vehicle Object Definition is the “Model” supplied with the Simio Standard Library. It is the collection of all
the Properties, States, Event, Processes, Elements, etc. that make a Vehicle act the way the standard Vehicle acts in your
model.
The Vehicle Object Instance is Vehicle1 that is shown in the bottom left hand corner of the Facility window. This is where
the properties such as Desired Speed, Initial Ride Capacity, Task Selection Strategy, etc. are specified. These property
values further shape this Vehicle’s behavior to represent the behavior of the vehicle the user is trying to represent.
26 / 1277
When you run the model, it will create a static runspace (or realization) to represent the states common to all Vehicle1s
(such as Population.NumberInSystem). It will also create a dynamic runspace for each of the three vehicles that are in the
system. Each one of these vehicles has different values for Location, Heading, Pitch, NumberRiders, TimeCreated, etc. that
differentiates that Vehicle from the others. These can be then referenced by Vehicle1[1], Vehicle1[2], and Vehicle1[3].
27 / 1277
Simio Reference Guide
Object Types
There are six basic classes of intelligent objects in Simio:
Fixed Intelligent Typically used to represent an entire system being modeled (e.g., the plant), or
Object component objects within a system that have a fixed location (e.g., machine, equipment,
work cells). A Fixed object has a stationary location within the Facility Window. It is
typically used to represent an entire system being modeled (e.g., the plant), or
component objects within a system that have a fixed location (e.g., machine, equipment,
work cells). Examples of fixed models include Source, Server, and Sink, in the Standard
Object Library, as well as the Link and Node.
Agent Intelligent Adds behaviors for modeling objects that can be dynamically created and destroyed,
Object are able to move in continuous space or discrete space (on a grid), and which can
detect, chase, and intercept other objects. This type of model is particularly useful for
agent-based modeling approaches in which a large number (perhaps many thousands)
of independently acting agents interact to create the overall behavior of the system. In
the current version of Simio, a user cannot add a new Agent Class object types.
However, both Entities and Transporters are derived from the Agent Class object type.
Entity Agent Adds behaviors for modeling objects that can follow a work flow in the system,
including the ability to use a network of links to move between objects, the ability to
visit, enter, and exit locations within other objects through nodes, and the ability to be
picked up, carried, and dropped off by transporter objects. An Entity object can be
dynamically created and destroyed and can move into and out of Fixed objects. Entities
can have multiple graphical symbols. An example of an Entity model is the default
ModelEntity that is automatically added with the first Fixed model of the Project.
Transporter Agent A transporter object is a special type of entity that can pickup entity objects at a
location, carry those entities through a network of links or free space, and then drop the
entities off at a destination. A transporter object also has the ability to move off of a
network while maintaining association with a node on the network (i.e., “park” at a node
in a network). Examples of a transporter model are the Vehicle and the Worker in the 28 / 1277
in a network). Examples of a transporter model are the Vehicle and the Worker in the
standard library.
Link Fixed Adds behaviors for modeling fixed objects that are pathways for entity/transporter
movement. A link object has a length which may be separated into equally spaced
locations (cells), must have a start node and end node, and is a member of one or more
networks. A Link object transfers an Entity over a pathway defined by a polyline
connecting two Node objects in the Facility Window. A Node is highlighted red when a
Link is being drawn and it is close enough to that highlighted Node that if the user
clicks, the link will be anchored at that Node. Examples of Link models include the
Connector, Path, TimePath, and Conveyor in the Standard Library.
Simio tracks the leading and trailing edge of each Entity on a link as well as provides
events to manage collisions and passing. Link control and position is determined by the
leading edge of an Entity. As soon as an Entity’s leading edge moves onto a link, the
Entity and its speed are controlled by the logic built into that Link. When the Entity’s
leading edge moves off the link (perhaps onto a connected link), the Entity is no longer
controlled by the initial Link even if the trailing edge of the Entity remains on the initial
Link. Control transfers to the subsequent Link as the Entity’s leading edge transfers.
A traveling entity is considered Accumulated on a link if the entity has reached the end
of the link and has been stopped there without being engaged to the link, or if the
entity’s leading edge has collided with the trailing edge of an entity in front of it on the
link, and the entity has accumulated behind that entity without being engaged to the
link. Once flagged as Accumulated, the entity will continue to be considered
Accumulated until either its leading edge leaves the link or the collision situation is
cleared.
Node Fixed Adds behaviors for modeling fixed objects that are intersection points between link
objects or the entry/exit points for visiting an object. Entities may be picked
up/dropped off by a transporter at a node. Users can extend/customize the crossing
logic through a node to model network flow and entity pickup/dropoff points.
Examples of Node models include the BasicNode and TransferNode in the Standard
Library.
A Node defines a point in space -- it may constrain movement but it does not represent
any physical space itself. So, for example, a transporter that stops at a node physically
remains with its full length on the incoming link until it leaves the node. The Standard
Library object nodes have an associated parking area, but by default this also does not
represent a physical location. Internally parking is represented as a station, so it may
have constrained capacity and may be animated.
The following key strokes can be used to manipulate Nodes within the Facility Window:
Click – Selects node and displays properties in the Property window.
Click and drag – Moves the Node to a different screen location. Note that it is still
“attached” to it associated object if any (for example, a Server), and if that
associated object is moved, the Node position will also change.
Ctrl+Shift+Click and move – Initiates the creation of a Link between Nodes. The
Link type may be preselected in the library panel or it will be prompted for when
the Link is terminated by clicking on a Node.
A node with its Crossing Capacity property set to 'Infinite' is not seized or released and
therefore cannot be queried for Capacity.Allocated.
29 / 1277
Simio Reference Guide
Processes
A Process in Simio is comprised of Steps, Elements, and Tokens. A Process is sequence of actions (e.g. assign state, delay by
time, seize a resource, etc.) that may span time and change the state of the model. Tokens flow through a Process executing
Steps that alter the state of one or more Elements. Simio provides an auto-layout function creating Process flows.
Processes are created and modified in the Processes Window, found by clicking on the Processes tab. Note: A process
cannot be modified while the model is running.
A Process is either enabled or disabled. The process property InitiallyEnabled allows the user to specify whether a process
is enabled when the system is initialized. A process has a state called Enabled that indicates whether the process is
currently enabled. A disabled process ignores any attempt to execute the process. A process can be enabled by using an
Assign step to set the state ProcessName.Enabled, where ProcessName is the name of the process, to 1. A process can be
disabled by using an Assign step to set the state ProcessName.Enabled to 0. Any attempt to execute a disabled process
(e.g., Execute step) will be ignored. Any triggering events for the process are canceled when it is disabled. However, when a
process is disabled, if there are active tokens currently running in the process, then those tokens will continue and finish
their processing. A disabled process (or a process that has no logic) is going to simply return its ReturnValue if asked (e.g., if
an OnEvaluatingXXXX process is asked for a value by the engine). ReturnValue is a state associated with a process that
returns the default token return value for the process.
There are certain processes within the standard Simio objects that are known as Decision Processes. They are referred to as
Decision processes because the execution engine needs to ask the model for some value and it runs this particular process
to find the answer. These processes should run to completion without the delay of the executing token. If for any reason the
token gets delayed while executing the process, then an error message will be displayed, as shown below. The error details
will inform the user which exact token was detected as being delayed. If a Decision Process contains an Execute step, the
same applies with an error being issued with any delayed token(s).
Decision Process must run to completion without any interruption; however, the user can set a Breakpoint within the process
to step through the decision logic. Process suspensions are not allowed. Decision processes within Simio include
OnEvaluatingMoveRequest, OnEvaluatingRiderAtPickup, OnEvaluatingRiderReservation, and OnEvaluatingSeizeRequest.
Processes
Processes are used to either customize the behavior of an existing object, or to create new object definitions. If the user
would like slightly different behavior from what is provided with the Standard Library objects, the modification of the
object behavior is done with Simio Processes. The second major role for process modeling in Simio is for creating new
object definitions. An object definition is simply a model for how instances of that object should behave.
There are several types of Processes in Simio. Standard Processes are automatically run by Simio at specific points in the
logic. Decision processes are 0-time Standard Processes that compute a return value used for making a decision. Event-
triggered Processes are executed whenever a user-specified Event occurs. Add-on Processes may be inserted into an object
at selected points in the logic and are discussed below.
Standard Processes
There are nine (9) standard processes that are available for a given fixed class object/model. There are different/additional
processes within other class type objects (Entity, Transporter, Node, etc.). Within the Processes window, any of these may be
selected for logic to be added. Some of the processes below are only available if the Fixed Class object property Resource
Object is set to 'True' (thus the object is used as a resource with capacity.) These processes include:
OnCapacityAllocated - This is executed when a resource's capacity is allocated (seized). The token executing the
process will be associated with the object that seized the capacity. This process is used within Standard library
objects such as Resource, Worker and Vehicle.
OnCapacityChanged - This is executed when a resource's capacity has changed. The token executing the process will
be associated with the object that changed the capacity.
OnCapacityReleased - This is executed when a resource's capacity is released. The token executing the process will be
associated with the object that released the capacity. This process is used within Standard library objects such as
Resource, Worker and Vehicle.
OnCapacityReservationCancelled - This is executed when a capacity reservation for a resource has been cancelled,
either due to a reservation timeout or because the entity owning the reservation was destroyed. The token executing
the process will be associated with the object that cancelled the reservation. This process is used within Standard
library objects such as Resource, Worker and Vehicle.
OnEvaluatingSeizeRequest - This is executed when determining whether or not the object's capacity should be
allocated (seized). The token executing the process will be associated with the object that is trying to seize the
capacity. This process is used within many of the Standard library objects.
OnNewSeizeRequest - This is executed once for each candidate resource when a token first arrives to a Seize step
(i.e., when a new seize request occurs). The token executing the process will be associated with the object that is
trying to seize the capacity. Note: When the token arrives to Seize step, it calls the process (optionally) for every
possible candidate. The OnEvaluatingSeizeRequest process is then what is used to actually reject or accept and that
process may be called multiple times whenever a queue search is done.
OnRunEnding - If running in interactive mode, then this is executed when the Stop or Reset button action occurs. If in
experiment mode, then when the ending time has been reached or calendar events have been exhausted such that
the model run is now ending and final statistics about to be reported. Additional events can be put onto the event
calendar, but they will not be processed. For example, if you place a Delay step in this process, the delay will be
scheduled, but the run will end before the end of the delay. The delay will not extend the run time. Similarly, if you
have an Execute Step in this process and the Action property is set to 'WaitUntilCompleted', anything after that step
will not be processed. This is because the "WaitUntilCompleted" action schedules another event on the event
calendar and the event calendar is not revisited.
OnRunInitialized - This is executed when this object/model is first initialized. It's important to note that the
30 / 1277
OnRunInitialized processes are executed last after all model element states and statistics have been initialized. Thus,
all Timer elements in a model have already been initialized by the time the OnRunInitialized process is being
executed. This includes any Timer elements that are embedded within objects, such as the Timer element for entity
arrivals within a Source. Thus, any state variables referenced within the Source object should be initialized to their
desired value, as an assignment within the OnRunInitialized process will not override the Timer element initialization.
OnRunWarmUpEnding - If running in experiment mode, if a warm-up period has been specified and is ending, this is
executed right before all statistics are cleared. Typical uses of this process may be to do some custom warm-up
statistics clearing. For example, you may want to clear a state variable’s value that is being used as a custom statistic
or take a snapshot of some statistic values at the end of the warm-up period before Simio clears them. See
"OnRunEnding" description above for more information about how the event calendar works with this Process.
Add-On Processes
When you place an object from the Standard Library into your Facility Window, you can have the object run Add-On
Processes at specific points in the logic. An Add-On Process is simply a logical Process that you have created to perform
some specific action such as assigning a state variable, seizing a resource, referencing information in a table, etc.
Process Scope
In general a process can only reference items that are at its own scope. Specifically, an object does not “know” anything
about the model in which it is placed, so any processes defined inside that object have the same limitation. For example, a
process defined inside a Server object can only reference things that have been defined within that Server object. One way
objects and their process can interact with the other objects is by the object defining properties which are used to pass in
information from outside the object. For example, Server has a Property called Process Time which may reference or “pass
in” things like tables and functions that are defined outside of Server.
Add-on processes may appear that they are being defined at the scope of the referencing object (e.g. a Server), but they
are not. An add-on process is actually part of the containing model and has that scope. So for example, if the Processing
add-on process is defined for Server1 that is placed in model Brewery, the scope of that add-on process is Brewery. This is
important to note because if the same code that is defined in an add-on process is later moved into the object definition, it
may no longer work because the scope would change from the containing model to that of the object definition itself.
Simplifying Logic within Processes
A process can be structured such that all the logic that is to be done at a given point in the simulation is done within that
particular process. However, users may find that some of the logic at different points in the model is similar to other areas
of logic. The Execute step may be used to move from one given process into another process. When the Execute step is
used, a new token enters that process and continues through the steps. Within the original process (where the Execute step
is called), the original token may continue or it may wait for the executing process to be completed. See the Execute step
for additional information.
If you use a custom token with custom states, the states of the receiving token in the called process get set to match, much
like passing function arguments. If you set the ReturnValue of the token in the executed process, that value will be set
(returned) to the token that started the execute, much like a function return value. This allows the user to pass information
between the processes, much like you would with a function. See the Tokens page for more infomation.
31 / 1277
Simio Reference Guide
Costing
Costing in Simio
Activity-based costing ( ABC) is a method of assigning costs to products or services based on the resources that they
consume. ABC identifies activities within the business and records the cost required to fulfill each activity. An activity cost
driver is any factor that affects the costs associated with an activity including capital costs, resource consumption costs, and
waiting or inventory holding costs. Activity-based costing allows managers to determine the costs to perform an activity as
well as non-allocated costs such as those associated with unallocated (idle) resource time.
Simio’s costing capability includes the ABC features described above plus the ability to specify costs in many different
currencies and use a user-specified exchange rate to express cost statistics in the currency of choice.
Cost Centers & Cost Hierarchy
Cost centers are used to define identifiable areas of responsibility where costs are incurred or allocated. Cost centers may
be linked in a hierarchical structure for cost accounting and reporting purposes, whereby costs are automatically rolled up
through the cost center hierarchy. For example 'MechanicLabor' and 'ElectricianLabor' may both be allocated to the
'MaintenanceLabor' cost center. In turn costs associated with the 'MaintenanceLabor' cost center may be combined with
costs in the 'MaintenanceSupplies' cost enter and allocated to the 'MaintenanceTotal' cost center.
Each Standard Library object that supports costing has a Parent Cost Center property that can be specified. If none is
specified, the costs associated with that object will be allocated to the parent object (which may be the base ‘model’)
containing the object. Cost centers may also be defined within the Elements panel of the Definitions window. A cost center
may have an initial cost value in addition to an initial cost rate.
When cost hierarchy is used, it is important to note what each cost center represents to avoid double counting specific
costs. To continue the above example, it would be inappropriate to add together the costs from 'MaintenanceLabor' and
'MaintenanceTotal' because that would be double counting the 'MaintenanceLabor' costs.
Cost Drivers
Capital Costs
Capital costs are the initial one-time setup costs of adding an object to a system. Capital costs are included in the
following Standard Library objects: Source, Sink, Server, Combiner, Separator, Workstation ( Deprecated), Resource,
Vehicle, Worker, and Conveyor.
For Vehicles and Workers, the capital cost is incurred for each object in the population that is added to the system. For
example, if the Vehicle named ForkTruck has an Initial Number in System of ‘2’, capital cost will be incurred for each of the
two ForkTruck vehicles.
For statistics reporting, capital costs are allocated to both the object and the parent cost center associated with the object.
They are shown on the Results page under the Category ‘Costs’ and Data Item ‘Capital Costs’. In the example shown below,
capital costs are specified for four objects, including Source, Server, Sink and Resource, each with its own cost value. As you
can see, each object itself incurs the capital cost, and then all costs are ‘rolled up’ to the parent cost center, which is the
Model.
Buffer Costs
Buffer costs are the costs associated with holding an entity in an input or output buffer at a given object, such as a Server.
The Standard Library objects that include buffer costs are Source (output buffer costs only), Sink (input buffer costs only),
Server / Separator / Combiner / Workstation ( Deprecated) (both input and output buffer costs).
32 / 1277
Buffer costs include both a Cost per Use and Holding Cost Rate.
Cost per use for a buffer is the cost to hold an entity in a buffer, irrespective of the waiting time. It is important to note that
this cost will be incurred at the associated object each time an entity passes through the buffer, even if there is no waiting
time. Cost per use is allocated to the entity moving through the buffer, the buffer’s associated location and the Parent Cost
Center.
Holding cost rate for a buffer is the cost per unit time to hold an entity in the buffer. The holding cost is then allocated to
the associated object, as well as to the Parent Cost Center. Holding costs are also allocated to the entity that is in the
buffer.
For statistics reporting, buffer costs are shown on the Results page under the Category ‘Costs’ and Data Item ‘CostPerItem’
for the associated DataSource ‘InputBuffer’ or ‘OutputBuffer’ (or ‘Population’ for Entities). In the example shown below,
buffer costs are specified for three objects, including Source, Server, and Sink, each with its own buffer cost data. Cost per
use was specified for all objects, and holding cost rate was specified for the input buffer of the Server. As you can see, each
object itself incurs the buffer costs, the entities that go through the system incur the cost (which will be different for each
entity, given the waiting times at the buffers are different) and then all costs are ‘rolled up’ to the parent cost center, which is
the Model.
Resource Costs
Resource costs are the costs associated with utilizing a resource. Resource costs in Simio are included in the Server /
Combiner / Separator / Workstation ( Deprecated) fixed objects, as well as the Resource / Worker / Vehicle objects.
These costs are broken down into three categories: Cost per Use, Idle Cost Rate, and Usage Cost Rate.
A resource cost per use is incurred with each entity that utilizes the resource. Reporting the resource usage cost could be
confusing though. It is important to understand that a resource is a cost driver and its usage costs are charged, or accrued,
to the cost of the users/owners of the resource (i.e., charged to the tasks using the resource and then rolled up at those
locations where the task is performed).
So, for example, if an entity goes into a Server and utilizes a Worker as a secondary resource during processing, then the
Server will incur costs of its internal resource (shown as Data Item ‘UsageCostsCharged’ under the DataSource ‘Resource’).
Additionally, a ‘CostPerItem’ for the DataSource ‘Processing’ includes the cost per use of the Server resource, as well as the
Worker resource. These costs are then rolled up to the parent cost center’s Total Cost as well. Costs are incurred to the
entity that ‘owned’ the resources as well, as shown below.
33 / 1277
Idle cost rate for resources is cost per unit time that is charged to the cost of the parent object for each unutilized (idle)
scheduled capacity unit. This cost is also allocated to the cost of the parent cost center. This cost is NOT allocated to any
entities in the system.
Usage cost rate for resources is the cost per unit time to use the resource. This cost rate will apply only during the time that
the resource is in a utilized state and will be charged to the cost of the entity using the resource. This cost will also be
charged to the resource and included in the ‘UsageCostCharged’ (along with the CostPerUse value). As all other costs, this
is also ‘rolled up’ to the parent cost center’s Total Cost. It's important to note that changeover times using Sequence
dependent setup (resource state of 'Setup' or 'OffShiftSetup') are not included in utilized time or cost calculations.
In the example below, there was only Idle Cost Rate and Usage Cost Rate, both of 1 USD per hour. The Server was used for
6 minutes of the hour (10%). Notice how the Server incurs both the IdleCost and UsageCostCharged under the ‘Resource’
Data Source. However, only the usage costs are incurred to the cost per item of both the entity and processing area of the
Server. The Server’s total cost (both idle and usage) are then rolled up to the parent cost center.
In the above example, the UsageCostCharged for the resource is allocated to the Server because the resource is utilized
within the Server object. The UsageCostCharged is the cost charged to the users of the resource, not directly to the
resource. Only idle costs are charged directly to the resource. Usage costs are not charged in the resource’s reported total
cost unless the entity is actually located inside the resource (such as a Server) causing the costs to be rolled up into the
Server’s costs.
It is important to keep in mind that for Workers and Vehicles that are ‘moving’ resources, the usage costs (both cost per
use and usage cost rate) are only incurred for ‘non-transport’ tasks. For these objects, an additional category of costs,
Transport Costs, is used for transport tasks, as described below.
Workstation ( Deprecated) Usage Cost Rate - For workstations (deprecated), the usage cost rate is broken down into three
separate cost rates, including Setup Cost Rate, Processing Cost Rate and Teardown Cost Rate, based on which delay the
entity is incurring.
Transport Costs
Transport costs are included with the Worker and Vehicle objects. Both a Cost Per Rider and Transport Cost Rate may be
specified.
Cost per rider is the cost to load and transport an entity using a transporter of this type, irrespective of the transportation
time. This cost is allocated to an entity when it is loaded onto the transporter.
Transport cost rate is the cost per unit time to transport an entity using a transporter of this type. This includes only the time
when the entity is on the vehicle and does not include any time when the vehicle is moving to the entity’s location for
pickup.
Both cost per rider and transport cost rate are incurred to the worker / vehicle, as well as to the entity. Total cost of the
34 / 1277
Both cost per rider and transport cost rate are incurred to the worker / vehicle, as well as to the entity. Total cost of the
vehicle includes all of the ‘CostPerItem’ values and is then rolled up to the parent cost center.
In the below example, two entities have required transport from one object to another. The worker has both a cost per rider
(1 USD ) and a transport cost rate (10 USD per minute). Note that the ‘CostPerItem’ of the worker is shown under the
‘RideStation’ Data Source. Total cost is then calculated and ‘rolled up’ to the parent cost center ( Model).
Material Costs
Material costs are specified with the Material element and include the Cost Per Unit. This cost per unit of material is
charged if a quantity of the material is consumed.
There is no material cost directly specified within the Financials section of any of the Standard Library objects. The
Workstation (deprecated) object includes the option to specify material consumption. If materials are consumed at the
workstation and the cost per unit property is specified for the material (via the Material element), then that cost will be
associated with the workstation.
In the below example, the workstation includes a capital cost and consumes material that has an associated Cost Per Unit.
The entity using the material incurs a ‘CostPerItem’ charge. The ‘CostPerItem’ shown under the Processing Costs for the
Workstation also include those material costs. Capital cost is then allocated to the workstation, along with the material cost
for a TotalCost of the object. This cost is then ‘rolled up’ to the parent cost center. Note that within the parent cost center,
the TotalCost for the object ( Model) is displayed, as well as the MaterialCostCharged. Material costs are included in the
TotalCost.
Currency Support
Simio’s costing features includes a default currency which can be specified in any number of country’s currency units. The
default is USD ( United States dollars). Exchange rates can also be specified between two countries’ currency units. More
information about default currency and exchange rates can be found on the Financials page of the help.
35 / 1277
Simio Reference Guide
Disable Grid Grid Data Providers may choose to persist information from one invocation of the provider to
Data Cache the next. In most cases, this is the desired behavior, and this value should be set to 'False'. In
severely memory-constrained situations, it may be useful to prevent this caching by setting this
value to 'True'.
Save Project As Indicates if upon saving to a multi-file storage (like the simproj format) the project logic should
Multiple Files all be contained in a single file, or be broken apart into individual files (such as a file per object
36 / 1277
Multiple Files all be contained in a single file, or be broken apart into individual files (such as a file per object
definition and a file per table).
Show When this project loads, associated documentation for it (a pdf file of the same name in the
Documentation same directory) should be opened as well.
on Load
Models
A model describes the logic, external interfaces, data structure, and presentation/animation for a class of objects. A model
may be added to a library and then instances of that model embedded in another model. Thus, a user will be able to easily
create a library that is a collection of models developed for some particular application domain or modeling effort.
The first model in your project is typically your main model. When you create your main model Simio also creates a default
model entity with no logic, and a corresponding default entity object. This default entity object is created but not yet
placed. The first entity object that you place in your model is this default entity object. You can use this entity model across
multiple models, or add additional entity models as needed. You can also add custom logic to the entity model.
Model properties can be found within The Facility window page under the Model Level Properties section.
You can create sub-models by adding additional models to your project. You can then add logic to your sub-model, define
the user view, properties, processes, and then drag objects for this model into your main model.
You can also subclass versions of the Standard Library or other Library objects. This allows you to start with an object and
then make changes to customize the logic for your own needs. To add additional models to your project, select the Project
in the Navigation window to open the Project window. You can then add a new models to your project either from scratch,
by subclassing another model, or by copying a model from a library. See the Project Window and Creating New Objects
help pages for additional information on how to add models. You can then add to or modify the logic of your subclassed
model to create your own custom version of the model. When you select your main model back in the Navigation window,
you'll see the new models in your Project Library on the bottom left side of the UI in the Libraries panels, and you can then
drag these objects into your main model.
37 / 1277
Simio Reference Guide
Queues
Queues in Simio
Queues, or lines of entities waiting to be processed, can be found in many different places around Simio. This provides
tremendous flexibility in allowing the user to queue entities up at different points throughout the model. It also creates
ease in modeling blocking. When placed in the Facility Window, the standard library objects all have their Input Buffer
queue, their Processing queue and their Output Buffer queue automatically animated.
Entities can be removed from certain queues with the use of the Remove Step.
Animating Queues in Simio
You can animate a queue in Simio with either a Detached Queue that is not tied to any particular object, or animate with a
Queue that is attached an object. An Attached Queue will move around the window with the object. The icon used to
animate a detached queue is found on the Animation Tab of the ribbon.
To draw a detached queue, do not have any object selected and select the Detached Queue icon in the Animation Tab of
the ribbon. Left click in the Facility Window to add the vertices of the queue and right click to add the final vertex.
To draw an attached queue, first select the object that you wish to attach the queue with and then select the Queue icon
from the ribbon of the Symbols Tab. Left click in the Facility Window to add the vertices of the queue and right click to add
the final vertex. Once the Queue is drawn in the Facility Window, when the Queue is still selected, choose the appropriate
Queue State in the Properties Window, found in the Definitions Tab. The Queue States are listed alphabetically by the
Object they are associated with.
When animating an attached queue, Simio provides a short cut. When the object is selected, instead of clicking on the
center of the Queue icon in the ribbon, select the down arrow to display the Quick Create drop down. This menu provides
some appropriate queue choices for the user to select for animating this queue. The choices are the queues that are
available for the selected object. If the user selects something from this Quick Create menu, and then draws the queue in
the Window, the properties of the queue are automatically populated. For example, if the user selects InputBuffer.Contents
from the drop down shown below and then draws a queue in the Window, the Attached To property will be the name of the
object that was selected and the Queue State property will be InputBuffer.Contents and this will animate the entities that
are currently in the InputBuffer of the selected object.
Note that the orientation properties for a queue, if specified, take precedence over any other given orientation for the
queue (for example, the direction specified by an “Oriented Point” queue).
Listed below are the properties of Queue ( Animated):
Property Description
Attached Only visible for queues that are attached to an object, such as a Server, Worker, Vehicle or Node.
To The object to which the queue is attached.
Queue Name of the queue state holding entities that are displayed by this object.
State
38 / 1277
Visibility An expression that is evaluated per object in the queue to determine if that object is visible or not.
Expression To reference an object in the queue for which the expression is being evaluated, use the
"Candidate" keyword.
For example, the expression "Candidate.MyEntity.MyState > 1" assumes all objects in the queue
will always be of type 'MyEntity' and will only show those that have a 'MyState' value greater than
1.
X An expression indicating the direction an object should be oriented alont the X axis.
Direction
Y An expression indicating the direction an object should be oriented alont the Y axis.
Direction
Z An expression indicating the direction an object should be oriented alont the Z axis.
Direction
Roll An expression indicating the degrees of clockwise roll from upright an object should be oriented.
39 / 1277
Node Queue Animation
Queue Appearance
40 / 1277
Queues that can be found in Simio:
Network Element
VisitRequestQueue – An entity is inserted into this queue of the model’s ‘Global’ network (by the Ride Step) when it is
waiting to reserve a ride on a Transporter in the system. When a Transporter (i.e., the standard library Vehicle object)
becomes idle, it searches the ‘Global’ network’s VisitRequestQueue (using the PlanVisit Step) to possibly select a
reservation request from that queue. This queue on any other network element is not currently used.
Entity Object
VisitRequestQueue - This queue is on the Entity object but is currently only used by a Transporter object (which is a sub-
class of entity). This queue is holding all the entity objects whose pickup reservations the Transporter has selected and
accepted to perform. Visit requests are initiated from either a Ride or Move step. Thus, when a Transporter object selects a
pickup reservation request from the ‘Global’ network’s VisitRequestQueue using the PlanVisit Step, that request is moved
from the network VisitRequestQueue to the individual Transporter object’s VisitRequestQueue. The Transporter then can
actually set its destination to one of the pickup reservations in its VisitRequestQueue using the SelectVisit Step. Examples
include: Vehicle1.VisitRequestQueue
BatchQueue - If an Entity is the parent of a batch, then all of its batch members are held in this queue owned by the Entity.
41 / 1277
BatchQueue - If an Entity is the parent of a batch, then all of its batch members are held in this queue owned by the Entity.
Examples include: ModelEntity.BatchMembers
Any Object That Is Declared As A Resource Object
AllocationQueue - Objects that are waiting to seize the Object wait in this queue. This queue’s static ranking rule as well as
the resource object’s dynamic selection rule determine the next object to seize the object. Examples include:
Server1.AllocationQueue, [email protected], Resource1.AllocationQueue
Station Element
EntryQueue - Entities waiting to enter the Station, if capacity is not available, wait in this queue owned by the Station
element. Examples include: Server1.Processing.EntryQueue
Note: Entities will never go into the EntryQueue of the ParkingStation of a node, because a node’s ParkingStation always
has a capacity of ‘Infinity'. Note: Entities will never go into the EntryQueue of the RideStation of a Transporter, because the
Pickup step used by the Transporter doesn’t initiate a transfer into the Ride station unless ride capacity is available.
Contents - Where entities exist while they are in the Station. This queue is owned by the Station element. Examples include:
Server1.Processing.Contents, Vehicle1.RideStation.Contents
Material Element
AllocationQueue - Objects waiting to consume a quantity of the material wait in this queue owned by the Material Element.
Node Object
RidePickupQueue - Entities waiting to get picked up by a Transporter at this location wait in this queue. Thus, if the
ReservationMethod on the Ride Step was not ‘FirstAvailableAtLocation’, then an entity is going to be in two queues at once
while waiting for a ride pickup, as a reservation request in a network/transporter VisitRequestQueue and as a location-
specific pickup request in a node RidePickupQueue. Examples include: [email protected],
TransferNode1.RidePickupQueue
BatchLogic Element
ParentQueue - Entities wait here to collect a batch of members. This queue is owned by the BatchLogic element.
MemberQueue - The queue of entities waiting to be added as a member of a batch. This queue is owned by the BatchLogic
element.
RoutingGroup Element
RouteRequestQueue - Entities waiting to be routed to a destination in the routing group wait in this queue. It is owned by
the routing group element.
Storage Element
Queue - Objects in the Storage are held and ranked in this queue owned by the Storage Element.
Note: Currently, the Insert and Remove steps can only be used to insert/remove objects from a storage element queue.
Examples include: Storage1.Queue
Link Object
EntryQueue - Entities waiting to enter the Link wait in this queue, which is owned by the Link object. Examples include:
Conveyor1.EntryQueue
Contents - Entities that are physically located on the link. Entities are ranked in the queue based on the order of entry onto
the link (* It is important to note that on paths that allow passing and entities with varying speeds, this may not indicate the
order of those entities currently on the link, but only how they entered the link). Examples include: Conveyor1.Contents
42 / 1277
Simio Reference Guide
If we walk through the simple example of an entity that enters a standard Server object, we can demonstrate the role of an
Entity and a Token within Simio. In this first example, there are processes that are executed by both the Processing and
43 / 1277
Entity and a Token within Simio. In this first example, there are processes that are executed by both the Processing and
After Processing Add On Process triggers of the Server object. The Entity instance that exists within the Facility Window
arrives to the Input Node of a Server object. It exits the link, crosses the Input Node and then immediately is transfered
into the InputBuffer station of the Server, assuming there is capacity available in the Input Buffer. If there is available
capacity in the Server, the capacity is allocated and then the Processing trigger executes the Process1 process. A Token that
is associated with the entity is created in Process1, which flows through the Assign step. After the Process1 is complete, the
Entity object moves to the Processing station of the Server. When the Server finishes its processing time delay, but before
the capacity of the Server is released, the Process2 process is executed. The Entity object remains in the Processing station
of the Server object and a new Token is created within the Process2 process. This Token flows through the Assign Step that
exists within this process. The Token finishes its job when it reaches the End of the Process2 process. At this point, the Entity
then moves from the Processing station of the Server to the OutputBuffer station of the Server, assuming there is capacity
available in the Output Buffer. And finally, the Entity is transfered to the Output Node of the Server object where it is
routed out with the routing out logic of the Output node. As you can see, the Entity travels physically in the Facility Window
between stations and nodes and the Tokens that are associated with the entity are created to flow through the Processes
and perform the logic of the Steps.
It is important to note that within the Server logic, an Execute step is used for each of the Add On Process Trigger
processes. Within each Execute step, the Action is 'WaitUntilCompleted'. Thus, when the token associated with the entity is
created within a process, the entity will remain physically where it is for the entire process, even when delay steps are
involved.
Example 2 - Processes via Triggering Event
In this second example, the process will be triggered using a Triggering Event. Triggering events may be a user defined
Event or Timer.Event, or may be related to an action within an object, such as [email protected] or
[email protected]. If the process is triggered by a user defined event (i.e., Event1) or monitor event (i.e.,
Monitor1.Event), the token going through the process is associated with the 'model' and not a specific entity. Therefore, as
long as the model is running, the token will continue through all the steps in the process. If, however, the triggering event is
based on an entity entering or exiting another object (i.e., [email protected]), the token going through the process is
associated with a particular entity. If that associated entity is destroyed for whatever reason while the token is still in the
process (i.e., in a Delay step), the token will also be destroyed and will not continue through the remaining process steps.
This example shows the happenings of the entity and associated token with a small example of Source, Server, Sink.
Entities are created at Source1, move to Server1 and are processed, then move to Sink1 and are destroyed. Suppose when
an entity exits Server1, you would like to have a token delay for a period of time and then increase a state variable. As
shown above, Process1 is triggered by an entity leaving the Server. The Triggering Event is '[email protected]'.
Therefore, the token that goes through Process1 is associated with the entity that exited and not the model. When the
entity leaves Server1 and moves to Sink1, it is then destroyed. If the token is still in the process's Delay step when its
associated entity is destroyed, it will also be destroyed by default. If you would like to have the token continue processing,
enter the Advanced Options section and click on the '+' sign of Token Actions. The On Associated Object Destroyed
44 / 1277
enter the Advanced Options section and click on the '+' sign of Token Actions. The On Associated Object Destroyed
property allows users to specify what happens to the token when an associated entity is destroyed. By default, the value for
this property is 'EndProcess'. However, by changing this value to 'ContinueProcess', the token will not be destroyed when its
associated entity is and will instead continue its process until the end.
45 / 1277
Simio Reference Guide
46 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
47 / 1277
Simio Reference Guide
A Sample SimBit Solution is a small Simio model which provides an example of how to use certain features of the
software. Each SimBit .spfx file has a matching .pdf file that provides a detailed description of the model. The files can be
found in [public documents]\Simio\SimBits. The SimBits help page provides a list of all the available SimBits in various
categories. SimBits can be searched by clicking on the Sample SimBit Solutions button in the Support ribbon of the Simio
software, which will take you to a page where Basic and Advanced searches may be performed.
There are a number of Example models that are available with the installation of the software. Example models can be
found in [public documents]\Simio\Examples. See the Examples page for a listing of each and accompanying
documentation. The Examples button in the Support ribbon opens a dialog for selecting one of our example models.
The Books button provides options for opening one of multiple books available for learning Simio. Rapid Modeling
Solutions: Introduction to Simulation and Simio is an introduction to the concepts of simulation and basics of Simio. The
Planning and Scheduling with Simio book introduces the use of Simio RPS ( Enterprise) Edition for planning and scheduling.
The Process Improvement Principles book introduces 25 process improvement principles that can be applied by managers
to improve design and operation of production systems. We have examples associated with this book included in the
Examples section. The Deliver on Your Promise book is a non-technical review of questions about why scheduling is
challenging, how scheduling solutions have evolved and how simulation-based technology can boost your business. The
Reference Guide is a printable guide that explains each Simio feature in detail. The API Reference Guide is an advanced
guide to explain the details of Simio's Application Programming Interface. There are also a number of publications and
textbooks that are listed on-line.
Simio features and concepts are demonstrated in a number of Videos found on the Simio website. The Introductory Topics
include a 20-minute video about Simio and the 11 module Introduction to Simulation and Scheduling videos. The
Intermediate Topics link includes the 8-hour Introduction to Simio video set that introduces the basics of Simio. A
matching e-book is also available under the Books button. Both of these video sets include certification opportunities.
Special topics, such as WonderWare MES Integration can also be found in this section. The Simio YouTube Channel option
provides links to a number of videos available for a range of topics, from Simio and Feature Overviews to Student Projects
and Example Models.
The Training button provides links to our training course schedule and various learning resources, as well as teaching
resources for academics and an interactive map of universities with Simio grants. Simio offers public training classes
through our worldwide network of training partners, as well as customized and on-site training. Our teaching resources
include information about products available, grant application link, teaching materials and our semi-annual student
competition.
The Expression Reference Guide button opens an html document which will be opened in the default browser. This
document lists the Simio built-in functions and keywords, states and elements. It also lists the functions, states, events and
elements for those objects that have been placed in your model.
The My Software section of the Support ribbon contains information specifically related to your Simio license. It includes
the Version of Simio which you are currently running, in the format Simio 5.80.****. The License Type displays the type of
license within our Simio Product Family you are currently running. Finally, the Expiration date displays the date of
maintenance agreement expiration.
The Release Notes icon opens the Simio Release Notes.pdf file (found in in the install folder (by default \Program
Files\Simio)). This file provides information regarding new features in each sprint release.
The Compatability Notes icon opens the Simio Compatability Notes.pdf file (also found in in the install folder (by default
\Program Files\Simio)). This file lists any known problems and work-arounds as well as any compatability issues converting
between releases.
The Shared Items link opens the SI Shared Items area of the Simio User Forum at
http://www.simio.com/forums/viewforum.php?f=36. This area of the forum provides access to objects, libraries and other
items that users have shared.
The Simio Home Page link opens the http://www.simio.com/index.html. Start here to find out anything about Simio.
The Help icon provides a link to the searchable help on all aspects of Simio.
The User Forum icon takes the user to the Simio User Forum where you may search the various forums for answers, post
48 / 1277
The User Forum icon takes the user to the Simio User Forum where you may search the various forums for answers, post
problems and suggestions and interract with Simio employees and the world-wide Simio user base. The direct link to the
Simio User forum can be found at http://www.simio.com/forums/. Users can become a Simio Insider to have full access to
the User Forums where other users share information about how they use the software and the models they are creating.
This is an opportunity for the global Simio community to communicate and collaborate.
The Email button allows you to Email a Question to Simio Support, Email This Project to Simio Support or Email Sales
for additional product information.
49 / 1277
Simio Reference Guide
SimBits
SimBits - General Information
A SimBit is a small Simio model which provides an example of how to use certain features of the software. Each SimBit
.spfx file has description that explains the details of the model. The model *.spfx files can be found in [public
documents]\Simio\SimBits.
SimBits can be searched by clicking on the Sample SimBit Solutions icon in the Support ribbon. By default, the model will
open in a new Simio window. Alternatively, if you'd like to open the SimBit in the currently active Simio window, hold down
the Shift key when you click onto the name of the SimBit that you'd like to open.
Below is a categorization of the SimBits based on their functionality. Some models can be found under multiple
categories.
Add-On Process Logic
AnimatePathDensity
ChangingQueuesWhenServerFails
CheckingNextEntityAheadOnLink
ChooseAlternateSequence
CreateDiscreteEntitiesBasedOnFlow(from project Flow Concepts)
CustomUnbatching
DashboardsWithinExperiments
DisableFailureTimers
DiscreteLookupTable
ElectricVehicle
FillingEmptyingTank(from Project Flow Concepts)
Financials
FindAMinimumStateValue
HourlyStatistic
InventoryReplenish
KeepQueueTimeForLast10Entities
MergingConveyorsControlledByGate
MultipleServerFailures
NotifyStep
PickupDropOffFlow
ResourceSelectionConcepts
ResourceStatesWhenOffShift
RotatingVehicleExample
SequentialProcessingByBatchSpecifiedInTable
ServerBlockingApproaches
ServerUsingTaskSequenceWithWorkers
50 / 1277
SimpleTank
SingleWorkerCompletesProcessAndMovesToNode
TankCleanInPlaceTrigger
TrackingTankContentsByProductTypeUsingTableStates
TransferLine
TravelWithSteeringBehavior
UsingaMonitor
UsingAStorageQueue
VehicleDoingSimultaneousLoading
WorkerUsesWorkSchedule_InterruptWorkingOffShift
Animation
AnimatePathDensity
AnimatedPeople
SimpleElevatorObject
Arrival Logic
AppointmentArrivals
DisableFailureTimers
LeveledArrivals
RandomValueFromTable
SearchTables
ScheduledMaterialArrivalsWithDeviation
SourceWithRateTable
SourceWithCustomEntityTypeProperty
UsingButtonsToAffectSystem
UsingTheStipulateStepForNodeLists
UsingTheStipulateStepForResourceAllocation
Buffering
AddAndRemoveServerCapacity
CONWIP
HourlyStatistic
KeepQueueTimeForLast10Entities
MultiServerSystemWithJockeying
NotifyStep
OneQueueForMultipleServers
OverflowWIP
ServerBlockingApproaches
ServerQueueWithBalkingAndReneging
SimpleLeastSlackSelectionRule
51 / 1277
SourceWithBalkingIfBlocked
UserDefinedListState
Building New Objects / Hierarchy
CombinerNode
CommunicationBetweenObjects
ElectricVehicle
FacilityModelWithinModel
HierarchyWithTables
HourlyStatistic
MassFlowProcessing
MoveableOperator
ProcessModelWithinModel
ResourceSelectionConcepts
SourceWithCustomEntityTypeProperty
UpdateStateInModelFromObject
VisitAllServersInAnyOrder
WorkersArriveLateToShift
Changeover Logic
ServerWithSequenceDependentSetup
Combining and Separating Entities
BatchingProcessUsingScanOrWaitStepToControlBatchSize
CombineMatchingMembers
CombineMultipleEntityTypesOntoPallets
CombinerNode
CombinerReleasingBatchEarly
CombineThenSeparate
CustomUnbatching
ReferenceBatchedEntity
RegeneratingCombiner
SeparatorMakesCopies
UsingAStorageQueue
Continuous Systems
InfectionPropagationUsingContinuousAndFlow
Conveyor Systems
EntitiesEnteringAlongConveyor
ExamplesOfConveyors
MergingConveyorsControlledByGate
TransferLine
52 / 1277
SortingConveyorSystem
Custom Reports
DashboardReportInteractiveLogs
Custom Statistics
DashboardReportInteractiveLogs
DashboardReportTallies
DashboardsForSchedulingExamples
HourlyStatistic
KeepQueueTimeForLast10Entities
RecordDistanceTraveled
TallyStatisticsInTables
UsingaMonitor
UserDefinedListState
WorkersArriveLateToShift
Dashboard Reports
DashboardReportInteractiveLogs
DashboardReportTallies
DashboardsForSchedulingExamples
DashboardsWithinExperiments
Data Tables
CONWIP
EntityFollowsSequenceWithTable
EntityFollowsSequenceWithRelationalTables
HierarchyWithTables
ImportExportTables
InitializeObjectPropertiesFromATable
LeveledArrivals
RandomValueFromTable
ResourceSelectionConcepts
RoutingWithoutPaths
RelationalTablesInRepeatingProperty
ScheduledMaterialArrivals
ScheduledMaterialArrivalsWithDeviation
SearchTables
SearchTableUponEnteringObject
SequentialProcessingByBatchSpecifiedInTable
ServersUsingTaskSequenceWithDataTables_FlowLine
ServersUsingTaskSequenceWithDataTables_JobShop
53 / 1277
ServersUsingTaskSequenceWithDataTables_LoopbackBranches
TableReferenceInRepeatingProperty
UsingAddRowAndOutputTable_Enterprise
UsingRelationalTables
UsingRelationalTablesToDefineNodeLists
UsingRelationalTablesToDefineTaskResourceLists
UsingTheStipulateStepForNodeLists
UsingTheStipulateStepForResourceAllocation
Decision Logic – Paths
BidirectionalPaths
ChangingQueuesWhenServerFails
CustomRoutingGroup
EntityFollowsSequence
EntityFollowsSequenceMultiple
EntityFollowsSequenceWithTable
EntityStopsOnLink
FindAMinimumStateValue
LogicBasedOnEntityProperty
LogicBasedOnEntityState
ObjectReferenceOnEntity
PathSelectionRule
SelectServerWithShortestLine
ServerBlockingApproaches
ServerWithTransferInConstraints
SimpleElevatorObject
TravelWithSteeringBehavior
VisitAllServersInAnyOrder
VehicleFleetManagement
Decision Logic – Processing
AddAndRemoveServerCapacity
DiscreteLookupTable
CustomRoutingGroup
EntityFollowsSequenceWithTable
FindAMinimumStateValue
InterruptibleOperator
InterruptingAcrossMultipleServers
InterruptingServerWithMultipleCapacity
ObjectReferenceOnEntity
54 / 1277
RemoveFromAllocationQueue
RoutingWithoutPaths
ServerBlockingApproaches
SourceServerSinkApproaches
UsingRelationalTablesToDefineNodeLists
UsingTheStipulateStepForNodeLists
UsingTheStipulateStepForResourceAllocation
WorkersArriveLateToShift
Discrete States
CommunicationBetweenObjects
FindAMinimumStateValue
LogicBasedOnEntityState
StringStates
CommunicationBetweenObjects
VisitAllServersInAnyOrder
UserDefinedListState
WorkersArriveLateToShift
Entity Characteristics
AnimatedPeople
CustomRoutingGroup
DefineEntityProperties
FindAMinimumStateValue
LogicBasedOnEntityState
ObjectReferenceOnEntity
RequestRideFromSameTransporter
SeizingSameResourceFromList
SelectEntityColorFromStringList
SelectEntityTypeFromTable
TurnaroundMethod
VehicleFleetManagement
Failures
MultipleServerFailures
File Management
DbReadWrite
ExcelReadWrite
FileSecurity
WritingToAFile
Flow Library
55 / 1277
FlowConcepts
InfectionPropagationUsingContinuousAndFlow
TankCleanInPlaceTrigger
TrackingTankContentsByProductTypeUsingTableStates
Functions
ExamplesOfFunctions_DynamicObjects
ExamplesOfFunctions_StaticObjects
InfectionPropagationUsingContinuousAndFlow
StringStates
Input Analysis
InputAnalysis
Level States
InfectionPropagationUsingContinuousAndFlow
MassFlowProcessing
SimpleTank
Lookup and Rate Tables
DiscreteLookupTable
LearningCurveWithLookup
SimpleLeastSlackSelectionRule
Materials
InventoryReplenish
ServerWithMaterialConsumption
ServerWithMaterialConsumptionAndReplenish (from Project ServerWithMaterialConsumption)
Movement In Free Space
FreeSpaceMovement
MultiTask Server
DashboardsWithinExperiments
MultiTaskServer_SpecificTime (from Project ServerUsingTaskSequence)
MultiTaskServer_ProcessName (from Project ServerUsingTaskSequence)
MultiTaskServer_Submodel (from Project ServerUsingTaskSequence)
ServersUsingTaskSequenceWithDataTables_FlowLine
ServersUsingTaskSequenceWithDataTables_JobShop
ServersUsingTaskSequenceWithDataTables_LoopbackBranches
ServerUsingTaskSequenceWithWorkers
UsingRelationalTablesToDefineTaskResourceLists
Resources
MultipleServerFailures
ResourceSelectionConcepts
56 / 1277
ResourceStatesWhenOffShift
SelectingResourceFromList
SelectingResourcesAsAGroup
SingleWorkerCompletesProcessAndMovesToNode
UsingRelationalTablesToDefineTaskResourceLists
RPS ( Enterprise)
UsingTheStipulateStepForNodeLists
UsingTheStipulateStepForResourceAllocation
Schedules / Changeovers
ResourceSelectionConcepts
ResourceStatesWhenOffShift
ResourcesWithWorkSchedules
ServerFollowsCapacitySchedule
ServerFollowsDailySchedule
ServerFollowsOddSchedule
WorkerUsesWorkSchedule
WorkerUsesWorkSchedule_InterruptWorkingOffShift
Sequence Tables
ChooseAlternateSequence
EntityFollowsSequence
EntityFollowsSequenceMultiple
EntityFollowsSequenceWithTable
SortingConveyorSystem
UsingRelationalTablesToDefineNodeLists
Supply
InventoryAndMaterials
Vehicles
DynamicallyCreatingVehicles
ElectricVehicle
ExamplesOfFunctions_DynamicObjects
RecordDistanceTraveled
RotatingVehicleExample
SeizingVehicle
SelectSpecificVehicle
SingleVehicleUsage
VehicleDoingSimultaneousLoading
VehicleFinishesAndParksWhenOffShift
VehicleFixedRoute
57 / 1277
VehicleFleetManagement
VehicleMovingBackward
VehiclesPassingOnRoadway
VehicleStopsWhenServerOffShift
VehicleVisitsServiceCenter
VehicleWithVariableRideCapacity
Worker
DashboardsWithinExperiments
MoveASeizedObject
RelationalTablesInRepeatingProperty
RequestRideFromSameTransporter
ServerUsingTaskSequenceWithWorkers
SingleWorkerCompletesProcessAndMovesToNode
TableReferenceInRepeatingProperty
WF_AdditionalResource
WF_Authorization
WorkersArriveLateToShift
WorkerUsedForMultipleTasks
WorkerUsesWorkSchedule
WorkerUsesWorkSchedule_InterruptWorkingOffShift
58 / 1277
Simio Reference Guide
AddAndRemoveServerCapacity - SimBit
Problem:
I would like to make an additional server “active” whenever the current servers have a certain number of entities waiting. In
other words, there are multiple servers and if any server with capacity reaches a “maximum input buffer level”, I want to
“open” a new server.
Categories:
Buffering, Decision Logic -- Processing
Key Concepts:
AssociatedStationLoad, Active Symbol, Add-On Process, Assign Step, Condition Based, Contents, Current Capacity, Decide
Step, InProcess, InputBuffer, Load, Monitor, NodeList, On Exited, Processing, Status Label
Assumption:
Assume that capacity can be added instantaneously with no set-up/transition time.
Technical Approach:
We want the maximum number of entities in a server’s input buffer to be six. When a seventh entity arrives, a new server
should come on-line or be activated. There are monitors that watch all the Server Input Buffers and when the seventh entity
arrives, an event is fired that triggers a process to change the server capacities. When the server has completed processing,
capacity is reduced to zero again until it is needed in the future.
Details for Building the Model:
Simple System Setup
Place a Source, 6 Servers in parallel, and a Sink in the Facility Window.
Name the Servers: a1 through a6.
Connect the Source to each Server and each Server to the Sink with Paths.
Setting Up the Selection Logic
From within the Definitions window, create a Node List that contains the Input Nodes for all 6 Servers.
In the Output@Source1 node, change the Entity Destination Type property to ‘Select From List’ and select the Node
list that was just created.
Set the Selection Goal to ‘Smallest Value’ and use the default Selection Expression
‘Candidate.Node.AssociatedStationLoad’. This expression will select the least congested possible destination. Please
refer to the documentation for more details on the AssociatedStationLoad function.
Set the Selection Condition property to ‘Candidate.Server.CurrentCapacity > 0’. This ensures that Entities do not get
routed to a Server with a capacity of zero.
Creating the Monitor Elements:
In the Definitions window, select the Elements panel and add 5 Monitor elements (we do not need to monitor server
a6).
Set up the properties of each Monitor Elements as follows:
Monitor Type is ‘CrossingStateChange’
State Variable Name is ‘a1.InputBuffer.InProcess’ (or a2, a3,a4, a5)
Threshold Value is ‘6’
Crossing Direction is ‘Positive’
This means that when the Input Buffer threshold value of 6 is crossed in the positive direction (going from 6-7) the
Monitor will be triggered. ( If the Crossing Direction would be ‘Negative’ it would be triggered when it went from 6-
5, which is not what we want to have happen.)
Increasing Server Capacities:
From within the Processes window, create a new Process ( Create Process ribbon button) and rename it
‘UpdateServerCapacities’
59 / 1277
‘UpdateServerCapacities’
Place a single Assign step. Open the Repeating Property Editor in Assignments ( More).
For the first assignment, set the State Variable Name to ‘a6.CurrentCapacity’ and the New Value to
‘( [email protected] > 0 || ((a1.Capacity > 0) && (a2.Capacity > 0) && (a3.Capacity > 0) &&
(a4.Capacity > 0) && (a5.Capacity > 0)))’
Add another assignment: State Variable Name is ‘a5.CurrentCapacity’ and New Value is
‘( [email protected] > 0 || ((a1.Capacity > 0) && (a2.Capacity > 0) && (a3.Capacity > 0) &&
(a4.Capacity > 0)))’
Similarly, add: State Variable Name ‘a4.CurrentCapacity’ with New Value ‘( [email protected] > 0
|| ((a1.Capacity > 0) && (a2.Capacity > 0) && (a3.Capacity > 0)))’
And finally: State Variable Name ‘a3.CurrentCapacity’ and New Value ‘( [email protected] > 0 ||
((a1.Capacity > 0) && (a2.Capacity > 0)))’
These expressions are checking 2 things: (1) If it is processing an Entity, an Entity is waiting to be processed, or an Entity is
routing to be processed, then let it remain operating OR (2) all the Servers before that one are working. Because we used a
logical expression it will return a 1 if true, and a 0 if false – which is what we want to set our capacities to.
Note: It is important that these expressions are in this exact order - descending order. Otherwise, the logic will not evaluate
correctly.
Now that the Process has been created, we have to trigger it – this is done back in the Monitor Element. From the
Definitions window, set the On Change Detected Process to ‘UpdateServerCapacities’ for each Monitor element.
Therefore, once the Monitor is triggered (i.e. when the seventh Entity arrives) it will fire this process, which checks all
of the conditions and then sets the capacities accordingly.
Decreasing Capacities:
From within the Facility window, create a process in a3’s Exited Add-On Process Trigger
From the Processes window, place a Decide step in this new process. Set Decide Type to ‘ConditionBased’ and
Expression to ‘[email protected] == 0’.
On the True segment, place an Assign step. Set the State Variable Name to ‘a3.CurrentCapacity’ and leave the New
Value ‘0.0’.
This process will check to see if there are any entities processing, waiting to be processed, and routing to the server
for processing. If there are not, then it assigns the Server’s capacity to 0.
Repeat this for Servers a4, a5, and a6.
60 / 1277
Simio Reference Guide
AnimatedPeople - SimBit
Problem:
I would like to use animated people (i.e. walking people) and change the animation of the person in the model.
Categories:
Animation, Entity Characteristics
Key Concepts:
Active Symbol, Assign Step, Current Animation Index
Assumption:
This model assumes the user is using the animated people symbols that are available in the Simio Project Symbol library
available with the Simio installation ( Library\People\Animated). To ensure you only get symbols of people that move, click
on the Apply Symbol button. Then change the Action filter to Animated.
Technical Approach:
This model demonstrates how to use the animation features available with some of the animated symbols provided in the
Simio Symbol Library. Once an animated symbol is placed in the Facility window, right click onto the symbol and select List
Animations of Active Symbol to see what options are available for animation of this symbol.
When an entity is selected, there are two properties on the entity which control the animation for the symbol. The Current
Animation Index returns the numeric index or string name of the current animation of the current active symbol. By default,
the value of this property is ‘ModelEntity.Animation’, which is a String State on the ModelEntity object.
The other property on the ModelEntity that controls animation is the Default Animation Action property. This indicates if
and how Simio will animate objects that don’t have an explicit animation set via the Current Animation Index expression.
The possible values for this property are None, Moving and MovingAndIdle. ‘None’ means that no action will be taken.
‘Moving’ indicates actively moving entities will be animated with any available forward movement animations from the
active symbol. ‘MovingAndIdle’ indicates actively moving entity and idle objects will be animated with any available
forward movement or idle animations from the active symbol.
Details for Building the Model:
Simple System Setup
Place four Source objects and four Sink objects. Connect the first three Source objects to the first three Sink objects
with a Path.
Place a TransferNode between Source4 and Sink4 and connect Source4 to the TransferNode with a Path and connect
the TransferNode to Sink4 with a Path.
Randomly Assign Animation Example ( Source1)
Drag an entity into the Facility window from the Project Library. Rename this entity ‘Person1’.
With this entity selected, select one of the Male icons from the Project Symbols drop down menu in the ribbon
(under Library\People\Animated).
With the male entity selected, right click and select List Animations of Active Symbol to see what options are available
for animation of this symbol. Notice the options for “Walk” and “Run”. Click OK to close the window.
Select Source1 and open the Before Exiting Repeat Property Editor window. Click Add and enter the State Variable
Name, ‘ModelEntity.Animation’. Set the New Value to ‘Random.Discrete(“Walk”, .6, “Run”, 1) so that 60% of the
entities will walk and the other 40% will run.
Assign Numeric Value to Current Animation Index Property Example ( Source2)
Place another entity into the Facility window from the Project Library. Rename this entity ‘Person2’.
With this entity selected, select one of the Female icons from the Project Symbols drop down menu in the ribbon.
With the Female entity selected, right click and select List Animations of Active Symbol to see what options are
available for animation of this symbol. Notice that number 13 is “Walk Pushing”. Click OK to close the window.
With the Female entity selected, expand the Animation property category and find the Current Animation Index
property. This property will accept either an expression that returns the numeric index or string name of the current
61 / 1277
property. This property will accept either an expression that returns the numeric index or string name of the current
animation of the active symbol. Put the value of '13' into this property so that the entities will “Walk Pushing”.
Click onto Source2 and change the Entity Type property to ‘Person2’ so that it produces this new entity type.
Simio Determines Animation Based on Speed Example ( Source3)
Place an entity into the Facility window from the Project Library. Rename this entity ‘Person3’.
With this entity selected, select a Male from the Project Symbols drop down menu in the ribbon.
Click onto Source2 and change the Entity Type property to ‘Person3’ so that it produces this new entity type.
With Source3 selected, open the Before Exiting Repeat Property Editor window. Click Add and enter the State
Variable Name, ‘ModelEntity.DesiredSpeed’. Set the New Value to ‘Random.Uniform(.1,3)’ and Units to ‘Meters per
Second’ so that some entities travel slow and others fast. Simio will determine which animation to use, based on the
speed. Notice that some entities will walk, while others will run.
Change the Allow Passing property on the path between the Source and Sink to be 'False', so that slower walking
people cause others to slow down as well.
Change Animation in Logic Example ( Source4)
Select Source4 and open the Before Exiting Repeat Property Editor window. Click Add and enter the State Variable
Name, ‘ModelEntity.Animation’. Set the New Value to ‘Random.Discrete(“Run”, .5, “Dance”, 1) so that 50% of the
entities will run and the other 50% will dance.
Click onto TransferNode1 and create a new State Assignment in the On Entering property.
In the Repeat Group, set the State Variable Name to ‘ModelEntity.Animation’ and the New Value to '“Walk”'. When
the entity enters this TransferNode, it will change from its current animation of “Dance” or “Run” to “Walk”. Note that
you can do this using an Add-On Process Trigger with an Assign step as well.
Embellishments:
Change the active animation to try different options, such as a sitting female symbol or a male symbol that is texting.
*IMPORTANT NOTE: Animation options, such as “Walk”, “Run”, “Dance”, etc. are case-sensitive.
62 / 1277
Simio Reference Guide
AnimatePathDensity - SimBit
Problem:
I would like to animate the travel density of each path by changing the width of each path so that the width is equal to the
percentage of travelers that have traveled this path.
Categories:
Add-On Process Logic, Animation, Building New Objects/Heirarchy
Key Concepts:
Add-On Process, Assign Step, Custom Object, NumberEntered, On Entered, Size.Width, State Assignments
Technical Approach:
The model demonstrates how to animate the travel density of a path by changing the width so that the width is equal to
the percentage of travelers that have traveled this path. The model demonstrates how to do this using the standard Path
object and an Add On Process and also by customizing the Path object and using this subclassed Path to accomplish the
same goal.
The first demonstration contains three standard paths connecting a Source and a Sink object. Each path has a different
value set for its Selection Weight property, indicating the percentage of entities that should travel on each path. Upon
entering each path, the Path.Size.Width state is set to the percentage of travelers that have entered into this Path divided
by the total traffic in the system.
The second demonstration is the same as the first, except that a custom path object is used that contains the width update
inside its own logic instead of having the width updated with an Add On Process in the model.
Enhanced Technical Approach:
Facility Window:
Place a Source object and a Sink object and connect them with three standard Paths.
In the properties window for Path1, under Routing Logic, set Selection Weight to ‘6’.
In the properties window for Path2, under Routing Logic, set Selection Weight to ‘1’.
In the properties window for Path3, under Routing Logic, set Selection Weight to ‘3’.
Definitions Window:
Go to the States panel and create a new Real State named TotalTraffic_Example1.
Processes Window:
Create a new process and name it Path_Entered.
Place an Assign Step and set the State Variable Name to ‘TotalTraffic_Example1’ and the New Value to
‘TotalTraffic_Example1 + 1’
Place another Assign Step. Set the State Variable Name to ‘Path1.Size.Width’ and the New Value to
‘Path1.NumberTravelers.Entered/TotalTraffic_Example1’
Add two more assignments to this Assign Step, assigning the same values to Path2 and Path3. For example:
Path2.Size.Width should be set to ‘Path2.NumberTravelers.Entered/TotalTraffic_Example1’
Facility Window:
Select each Path (hold CTRL and click onto each Path). Under the Add-On Process Triggers property category, enter
the name of the process ( Path_Entered) into the Entered property. Therefore, each time a Modelentity enters any
path, this new process is executed.
To create a custom Path object (functionality not available with Simio Express Edition):
Go to the Definitions Window and create a second Real State, named ‘TotalTraffic_Example2’
In the Facility window, right click onto the Path in the Standard Library and select Subclass.
Click onto the new Path object in the Navigation Window.
Go into the Definitions window of the MyPath object. Go to the Properties panel and create a new State
Property by selecting this from the Standard Property drop down in the Ribbon. Name this new property
63 / 1277
Property by selecting this from the Standard Property drop down in the Ribbon. Name this new property
‘TotalTraffic’.
Go into the Processes window of the MyPath object
Find the OnEntered process and with this selected, click onto Override in the Ribbon to override the default
logic.
Place an Assign Step after the EntityMovementRate Assign Step and before the IfPassingAllowed Decide step.
Set the State Variable Name to ‘TotalTraffic’ and the New Value property to ‘TotalTraffic + 1’
Place another Assign Step after this. Set the State Variable Name to ‘Size.Width’ and the New Value property to
‘NumberTravelers.Entered/TotalTraffic’
When you use this new MyPath object in the main model to build the second example, you will need to put the name
of the state variable ‘TotalTraffic_Example2’ into the State Property on each instance of the MyPath that you place
into the Facility window. This will tell this object which State Variable to update in order to keep track of the total
traffic in this system.
64 / 1277
Simio Reference Guide
AnimatingQueuesWithVehiclesAndWorkers -
SimBit
Problem:
I would like to show entities in different queues based on an expression and match the animation speed of an animated
entity in an attached queue with the Vehicle/Worker.
Categories:
Animation, Data Tables, Entity Characteristics, Vehicles, Worker
Key Concepts:
Animated Symbol, Before Creating Entities, Bidirectional Path, Data Table, Entity Property, Initial Desired Speed, Initial
Node ( Home), Match Attached Animation Speed , ModelEntity, Queue, Queue State, People, Priority, RandomRow, Real
Property, Ride On Transporter, RideStation.Contents Queue, Sink, Source, Symbol, Table Row Referencing, Vehicle, Visibility
Expression, Worker
Technical Approach:
The Vehicle picks up multiple entities and they are shown in different queues based on the Visibility Expression on the
queues. A Worker transports an animated entity, and the animation speed is automatically set to match the Worker’s speed.
Details for Building the Model:
Top Model
Place a Source ( Source1), Sink ( Sink1), and Vehicle ( Vehicle1) on the Facility window.
Use a Path to connect Source1 to Sink1, and use a second path to connect Sink1 to Source1.
Place two ModelEntity instances from the Project Library on the bottom left into the Facility window.
Select DefaultEntity and change its Initial Priority to ‘2’. Leave the other Entity’s Initial Priority as ‘1.0’.
Double click DefaultEntity and change its name it to ‘Red’. Change the other Entity’s name to ‘Blue’.
Select the Red Entity, open the Color dropdown on the Symbol Ribbon and select the Red box. Then click the top of
the Red ModelEntity. Click the Red box in the Color dropdown again and select the side of the Red ModelEntity
(must be in 3D mode to view side - press ‘3’ key). Change the Blue entity’s symbol color to blue.
Open the Data Tab and click Add Data Table ( Table1). Add an Entity Property Column ( Object Reference dropdown)
and a Real Property Column ( Standard Property dropdown). Change the column Name to ‘WhichType’ and
‘HowMuch’, respectively.
In column Which Type input ‘Blue’, ‘Red’ and in column How Much input ‘60’, ‘40’.
On Source1, set Entity Type to ‘Table1.WhichType’. Under Table Row Referencing-> Before Creating Entities set Table
Name to ‘Table1’ and Row Number to ‘Table1.HowMuch.RandomRow’.
On Output@Source1, set Ride On Transporter to ‘True’ and Transporter Name to ‘Vehicle1’.
Select Vehicle1 and change its Initial Ride Capacity to ‘4’, Initial Desired Speed to ‘.5 meters per second’, and Initial
Node (Home) to ‘Input@Sink1’.
Select the Vehicle1 RideStation.Contents queue. Set the Visibility Expression to ‘Candidate.ModelEntity.Priority == 1’.
Select Vehicle1. In the Draw Queue dropdown (in the Symbols Ribbon) select RideStation.Contents. To draw the
queue, click and release in the model space just below the right side of Vehicle1, click and release in the space jest
below the left side of Vehicle1, and then right click to stop drawing the queue.
Select that queue and set the Visibility Expression to ‘Candidate.ModelEntity.Priority == 2’.
To move the queue, first press the ‘3’ key to go to 3D mode. Then select the queue and hold the ‘Shift’ key to move
the queue vertically. Move the queues so both are directly above the vehicle. Press ‘2’ to go back to 2D mode.
Bottom Model
Place a Source ( Source2), Sink ( Sink2), Worker ( Worker1), and ModelEntity on the Facility window.
Connect the Source to the Sink using a Path and set its Type to ‘Bidirectional’.
Select the ModelEntity, then click Apply Symbol in the Symbols Ribbon. Scroll down to the ‘Animated’ categories
and select a person.
65 / 1277
Double click the ModelEntity and rename it to ‘Person’.
On Source2, set Entity Type to ‘Person’ and Interarrival Time to ‘Random.Exponential(3)’.
On Output@Source2, set Ride On Transporter to ‘True’ and Transporter Name to ‘Worker1’.
On Worker1, set Initial Desired Speed to ‘.2 meters per second’ and Initial Node (Home) to ‘Input@Sink2’.
Select Worker1 and click Apply Symbol in the Symbols Ribbon. Scroll down to the ‘Animated’ categories and select a
person.
Select Worker1’s RideStation.Contents queue. Hold the Shift key to lower the queue. Then press the ‘2’ key to switch
to 2D mode. Use the green circle ends of the queue to adjust its placement. By default, the queue option for Match
Attached Animation Speed is turned on. This will cause the entity in the queue to be animated (walking) with the
worker instead of gliding.
66 / 1277
Simio Reference Guide
AppointmentArrivals - SimBit
Problem:
I would like to model arrivals that occur at a specific time, such as scheduled appointments.
Categories:
Arrival Logic
Key Concepts:
Arrival Mode, Arrival Table, Arrival Time Deviation, Data Table, Floor Label, Status Plot
Technical Approach:
Scheduled arrivals are put into a Data Table in a DateTime property column. In this example, appointments are scheduled
every 15 minutes from 8:00am until 4:30pm. The Source object reads the arrival data table to see when to create an entity.
However, since the Source’s Arrival Time Deviation property has a non-zero value, there will be some deviation from when
the entities are actually created from the time listed in the table. This simulates that some people arrive early to their
appointment and some people arrive late. Because the Source’s Arrival No-Show property is set to .05, there is a 5%
chance of each arrival being a no-show, which simulates the scenario when someone doesn’t show up at all for their
scheduled appointment. The plots and floor labels show how the status of the Average Number of entities waiting to be
served and the Average Time that each entity waits to be served.
Details for Building the Model:
Simple System Setup
Click on the Data tab and create a new Data Table by clicking on Add Data Table in the Schema ribbon and name
this new table DailyAppointments. Create a Date Time column by selecting DateTime in the Property drop down in
the Schema ribbon. Name this new column AppointmentTime.
Enter data into the table, beginning at 8:00am on the day the simulation begins and every 15 minutes for the
rest of the day, with the last appointment occurring at 4:30pm.
Place a Source, Server and Sink into the Facility window and connect them with Paths. Alternatively, go to the Project
Home ribbon and select the Source, Server, Sink option from the Actions (under Add-Ins) drop down.
Select the Source object and set the following properties:
Arrival Mode to ‘Arrival Table’
ArrivalTimeProperty to ‘DailyAppointments.AppointmentTime’ – pointing to the DateTime column you
created.
ArrivalTimeDeviation to ‘Random.Uniform(-5,5)’ and the Units to ‘Minutes’
Arrival No-Show Probability to ‘.05’
Select the Server object and set the Processing Time property to ‘Random.Triangular(10, 16, 22)’
Click onto the Run ribbon and change the starting time of the simulation run to be 8:00am and the ending time to be
5:00pm on the same day. The date should match the date that was entered into the Data Table.
Embellishments:
Place a Status Plot that displays statistics of interest, such as the expression
‘Server1.InputBuffer.Contents.AverageNumberWaiting’ or ‘Server1.InputBuffer.Contents.AverageTimeWaiting’.
Arrival Tables can also use a numeric property column that lists the amount of time the arrival should occur after the start
of the simulation run. For example, if the Arrival table had a Numeric column and had the entries of .25, .5, an arrival would
be generated at .25 hours after the start of the simulation run and again at .5 hours after the start of the simulation run. This
is just an alternate way to model scheduled arrivals.
67 / 1277
Simio Reference Guide
BatchingProcessUsingScanOrWaitStepToControlBatchSize
- SimBit
Problem:
I want to model a single server that must process entities in batches. For example, an oven that cures a quantity of arriving
items all at once.
Categories:
Combining and Separating Entities
Key Concepts:
Batching, Scan Step, Wait Step, Monitor, Polled Waiting, Event Driven Waiting
Assumptions:
A system consists of a single server that must process entities in batches. For example, an oven that cures a quantity of
arriving items all at once. The time between entity arrivals to the system is sampled from an exponential distribution,
EXPO(1.1) minutes.
The maximum size of a batch that can be processed depends on the server’s capacity. In this example, that capacity is set
to 10, with a minimum batch size requirement of 8 items before the process can be started. Thus, the processing of the next
batch cannot be started unless there are at least that many entities waiting in the server’s input buffer. The process delay
itself is batch size dependent and is 3 minutes plus 0.6 minutes for each item in the batch. Once processing of a batch is
completed, the individual entities that were processed together then exit the server.
Details for Building the Model:
Facility Window Setup
Add a Source, Server, and Sink to the Facility window. Connect the Source to the Server and the Server to the Sink
using Connector links.
Place a ModelEntity object from the Project Library into the Facility window. The name may be left as ‘DefaultEntity’.
Source Properties
Specify the Interarrival Time as ‘Random.Exponential(1.1)’ minutes.
Server Properties
Specify the Initial Capacity as ‘10’. This is the maximum batch size constraint.
Specify the Processing Time as ‘3 + 0.6 * Server1.Capacity.Allocated’ minutes.
Go to Add-On Process Triggers and create add-on processes to be executed for Run Initialized and Evaluating Seize
Request.
Definitions-> States
Add a global boolean state variable named 'Server1HoldForBatching' (initial value of 'True'). This variable will be
used in conjunction with the server’s Evaluating Seize Request add-on process to indicate whether entities arriving to
the server can currently seize it.
Definitions-> Elements
If using a Wait step approach (event driven waiting) to model the batch size control at the server, then add a Monitor
element to the model named ‘Server1StatusChanged’ that fires an event whenever discrete state changes are
detected for the state variables Server1.AllocationQueue or Server1.ResourceState.
Processes Window -> The server’s Evaluating Seize Request triggered process
Refer to the example model for guidance. The purpose of this process logic is to reject an entity’s attempt to seize
the server (by assigning the executing token’s ReturnValue state to False) if the value of the boolean state variable
Server1HoldForBatching is 'True'.
Processes Window -> The server’s Run Initialized triggered process
Refer to the example model for guidance. The purpose of this process logic is, when the server is initialized, to create
a single control token that waits at either a Scan or Wait step until the minimum acceptable number of entities is
waiting to seize the server and the server is idle. Once that condition is true, the token is released from the Scan or
Wait step and momentarily sets the Server1HoldForBatching flag to 'False' before then executing an Allocate step to
allocate the server’s capacity (up to a maximum of 10). The token then sets the Server1HoldForBatching flag to 'True'
and loops back to the Scan or Wait step to wait until it can start the processing of the next batch.
68 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
69 / 1277
Simio Reference Guide
BidirectionalPaths - SimBit
Problem:
I have bidirectional links in my system, but my entities get stuck at a node trying to get from one link to the other in
opposite directions.
Categories:
Decision Logic -- Paths
Key Concepts:
Allow Passing, BasicNode, Bidirectional Path, Deadlock, Path, Prefer Desired Direction, Traffic Direction Rule
Assumptions:
Entities are able to pass each other at ‘bypass’ areas along various bidirectional paths.
Technical Approach:
The path network is set up with multiple bidirectional paths. The paths are separated at various points along the path with
a small triangle of unidirectional paths so that entities may sit/wait for passing in the opposite direction to occur.
Details for Building the Model:
Simple System Setup
Place a Source ( Source1) and Sink ( Sink1) at the left and right sides, respectively, of the Facility window.
Then, place a second Source ( Source2) at the right side, below Sink1. Place a second Sink ( Sink2) on the left, below
Source1.
Place two ModelEntity objects. Change the names to 'Red' and 'Green' and change the symbol color of Red to match
the name. Change Entity Type of Source1 to ‘Green’ and Entity Type of Source2 to ‘Red’.
Specifying the Destination Locations
Within Source1’s output node ( Output@Source1), change the Entity Destination Type to ‘Specific’ and the Node
Name to ‘Input@Sink1’. Similarly, within Source2’s output node ( Output@Source2), change the Entity Destination
Type to ‘Specific’ and the Node Name to ‘Input@Sink2’. These destinations need to be specified because with the
network of paths, the option ‘Continue’ for Entity Destination Type could cause entities to continually loop around the
paths.
Adding Nodes, Paths and a Bidirectional Path
Place a BasicNode1 to the right of Source1/Sink1. Place a second BasicNode2 to the left of Source2/Sink2.
Using Paths, connect Source1 to BasicNode1 and Source2 to BasicNode2. Then connect BasicNode1 to Sink1 and
BasicNode2 to Sink2. For the Paths connecting the Sources to the BasicNodes, set Allow Passing to ‘False’.
Add a path connecting BasicNode1 and BasicNode2. Change the path’s Type to ‘Bidirectional’, Allow Passing to
‘False’ and Speed Limit to ‘.1’.
Positioning the Nodes
Place 6 basic nodes in the middle of the Facility window between the Source1/Sink2 and Sink1/Source2. BasicNode1
and BasicNode2 are closest to the Sources/Sinks, while two are near each other about 1/3 of the way between
BasicNode1 and BasicNode2. The other two are near each other about 2/3 of the way between BaasicNode1 and
BasicNode2. See the diagram below for placement.
71 / 1277
Simio Reference Guide
ChangingQueuesWhenServerFails - SimBit
Problem:
A system consists of two parallel servers. If one of the servers fails, then entities waiting to get processed at that server are
redirected to the other server if that server is operational.
Categories:
Buffering
Key Concepts:
Buffer Logic, Balking, Reneging, Jockeying, Reliability Logic, Failure, Processing Count Based
Technical Approach:
Balking and reneging behavior is specified for the input buffer of each server. An arriving entity balks entering the input
buffer of a server if the server is currently failed and the other server is operational. The balked entity is then redirected to
the operational server. Also, if a server fails, then any entities already waiting in its input buffer are automatically removed
from the queue (reneged) and redirected to the other server if that server is operational.
Details for Building the Model:
Facility Window Setup
Add a Source, two Servers, and a Sink from the Standard Library. Connect the Source to each of the Servers and the
Servers to the Sink using Paths. Place a BasicNode next to each Server. Connect the BasicNode at Server1 to the
input node at Server2 and the BasicNode at Server2 to the input node at Server1 using Paths.
For Server1, go to Reliability Logic and specify the server’s Failure Type as 'Processing Count Based', the Count
Between Failures as 'Random.Uniform(20,30)' and the Time To Repair as 'Random.Uniform(5,10)' minutes.
For Server2, go to Reliability Logic and specify the server’s Failure Type as 'Processing Count Based', the Count
Between Failures as 'Random.Uniform(30,45)' and the Time To Repair as 'Random.Triangular(5,10,15)' minutes.
For Server1, go to Buffer Logic -> Input Buffer -> Balking & Reneging Options and specify the Balk Decision Type as
'Conditional'. Specify the Balk Condition Or Probability as 'Server1.Failure.Active && !Server2.Failure.Active'. This will
cause an arriving entity to balk entering the input buffer of Server1 if that server is failed but Server2 is operational.
Send balked entities to the Balk Node Name that redirects them to Server2. Then open the Renege Triggers repeat
group and add event-based triggers that will remove entities waiting in Server1’s input buffer and redirect them to
Server2 if Server1 is failed but Server2 is operational. Refer to the example model for guidance on specifying the
renege trigger properties.
For Server2, go to Buffer Logic -> Input Buffer -> Balking & Reneging Options and specify similar balking and
reneging behavior that was described above for the input buffer of Server1. Refer to the example model for
guidance on specifying the renege trigger properties.
Place a ModelEntity instance from the Project Library and add an additional symbol from the Symbols ribbon. Select
the new symbol (value 1) and change the color from the default green to red.
For both Server1 and Server2, go to State Assignments and open the On Balking and On Reneging repeat groups.
Assign the ModelEntity.Picture of an entity that is balking at entering or reneging from the input buffer of the server
to the value '1' (i.e., the red colored symbol). Refer to the example model for any further guidance on specifying
these animation related state assignments.
Defining the Node Selection List from the Source
Within the Definitions window, select the Lists panel. Create a Node list named 'ServerNodeList' and add
'Input@Server1' and 'Input@Server2' to the list.
Go back to the Facility window and change the Source’s Interarrival Time to 'Random.Exponential(.15)' and Maximum
Arrivals ( Stopping Conditions section) to '200'.
For the Source’s output node, change the Entity Destination Type to 'Select From List', the Node List Name to
'ServerNodeList', and the Selection Condition to '!Candidate.Server.Failure.Active'. This will send new entities created
by the Source to the first of the parallel servers that is not currently failed.
See also:
72 / 1277
ServerQueueWithBalkingAndReneging.spfx
73 / 1277
Simio Reference Guide
CheckingNextEntityAheadOnLink - SimBit
Problem:
I want to know the traffic that is in-front of an entity on a link.
Categories:
Add-On Process Logic
Key Concepts:
Add-On Process, Decide Step, Delay Step, Floor Label, NextEntityAheadOnLink, Path, TransferNode
Technical Approach:
A process is created which triggers when an entity enters a path. In the process, entity is delayed to maintain the desired
fixed distance from the next entity ahead of it on the link. A floor label is used to display information on the ModelEntity.
Details for Building the Model:
Simple System Setup
Add a Source, TransferNode and Sink from the Standard Library. Connect the Source to TransferNode and
TransferNode to Sink using Paths.
In the Properties window for Path2, under Add-On Process Triggers, click Entered and select ‘[ Create New]’. This will
create a new process named Path2_Entered within the Processes window.
Place an instance of ModelEntity from the Project Library named ‘DefaultEntity’. Highlight the Entity and attach a
Floor Label from the Symbols ribbon. Edit the Floor Label from the Appearance ribbon. Add ‘Entity { ID } is following
{ NextEntityAheadOnLink} at { NetworkDistanceTo.NextEntityAheadOnLink}’ as Label Text.
Defining the Process
Under Path2_Entered, add a Decide step into the process. Set the Decide Type to ‘ConditionBased’ and Expression to
‘ModelEntity.NetworkDistanceTo.NextEntityAheadOnLink < 10 & &
ModelEntity.NetworkDistanceTo.NextEntityAheadOnLink != 0’.This will evaluate the entity, if any, in front of the
current entity and will return a ‘True’ if the distance is less than 10 (meters, which is the default distance units).
From the Decide step’s True exit, add a Delay Step with the Delay Time of ‘2’ and Units of ‘Seconds’. The Delay step
should then connect back to the Decide step for re-evaluation.
74 / 1277
Simio Reference Guide
ChooseAlternateSequence - SimBit
Problem:
I have a model that normally process parts in the sequence Server1, Server2, Server3, Inspect, Sink but based on the result
of the inspection, it sometimes must be diverted to Adjust and then restart at Server2.
Categories:
Add-On Process Logic, Sequence Tables
Key Concepts:
Sequence Table, By Sequence, Entity Destination Type, Add-On Process, SetRow Step
Assumption:
The source produces one type of entity. The entity will follow a primary sequence of: Source – Server1 – Server2 – Server3
– Inspect – Sink.
But if it fails inspection (30% of the time) it will divert to an alternate sequence of Adjust and then resume its normal
sequence from Server2.
Technical Approach:
Separate Sequence Tables are created for the entity to follow its normal sequence and sometimes divert to another route.
We will create one main sequence table which is identical to the first sequence specified above. We will create an
additional sequence to switch to if the entity fails and has to go to the Adjust server. In order to make decisions at the
inspection, add-on processes will be created.
Details for Building the Model:
Simple System Setup
Place a Source and a Sink in the Facility window. In between them, place four Servers that are relatively next to each
other and place Server5 parallel to Server4.
Connect an Output Node of Source to an Input Node of Server1, an Output Node of Server1 to an Input Node of
Server2, an Output Node of Server2 to an Input Node of Server3, an Output Node of Server3 to an Input Node of
Server4, and an Output Node of Server4 to the Sink with a Path. An Output Node of Server 4 to an Input Node of
Server5 and an Output Node of Server 5 to an Input Node of Server2 must be connected with a Path also.
Rename Server4 to Inspect and Server5 to Adjust. Place one Model Entity object in a Facility window. Rename Model
Entity to ‘Part’.
Setting up the Sequence Tables
In the Data Window, select the Tables panel and add two Sequence Tables. Name them ‘NormalSequence’ and
‘AdjustmentSequence’.
For the NormalSequence, set the following sequence: Input@Server1 – Input@Server2 – Input@Server3 –
Input@Inspect – Input@Sink1
For the AdjustmentSequence, set the sequence: Input@Adjust.
Setting up Add-On Process
In the Facility window, by clicking Inspect object and under Add-On Process Triggers by double clicking After
Processing, a process will be created by default in a Processes window.
Repeat these steps with Adjust object in order to create After Processing Add-On Process as well.
Setting up Process Logic
In a Processes Window in the Inspect_AfterProcessing process, place a Decide step to represent the inspection and
the likelihood of passing. Change its Decide Type is going to be ‘ProbabilityBased’ with Expression set to ‘0.7’. The
True exit represents “Passed” and requires no action – we will leave that unchanged. The False exit represents “Failed”
and requires using SetRow step to change to an alternate Sequence (set Table Name to ‘AdjustmentSequence’ and
leave Row Number at its default (the start of the sequence)). Here we have also added an Assign step to set the
ModelEntity.Picture to ‘1’ so we can identify it as a red failed part in the model.
75 / 1277
ModelEntity.Picture to ‘1’ so we can identify it as a red failed part in the model.
In the Adjust_AfterProcessing process, we need to restore the part to its normal look and processing. Place SetRow
step with Table Name of ‘NormalSequence’. Set the Row Number to ‘2’ to allow entity to resume with Server2 object
and follow its normal sequence. Also add an Assign step to set the ModelEntity.Picture back to ‘0’ so it will again be
green.
Finalizing the Model
Change the Initial Sequence of the Entity to ‘NormalSequence’.
Add Additional Symbol to the entity and color it red.
Change the Interarrival Time on the Source to ‘Random.Exponential(.3)’ to give a more balanced system.
76 / 1277
Simio Reference Guide
CombineMatchingMembers - SimBit
Problem:
I want to batch multiple entities together for subsequent processing. Only entities with identical state values can be
batched together.
Categories:
Combining and Separating Entities
Key Concepts:
BatchMembers Queue, Combiner, Matching Rule, MemberInputBuffer, ModelEntity, ParentInputBuffer, Priority, Queue
Assumptions:
We will batch 4 parts together into each container and as many as 5 batches can be worked on concurrently.
Technical Approach:
Use the existing state named ‘ModelEntity.Priority’ and use an Add-On Process in the Source to assign it. Use a Combiner
of capacity 5 to do the batching of 4 Parts into a Container.
Details for Building the Model:
Simple System Setup
Add two Sources, a Combiner, a Server and a Sink to the Facility Window.
Connect the Sources to the Combiner, the Combiner to the Server and Server to the Sink with Paths.
Adding Multiple Entity Types
Drag two ModelEntity objects from the Project Library into the Facility Window and change the Name of each.
Specify two different entity types, ‘Parts’ and ‘Containers’.
Designate each Source object to generate a different part type by changing the Entity Type property on one to be
‘Parts’ and the other to be ‘Containers’.
Changing the Entity Priority
Within the ‘Parts’ Source object , enter the State Assignments, Before Exiting repeating editor and add a State Variable
Name ‘ModelEntity.Priority’ with a New Value of 1 or 2 using the ‘Random.Discrete( 1, .5, 2, 1)’ distribution function.
Using the Combiner
The Combiner is batching four members ( Parts) to one parent ( Container) and only batches members together that
have matching priority value (e.g. each batch will have either four entities with priority of 1 or four entities with
priority of 2). This is done by specifying the Batch Quantity to ‘4’, Matching Rule to ‘Match Members’ and Member
Match Expression to ‘ModelEntity.Priority’.
As mentioned in Assumptions, the Combiner has a Capacity of ‘5’, meaning up to 5 batches may be processing at a
time, with Processing Time set to ‘Random.Uniform(1,5)’.
Enhancing the Animation
Move the queue that displays parents waiting for a match.
Add a queue that displays members waiting for a match by selecting a Detached Queue from the Drawing tab and
changing the Queue State to ‘Combiner1.MemberInputBuffer.Contents’.
77 / 1277
Simio Reference Guide
CombineMultipleEntityTypesOntoPallets -
SimBit
Problem:
Use a Combiner object to pack quantities of multiple entity types onto pallets.
Categories:
Combining and Separating Entities
Key Concepts:
Combiner, Batch Quantity, Matching Rule
Assumptions:
The following quantities and entity types are required to be packed onto each pallet:
Once the target batch quantities have been collected and placed on a pallet, a processing time of
Random.Triangular(.1,.2,.3) minutes is required to finish the packing process.
Technical Approach:
A Combiner object is used to collect the required batch quantities and attach the member entities to parent pallet entities.
Details for Building the Model:
Simple System Setup
Place 5 Sources, 1 Combiner, and 1 Sink in the Facility window.
Place 5 ModelEntity objects into the Facility window, one next to each Source.
Use Paths to connect Source1 to the ParentInput@Combiner, the 4 other Sources to the MemberInput@Combiner,
and the Combiner to the Sink.
Rename the Entities: ‘Pallet’, ‘A’, ‘B’,’C’, and ‘D’.
Change Entity Type of Source1 to ‘Pallet’ and Entity Type of the other Sources to ‘A’, ‘B’, ‘C’, ‘D’ respectively, so each
entity type is created by a different Source.
For Source1 that is creating the pallet entities, specify the Arrival Modee as 'On Event', Initial Number Entities as '1',
and the Triggering Event Name as '[email protected]'. This will cause the source to automatically create a
new pallet whenever the previous pallet has left the combiner.
Select the Pallet entity, and in the Symbol ribbon, click the Draw Queue drop down and select BatchMembers. Click
near the Pallet entity, then click somewhere else to create the queue. Right-click to end queue building. Make it long
enough to show 7 entities.
Mutli-select Entities A—D by holding Ctrl when selecting the entities. Then change the Dynamic Label Text to
‘ModelEntity.EntityType.Name’.
Combiner Setup
In the Batching Logic properties, specify the following Batch Quantity and Matching Rule information:
78 / 1277
Then, in the Process Logic properties, specify ''Random.Triangular(.1,.2,.3)' minutes as the Processing Time.
Embellishments:
Change the symbol or color of each Entity Type.
Change the arrival rates at the member entity Sources to see how that affects queue length in the member input buffer of
the Combiner.
79 / 1277
Simio Reference Guide
CombinerNode - SimBit
Problem:
I want to create a user-defined node that can batch entities based on entity priority.
Categories:
Building New Objects / Hierarchy, Combining and Separating Entities
Key Concepts:
Batch Step, BatchLogic Element, BatchMembers Queue, Expression Property, Decide Step, Discrete State, EndTransfer
Step, Node Class, OnEntered, OnEnteredParking, Path, Park Step, Search Step, State Variable, Station Element, Transfer
Step, UnPark Step
Technical Approach:
A node object is created that has process logic which stops entities at the node to batch them into the user-defined Batch
Size and then sends them out through the node. The process logic first checks if the entity needs to be batched. If so, the
entity is transferred to the ParkingStation until the batch is complete. If a parent already exists in the batch logic for that
priority, the entity becomes a member. After all the members of the batch arrive, the batched entity is transferred from the
ParkingStation back to the beginning of the node process. Since the entity is batched, the batched entity is transferred to
the outbound link.
Details for Building the Model:
Creating the Node Object and Defining the Properties, States and Elements
On Project Home ribbon, click the New Model dropdown list and select Node Class. A new Node will be created in
the Navigation window.
In the Node Model Properties (right click on the object and select Properties), change the Model Name to
'CombinerNode'.
In the Definitions Window, select Properties window. From the Standard Property list, select Expression. In the
Properties window, change the Name to ‘BatchSize’, set Default Value as ‘2’, Display Name to ‘Batch Size’, Category
Name to ‘Process Logic’, and Description to ‘Total number in group, including parent.’
Click Properties ( Inherited). Select CapacityType. Change Visible to ‘False’. Also do this for InitialCapacity,
WorkSchedule, RankingRule, and DynamicSelectionRule. Changing the visibility will hide these properties in the
CombinerNode Properties window since we will not be using them.
Click the States button on the Definitions panel, and select Real from the States ribbon to add a new state. Change
the Name to ‘Batched’ and the Initial State Value to ‘0’.
Select the Elements button from the Definitions panel, and add a BatchLogic element from the Elements ribbon. Set
Batch Quantity to ‘BatchSize – 1’. BatchSize typically represents the number of ‘member’ entities to batch with a
single parent entity. Set Matching Rule to ‘MatchMembersAndParent’, Member Match Expression to
‘ModelEntity.Priority’, and Parent Match Expression to ‘ModelEntity.Priority’.
Creating Process Logic for the CombinerNode
In the Processes window, click Select Process and select OnEntered.
Add the following steps in order to the OnEntered process: Decide, Park, Search, Decide, Batch, Assign and UnPark.
Batch, Park, and UnPark are under All Steps.
Select the first Decide Step; set Decide Type to ‘ConditionBased’ and Expression to ‘Batched==0’. When all entities
first enter the node, this condition will be true and they will continue out the True exit (you will see shortly when the
condition will be false).
The Park step is used so that entities will sit and graphically wait at the node until the batch is made (otherwise, they
will be shown at the node on top of each other). No property changes are necessary for this step.
Set the Search step Collection Type to ‘QueueState’, Queue State Name to ‘BatchLogic1.ParentQueue’, Match
Condition to ‘ModelEntity.Priority==Candidate.ModelEntity.Priority’, Search Expression to ‘1’. This step is used to
determine if there is already a ‘parent’ entity (one entity of that same priority value). The value of the Search
Expression is returned in the Token.ReturnValue for the process. If no items are found (no parent yet), the return value
will be 0.
80 / 1277
For the second Decide step, set Decide Type to ‘ConditionBased’ and Expression to ‘Token.ReturnValue<1’ to check
the above returned information.
Within the Batch step, set Batch Logic Name to ‘BatchLogic1’ and Category to ‘Parent’.
Set the Assign step State Variable Name to ‘Batched’ and New Value to ‘1’.
The UnPark step is used once the batch is made to move the newly batched entity from the parking area of the
station (the entity then goes back ’into’ the node and goes through the OnEntered process, which is why we set the
Batched variable to 1, so that newly batched entities will exit the False exit of the Decide step, as shown below).
Add an Assign step to the False branch of the first Decide step. Set the State Variable Name to ‘Batched’ and New
Value to ‘0’.
Add a Transfer step after the Assign step; set From to ‘CurrentNode’ and To as ‘OutboundLink’. This will cause only
newly batched entities to leave the node on the outbound link.
Add a Batch step to the False branch of the second Decide step. Set Batch Logic Name to ‘BatchLogic1’ and
Category to ‘Member’. All entities except the first entering ‘parent’ will go here and be batched with the parent entity.
Click on Select Process on the Process ribbon and select OnEnteredParking. Add an EndTransfer step so that when
the entities are parked, their transfer into the parking station is complete.
Simple System Setup
Click Model in the Navigation window. Add two Sources and a Sink from Standard Library. From the Project library
(below Standard and Flow Libraries on the left), place a CombinerNode in the Facility window. Connect the Sources
to the CombinerNode and the CombinerNode to the Sink using Paths.
Place two instances of ModelEntity from the Project Library. Select one Entity instance and in the Symbol ribbon,
click Draw Queue and select BatchMembers. Draw a line near the Entity and do the same for the other Entity. Set
one entity's Initial Priority to ‘1’ and the other's Initial Priority to ‘2’. Select one entity, click the Color dropdown in the
Symbols Ribbon, select Red, and click the top of the entity.
Set Source1 Entity Type to ‘DefaultEntity’ and Source2 Entity Type to ‘ModelEntity1’.
Select the CombinerNode and set Batch Size to ‘5’.
81 / 1277
Simio Reference Guide
CombinerReleasingBatchEarly - SimBit
Problem:
Use Combiner to pack items onto pallets, but with a max wait time to collect the full batch quantity. A pallet is released
early with a batch quantity less than the target quantity if the max wait time expires.
Categories:
Combining and Separating Entities
Key Concepts:
Combiner, Batch Quantity, Release Batch Early Triggers
Assumptions:
At the Combiner, a target quantity of 5 items is to be packed onto each pallet, but with a max wait time of 1 minute to
collect the full batch quantity. If the max wait time expires, then a pallet is released early with whatever batch quantity was
collected during the waiting time.
Technical Approach:
A Combiner object is used to collect the required batch quantities and attach the member entities to parent pallet entities.
Details for Building the Model:
Simple System Setup
Place 2 Sources, 1 Combiner and 1 Sink in the Facility window.
Place 2 ModelEntity objects into the Facility window, one next to each Source.
Use Paths to connect Source1 to the ParentInput@Combiner1 and Source2 to MemberInput@Combiner1, as well as
to connect the Combiner’s output node to the input node of the Sink.
Rename the ModelEntity objects: ‘Pallet’ and ‘Item’.
Change Entity Type of Source1 to ‘Pallet’ and Entity Type of Source2 to ‘Item’.
For Source1 that is creating the pallet entities, specify the Arrival Mode as ‘On Event’, Initial Number Entities as ‘1’, and
the Triggering Event Name as ‘[email protected]’. This will cause the Source to automatically create a new
pallet whenever the previous pallet has left the Combiner.
Select the Pallet entity, and in the Symbols ribbon, click Apply Symbol and select the Pallet symbol to make the entity
look like a pallet. Then click the Draw Queue drop down and select BatchMembers. Click near the Pallet entity, then
click somewhere else to create the queue. Right-click to end queue building. Make it long enough to show 5 entities.
Combiner Setup
In the Batching Logic properties, specify the Batch Quantity as ‘5’.
Got to the Batching Logic -> Other Batching Options -> Release Batch Early Triggers repeat group and add a time-
based trigger with a Wait Duration of ‘1’ minute.
82 / 1277
Simio Reference Guide
CombineThenSeparate - SimBit
Problem:
I have two different entity types entering the system. I need to batch them together, process the combined batch and then
un-batch them before exiting the system.
Categories:
Combining and Separating Entities
Key Concepts:
Combiner, Separation Mode, Separator, Split Batch
Assumptions:
Parts are batched, then processed through a Server and then separated.
Technical Approach:
Two sources create the two different entity types and then lead into a Combiner object that batches two entities together.
The batched entities are processed by a Server and then sent to a Separator to be un-batched again before exiting the
system.
Details for Building the Model:
Simple System Setup
Place two Sources in the Facility Window. Also place a Combiner, a Server, a Separator and two Sinks into the
Facility Window.
Connect the Sources to the Combiner, the Combiner to the Server, the Server to the Separator and the Separator to
each Sink using a Path.
Defining Multiple Entity Types
Place two ModelEntity objects into the Facility Window by dragging them from Project Library window. Change the
Name property to ‘Entity1’ and ‘Entity2’, respectively.
Within each Source, change the Entity Type property to generate either ‘Entity1’ or ‘Entity2’.
Using the Combiner
The Combiner Batch Quantity should be set to ‘1’ so that the entity at the Parent input node waits for 1 entity at the
Member input node and then batches together.
Separating Entities
The Separation Mode property in the Separator object is set to ‘Split Batch’ and the Split Quantity is set to ‘1’.
Embellishments:
The same requirements could be modeled without a Server object. The processing time of the Server from the above
approach could instead be put in the Processing Time of the Combiner object.
83 / 1277
Simio Reference Guide
CommunicationBetweenObjects - SimBit
Problem:
One object wants to “watch” another’s behavior and react to it.
Categories:
Building New Objects / Hierarchy, Discrete States
Key Concepts:
Assign Step, ContinueProcess, Monitor, Process Triggering Event, Real State Variable, State Property, Status Label, Timer
Element
Assumptions:
We have two fixed objects (the Subject and the Observer), each of which has a state ( SubjectRate and ObserverRate). The
Subject changes SubjectRate randomly. The Observer wants to change ObserverRate to match SubjectRate.
Technical Approach:
Both of the two fixed objects are process models (e.g. no facility logic or objects). The Observer is defined with a State
Property, ObserverRate, that allows a State Property from another object, SubjectRate, to be passed in. The Observer then
uses that state property for both setting up a monitor and getting the value for ObserverRate.
Details for Building the Model:
Defining the Subject
Define a new fixed object Subject with a discrete state variable with Name ‘SubjectRate’.
In the Definitions Window, within the Elements panel, add a Timer element with Name ‘Timer1’ to fire an event with
Interval of ‘1’ hour.
In the Processes Window, add a process with Name ‘SubjectUpdatesValue’ whose Triggering Event is ‘Timer1.Event’.
Add an Assign step where the State Variable Name is ‘SubjectRate’ and the New Value is ‘Random.Triangular( 0, 1, 2)’.
Defining the Observer
Define a new fixed object Observer with a discrete state variable with Name ‘ObserverRate’.
In the Definitions Tab of Observer, select the Properties panel and add a State Property with Name ‘SubjectRate’.
This will allow the value of this property, when placed in a Facility Window of a model, to be assigned to the
SubjectRate of the Subject.
In the Definitions Window, within the Elements tab, add a Monitor element to fire a process when the State Variable
Name ‘SubjectRate’ changes.
In the Processes Window, add a process with Name ‘ObserverFollowsSubject’ whose Triggering Event is
‘Monitor1.Event’.
Add an Assign step where the State Variable Name is ‘ObserverRate’ and the New Value is ‘SubjectRate’.
Defining a new model and using Subject and Observer objects
Open a new model and place one Subject and one Observer within the Facility Window.
In the properties window for the Observer, enter ‘Subject1.SubjectRate’ in the SubjectRate property.
Discussion:
If you watch the trace you will see that every hour the following sequence will occur:
Timer1 triggers an event which triggers the process SubjectUpdatesValue
SubjectRate changes value which triggers the monitor on SubjectRate
The monitor triggers the process ObserverFollowsSubject
ObserverRate changes value to match SubjectRate
85 / 1277
Simio Reference Guide
Conwip - SimBit
Problem:
I would like to model a CONWIP system (constant level of WIP). The system should begin with 10 entities in the system
and as soon as one entity leaves the system, another should arrive.
Categories:
Buffering, Data Tables
Key Concepts:
Create Step, Data Table, Limit, Numeric Property, OnRun Initialized Process, Real State Variable, Search Step, Source,
Status Label, Table Station Element Property, Transfer Step
Assumptions:
This model contains 5 servers and the initial 10 entities are placed evenly at each server(i.e. 2 entities at each Server to
begin). When a new entity arrives, it will be randomly sent to one of the 5 servers.
Technical Approach:
Upon initialization, the model looks in a Data table to find any initial WIP that should exist in the system and It creates
those entities and transfers them to the appropriate station. The Source is set to create an arrival whenever an entity enters
the Sink.
Details for Building the Model:
Simple System Setup
Place a Source and a Sink into the Facility window. Also place a Model Entity from the Project Library into the
Facility window, which will be called DefaultEntity.
Place 5 Servers in between the Server and Sink. These Servers are in parallel.
Connect everything with Paths.
Click on the Source object and set the Arrival Mode property to ‘OnEvent’. Set the Event Name property to
‘[email protected]’. This tells the Source object to only produce arrivals when the event [email protected]
occurs. This creates a pull system where arrivals occur whenever an entity enters the Sink is about to exit the system.
Create Data Table
The Data Table will contain the number of entities that should be in the system upon initialization and where they
should be located.
Go to the Data window and click the Add Data Table icon in the ribbon to add a new table.
Add a column that is an Integer property by selecting Integer property from the Standard Property drop down in the
ribbon. The column can be renamed to InitialWIP.
Add another column that is a Station property by selecting Station from the Element Reference drop down in the
ribbon. The column can be renamed to Station.
Populate this table by putting the value of 2 in each row of the first column and then selecting Server1.InputBuffer for
the first row, Server2.InputBuffer for the second row, etc – for the second column.
Add Process Logic
From within the Processes window, create a new process by selecting OnRunInitialized from the Select Process drop
down in the ribbon.
Place a Search step into this process, followed by a Create step in the Found segment of the Search Step, and
finally, a Transfer step in the Created segment of the Create step.
In the Search step, set the Collection Type property to ‘TableRows’ and select the name of the Data Table that
you created above. Within the Advanced Options section of the Search step, change the value ‘1’ in the Limit
property to 'Infinity'. This will allow the Search to find all rows in the table.
In the Create step, the Create Type property should be set to ‘NewObject’ and the Object Instance Name should
be set to ‘Default Entity’. The Number of Objects property should be set to ‘InitialWIP.InitialWIP’, where
InitialWIP is the name of the Data Table and InitialWIP is the name of the Integer column in the Data Table.
86 / 1277
This tells the Create Step to create the number of entities that are listed in the Integer column of the Data
This tells the Create Step to create the number of entities that are listed in the Integer column of the Data
Table.
In the Transfer step, set From to ‘FreeSpace’ (since entities are created in Free Space by default) and the To
property to ‘Station’. The Station Name property should be set to ‘InitialWIP.Station’, where InitialWIP is the
name of the Data Table and Station is the name of the Station property in the table.
Embellishments:
If you would like to see the current number of entities in the system, you can add a Status Label to the Facility window and
set the expression to DefaultEntity.Population.NumberInSystem.
87 / 1277
Simio Reference Guide
CustomRoutingGroup - SimBit
Problem:
I would like arriving entities from two different locations to select between servers based on the closest server available.
Entities from one of the sources have priority over the other, however, when a busy server becomes available.
Categories:
Decision Logic – Paths, Decision Logic - Processing, Entity Characteristics
Key Concepts:
Buffer Capacity, Entity Destination Type, InputBuffer, Lists, NodeList, Picture, Priority, RoutingGroup Element, State
Assignments
Technical Approach:
In this example, we will have two Sources feeding entities into one of three Servers. The buffer capacities of the Servers are
zero, so entities will wait at the Sources to proceed forward. To ensure that entities from the Source1 object have priority
over those from Source2, we will create a custom RoutingGroup that both Sources will reference. The RoutingGroup will
have a Route Request Ranking Rule of ‘Smallest Value First’ based on the entity priority value.
Details for Building the Model:
Simple System Setup
Place two Sources, three Servers and a Sink. Connect each of the Sources to each of the Servers with Paths (6 paths),
then connect each of the 3 Servers to the Sink.
Place a ModelEntity from the Project Library into the Facility window. While the entity is highlighted, click on the
Add Additional Symbol button to add a symbol. Change the symbol for the value 1 to be the color blue.
Create Node List and Routing Group Element
From within the Definitions window, click on the Lists panel and add a Node type list ( NodeList1) to include the
three Servers – Input@Server1, Input@Server2, Input@Server3.
Also from within the Definitions window, click on the Elements panel and add a RoutingGroup element named
'RoutingGroup1'. Specify the Node List Name to be ‘NodeList1’. Under the Advanced Options, change the Route
Request Ranking Rule to be ‘Smallest Value First’ and the Route Request Ranking Expression leave as ‘Entity.Priority’.
When multiple entities are waiting to move from this routing group, they will be ranked based on their priority
instead of first in first out.
Editing the Source Objects
Within each of the Sources, change the Interarrival Time to ‘Random.Exponential(0.18)’ minutes.
Within Source1, add State Assignments of State Variable Name ‘ModelEntity.Picture’ to ‘0’ and State Variable Name
‘ModelEntity.Priority’ to ‘1’.
Within Source2, add State Assignments of State Variable Name ‘ModelEntity.Picture’ to ‘1’ and State Variable Name
‘ModelEntity.Priority to ‘2’.
Within the output TransferNode of each of the Sources, change the Entity Destination Type to ‘Use Custom Routing
Group’. Specify the Routing Group Name as ‘RoutingGroup1’. Change the Selection Goal to ‘Smallest Distance’.
Note that by using the same RoutingGroup element for both Source objects, if an entity has to wait for a Server
object to become available, the entities from BOTH Source objects are evaluated together and will be ranked based
on their priority values. Therefore, waiting entities from Source1 (green color) will move to a Server before waiting
entities at Source2 (blue color).
Editing the Server Objects
Within each of the Servers, change the Input Buffer under Buffer Capacities to ‘0’. Therefore, no entities will wait at
the Server for processing; they will wait at the Source objects. This is because of the buffer capacity in conjunction
with the Blocked Destination Rule at the Source output nodes as ‘Select Available Only’.
88 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
89 / 1277
Simio Reference Guide
CustomUnbatching - SimBit
Problem:
I have two entity types ( P1 and P2) batched to a parent entity type ( Crate). I need to unbatch the P2 entities, change their
dimensions and send them to a different sink.
Categories:
Add-On Process Logic, Combining and Separating Entities
Key Concepts:
Add-On Process, Assign Step, Combiner, Decide Step, Match Condition, Priority, Selection Weight, Sink, Source,
TransferNode, Transfer Step, UnBatch Step
Technical Approach:
A mix of five P1 and P2 entities are batched to the Crate entity at the Combiner. When the batched entities reach
TransferNode1, the P2 entities are unbatched, transferred to TansferNode1 from Free Space, and resized using Add-On
Process logic. Then the P2 entities are sent to a separate Sink using Path Selection Weight.
Details for Building the Model:
Simple System Setup
Place three Sources in the Facility window. Also place a Combiner, a TransferNode and two Sinks into the Facility
window.
Using Paths, connect Source1 to the ParentInput@Combiner1 node. Connect Source2 and Source3 to the
MemeberInput@Combiner1 node. Then connect the Combiner to the TransferNode and the TransferNode to both
Sinks.
Place three ModelEntity objects into the Facility window from Project Library window. Change the ModelEntity
Name to ‘Crate’, ‘P1’ and ‘P2’, respectively.
Select the Entity named ‘Crate’ and in the Symbol Ribbon, click Draw Queue dropdown and select BatchMembers.
Then draw a line above the ‘Crate’ entity. Right click to stop drawing the queue. This line will show all entities
batched to the ‘Crate’ entity.
Change the P2 Entity Initial Priority to ‘2’ in the ModelEntity properties.
Change the Entity Type of Source1 to ‘Crate’, Entity Type of Source2 to ‘P1’ and Source3 to ‘P2’. Change the
Interarrival Time of Source1 to ‘Random.Exponential (.6)’ minutes.
Set the Combiner Batch Quantity to ‘5’.
Select the path between the TransferNode and the Sink1. Change its Selection Weight to ‘ModelEntity.EntityType ==
P2’.
On the path between the TransferNode and the Sink2, set its Selection Weight property to ‘ModelEntity.EntityType !=
P2’.
UnBatching Entities Add-On Process Logic
Create a process on the Entered Add-On Process Trigger in the TranferNode1 properties. This process will be
triggered whenever an entity enters this TransferNode.
Place a Decide step. Set the Decide Type property to ‘ConditionBased’ and set the Expression to
‘ModelEntity.BatchMembers == 0’. Crate entities will have 5 batched members and P2 entities will have 0
batched members once it is unbatched and re-enters the node.
On the True branch leaving the Decide step, place an Assign step. Set the State Variable Name to
‘ModelEntity.Size.Width’ and the New Value to ‘ModelEntity.Size.Width * 2’.
On the False branch of the Decide step, place an UnBatch step. Set the Desired Quantity property to
‘Entity.BatchMembers’ and the Match Condition to ‘Candidate.ModelEntity.Priority==2’.
In the Member segment leaving the UnBatch step, place a Transfer step. Set the From property to ‘FreeSpace’,
the To property to ‘Node’ and the Node Name property to ‘TransferNode1’. This will send all unbatched P2
entities to the same TransferNode and trigger this process again for re-sizing the entity.
Embellishments:
90 / 1277
Select the path between the TransferNode and the Sink1 and change the Allow Passing property to ‘False’. That will show
all unbatched entities separated trough the path instead of all of them in just one entity.
Change the path Speed Limit to ‘0.5’ for the path between the Combiner and the TransferNode and the paths between the
TransferNode and Sink1 and Sink2.
Note: The UnBatching Process Logic in this model can be replaced with a Separator object, but the goal of this SimBit is
to show the features of the UnBatch step.
91 / 1277
Simio Reference Guide
DashboardReportInteractiveLogs - SimBit
Problem:
For an existing project, I want to be able to graphically display the resource utilization as well as display a vehicle’s pickup
and drop off times in chart format. We will accomplish this by creating a Dashboard Report from an existing SimBit
project VehicleVisitsServiceCenter.
Categories:
Dashboard Reports, Custom Statistics
Key Concepts:
Dashboard Reports, Interactive Logging, Log Observations, Resource State Log
Assumption:
This SimBit will illustrate how to create a Dashboard Report of log files generated within the VehicleVisitsServiceCenter
project. In order to create a Dashboard Report for Interactive Logs, you must have the Simio RPS ( Enterprise) Edition.
Technical Approach:
A dashboard with a grid of vehicle pickup times and a pie chart of resource utilization percentages will be created.
Details for Building the Model:
System Setup
Load the VehicleVisitsServiceCenter Simio project.
For Server1, Server2 and MyVehicle1, under the Advanced Options change the Log Resource Usage property to ‘True’.
From the Run ribbon, under Advanced Options, make sure Enable Interactive Logging is turned on.
Fast Forward the model to completion.
Creating the Dashboard Report
Select Results, Logs, Resource Usage Log and Transporter Usage Log and make sure there is a log table that is
populated with data. If not, verify the above steps.
Select Results, Dashboard Reports, Dashboard Report Create.
In the Add Dashboard window, select an name for the dashboard (ex: Pick Ups).
Select Transporter Usage Log from the pull down list on the left of the window.
Click on Grid in the Dashboard ribbon. This will create a Grid of items in the Transporter Usage Log and insert it into
the dashboard.
From the Transporter Usage Log, drag Resource over top of the Columns data item to the right. Follow that by
dragging From Node, Start Time, To Node, End Time and Entity onto the Columns data items. This identifies which
columns will appear on the grid.
For the Start Time and End Time items, click on the right of the item to change the modifier to Date-Hour-Minute-
Second.
Right click in the Grid area, select Edit Names and change the Dashboard item name to Pick Ups.
Now select Resource State Log from the pull down list on the left side of the window.
Click on Pies in the Dashboard ribbon. This will create a pie chart of items in the Resource State Log and insert it into
the dashboard.
From the Resource State Log, drag Duration over the Value data item, State over the Argument data item and
Resource over the Series data item.
Right click in the Pie area, select Edit Names and change the Dashboard item name to Resource States.
Select the Pie item and drag it below the Grid item.
Click the Save button in the upper left corner of the ribbon to save the dashboard. Close the
DashboardDesignerForm.
Various Dashboard Reports can be displayed in the results tab by selecting a dashboard from the Select pull down
list.
Embellishments:
92 / 1277
Add a Pivot grid using the data in the Resource State Log using the Duration as the Value data item, State as the Column
data item and Resource as the Row data item. This will display a chart of the amount of time the resource was in each
state.
93 / 1277
Simio Reference Guide
DashboardReportTallies - SimBit
Problem:
For an existing project, I want to be able to graphically display the time in the system for each entity in a model, once the
model has completed. We will accomplish this by creating a Dashboard Report from an existing SimBit
TallyStatisticsInTables.
Categories:
Dashboard Reports, Custom Statistics
Key Concepts:
Arguments, Bar, Chart, Data Items, Data Source, Edit Filter, Ignore Empty Points, Line, Log Observations, Series, Stacked
Bar, Tally Observation Log, Tally Statistic Element, TallyStatistic, Values, Dashboard Reports
Assumption:
The SimBit TallyStatisticsInTable must be opened with a Simio Team1, Professional or RPS ( Enterprise) license to create the
Dashboards. This model uses 4 Tally Statistics to record the Time In System for passed and failed PartsA and PartsB.
Technical Approach:
Create a Dashboard with 3 charts:
1. The total number of each part type that passed and failed.
2. The number of parts that passed each hour for each part type and total. Filter out failed parts.
3. The Time in System for each part type over time.
Details for Building the Model:
System Setup
Load the TallyStatisticsInTables SimBit.
Under Definitions tab> Elements view> TallyStatistic PartA_Passed, change the Log Observations property (under
Advanced Options) to ‘True’. Do the same for the other 3 Tally Statistics.
Fast Forward the model to completion.
In Results window, Logs view, Tally Observation Log and make sure there is a log table that is populated with data. If
not, verify that Log Observations is set to ‘True’ on all the Tally Statistics.
Creating the Dashboard Report
In Results select Dashboard Reports view, and click on Dashboard Report in the Dashboards ribbon.
In the Add Dashboard window, name the dashboard (ex:Tallies).
Chart1 ( Top left)
In the DashboardDesignerForm, click on Chart within the Home ribbon. This will create a Chart dashboard
item and insert it into the dashboard.
Select Tally Observation Log from the Data Source drop down list on the left of the window.
From the Tally Observation Log list of options, drag Value over top of the Value data item to the right.
Click on the down arrow that appears when you hover over Values ( Sum) and select Count. Count counts the
number of rows for each argument in a series.
Drag Time over top of the Argument data item.
Drag DataSource onto the Series data item.
Right Click in the Chart Item and select Edit Names. Change the Dashboard Item Name to ‘Number Finished’.
To remove the X axis value go to Design ribbon and click X-Axis Settings (make sure the Chart item is still
selected). Uncheck ‘Show X-axis’.
To change the Y axis title click Y-Axis Setting in the Design ribbon. Make sure ‘Show Title’ is selected, then
select ‘Custom Text’. In the textbox change the title to ‘Count’.
To add the point labels above each bar, select the graph icon next to Value( Count) in Data Items section. Go to
the Point Label Options tab. In Content select ‘Value’ and select OK.
94 / 1277
Chart2 ( Top Right)
Click on Chart within the Home ribbon. This will create a Chart dashboard item and insert it into the
dashboard.
Select Tally Observation Log from the Data Source drop down list on the left of the window.
From the Tally Observation Log list of options, drag ObjectType over top of the Value data item to the right. It
should automatically be set to Count. ( Any column can be used for Count)
Drag Time over top of the Argument data item.
Drag DataSource onto the Series data item.
On the Time Argument, change the time from Year to Date-Hour in the Time dropdown (2nd More).
Click on the icon to the right of the ObjectType( Count) data item. Change the chart type to Stacked Bar in the
Series Type tab.
To filter the chart to only passing parts, right click the chart and select Edit Filter. Click the plus sign to add a
filter. Click 'enter a value' and open the dropdown. Select ‘PartA_Passed’. Click the plus sign again and set the
'enter a value' to ‘PartB_Passed'. In the top left, click on ‘And’ and select ‘Or’.
Change the chart name in the Design ribbon > Edit Names. Change the Name to Number Passed.
To remove the Y-axis title go to Y-axis Settings in the Design ribbon and uncheck ‘Show Title’.
Change the format of the x-axis values in the Time Argument dropdown ( Data Items section) by selecting
‘TimeOnly’ in the Format ( Default) dropdown.
Chart3 ( Bottom)
Click on Chart within the Home ribbon. This will create a Chart dashboard item and insert it into the
dashboard. To change the dashboard layout, hold the Title bar of the 2nd chart and move it to the right of only
the 1st chart (a blue vertical line will appear on right).
Select Tally Observation Log from the Data Source drop down list on the left of the window.
Select the 3rd chart. From the Tally Observation Log list of options, drag Value over top of the Value data item
to the right.
Click on the icon to the right of the Value( Sum) data item. Change the chart type to Line in the Series Type tab.
In the Common Options tab check Ignore Empty Points. This option will draw the lines even if the Time stamps
are different.
Drag Time over top of the Argument data item. Click on the dropdown on the Time data item (right side) and
change the modifier from Year to Exact Date. Change the X-axis format in the Time Argument
dropdown>Format>Hours>Short. Make sure the arrow to the left of the Time Data Item is pointing up so that
our timeline is in the right order. (you can click once on the arrow to change from up to down or down to up).
Drag DataSource onto the Series data item.
Right Click in the Chart Item and select Edit Names. Change the Name to Time In System.
Change the Y axis title in the Design ribbon>Y-Axis Settings. Select Custom Text under Show Title and set the
title to ‘Hours In System’.
Click the Save button in the upper left corner of the ribbon to save the dashboard. Close the
DashboardDesignerForm.
Various Dashboard Reports can be displayed in the results tab by selecting a dashboard from the Select pull down
list.
Embellishments:
When you Filter a chart, only columns in DATA ITEMS sections can be used. If you want to filter on a column but not show
it on the chart, drag the column name to HIDDEN DATA ITEMS.
Add a Range Filter to the dashboard. This will allow you to apply filtering to your dashboard items. A Range Filter displays
a chart with selection thumbs that allow you to filter out values displayed on the argument axis.
1Legacy product
95 / 1277
Simio Reference Guide
DashboardsForSchedulingExamples - SimBit
Problem:
Show results in graphical format using Dashboards with an RPS ( Enterprise) version. The model is based on the Scheduling
Discrete Part Production Example.
Categories:
Custom Statistics, Dashboard Reports
Key Concepts:
Cards, Chart, Constraint Log, Cross-Data-Source-Filtering, Dashboard Reports, Grid, Interactive Logging, Log
Observations, Material Log, Multiple Master Filter, Pies, Resource State Log, Resource Usage Log, Single Mater Filter
Assumptions:
Familiar with the Resource and Material Logs and what information is reported for each column. ( Sometimes easier if you
open another Simio with the logs shown because you see the logs when you open the Dashboard Editor.)
Technical Approach:
Create 3 Dashboards:
1. A dispatch list for each Resource and a graph with the percent breakdown in each state. Includes the ability to show a
single or multiple Resources.
2. Graph the Stock Level of each Material over the simulation run, but only show 1 Material at a time.
3. A detailed list of the resources used (and when) for each Order and a graph of the different constraint types for each
order. Includes the ability to show between 1 and all the orders.
Details for Building the Model:
Simple System Setup
Load the Discrete Part Production Example.
Make sure all Resources and Servers have Log Resource Usage set to ‘True’.
Turn on Interactive Logging in Run ribbon> Advanced Options> click Enable Interactive Logging.
Fast Forward through the model. If the model already has results, then a preview of the dashboard items will show as
you create the Dashboard.
Create the Dashboards
Go to Results>Dashboard Reports View.
Dispatch List Dashboard
In the Dashboard ribbon, click the Dashboard Report button in the Create section. In the Add Dashboard popup
window, name the Dashboard ‘Dispatch List Sim’ and press OK.
In the Dashboard Designer Form Window, on the Home ribbon click on the Cards, Pies and Grid buttons to add
those items to the Dashboard. Move an item by holding the top title bar of the item and dragging to desired
location in relation to other items (dark blue highlighted area).
Cards
Select the Cards item on the dashboard. In the Data Source dropdown (left side of window) select the
‘Resource Usage Log’.
Drag ‘Duration ( Hours)’ to the Actual spot under DATA ITEMS ( Cards section). Drag ‘Resource’ to Series.
Click the Gear symbol to the right of ‘Duration ( Hours)’ in the DATA ITEMS section. In the Layout Options tab,
select one of the templates and uncheck ‘Actual Value’. This will show only the Resource Name on the card. The
example Dashboards use the ‘Compact’ template with the Min Width to ‘140’ and Max Width to ‘Auto’. Click
OK.
On the Data ribbon, select Multiple Master Filter and Cross-Data-Source-Filtering. Multiple Master Filter sets
the Cards to control the data shown in the other dashboard items. Cross Data Source Filtering will apply the
Master Filter to Dashboards Items that use a different Log but a full name of the data source field matches.
96 / 1277
Right click in the Cards item and select Edit Names. Change the Dashboard Item Name to ‘Resource’.
Pies
Select the Pies item. In the Data Source dropdown select ‘Resource State Log’.
Drag ‘Duration’ to Value, ‘State’ to Argument, and ‘Resource’ to Series.
On the Design ribbon, click Edit Names and change the Dashboard Item Name to ‘Resource State’.
Grid
Select the Grid item and in the Data Source select ‘Resource Usage Log’.
Drag ‘Resource’ to New Column, then ‘StartTime’ to the 2nd New Column, then ‘EndTime’, ‘Entity’, and
‘Duration’.
If the column was added in the wrong order, under DATA ITEMS select and hold the column and move
to desired location. A yellow bar will appear between the other columns you are placing the selected
column between.
To change the format of the datetime columns, hover on the StartTime item under DATA ITEMS and open the
right side drop down arrow. Open the 2nd More and select Date-Hour-Minute. Do the same for EndTime.
On the Design ribbon, click Edit Names and change the Dashboard Item Name to ‘Operations’.
Click the Save button on the Home ribbon and Close the Dashboard creator window.
Materials Dashboard
In the Dashboard ribbon, click the Dashboard Report button in the Create section. Name the Dashboard ‘Materials
Sim’.
In the Dashboard Designer Form Window Home ribbon add a Cards item and Chart item. Move an item by holding
the top title bar of the item and dragging to desired location in relation to other items. Resize each item’s by moving
the edges.
Cards
Select the Cards item on the dashboard. In the Data Source dropdown (left side of window) select the ‘Material
Usage Log’.
Drag ‘Quantity’ to the Actual spot under DATA ITEMS ( Cards section). Drag ‘Material’ to Series.
Click the Gear symbol to the right of ‘Duration ( Hours)’ in the DATA ITEMS section. In the Layout Options tab,
select one of the templates and uncheck ‘Actual Value’. This will show only the Resource Name on the card. The
example Dashboards use the ‘Compact’ template with the Min Width to ‘140’ and Max Width to ‘Auto’. Click
OK.
On the Data ribbon, select Single Master Filter. Single Master Filter will filter the data in other items based on
the Card selected. Only 1 card can be selected at a time.
Right click in the Cards item and select Edit Names. Change the Dashboard Item Name to ‘Material’.
Chart
Select the Chart item and in the Data Source select ‘Material Usage Log’.
Drag ‘Stock Level’ to Value, ‘Time’ to Argument, and ‘Material’ to Series.
Under DATA ITEMS, on ‘Stock Level’ dropdown (hover on Stock Level, right side arrow), select Max. If there are
multiple entries to the Material Log at the same time grouping for the same resource, the Graph will show the
Max value.
On the graph symbol next to ‘Stock Level’ select the Step Line graph in Series Type tab.
On the Time Argument dropdown, change the format/grouping to Date-Hour-Minute-Second in the 2nd
More dropdown.
Another option for datetime is to choose Exact Date from the Time dropdown for the grouping and
choose a format from the Format dropdown below ExactDate.
On the Design ribbon, click Edit Names and change the Dashboard Item Name to ‘Stock Level’.
Click the Save button on the Home ribbon and Close the Dashboard creator window.
Order Details Dashboard
In the Dashboard ribbon, click the Dashboard Report button in the Create section. In the Add Dashboard popup
window, name the Dashboard ‘Order Details Sim’ and press OK.
In the Dashboard Designer Form Window, Home ribbon click on the Cards, Chart, and Grid buttons to add those
items to the Dashboard. Move an item by holding the top title bar of the item and dragging to desired location in
relation to other items (dark blue highlighted area).
Cards
Select the Cards item on the dashboard. In the Data Source dropdown (left side of window) select the
‘Resource Usage Log’.
97 / 1277
‘Resource Usage Log’.
Drag ‘Duration’ to the Actual spot under DATA ITEMS ( Cards section). Drag ‘Entity’ to Series.
Click the Gear symbol to the right of ‘Duration ( Hours)’ in the DATA ITEMS section. In the Layout Options tab,
select one of the templates and uncheck ‘Actual Value’. This will show only the Resource Name on the card. The
example Dashboards use the ‘Compact’ template with the Min Width to ‘140’ and Max Width to ‘Auto’. Click
OK.
*If you do not want Duration to show on the Cards, you could have used any of the columns from the Resource
Usage Log for the Actual Cards.
On the Data ribbon, select Multiple Master Filter and Cross-Data-Source-Filtering.
On the Design ribbon, click Edit Names and change the Dashboard Item Name to ‘Orders’.
Chart
Select the Chart item. In the Data Source dropdown select ‘Constraint Log’.
Drag ‘Duration’ to Value, ‘Constraint Type’ and ‘Facility Location’ to Argument, and ‘Entity’ to Series. The Facility
Location is always Model for this model, but does change for other scheduling models.
On the Design ribbon, click Edit Names and change the Dashboard Item Name to ‘Constraints’.
Grid
Select the Grid item and in the Data Source select ‘Resource Usage Log’.
Drag ‘Entity’ to New Column, then ‘StartTime’, ‘EndTime’, ‘Resource’, and ‘Duration’.
To change the format of the datetime columns, hover on the StartTime item under DATA ITEMS and open the
right side drop down arrow. Open the 2nd More and select Date-Hour-Minute. Do the same for EndTime.
Right click in the Grid item and select Edit Names. Change the Dashboard Item Name to ‘Operations’.
Click the Save button on the Home ribbon and Close the Dashboard creator window.
Embellishments:
In the Dashboard window, Automatic updates should be selected (it is by default).
Change the Dashboard by going to Results>Dashboard View and selecting the Dashboard in Select dropdown and
clicking Edit.
On the Dispatch List dashboard, when you select a Card, the Pie and Grid data is filtered to only the selected Resource.
Hold the Ctrl key to select multiple Resource Cards. To reset the selection, right click the Cards items and select Clear
Master Filter.
98 / 1277
Simio Reference Guide
DashboardsWithinExperiments - SimBit
Problem:
Within an existing model, I'd like to experiment on the number of workers required and display experiment graphical
information within a Dashboard Report. This will be accomplished by creating an Experiment and corresponding
Dashboard Report from an existing SimBit ServerUsingTaskSequenceWithWorkers.
Categories:
Add-On Process Logic, Dashboard Reports, MultiTask Server, Worker
Key Concepts:
Active Symbol, Add-On Process, Assign Step, BasicNode, Dashboard Reports, Decide Step, Experiment, InputBuffer,
ObjectList, Picture, Process, Process Type, Request Move, Server, Started Task, Status Label, Task Sequence, Worker
Assumptions:
The SimBit ServerUsingTaskSequenceWithWorkers must be opened with a Simio Team1, Professional or RPS ( Enterprise)
license to create the Experiment Dashboards. The original SimBit was modified slightly to work with the controls in the
experiment. Those changes are noted below. This model uses 3 Controls (model properties) and includes 4 Responses
within the Experiment.
Technical Approach:
Create 3 Dashboards:
1. The average response result values across all scenarios. This will include all 4 responses on same graph.
2. The individual replication values and average value for each response and each scenario.
3. Pie charts showing resource states across all scenarios, with data from the experiment statistic summaries.
Details for Building the Model:
System Setup
Load the ServerUsingTaskSequenceWithWorkers SimBit.
Within the Definitions window, delete the Transporter list of Nurses, as we will use the population of one of the
nurses for experimentation. Within the Facility window, delete Nurse2 and change the Nurse1 name to Nurse.
Enter the Server1, Server2 objects, Processing Tasks and change the first 3 tasks (that require Nurse) from Object Type
‘Select From List’ to ‘Specific’. Enter the second task ( LabWork) and change the Condition or Probability to be a
property named ‘LabWork_Probability’ (right click, Set Referenced Property > Create New Referenced Property).
Within the Doctor object, go to the Initial Number in System property, right click, Set Referenced Property > Create
New Referenced Property to ‘NumberOfDoctors’. Do the same with the Nurse object with a property named
‘NumberOfNurses’.
Finally, add a Sink named LeaveWithoutBeingSeen. Then,enter Source1 and specify a Renege Triggers under the
Buffer Logic to include a Wait Duration of ‘40’ minutes and Renege Node Name ‘Input@LeaveWithoutBeingSeen’.
Entities will leave the system early if the wait is too long (this will be a response in experiment as well).
Experimentation
Within the Model properties, there will now be 3 model properties, NumberOfDoctors, NumberOfNurses and
LabWork_Probability that can be changed.
Go to the Project Home ribbon and select New Experiment. Those 3 properties will automatically appear under
Controls.
Add 4 Responses to the experiment. This will include:
Name is ‘DoctorUtilization’ – Expression is ‘Doctor.Population.Capacity.ScheduledUtilization’
Name is ‘NurseUtilization’ – Expression is ‘Nurse.Population.Capacity.ScheduledUtilization’
Name is ‘PatientTimeInSystem’ – Expression is ‘DefaultEntity.Population.TimeInSystem.Average’
Name is ‘LeaveWithoutBeingSeen’ – Expression is ‘LeaveWithoutBeingSeen.InputBuffer.NumberEntered’
Add various scenarios to the experiment, including combinations for 1 or 2 Doctors, 1 or 2 Nurses and a couple with
no lab work (assume the hospital is analyzing having lab work done afterwards at separate area). Run the experiment
with default Analysis parameters for confidence level, etc. 99 / 1277
with default Analysis parameters for confidence level, etc.
Dashboard Reports
Click on the Dashboard Reports tab and click Create to create a new report. Note that there are 4 Data Sources
available for reporting. We will use the Response Results Summaries (includes Min, Max, Median, Average, etc. if
desired), Response Results Details and Experiment Statistic Summaries.
For the first report ( Response Averages By Scenario), select the Response Results Summaries Data Source.
Within the Home ribbon, select a Chart and a Filter Elements > List Box.
Within the Data Items for the Chart, place the ResponseName in the Series area. This will provide a bar in the
chart then for each of the Responses in the experiment. Place the ScenarioName in the Arguments area which
will then list the Scenarios along the X-axis. Place the Mean within the Values section. This will graph the mean
of each of the responses along the Y-axis. Users could alternatively select Minimum or Maximum for the Value,
depending on the information desired.
Within the Data Items for the List Box, place the ResponseName in the Dimensions.
Save the first dashboard.
For the second report ( Response Details Per Scenario), select the Response Result Details.
Within this report, we’d like to see the individual values per scenario for each response, along with the average
value. Because we don’t have the average value within the Response Results Details, we will add a new
Calculated Fields entry. This is done by right clicking on the Response Result Details name and selecting Add
Calculated Field. Name the new field AverageValue and use the expression builder to generate the Expression
‘Aggr( Avg([ Value]))’.
Within the Home ribbon, select a Chart and two Filter Elements > List Box.
Within the Data Items for the Chart, place the ScenarioName in the Series. Place the Replication field in the
Arguments, as the replication value will be shown along the X-axis (instead of the Scenario as in the report
above). Place both the Value field and the new AverageValue calculated field within the Values. This will then
give us a data point for each replication value as well as the average over the # of replications run.
To customize the chart further, go to the Design ribbon, select the placement of the Legend (for
value/averagevalue) and change the Series Type to be a Line.
Within the Data Items for the first List Box, place the ResponseName in the Dimensions. Go to the Design
ribbon and select Radio item type. This will allow the end user to only select one of the responses at a time
(instead of checking multiple ones). Right click to Edit Name to ‘Response’.
Within the Data Items for the second List Box, place the ScenarioName in the Dimensions. Change this one to
a Radio item type as well. Right click to Edit Name to ‘Scenario’.
Save the second dashboard.
For the third report ( Resource States by Scenario), select the Experiment Statistic Summaries.
Within this report, we’d like to review the resource states information within the pivot grid. Users may wish to
review the pivot grid formatting ( Object Type, Object Name, Data Source, Category, Data Item, etc.) to
determine the exact fields to display and use as filters.
Within the Home ribbon, select a Pie and Filter Elements > List Box.
Within the Data Items for the Pie, place the Scenario in the Series. This will then display a separate pie for each
scenario. Place the Data Item within the Argument. Data Item includes the values for Time Busy, Time Idle,
Time Starved, Time Processing, etc. based on the type of resource. Place the Average value in the Values data
item.
o IMPORTANT: Still within the Pie, place the Category and Statistic within the Hidden Data Items under
Dimensions. These categories will not be shown (hidden) but will be used to filter the experiment statistics to
show only the Resource State category and Percent statistic. With the Pie graphic selected, go to the Data
ribbon and select Edit Filter (or right click and select Edit Filter). Add a Filter that is ‘[ Category] Equals
Resource State’ and another that is [ Statistic] Equals Percent’. This will filter the entire report to only show
Resource State information, which by default, will include the Data Items needed.
Within the Data Items for the List Box, place the Object Name in the Dimensions. Go to the Design ribbon and
select Radio item type. This will allow the end user to only select one of the responses at a time (instead of
checking multiple ones).
Follow the same step as shown above ( IMPORTANT:…) by placing the Category under the Hidden Data Items
and adding the same filter ( Statistic filter not required).
1Legacy product
101 / 1277
Simio Reference Guide
DbReadWrite - SimBit
Problem:
I want to use SQL Server Expess to read data into Simio and to write data from Simio.
Categories:
File Management
Key Concepts:
DBConnect Element, DBRead Step, DBWrite Step, DBQuery Step, DBExecute Step, Database, SQL Server Express
Assumptions:
Database connectivity must already be setup, or this model will not run! See Appendix for example.
There are two approaches described below, one model using DbRead, and DbWrite, and another model using DbQuery
and DbExecute.
Approach Using DbRead and DbWrite
Technical Approach:
DbConnect Element is used to connect with the SQL Server Express database. The OnRunInitialized process is used to
delete existing data from the database table. An Add-On process is used within an object where data is read using
DbRead step. The position is defined where data must be written in the database using Assign step. Then using DbWrite
step, data is written into database.
Details for Building the Model:
Simple System Setup
Within the Facility window, place a Source, a Server and a Sink and connect them using Path objects.
Within the Sink’s input node, double-click on the Entered Add-On Process to create a new process named
‘Input_Sink1_Entered’. We will add steps within that process shortly.
Within the Definitions window, click on the States panel and add a String state with the Name ‘StringState1’. Set the
Initial State Value to ‘DefaultEntity.11.’
Add a Real state with the Name ‘RealState1’. Change the Initial State Value to ‘-1’.
Add two DateTime states with the Name of ‘DateTimeState1’ and ‘DateTimeState2’. Set their Initial State Value
properties to ‘10/1/12’ and ‘11/1/12’, respectively.
Add two Integer states with the Name of ‘IntegerState1’ and ‘RowID’. Leave the Initial State Value of both to the
default ‘0’.
Add a Boolean state with the Name ‘SimpleDbSteps’ that has an Initial State Value of ‘True’.
Within the Definitions window, click on the Element panel and select the DbConnect element from the User Defined
button pull down.
In the property window for DbConnect1, enter the Connection String as ‘Server=localhost\SQLExpress;
Database=Test; Uid=username; Pwd=password’. Click on Provider Name and set it as ‘SqlClient Data Provider’. The
current settings in this property require that you rename the username and password value 'test' to the values you
have configured in the SQL Server Express database.
102 / 1277
Within the Processes window, click on Select Process in the Process ribbon and select the OnRunInitialized process.
Add a DbExecute step from the User Defined panel to the process. Specify the DbConnect as ‘DbConnect1’, the SQL
Statement as ‘Delete From TestReadWrite where Id>@1’. Within the Items repeat group, enter the Expression ‘RowID’.
Next, within the Input_Sink1_Entered process, add the Decide, DbRead, Assign and DbWrite steps.
Within the Decide step, keep Decide Type as ‘ConditionBased’ and add Expression as ‘RowID > 0’.
For the DbRead properties, the DbConnect is ‘DbConnect1’, created above. Assign the Table Name to
‘TestReadWrite’. Click on Columns repeating property editor and add 5 items as shown below
Column – State
String1 – StringState1
Integer1 – IntegerState1
Real1 – RealState1
DateTime1 – DateTimeState1
DateTime2 – DateTimeState2
Within the Where repeating property editor, add Where Column value ‘Id’ and Where State value ‘RowID’.
Within the Assign step, enter the State Variable Name as ‘RowID’ and New Value as ‘RowID+1’.
For the DbWrite properties, the DbConnect is ‘DbConnect1’ and the Table Name is ‘TestReadWrite’. Click on Columns
repeating property editor and add 6 items as shown below
Column – Expression
Id -- RowID
String1 – Entity.Name
Integer1 – Entity.ID
Real1 – TimeNow
DateTime1 – String.FromDateTime( Entity.TimeCreated, "yyyy/MM/dd HH:mm:ss")
DateTime2 – String.FromDateTime( TimeNow, "yyyy/MM/dd HH:mm:ss")
From Animation ribbon, select and place 6 Status Labels in the Facility window.
For first label, enter the Expression ‘StringState1’. Repeat the same for the other 5 states defined above (not needed is
the SimpleDbSteps Boolean state). In the case of the DateTime states, use the Expression
‘DateTime.ToString( DateTimeState1)’ and ‘DateTime.ToString( DateTimeState2)’.
For the DbQuery step, the DbConnect is ‘DbConnect1’. For the SQL Statement, enter ‘Select String1, Integer1, Real1,
DateTime1, DateTime2 from TestReadWrite where Id = @6’. Within the States repeating property editor, add 6 State
values:
State
StringState1
IntegerState1
RealState1
DateTimeState1
DateTimeState2
RowID
For the DbExecute step, the DbConnect is ‘DbConnect1’. The SQL Statement value is ‘Insert into TestReadWrite ( Id,
String1, Integer1, Real1, DateTime1, DateTime2) values (@1, '@2', @3, @4, '@5', '@6')’. Within the Items repeating
property editor, add 6 Expression values:
Expression
RowID
Entity.Name
Entity.ID
TimeNow
103 / 1277
String.FromDateTime( Entity.TimeCreated, "yyyy/MM/dd HH:mm:ss")
String.FromDateTime( TimeNow, "yyyy/MM/dd HH:mm:ss")
Appendix:
Instructions to Install SQL Server Express
105 / 1277
Simio Reference Guide
DefineEntityProperties - SimBit
Problem:
I have multiple kinds of entities going through a working system. Each type of entity has its unique processing time and
rejection rates.
Categories:
Entity Characteristics
Key Concepts:
Expression Property, Numeric Property, Path, Selection Weight
Assumptions:
One Source produces only one type of entity. Reject rates are based on the ratio of the total number of entities that need
to be reworked to the total number of entities coming out of the server. ( So there is a possibility that some entities will
never reach the sink.)
Technical Approach:
Add processing time and rejection rates as properties to ModelEntity, so each type of entity can define its unique
processing time and rejection rates. The processing time of the Server is referencing the processing time property of
ModelEntity, the weights of the paths represent rejection and success based on the rejection rate property of ModelEntity.
Details for Building the Model:
Simple System Setup
Place two Sources, a Server and a Sink from the Standard Library into the Facility Window.
Use Path to connect two Sources’ output nodes to the input node of Server separately ( Path1, Path2), connect the
output node of the Server to its input node ( Path3), and also the Server’s output node to the Sink ( Path4).
Add two ModelEntity objects from the Project Library into the Facility Window, name one of them PartA, the other
one PartB.
Set Source1’s Entity Type to ‘PartA’, Source2’s Entity Type to ‘PartB’. Set the Interarrival Time of both of these two
Sources to ‘Random.Exponential(.5)’.
Generating Entity Properties
Go to Navigation Window, click on the current project DefineEntityProperties, and then go to ModelEntity. Open the
Definitions Window and select the Properties panel.
Click on Standard Property Ribbon, choose Real Data type, and create a Numeric Property. Name it ‘RejectRate’, its
Display Name is ‘Reject Rate’, Description is ‘Ratio of rejections (0-1)’, and Default Value is ‘0.0’.
Again, go to Standard Property, choose Expression Data type, and create an Expression Property. Name it
‘ProcessingTime’, its Display Name is ‘Processing Time’, and Default Value is ‘0.0’, Unit Type is ‘Time’, Default Units is
‘Minutes’.
In order to make those created properties to be used by customer more conveniently, we can save them to a
separate category of properties which we will call ‘Custom’. For the property ‘RejectRate’, go to Properties Window,
click on Category Name, and create a new category with the name of ‘Custom’, this will save ‘RejectRate’ to a new
property category which is ‘Custom’. Do the same thing for the property ‘ProcessingTime’.
Using Entity Properties
Go back to Model Window and open the Facility Window. Go to Server1, set ProcessingTime to
'ModelEntity.ProcessingTime. This will let the Server’s processing time use each Entity’s specific processing time
according to their entity type.
Click on Path3, which connects the output node of the Server to its input node. Then go to the Properties Window,
right click on Selection Weight and choose Set Referenced Property, and then choose Create New Referenced Property,
and create a new referenced property with the name ‘ModelEntity.RejectRate’. This will let entities be rejected and
go through Server again based on their reject rates corresponding to their entity types.
Click on Path4, which connects the output node of the Server to the Sink, then set its Selection Weight to ‘1-
ModelEntity.RejectRate’. 106 / 1277
ModelEntity.RejectRate’.
Specify Data on Each Entity Instance
For entity PartA and PartB, click on either one of them and go to Properties Window, there will be two properties we
just defined: Reject Rate and Processing Time.
Here we can specify reject rate and processing time on each instance of different types of entities. Set PartA’s Reject
Rate to ‘0.1’, Processing Time to ‘0.2’ ( Minutes); set PartB’s Reject Rate to ‘0.5’, Processing Time to ‘0.1’ ( Minutes).
107 / 1277
Simio Reference Guide
DisableFailureTimers - SimBit
Problem:
I want my model to stop running when all entities have finished processing, but the failures in the system keep the
simulation running.
Categories:
Add-On Process Logic, Arrival Logic
Key Concepts:
Calendar Time Based Failure, EventCount, Failure, Maximum Arrivals, Server
Assumption:
Only one Source is generating entities and once the maximum arrivals have been created, the simulation should stop
running.
Technical Approach:
When the number of entities that have been created at the Source reaches the maximum value of entities to be created, the
Timer state for the calendar time based failure associated with the server is disabled. This is done through an add-on
process.
Details for Building the Model:
Simple System Setup
Place a Source, a Server and a Sink from the Standard Library into the Facility window. Use Paths to connect the
Source to the Server and the Server to the Sink.
Within the Source’s Advanced Options, change the Maximum Arrivals to ‘25’ so we can determine how long it takes
to process 25 entities through the sytem.
Change the Ending Type in the Run Ribbon to Unspecified ( Infinite).
Server Failure
Within the Server, under the Reliability Logic section of properties, change the Failure Type to ‘Calendar Time Based’.
Change the Uptime Between Failures to ‘10’ and the Units to ‘Minutes’. Change the Time to Repair to ‘1’ and the
Units to ‘Minutes’.
Turning Off Failures When Entities Stop
Within the Processes window, create a new process named Process1. Add a Decide step that will have the Decide
Type as ‘ConditionBased’ and the Expression as ‘Source1.EntityArrivals.EventCount == Source1.MaximumArrivals’.
This will evaluate the entities exiting the source with the maximum arrivals value to see if all of the entities have been
created.
From the True exit of the Decide step, add an Assign step. Assign the State Variable Name
‘Server1.CalendarTimeBasedFailures.Enabled’ to the New Value of ‘0’. This means the failures are no longer enabled,
but are disabled. This will ensure that no additional events continue on the event calendar to keep the simulation
running after the entities have all completed processing.
Within the Facility window, within the Source’s output node, change the Exited Add-On Process Trigger to ‘Process1’
so that when an entity exits the node, this process is run.
Enhancements:
Within every Server, there are multiple types of failures that can be defined. In this example, we demonstrate turning off
the Calendar Time Based Failures. If you review the ‘MyServer’ object in the Navigation window, you will see in the
Definitions window, Elements panel, there are multiple Timer elements that are initially disabled. These are enabled if
Failure Type corresponding to that Timer is used. Therefore, you can disable any of these types of failures by simply using
the corresponding Timer name.
108 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
109 / 1277
Simio Reference Guide
DiscreteLookupTable - SimBit
Problem:
The entities in my model have different processing times depending on a priority that is assigned to the entities in the
middle of the model. The processing times and entity priorities are mapped in a table.
Categories:
Add-On Process Logic, Decision Logic – Processing, Lookup and Rate Tables
Key Concepts:
Lookup Table, Linear Interpolation, ModelEntity, Path, Priority, Selection Weight
Technical Approach:
The system has three servers in parallel, followed by one server in series. Depending on which server processes the entity, it
is assigned a different value to the state variable, ModelEntity.Priority. The fourth server uses this state variable and reads a
Lookup Table to determine the processing time.
Details for Building the Model:
Simple System Setup
Place a Source, Sink and 4 Servers in the Facility Window. The first three Servers are in parallel and they all lead to
the fourth Server that is in series.
The three paths leading from the Source to the first three Servers each have a different link Selection Weight of ‘.5’, ‘.3’
and ‘.2’. This means that 50% (.5/(.5+.3+.2)) of the entities go to one server, 30% go to another and 20% to another.
Changing the Entity Priority on Paths
Within the State Assignments properties of the paths leading to Server4 (from Server1, Server2 and Server3), enter
the On Entering repeating editor. Add a new assignment to specify the State Variable Name is ‘ModelEntity.Priority’,
where the New Value is ‘ 1’ for those departing Server 1 on path 4, ‘2’ for those from Server2 on path 5 and ‘3’ for
those entities from Server3 on path 6.
Adding a Lookup Table
Click on the Data tab and select the Lookup Tables panel. Click the Lookup Table button to create a new table.
Change the Name of the table in the Properties Window to ‘ProcessingTimes’.
Enter three rows of data in the table, mapping the numbers 1, 2, 3 to the values 3,5,6.
Utilizing a Table within a Server for Processing Times
In the Processing Time property of Server 4 in the Facility Window, use the following syntax to reference the table
‘ProcessingTimes[ ModelEntity.Priority]’.
110 / 1277
Simio Reference Guide
DynamicallyCreatingVehicles - SimBit
Problem:
I have a system where a transporter carries parts from machine to machine. When the system gets moderately busy and I
have more than 4 parts in the system, I would like to bring in another vehicle to help with the work. Similarly, if the system
becomes extremely busy and there are more than 8 parts in the system, I would like to bring in a third vehicle.
Categories:
Vehicles
Key Concepts:
Add-On Process, Create Step, Decide Step, Label, Monitor, On Associated Object Destroyed, On Entered, Process
Triggering Event, Real State Variable, Ride on Transporter, Sink, Source, Transfer Step, Vehicle
Assumptions:
A second vehicle is only created the first time the number of parts in the system goes above 4. And even if the number of
parts becomes less than 4, the second vehicle remains part of the model, it is not destroyed. There is similar logic for the
creation of the third vehicle.
Technical Approach:
Two different monitor elements watch a Model State that keeps track of the number of parts in the system. The first
monitor fires an event when the number of parts in the system goes over 4. This event triggers a process that checks to see
how many vehicles are currently in the system and if there is only one, it creates a new vehicle object. Similarly, the second
monitor fires an event when the number of parts in the system goes over 8 and a third vehicle is created (if there are only 2
in the system at the time). The reason the process checks to see how many vehicles are in the system before it creates a new
one is because the monitor element will fire the event each time the State positively crosses the threshold value (4 or 8). So
there might be 5 parts in the system, but then it goes down to 4 and up again to 5. We do not want to create a new vehicle
every time it goes above 4, just the first time.
Details for Building the Model:
Simple System Setup
Add a Source, three Servers, a Vehicle and a Sink to the Facility Window.
Connect the objects together with Paths. Create two paths between each Server object, each one traveling in
opposite directions. Our example has a Bi Directional path between the input and output nodes of Server 3 so the
transporter can travel around the object.
In our example, the Interarrival Time of the Source object is set to ‘Random.Exponential(.3)’ minutes and the
Processing Time of Server1 is set to ‘Random.Triangular(.05, .06, .08)’ minutes.
The Vehicle’s Desired Speed is set to ‘0.5’ Meters per second and the Initial Node (Home) is set to ‘Output@Server1’.
Keeping Track of the Number in System
A new discrete model State is created, called ‘Number In System’. This is done by clicking on the Definitions tab,
selecting the States panel and adding a new state using the Discrete State button on the ribbon tab. This state is
incremented with an Assign Step that is within a process which is triggered by an Add On Process trigger in the
Source object, called Created Entity. This process is triggered right after an entity has been created by the Source.
The state Number in System is decremented with an Assign Step that is within a process which is triggered by an Add
On Process trigger in the Sink object, called Entered.
Creating the Monitor Elements
Go to the Definitions tab and select the Elements panel. Click on the Monitor icon in the General Ribbon group. The
Monitor Type is ‘CrossingStateChange’ and the State Variable Name is ‘NumberinSystem’, or whatever name you
gave to your model State variable. The Threshold Value is ‘4’ and the Crossing Direction is ‘Positive’. This monitor will
fire an event whenever the state variable crosses from 4 to 5.
Add a second Monitor element which is very similar to the first. The only difference with this monitor is that the
Threshold Value is set to 8.
111 / 1277
Processes that Create the New Vehicle
Select the Processes tab in the Project Model tabs. Click on the Create Process icon in the Process Ribbon group.
In the Properties window of this new Process, set the Triggering Event to ‘Monitor_Over4.Event’ (exact name will
depend on what you named your monitor). This indicates that when that event is fired, it will trigger this process to
execute.
Place a Decide step in the Process. The Decide Type is condition based and the Expression is set to
‘Vehicle1.Population.NumberInSystem < 2’, which will ensure that we only create a new vehicle if there is only one in
the system.
Place a Create step in the True segment leaving the Decide step. The Create Type is ‘NewObject’ and the Object
Instance Name is ‘Vehicle1’ (the name of your vehicle).
When a vehicle is created, it is created in Free Space. So it needs to be transferred to a node that is on the network.
Place a Transfer step on the Created segment leaving the Create step. From is set to ‘FreeSpace’, To is set to ‘Node’
and Node Name is set to ‘Output@Server1’.
A similar process should be created for the monitor that is watching for more than 8 parts in the system. The only
difference in this process is that the Expression in the Decide step is ‘Vehicle1.Popultion.NumberInSystem < 3’.
112 / 1277
Simio Reference Guide
ElectricVehicle - SimBit
Problem:
I have an electric vehicle that it is used for the transportation of the entities in the system. The vehicle is sent to a charging
station when the battery level decreases to a certain threshold.
Categories:
Add-On Process Logic, Building New Objects / Hierarchy, Custom Object, Vehicles
Key Concepts:
Assign Step, Bidirectional Path, CrossingStateChange, Decide Step, Dynamic Label Text, Execute Step, Level State Variable,
Monitor, Movement, Movement.Rate, Off Shift, Override, Rate, Ride On Transporter, Subclass, Vehicle
Assumptions:
The electric vehicle battery consumption is directly related to the distance travelled, and it loses its charge at a rate of 1%
per meter travelled. When the Battery level reaches 20% remaining, the vehicle will finish unloading is current entity and
travel to the charging station. The vehicle charges at a rate of 5% per minute.
Technical Approach:
A Vehicle is subclassed from the Vehicle in the Standard Library and has additional process logic to track the battery level.
A Monitor watches the battery level and triggers a process to make the vehicle go off shift and send it to the charging
station when the battery level is low. When the Vehicle is done charging, the Vehicle goes back on shift and resumes
transporting entities.
Details for Building the Model:
Simple System Setup
In the Facility Window place a Source, a Server and a Sink. Also place one BasicNode above the Server, and a
second BasicNode, renamed ‘Charger’, to the right of the first BasicNode.
Place a ModelEntity from the Project Library into the Facility window.
Using Paths to connect the Source to the Server and the Server to the Sink. Connect BasicNode1 to the Source, the
Server, the Sink, and BasicNode ‘Charger’. Also connect the Server’s input node to Server’s output node. Select all the
paths change the Type property to ‘Bidirectional’.
Within the Source, change the Interarrival Time property to ‘10’ minutes. Within the Server, change the Processing
Time property to ‘5’ minutes.
Creating a Sub-Classed Object MyVehicle
Create a new vehicle called MyVehicle that is subclassed from Vehicle by right-clicking on Vehicle in the Standard
Library and selecting Subclass.
Select MyVehicle in the Navigation window and in its Definitions window, States panel, add a Level State Variable
with Name ‘BatteryRemaining’ and change the Initial State Value property to ‘100’. This will track the current battery
level, which will start with a full battery.
In the Elements panel, add a Monitor element with the Name ‘MovementRateChanged’ and change the State
Variable Name property to ‘Movement.Rate’ and the Triggered Process Name property to
‘OnMovementRateChanged’. Every time the Vehicle starts and stops, the OnMovementRateChanged process is
triggered.
Add another Monitor element with the Name ‘MonitorBatteryRemaining’ and change the State Variable Name
property to ‘BatteryRemaining’. Change the Monitor Type property to ‘CrossingStateChange’. Set the Initial Threshold
Value property to ‘100’ and change the Triggered Process Name to ‘FullChargeDetected’. This will trigger the
FullChargeDetected process every time the BatteryRemaining state increases to 100.
Within the Processes window of the MyVehicle object, click Create Process to add a new process and change its
Name to ‘StartChargingBattery’.
Add a Decide step and change the Condition property to ‘HomeNode==CurrentNode’.
On the True branch leaving the Decide step, place an Assign step. Set the State Variable Name property to
‘BatteryRemaining.Rate’ and its New Value to ‘300’. When the Vehicle is at the Charger node, the battery level
will increase at a rate of 300 per hour. 113 / 1277
will increase at a rate of 300 per hour.
Create a new process named ‘FullChargeDetected’. This process is triggered when the BatteryRemaining variable
reaches 100.
Add an Assign step and set the State Variable Name ‘BatteryRemaining.Rate’ to New Value of ‘0’.
Add another Assign step to the right of the previous Assign step, and set the State Variable Name to
‘CurrentCapacity’ and the New Value to ‘1’. This will change the current state of the Vehicle to ‘Onshift’. Now
that the vehicle is fully charged and on shift, it will travel to the next entity waiting for transport.
Create a third process named ‘OnMovementRateChanged’.
Add an Assign step, and change the State Variable Name property to ‘BatteryRemaining.Rate’ and the New
Value to ‘- Movement.Rate’. The will decrease the battery level at the same rate the vehicle is travelling.
Add an Execute step for the Process Name of ‘StartChargingBattery’.
Right click the process “OnRiderUnloaded” and select Override to allow the process to be modified.
On the right side of the Fire step, add a Decide step and change the Condition property to 'BatteryRemaining
< 20 && RideStation.Contents == 0'.
On the True branch leaving the Decide step, place an Assign step. Set the State Variable Name to
‘CurrentCapacity’ and the New Value to ‘0’. This will change the current state of the Vehicle to ‘Offshift’ if the
BatteryRemaining is below 20 and there are no entities left on the Vehicle. The Vehicle is set to go to its Home
Node ( Charger) when it goes off shift.
Vehicle Setup
Place a MyVehicle object from the Project Library to the Facility window and change the Name to ‘ElectricVehicle’.
Expand the Animation property and set the Dynamic Label Text property to
‘Math.Round( MyVehicle.BatteryRemaining, 1)’. That will show a label next to MyVehicle object with the current
BatteryRemaining state value.
Change the Initial Desired Speed property to ‘0.5’ Meters per Second.
Under Routing Logic, change the Initial Node (Home) property to ‘Charger’. Also change the Idle Action property to
‘Remain to Place’ and the Off Shift Action property to ‘Park At Home’.
Transferring the Entity
Within the Source output node, specify the Entity Destination Type of ‘Specific’ and the Node Name of
‘Input@Server1’. Change the Ride on Transporter to ‘True’ and the Transporter Name to ‘ElectricVehicle’.
Within the Server output node, specify the Entity Destination Type of ‘Specific’ and the Node Name of ‘Input@Sink1’.
Change the Ride on Transporter to ‘True’ and the Transporter Name to ‘ElectricVehicle’.
These previous steps tell the entity where to go next and on what vehicle (otherwise, it may leave the node on any of
the connected bidirectional paths).
Animation
Change the color of the top of the Entity object in order to identify it when it is being transported by the vehicle.
Change the symbol of the BasicNode Charger to identify where the charger is.
114 / 1277
Simio Reference Guide
EntitiesEnteringAlongConveyor - SimBit
Problem:
I have multiple types of entities that enter onto a single conveyor from multiple merge points. Entities then travel down the
single conveyor for later processing.
Categories:
Conveyor Systems
Key Concepts:
BasicNode, Conveyor
Assumptions:
There are three types of entities that enter the system. Each entity type has a unique entry area onto which it will later
merge onto a single conveyor system. When arriving at its merge point, the entity must wait for adequate space on the
conveyor before merging. At any merge point, entities enter based on a first in first out basis.
Technical Approach:
Use three Source objects to model the arriving entity types. Use three BasicNodes to model the merge points on the main
conveyor system. Finally, use Conveyor objects to model the entry conveyors for each part type from the respective sources
to the merge points, as well as for the main conveyor system.
Details for Building the Model:
Simple System Setup
Place three Source objects and a Sink in the Facility Window.
Place three BasicNodes into the Facility Window. These nodes will represent the merge points from each individual
part type entering onto the main conveyor.
Defining the Conveyor System
Connect each Source object to a BasicNode using the Conveyor object.
Then, starting at the leftmost BasicNode, connect it to the next BasicNode, and then again to the next with a
Conveyor. Connect the rightmost BasicNode to the Sink object. This will represent the entities leaving the conveyor
system.
Specifying Conveyor Characteristics
For each of the six (6) conveyor objects, the default Conveyor characteristics will be used. This includes the Conveyor
Speed of ‘2, as well as the Accumulating property of ‘True’. We would like all of our conveyors to be accumulating,
therefore if a given merge point is blocked, entities will begin to accumulate on their respective entering conveyor.
Defining Multiple Entity Types
Place three ModelEntity objects from the Project Library and change the Name them ‘PartA’, ‘PartB’ and ‘PartC’.
Change the entity symbols, so that you can graphically see the difference in the parts on the conveyors. We used the
Simio symbol library to select various “box” symbols for each of the entity types.
Within the three Source objects, specify the Entity Type as ‘PartA’, ‘PartB’ and ‘PartC’. Therefore, each source will
generate a different part type.
Changing the Conveyor Animation
In order to graphically make the conveyor paths look like conveyors, click on the conveyor path and select one of the
path decorators from the Path Decorators ribbon (i.e., conveyor, single lane, track, etc.).
EntityFollowsSequence - SimBit
Problem:
I have an entity that needs to be processed in a particular order by a series of machines.
Categories:
Decision Logic – Paths, Sequence Tables
Key Concepts:
By Sequence, Entity Destination Type, ModelEntity, Sequence Table, Table Transfer Node Property
Assumptions:
The source only produces one type of entity. This entity will follow the Sequence: Server 3 - Server 2 - Server 1 – Sink 1.
Technical Approach:
A Sequence Table is created and the entity is set to follow this Sequence in its Routing Logic. Each Output TransferNode is
set to pass the entity to its next destination By Sequence.
Details for Building the Model:
Simple System Setup
Add a Source, Sink and three Servers to the Facility Window. Update the Processing Time of each Server to be
‘Random.Triangular(0.5, 0.8, 1.2)’.
Adding a Sequence Table
In the Data Window, select the Tables panel and add a Sequence Table with Name ‘MySequence’. Add the
Destinations in the following order: Input@Server3 -> Input@Server2 -> Input@Server1 -> Input@Sink1.
Assigning the Sequence to the Entity
In the Facility Window, place an entity from the Project Library into the model.
Change the Routing Logic Initial Sequence property of the DefaultEntity to ‘MySequence’.
Modifying the TransferNodes
For each of the objects in the system, including Source and all three Servers, click on the TransferNode, change the
Entity Destination Type property (under Routing Logic) to ‘By Sequence’.
Double-click on the Path to connect the Source object to all three Servers, and then connect all the Servers to each
other and to the Sink object.
Embellishments:
There are many ways to make this model more specific. Try changing the Default entity’s Travel Logic to a desired speed or
the Source’s Interarrival Time rate.
116 / 1277
Simio Reference Guide
EntityFollowsSequenceMultiple - SimBit
Problem:
*Enhancement of EntityFollowsSequence.spf*
I have multiple sources; each producing their own specific entity type. Each entity type needs to be processed in a
particular order by a series of machines.
Categories:
Decision Logic – Paths, Sequence Tables
Key Concepts:
By Sequence, Entity Destination Type, ModelEntity, Sequence Table, Table Transfer Node Property, TransferNode
Assumptions:
Each source only produces one type of entity.
• Source 1 produces Part A ( Green) which follows the Sequence: Server 1 – Server 2 – Sink 1.
• Source 2 produces Part B ( Red) which follows the Sequence: Server 3 – Server 2 – Server 1 – Sink 1.
• Source 3 produces Part C ( Blue) which follows the Sequence: Server 2 – Sink 1.
Technical Approach:
A Sequence Table is created for each entity type and each entity is set to follow this Sequence in its Routing Logic. Each
output TransferNode, except those at Source 2 and Source 3, is set to pass the entity to its next destination ‘By Sequence’.
The output TransferNodes at Source 2 and Source 3 have been excluded because an entity will travel from these nodes to
the TransferNode at Source 1, which already has ‘By Sequence’ in its Routing Logic.
Details for Building the Model:
Simple System Setup
Add three Sources, three Servers and a Sink to the Facility Window. Update the Processing Time of each Server to be
‘Random.Triangular(0.5, 0.8, 1.2)’.
Adding a Sequence Table
In the Data Window, select the Tables panel and add three Sequence Tables named ‘SequenceA’, ‘SequenceB’ and
‘SequenceC’. Set the Destinations in each table in the following orders:
SequenceA : Input@Server1 -> Input@Server2 -> Input@Sink1
SequenceB : Input@Server3 -> Input@Server2 -> Input@Server1 -> Input@Sink1
SequenceC : Input@Server2 -> Input@Sink1
Assigning the Sequences to the Entities
Place three DefaultEntity objects from the Project Library into the Facility Window. Change the Name of each to
‘PartA’, ‘PartB’ and ‘PartC’.
Change the Routing Logic Initial Sequence property of each PartA, PartB, and PartC to ‘SequenceA’, ‘SequenceB’, and
‘SequenceC’, respectively.
Modifying the TransferNodes
For each output TransferNode, except those at Source2 and Source3, change the Entity Destination Type property to
‘By Sequence’. Entities created at Source2 and Source3 will connect through the output TransferNode at Source1.
Double-click on the Path to connect the Source1 object to all three Servers, and then connect all the Servers to each
other and to the Sink object.
Embellishments:
There are many ways to make this model more specific. Try changing any entity’s Travel Logic Speed Limit to a desired
117 / 1277
There are many ways to make this model more specific. Try changing any entity’s Travel Logic Speed Limit to a desired
speed or the Source’s Interarrival Time rate.
118 / 1277
Simio Reference Guide
EntityFollowsSequenceWithRelationalTables -
SimBit
Problem:
*Enhancement of EntityFollowsSequenceMultiple.spf*
I have a single source producing multiple types of entities. Each entity type needs to be processed in a particular order by a
series of machines. The service times at each server are dependent upon the entity type.
Categories:
Data Tables
Key Concepts:
Before Creating Entities, By Sequence, Data Table, Dynamic Object Property, Entity Destination Type, Expression Property,
ModelEntity, Numeric Property, RandomRow, Relational Table, Sequence Table, Server, Source, String Property, Table
Foreign Key Property, Table Key, Table Row Referencing, Table Transfer Node Property
Assumptions:
The Source produces three types of entities:
Part A ( Green) which follows the Sequence: Server 1 – Server 2 – Server 3 – Sink 1.
Part B ( Red) which follows the Sequence: Server 3 – Server 2 – Server 1 – Sink 1.
Part C ( Blue) which follows the Sequence: Server 2 – Sink 1.
Technical Approach:
A single Sequence Table is created to keep track of the Sequences and Process Times for each entity type. A Data Table is
created to specify product mix and point to the proper section of the Sequences table using the Foreign Keys feature. The
Table Assignment properties of the Source will be used to select a random entity type from the Data Table while the entity
is being created. Each TransferNode is set to pass the entity to its next destination ‘By Sequence’.
Details for Building the Model:
Simple System Setup
Add a Source, a Sink and three servers to the Facility Window. Also, place three ModelEntity objects from the Project
Library into the window.
Setting up the Data Table
Go to the Data tab, select the Tables panel and add a Data Table named ‘JobTable’ with the following Properties and
in the following order:
( Entity Object Reference) PartType : PartA, PartB, PartC
( Integer) ProductMix : 10, 20, 30
( String) SequenceType : A,B,C
When the SequenceType column is selected, make this the primary key of this table by clicking the “Set Column as
Key” icon in the Ribbon.
Setting up the Sequence Tables
Also the Data Window within the Tables panel, add a Sequence Table named ‘Sequences’. For the order of
Destinations in each table, please refer to EntityFollowsSequenceMultiple.pdf.
Add a Foreign Key property to this Sequence Table by clicking on the Foreign Key icon in the Ribbon. The Name of
this property should be set to 'SequenceType'. The TableKey property should be set to 'JobTable.SequenceType'.
Add an Expression Property to the Sequence Table with the Name set to ‘ProcessTime’. Set the ProcessTime
according to the following:
119 / 1277
SequenceA: Input@Server1 = Random.Uniform(0.5, 0.9), Input@Server2 = Random.Triangular(0.5, 1.1, 1.2),
Input@Sink1 = 0.0
SequenceB: Input@Server3 = Random.Triangular(0.5, 0.8, 1.2), Input@Server2 = 1.5, Input@Server1 = 1, Input@Sink1
= 0.0
SequenceC: Input@Server2 = Random.Triangular(0.5, 1.2, 1.6), Input@Sink1 = 0.0
Creating Multiple Entities from Single Source:
In the Facility Window, Source object, expand the Table Row Referencing section.
Set the Table Name property to ‘JobTable’, and the Row Number to ‘JobTable.ProductMix.RandomRow’.
Finalizing the Model
Change the Arrival Logic Entity Type property of the Source to ‘JobTable.PartType’.
Change all Processing Times of the Servers to 'Sequences.ProcessTime’.
For each TransferNode, change the Entity Destination Type property to ‘By Sequence’.
Embellishments:
There are many ways to make this model more specific. Try changing any entity’s Travel Logic Speed Limit to a desired
speed, the Source’s Interarrival Time rate, or any Server’s Capacity.
See Also:
EntityFollowsSequenceMultiple.spf, EntityFollowsSequenceWithTable.spf ( Uses simple (not relational) table to accomplish
the same thing) and UsingRelationalTables.spf
120 / 1277
Simio Reference Guide
EntityFollowsSequenceWithTable - SimBit
Problem:
*Enhancement of EntityFollowsSequenceMultiple.spf*
I have a single source producing multiple types of entities. Each entity type needs to be processed in a particular order by a
series of machines. The service times at each server are dependent upon the entity type.
Categories:
Data Tables, Decision Logic – Paths, Decision Logic – Processing, Sequence Tables
Key Concepts:
Before Creating Entities, By Sequence, Data Table, Dynamic Object Property, Entity Destination Type, Expression Property,
ModelEntity, Numeric Property, On Created Entity, RandomRow, Sequence Table, Server, Source, Table Row Referencing,
Table Sequence Property, Table Transfer Node Property
Assumptions:
The Source produces three types of entities:
• Part A ( Green) which follows the Sequence: Server 1 – Server 2 – Server 3 – Sink 1.
• Part B ( Red) which follows the Sequence: Server 3 – Server 2 – Server 1 – Sink 1.
• Part C ( Blue) which follows the Sequence: Server 2 – Sink 1.
Technical Approach:
A separate Sequence Table is created for each entity type to keep track of the Sequences and Process Times for each entity
type. A Data Table is created to help the Servers determine how long to process an entity based on its type. The Data
Table will be read by setting the Table Name property of the Source. The Source will also reference the Data Table after an
entity has been created to get reference to the appropriate Sequence Table based on the assigned row from the Job Table.
Each TransferNode is set to pass the entity to its next destination ‘By Sequence’.
Details for Building the Model:
Simple System Setup
Add a Source, a Sink and three servers to the Facility Window. Also, place three ModelEntity objects from the Project
Library into the window.
Setting up the Sequence Tables
In the Data Window, select the Tables panel and add three Sequence Tables named ‘SequenceA’, ‘SequenceB’, and
‘SequenceC’. For the order of Destinations in each table, please refer to EntityFollowsSequenceMultiple.
Add an Expression Property to each Sequence Table with the Name ‘ProcessTime’. Set the ProcessTime according to
the following:
SequenceA: Input@Server1 = Random.Uniform(0.5, 0.9), Input@Server2 = Random.Triangular(0.5, 1.1, 1.2),
Input@Sink1 = 0.0
SequenceB: Input@Server3 = Random.Triangular(0.5, 0.8, 1.2), Input@Server2 = 1.5, Input@Server1 = 1, Input@Sink1
= 0.0
SequenceC: Input@Server2 = Random.Triangular(0.5, 1.2, 1.6), Input@Sink1 = 0.0
Setting up the Data Table
• Add a Data Table named ‘JobTable’ with the following Properties and in the following order:
( Entity Object Reference) PartType : PartA, PartB, PartC
( Expression) ProcessTime : SequenceA.ProcessTime, SequenceB.ProcessTime, SequenceC.ProcessTime
( Integer) ProductMix : 10, 20, 30
( Sequence) PartSequence : SequenceA, SequenceB, SequenceC
Creating Multiple Entity Types from Source:
121 / 1277
In the Facility Window, expand the Table Row Referencing in the Properties Window of the Source object.
Under the Before Creating Entities subcategory, set the Table Name to ‘JobTable’ and the Row Number to
‘JobTable.ProductMix.RandomRow’
Under the On Created Entity subcategory, set the Table Name to ‘JobTable.PartSequence’ and leave the Row Number
empty.
Finalizing the Model
Change the Arrival Logic Entity Type property of the Source to ‘JobTable.PartType’.
Change all Processing Times of the Servers to ‘JobTable.ProcessTime’.
For each TransferNode, change the Entity Destination Type property to ‘By Sequence’.
Embellishments:
There are many ways to make this model more specific. Try changing any entity’s Travel Logic Speed Limit to a desired
speed, the Source’s Interarrival Time rate, or any Server’s Capacity.
See Also:
EntityFollowsSequenceMultiple.spf
122 / 1277
Simio Reference Guide
EntityStopsOnLink - Simbit
Problem:
I have a system where the entities in the system must stop moving on their links when a particular event occurs.
Categories:
Decision Logic -- Paths
Key Concepts:
Add-On Process, Allow Passing, Calendar Time Based Failure, Current Symbol Index, Current Symbol Index, Event, Failure,
Failure.Active, Fire Step, ModelEntity, On Failed, On Repaired, ParentObjectMovement, Path, Real State Variable, Resume
Step, Server, Subscribe Step, Suspend Step, Time To Repair, Uptime Between Failures, Wait Step
Assumptions:
Entities that are currently moving on links will stop mid-stream when a particular event occurs. In this example, that event is
a server failure. Once the failure has been fixed, all entities resume their movement.
Technical Approach:
The Subscribe step for the Model Entity is used to tie together the events of the model, such as failure and repair of the
Server, with events for the entity itself, such as suspending and resuming movement on a link. Two properties for the entity
are used to define the event names. When those events occur in the model, all currently moving entities have their
movement stopped or started.
Details for Building the Model:
Simple System Setup
Add a Source, Sink and Server to the Facility Window. Add a ModelEntity to the Facility Window. Connect the
Source to the Server and the Server to the Sink using Paths. Change the Allow Passing property of each Path to
‘False’.
Adding the Server Failure
In the Reliability Logic section of the Properties window for Server1, add a failure by changing the Failure Type to
‘Calendar Time Based’.
Set the Uptime Between Failures property to ‘2’ and Units to ‘Minutes’, and the Time to Repair property to ‘1’ and
Units to ‘Minutes’.
Model Entity: Suspending and Resuming the Entity Movement
In the Definitions Window of the Model Entity, add two new properties, ‘SuspendMyselfEvent’ and
‘ResumeMyselfEvent’. These two properties will then be edited in the Model Entity’s properties window to tie the
events in the model to the model entity.
In the Processes Window of the Model Entity, use the Create Process button to create two new processes called
SuspendMyself and ResumeMyself. We will add steps to these processes shortly.
Also in the Processes Window of the Model Entity, use the Select Process button to select the OnCreated process.
Within that process, add two Subscribe steps. In the first Subscribe step, right click on Event Name and Set
Referenced Property to ‘SuspendMyselfEvent’. Set the Process Name to ‘SuspendMyself’. In the second Subscribe
step, right click on Event Name and Set Referenced Property to ‘ResumeMyselfEvent’. Set the Process Name to
‘ResumeMyself’.
Within the SuspendMyself process, add a Suspend step and change the Suspend Type to ‘ParentObjectMovement’.
This will stop the movement of all entities currently created when this process is triggered.
Within the ResumeMyself process, add a Resume step and change the Resume Type to ‘ParentObjectMovement’. This
will resume all entity movement of all entities when this process is triggered.
Model: Firing the Events to Stop Entity Movement
Go to the Model and open the Processes window. Add two new processes called SuspendAll and ResumeAll. These
processes will be triggered when the Server fails and is repaired.
123 / 1277
In the Definitions window, add two new events, ‘SuspendEverybody’ and ‘ResumeEverybody’. These events will be
fired from the Processes just defined.
In the Processes window of the model, within the SuspendAll process, add a Fire step with the Event Name
‘SuspendEverybody’. Within the ResumeAll process, add a Fire step with the Event Name ‘Resume Everybody’.
Move to the Facility window and highlight Server1. Within the Add-On Process Triggers, change the Failed property
to ‘SuspendAll’ and the Repaired property to ‘ResumeAll’. This will fire the events to suspend and resume entities
when the Server is failed and repaired, respectively.
Model: Specifying the Model Entity Properties for the Events
Click on ModelEntity1 that is placed in the Model. In the General section of properties, you will notice the two new
properties we added above called SuspendMyselfEvent and ResumeMyselfEvent. These are also referenced in the
Subscribe steps for the ModelEntity.
Change the SuspendMyselfEvent property to ‘SuspendEverybody’ and the ResumeMyselfEvent property to
‘ResumeEverybody’. These will then feed into the Subscribe steps such that when those events are fired within the
model, the associated processes in the ModelEntity will be triggered.
Model: Stopping Incoming Entities
All of the above steps will stop entities that have been created and are moving in the system. To also stop incoming
entities (as the Source will continue to generate entities), the following steps can be followed.
In the model’s Definitions window, States panel, add a new Discrete State with Name of ‘MovementSuspended’. The
Initial State Value property should remain as ‘0’. This state will be evaluated when incoming entities enter the system
to determine if movement is suspended or not.
Within the Facility window, highlight the transfer node of Source1 and add an Add-On Process Trigger to the Entered
property by double-clicking on Entered. This will create a new process called ‘Output_Source1_Entered’.
Within the Process window, you will see the new process called ‘Output_Source1_Entered. Within this, add a Decide
step where the Decide Type is ‘ConditionBased’ and the Expression is ‘MovementSuspended==1’. From the True exit,
add a Wait step, to wait for the Event Name ‘ResumeEverybody’. From the False exit, there will be no steps.
Finally, within the SuspendAll process (in this Processes window), add an Assign step (after the Fire step) where you
assign the State Variable Name ‘MovementSuspended’ to the New Value of ‘1’. And similarly, in the ResumeAll
process (in this Processes window), add an Assign step (after the Fire step) where you reset the State Variable Name
‘MovementSuspended’ to the New Value of ‘0’.
Embellishments:
Entities may be suspended and resumed based on any number of happenings in a model, including time and/or a state
variable reaching a given value. You may also cause an event to occur by placing a Button in the Facility window and/or
Console window.
124 / 1277
Simio Reference Guide
ExamplesOfConveyors - SimBit
Problem:
I would like to understand how various conveyor configurations behave.
Categories:
Conveyor Systems
Key Concepts:
Accumulating, Auto Align Cells , BasicNode, BasicNode, Calendar Time Based Failure, Cell Location, Conveyor, Cross
Logic, Entity Alignment, Failure, Fixed Number Cells , Initial Capacity, Largest Value First, Number of Cells, On Event Arrival
Mode, Time To Repair, Uptime Between Failures
Technical Approach:
A “Master Source” creates the Entity arrivals for all other sources. This allows all sets of conveyors to depict their behavior
on the exact same arrivals. The sets of conveyors are then used to depict transfers between different conveyor
configurations.
Details for Building the Model:
Standard – all defaults left untouched.
Simply entities traveling on our standard conveyor
Accumulating – all defaults left untouched.
Entities will form a queue on the first conveyor if Processing Station is not completely clear. A new entity will not be
able to enter the Processing Station until the occupying entity’s trailing edge has entered the exit conveyor.
Non-Accumulating – The entry conveyor has Accumulating set to ‘False’.
If an Entity cannot immediately gain access to the Server, the entire conveyor will temporarily stop movement. When
the Entity in the Processing Station completely exits the Server, the next Entity will enter and the conveyor will begin
moving again.
Changing Speeds from Fast to Slow – The second conveyor’s Desired Speed has been set to ‘0.5 m/s’.
The first entity will enter the second conveyor and begin moving at the speed of the slower conveyor. If Entities are
created with a small enough interarrival time, the second entity will collide with the first entity and move on the first
conveyor at the speed of the second conveyor.
Changing Speeds with a Non-Accumulating Conveyor – The first conveyor has Accumulating set to ‘False’ and the second
conveyor’s Desired Speed has been set to ‘0.5 m/s’.
The first entity will enter the second conveyor and begin moving at the speed of the slower conveyor. If Entities are
created with a small enough interarrival time, the second entity will collide with the first entity and the speed of the
faster conveyor will be set to the speed of the slower conveyor. All other entities entering the faster conveyor will
move at the speed of the slower conveyor until all queued entities have completely left the first conveyor.
Changing Speeds From Faster Cell Aligned to Slower Cell Aligned – Each conveyor has Entity Alignment set to ‘Cell
Location’, Cell Spacing Type is set to ‘Fixed Number Cells', Number of Cells is set to ‘8’ and Auto Align Cells is set to ‘No’
Entities travel down the cell aligned conveyor on a chain dog. When the entity gets to the next cell aligned conveyor,
it has to wait until a chain dog from that conveyor comes by to pick it up. Because the second conveyor is slower, this
will cause entities to form a queue on the first conveyor and the entities will disengage from their chain dogs. Once a
chain dog from the second conveyor picks up a waiting entity, the other waiting entities will step along the first
conveyor, starting with the entity farthest along the conveyor, as chain dogs become available.
Changing Speeds From Slower Cell Aligned to Faster Cell Aligned – Each conveyor has Entity Alignment set to ‘Cell
Location’, Cell Spacing Type is set to ‘Fixed Number Cells', Number of Cells is set to ‘8’ and Auto Align Cells is set to ‘No’
Entities travel down the cell aligned conveyor on a chain dog. When the entity gets to the next cell aligned conveyor,
it has to wait until a chain dog from that conveyor comes by to pick it up. Because the second conveyor is faster,
125 / there
1277
it has to wait until a chain dog from that conveyor comes by to pick it up. Because the second conveyor is faster, there
will never be any queuing because a chain dog will always arrive to pick up a waiting entity before the next entity
arrives at the end of the link.
Faster Cell Aligned Non-Accumulating to a Slower Cell Aligned – Each conveyor has Entity Alignment set to ‘Cell
Location’, Cell Spacing Type is set to ‘Fixed Number Cells, Number of Cells is set to ‘8’ and Auto Align Cells is set to ‘No’,
and the first conveyor has Accumulating set to ‘False’
Entities travel down the cell aligned conveyor on a chain dog. When the entity gets to the next cell aligned conveyor,
it has to wait until a chain dog comes by to pick it up and disengages itself from the first conveyor. If a second entity
reaches the end of the conveyor before the first is picked up, it will stop the movement of the entire conveyor. When
the waiting entity enters the slower conveyor, the entire first conveyor moves at the slower rate. After the entity is
completely off of the first conveyor it will run at full speed.
Moving Onto Failing Cell Aligned from Cell Aligned – Each conveyor has Entity Alignment set to ‘Cell Location’, Cell
Spacing Type is set to ‘Fixed Number Cells', Number of Cells is set to ‘8’ and Auto Align Cells is set to ‘No’. The second
conveyor has Calendar Time Based with an Uptime Between Failures of ‘0.1 minutes’ and a Time To Repair of ‘0.1 minutes’
This situation is similar to moving onto a slower cell aligned conveyor. Entities will form a queue and after the first
entity completely exits the first conveyor, the waiting entities will step forward when chain dogs become available.
Merging Conveyors With Different Speeds – The two merging conveyors have their Desired Speeds set to ‘3 m/s’ and ‘4
m/s’, and they are merging onto a conveyor moving at 2 m/s.
If there is a queue at the merge point, entities will take turns merging based on a FIFO Entry Ranking Rule.
Merging Cell Aligned Conveyors With Different Speeds – Same setup as above but Each conveyor has Entity Alignment set
to ‘Cell Location’, Cell Spacing Type is set to ‘Fixed Number Cells', Number of Cells is set to ‘8’ and Auto Align Cells is set to
‘No’
Entities will merge based on a FIFO Entry ranking rule, but when it is an entities turn to merge, it must first wait for an
available chain dog. Similar to other accumulating cell aligned conveyors, the remaining waiting entities will step
their way to the end of the conveyor when chain dogs become available.
126 / 1277
Simio Reference Guide
ExamplesOfFunctions_DynamicObjects -
SimBit
Problem:
I would like to understand some of the functions available to use with dynamic objects (entities, transporters, etc).
Categories:
Functions
Key Concepts:
Capacity.Allocated, CurrentLink, DestinationNode, Distance, Dynamic Object, Floating Label, FrontTraffic, Function, ID,
IsRiding, Location.X, Math.Round(), NumberCreated, NumberDestroyed, NumberInSystem, Ride on Transporter,
RideStation.Capacity.Remaining, CurrentTransporter, Round, SlipSpeed, TransferNode, Vehicle
Assumptions:
The functions shown in this model are not the entire list of available functions. To see all the available functions and to get
additional information on all functions, see the Functions page.
Status Labels are used to display the expressions for the population functions. Status Labels are added to the Facility
window from the Animation Ribbon. Floating Labels are used to label these functions. Floor Labels are used to display the
titles of each section. Rectangles and Polylines were also used to create the displays in this model. Floating Labels, Floor
labels, Rectangles and Polylines are all added to the Facility window from the Drawing Ribbon. The functions that are
attached to the entity and the Transporter are attached Floor Labels that contain both text and expressions.
Technical Approach:
The attached Floor Labels were added to this model by first placing a Vehicle (from the standard library) into the Facility
window. Also place a ModelEntity (from the project library) into the Facility window.
Click on each object and select Floor Label from the Attached Animation category in the Ribbon. Draw an attached Floor
Label and then click on the Edit button in the Ribbon to edit the text. Text is typed into the Label Text window directly. An
expression can be entered into this label by surrounding it with curved brackets { }. Because the expressions are attached to
the object, the object qualifier does not need to be part of the expression. For example, to display
Vehicle1.Capacity.Allocated in a label that is attached to Vehicle1, the expression should read { Capacity.Allocated}.
Details for Building the Model:
Examples of Functions Available for a Dynamic Object
Vehicle1.Capacity.Allocated – Returns the current number of capacity units of Vehicle1 that have been allocated
(have been seized) Note: These are resource capacity units, not ride capacity units.
Vehicle1.CurrentLink – If Vehicle1’s leading edge is currently on or at the end of a link, this function returns a
reference to the link.
Vehicle1.DestinationNode – Returns a reference to the Vehicle1’s current destination node or returns ‘Nothing’ if it
does not have a destination assigned.
Vehicle1.ID – Returns the unique ID number of Vehicle1.
Vehicle1.RideStation.Capacity.Remaining – Returns the current available carrying capacity of this transporter.
Vehicle1.SlipSpeed – If the entity (or vehicle) is currently on a link, then this function returns the minimum of the
link’s current speed or the speed of the next entity immediately ahead on the same link. If there is no traffic ahead on
the link, then this function simply returns the link’s current speed.
DefaultEntity.ID – Returns the unique ID number of this entity.
DefaultEntity.DestinationNode – Returns a reference to the entity’s current destination node or returns ‘Nothing’ if
it does not have a destination assigned
DefaultEntity.FrontTraffic.Distance – If the entity object is currently on a link, then this function returns the distance
from the entity’s leading edge to the trailing edge of the next entity immediately ahead on the same link. If there is
no traffic ahead on the link, then this function returns the distance from the entity’s leading edge to the end of the
link. Note: The FrontTraffic function can be used alone and it will return True (or 1) if there is an entity ahead of it on
the link. In addition to the Distance function, there is also a FrontTraffic.ID function that will return the ID of any front
127 / 1277
the link. In addition to the Distance function, there is also a FrontTraffic.ID function that will return the ID of any front
traffic and FrontTraffic.Speed that will return the current speed of an entity that is traveling ahead on the link. See
Functions, States and Events for Link Objects for more information.
DefaultEntity.IsRiding – Returns ‘True’ (or ‘1) if the entity is currently riding on a Transporter.
DefaultEntity.CurrentTransporter – If the entity object is currently riding on a transporter, then this function returns
a reference to that transporter.
DefaultEntity.Location.X – Returns the X coordinate of the object’s current location. Therefore, this changes as the
entity moves along the link. Location.X and Location.Y are also available.
Examples of Functions Available a Population of Dynamic Objects
DefaultEntity.Population.NumberInSystem – Returns the current number of objects of this object’s type that are
currently in the system.
DefaultEntity.Population.NumberCreated – Returns the total number of objects of this object’s type that have been
created.
DefaultEntity.Population.NumberDestroyed – Returns the total number of objects of this object’s type that have
been destroyed.
See Also:
The SimBit titled ExamplesOfFunctions_StaticObjects for examples of functions that are available for static objects.
128 / 1277
Simio Reference Guide
ExamplesOfFunctions_StaticObjects - SimBit
Problem:
I would like to understand some of the functions available to use with static objects.
Categories:
Functions
Key Concepts:
AssociatedStationLoad, Average, AverageTimeWaiting, Capacity.Allocated, Capacity.Remaining, Contents,
CurrentDirection, EventCount, InputBuffer, LastRecordedValue, Load, Location.X, NumberEntered, NumberOccurences(),
NumberTravelers, NumberWaiting, OutputBuffer, Path, PercentTime(), Processing, ResourceState, Server, Sink,
TimeInSystem, TimeOnLink, TotalTime()
Assumptions:
The functions shown in this model are not the entire list of available functions. To see all the available functions and to get
additional information on all functions, see the Functions page.
Status Labels are used to display the expressions. Status Labels are added to the Facility window from the Animation
Ribbon. Floating Labels are used to label the functions. Floor Labels are used to display the titles of each section.
Rectangles and Polylines were also used to create the displays in this model. Floating Labels, Floor labels, Rectangles and
Polylines are all added to the Facility window from the Drawing Ribbon.
Details for Building the Model:
Examples of Functions Available for a Source
Source1.Location.X – Returns the X coordinate of the Source’s current location. The location function is available for
all static and dynamic objects. Other options available are Location.Y and Location.Z
Source1.EntityArrivals.EventCount - Returns the number of events that have been fired by the Timer since its last
reset. The EventCount function is available with any Timer element.
Source1.OutputBuffer.Contents – Returns the number of entities currently in the OutputBuffer station. There are
other functions available to use with the Contents queue, such as AverageNumberWaiting and
MaximumTimeWaiting. See the Functions page for information on Queue State functions.
Examples of Functions Available for a Path
Path1.CurrentDirection – Returns the current direction of traffic on this link. The value returned is
Enum.TrafficDirection.Forward, Enum.TrafficDirection.Reverse or Enum.TrafficDirection.None. (1, 2 or 3). This function
is available for all Link objects.
Path1.TimeOnLink.Average – Returns the average time the traveler was on this link. Maximum and Minimum are
also available.
Path1.NumberTravelers – Returns the current number of travelers on this link. There are other functions available to
use with this function: NumberTravelers.Accumulated, NumberTravelers.Average, NumberTravelers.Minimum,
NumberTravelers.Maximum, NumberTravelers.Entered, NumberTravelers.Exited. See Functions, States and Events for
Link Objects Help page for additional information on these functions.
Examples of Functions Available for a Sink
Sink1.InputBuffer.NumberEntered – Returns the total number of entity objects that have entered this station.
NumberExited is also available.
Sink1.TimeInSystem.Average – Returns the average of the observations recorded. In this example, this is the
average time in system of the entity objects that enter into this Sink object. TimeInSystem is a TallyStatistic element
and Average is a function available to all TallyStatistic elements. Other functions available for TallyStatistics are
NumberObservations, HalfWidth, LastRecordedValue, Maximum and Minimum. The value is multiplied by 60 to
convert from hours to minutes and is rounded to 1 significant digit using the Math.Round function.
Sink1.TimeInSystem.LastRecordedValue – Returns the last recorded value for this TimeInSystem TallyStatistic
within the Sink object. The TimeInSystem is referring to the TimeInSystem of the entities that enter this Sink object.
TimeInSystem is a TallyStatistic element and LastRecordedValue is a function available to all TallyStatistic elements.
129 / 1277
TimeInSystem is a TallyStatistic element and LastRecordedValue is a function available to all TallyStatistic elements.
Other functions available for TallyStatistics are NumberObservations, HalfWidth, Average, Maximum and Minimum.
The value is multiplied by 60 to convert from hours to minutes and is rounded to 1 significant digit using the
Math.Round function.
Examples of Functions Available for a Server
Server1.Capacity.Remaining – Returns the current unallocated capacity of this object. Other related functions are
Capacity.Allocated, Capacity.Initial, Capacity.Maximum, Capacity.Minimum, Capacity.Previous, Capacity.Remaining,
Capacity.AllocatedTo(owner) ( Returns the number of capacity units of this object currently seized and owned by the
executing token’s associated object.)
Server1.Capacity.Allocated – Returns the current number of capacity units of this object that are allocated (have
been seized).
Server1.InputBuffer.Contents.AverageTimeWaiting – Returns the average time that an entity waited in the
Contents queue state of the InputBuffer(in hours). In other words, the average time that an entity spent in the
InputBuffer of Server1. There are other functions available to use with the Contents queue, such as
AverageNumberWaiting and MaximumTimeWaiting. The value is multiplied by 60 to convert from hours to minutes
and is rounded to 1 significant digit using the Math.Round function. See the Functions page for information on
Queue State functions.
Server1.InputBuffer.Contents.NumberWaiting – Returns the current number of entities waiting in the InputBuffer
of Server1.
Server1.Processing.Contents – Returns the current number of entities that are in the Processing station of Server1.
Server1.ResourceState.PercentTime(1) – Returns the percent time that this Resource list state had the value of 1. In
other words, the percentage of the total simulation time that Server1 was in the Resource State of 1 ( Processing). *
Server1.ResourceState.TotalTime(0) – Returns the total time that this Resource list state had the value of 0. In other
words, the total amount of time that Server1 was Starved or Idle. *
Server1.ResourceState.NumberOccurences(3) – Returns the number of times that Server entered into the Resource
list state of 3. In other words, it returns the number of times that Server1 entered the Failed state. *
Server1.ResourceState == 1 - Returns the value of 0 if Server1 is not currently in ResourceState of 1 and returns a
value of 1 when Server1’s ResourceState is currently = 1. *
[email protected] – For an external input node, this function returns the current 'load' on the
station locations inside the node's associated object that may be entered using the node. The associated station
'load' is defined as the sum of current entities en route to the node intending to enter the stations, plus the current
entities already arrived to the node but still waiting to enter the stations, plus the current entities occupying the
stations.
* NOTE: Default Server ResourceState Values: 0 – Starved, 1 – Processing, 2 – Blocked, 3 – Failed, 4 - OffShift, 5 -
FailedProcessing, 6 - OffshiftProcessing, 7 - Setup, 8 - OffshiftSetup
See Also:
The SimBit titled ExamplesOfFunctions_DynamicObjects for examples of functions that are available for dynamic objects.
130 / 1277
Simio Reference Guide
ExcelReadWrite - SimBit
Problem:
I want to use MS Excel to read data into Simio and also to write data from Simio.
Categories:
File Management
Key Concepts:
Add-On Process, ExcelRead Step, ExcelWrite Step, Assign Step, ExcelConnect Element, String State Variable, Integer State
Variable
Technical Approach:
ExcelConnect element is used to connect with the Excel sheet. An add-on process is used where row and column position
are defined using Assign step from where data has to be read in Excel file. Then using ExcelRead step, data is read and
using ExcelWrite step, data is written into Excel.
Details for Building the Model:
Simple System Setup
Within the Facility window, add a Source, a Server and a Sink from Standard Library. Connect the objects using Paths.
Within the Source object, change the Maximum Arrivals (under Stopping Conditions) to ‘30’.
Within the output node of the Source, within the Add-On Process Triggers section, double-click on the Entered
property to create a new process named ‘Output_Source1_Entered’.
Within the Definitions tab, click on the States panel. Add a String State and three Integer State and name them
‘StringState’, ‘RowIntegerState’, ‘ColumnIntegerState’, ‘IntegerState’.
Next, click on Element panel and within the Element Ribbon, select on User Defined button to select ExcelConnect
element. In the property window for ExcelConnect1 created, enter the Excel Workbook name ‘ExcelReadWrite.xlsx’.
Within the Processes window, in the Process named Output_Source1_Entered, add two Assign steps from Common
Steps panel and ExcelRead and ExcelWrite Step from User Defined panel of steps.
For the first Assign step, assign the State Variable Name ‘ColumnIntegerState’ and New Value ‘ColumnIntegerState
+1’. For the sSecond Assign step, assign State Variable Name ‘RowIntegerState’ and New Value ‘RowIntegerState +1’.
For the ExcelRead step, select ‘ExcelConnect1’ from the list for the ExcelConnect property. Click on Worksheet and
enter ‘Sheet1’. For Row , enter ‘RowIntegerState’ and for Starting Column, enter ‘1’. Then click on States to open
repeating property editor. Add. a State ‘StringState’ and another State ‘IntegerState’.
For the ExcelWrite step, again select ‘ExcelConnect1’ for the ExcelConnect property. Add the Worksheet value of
‘Sheet2’. For Row, enter ‘RowIntegerState’ and for Starting Column, enter ‘ColumnIntegerState’.Then click on Items to
enter the repeating property editor. Add an Expression named ‘TimeNow’, one named ‘StringState’ and one named
‘IntegerState’.
Within the Facility window, click on the Animation ribbon. Select Status Label and draw two Status Labels in Facility
window. For the first Status Label, enter the Expression ‘StringState’. For second Status Label, enter the Expression
‘IntegerState’.
131 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
132 / 1277
Simio Reference Guide
FacilityModelWithinModel - SimBit
Problem:
You have a facility in which many of the operations are similar. You wish to make a single “object” that encompasses 3 serial
processes into a single process for simplicity.
Categories:
Building New Objects / Hierarchy
Key Concepts:
BasicNode, Expression Property, External View, ExternalNode, Server, To Parent External Node, Bind To External Input
Node, Bind To External Output Node, Externally Visible
Assumptions:
The similar processes that will be made into an object include a single Server ( ProcessA ), which then moves entities to one
of 2 more Servers ( Process B ), followed by a fourth Server ( ProcessC).
Technical Approach:
Within the first model, called ProcessABC, we will define the processing necessary for this single object. It includes
ProcessA, ProcessB_1 and ProcessB_2, and ProcessC. All logic for these Servers will be assumed unchangeable except for
the Processing Time property for each. Therefore, when this ProcessABC model is placed into the Facility Window of
another model, the user must only specify the four processing times for the various Servers. The External Window is used to
define the view of the model, including the input and output nodes.
Details for Building the Model:
Simple System Setup
Rename Model to ProcessABC by clicking on MySimioProject, highlighting the Models panel and clicking on Model.
Pressing F2 (or clicking again on Model) will put you in rename mode.
Place 4 Servers within the Facility Window of ProcessABC and rename them to ProcessA, ProcessB_1, ProcessB_2
and ProcessC. Connect them with Paths – ProcessA to both ProcessB_1 and ProcessB_2, and then both ProcessB_1,
ProcessB_2 connected to ProcessC.
Defining the Properties of a Hierarchical Model
Highlight each Server and use the Processing Time property to indicate that the data for this processing time be
given in the parent object. This is done by highlighting the Processing Time property (it will turn blue) and using the
right click to select “Set Referenced Property” and then select “Create New Referenced Property”. This will open a
dialog to specify the name of the property in the parent ProcessABC that the user will be able to edit (i.e.,
ProcessTimeA ). Once you do this, the field will have the name of the property with a small green arrow in front of it.
This means that the value will be “inherited” from the parent object ProcessABC when it is placed in a model. Do this
will all four Servers.
Defining the External View of Model
From the Facility window, right click on the Input Node of ProcessA and select Bind To New External Input Node. You
will be prompted to name the new External Node. Keep the default name of Input_ProcessA. This is the node where
entities will enter into this object. They will automatically enter this object and go directly into ProcessA.
Similarly, right click on the Output Node of ProcessC and select Bind To New External Output Node. You will be
prompted to name the new External Node. Keep the default name of Output_ProcessC. This is the node where
entities will exit this object. They will automatically exit this object when they enter into the Output node of ProcessC.
Using the Model within Another Model
Open a new model and within its Facility Window, place a ProcessABC object from the Project Library.
Select the Source and Sink objects from the Standard Library and place them in the Facility Window.
Connect the Source1 to ProcessABC and then ProcessABC to the Sink1 using Paths. Notice when you highlight
ProcessABC, you have access to all the processing times, namely ProcessTimeA, ProcessTimeB_1, ProcessTimeB_2
and ProcessTimeC. When you run this new model, the logic behind ProcessABC then includes all logic specified
133 / 1277
and ProcessTimeC. When you run this new model, the logic behind ProcessABC then includes all logic specified
within that model.
Discussion:
Notice that when you placed the Server objects into the ProcessABC model, they automatically appeared as part of the
External View of that object. If you right click on each Server ( ProcessA, ProcessB, etc) in the Facility window of model
ProcessABC, you’ll see that the option, Externally Visible is selected by default. This means that these objects will be visible
in the External View of this object (will be seen when this object is placed inside another model). If you unselect Externally
Visible from the right click menu of an object, it will no longer appear in the External View of that object.
134 / 1277
Simio Reference Guide
FreeSpaceMovement - SimBit
Problem:
I would like to learn how an Entity and a Vehicle can travel in Free Space.
Categories:
Add-On Process Logic, Movement In Free Space, Vehicles
Key Concepts:
Add-On Process, FreeSpace, Initial Network, ModelEntity, Transfer Step, Travel Step
Assumption:
Moving in Free Space means that an entity is moving within the Facility window but it is not moving on a Link.
Technical Approach:
This project contains three models and each model demonstrates a concept in free space movement.
The model named FreeSpaceTravelWithNoDestinationSet contains a DefaultEntity with its Initial Network property set to
‘No Network ( Free Space)’. The entity does not have a destination set when it travels so Simio will send the entity to the
closest External Input Node. In this model there are three possible External Input Nodes for it to travel to; Input@Server1,
Input@Server2 or Input@Sink1. Moving these objects around before or during the run will show that the entity will always
choose the node that is closest to its current location.
The model named TransferIntoFreeSpace_UseTravelStep contains a DefaultEntity with its Initial Network property set to
the default value of ‘Global’. This allows the entity to travel on the Path leaving the Source. When the entity enters
BasicNode1, the Add On Process uses a Transfer Step to transfer the entity into Free Space and then the Travel Step tells
the entity to move to the location where BasicNode2 is currently located. After the entity arrives at that location, another
Transfer Step transfers the entity from Free Space into BasicNode2. Since it is still on the Global network, it will then follow
the Path leaving BasicNode2 and travel to Sink1.
The model named VehicleTravelInFreeSpace contains a DefaultEntity and a Vehicle that both have their Initial Network
property set to ‘No Network ( Free Space)’. This demonstrates how a vehicle can travel in free space.
Details for Building the FreeSpaceTravelWithNoDestinationSet Model:
Place a Source, two Servers, and a Sink into the Facility window. Leave some space between the objects so you can
see the entity moving in Free Space.
Place a ModelEntity object from the Project Library into the Facility window.
Select the DefaultEntity instance in the Facility window and change the Initial Network property to ‘No Network
( Free Space)’.
The entity does not have a destination set and because there are no links, the entity does not know where to go. In this
situation, Simio will find the closest External Input Node and send the entity there. In this model, the External Input Nodes
are Input@Server1, Input@Server2 and Input@Sink1. Whichever node is closest to the entity will be selected as its
destination. Move the objects around to see how the destination changes depending on the distance between the entity
and the input nodes.
Details for Building the TransferIntoFreeSpace_UseTravelStep Model:
Place a Source, a Sink and two Basic nodes into the Facility window. Connect the output node of the Source to
BasicNode1 with a Path. Connect BasicNode2 to the input node of Sink1 with a Path.
Select BasicNode1 and create a new Add On Process by selecting ‘Create New’ in the dropdown of the Entered Add
On Process trigger property of this node. This will create a new process that will appear in the Processes window.
Place a Transfer Step into the process. Set the From property to ‘CurrentNode’ and the To property to
‘FreeSpace’.
Place a Travel Step. Set the Destination Type to ‘Specific Object’, set the Destination Object to ‘BasicNode2’,
and set the Units (under Maximum Movement Rate) to ‘Meters per Second’.
Place another Transfer Step and set the From property to ‘FreeSpace’, the To property to ‘Node’ and the Node
Name property to ‘BasicNode2’.
135 / 1277
By default, the DefaultEntity is set to travel on the Global network. This allows it to travel on all Links. Therefore, it travels
on the Path leaving the Source and arrives at BasicNode1. At that point, we need to tell the entity to go into FreeSpace.
We do that with a Transfer Step, transferring the entity from the current node into Free Space. The Travel Step is used only
when an entity is in Free Space and it tells the entity where to move. When the entity arrives at BasicNode2, it is still in Free
Space so it cannot travel on the Path into the Sink. So we need another Transfer Step that transfers the entity from Free
Space into BasicNode2. At this point, it’s still on the global network and therefore it travels on the Path into the Sink.
Details for Building the VehicleTravelInFreeSpace Model:
Place a Source, a Sink and a Transfer node into the Facility window.
Place a Vehicle into the Facility window.
Set the Vehicle’s Initial Network property to ‘No Network ( Free Space)’. Set the Initial Node (Home) property
to ‘TransferNode1’ and the Idle Action property to ‘Go To Home’.
Place a ModelEntity into the Facility window from the Project Library (bottom left of screen).
Set the Initial Network property to ‘No Network ( Free Space)’.
Select the Output@Source1 node and set the Entity Destination Type property to ‘Specific’ and the Node Name
property to ‘TransferNode1’.
Select TransferNode1 and set the Entity Destination Type property to ‘Specific’ and the Node Name property to
‘Input@Sink1’. Set the Ride On Transporter property to ‘True’ and the Transporter Type property to ‘Specific’ and the
Transporter Name property to ‘Vehicle1’.
This is a simple model demonstrating that a Vehicle can travel in Free Space.
Embellishments
Instead of a Vehicle object, use a Worker object to show that a Worker can also travel in Free Space. A Travel Step can also
be used with a Vehicle or Worker object.
136 / 1277
Simio Reference Guide
FileSecurity - SimBit
Problem:
I would like to password protect my model.
Categories:
File Management
Key Concepts:
Add-On Process, Data Table, Dynamic Object Property, Expression Property, Numeric Property, On Creating Entities,
Password Protect, RandomRow, SetRow Step, Source, String Property
Assumptions:
The password to open the object named MyModel is ‘simio’.
Technical Approach:
A password will be added to MyModel by using the Protection feature.
Details for Building the Model:
Adding a Password to MyModel
Click on MySimioProject in the Navigation window and select the Models panel.
Highlight the model that you would like to password protect and click on the Protect button in the Edit ribbon.
Enter ‘simio’ or a desired password into the field.
Upon reopening the project file, the correct password will have to be entered to gain access.
You can later unprotect the model by selecting the Unprotect button if desired.
Embellishments
This method of protection can also be used for any model object in the Navigation window.
137 / 1277
Simio Reference Guide
Financials - SimBit
Problem:
I would like my model to calculate costs, such as capital costs of objects, usage costs, holding costs and the cost of
transporting an Entity on a Vehicle.
Categories:
Add-On Process Logic, Decision Logic – Paths, Entity Characteristics, Servers, Vehicles
Key Concepts:
Add-On Process, Assign Step, Bidirectional Path, Cost Center, Financials, InputBuffer, ModelEntity, Entered, Pivot Grid,
Processing, Ride on Transporter, Selection Weight, Server, Vehicle
Technical Approach:
This model gives examples of how to use a few different costing features in Simio. One object demonstrates the Capital
Cost property, another uses the Holding Cost property which calculates the cost to hold an Entity in the Input Buffer of this
object. The model also shows how the user can manually apply costs with an Assign step. It also contains a Vehicle which
has costs associated with each Entity that rides on the Vehicle. All the costs in this model are rolled up into one of four Cost
Centers.
Details for Building the Model:
Simple System Setup
Place a Source object and change the Interarrival Time property to ‘Random.Exponential(.8)
Place a Server object and change the Name of the Server to 'InspectionA', connect the Source to the Server with a
Path.
Place a Sink object and name it FailedInspection. Connect the Server 'InspectionA' to this FailedInspection Sink with
a Path. Set the Selection Weight property to ‘.3’.
Place a second Server object and Name it 'Paint'. Connect the Paint Server to the InspectionA Server with a Path and
set the Selection Weight property to ‘.7’
Place a Sink object and Name it 'Sink1'. Connect the Paint Server to this Sink with a Path. Change the Type property
on the Path to ‘Bidirectional’.
Place a Vehicle object. Set its Initial Home property to ‘Output@Paint’ and change its Name to 'Car'.
Click on the TransferNode of the Paint Server ( Output@Paint) and within the Transport Logic section of properties,
change Ride on Transporter to ‘True’ and Transporter Name to ‘Car’.
Configure Costing of InspectionA
Select InspectionA ( Server) and open the Financials property category. View the drop-down selection list for the
Parent Cost Center property by clicking on the down arrow that appears when this property is selected.
Create a new Cost Center by selecting ‘Create New’ from the drop-down. Name this new Cost Center
‘InspectionCostCenter’. All the costs incurred at this Server will be rolled up to this new Cost Center.
Configure Costing of Paint
Select Paint ( Server) and change the Processing Time property to ‘Random.Triangular(.2, .3, .4)’. Open the Financials
property category. View the drop-down selection list for the Parent Cost Center property by clicking the down arrow
that appears when this property is selected.
Create a new Cost Center by selecting ‘Create New’ from the drop down. Name this new Cost Center
‘PaintCostCenter’. All the costs incurred at this Server will be rolled up to this new Cost Center.
Set the Capital Cost property to ‘1,000’ USD. This is a one-time cost of $1,000 to just own this Server.
Expand the Buffer Costs subcategory and expand the Input Buffer category. Set the Holding Cost Rate (under
Input Buffer) to ‘200’ USD per Hour. This is a $200 cost for each hour that an Entity if held in the Input Buffer
of this Server.
Configure Costing of Vehicle
Select the Vehicle object and set the Parent Cost Center property to a new Cost Center named ‘TransportationCosts’.
Expand the Transport Costs property category and set the Cost Per Rider property to ‘10’ USD. This cost will138
be / 1277
Expand the Transport Costs property category and set the Cost Per Rider property to ‘10’ USD. This cost will be
incurred each time a rider is loaded onto the Vehicle.
Configure Costing of Failed Inspections
Create a new Cost Center element by going into the Definitions window/Elements panel. Click on the Cost Center
element icon in the ribbon. Name this new Cost Center, ’CostOfFailedParts’.
Select the Path that connects the Server InspectionA to the Sink called FailedInspection. Double-click on the Add-On
Process trigger property Entered to create a new Add-On process.
Place an Assign Step in the process and set the State Variable Name to ‘CostOfFailedParts.Cost’ and the New
Value to ‘CostOfFailedParts.Cost + 150’. Therefore, each time an Entity enters this path and therefore executes
this process, $150 will be added to the Cost Center CostOfFailedParts. This is an example of how to assign cost
manually within process logic.
Configure Costing of Production:
Production cost is comprised of costs incurred by Painting and Inspecting, so this Cost Center is a roll up of those two Cost
Centers.
Create a new Cost Center element by going into the Definitions window/Elements panel. Click on the Cost Center
element icon in the ribbon. Name this new Cost Center ‘ProductionCost’.
Select ‘InspectionCostCenter’ and ‘PaintCostCenter’ and change their Parent Cost Center to ‘ProductionCost’.
Configure Cost on the Entity:
Place a ModelEntity object into the Facility window. Expand the Financials property category and set the Initial Cost
Rate property to '100' USD per Hour. This is the cost per hour for this Entity.
Explanation of Results
Set the Ending Type of the model to ’10 hours’, on the Run tab of the ribbon menu. Run the model until the end. Click
on the Results Tab to view the Pivot Grid.
If you view the Model object type category, you will see the breakdown of costs into each of the 4 cost centers;
CostOfFailedParts, InspectionCostCenter, PaintCostCenter, TransportationCosts. You will also see a grand total of
costs at the Model object level.
To see details of the CostOfFailedParts cost, find the results for the Path2 (or the name of the Path where the Add On
Process is located which assigns the cost). Note the Total Number Entered in the Throughput category. It is 235.
Multiply this by the cost for entering that path ($150), you get the total of $35,250, which is the total cost of the
CostOfFailedParts cost center.
To see the details of the InspectionCostCenter, find the results for the InspectionA Server.
You’ll first notice costs in the Input Buffer station of this object. This comes from the cost on the Entity object.
The cost of the Entity, when it is located at this Server’s InputBuffer, is rolled up into the InspectionCostCenter.
Note the Average Number in Station (.0479) and multiply this by the Cost Rate on the Entity object ($100) and
also by the total simulation time (10 hrs). This is a total of $47.8816, which is shown in the Total Cost of this
InputBuffer.
Also notice that there are costs for the Processing station of this Server. This cost comes from the cost on the
Entity object. The cost of the Entity, when it is located at this Server’s processing station, is rolled up into the
InspectionCostCenter. Note the Average Number in Station for processing (.2619) and multiply this by the Cost
Rate on the entity object ($100) and also by the total simulation time (10 hrs) and this gives $261.9343, which is
shown in the Total Cost of this processing station.
To see the details of the PaintCostCenter, find the results for the Paint Server. We had put a $1,000 value in the
Capital Cost for this object and this is shown in the Capital Cost Data Item of this object.
We also put $200 USD per Hour in the Holding Cost for the Input Buffer of this object. The cost of the Entity
also needs to be included, which is $100 USD. Note the Average Number in Station is .0270. Multiply $300
times .0270 and then by the 10 simulation hours and you get the total cost of this Input Buffer station, $80.8547.
There is also cost in the Processing Station, which is the cost of the Entity at this object. Note the Average
Number in Station is .2777. Multiply that by 10 simulation hours and $100 entity cost and you get the $277.7135
shown in the total for this station.
To see the details of the TransportationCosts, see the Vehicle object type results. There are two costs being rolled into
this cost center.
The first is the Transport Cost that we defined, which is $100 for every rider. Note the Number Entered in the
Throughput category of the RideStation is 555. Multiply this by $100 and you get a total of $5550.00.
The other cost if the cost of the Entity. Note the Average Number In Station of this RideStation is .04622.
Multiply this by $100 ( Entity cost) and by the 10 simulation hours and you get 46.2. Once added to $5550, the
139 / 1277
Multiply this by $100 ( Entity cost) and by the 10 simulation hours and you get 46.2. Once added to $5550, the
total cost of $5596.25 (shown in the results) is reached.
140 / 1277
Simio Reference Guide
FindAMinimumStateValue - SimBit
Problem:
I have 3 servers and want to keep track of the total processing time allocated to server (including entity at the server and
those en route) with a state variable. I want to then find the minimum value to the various servers to even out the load to
each throughout the simulation.
Categories:
Add-On Process Logic, Decision Logic -- Processing, Discrete States, Entity Characteristics
Key Concepts:
Add-On Process, Assign Step, Data Table, Find Step, SetNode Step, State Variable, Status Label
Assumptions:
We assume that the method for allocating entities to the various servers is based on the smallest processing time sent to
any given server. Each entity will be assigned a processing time when it is created.
Technical Approach:
Use a state on the entity to assign the entity processing time upon its creation. Use a state variable (vector) that stores the
total processing time for each given server based on the entity at the server and those en route to the server. Use the Find
step to determine which of the three servers has had the least amount of processing time allocated to it. The first value
within the state variable will refer to the first server, Server1, and so on. We will also store the input node for each of the
three servers within a table, so that we can use the SetNode step to set the appropriate destination after the Find step.
Details for Building the Model:
Adding the ModelEntity ProcessingTime
Within the Navigation window, click on the ModelEntity and go to the Definitions tab, States panel.
Add a real state variable named ProcessingTime, which will be referred to as ModelEntity.ProcessingTime in the
model.
Within the Navigation window, click on the Model and go to the Facility window.
Add a Source, three Servers and a Sink to the Facility window.
Connect the Source to each of the three Servers and each Server to the Sink with Paths.
Within the Definitions window, States panel, add an integer type variable named ‘Index’. This will be used within the
Find step itself. This variable will remain as Dimension Type of ‘Scalar’.
Add a real state variable named ‘ServerProcessingTime’. Change the Dimension Type to ‘Vector’ and the Rows to ‘3’.
These values are then referenced ServerProcessingTime[1], ServerProcessingTime[2] and ServerProcessingTime[3].
After the Find step, from the ‘Found’ exit, place an Assign step and a SetNode step. Within the Assign step, set the
State Variable Name to ‘ServerProcessingTime’ and the Row to ‘Index’. Input the New Value as
‘ServerProcessingTime[ Index] + ModelEntity.ProcessingTime’. Remember that the value ‘Index’ will be either 1, 2 or 3
(starting to ending index) based on the search type and expression specified. Therefore, with this Assign step, we are
increasing the value of whichever minimum variable was found by the entity’s processing time that was assigned in
the Source.
Within the SetNode, we will be leaving the Destination Type as ‘Specific’ and now need to determine how to specify
the Node Name for the corresponding server to where we’d like the entity to move.
Because the variable ‘Index’ will return a value between 1-3, we will set up a data table that will have corresponding
input nodes for the three Servers. We’ll then index into the table within the SetNode step. To do this, go to the Data
window, Tables panel and add a Data Table named ‘Table1’. Add an Object Reference type column of type Node.
Change the Name of the column to ‘WhichServer’. Input the three input nodes for the servers, such as Input@Server1,
Input@Server2 and Input@Server3. We can then reference the correct row by the variable ‘Index’.
Go back to the Processes window and within the SetNode step, set the Node Name to ‘Table1[ Index].WhichServer’.
This will set the entity destination to the appropriate server. Because the Entity Destination Type on the
Output@Source1 node is ‘Continue’, the entity will use its node destination to know where to go next.
Within each of the three servers, change the Processing Time property to ‘ModelEntity.ProcessingTime’ to use the
value that was assigned to each individual entity.
Within the Before Exiting section of the State Assignments of each server, we will decrease the state variable vector
for the particular server. Set the State Variable Name to ‘ServerProcessingTime’. For Server1, the Row would be ‘1’, for
Server 2, the Row would be ‘2’ and so on. The New Value should be ‘ServerProcessingTime[1] –
ModelEntity.ProcessingTime’ (for Server1, with the value in brackets reflecting the server number). This will then
decrease the state variable after the entity is processed.
Enhancements:
Add a Status Label next to each of the Servers that references the state variable vector for each (such as
ServerProcessingTime[1], etc.). This way, you can see that the incoming entity is sent to the one with the minimum value of
that vector. Additionally, on the DefaultEntity placed in the Facility window, attach a status label that shows the
ModelEntity.ProcessingTime value as it moves through the system.
142 / 1277
Simio Reference Guide
FlowConcepts - SimBit
This SimBit project includes eight models that demonstrate the use of the Simio Flow Library. Models included in this
SimBit:
1.SimpleFlow – Demonstrates flow from a FlowSource object, through a FlowConnector object, to a FlowSink object.
2.FillingEmptyingTank – Demonstrates filling and emptying a tank object.
3.TransferringFromOneTankToAnother – Demonstrates transferring from one tank object to another.
4.MergedFlow – Demonstrates merging two different entity flows.
5.SplitFlow – Demonstrates splitting a single entity flow into two entity flows.
6.CreateDiscreteEntitiesBasedOnFlow – Demonstrates the use of monitors and events to create discrete entities
when a tank reaches a certain flow level.
7. SimpleFiller – Demonstrates the use of the ContainerEntity and Filler objects to illustrate a filling operation of
combining discrete containers with continuous flow.
8. SimpleEmptier – Demonstrates the use of the Emptier object to illustrate full container entities with multiple
products emptying into multiple flow streams based on their product type to flow sink objects.
Model 1: SimpleFlow
Problem:
I want to create an entity flow from a FlowSource object, through a FlowConnector , to a FlowSink object. In addition, I
want to monitor the flow volume and stop the flow at 5 cubic meters of total volume.
Categories:
Flow Library
Key Concepts:
FlowSource, FlowSink, FlowConnector
Assumptions:
Flow rate and stopping condition are in units of cubic meters.
Technical Approach:
Create entity flow using a FlowSource and send it directly to the FlowSink through a FlowConnector. Terminate the flow
using the Maximum Volume stopping condition on the FlowSource.
Details for Building the Model:
Simple System Setup:
Place a FlowSource and FlowSink from the Flow Library in the Facility window.
Connect the source and sink using a FlowConnector.
Set the Maximum Volume property of the FlowSource object to ‘5’ cubic meters.
Place a Status Label and set its Expression property to
‘[email protected]’.
Place a Status Label and set its Expression property to ‘[email protected]’.
Place a ModelEntity from the Project Library into the model and change the color to whatever color you’d like the
flow to be.
Model 2: FillingEmptyingTank
Problem:
I want to fill a tank until the tank reaches the high mark. Once reaching the high mark, the tank should empty until it
reaches the low mark, at which point it should repeat the fill-empty cycle.
Categories:
143 / 1277
Flow Library, Add-On Process Logic
Key Concepts:
FlowSource, FlowSink, Tank, FlowConnector, Assign Step
Assumptions:
Flow is in units of cubic meters.
Technical Approach:
When the tank reaches the high point, stop the flow from the source and start the flow out of the tank. When the tank
reaches the low point, start the flow from the source and stop the flow out of the tank.
Details for Building the Model:
Simple System Setup
Place a FlowSource, at Tank, and a FlowSink from the Flow Library in the Facility window.
Connect the FlowSource to the Tank input and the Tank output to the FlowSink.
Set the Initial Volume Capacity of the Tank object to ‘10’ cubic meters.
Set the Low Mark, Mid Mark, and High Mark properties of the Tank object to ‘2’, ‘5’, and ‘8’ cubic meters, respectively.
Create an add-on process for the Above High Mark property of the tank. This process should use two Assign steps to
assign ‘[email protected]’ to ‘False’ (shutting off the flow though the output node of the
FlowSource) and ‘[email protected]’ to ‘True’ (enabling the flow out of the tank).
Create an add-on process for the Below Low Mark property of the tank. This process should also use Assign steps to
assign ‘[email protected]’ to ‘True’ (enabling the flow though the output node of the
FlowSource) and ‘[email protected]’ to’ False’ (shutting off the flow out of the tank).
Add the Status Labels displaying the volume in the Tank and the maximum flow rate and flow enabled state of the
output FlowNodes of the FlowSource and Tank objects. Keep in mind that ‘False’ is a value of 0, while ‘True’ is a value
of 1 within the enabled state labels.
Model 3: TransferringFromOneTankToAnother
Problem:
I would like to fill a tank until it reaches its high point. Once this happens, I’d like to transfer the contents into another tank
at a much higher rate. When the second tank reaches its high point, empty it.
Categories:
Flow Library, Add-On Process Logic
Key Concepts:
FlowSource, FlowSink, FlowConnector, Tank, Regulator, Assign Step
Assumptions:
Flow is in units of cubic meters and flow rates are in units of cubic meters per hour.
Technical Approach:
Add up two tanks and set the flow rates for the output node of the first tank and the input to the second tank to be higher
than the input to the first tank (and the output from the source). Control the flow between the tanks and to the sink using
the add-on processes for the tank levels.
Details for Building the Model:
Simple System Setup
Place a FlowSource, two Tanks, and a FlowSink from the Flow Library in the Facility window.
Connect the FlowSource to one of the Tank inputs, that Tank’s output to the other Tank’s input, and the second Tank’s
output to the FlowSink (all using FlowConnectors).
Set the Initial Volume Capacity for both Tank objects to ‘10’ cubic meters and set the first tank’s low medium and high
marks to ‘1’, ‘5’, and ‘9’ cubic meters, respectively. Set the second tank’s low, medium, and high marks to ‘0’, ‘5’, and ‘8’
cubic meters, respectively.
144 / 1277
Set the Initial Maximum Flow rate parameters for the Output@Tank1 and the Input@Tank2 to be ‘1500’ cubic meters
per hour.
Set the Initial Maximum Flow rate parameters for the Output@Tank2 and the Input@FlowSink1 to be ‘200’ cubic
meters per hour.
Set the Above High Mark add-on process for Tank1 to enable flow to Tank2 by assigning the
‘[email protected]’ to ‘True’ and set the Below Low Mark add-on process to disable the flow by
setting the same property to ‘False’.
Set the Above High Mark add-on process for Tank2 to enable flow to the sink by assigning the
‘[email protected]’ to ‘True’ and set the Below Low Mark add-on process to disable the flow by
setting the same property to ‘False’.
Add status labels for the current volume in the tanks.
Place 3 ModelEntity objects in the Facility window and change the color of each to be different. Within the output
flow nodes of the tanks, change the Initial Output Entity Type to be ‘ModelEntity2’ and ‘ModelEntity3’, respectively, to
show different flow colors on all the three connectors.
Model 4: MergedFlow
Problem:
I want to merge two flows into a single flow.
Categories:
Flow Library
Key Concepts:
FlowSource, FlowSink, FlowConnector, FlowNode
Assumptions:
All entity types may merge together. Flow will be merged proportionally based on the inflow rates from the various
sources.
Technical Approach:
Create two separate entity flows and merge them into a single flow at a FlowNode.
Details for Building the Model:
Simple System Setup
Place two FlowSource objects and a FlowSink object in the Facility window.
Place a FlowNode between the two FlowSource objects and the FlowSink object.
Connect each FlowSource object to the FlowNode using FlowConnectors.
Connect the FlowConnector to the FlowSink.
Set the Initial Maximum Flow Rate properties for FlowNode1 and the Input@FlowSink1 to be ‘200’ cubic meters per
hour.
Set the Flow Control Mode for FlowNode1 to be ‘Merge Flow’.
Place three ModelEntity instances in the Facility window and specify that each of the two FlowSources use a different
entity type by setting the Entity Type property.
Set the Initial Output Entity Type property for FlowNode1 to be the third entity type.
Add status labels for the flow volumes ( FlowNode.FlowRegulator.CurrentVolumeFlowOut).
Model 5: SplitFlow
Problem:
I want to split a single flow into two flows and use the flow connector link weights to determine the proportion of flow set
to each link.
Categories:
Flow Library
Key Concepts:
145 / 1277
FlowSource, FlowSink, FlowConnector, FlowNode
Assumptions:
The link weights of the outgoing FlowConnectors to the FlowSinks will be used to proportionally allocate flow in each
direction.
Technical Approach:
Use the Split Flow option on the FlowNode to allocate flow proportionally to a number of FlowSink objects.
Details for Building the Model:
Simple System Setup
Place a FlowSource object and two FlowSink objects in the Facility window.
Place a FlowNode between the FlowSource and the two FlowSink objects.
Connect the FlowSouce to the FlowNode and connect the FlowNode to the two FlowSink objects using
FlowConnectors.
Set the Flow Control Mode property for FlowNode1 to ‘Split Flow’ and change the Split Allocation Rule to
‘Proportional Based On Link Weights’.
Set the Selection Weight properties for FlowConnector2 and FlowConnector3 to ‘.65’ and ‘.35’, respectively.
Create status labels for the flow rates using the Expression: ‘Math.If( TimeNow > .05,
FlowConnector2.CurrentVolumeFlowOut /TimeNow, "N/A")’.
Model 6: CreateDiscreteEntitiesBasedOnFlow
Problem:
I want to create a discrete entity based on the amount of flow coming out of a tank. This model is an enhancement of the
FillingEmptyingTank model in this project.
Categories:
Flow Library, Add-On Process Logic
Key Concepts:
FlowSource, FlowSink, FlowConnector, Tank, Monitor
Assumptions:
A discrete entity is created for every 1 cubic meter of volume transferred out of the tank.
Technical Approach:
A monitor is used to detect changes in the volume transferred out of the tank. The monitor crossing value is changed every
time a cubic meter is transferred, so that the crossing value is increased each time a discrete entity is created. The Source
for discrete entities is based on an event triggered by the monitor to generate the entities at the appropriate times.
Details for Building the Model:
Simple System Setup
Place a FlowSource, at Tank, and a FlowSink from the Flow Library in the Facility window.
Connect the FlowSource to the Tank input and the Tank output to the FlowSink.
Set the Tank properties similar to that of the Tank in the FillingEmptyingTank model (described above).
Add the Tank1_AboveHighMark and Tank1_BelowLowMark add-on processes like the FillingEmptyingTank model.
Add a Source and Sink from the Standard Library to the Facility window. Place an additional ModelEntity in the
window as well and name it ‘ModelEntity2’.
Connect the Source1 to the Sink1 with a Conveyor. Change the Initial Desired Speed to ‘3’ and the Units to ‘Meters
per Minute’.
Within the Definitions window, Elements panel, add a Monitor element with the Name ‘TransferMonitor’. This will
monitor the tank based on the current volume flow out of the tank.
146 / 1277
Change the Monitor Type to CrossingStateChange. The State Variable Name that we will be monitoring is based on
the function ‘[email protected]’. Change the Initial Threshold Value to ‘1’. This
monitor will automatically cause an event when the tanks output volume crosses the threshold in the positive
direction. You’ll see that we will be also changing the threshold value within the process.
Within the Processes window, add a new process. The Triggering Event for the process will be the
‘TransferMonitor.Event’. Within this process, add an Assign step, where the State Variable Name is
‘TransferMonitor.CurrentThresholdValue’ and the New Value is ‘Math.ceiling( TransferMonitor.CurrentThresholdValue)
+ 0.999999’. This will increase the threshold of the monitor from its initial value of 1 (at the start of the simulation) by
1 each time a discrete entity is generated. This will cause the monitor to be fired for every volume out change of 1
cubic meter. Use 0.999999 instead of 1 to make sure the entity is created before the lower mark process is triggered.
Within the Source in the Facility window, change the Entity Type to ‘ModelEntity2’, the Arrival Mode to ‘On Event’ and
the Triggering Event Name to ‘TransferMonitor.Event’. Therefore, a discrete entity will only be generated when the
TransferMonitor.Event is fired.
Model 7: SimpleFiller
Problem:
I want to have liquid volume arrive to a filling operation and fill containers until they are full.
Categories:
Flow Library
Key Concepts:
ContainerEntity, Filler, FlowSource, FlowConnector
Assumptions:
Flow rate is in units of cubic meters and will fill containers until they are full.
Technical Approach:
Create entity flow using a FlowSource and send it directly to the Filler through a FlowConnector. Create ContainerEntities
using a Source that move into the Filler to be filled with liquid volume.
Details for Building the Model:
Simple System Setup
Place a FlowSource and Filler from the Flow Library in the Facility window and connect them using a FlowConnector.
Place a ContainerEntity in the Facility window from the Flow Library as well.
From the Standard Library, place a Source and connect the Source with the ContainerInput node of the Filler using a
Path.
Place a Sink to the right of the Filler and connect the output from the Filler with the Sink with a Path.
Within the Source, change the Entity Type to ‘ContainerEntity1’ to create container type entities instead of model
entities.
Model 8: SimpleEmptier
Problem:
I want to have full containers of a mixed liquid (2 product types) that I’d like to empty and send to their respective
locations.
Categories:
Flow Library
Key Concepts:
ContainerEntity, Emptier, FlowSource, FlowConnector, Processing Count Based
Assumptions:
Flow rate is in units of cubic meters and product will flow from the emptier based on product type.
Technical Approach:
Full container entities are created using a Source and sent directly to the Emptier. Two flow streams exit the FlowNode of
the Emptier to multiple FlowSinks. The Flow Control Mode of the Emptier’s output FlowNode is Single Flow ( No Splitting)
such that the product is only split based on the Selection Weights of the flow connectors.
147 / 1277
Details for Building the Model:
Simple System Setup
Place a Source and a Sink from the Standard Library in the Facility window.
Place an Emptier and two FlowSink objects from the Flow Library in the Facility window. Connect the Source to the
Emptier and connect the ContainerOutput of the Emptier to the Sink using Paths.
Connect the FlowOutput of the Emptier to each of the FlowSinks using FlowConnectors.
Place a ContainerEntity in the Facility window from the Flow Library, as well as two ModelEntity objects from the
Project Library.
ModelEntity and ContainerEntity Setup
Change the Name of one of the ModelEntity objects to ‘Red’ and the other to ‘Green’. Change the Red entity color
triangle to the color red using the Symbols ribbon.
Edit the ContainerEntity object Initial Contents by adding two rows to the repeating property editor. First, the Entity
Type should be ‘Green’ with a Quantity of ‘.1’. The second initial content should be of Entity Type ‘Red’ with a Quantity
of ‘.1’. Given that the Initial Volume Capacity is the default value of ‘0.2’, this will fill the container when the entity is
first created.
Within the Source, change the Entity Type for arriving to be ‘ContainerEntity1’.
Emptier Configuration
Within the Emptier, we will also define Reliability Logic, such that the Emptier fails every x ContainerEntities that it
processes. Change the Failure Type to ‘Processing Count Based’, with the Count Between Failures as ‘20’ and the Time
to Repair as ‘Random.Uniform(.5,1) and Units as ‘Minutes’.
On the FlowOutput node of the Emptier, specify the Initial Maximum Flow Rate of ‘60’ (default Units of ‘Cubic Meters
per Hour’). In the Output Flow Control section, change the Flow Control Mode to ‘Single Flow ( No Splitting)’ so that
the flow will not be automatically split by volume between the two flow connectors. We’d like the flow out to be
based only on product. This will then be done ‘By Link Weight’ as the Outbound Link Rule.
Click on the FlowConnector to FlowSink1 and specify the Selection Weight as ‘Is.Red’. If this expression evaluates to
‘True’ or a value of ‘1’, then the product can flow through this connector. On the second FlowConnector to FlowSink2,
change the Selection Weight to ‘Is.Green’. Therefore, when the product is emptied from the containers at the
Combiner, the Red product will flow to FlowSink1, while the Green product will flow to FlowSink2.
148 / 1277
Simio Reference Guide
HierarchyWithTables - SimBit
Problem:
I have a model that references data from tables and I would like to place this model inside of another model. Therefore, I
would like to have a “submodel” reference data in a table.
Categories:
Building New Objects / Hierarchy, Data Tables
Key Concepts:
Add-On Process, BasicNode, Contents, Data Table, Expression Property, Expression Property, ExternalNode, Foreign Key,
Key column, Numeric Property, Numeric Property, On Entered, Processing, Queue, Repeating Group Property, Resource,
Search Step, Server, SetRow Step, String Property, Submodel, Token, TransferNode, Externally Visible, Bind To External
Output Node, Bind To External Input Node
Technical Approach:
The model is the placed into another model is a SimBit named “SearchTableUponEnteringObject”. That model contains
three Servers in parallel. An entity travels to one of the three Servers, seizes a certain number of Resources, delays for a
certain amount of time and then releases the Resources. The number of Resources and the delay duration are different for
each Server. This information is stored in a table. To find the appropriate row in the table, the token must search the table
and find the row that contains the information for that particular Server. The search uses the ID of the Server object to find
the appropriate row in the table.
In Simio, all tables exist at the top level, e.g. in the main model. Any “outside” data that is referenced inside an object or
submodel must be passed into the submodel via properties defined on that submodel. The mechanism for passing in sets
of data like found in Tables is to define a Repeat Group property. This Repeat Group is then used to store the information
from the top level model. A Search step in the submodel can be used to search the Repeat Group property to find the
appropriate row of information.
Details for Building the Model:
Update the Submodel
Facility window
Delete the Source object and replace it with a Basic Node and connect this to the first Transfer Node with a
connector. The Basic Node is the entry point into this model. We no longer need a Source object because entities will
be created in the top level model and enter this submodel through the new Basic Node.
Delete the Sink object.
Definitions window
Create a new Repeating Group property from the Properties panel by clicking the ‘Repeat Group’ icon in the ribbon.
Name this property ‘Data’. Type ‘Custom Properties’ into the Category Name property of this Data property so this
new property is in its own category, for easier reading.
Ensure that this new property is selected/highlighted in the window and then selecting ‘Expression property’ from the
Standard Property drop down in the ribbon. This will create a new Expression Property within the Repeat Group
property. Name this Expression property ‘Hours’.
Click back onto the Data Repeat Group property in the window and select Object from the Object Reference
property drop down to create an Object Reference property within the Repeat Group. Name this ‘ServerName’.
Add a final property to the Repeat Group and this property should be an Integer Property, found under the Standard
Property drop down. Name this property ‘NumberOfResources’.
Now, using the Search feature on the Project Home tab, find all the references to the ServerData table and change
these references to the new “Data” repeat group instead. You’ll often need to right click on a property name, select
‘Set Referenced Property’ and then select Data from the list of properties that appear.
The Data Table named ServerData is no longer needed so this can be deleted.
Create an External View
By Default, all the objects in the Facility window are set to be Externally Visible, which means that they will be part of
the External View of this object. If you have placed any status labels or floor labels, you might consider not149having
/ 1277
the External View of this object. If you have placed any status labels or floor labels, you might consider not having
these be part of the External View. To remove them from the External View, right click on the object in the Facility
window and select Externally Visible, so that it is no longer highlighted. Similarly, consider not having the static
Resource object be visible in the External View. Right click on this object and select Externally Visible.
To create the entry point into this model, you will need to create an External Node. Select the Basic Node at the
beginning of this model and right click. Select Bind To New External Input Node. Set the name to ‘Input’.
Similarly, select the Transfer Node at the end of this model and right click. Select Bind To New External Output Node.
Set the name to ‘Output’. This creates an exit point for entities to travel out of this model.
Rename the model by right clicking on the object within the Navigation window in the top right of the Simio
interface. Select Rename from the right click drop down menu and name the model ‘SearchTable’.
Create the Main, Top Level Model
Create a new Model, either within the same project or in another project. If you create a new model in another project,
you’ll need to load this submodel into the project by using the “Load Library” icon on the Project Home tab.
Facility window
Place a Source and a Sink and place two instances of the submodel in parallel between the Source and the Sink.
Connect the Source and the Sink to both submodel instances with Paths. Change the Interarrival Time of the Source
to ‘Random.Exponential(3)’.
Data window
Create two new Data Tables by clicking ‘Add Data Table’ from the ribbon. Name one table ‘ServerData’ and the
other table ‘ServerNames’.
In ServerData, add three columns; a String Property column named “Name”, an Integer Property column named
“NumberOfResources” and an Expression Property column named “Hours”.
Click on the Name column and select ‘Set Column as Key’ from the ribbon
Place the following data into the Table:
Server1,3,.1
Server2,2,.05
Server3,1,.02
In ServerNames, add two columns; an Object Reference column named “ServerNames”, and a Foreign Key column
named ServerName (click Foreign Key from ribbon). Set the Table Key property of the Foreign Key column to
'ServerData.Name'.
Place the following data into the Table:
Server1, SearchTable1.Server1
Server2, SearchTable1.Server2
Server3, SearchTable1.Server3
Server1, SearchTable2.Server1
Server2, SearchTable2.Server2
Server3, SearchTable2.Server3
Facility window
Back in the Facility window, click on one of the instances of SearchTable and find the new Data property. Open the
Repeat Group by clicking of the ellipse on the far right and hit Add when the new window pops up.
Right click on Hours and set this to ‘ServerData.Hours’.
Type in ‘ServerData.NumberOfResources’ into the NumberOfResources property.
Right click on ServerName and set this to ‘ServerNames.ServerNames’.
After closing the Repeat Group editor window, right click onto the Data property, select ‘Set Referenced
Property’ and select ‘ServerNames’. This is telling the Data property to look to the ServerNames table.
Repeat the above steps for the second instance of the submodel.
See Also:
Open the SimBit named “SearchTableUponEnteringObject.spfx” to see details of how that model was built.
150 / 1277
Simio Reference Guide
HourlyStatistic - SimBit
Problem:
I want to know the average number of Entities in a Server’s Input Buffer per hour of the simulation.
Categories:
Add-On Process Logic, Buffering, Building New Objects / Hierarchy, Custom Statistics
Key Concepts:
Add-On Process, Hourly Statistic, TallyStatistic, Tally Step, Subclass, Custom Object, Timer, MyServer
Assumptions:
We are only concerned with Hourly Statistics.
Technical Approach:
We will create a timer that will fire every hour and trigger a process to record the average value for that particular hour.
Details for Building the Model:
Simple System Setup
Place a Source, a Server, and a Sink in the Facility Window.
Connect the Source to the Server, and the Server to the Sink with Paths.
Creating the States and Elements
In the Elements panel of the Definition tab, add a TallyStatistic and a Timer.
Name the TallyStatistic ‘HourlyAverage’ and the Timer ‘HourlyTimer’.
Keep the defaults for TallyStatistic.
Change the Time Offset to ‘1 hour’ in the Timer.
In the States panel of the Definitions tab, add two Real States.
Rename the states to ‘AverageAtBeginning’ and ‘TimeAtBeginning’.
Creating the Assignment Process
In the Processes tab, click ‘Create Process’ to add a new process to the model.
Rename this Process CalculateHourlyAve.
Set the Triggering Event to ‘HourlyTimer.Event’.
Place a Tally Step in the process.
Set the Tally Statistic Name to ‘HourlyAverage’.
Leave the Value Type as ‘Expression’ and set the Value to
‘( Server1.InputBuffer.Contents.AverageNumberWaiting * Run.TimeNow - AverageAtBeginning *
TimeAtBeginning)/( HourlyTimer.TimeInterval)’.
Server1.InputBuffer.Contents.AverageNumberWaiting returns the Average Number Waiting for the entire run, if you
multiply by Run.TimeNow you will get the total number of Entities that had to wait in the Input Buffer for the entire
run. Next we then subtract AverageAtBeginning (which we save each time) multiplied by the TimeAtBeginning to get
the total number of Entities that had to wait in the Input Buffer BEFORE this interval started. By subtracting the total
number waiting before this interval from the total number waiting, you get the total number waiting DURING this
interval. Finally, to get the Average over that interval, we divide the Number Waiting during the interval by the
TimeInterval of the timer (which in this case is 1 hour).
Place an Assign Step in the process.
Assign the State Variable Name ‘AverageAtBeginning’ the New Value of
‘Server1.InputBuffer.Contents.AverageNumberWaiting’.
Add another assignment that assigns ‘TimeAtBeginning’ the New Value of ‘Run.TimeNow’.
As seen in the previous Tally Step, these values will be used to determine the “old” number waiting for the entire run
that will be subtracted from the “new” number waiting to get the number waiting for that interval.
151 / 1277
Embellishments:
This methodology is easy to implement when dealing with a small number of servers, but could become quite tedious
when trying to implement on a large scale – a separate TallyStatistic and AverageAtBeginning State would be needed for
each Server.
To avoid having to do all of these manual assignments, we can move all of this logic (the Timer, Tally, States, and Process)
into a sub-classed Server. Everything is essentially the same except instead of Tallying/Assigning
‘Server1.InputBuffer.Contents.AverageNumberWaiting’ we only need to use the expression
‘InputBuffer.Contents.AverageNumberWaiting’ because the process is referring to its Parent Object.
With all of the logic contained inside the MyServer, you just have to place the object in the Facility window and each
MyServer will calculate the Average Number Waiting itself. This is demonstrated within the UsingCustomServer found in
the Navigation window.
Also, the technique of Subtracting the old Total from the current Total Divided by a Time Interval will work for any length
interval – it does not have to be 1 hour. That is why we divide by ‘HourlyInterval.TimeInterval’.
152 / 1277
Simio Reference Guide
ImportExportTables - SimBit
Problem:
I would like to import data from a .csv file into a data table in Simio.
Categories:
Data Tables
Key Concepts:
Before Creating Entities, Connector, Data Table, Export Table, Expression Property, Import Data, Numeric Property,
Random.Discrete(), Server, Source, Table Row Referencing
Assumptions:
This example model is a simple source, server, sink model and the server gets its processing time by reading the data in this
imported table.
Technical Approach:
It is recommended that before you import a table that you create an empty table that has the appropriate properties
(columns) and then export this table to a .csv file. After filling this table with data, the user can import this table into the
empty table that was created in Simio.
Details for Building the Model:
Simple System Setup
Place a Source, Server and a Sink the Facility Window. Connect the Source to the Server and the Server to the Sink
with Paths.
Assigning Table Row Number
Within the Source object, within the Table Row Referencing / Before Creating Entities section, enter a Table Name of
‘Table1’ and the Row Number equal to ‘Random.Discrete(1, .25, 2, .5, 3, .75, 4, 1)’. This will assign the token a row
number from a discrete distribution to assign the values 1, 2, 3 and 4 with equal probability.
Adding a Data Table and Exporting Blank Table
In the Data Window, select the Tables panel and click on the Add Data Table icon from the ribbon. The main part of
the window will appear blank, but you will see a new tab created with the name of the new table ( Table1, by default).
To add a column to this table, select Expression from the Standard Property drop down. Change the Unit Type to
‘Time’ and the Default Units to ‘Minutes’ so that our processing times may be specified in minutes.
Click on the Export icon from the Table tab in the ribbon. Save the .csv file to the computer.
Importing Data to a Data Table
Open the .csv file in an editor, such as Excel, and add the appropriate data, keeping the column name untouched.
To import the data, the spreadsheet must first be ‘bound’ to the model. Click on the ‘Create Binding’ button in the
Content ribbon, select CSV file then select the appropriate File Name. Then, select Binding Options from the Content
ribbon and select Manual to manually import the data into the table. The Import button will then be available to
import the data from the spreadsheet into Simio.
Using the Data Table in the Server
In the Facility Window, set the Processing Time property of the Server to read ‘Table1.ExpressionProperty1’ (assuming
you kept the default name, ExpressionProperty1, of the expression property in the table).
153 / 1277
Simio Reference Guide
InfectionPropagationUsingContinuousAndFlow
- SimBit
Problem:
I want to know how to model a continuous system or how to model System Dynamics. I want to know how to model a
system of infection propagation.
Categories:
Continuous Systems, Flow Library, Functions, Level States
Key Concepts:
Assign Step, Decide Step, Delay Step, FlowConnector, Functions, Level State Variable, OnRun Initialized Process, System
Dynamics, Tank
Technical Approach:
There are two models in this project, demonstrating two different ways to model this system. The model named,
“UsingFlowObjects” demonstrates how to model the system with objects from the standard flow library. There are four
Tank objects, connected together with Flow Connectors. The contents in the first tank represent the total population, which
is susceptible. The second tank represents the number of people exposed to the infection. The flow nodes in between these
tanks are set to allow flow at the rate of RateExposed, which is a function that calculates the rate of exposure. The third
tank represents the number of people who are infectious. The flow nodes in between Exposed and Infectious allow flow at
the rate of RateInfectious, which is a function that calculates the rate of infection. The fourth tank represents the number of
people who have recovered. The flow nodes between Infectious and Recovered allow flow at the rate of RateRecovered,
which is a function that calculates the rate in which people recover.
The model named, “UsingLevelStates” demonstrates how to model the system using Level State variables and one simple
process. Instead of having Tank objects represent the number of people in each stage, this model uses Level State variables
(continuous variables). There are four of these variables, representing Susceptible, Exposed, Infectious and Recovered. A
process is called upon Run Initialized it assigns a new value to these level state variables and then delays for one hour, after
which the rates of the variables are updated again. Similar to the model using Flow Objects, this model also uses Functions
to calculate rates.
Details for Building the Model – UsingFlowObjects:
Adding Properties and Functions
Go to the Definitions window and into the Properties panel. Create the following new Numeric properties, which will
allow the user to input information into the model regarding the population size and infection rates.
TotalPopulation – set the Default Value to ‘10000’, Unit Type to ‘Volume / Cubic Meters’.
Infectifity – set Default Value to ‘6’.
ContactRateInfectious – set Default Value to ‘1.25’.
AverageIncubationTime – set Default Value to ‘10’ and Unit Type to ‘Time / Hours’.
AverageIllnessDuration – set Default Value to ‘15’ and Unit Type to ‘Time / Hours’.
Click onto the Functions panel. Create three new functions.
RateExposed –set the Expression to ‘Infectious.FlowContainer.Contents.Weight * ContactRateInfectious *
Infectifity * Susceptible.FlowContainer.Contents.Weight / TotalPopulation’. Set the Return Type to ‘Number’ and
the Unit Type to ‘VolumeFlowRate’.
RateInfectious – set the Expression to ‘Exposed.FlowContainer.Contents.Weight / AverageIncubationTime’. Set
the Return Type to ‘Number’ and the Unit Type to ‘VolumeFlowRate’.
RateRecovered – set the Expression set to ‘Infectious.FlowContainer.Contents.Weight / AverageIllnessDuration’.
Set the Return Type to ‘Number’ and the Unit Type to ‘VolumeFlowRate’.
Adding Tanks to the Facility Window
In the Facility window, place four Tank objects from the Flow Library into the Facility window. Rename Tank1 to
‘Susceptible’, Tank2 to ‘Exposed’, Tank3 to ‘Infectious’ and Tank4 to ‘Recovered’. Connect Susceptible to Exposed with
a Flow Connector, Exposed to Infectious together with a Flow Connector and Infectious and Recovered together with
a Flow Connector. 154 / 1277
a Flow Connector.
Select all four Tanks by holding down CTRL and clicking onto each Tank. Enter ‘TotalPopulation’ into the Initial
Volume Capacity property of the tanks.
Click onto the Susceptible Tank and click into the Initial Contents property to indicate that there are initial contents in
this Tank. In the Repeating Property Editor, click Add to add a new row. The Entity Type property is ‘DefaultEntity’
and the Quantity property should be set to ‘TotalPopulation – 1’.
Click onto the Infectious Tank and click into the Initial Contents property to indicate that there are initial contents in
this Tank. The Entity Type property is ‘DefaultEntity’ and the Quantity property should be set to ‘1’.
Holding down the CTRL key, select the Output@Susceptible and the Input@Exposed and set the Maximum Flow
Rate Equation to ‘RateExposed’. This rate will be dynamically updated every hour because the Update Interval on
these nodes is set to ‘1’ hour, by default.
Holding down the CTRL key, select the Output@Exposed and the Input@Infectious and set the Maximum Flow Rate
Equation to ‘RateInfectious’. This rate will be dynamically updated every hour because the Update Interval on these
nodes is set to ‘1’ hour, by default.
Holding down the CTRL key, select the Output@Infectious and the Input@Recovered and set the Maximum Flow
Rate Equation to ‘RateRecovered’. This rate will be dynamically updated every hour because the Update Interval on
these nodes is set to ‘1’ hour, by default.
Details for Building the Model – UsingLevelStates:
Adding States, Properties and Functions
Go to the Definitions window and into the States panel. Create the following new Level State Variables by clicking
onto Level in the ribbon.
Pop_Susceptible
Pop_Exposed
Pop_Infectious
Pop_Recovered
Click into the Properties panel within the Definitions window. Create the following new Numeric properties, which
will allow the user to input information into the model regarding the population size and infection rates.
TotalPopulation – set the Default Value to ‘10000’.
Infectifity – set the Default Value to ‘6’.
ContactRateInfectious – set the Default Value to ‘1.25’.
AverageIncubationTime – set the Default Value to ‘10’ and the Unit Type to ‘Time / Hours’.
AverageIllnessDuration – set the Default Value to ‘15’ and the Unit Type to ‘Time / Hours’.
Click onto the Functions panel. Create three new functions.
RateExposed – set the Expression to ‘Pop_Infectious * ContactRateInfectious * Infectifity * Pop_Susceptible /
TotalPopulation’. Set the Return Type to ‘Number’.
RateInfectious – set the Expression to ‘Pop_Exposed / AverageIncubationTime’ and the Return Type to
‘Number’.
RateRecovered – set the Expression to ‘Pop_Infectious / AverageIllnessDuration’ and the Return Type to
‘Number’.
Adding Steps in Processes Window
In the Processes window, open the Select Process drop down from the ribbon and select OnRunInitialized. This will
create a new process that is triggered at the beginning of the run.
Place an Assign Step into this process. This Assign step will have two assignments.
Set State Variable Name to ‘Pop_Susceptible’ and New Value to ‘TotalPopulation – 1’.
Add another assignment in this step by opening the Repeat Group for Assignments ( More) and set State
Variable Name to ‘Pop_Infectious’ and New Value to ‘1.
Place another Assign Step in this process. This Assign step will have four assignments.
Open the Repeat Group for Assignments ( More) and set State Variable Name to ‘Pop_Susceptible.Rate’ and
New Value to ‘-RateExposed’.
Click Add to add another assignment. Set State Variable Name to ‘Pop_Exposed.Rate’ and New Value to
‘RateExposed-RateInfectious’.
Click Add to add another assignment. Set State Variable Name to ‘Pop_Infectious.Rate’ and New Value to
‘RateInfectious-RateRecovered’.
Click Add to add another assignment. Set State Variable Name to ‘Pop_Recovered.Rate’ and New Value to
‘RateRecovered’.
155 / 1277
Place a Delay step after the second Assign Step and set the Delay Time to ‘1’ (hour). Drag the segment leaving the
Decide Step so that it connects to the beginning of the second Assign step. This will tell the process logic to delay
for one hour and then update the Assignments in the second Assign step. It will therefore update the assignments
every hour.
156 / 1277
Simio Reference Guide
InitializeObjectPropertiesFromATable - SimBit
Problem:
I have objects in my model that should get their initial property values from information in a Data Table.
Categories:
Data Tables
Key Concepts:
Auto-Set Table Row Reference, Data Table, Set Referenced Property
Technical Approach:
There are two Servers in this model and each Server will get some initial property values from a Data Table. The Data
Table contains two rows; one for each Server that exists in the model. The Table contains four properties (columns): an
object instance property which contains the name of each Server, an expression property which contains the Processing
Time of each Server, another expression property which contains the Capital Cost of each Server, and another object
instance property that contains the name of a Worker object that this Server should seize during processing. In order for
each Server to know which row to look at in the Table, the first object instance property (column) that contains the name of
the Server, must have its Auto-set Table Row Reference property set to ‘True’. This tells Simio that the object contained in
this column will automatically have a row reference set to this table and therefore we can reference the data contained in
this table in the properties of each Server instance in the model.
Details for Building the Model:
Simple System Setup
Place a Source and Sink into the Facility window. Place two Server objects, in parallel and connect the Source to both
Servers with Paths and connect each Server to the Sink with paths.
Place four Basic Nodes in the center of the model so that they form a diamond shape. BasicNode1 is right below
Server1, BasicNode2 is right above Server2, BasicNode3 is at the left point of the diamond and BasicNode4 is on the
left point of the diamond. Connect these nodes together with Paths so the Worker can travel from node to node in a
circular pattern.
Place two Worker objects into the Facility window. Set the Initial Node property of Worker1 to ‘BasicNode3’ and its
Idle Action property to ‘GoToHome’. Set the Initial Node property of Worker2 to ‘BasicNode4’ and its Idle Action
property to ‘GoToHome’.
Create the Data Table
Go to the Data Window and click Add Data Table to create a new Table.
From the Object Reference drop down in the ribbon, select Object to create a new column. Rename this
column ‘ServerName’.
From the Standard Property drop down in the ribbon, select Expression to create a new column. Rename this
column ‘ProcessingTime’. In the Properties of this new column, set the Unit Type property to ‘Time’ and the
Default Units property to ‘Minutes’.
From the Standard Property drop down in the ribbon, select Expression to create a new column. Rename this
column ‘Capital Cost’.
From the Object Reference drop down in the ribbon, select Object to create a new column. Rename this
column ‘Worker’.
Fill in the following data into the new Table:
Row 1: Server Name = ‘Server1’, ProcessingTime = ‘Random.Triangular(.3, .4, .6)’, CapitalCost = ‘2000’, Worker
= ‘Worker1’.
Row 2: Server Name = ‘Server2’, ProcessingTime = ‘.5’, CapitalCost = ‘1000’, Worker = ‘Worker2’.
Click onto the first column, ServerName, so that you see its properties appear in the property window on the lower
right side of the interface. Under the Advanced Options property category, set the Auto-set Table Row Reference
property to ‘True’.
Configure Server to Read Table
157 / 1277
Go to the Facility window and select Server1. Expand the Financials Property category and right click into the Capital
Cost property of this Server and select ‘Set Referenced Property’. From the options available, find Table1.CapitalCost
and select this so that the Capital Cost property now gets its value from Table1.CapitalCost.
Right click into the Processing Time property of this Server and select ‘Set Referenced Property’. From the options
available, find Table1.ProcessingTime and select this so that the Processing Time property now gets its value from
Table1.ProcessingTime.
Expand the Secondary Resources property category and expand the Resource for Processing sub-category. Right
click into the Object Name property and select ‘Set Referenced Property’. From the options available, find
Table1.Worker and select this so that the Object Name property now gets its value from Table1.Worker.
Set the Request Move property to ‘To Node’ and set the Destination Node property to ‘BasicNode1’. Visually seeing
the Worker move to the Server will help validate that the Server is getting the correct information from the Table.
Exactly repeat the above four bullet points for Server2, except for the Destination Node property, set this to
‘BasicNode2’ instead so that the Worker moves to the node above Server2.
Embellishments:
Notice that this SimBit contains floor labels that display the property values of each Server to visually validate to the user
that each Server is getting the correct information from the Data Table.
158 / 1277
Simio Reference Guide
InterruptibleOperator - SimBit
Problem:
I would like to model a system with 2 Servers and a movable operator that needs to be present at the server for processing
and be able to interrupt the processing of a lower priority job for a higher priority job.
Categories:
Decision Logic -- Processing
Key Concepts:
Add-On Process, Allow Passing, Assign Step, BasicNode, Bidirectional Path, Current Symbol Index, Filter Expression, Initial
Desired Speed, Interrupt Step, Interrupted Process Action, Largest Value First, ModelEntity, Processing, After Processing,
Path, Priority, Ranking Expression, Ranking Rule, Release Step, Request Move, ResumeDelay, Seize Step, Server, Time
Offset, Value Expression, Vehicle
Assumptions:
The interrupted part is allowed to remain in the processing station until the operator returns. Upon processing for the
second time the job only requires the remaining processing time, no set-up or tear-down time.
Technical Approach:
Upon the arrival of a high priority job, the server will attempt to seize the operator. If the operator is already seized, the job
that is being processed is interrupted. The server releases the operator which is then seized by the high priority job’s server.
After the operator is finished processing all the high priority jobs, it is then released and re-seized by the low priority job.
Once the operator returns, the only processing time remaining on that entity is the remaining processing time that was not
executed before the interruption.
Details for Building the Model:
Simple System Setup
Drag in 2 Sources, 2 Servers, and 2 Sinks to the Facility View. Arrange them in two Source-Server-Sink sets and place
a Basic Node next to each Server.
Connect the Source-Server-Sink sets with unidirectional Paths and change Allow Passing to 'False' in the Paths going
from Source to Server. Connect the Basic Nodes with a bidirectional Path. Click on BasicNode1 and attach
ParkingStation.Contents queue, because this will be the Initial Node.
Defining a Vehicle
Drag a standard Vehicle into the Facility window. Change its Desired Speed to ‘0.1 Meters per Second’. Set the Initial
Node to ‘BasicNode1'. Set its Ranking Rule to ‘Largest Value First’, with a Ranking Expression of ‘ModelEntity.Priority’.
Altering Entities
Drag two ModelEntities into the Facility window and name them ‘HighPriorityJob’ and ‘StandardJob’.
Change the color of HighPriorityJob to red and set its Initial Priority to ‘3.0’.
Add an additional symbol to StandardJob and change the second symbol’s color to yellow. Set their Desired Speed
properties to ‘0.2 Meters per Second’.
Defining Fixed Objects
Change the Entity Type property in Source2 to ‘StandardJob’. Set the Interarrival Time to ‘Random.Exponential(30)’
minutes and Entities Per Arrival to ‘2’.
Change the Time Offset, as well as the Interarrival Time, in Source1 to ‘Random.Exponential(50)’.
Both Server1 and Server2 should have their Initial Capacity property set to ‘Infinity’, Processing Time property set to
‘Random.Triangular(10,20,30)’, and Input Buffer Capacity property set to ‘1’.
Adding Process Logic for Seizing and Releasing the Vehicle
In Server2, create a process in the Processing add-on process trigger. Add a Seize step in this process. Have this step
seize Vehicle1. Click on the “…” button to open the Repeating Property Editor. Click the Add button and choose
‘Vehicle1’ for the Object Name. Change Request Move from ‘None’ to ‘ToNode’ and the Destination Node to
159 / 1277
‘Vehicle1’ for the Object Name. Change Request Move from ‘None’ to ‘ToNode’ and the Destination Node to
‘BasicNode2’.
Also in Server2, create a process in the After Processing add-on process trigger. Add a Release Step that releases
Vehicle1. Click the “…” button next to Releases in the Property window to open the Repeating Property Editor. Click
the Add button and select ‘Vehicle1’ from the drop down list next to Object Name.
Similarly, you can do the exact same thing for Server1 (or you can re-use the process named Server2_AfterProcessing
and eliminate this step, if preferred). Add a Release Step that releases Vehicle1. Click the “…” button next to Releases
in the Property window to open the Repeating Property Editor. Click the Add button and select ‘Vehicle1’ from the
drop down list next to Object Name.
Adding Process Logic for Interruption
To set the Interrupting logic, create a process in Server1’s Processing add-on process trigger. Place an Interrupt Step
to interrupt the activity taking place at the other server ( Server2). Select the Process Name to
‘Server2.OnEnteredProcessing’ from the drop down list. Change the Interrupted Process Action to ‘ResumeProcess’.
On the Original segment leaving the Interrupt step, place a Seize step that seizes Vehicle1. Open the Repeating
Property Editor in the Seizes property. In the Editor, select ‘Vehicle1’ from the drop down list next to Object Name.
Change the Request Move to ‘ToNode’ with Destination Node ‘BasicNode1’.
On the Interrupted segment leaving the Interrupt step, place an Assign step that changes the picture of the
interrupted entity. Set the State Variable Name to ‘ModelEntity.Picture’, the New Value to ‘1’.
Add an additional Assignment to increase the interrupted Entity’s priority by opening the Repeating Property Editor
of the Assign Step. Add a new Item with State Variable Name set to ‘ModelEntity.Priority’ and set its New Value to ‘2’.
This gives the interrupted entity higher priority than an uninterrupted StandardJob so that it can resume processing
on this particular job but still lower Priority than a HighPriorityJob so it can be interrupted if need be.
After the Assign on the interrupted segment, add a Release step and select Vehicle1 in the Repeating Property
Editor. This releases the vehicle from Server2 and allows it to be seized by a HighPriorityJob.
Place a Seize step, seize Vehicle1 in the Repeating Property Editor. Set Request Move to ‘ToNode’ with Destination
Node set to ‘BasicNode2’. This puts the interrupted server back in the vehicle’s queue list of objects that are trying to
seize it, so that as soon as it become free it will return to Server2 to complete processing.
Finally, add an Assign step changing the picture back to the original green color to signify processing has resumed.
To do this, set the State Variable Name to ‘ModelEntity.Picture’ with a New Value of ‘0’.
See Also:
InterruptingAcrossMultipleServers and InterruptingServerWithMultipleCapacity.
160 / 1277
Simio Reference Guide
InterruptingAcrossMultipleServers - SimBit
Problem:
I have multiple entities with different priorities and multiple servers. If all servers are busy, I want to be able to interrupt the
processing at a server processing a lower priority entity.
Categories:
Decision Logic -- Processing
Key Concepts:
Add-On Process, Allow Passing, BasicNode, Blocked Destination Rule, Candidate, Condition Based, Connector, Decide
Step, Entity, Entity Destination Type, Filter Expression, Interrupt Step, Largest Value First, Last Seized, On Creating Entities,
On Entered, OnEnteredProcessing, Path , Priority, Ranking Rule, Real State Variable, Release Order, Release Step,
ResourceState, Save Remaining Time, Select Available Only, Selection Rule, Smallest Value First, Source, Transfer Step,
TransferNode, Value Expression
Assumptions:
All entities wait at one spot for an available server. All interrupted entities wait in the same FIFO queue.
Technical Approach:
All entities go to a single node with routing logic to select an available server. If all servers are busy and the entity that is
attempting to enter the server has a higher priority than at least 1 entity being processed, then the lower priority entity is
interrupted (with its remaining processing time saved) and routed back to the entry node.
Details for Building the Model:
Simple System Setup
Place 3 Sources, 3 Servers, 3 Entities, a Sink, a BasicNode and a TransferNode into the Facility Window. Position the
Sources so that they are aligned vertically and align the Servers similarly.
Rename the entities ‘LowPriority’, ‘MediumPriority’, and ‘HighPriority’.
Change the color of HighPriority to red and its Initial Priority to ‘3.0’. Change the color of MediumPriority to yellow
and its Initial Priority to ‘2.0’. Also, add an additional symbol and change its color to a slightly different shade of
yellow. For LowPriority, keep the Initial Priority at ‘1.0’ and the color green, but add an additional symbol and change
its color to a light green.
Rename the TransferNode 'Dispatch' and position it in between the Sources and the Servers. All Sources will be sent
here first and then to a Server.
Rename BasicNode1 ‘ReRoute’. Position this node above the set of Servers. This node will act as the exit point for the
interrupted jobs that have to be removed.
Draw paths going from the Sources to Dispatch (node), as well as from ReRoute to the Dispatch. Set the Allow
Passing property to ‘False’ for these paths to allow them to queue up at the Dispatch area.
Connect Dispatch to the Servers using Connectors and connect the Servers to the Sink with Paths.
Modifying Library Objects
Add a Discrete State to the ModelEntity called ‘ProcessingTime’. To do this, click on ModelEntity in the Navigation
window. Click on Definitions Tab, then States. Add a Discrete State, and then change the name to ‘ProcessingTime’.
Go back to the Navigation window and change to the Model for the following steps.
To select nodes and servers from a list, go to the Definitions tab and then to Lists panel. Add a Node List with name
of ‘ServerInputNodes’ with the nodes Input@Server1, Input@Server2, and Input@Server3.
Add an Object List and name it ‘ServerList’ with the objects Server1, Server2 and Server3.
Rename the Sources ‘LowPrioritySource’, ‘MediumPrioritySource’, and ‘HighPrioritySource’.
Modify the LowPriority Source so that it has an Entity Type of ‘LowPriorityJob’, Time Offset of
‘Random.Exponential(.5)’ and Interrarrival Time of ‘Random.Exponential(1)’.
Modify the MediumPrioritySource so that is has an Entity Type of ‘MediumPriorityJob’, Time Offset of
‘Random.Exponential(2)’, and Interrarrival Time of ‘Random.Exponential(2)’.
Modify the HighPrioritySource so that is has an Entity Type of ‘HighPriorityJob’, Time Offset of
‘Random.Exponential(3)’, and Interrarrival Time of ‘Random.Exponential(3)’.
Assigning Processing Time
Within the Processes window, create a New Process and name it ‘AssignProcessingTime’.
161 / 1277
Place an Assign step in the process and set the State Variable Name to ‘ModelEntity.ProcessingTime’, New Value is
‘Random.Triangular(.8,1.5,3)’ and Units is ‘Minutes’.
Enter this process name in the all three Sources’ Created Entities Add-On Process Trigger property.
Set all of the Servers’ Processing Time properties to ‘ModelEntity.ProcessingTime’. Also, change their Input Buffer
properties to ‘0’.
Dispatch Routing Logic
Dispatch needs to route jobs based on their priorities and only to servers with open processing stations. Change the
Ranking Rule to ‘Largest Value First’, the Entity Destination Type to ‘Select From List’, the Node List Name to
‘ServerInputNodes’ and the Blocked Destination Rule to ‘Select Available Only’.
Within the Dispatch node, double click on the Entered property of the Add-On Process Triggers to create the
Dispatch_Entered process.
Interruption Process Logic
Go to the Processes window and within the Dispatch_Entered process, follow the below steps.
Place a Decide step to determine if any Server is available. Change the Decide Type to ‘Condition Based’, and
Expression to
‘Server1.Capacity.Remaining==1||Server2.Capacity.Remaining==1||Server3.Capacity.Remaining==1||ModelEntity.Priority==1.5’.
If a Server is available, the Server*.Capacity.Remaining will return a value of 1 and the entity can be processed as
usual. Or, if the entity that entered the node has a Priority of 1.5, that means it’s a LowPriority Entity and should
interrupt anything.
From the False exit, add an Interrupt step and change the Process Name to ‘Server1.OnEnteredProcessing’, the
Selection Rule to ‘Smallest Value First’ and the Filter Expression to ‘Candidate.Entity.Priority < Entity.Priority’. Leave
the Value Expression as the default value ‘Candidate.Entity.Priority’.
In the Interrupt step, Advanced Options, add 2 more processes in Process Names ( More): including Process Name of
‘Server2.OnEnteredProcessing’ and Process Name of ‘Server3.OnEnteredProcessing’. Change the Save Remaining
Time property to ‘ModelEntity.ProcessingTime’.
On the Interrupted exit, place an Assign step and change the State Variable Name to ‘ModelEntity.Picture’, New Value
to ‘1’ and make another assignment under Assignments ( More) of State Variable Name called ‘ModelEntity.Priority’,
and New Value of ‘ModelEntity.Priority + .5’. This will make sure that if its an entity that has already been interrupted,
it keeps its priority the same (and doesn’t bump it up to the next level of entity priority).
Next, place a Release step and change the Object Type to 'FromList', Object List Name to ‘ServerList’ and Release
Order to ‘LastSeizedFirst’.
Lastly, add a Transfer step after the Assign step and change the From to ‘CurrentStation’, To to ‘Node’ and Node
Name to ‘Reroute’.
Embellishments:
In this model all interrupted entities wait on the same path with a FIFO selection method. This is because they are waiting
on the same path and only the first entity is being evaluated at the Transfer Node, all the other entities are still waiting to
arrive to the node. This means that if a LowPriorityJob is in front of a MediumPriorityJob, MediumPriorityJob would have
to wait for the LowPriorityJob to be processed before being considered. To correct this, add another path from ReRoute to
Dispatch with Allow Passing set to ‘False’. Change the Outbound Link Rule in the BasicNode to ‘By Link Weight’. Set the
Link Weight for one Path to ‘ModelEntity.Priority == 1.5’ and ‘ModelEntity.Priority == 2.5’ for the other. This will now allow
both types of entities to be present at the Node at the same time, correcting the selection logic.
See Also:
InterruptibleOperator and InterruptingServerWithMultipleCapacity.
162 / 1277
Simio Reference Guide
InterruptingServerWithMultipleCapacity -
SimBit
Problem:
I have a server with capacity of three and I would like a higher priority job to be able to interrupt the processing of one of
the lower priority jobs currently being processed, and move the interrupted job back into the input buffer to complete
processing later.
Categories:
Decision Logic -- Processing
Key Concepts:
Add-On Process, Assign Step, Before Exiting, Candidate, Capacity.Remaining, Decide Step, Entity, Filter Expression, From
Current Station, Interrupt Step, Largest Value First, On Entered, OnEnteredProcessing, Priority, Ranking Rule, Release Step,
Save Remaining Time, Selection Rule, Server, Smallest Value First, Source, State Assignments, Transfer Step, Value
Expression,Table Row Referencing
Assumptions:
All entities have the same Processing Time distribution and the remaining process time will be saved.
Technical Approach:
When the entity arrives to the Server, it looks at the server and sees if there is any remaining capacity. If not, the entity will
interrupt any entity with a lower priority than itself. If the arriving entity has the same or lower priority than the three entities
being processed it will enter the Input Buffer and wait for one of the entities to finish processing.
Details for Building the Model:
Simple System Setup
Drag in a Source, Server, and Sink. Connect them all with Connectors.
Drag in three Entity Instances and rename them ‘LowPriorityJob’, ‘MediumPriorityJob’, and’ HighPriorityJob’.
Change the color of HighPriorityJob to red and its Initial Priority to ‘3.0’, MediumPriorityJob to yellow and its Initial
Priority to ‘2.0’, and add an additional symbol to LowPriorityJob and change the additional symbol to a light green,
but leave its Initial Priority ‘1.0’.
Set Interarrival Time in Source1 to ‘Random.Exponential(.6)’ minutes.
Creating Multiple Entities from One Source
Add a Data Table in the Data tab and name it ‘JobMix’. Add a Real Property called ‘Percentage’ and an Entity Object
Reference Property called ‘EntityType’. Fill in the table so that it looks like:
Percentage----EntityType
70 -------------LowPriorityJob
30 -------------MediumPriorityJob
10 -------------HighPriorityJob
In Source1, set Entity Type to ‘JobMix.EntityType’.
Expand the Table Row Referencing->Before Creating Entities properties and set the Table Name to ‘JobMix’ and Row
Number to ‘JobMix.Percentage.RandomRow’.
Assigning Process Time to Entities
In the ModelEntity’s Definitions tab, add a Discrete State called ‘ProcessingTime’.
Then, within the model Facility window, in the Source, create a new process in the Created Entity add-on process
trigger and add an Assign step. In the step set State Variable Name to ‘ModelEntity.ProcessingTime’ and New Value
to ‘Random.Triangular(1,2,3)’.
Modifying Server1
163 / 1277
Drag Server1’s Input Buffer below and resize it so that it is approximately 4 servers long so that you can see the
activity.
Change the Server’s Initial Capacity to ‘3’.
Set the Ranking Rule to ‘Largest Value First’ with a Ranking Expression of ‘Entity.Priority’.
Change to Processing Time to ‘ModelEntity.ProcessingTime’.
Process Logic for Interrupting
On the Server, add an Add On Process Trigger to Entered to interrupt processing.
Place a Decide step to determine if the Server is Available. The Decide Type is ‘ConditionBased’ with the Expression
‘Server1.Capacity.Remaining > 0’. If this is True, interruption is not necessary and no further action is needed.
If it is False, it means that the Server is full and if the Entity has a higher Priority than any one entity on the Server
then we need to interrupt processing. So we place an Interrupt step on the False Branch with the following changes:
In General Options, change Process Name to ‘Server1.OnEnteredProcessing’, Selection Rule to ‘Smallest Value First’
( This interrupts the entity with the smallest priority), Value Expression to ‘Candidate.Entity.Priority’, and Filter
Expression to ‘Candidate.Entity.Priority < Entity.Priority’ ( Ensures that the entity the Server is considering interrupting
has a lower priority than the one that just entered the Server).
In Advanced Options, set Save Remaining Time to ‘ModelEntity.ProcessingTime’. The Server will now use remaining
processing time the next time it evaluates ModelEntity.ProcessingTime.
On the “Interrupted” branch, place an Assign step to change to picture of the interrupted entity. State Variable Name
is ‘ModelEntity.Picture’ and New Value is ‘1’. ( The “Original” branch is for the higher priority Entity so it will be
processed as usual, so therefore no steps are needed.)
After the Assign, place a Release step releasing Server1. Click on the “…” button and select ‘Server1’ from the Object
Name drop down list.
Then, place a Transfer step to transfer the entity back into the input buffer. Configure the Transfer Step so that From is
set to ‘CurrentStation’, To to ‘Station’, and Station Name to ‘Server1.InputBuffer’.
Enhancement:
Interrupted entities will not necessarily be processed ahead of other waiting entities. To make that happen:
After entities are interrupted, add an assignment to set ‘ModelEntity.Priority’ to ‘ModelEntity.Priority + 0.1’. This will
raise their priority to bring them to the front of the InputBuffer.
Modify the Filter Expression on the Interrupt step to read ‘( Candidate.Entity.Priority+.2) < Entity.Priority’. This will
prevent an interrupted entity from immediately interrupting another entity of the same nominal priority.
See Also:
InterruptibleOperator and InterruptingAcrossMultipleServers
164 / 1277
Simio Reference Guide
InputAnalysis - SimBit
Problem:
Because I am lacking enough real-world data for my model, I want to use Input Analysis and Response Sensitivity to
determine whether my models arrival rates or processing time have the biggest impact on the model responses ( Time In
System and Number In System).
Based on the limited number of real-world data inputs for Arrival Times and Processing Time in my model, I want to use
Input Analysis and Sample Size Error to determine which inputs have the biggest contribution to my output errors on the
model responses.
Categories:
Input Analysis
Key Concepts:
Input Parameters, Data, Analysis, Experiment, Response Sensitivity, Sample Size Error
Technical Approach:
There are two models in the project, each demonstrating a different aspect of Input Analysis. .Both models include a
simple 2 Source-Server-Sink logic to illustrate this input analysis features. Three Input Parameters are defined which will be
used to measure the effect of the changes in Arrival Rates and Processing Time on the Number in System and Time in
System.
In the first model, titled “ResponseSensitivity”, the input parameters include the distribution type, but no information on the
number of data samples for the data sets. In this model, the Response Sensitivity analysis within the experiment will be
used.
The second model, titled “SampleSizeError”, includes the same input parameters, but additional information regarding the
sample sizes for the distributions. It is assumed that each of the Input Parameter distributions have been derived based on
a sample size of 100. In this model, the Sample Size Error analysis within the experiment will be used.
Details for Building the Model - ResponseSensitivity:
Simple System Setup
Place two Sources, a Server and a Sink object in the Facility window. Connect each Source to the Server and the
Server to the Sink object using a Path.
Defining Input Parameters
In the Data window, select the Input Parameters panel button and add 3 Distribution parameters. Name them
‘Arrival1’, ‘Arrival2’, and ‘ProcessingTime’ respectively. For Arrival1, change the Distribution Type to ‘Exponential’ with
a Mean of ‘10’. Set the Unit Type to ‘Time’ and the Units to ‘Minutes’. Do the same for Arrival2 but change the Mean
to ‘12’.
For ProcessingTime, set the Distribution Type to ‘Triangular’ with a Minimum, Mode and Maximum set to ‘8’, ‘10’ and
‘12’ respectively. Change the Unit Type to ‘Time’ and change the Units to ‘Minutes’.
In the Facility window, on the Server object, change the Processing Time to ‘ProcessingTime’. On Source1 change the
Interarrival Time to ‘Arrival 1’. On Source2 change the Interarrival Time to ‘Arrival2’.
Defining the Experiment – ResponseSensitivity
In the Navigation window, right click on Model and select ‘New Experiment’.
In the Experiment window, click on the Design ribbon and select Add Response.
Name the Response ‘TimeInSystem’ and on this response add the Expression as
‘DefaultEntity.Population.TimeInSystem.Average’, change the Unit Type to ‘Time’ and the Display Units to ‘Minutes’.
Add another Response. Name this ‘NumberInSystem’. Change the Expression to
‘DefaultEntity.Population.NumberInSystem.Average’.
In the Experiment Properties window, change the Default Replications to ‘100’.
Analyzing the Results – ResponseSensitivity
165 / 1277
From the Experiment window, Design ribbon, select Run. Once the runs have completed, click on the Input Analysis
tab and then select Response Sensitivity on the panel.
A Tornado Chart with be displayed which will show each inputs sensitivity coefficient for each response. You can
select which response to view from the pull-down list in the upper left corner. Select TimeInSystem from the pull-
down list if it isn’t already displayed. What can be inferred here is that an increase in the ProcessingTime has the
most impact on the TimeInSystem of the entities.
Select NumberInSystem from the pull-down list and you can infer the same. However, for the NumberInSystem, there
is very little difference between an increase in ProcessingTime and a decrease in Arrival1. Click on the Bar Chart tab
at the bottom of this window. Here you can see the percentage of impact each input has on each response.
Details for Building the Model - SampleSizeError:
Simple System Setup
Place two Sources, a Server and a Sink object in the Facility window. Connect each Source to the Server and the
Server to the Sink object using a Path.
Defining Input Parameters
In the Data window, select the Input Parameters panel button and add 3 Distribution parameters. Name them
‘Arrival1’, ‘Arrival2’, and ‘ProcessingTime’ respectively. For Arrival1, change the Distribution Type to ‘Exponential’ with
a Mean of ‘10’. Set the Unit Type to ‘Time’ and the Units to ‘Minutes’. Change the Number of Data Samples to ‘100’
and set Include in Sample Size Error Analysis to ‘True’. Do the same for Arrival2 but change the Mean to ‘12’.
For ProcessingTime, set the Distribution Type to ‘Triangular’ with a Minimum, Mode and Maximum set to ‘8’, ‘10’ and
‘12’ respectively. Change the Unit Type to ‘Time’ and change the Units to ‘Minutes’. Change the Number of Data
Samples to ‘100’ and set Include in Sample Size Error Analysis to ‘True’.
In the Facility window, on the Server object, change the Processing Time to ‘ProcessingTime’. On Source1 change the
Interarrival Time to ‘Arrival 1’. On Source2 change the Interarrival Time to ‘Arrival2’.
Defining the Experiment – SampleSizeError
In the Navigation window, right click on Model and select ‘New Experiment’.
In the Experiment window, click on the Design tab and select Add Response.
Name the Response ‘TimeInSystem’ and on this response add the Expression as
‘DefaultEntity.PopulationTimeInSystem.Average’, change the Unit Type to ‘Time’ and the Display Units to ‘Minutes’.
Add another Response. Name this ‘NumberInSystem’. Change the Expression to
‘DefaultEntity.Population.NumberInSystem.Average’.
Change the Default Replications on this experiment to ‘100’.
Analyzing the Results – SampleSizeError
From the Experiment window, select the Design tab and select Run.
Once the runs have completed, select the Input Analysis tab and click on Sample Size Error panel button.
You must first click on Run Analysis button within the Sample Size Error ribbon. Once the runs have completed, a
chart will appear that will display the Contribution to Uncertainty for Scenario1. This shows which inputs have the
biggest contribution to the response. What can be inferred here is that Arrival1’s uncertainty has the biggest impact
on the TimeInSystem. The SMORE plot below the chart illustrates the standard confidence interval for the mean (in
tan) and the expanded half width due to input uncertainty in blue. As we can see from this graph we have more input
uncertainty than experimentation uncertainty in this example.
The second bar chart, Benefit of Additional Samples, shows the relative benefit of collecting additional data for each
input parameter. In many cases, such as in this example, the bar chart will appear similar to the relative Contribution
to Uncertainty bar chart. We would not expect this to be the case if the Number of Data Samples properties of the
Input Parameters were widely different.
166 / 1277
Simio Reference Guide
InventoryAndMaterials - SimBit
Problem:
My system consumes materials stored in inventories at different locations. I want my simulation model to show material
consumption from site-specific inventories.
Categories:
Supply
Key Concepts:
Bill of Materials, Inventory Element, Material Element, Task Sequence
Assumptions:
The processing at the Servers and Combiner will use Task Sequences to concurrently complete the defined tasks at the
object and consume the respective material from the identified inventory. All inventories are located at the object at which
the consumption takes place.
Technical Approach:
Two Sources independently feed unique entity types to two Servers respectively, where at the Servers, a Task Sequence is
used to facilitate material consumption. Each Server has two tasks, which occur simultaneously as indicated by the Sequence
Number. Both tasks consume a material which has an associated inventory located at the Server. The entities are then
combined via a Combiner where a task sequence is used to facilitate material consumption. The Combiner has one task
that consumes one material which has an associated inventory located at the object. Status Labels are placed in the Facility
window to show the QuantityInStock of each inventory and the aggregate (i.e. total) QuantityInStock of the materials, as
well as static text to show the initial QuantityInStock value for the materials.
Details for Building the Model:
Simple System Setup
Place two Sources, two Servers, one Combiner, and one Sink in the Facility window.
Place two ModelEntities in the Facility window.
Set one Source property Entity Type to the first ModelEntity, and the respective property on the other Source to the
second ModelEntity.
Connect the objects via Paths
Output@Source1 to Input@Server1; Output@Server1 to ParentInput@Combiner1
Output@Source2 to Input@Server2; Output@Server2 to MemberInput@Combiner1
Output@Combiner1 to Input@Sink1
Adjust the size of the ModelEntity which will eventually enter the Combiner at the parent node such that the other
entity can fit on the “parent” entity.
Select the “parent” entity and draw a BatchMembers queue (via the Draw Queue icon) on or near the “parent” entity;
entering 3D mode (via striking the ‘3’ key) and using the Shift key while moving the queue (with a click-drag motion)
will move the queue such that it can be placed on top of the model entity symbol.
Establishing Materials and Inventories
Using Elements, create materials and inventories that are related as indicated by the properties of the elements.
Create four Material elements and five Inventory elements within in the Definition tab, Element View.
Set each Material Location Based Inventory property to ‘True’.
Set the inventory properties as indicated by the table below.
167 / 1277
Creating Processing Tasks within the Servers and Combiner
Using Task Sequences, set up a task sequence for each object that requires materials for processing.
Select Server1 and set property Process Type under Process Logic to ‘Task Sequence’.
Select the repeat group symbol (small box in right of property field with “…”) in the Processing Tasks field to open
the task sequence editor.
Create two tasks via the Add button.
Keep all defaults for the tasks, except change Material Name and Inventory Site Type in the Materials
Requirements section such that the values for one task are ‘Material1’ and ‘ParentObject’, respectively and the
values for the other task are ‘Material2’ and ‘ParentObject’, respectively.
Select Server2 and repeat the process described for Server1, but instead, values for one task are ‘Material1’ and
‘ParentObject’ and the values for the other task are ‘Material3’ and ‘ParentObject’.
Select Combiner1 and add a task that consumes Material Name ‘Material4’ using Inventory Site Type ‘ParentObject’.
Creating Status Labels
Using the functions associated with Inventory and Material Elements, create status labels that reflect the MaterialName,
InventoryName, and QuantityInStock at each object where there is material stored. In addition, create status labels to show
the initial and current aggregate (i.e. total) QuantityInStock of each material.
Near Server1 in the Facility window, create a grid of Status Labels (2 by 3), as shown in the SimBit, and write the
following expressions in the respective Status Label Expression property as indicated in the table below, where the
first column resolves to the material name of the related inventory, the second column resolves to the inventory that
holds the specified material at the specified site, and the third column resolves to the QuantityInStock of the
specified inventory.
Add a Status Label with static text, like ‘Material QIS @ Server1’, above the Status Labels created in the
previous step for clarity.
Draw a rectangle (using Drawing ribbon) to place under the Status Labels to visually indicate the relatedness
of the Status Labels created in the previous steps.
Repeat the above steps for Server2 and Combiner1, using the appropriate expressions for each site-material pair.
Create a grid of Status Labels (4 by 2), as shown in the SimBit, and write the following expressions in the respective
Status Label Expression property as indicated in the table below, where the first column resolves to material name
and the second column resolves to the current aggregate (i.e. total) QuantityInStock of the specified material.
Add a Status Label with static text, like ‘Material Aggregate QIS’, above the Status Labels created in the
previous step for clarity.
Draw a rectangle (using Drawing ribbon) to place under the Status Labels to visually indicate the relatedness
of the Status Labels created in the previous steps.
Create a grid of Status Labels (4 by 2), as shown in the SimBit, and write the following expressions in the respective
Status Label Expression property as indicated in the table below, where the first column resolves to the material name
and the second column resolves to the static text. 168 / 1277
and the second column resolves to the static text.
Add a Status Label with static text, like ‘Material Initial QIS’, above the Status Labels created in the previous
step for clarity.
Draw a rectangle (using Drawing ribbon) to place under the Status Labels to visually indicate the relatedness
of the Status Labels created in the previous steps.
Notes:
This model is constrained by the available materials, which are required for processing. Because this model does not
include material replenishment (i.e. production), the initial QuantityInStock of the materials and inventories can be used to
identify the constraints. Each processing object (i.e. Server or Combiner) has a material constraint (e.g. Server1 is
constrained by Material2, which is entirely stored in Inventory3, with 40 units initially available). The constraint of the entire
model is the most rigorous material constraints of the processing objects (i.e. Combiner1 is the system constraint, where
Combiner1 is constrained by Material4, which is entirely stored in Inventory5, with 20 units initially available).
Embellishments:
This example shows material consumption from location-based inventory. Material and inventory are not restricted to
consumption, they can also be produced. Enhance the model by producing material when it’s below a specified level.
169 / 1277
Simio Reference Guide
InventoryReplenish - SimBit
This SimBit project includes three models that demonstrate the use of inventory replenishing policies for both 'Continuous’
and ‘Timer’ Review Period.
Models included in this SimBit:
1. MinMax – Demonstrates how to incorporate a reorder point (minimum value) and order-up-to-level (maximum)
replenishment policy. When the inventory falls to the reorder point, then inventory is replenished to the order-up-to-
level.
2. OrderUpTo – Demonstrates how to incorporate an order-up-to replenishment policy. When the inventory falls below
the order-up-to-level, then inventory is replenished to the order-up-to-level.
3. ReorderPointReorderQty – Demonstrates how to a reorder point and reorder quantity replenishment policy. When
the inventory falls to or below the reorder point, then inventory is replenished with the amount specified in the
reorder quantity.
Model 1: MinMax
Problem:
I have a system that has an inventory replenishment policy that reorders inventory once the inventory in stock reaches a
specific value, evaluated either continuously or on a timer.
Categories:
Add-On Process Logic, Materials
Key Concepts:
Add-On Process, Inventory Element, Material Element, MaterialOrderDetail, OnReplenishmentOrder, Produce Step,
QuantityProduced, Timer Element
Assumptions:
For a Continuous Review Period, inventory is replenished instantaneously.
Technical Approach:
There are two types of Review Period within Inventory Element logic. The inventory logic also includes an On-
Replenishment Order Process Add-on Process Logic that employs a Produce step.
Details for Building the Model:
Simple System Setup
Place a Source, Server, and Sink in the Facility window. Connect the Source to the Server and the Server to the Sink
with Paths. Rename the Source as BurgerSource, the Server as BurgerServer, and the Sink as BurgerSink. Place a
ModelEntity and set the name as Hamburger.
Set the Interarrival Time on BurgerSource to ‘Random.Exponential(2).
Set the Process Type on the BurgerServer to ‘Task Sequence’. Select the three little dots and Add a sequence. Adjust
the Processing Time to ‘Random.Triangular(1,2,3). Go to the Material Requirements dropdown and change the
Material Name to ‘HamburgersMaterial’ and the Inventory Site Type to ‘ParentObject’.
Place a second Source, second Server, and second Sink in the Facility window. Connect the Source to the Server and
the Server to the Sink with Paths. Rename the Source as HotdogSource, the Server as HotdogServer, and the Sink as
HotdogSink. Place a second ModelEntity and set the name as Hotdog.
Set the Interarrival Time on HotdogSource to ‘Random.Exponential(2). Change the Entity Type to ‘Hotdog’.
Set the Process Type on the HotdogServer to ‘Task Sequence’. Select the three little dots and Add a sequence. Adjust
the Processing Time to ‘Random.Triangular(1,2,3). Go to the Material Requirements dropdown and change the
Material Name to ‘HotdogsMaterial’ and the Inventory Site Type to ‘ParentObject’.
Creating Elements
Go to the Definitions window and add two Material Elements, one with the Name ‘HamburgersMaterial’ and the
other with the Name ‘HotdogsMaterial’. Change Location Based Inventory for both Material Elements to ‘True’. This
170 / 1277
other with the Name ‘HotdogsMaterial’. Change Location Based Inventory for both Material Elements to ‘True’. This
ensures Inventory Elements can be stored at separate and specific locations within the model.
Create a Timer Element and change the Name to ‘BurgerTimer’. Change the Time Interval to ’10' minutes.
Create an Inventory Element and change the Name to ‘HamburgersInventory’. Next, change the Material Name to
‘HamburgersMaterial’, this allows the Inventory Element to store the ‘HamburgersMaterial’ Material Element in it.
Then, change Site Object Name to ‘BurgerServer’, this ensures Simio stores the inventory in a physical location. Adjust
the Initial Quantity to ‘8’. Set the Review Period to ‘Timer’, this sets the frequency of the inventory review, which
determines whether a replenishment order is required. Set the Review Timer Name to ‘BurgerTimer’ to recall the
Timer Element created earlier. Adjust the Replenishment Policy to ‘Min/Max’. This type of replenishment policy orders
up to the Max when the inventory is less than or equal to the Min. Change the Reorder Point to ‘3’, when the
HamburgerInventory drops to 3 or less, then when the BurgerTimer goes off, a replenishment order will be placed.
Set the Order-Up-To-Level to ‘10’, this is the level that the HamburgerInventory is replenished to when a
replenishment order is placed. Lastly, double-click On Replenishment Order Process to create the process that
restocks the inventory level. In the Processes window, first place a Delay step with a Delay Time of ‘1’ minute to
signify the time to restock the Material. Then place a Produce step into your process. Set the Material Name to
‘HamburgersMaterial’, this specifies the material to be produced. Next, adjust the Inventory Site Type to
‘AssociatedObject’, this places the inventory in the BurgerServer. Lastly, change the Quantity to
‘Token.MaterialOrderDetail.Quantity’, this recalls the Max order-up-to value that was defined in the
HamburgerInventory and has the process order the corresponding amount.
Create a second Inventory Element and change the Name to ‘HotdogsInventory’. Then, change the Material Name to
‘HotdogsMaterial’ and the Site Object Name to ‘HotdogServer’. Set the Initial Quantity to ‘8’. Set the Review Period
to ‘Continuous’, this has the model constantly checking the inventory level. Adjust the Replenishment Policy to
‘Min/Max’ and set the Reorder Point to ‘3’ and the Order-Up-To-Level to ‘10’. This ensures as soon as the
HotdogsInventory reaches 3, it will immediately replenish. Lastly, double-click On Replenishment Order Process to
create the replenishment process. In the Process window, first place a Delay step with a Delay Time of ‘1’ minute to
signify the time to restock the Material. Then drag a Produce step into the newly created process. Set the Material
Name to ‘HotdogsMaterial’, the Inventory Site Type to ‘AssociatedObject’ and the Quantity to
‘Token.MaterialOrderDetail.Quantity’.
Enhancements (done within this model):
Create Status Labels to show the current inventory in each Server.
Create Status Plots to show the inventory level in each Server over time.
Model 2: OrderUpTo
Problem:
I have a system that has an inventory replenishment policy that reorders inventory to a specified level evaluated either
continuously or on a timer.
Categories:
Add-On Process Logic, Materials
Key Concepts:
Add-On Process, Inventory Element, Material Element, MaterialOrderDetail, OnReplenishmentOrder, Produce Step,
QuantityProduced, Timer Element
Assumptions:
For a Continuous Review Period, inventory is replenished instantaneously.
Technical Approach:
There are two types of Review Period within Inventory Element logic. The inventory logic also includes an On-
Replenishment Order Process Add-on Process Logic that employs a Produce step.
Details for Building the Model:
Simple System Setup
Click on the Folder icon in the Navigation window in the upper-right hand corner of your Simio window. Select the
MinMax model and press ‘Ctrl C’ on your keyboard to copy the model and then press ‘Ctrl V’ on your keyboard to
paste the model. Right click on the new model and rename it ‘OrderUpTo’.
Go into your OrderUpTo model and go to the Definitions window. Select HamburgersInventory and adjust the
Replenishment Policy to ‘Order-Up-To’. Repeat the same step for HotdogsInventory. These steps ensure that the
171 / 1277
Replenishment Policy to ‘Order-Up-To’. Repeat the same step for HotdogsInventory. These steps ensure that the
inventory levels are replenished to 10 regardless of what the current inventory level is, and the inventory is evaluated
on a 10-minute Timer for HamburgerInventory and continuously for HotdogInventory.
Model 3: ReorderPointReorderQty
Problem:
I have a system that has an inventory replenishment policy that reorders a specific amount of inventory once the current
inventory level reaches a certain level.
Categories:
Add-On Process Logic, Materials
Key Concepts:
Add-On Process, Inventory Element, Material Element, MaterialOrderDetail, OnReplenishmentOrder, Produce Step,
QuantityProduced, Timer Element
Assumptions:
For a Continuous Review Period, inventory is replenished instantaneously.
Technical Approach:
There are two types of Review Period within Inventory Element logic. The inventory logic also includes an On-
Replenishment Order Process Add-on Process Logic that employs a Produce step.
Details for Building the Model:
Simple System Setup
Click on the Folder icon in the Navigation window in the upper-right hand corner of your Simio window. Select the
MinMax model and press ‘Ctrl C’ on your keyboard to copy the model and then press ‘Ctrl V’ on your keyboard to
paste the model. Right click on the new model and rename it ‘ReorderPointReorderQty’.
Go into your OrderUpTo model and go to the Definitions window. Select HamburgersInventory and adjust the
Replenishment Policy to ‘Reorder Point/ Reorder Qty’. Repeat the same step for HotdogsInventory. These steps
ensure that the inventory levels are replenished by 10 when the current inventory level reaches 3, and the inventory is
evaluated on a 10-minute Timer for HamburgerInventory and continuously for HotdogInventory.
172 / 1277
Simio Reference Guide
KeepingWorkerReserved - SimBit
Problem:
I would like for the same vehicle or worker to perform both transport and processing tasks for a particular entity as it
moves through the system.
Categories:
Animation, Entity Characteristics, Decision Logic -- Processing, Worker
Key Concepts:
Connector, Keep Reserved If, Path, Ride On Transporter, Secondary Resources, Server, Sink, Source, Worker
Assumption:
The worker or vehicle can only have a ride capacity of ‘1’ to be reserved, otherwise a runtime warning will be issued.
Technical Approach:
The nurse (worker) will be used to transport entity from Source to first Server and then be used for processing at the Server.
Upon completion of processing, the same nurse (worker) will transport the entity to the next Server and again be used for
processing and transport to the Sink. The Keep Reserved If property within the TransferNode (for transport tasks) and
within the Server (for processing tasks) will be set to ‘True’ (or value of ‘1’).
Details for Building the Model:
Simple System Setup
Place a Source, two Servers and a Sink within the Facility window. Connect Source1 to Server1, Server1 to Server2
and Server2 to Sink with Paths. Connect the Sink back to the Source with a Path.
Within the Source1, change the Interarrival Time to ‘Random.Exponential(.3)’ minutes.
Connect the input node of each Server to the output node of the same Server with Connectors. This will allow the
Worker to travel both to/from the Servers.
Place a ModelEntity from the Project Library and rename it ‘Patient’.
Place a Worker in the Facility window and rename it ‘Nurse’. Change the Park While Busy property to ‘True’. Specify
the Initial Node (Home) location as Output@Source1 and the Idle Action to ‘Go To Home’ so that any idle workers
will return to the Source. Specify the Initial Number in System as ‘3’ so that there are 3 Nurses.
Using the Worker for Transport Tasks
Within the output nodes of the Source, Server1, and Server2, change the Ride On Transporter to ‘True’ and the
Transporter Name to ‘Nurse’. Within the Source1 and Server1 output nodes, specify the Keep Reserved If property as
‘True’. This will cause the Nurse, upon dropping off the entity at its destination location, to be ‘reserved’ so that it may
immediately be used then for processing at the server.
Using the Worker for Processing Tasks
Within the Server1 and Server2, change the Processing Time to ‘Random.Triangular(.2,.3,.4)’ minutes and the Input
Buffer capacity to ‘0’.
Within the Secondary Resources section of properties, specify the Object Name as ‘Nurse’. Specify the Keep Reserved
If property as ‘True’. This will cause the Nurse, upon completion of the processing task, to be ‘reserved’ so that it may
immediately be used then for transport to the next location.
Enhancement:
In this example, there are status label graphics attached to both the ModelEntity and Worker objects. Use the Entity.ID
function to return information specific to the entity (i.e, String.Format("P#{0}", Entity.ID )) or the Entity.Population.Index
function for information on the specific Worker ( String.Format("Nurse#{0}", Entity.Population.Index)).
173 / 1277
Send comments on this topic to Support
174 / 1277
Simio Reference Guide
KeepQueueTimeForLast10Entities - SimBit
Problem:
I want keep an updated value for the total queue time for the last ten (10) entities in a Server queue.
Categories:
Add-On Process Logic, Buffering, Custom Statistics, Entity Characteristics
Key Concepts:
Add-On Process, Before Processing, Create Step, Decide Step, Destroy Step, Entered, Insert Step, ModelEntity, Real State
Variable, Remove Step, Search Step, Status Label, Status Plot, Storage Element, Storage Queue
Assumption:
The total queue time of entities in the queue is only calculated once there are ten values accumulated. From then, the
calculation is done on the ten most recent entities in the queue. If the entity does not wait at all, a value of zero is recorded
and is included in the total.
Technical Approach:
When an entity enters the Server, its ModelEntity.TimeInQueue is set to the current simulation time. Once the entity has
been allocated the Server capacity, a copy of that entity is created that will be stored in a storage queue so that statistics
may be calculated. Once ten copy entities are in the storage, the queue is searched and time in queue time calculated. Each
time a new entity enters (after the first 10), the first entity is then removed from the storage and system.
Details for Building the Model:
Simple System Setup
Place a Source, a Server and a Sink from the Standard Library into the Facility window. Use Paths to connect the
Source to the Server and the Server to the Sink.
Adding a New State to ModelEntity
Within the Navigation window, click on ModelEntity. Within the ModelEntity Definitions window, click on the States
panel and add a new Real type State with the Name ‘TimeInQueue’. This will be referenced as
ModelEntity.TimeInQueue in the main model.
Go back to the Model and within the Facility window, place a ModelEntity from the Project Library. While this object
is highlighted, click on the Symbols ribbon and place a Status Label (attached) to the entity. This should
automatically say Attached To ‘DefaultEntity’ and then add the Expression ‘TimeInQueue’ This way, when each entity
instance moves through the system, you can see its time in queue calculation.
Define a New State and Element for the Model
Within the Definitions window, Elements panel, add a new Storage type element with the Name ‘Storage1’. This will
be used to ‘store’ all the 10 entity copies for waiting time calculations.
Also within the Definitions window, click on the States panel and add a new Real type state with the Name
‘TotalWait’.
Adding Logic to the Server To Calculate Queue Times
Within the Server, add a new process to the Entered Add-On Process Trigger named ‘Server1_Entered’. Within the
Processes window, add an Assign step to this process. The State Variable Name should be
‘ModelEntity.TimeInSystem’ and the New Value should be ‘Run.TimeNow’. This will “mark” the time that the entity
entered the queue for the server with the current simulation time which will be re-calculated later.
Go back to the Facility window and again within the Server, add a process name to Before Processing of
‘Server1_BeforeProcessing’. Within this process add the following steps:
Create step with Create Type of ‘CopyAssociatedObject’ and Object Instance Name of ‘DefaultEntity’.
From the Created exit of the Create step, add an Assign step. The State Variable Name should be
‘ModelEntity.TimeInQueue’ and the New Value should be ‘Run.TimeNow – ModelEntity.TimeInQueue’. This re-
calculates the state to be the actual waiting time.
175 / 1277
Next, add an Insert step with the Queue State Name of ‘Storage1.Queue’. Add a Decide step with the Decide
Type of ‘ConditionBased’ and an Expression of ‘Storage1.Queue.NumberWaiting == 10’. This will allow us to
only calculate the total wait time once there are ten entities in the queue.
Add a Search step to the process from the True exit of the Decide step. The Collection Type is ‘QueueState’, the
Queue State Name is ‘Storage1.Queue’ and the Search Expression is ‘Candidate.ModelEntity.TimeInQueue’. The
sum of this expression for the found items in the queue will be stored in the ReturnValue state of the original
executing token (i.e., Token.ReturnValue). The Limit in Advanced Options should be set to ‘10’ so that we get
the sum of all ten items in the queue.
From the Original exit of the Search step, add an Assign step that will assign the State Variable Name
'TotalWait' to the New Value ‘Token.ReturnValue’ (as discussed above).
Now that the calculation is done, we will remove the first entity in the queue so that when the next entity copy
enters, the calculations will be done correctly. This is done by using another Search step to get a pointer to the
correct entity. The Collection Type is ‘QueueState’ and the Queue State Name is ‘Storage1.Queue’. Note that the
Limit remains the default value of ‘1’, as we want a pointer to the first entity found in that queue.
From the Found exit of the Search step, add a Remove step with the Queue State Name of ‘Storage1.Queue’
and then from the Removed exit of the step, place a Destroy step, with Destroy Type of ‘AssociatedObject’
which will dispose of the copied entity/token that is no longer needed.
176 / 1277
Simio Reference Guide
LearningCurveWithLookup - SimBit
Problem:
I have a machine that increases its efficiency subject to a learning curve function.
Categories:
Lookup and Rate Tables
Key Concepts:
Lookup Table, Learning Curve, Linear Interpolation, Server, Status Plot
Assumptions:
The Server starts at 20% effective. After 12 hours the Server is 90% effective and after 18 hours the Server is 100% effective.
At 100% efficiency, the Server’s Processing Time is 10 minutes.
Technical Approach:
The Server’s learning curve will be represented by a Lookup Table. The Processing Time property of the Server will
reference this Lookup Table.
Details for Building the Model:
Simple System Setup
Add a Source, Server, and Sink to the Facility Window.
Using a Lookup Table
In the Data Window, select the Lookup Tables panel and add a Lookup Table with the Name property of
‘LearningCurve’. Add the following ( X, f( X )) pairs in the table: (0, 0.2), (12, 0.9), (18, 1). This lookup will be used within
the Processing Time of the Server as the efficiency.
Specifying the Server Processing Time
Update the Processing Time of the Server to ‘10/LearningCurve[ Run.TimeNow]’. Run.TimeNow is a function that
returns the current simulation time.
Embellishments:
To make this model more specific, try changing the Default entity’s Travel Logic to a desired speed, the Source’s Interarrival
Time rate or the Speed Limits on the Paths.
177 / 1277
Simio Reference Guide
LeveledArrivals - SimBit
Problem:
I would like to model a system where parts of different types arrive in a certain order.
Categories:
Arrival Logic, Data Tables
Key Concepts:
AvailableRowCount, Before Creating Entities, Before Exiting, Condition, Data Table, Dynamic Object Property, Entity Type,
Math.If(), Real State Variable, Source, State Assignments, Table Row Referencing
Assumption:
This is a simply Source, Server, Sink model that simply demonstrates controlling the order of arriving entities.
Technical Approach:
The Source reads information from a Data Table to determine which entity type to create for each arrival.
Details for Building the Model:
Simple System Setup
Place a Source, a Server and a Sink into the Facility window and connect them with Paths.
Place 4 ModelEntity objects into the Facility window and name them PartA, PartB, PartC and PartD.
Ensure that the color of each entity is different to help with model verification. To change the color of an entity,
select the entity and then select a color from the Color drop down in the Symbols ribbon and click back onto
the entity. It should then change colors.
Create Data Table
The Data Table will contain the order in which the different entities should arrive.
Go to the Data window and click the Add Data Table icon in the ribbon to add a new table.
Add a column that is an Entity property by selecting Entity from the Object Reference drop down in the ribbon. The
column can be renamed to Parts.
Fill the table with any orders you’d like – in this example, they arrive in the order A A A A B B B C C D and this
pattern repeats.
Add Table Referencing To Source object
Go to the Definitions window and create a new State variable. From within the Definitions window, click on the
States panel along the left side of the interface and then click on Real in the ribbon to create a new Discrete
State.Name it ‘RowNumber’. Change the Initial State Value to ‘1’.
From within the Facility window, click on the Source and expand the Table Row Referencing category. Next, expand
the Before Creating Entities category and set the Table Name to ‘Table1’ and the Row Number to ‘RowNumber’ (the
new State). This is telling the Source object to set a reference to the Data Table before an entity is created.
Set the Entity Type property of the Source to be Table1.Parts, where Table1 is the name of the Data Table and Parts is
the name of the column within the table. This will tell the Source to look in this table to determine which type of
entity to create.
Expand the State Assignments property category and open the Repeating Property editor of the Before Exiting
property (by clicking on the ellipse in the text box). Click Add to create a new Assignment and set State Variable
Name to ‘RowNumber’ and New Value to ‘Math.If( RowNumber == Table1.AvailableRowCount, 1, ( RowNumber + 1)
)’ This checks to see if the current value of RowNumber is equal to the total number of rows in the table (i.e. are we at
the last row?). If True, it sets the value of RowNumber back to 1 so it reads at the beginning of the table again. If
False, RowNumber is incremented by 1.
Embellishments:
Change the pattern of arrivals or try adding additional information into the Data Table and using it in the model.
178 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
179 / 1277
Simio Reference Guide
LogicBasedOnEntityProperty - SimBit
Problem:
I have entities that need to be sent to certain destinations based on their entity type.
Categories:
Decision Logic -- Paths
Key Concepts:
Numeric Property, Path, Selection Weight
Assumptions:
Each source only produces one type of entity. Source1 produces ModelEntity1 ( Green) and Source2 produces ModelEntity2
( Red).
Technical Approach:
An Integer Property will be added to the Default Entity. The Property will be set as unique for each entity instance. The
Property will then be referenced in order to make a decision.
Details for Building the Model:
Simple System Setup
Add two ModelEntity objects from the Project Library and two Sources, a Server, and two Sinks from the Standard
Library to the Facility Window.
Adding an Integer Property to the Default Entity
Highlight ModelEntity in the Navigation window (not the Model) and select the Definitions tab and Properties
panel.
Add a new integer property by clicking on Standard Property > Integer.
Change the Name property to ‘EntityType’. You can also change its default value here if you like.
Defining the Entity.Type
In the Facility Window of the Model, in the ModelEntity1 and ModelEntity2 instances, you will see the new EntityType
property you just created.
Set the EntityType Property to ‘1’ and ‘2’, respectively.
Creating the Logic Decision
To make the decision, you will take advantage of the Selection Weight property on the outgoing links from Server.
For one link, change the Selection Weight to the expression ‘ModelEntity.EntityType==1’. For the other, change the
Selection Weight to the expression ‘ModelEntity.EntityType==2’.
Discussion:
This procedure of using a Property works well for entities that will not change during the run (e.g. ModelEntity2 always has
a value of 2). If “EntityType” is something that could change during the run, you would instead make it a State ( Properties
cannot change during a run, but States can).
See Also:
LogicBasedOnEntityState.spf
180 / 1277
Simio Reference Guide
LogicBasedOnEntityState - SimBit
Problem:
I have entities that need to be sent to certain destinations based on their entity type.
Categories:
Decision Logic – Paths, EntityCharacteristics
Key Concepts:
Before Exiting, Path, Real State Variable, State Assignments
Assumptions:
Each source only produces one type of entity. Source 1 produces ModelEntity1 ( Green) and Source 2 produces
ModelEntity2 ( Red).
Technical Approach:
A Discrete State Variable will be added to the ModelEntity. An Add-On Process will be used to assign this State Variable a
value based on the entity type. The State will then be referenced in order to make a decision.
Details for Building the Model:
Simple System Setup
Add two ModelEntity objects from the Project Library and two Sources, a Server, and two Sinks from the Standard
Library to the Facility Window.
Change the name of the ModelEntity objects to ModelEntity1 and ModelEntity2 and make sure that Source1 has an
Entity Type of ‘ModelEntity1’, while Source2 has a an Entity Type of ‘ModelEntity2’.
Creating the Discrete State Variable
Highlight ModelEntity in the Navigation window (not the Model) and select the Definitions tab and States panel.
Add a Discrete State Variable to the ModelEntity with Name ‘EntityType’.
Assigning the State Variable
Within the State Assignments section of the Sources, enter the Before Exiting repeating editor and add the State
Variable Name of ‘ModelEntity.EntityType’ a New Value of ‘1.0’ (for Source1) and State Variable Name of
‘ModelEntity.EntityType’ a New Value of ‘2.0’ (for Source2).
Creating the Logic Decision
To make the decision, you will take advantage of the Selection Weight property on the outgoing links from the Server.
For one link, change the Selection Weight as the expression ‘ModelEntity.EntityType==1.0’. For the other, use the
expression ‘ModelEntity.EntityType==2.0’.
Discussion:
This procedure of using a State works well for items that could change during the run (e.g. perhaps EntityType needs to
change as it proceeds through processing). If the item will not change during the run, it would be easier and more efficient
to have EntityType be a Property instead of a State of the ModelEntity.
See Also:
LogicBasedOnEntityProperty.spf
181 / 1277
Simio Reference Guide
MassFlowProcessing - SimBit
Problem:
I have 2 stockpiles of material and I want material to flow from the first stockpile to the second at a variable rate. When the
flow rate changes, the second stockpile has to wait for the new flow rate to reach it before noticing a change in flow rate.
Categories:
Building New Objects / Hierarchy, Level States
Key Concepts:
Assign Step, Button, Conveyor, Create Step, Delay Step, EndTransfer Step, Event, Expression Property, External View,
ExternalNode, Fixed Class Object, Label, Level State Variable, OnInitialized Process, OnRun Initialized Process, Process
Triggering Event, Real State Variable, Size.Height, Size.Length, Size.Width, Station Element, Status Label, Status Label,
Timer Element, Transfer Step
Assumptions:
All flows go from the left to the right. Increased flow means more flow is leaving the first stockpile, meaning the flow rate
becomes more negative (and vice versa - a decrease in flow means less material is leaving and the flow becomes less
negative).
Technical Approach:
We will create a new object called a StockPile and represent the amount of material1 in each stock pile with a Level State
Variable. At various events, we will change the outgoing rate of the first stockpile object and pass the new rate to the
second stockpile object using an entity to represent the leading edge of the new flow of material.
Details for Building the Model:
Adding a State to ModelEntity
First we must create the State on the Entity that will carry the new Flow Rate information from one pile to the other.
To do this, click on ModelEntity in the Navigation Window and go to the States Panel in the Definitions Tab. Add a
Real State and name it ’FlowChange’.
Creating the StockPile Object Definition
In your Project Home Tab, click ‘New Model’ to add a Fixed Class Object to your Project Library. Rename this Object
‘StockPile’ by right-clicking on the new object and choosing ‘Rename’.
In the Elements Panel of the Definitions Tab, add a new Station Element by clicking the button in the Ribbon. Name
this station ‘Pile’.
Next, add an Expression Property from the Standard Property drop-down list in the Ribbon of the Properties Panel.
Name this property ‘InitialOreQuantity’. Change the Category Name to ‘Initial Ore Quantity’.
In the States Panel, add a Level State and Name it ‘OreQuantity’.
Defining the StockPile Object’s External View
In the External Panel of the Definitions tab, you can (optionally) give your StockPile a new Symbol by clicking on
Place Symbol button in the Ribbon. If you have an applicable 3D image you can choose Import Symbol. If not, you
can choose to Download a Symbol from Trimble Warehouse. You can find this particular symbol by searching for
“Trash Pile” – it will be the first option. You may want to resize your symbol in the symbol editor.
After placing the symbol, click on the External Node button in the Ribbon and bring in 2 External Nodes. Place one
on the left-hand side of the object and one on the right-hand side. Click on the left-hand node. Change its Node
Class Name to ‘BasicNode’, its Input Location Type to ‘Station’ and the Station Name to ‘Pile’. Rename this node
‘Input’.
For the right-hand node, change its Node Class Name to ‘TransferNode’ and change its Name to ‘Output’. Leave the
Input Location Type to ‘None’, since this will be the output node.
Defining the StockPile Object Processes
In the Processes window, select ‘OnRunInitialized’ from the Select Process drop-down to create a new
OnRunInitialized Process. Drag in an Assign Step from the list of Common Steps. Set the State Variable Name
182to/ 1277
OnRunInitialized Process. Drag in an Assign Step from the list of Common Steps. Set the State Variable Name to
‘OreQuantity’ and right-click on the New Value, click on Set Referenced Property and select the Property
‘InitialOreQuanity’ from the list. This Process will set the initial value for each stockpile’s ore level to match the user-
defined initial ore quantity property that will later be defined in the Model.
Next, click Create Process in the Ribbon. Set the Triggering Event in the Properties Window to ‘Pile.Entered’. This
process will then be activated when the pile is entered by an entity. Within the process, place an EndTransfer step to
signal that the Station has accepted the exchange. After that, place an Assign step that assigns the State Variable
Name of ‘OreQuanitity.Rate’ the Value of ‘–ModelEntity.FlowChange’. This allows the receiving StockPile to receive
at a rate equal (but opposite) to the rate that is flowing out of the first StockPile. Lastly, place a Destroy step to
destroy the entity carrying the information after it has been received.
Creating the Model
In your ‘Model’ Object, drag in 2 StockPile objects from the Project Library and connect them with a Conveyor. Set
the Conveyor’s Initial Desired Speed to ‘.05 Meters per Second’.
In the Elements Panel in the Definitions Tab, add a Timer Element and name it ‘RateChange’. Set its Time Interval to
‘Random.Exponential(10)’ and the Units to ‘Minutes’. This timer will represent random points in time that the flow
rate could change in a system. This could be the arrival of a new truck, another worker is on shift, etc.
In your Events Panel, add an Event and name it ‘Stop’.
Adding Model Processes Window
In the Process tab, click on the Create Process button in the ribbon and create a process with the Name
‘TimerRateChange’. Set the Triggering Event for this Process to ‘RateChange.Event’. First, place an Assign step into the
process. Set the State Variable Name to ‘StockPile1.OreQuantity.Rate’ and the New Value to
‘StockPile1.OreQuantity.Rate + Random.Uniform(-10,0)’. This will Increase the “Flow Out” of the stockpile.
Next, we create an entity to carry the new Rate down the conveyor to the next stockpile. This entity will act as the
leading edge of the new flow of material. To do this, we must place a Create step after the Assign and create a
DefaultEntity Object Instance Name.
From the Created exit of the Create step, we need to Assign the new Flow Rate that was created in the first Step so
we place an Assign. Set the State Variable Name to ‘ModelEntity.FlowChange’ and its New Value to
‘StockPile1.OreQuantity.Rate’.
Finally, place a Transfer Step after the Assign. We will Transfer From ‘FreeSpace’ (where the entity is Created), To
‘Node’, Node Name ‘ Output@StockPile1’.
We want the almost the exact same process for the Stop Event. Copy the first Process by clicking in the white space
of the Process. When the process gets shaded with diagonal lines and the Properties window changes to the Process
Properties, it means that it is selected, so press Ctrl+C, then Ctrl+V to copy and paste the entire Process.
Change the Name to ‘StopFlow’, Triggering Event to ‘Stop’ and in the first Assign step change the New Value to ‘0’.
Animating the Stockpiles
To represent the animation of the stockpiles, we need to make a new process. In the Processes Window, click the
Select Process button in the Ribbon and choose ‘OnInitialized’ from the drop down list. Place an Assign Step to
assign the Height, Length, and Width of the StockPiles according to the size of the OreQuantity State. To do this, set
the first State Variable Name to ‘StockPile1.Size.Height’ and the New Value to ‘StockPile1.OreQuantity/20’.
Click the ‘…’ button next to Assignments ( More) and add 5 additional items. Set the first item’s State Variable Name to
‘StockPile1.Size.Length’ and its New Value to ‘StockPile1.OreQuantity/10’. Similarly, the next item will be
‘StockPile1.Size.Width’ and its New Value will be ‘StockPile1.OreQuantity/10’. Fill out the next 3 items with the same
State Variable Names and Values but with StockPile2 instead.
Add a Delay step and set the Delay Time to an appropriate amount. 0.5 min was used in this example.
Drag the process Endpoint to the input of the Delay to create a loop. This allows the animation to update every time
the Delay is executed.
Enhancing Animation
In the Animation Ribbon in the Facility tab, add a Button and the Button Text to ‘Stop Flow’ and set the Event Name
to ‘Stop’.
Attach Status Labels to each StockPile by clicking on each StockPile object, then clicking the Status Label button in
the Symbols Tab. Set the Expression to ‘OreQuantity’, and add another for ‘OreQuantity.Rate’. Add both Status Labels
for the other StockPile objects, as well.
Drag in a ModelEntity Instance and attach a Status Label to it and set this Expression to ‘FlowChange’.
Embellishments:
If left running, StockPile1’s OreQuantity will become extremely negative, which in reality is impossible. To end the run when
183 / 1277
If left running, StockPile1’s OreQuantity will become extremely negative, which in reality is impossible. To end the run when
StockPile1’s OreQuantity reaches 0.0, see the SimBit ‘UsingMonitor’ for detailed instructions.
1Material refers to the substance flowing from one stockpile to the other – not to be confused with a Simio Material
Element
184 / 1277
Simio Reference Guide
MergingConveyorsControlledByGate - SimBit
Problem:
I want to model merging conveyors that prevent package collisions by having a gate that stops a package before the
merge point if it would collide with another.
Categories:
Add-On Process Logic, Conveyor Systems
Key Concepts:
Conveyor, Resource, Add-On Process, Seize Step, Release Step
Assumptions:
There are two types of entities that exit from two sources on conveyors and merge onto single conveyor system. At merge
point, a conveyor must prevent arriving entities from collisions by stopping them to move forward. Entities enter a single
conveyor system on a first in first out basis.
Technical approach:
A resource of capacity 1 is created to represent the gate or passage of a single entity. An add-on process is used at the
entry to each merging conveyor to seize the gate, thus metering flow to a single entity at a time. At the merge node,
another add-on process is used to release the gate, allowing the next waiting entity to proceed.
185 / 1277
Simio Reference Guide
MoveableOperator - SimBit
Problem:
I want to model a system that has two Servers in series and requires a Worker to be present at each Server before
processing can occur. Animation should show the Worker moving between the two servers and parking at the appropriate
Server for processing.
Categories:
Building New Objects / Hierarchy
Key Concepts:
Add-On Process, Assign Step, Before Exiting, Contents, Decide Step, InputBuffer, On Evaluating Seize Request, On
Released, ParkingStation Queue, RideStation Queue, Secondary Resources, Server, State Assignments, Worker
Assumptions:
There is only one Worker in the system. It will work at the first Server until the second Server has 5 or more entities waiting
in its queue. The Worker will then work on the second Server until the input buffer is empty and then return to working on
the first Server.
Technical Approach:
The Worker is modeled with a standard Worker object. The Worker object travels between two nodes that are located near
each Server, which animates the moveable resource. The Worker object is seized by each Server before processing and the
model ensures that the object is located at the appropriate node before it begins Processing. Add On Processes on the
Worker object will check the contents of the Input Buffer queue to see if the Worker should be working at Server1 or
Server2. A state variable at the Model will indicate which Server the Worker should be working on.
Details for Building the Model:
Simple System Setup
Add a Source, two Servers and a Sink to the Facility Window. Add a ModelEntity object to the Facility Window and
change its picture to a box.
Connect the Source to the first Server, connect the first and second Server together and connect the second Server to
the Sink with Paths. Add two Basic Nodes that are connected to each other with a bi-directional path. Place the
nodes near each of the Servers. This is the path that the movable resource will take between the Servers.
Place a Worker object in the Facility window and change its picture to a person by clicking on the Worker object and
selecting a new symbol from the Project symbol library in the ribbon.
Set the Park While Busy property of the Worker to ‘True’, which will tell the Worker to park at the node while it’s
processing instead of stay on the link.
Set the Initial Node(Home) property to ‘BasicNode1’.
Adding Logic to the Servers
Click on Server1 and expand the Secondary Resources property category. Under the Resource for Processing category,
set the Object Type property to ‘Specific’, set the Object Name property to ‘Worker1’. Set the Request Move property
to ‘To Node’ and the Destination Node property to ‘BasicNode1’. This tells the Server that it must seize Worker1 and
it must arrive at BasicNode1 before processing can begin at this Server.
Repeat the above step for Server2. It must also seize Worker1 and before processing, but set the Destination Node
property to ‘BasicNode2’ instead of ‘BasicNode1’ so that Worker1 arrives at the node closest to Server2.
Click back on Server1 and expand the State Assignments property category. Open the Repeating Property editor for
the Before Exiting property by clicking on the ellipse that appears in the text box of this property. Click Add and set
the State Variable Name to ‘ModelEntity.Priority’ and the New Value to ‘2’. This changes the priority of all entities that
leave this Server from the default value of 1 to the new value of 2.
Create New State
In the Definitions window of the model, go to the States panel.
Create a new Real Discrete state by clicking on Real in the ribbon. Name this new state ‘WorkerTaskPriority’.
This will keep track of which server the Worker should be working at. Set the Initial State Value in the
186 / 1277
This will keep track of which server the Worker should be working at. Set the Initial State Value in the
properties window to ‘1’.
Add On Process Logic for Worker
Click on the Worker object and expand the Add On Process Triggers property category.
Create a new process that is called from the Released property by selecting ‘Create New’ from the drop down
of this input box. This new process will check the current Task Priority when Worker is Released from a job.
Go to the processes window and in the process called Worker_Released, place a Decide Step which
checks the input buffer of Server 2 to see if there are 5 or more entities waiting. Set the Decide Type to
‘ConditionBased’ and the Expression to Server2.InputBuffer.Contents >= 5. If True, the state
WorkerTaskPriority is set to a value of ‘2’ with an Assign Step. If False, another Decide Step checks to see
if the input buffer is empty and if so, it assigns the value of ‘0’ to the state WorkerTaskPriority with an
Assign Step. This tells the system that the Worker will move to Server2 and work there until the input
buffer is empty.
Back in the Facility window, click on the Worker.
Create a new process that is called from the Evaluating Seize Request property by selecting ‘Create New’ from
the drop down of this input box. This new process will be executed each time a Server is attempting Allocation
of the Worker Object.
Go to the processes window and in the process called Worker1_EvaluatingSeizeRequest, place a Decide
step that checks to see if the entity that is evaluating its allocation should get the capacity of the Worker.
Set the Decide Type to ‘ConditionBased’ and the Expression to 'Entity.Priority == WorkerTaskPriority'. If
True, then the entity will get capacity of the Worker since the Worker object is supposed to stay at that
server, based on the value of WorkerTaskPriority. If the priorities do no not match, Token.ReturnValue is
set to ‘False’, which means that the allocation attempt of the Worker object was rejected.
187 / 1277
Simio Reference Guide
MoveASeizedObject - SimBit
Problem:
I have seized a moveable resource and now I’d like it to move to a couple of locations within the model before I release
the capacity of the resource.
Categories:
Worker
Key Concepts:
Decide Step, Delay Step, ID, Is.Worker, ModelEntity, Move Step, Location.Parent, Path, Secondary Resources, Selection
Weight, Server, Worker
Technical Approach:
There are two Server objects that both need to seize a Worker object and have the Worker move to the Server before
processing can begin. After processing finishes at each Server, the After Processing Add On Process trigger executes a
process. This process tells the Worker object to move to a node, delay, then move to another node and delay again. The
entire time, the Entity within the Server “owns” the capacity of the Worker. Finally, the Worker is told to move back to the
Server where the Entity is still waiting in the Processing station. Once the Worker reaches the Server, the entity releases
capacity of both the Server and the Worker and it moves out of the Server.
Details for Building the Model:
Simple System Setup
Place a Source object, followed by two Server objects that are in parallel, within the Facility window. Rename the
Server objects to Room1 and Room2. Connect the Source to the Servers with paths.
Click on the Source object and change the Interarrival Time property to ‘Random.Exponential(9)’.
Place two Sink objects, one near each Server, and connect Room1 to Sink1 with a path and connect Room2 to Sink2
with a path.
Place two Transfer Nodes into the Facility window, somewhere between Room1 and Room2. Name one
TransferNode ‘Lab’ and the other ‘Desk’.
Place Paths going from the output nodes of the servers to Lab, from Lab to Desk, and from Desk back to the server
output nodes.
Place a Worker object into the Facility window. Set its Initial Node (Home) property to ‘Desk’ and set its Idle Action
property to ‘Go to Home’.
In the Paths connecting the Output Nodes to Lab, set the Selection Weight to ‘Is.Worker’ to ensure that no Entities
travel on these paths (they are for workers only). Entities will go directly into the Sinks.
Logic for Seizing and Moving Worker
Select Room1 and set its Processing Time property to ‘2’ minutes.
Expand the Secondary Resources category within Room1’s properties and under the Resource for Processing
category, set the Object Name property to ‘Worker1’. In this same property category, set the Request Move property
to ‘To Node’ and set the Destination Node property to ‘Output@Room1’. This is where we tell Room1 to seize
Worker1 and have it move to Room1, before processing can begin at the server.
Repeat the above steps for the Room2, but instead of setting Destination Node to ‘Output@Room1’, enter
‘Output@Room2’.
Within the Processes window, create a new process by clicking on ‘Create Process’ in the ribbon. Name this process
‘Server_Processed’.
Place a Move Step in this process. Open the Resource Move Requests repeat group property window by clicking
on the … (elipse button). Within the editor window that appears, click the Add button and set Object Name to
‘Worker1’ and Destination Node to ‘Lab’.
Place a Delay Step and set the Delay Time to ‘2’ and Units to ‘Minutes’. This is how long the Worker will wait at
the Lab node before moving on.
Place another Move Step and within the Resource Move Request – Repeating Property editor window, set
Object Name to ‘Worker1’ and Destination Node to ‘Desk’.
188 / 1277
Place a Delay Step and set the Delay Time to ‘2’ and Units to ‘Minutes’. This is how long the Worker will wait at
the Desk node before moving on.
Place a Decide Step, which will check to see which Room the Worker should return to. Set the Decide Type to
‘Condition’ and the Expression to ‘ModelEntity.Location.Parent == Room1’. This is checking to see if the Entity
that “owns” this Worker right now is currently located in Room1.
In the True segment leaving the Decide Step, place a Move Step that moves ‘Worker1’ to ‘Output@Room1’. In
the False segment leaving the Decide Step, place a Move Step that moves ‘Worker1’ to ‘Output@Room2’.
Within the Facility window, select Room1 and expand the Add On Process Triggers property category. In the After
Processing trigger, select the new process you just created. Do the same thing for Room2. The same process can be
called from each Server.
Embellishments:
Add additional Move Steps that require the Worker to visit other locations while it is seized by the entity. Or increase the
Interarrival Time on the Source object and then increase the number dynamic Worker objects there are in the system to ‘2’.
Discussion:
Because the entity “owns” the Worker object while it is moving through the system, no other object can get capacity of this
Worker object. It is “Busy” until the Entity releases the capacity of the Worker. In this example, the Entity releases capacity
of the Worker once the Entity leaves the Server.
189 / 1277
Simio Reference Guide
MultipleInputArgumentsOnProcesses -
SimBit
Problem:
I have a Worker that needs to service 2 different Servers upon a server failure. Rather than having separate add-on
processes for each server, I’d like a single process that will seize the Worker when either Server fails.
Categories:
Add-On Process Logic, Worker
Key Concepts:
Add-On Process, Failure, On Failed, On Repaired, Process Input Arguments, Seize Step, Set Referenced Property, Release
Step, Server, Worker, Time to Repair, Token, Uptime Between Failures
Assumptions:
A single Worker is used to repair 2 different Servers when they fail. A bi-directional path is used to transfer the Worker
between the Servers. The same failure type property values are used with the Servers.
Additional Notes:
Input Arguments on processes allow the user to have single shared process between objects. In this SimBit, the seized
worker is directed to the appropriate work location, no matter where the process is called from. While not illustrated here,
it’s also possible to return a value (or values) in a similar fashion using return values.
Technical Approach:
Two Source-Server-Sink sets of objects connected by paths are placed in the model. A Worker is transferred between the
Servers via a bi-directional Path between the Servers. Reliability logic ( Uptime Between Failures and Time To Repair) is
defined via referenced properties. Add-On processes, along with process input arguments, are used to seize the worker
when needed.
Details for Building the Model:
System Setup
In the Facility window, place a Source, a Server and a Sink object and connect them with Path objects. Repeat this
process with a second set of objects below in parallel to the first set. On both Source objects, change Interarrival
Time to ‘Random.Exponential(.5)’.
Place a BasicNode ( BasicNode1) next to Server1, a BasicNode ( BasicNode2) next to Server2 and a third BasicNode
( HomeNode) between the Source objects. Connect these nodes with a bi-directional path. Place a Worker object in
the Facility window and set the following property values: Initial Node (Home) to ‘HomeNode’, Idle Action to ‘Park At
Home’. Click on the HomeNode and in the Appearance ribbon, select Draw Queue and add a
ParkingStation.Contents queue. On that same ribbon, turn off the Parking Queue option.
In the Server1 object, under Reliability Logic, set the Failure Type to ‘Calendar Time Based’ and create a new
referenced property for Uptime Between Failures called ‘UptimeBetweenFailures’ and one for Time To Repair called
‘TimeToRepair’. In Server2, under Reliability Logic, set the Failure Type to ‘Calendar Time Based’ and set a referenced
property on Uptime Between Failures to ‘UptimeBetweenFailures’ and on Time To Repair to ‘TimeToRepair’. Right
click on the Model and select Properties. Under Controls, General set UptimeBetweenFailures to
‘Random.Exponential(5)’, Units to ‘Minutes’, TimeToRepair to ‘Random.Uniform(.25,.5)’ and Units to ‘Minutes’.
In both of the Server objects, under Add-On Process Triggers, set Failed to ‘Server_Failed’ and Repaired to
‘Server_Repaired’.
Add-On Processes and Input Arguments
In the Definitions window, under Tokens, add a new token called “MyToken”. Add an Object Reference of type Node
and call it ‘Destination’.
In the Processes window, highlight the Server_Failed process and under Advanced Options, change Token Class Name
to ‘MyToken’. Select Input Arguments to open the repeating property editor. Add an item where Name is
190 / 1277
to ‘MyToken’. Select Input Arguments to open the repeating property editor. Add an item where Name is
‘LocalNode’ and State Variable Name is ‘MyToken.Destination’.
In the Server_Failed process, add a Seize step. Select Resource Seizes to open the repeating property editor. Add an
item where Object Name is ‘Worker1’, Request Move is ‘ToNode’ and Destinationi is ‘MyToken.Destination’.
In the Server_Repaired process, add a Release step and select Resource Releases to open the repeating property
editor. Add an item where Object Name is ‘Worker1’.
In the Facility window, select Server1 and under the Failed Add-On Process Triggers, Input Arguments, set Local Node
to ‘BasicNode1’. Select Server2 and under the Failed Add-On Process Triggers, Input Arguments, set Local Node to
‘BasicNode2’.
191 / 1277
Simio Reference Guide
MultipleServerFailures - SimBit
Problem:
I need to model failures at a Server object using more than one type of failure event stream. The Reliability Logic
properties on the Server object only allow for a single way to generate failure occurrences.
Categories:
Resources, Failures, Add-On Process Logic
Key Concepts:
Fail, Failure, Math.Remainder, Multiple Failure Types, Processing Count Based Failure, Processing Time Based Failure,
Repair, Server
Assumptions:
A processing time based failure occurs at the server approximately every minute and takes 30 seconds to repair. A
processing count based failure (preventative maintenance) occurs at the server after every 10 parts are processed and takes
a minute to repair.
Technical Approach:
The processing time based failure stream will be modeled using the Reliability Logic properties of the Server object. The
processing count based failure stream will be modeled using add-on process logic.
Details for Building the Model:
System Setup
Place Source, Server and Sink objects in the Facility window. Connect these objects using Connectors.
Modeling the Processing Time Based Failure Stream
For the Reliability Logic properties of the Server object, specify Failure Type as ‘Processing Time Based’, Uptime
Between Failures as ‘Random.Exponential(1)’ minutes, and Time to Repair as ‘.5’ minutes.
Modeling the Processing Count Based Failure Stream
In the Definitions window, add a real State called NumberProcessed.
In the Facility window, on the Server object, define an Add-On Process Trigger for the After Processing property and
call it ‘Server1_AfterProcessing’.
In the Processes window, for the logic of the ‘Server1_AfterProcessing Process’, add an Assign step and assign the
State Variable Name 'NumberProcessed' to New Value 'NumberProcessed+1'. Next add a Decide step with an
Expression ‘Math.Remainder( NumberProcessed,10) == 0’. On the True exit point of the Decide step, add an Execute
step and specify the Process Name as ‘PrevMaintenance’.
Still in the Processes window, create a process and name it ‘PrevMaintenance’. In this process, add the steps Fail,
Delay, and Repair. For the Fail step, specify the Failure Name to ‘Server1.Failure’. For the Delay step, specify the Delay
Time to be '1' minute. For the Repair step, specify the Failure Name to be ‘Server1.Failure’.
192 / 1277
Simio Reference Guide
MultiServerSystemWithJockeying - SimBit
Problem:
I want to model a service system that consists of a group of parallel servers, where each server has its own waiting line and
customers switch between lines if they think they will get served faster.
Categories:
Buffering
Key Concepts:
Buffer Logic, Reneging, Jockeying
Assumptions:
A system for processing customer entities consists of a group of three parallel servers. Each server has its own separate
waiting line. When a customer arrives, they will choose the leftmost shortest queue to enter. Servers process their queues in
FIFO order, however if a customer at the end of a waiting line can move up by switching lines, then they will (see Figure 1).
The time between customer arrivals is sampled from an exponential distribution, EXPO(1) minutes. The processing time for
each customer is EXPO(2.8) minutes.
The jockeying rule is formalized as follows: If the completion of processing at a server i causes nj > ni + 1 for some other
server j, then the customer from the tail of queue j switches to the tail of queue i. If there are two or more such customers,
then the one from the closest, leftmost queue jockeys.
Details for Building the Model:
Facility Window Setup
Add a Source, three Servers, and Sink to the Facility window. Connect the Source to the Servers and the Servers to
the Sink using Connector links.
Place a ModelEntity object from the Project Library into the Facility window. Name it ‘Customer’.
Server Node List Definition
Go to the Definitions, Lists window. Add a node list and name it ‘ServerNodeList’. Specify the nodes in the list as
Input@Server1, Input@Server2, and Input@Server3 (in that order).
Source Properties
Specify the Entity Type as ‘Customer’ and the Interarrival Time as ‘Random.Exponential(1)’ minutes.
Source ‘Output’ Node Properties
Specify the Entity Destination Type as ‘Select From List’ and the Node List Name as ‘ServerNodeList’. Specify the
destination Selection Goal as ‘Smallest Value’ of Selection Expression ‘Candidate.Server.InputBuffer.Contents +
Candidate.Server.Processing.Contents’. This will cause a new customer arrival to choose the server that is the leftmost
shortest queue.
Custom Function Definitions
To simplify some expressions, go to the Definitions, Functions window. Add three custom functions named
‘NumberAtServer1’, ‘NumberAtServer2’, and ‘NumberAtServer3’. The expressions used to return a value for these
functions are as follows:
Server Properties
For each server, specify the Processing Time as ‘Random.Exponential(2.8)’ minutes.
For each server, go to Buffer Logic -> Input Buffer -> Balking & Reneging Options. Open up the Renege Triggers
repeat group and specify event-based renege triggers for each of the server input buffers using the table below as
well as the example model for guidance.
193 / 1277
well as the example model for guidance.
Embellishments:
In this example, we have also used the State Assignments section of properties to change the picture of the entity if
reneging occurs at a Server. This is done by selecting the On Reneging repeat group and specifying the Assign If property
as ‘Reneging From Input Buffer’, the State Variable Name as ‘ModelEntity.Picture’ and the New Value as ‘1’ (for Server1) or
whichever entity picture desired. Note that clicking on the ModelEntity, selecting the Add Additional Symbol button
multiple times, and then changing the symbol of the entity will allow the graphics to update with such On Reneging state
assignments.
See also:
SourceWithBalkingIfBlocked.spfx
ServerQueueWithBalkingAndReneging.spfx
ChangingQueuesWhenServerFails.spfx
194 / 1277
Simio Reference Guide
NotifyStep - SimBit
Problem:
When a certain event occurs or when a variable reaches a certain point, I want the simulation to pause while a message is
given to the user, asking them to either continue running the simulation or giving them the ability to pause the simulation to
investigate the event.
Categories:
Add-On Process Logic, Buffering
Key Concepts:
Contents, CrossingStateChange, Event, InputBuffer, Monitor, Notify Step, On Change Detected Process
Technical Approach:
A message can be displayed to the screen with a Notify Step. This model will place a Notify Step to be executed when a
Monitor element fires. This Monitor element fires when the contents of the Server’s InputBuffer station exceed 3.
Details for Building the Model:
Simple System Setup
Place a Source, a Server and a Sink into the Facility window and connect them with Paths.
Go to the Definitions Window. You should be in the Elements panel ( Elements highlighted on the left of the screen).
Click on Monitor in the Ribbon to create a new Monitor element.
Set the Monitor Type property to ‘CrossingStateChange’
Set the State Variable Name to ‘Server1.InputBuffer.Contents’
Set the Threshold Value to ‘3’.
Set the Crossing Direction property should be set to ‘Positive’, which means that this Monitor will fire when the
contents of the InputBuffer cross over the value of 3 in the positive direction (i.e. when it increases from 3 to 4).
In the drop down of the On Change Detected Process property, create a new Process by select “Create New”.
This new process will be executed when this Monitor fires.
Go to the Processes window and you should see the new Process that was just created. Place a Notify Step into this
process (located under All Steps).
Set the Notification Type to ‘Warning’
Set the Message Heading to “InputBuffer Monitor” (include the double quotes since this is a String)
Set the Message Content to “InputBuffer has more than 3 entities” ((include the double quotes since this is a
String)
Embellishments:
Change the contents of the String message that is in the Message Heading or the Message Content properties. First select
“Continue running” in the pop up window and then select “Pause the Simulation”, to see the behavior of the two choices.
Finally, select “Don’t show this warning again” at the bottom of the window to turn off future warnings.
Discussion:
The Warning Level is controlled from the Run ribbon under Advanced Options. The user can set the Warning Level to Alert
User (this is the default), Write to Trace Only, or Do Nothing. Once the user selects Do Nothing or selects the “Don’t show
this warning again” check box in the pop up window, they must select Re-enable Disabled Warnings from the Advanced
Options tab to get the Warnings to reappear.
195 / 1277
Simio Reference Guide
ObjectReferenceOnEntity - SimBit
Problem:
I would like to keep track of what Server an entity visited so that this information can be used later in the model. I would
like to keep a reference to an object on my entity.
Categories:
Decision Logic -– Paths, Decision Logic -– Processing, Entity Characteristics
Key Concepts:
Active Symbol, Object Reference State, Location.Parent, Selection Weight
Assumptions:
If an Entity is processed at Server1, it must route to Server5 for processing after it finishes at Server4. If an Entity is
processed at Server2, it must route to Server6 for processing after it finishes at Server4.
Technical Approach:
An Object Reference State is created on the ModelEntity object, which will be used to hold a reference to which Server the
entity visited first (either Server1 or Server2). The Selection Weight properties on the paths the leave Output@Server4 will
contain expressions that will route the entity to correct Server, either Server5 or Server6, depending on which Server it
visited at the beginning of the model. The logic in these expressions checks the value of the Object Reference State on
each entity to determine if it was processed at Server1 or Server2.
Details for Building the Model:
Simple System Setup
Place a Source ( Source1) and Sink ( Sink1) at the left and right sides, respectively, of the Facility window.
Place two Server2 in parallel after the Source and name them Server1 and Server2. Connect Source1 to each new
Server with Paths.
Place two Servers, in series, next. Name them Server3 and Server4. Connect them together with Paths and connect
both Server1 and Server2 to Server3 with a Path.
Place two additional Servers, in parallel, after Server4. Name them Server5 and Server6. Connect Server4 to each
new Server with a Path and connect Server5 and Server6 to the Sink with Paths.
Place a ModelEntity object from the Project Library, into the Facility window. Select the entity in the Facility window
and click on ‘Add Additional Symbol’ icon in the Ribbon. Change the color of the second symbol to Red. First, ensure
that he second symbol is displayed by selecting the entity in the Facility window and checking the Active Symbol icon
in the Ribbon. If (2 of 2) is displayed, you are viewing the second symbol. Click on the Color drop down in the
Ribbon, find Red, and then click back onto the Entity object to change its color. (if you are viewing 1 of 2, or the first
symbol, simply select the second symbol from the Active Symbol drop down)
Creating the Object Reference State on the ModelEntity
Click onto ModelEntity in the Navigation window in the upper right side of the interface. Once ModelEntity is
selected, you are now viewing the object definition for this object. Go to the Definitions window of the ModelEntity
object.
Go to the States Panel by selecting States on the left panel.
Click on the Object Reference icon in the ribbon to create a new Object Reference State. Rename this new state,
FirstServer.
Adding Logic to the Model
Back in the main Model, click on Server1 and expand the State Assignments property category. Add a new
assignment in the On Entering property. Click Add to create a new Assignment once the Repeating Property Editor
window is open. Set the State Variable Name to ‘ModelEntity.FirstServer’. Set the New Value property to
‘ModelEntity.Location.Parent’.
The function ModelEntity.Location.Parent will return a reference to the object where the entity is current
located (it’s ParentObject) and at this moment, the ParentObject is Server1, so it will assign a reference of
Server1 to the new state named FirstServer on each entity that passed through. 196 / 1277
Server1 to the new state named FirstServer on each entity that passed through.
Click on Server2 and add the exact same assignment to this Server. ( Exact same State Variable Name and same
expression for New Value). However, before you exit the Repeat Group editor, add a second Assigment. Set the State
Variable Name to ‘ModelEntity.Picture’ and the New Value to ‘1’.
This will change the color of all entities leaving Server2 to Red. This will help with visually confirming that these
entities will be routed to Server6.
Select the Path that leads from Server4 to Server5. Set the Selection Weight property to ‘ModelEntity.FirstServer ==
Server1’. This tells Simio that only entities that have their FirstServer state set to ‘Server1’ will be able to take this
Path.
Similarly, select the Path that leads from Server4 to Server6. Set the Selection Weight property to
‘ModelEntity.FirstServer == Server2’. This tells Simio that only entities that have their FirstServer state set to ‘Server2’
will be able to take this Path.
197 / 1277
Simio Reference Guide
OneQueueForMultipleServers - SimBit
Problem:
I have multiple servers and I would like one queue that feeds into these two servers.
Categories:
Buffering
Key Concepts:
Allow Passing, Blocked Destination Rule, Input Buffer, Lists, NodeList, Path, Select Available Only, Selection Goal,
TransferNode
Assumptions:
If there are entities waiting and one of the servers becomes available, the first entity in the queue will move to the available
server for processing.
Technical Approach:
There are two servers, but the same concept can be applied if there were more than two servers. The InputBuffer property
on each server is set to ‘0’. This will ensure that entities do not wait at each server. A Transfer Node is placed in front of the
two servers. The Transfer Node is configured to only send entities on paths that are available, which ensures that the
entities will wait here if there are no servers available. The Path that leads to the Transfer Node has its Allow Passing
property set to ‘False’ so that the entities wait one behind the other on this link.
Details for Building the Model:
Simple System Setup
Place a Source object and a Sink object in the Facility window. In between, place two Servers that are in parallel to
each other. Place a Transfer Node in front of these two Servers.
Connect the Source to the Transfer Node with a Path. Set the path’s Allow Passing property to ‘False’.
Connect the Transfer Node to the input node of each server with paths.
Connect the output nodes of each server to the Sink.
Create a Node List
Go to the Definitions window and open the Lists panel. Create a new Node List by clicking on the Node icon in the
ribbon. In the node list, first list Input@Server1, followed by Input@Server2.
Ensuring One Queue
Click on the Transfer Node. Set the Entity Destination Type property to ‘Select From List’.
Set the Node List Name property to the name of your new Node List.
The Selection Goal property is set to ‘Random’ in this example.
The Blocked Destination Rule is set to ‘Select Available Only’. This ensures that the entity does not leave this Transfer
Node and travel to its destination if there are entities at each server.
Eliminate Input Buffers
Eliminate the Input Buffer at each server so that the entities cannot wait in this location for server capacity. Set the
Input Buffer property on each server to 0.
Embellishment:
Experiment with more servers and see the behavior change when you change the Blocked Destination Rule property on the
Transfer Node.
OverflowWIP - SimBit
Problem:
I have parts that are processed by two machines, always in FIFO order. I have a small WIP area in front of the machines –
parts always go here to wait if space is available. If the small WIP area is full, parts go to an overflow area, but are still
pulled in FIFO order regardless of location.
Categories:
Buffering
Key Concepts:
Capacity.Allocated, Lists, ModelEntity, ObjectList, Path, Ranking Expression, Ranking Rule, Resource, Secondary Resources,
Selection Weight, Smallest Value First, TimeCreated
Technical Approach:
Represent the WIP areas as Servers with the specified capacity, but no processing time. Don’t leave the Server until the
processing machine is ready to process it. Use resource default behavior to select FIFO from all waiting parts (regardless of
location).
Details for Building the Model:
Simple System Setup
Add a Source, 4 Servers, and a Sink to the Facility Window. Two of the Servers will be the MainWIP and
OverflowWIP areas, while the other two Servers will be ServerA and ServerB.
Determining the WIP Area to go to
In the Selection Weight property for the path to MainWIP, use the 'MainWIP.Capacity.Allocated <
MainWIP.Capacity'. This will evaluate the number of busy “spots” in this Server as compared to the capacity.
In the Selection Weight property for the path to OverflowWIP, use the ‘MainWIP.Capacity.Allocated ==
MainWIP.Capacity’.
Defining the Machines
Place resource with Name ‘ResourceA’ and ‘ResourceB’ representing each machine.
Open the Definitions tab, Lists panel and add an Object list with Name ‘Machines’.
Add ‘ResourceA’ and ‘ResourceB’ to the list.
Details for Machine Selection
Within each WIP area ( MainWIP and OverflowWIP), within the Secondary Resources / Other Resource Seizes section
of properties, enter the After Processing repeating editor and change the Object Type to ‘FromList’, and the Object
List Name to ‘Machines’. The Selection Goal should remain as the default ‘PreferredOrder’ to select the first available
machine from the list. These are seized just before the WIP resource is released.
Within each Server ( ServerA and ServerB ), within the Secondary Resources / Other Resource Releases section of
properties, enter the After Processing repeating editor and change the Object Type to ‘FromList’, and the Object List
Name to ‘Machine’.
Details for Moving to the Selected Machine
Using paths, connect each of the WIP type Servers to each of the processing type Servers, ServerA and ServerB.
In the Selection Weight property for each path to MachineA, use the expression ‘ResourceA.Capacity.UnitsOwned’.
In the Selection Weight property for each path to MachineB, use the expression ‘ResourceB.Capacity.UnitsOwned’.
The combination of the above will result in a weight of 1 for the correct path and a weight of 0 for the other path.
Animation Embellishment:
To make it easier to see the FIFO behavior, we used different entity symbols based on creation time. Look in the Current
Symbol property for PartA and to see the expression used to use a different symbol each hour.
199 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
200 / 1277
Simio Reference Guide
PathSelectionRule - SimBit
Problem:
I have a bidirectional path that takes entities from two different inputs to two different outputs, with entities coming from
both sides of the path. I want to be able to direct how the entities flow onto the path, but I’m not sure how the Traffic
Direction Rule property on a Path works.
Categories:
Decision Logic -- Paths
Key Concepts:
Allow Passing, Bidirectional Path, Entity Destination Type, Maximum Arrivals, Path, Prefer Desired Direction, Source, Time
Offset, Traffic Direction Rule
Assumptions:
There is no passing on the bidirectional path. Entities move onto the link from both node entrances. The systems shown are
identical except for the Traffic Direction Rule property on the bi-directional Path.
Technical Approach:
A model is developed with a system containing two sources, two sinks and a bidirectional link. This first group of objects is
then copied to a second system. To evaluate the difference between the systems, the model will be deterministic, meaning
no random distributions will be used. The only difference will be the Traffic Direction Rule property on the bidirectional
path.
Details for Building the Model:
Simple System Setup
Place a Source ( Source1) and Sink ( Sink1) at the left side of the Facility window. Then, place a second Source
( Source2) and Sink ( Sink2) on the right side.
Within Source1, change the Interarrival Time to ‘.2’ and the under the Stopping Conditions category, change
Maximum Arrivals to ‘5’. Within Source2, change the Time Offset to ‘0.1’, the Interarrival Time to .2 and the Maximum
Arrivals to ‘5’.
Setting the Destinations
Click on the output node of Source1 ( Output@Source1) and change the Entity Destination Type to ‘Specific’ and the
Node Name to ‘Input@Sink2’.
Do the same for Source2 ( Output@Source2) and specify the Entity Destination Type as ‘Specific’ and the Node Name
as ‘Input@Sink1’.
Adding Nodes, Paths and a Bidirectional Path
Place a BasicNode1 to the right of Source1/Sink1. Place a second BasicNode2 to the left of Source2/Sink2.
Using Paths, connect Source1 to BasicNode1 and Source2 to BasicNode2. Then connect BasicNode1 to Sink1 and
BasicNode2 to Sink2. For the Paths connecting the Sources to the BasicNodes, set Allow Passing to ‘False’.
Add a path connecting BasicNode1 and BasicNode2. Change the path’s Type to ‘Bidirectional’, Allow Passing to
‘False’ and Speed Limit to ‘.1’.
Copying System1 to System2
Now that we have a single system completed, we will copy it to make an identical one. This can be done by moving
the mouse to the top left corner above the Source1 and Ctrl-Left Click and drag to highlight all the objects in
system1 (including both Sources, Sinks, BasicNodes and all paths).
Ctrl-C will copy the system and position the mouse below system1 and use Ctrl-V to paste the copy. All objects will
be renamed with unique names.
Edit the bidirectional path for System2 and change the Traffic Direction Rule to ‘Prefer Desired Direction’. You may
need to expand the properties under Type to see this property.
Change the entity destination Node Name properties in the Source Output Nodes to ‘Input@Sink1_1’ and
‘Input@Sink2_1’. 201 / 1277
‘Input@Sink2_1’.
202 / 1277
Simio Reference Guide
PickUpDropOffFlow - SimBit
Problem:
I would like to model flow being carried on a moving entity. The moving entity’s Container would be filled with flow. It
would then travel to a new destination and then empty the flow out of its Container.
Categories:
Add-On Process Logic, Flow Library
Key Concepts:
Assign Step, Condition, Contents, Custom Object, Decide Step, Event, Execute Step, Fire Step, FlowNode, ModelEntity,
Notify Step, Remove Step, Transfer Step, Wait Step
Assumptions:
The model described below will support two entities arriving from the Source object. If this number is altered, the tank
capacity and volume will need to be adjusted to support this.
Technical Approach:
There is a Tank that initially contains 600 cubic meters of flow. There is a second Tank that is initially empty but can hold up
to 600 cubic meters. The ModelEntity object has a Container element that will hold 300 cubic meters of flow. The traveling
entity arrives at a Node and flow is transferring from the first Tank into the Container on the entity. Flow is transferred until
the entity’s Container is full. At this point, the transfer of flow is stopped and the entity travels to the next Node. At this
point, flow is transferred from the entity’s Container into the second Tank. When the entity’s Container is empty, the entity
leaves the Node and travels to the Sink.
Details for Building the Model:
System Setup
Drag out two instances of ModelEntity, so there is an instance of DefaultEntity and ModelEntity1 in the Facility
window. DefaultEntity will be the traveling entity and ModelEntity1 will be the flow.
Place a Source ( Source1) and Sink ( Sink1) at the left and right sides, respectively, of the Facility window.
Set the Maximum Arrivals property on the Source to ‘2’.
Place two TransferNodes in between the Source and the Sink and connect each objects with a Path.
Click onto the path that connects the Source to the first TransferNode. Set the Initial Traveler Capacity to ‘1’ so
that only one traveling entity will be on this link at the same time. This is required so that the second entity
does not arrive at the first TransferNode and request a transfer of flow while the first entity is still accepting a
transfer of flow.
Place two Tank objects (from the Flow Library). Place one Tank near the first TransferNode and the other Tank near
the second TransferNode.
For Tank1, set the Initial Volume Capacity property to ‘600 cubic meters’. Add a row to the Initial Contents
repeat group property and set the Entity Type property to ‘Modelentity1’ and the Quantity to ‘600’, which
indicates that this Tank will initially have 600 cubic meters of ModelEntity1 inside of it.
For Tank2, set the Initial Volume Capacity property to ‘600 cubic meters’.
In the Run Ribbon, set the Speed Factor to at least 300 for a more appropriate animation speed.
Adding a Container to the ModelEntity object
Click on the ModelEntity object in the Navigation window (right side of interface) to enter into this object’s
definition.
Go to the ModelEntity’s Definitions window and click onto “Container” in the Elements ribbon.
Set the Container’s Initial Volume Capacity to ‘300’ cubic meters.
Find the On Full Process and On Empty Process properties of the Container and select “Create New” for each
property so that you have created two new processes that will be triggered when this Container is Full and
Empty.
203 / 1277
From within the ModelEntity’s Definitions window, go to the Events panel (find Events along the left hand side of the
interface). Create two new Events by clicking on “Event” in the Events ribbon. Name one event ‘Full’ and the other
‘Empty’.
Go to the ModelEntity’s Processes window. Find the two new processes that were created earlier from the Container
element.
Place a Fire Step in the Container1_OnEmptyProcess. Set the Event Name of this step to ‘Empty’.
Place a Fire Step in the Container1_OnFullProcess. Set the Event Name of this step to ‘Full’.
Process Logic to Transfer Flow
Navigate back to the main model by clicking onto Model in the Navigation window. Go to the Model’s Processes
window. Create 4 new Processes by clicking on Create Process in the Process ribbon.
Click onto the first process and set it’s Name property to ‘FillShip’.
In this process, we’ll be transferring flow from Tank1 into the entity’s Container. First, make sure there is
sufficient flow in Tank1 to transfer. Place a Decide Step that checks the condition
“Tank1.FlowContainer.Contents > 0’.
If False, place a Notify Step that tells the user there isn’t sufficient flow.
If True, place a Transfer Step to transfer the flow.
Set From to ‘CurrentNode’
Set To to ‘Container’
Set Container Name to ‘ModelEntity.Container1’
Set Flow Regulator Name to ‘[email protected]’
Under Advanced Options, set Entity Type to ‘SpecificObject’ and Entity Object to
‘Tank1.FlowContainer.Contents.FirstItem.Modelentity’ . This is telling Simio that you specifically
want to find the entity that is currently in the Contents queue of the FlowContainer inside of Tank1
and transfer that entity into the current entity’s Container1
Click onto the second process and set it’s Name property to ‘TransferFromTank1ToShip”.
Place an Execute Step with the Process Name property set to ‘FillShip’. In the Advanced Options, set the
Token Wait Action to ‘None ( Continue)’. This will tell Simio to execute the FillShip process, but this token
will not wait for that process to finish, it will continue onto the next step.
Place a Wait Step and set the Event Name to ‘ModelEntity.Full’.
Place a Decide Step and set the Expression to
‘[email protected]>0’, which checks if there is still an
entity in the Flow Request Queue of the Tank’s output node. An entity would still be in this queue if only a
partial amount of the flow was transferred out of the tank. We need to remove the entity from this queue
because we are done with this transfer of flow. This is how we “cancel” a flow transfer request. Simio will
keep on trying to transfer the rest of the flow volume to this entity, unless you remove it from the Flow
Request Queue when you are done. If we had transferred all of the volume that was in the Tank, this step
would not be necessary.
Click onto the third process and set it’s Name property to ‘EmptyShip”
In this process, we’ll be transferring flow from the entity’s Container into Tank2.
Place a Transfer Step to transfer the flow.
Set From to ‘CurrentContainer’
Set To to ‘Container’
Set Container Name to ‘Tank2.FlowContainer’
Set Flow Regulator Name to ‘[email protected]’
Under Advanced Options, set Entity Type to ‘SpecificObject’ and Entity Object to
‘ModelEntity.Container1.Contents.FirstItem.Modelentity’. This is telling Simio that you specifically
want to find the entity that is currently in the Contents queue of the entity’s Container and transfer
that entity into the FlowContainer of Tank2.
Click onto the fourth process and set it’s Name property to ‘TransferFromShipToTank2”.
Place an Execute Step with the Process Name property set to ‘EmptyShip’. In the Advanced Options, set
the Token Wait Action to ‘None ( Continue)’. This will tell Simio to execute the EmptyShip process, but
this token will not wait for that process to finish, it will continue onto the next step.
Place a Wait Step and set the Event Name to ‘ModelEntity.Empty’.
Navigate back to the Facility window of the model and click onto TransferNode1. In the Entered Add On Process
trigger property, select “TransferFromTank1ToShip” in the dropdown so that this process is executed when the entity
enters this node. Similiarly, click onto TransferNode2. In the Entered Add On Process trigger property, select
“TransferFromShipToTank2” in the dropdown so that this process is executed when the entity enters this node.
204 / 1277
Copyright 2006-2020, Simio LLC. All Rights Reserved.
Send comments on this topic to Support
205 / 1277
Simio Reference Guide
ProcessModelWithinModel - SimBit
Problem:
There is a series of simple steps in your facility that are repeated many times throughout the operation. You wish to have a
small user-defined “model object” that can be placed multiple times in your model logic.
Categories:
Building New Objects / Hierarchy
Key Concepts:
BasicNode, ContinueProcess, Delay Step, EndTransfer Step, Expression Property, ExternalNode, Object Instance Property,
Station, Release Step, Resource, Seize Step, Station Element, Transfer Step
Assumptions:
The similar steps that will be made into an object include seizing a resource, delaying for a given amount of time and
releasing the resource. The Processes Window steps of Seize, Delay, and Release will be used. All logic within this model
object will be specified in the Processes Window.
Technical Approach:
Within the first model, called SeizeDelayRelease, we will define the processing necessary for this single object, which
includes the Seize, Delay and Release steps. This logic will remain unchangeable, however, the end user of the
SeizeDelayRelease object will be able to specify a single resource name (for seizing / releasing), as well as the delay time.
Details for Building the Model:
Defining the SeizeDelayRelease Process Logic
Open a new model and rename the Model to SeizeDelayRelease by selecting MySimioProject in the Navigation
window, selecting the Models panel, highlighting Model and clicking to rename.
Open the Processes window of SeizeDelayRelease. Create a process with Name ‘Process1’.
Place the Seize, Delay and Release steps into Process1.
For any properties that the end user will be able to specify, highlight the property, right click and select Set
Referenced Property, Create New Referenced Property and specify a property name. In this example, within the
Delay step, set the Delay Time property to ‘DelayTime’. You will see a green arrow to the left of DelayTime,
indicating that the value will come from the parent object, SeizeDelayRelease. Do the same for the Object Name for
Seize and Release steps to specify a ‘Resource Name’ in the parent object.
Defining the SeizeDelayRelease External View
Click on the Definitons tab and select the External panel, where you will specify what the user will see in a Facility
window when they place this model. Place an ellipse, and two external nodes (one for entry, one for exit) in the view.
Change the entry node’s Node Class Name to ‘BasicNode’. The logic of this model is only in the Processes window,
thus the Input Location Type is ‘Station’, with the Station of ‘EntryStation’.
Change the exit node’s Node Class Name to ‘TransferNode’. Input Location Type is ‘None’, as this is a transfer out.
Utilizing the Entry and Exit Node within the Process Logic
Return to the Processes Window and change the change the Triggering Event property to EntryStation.Entered (recall
that the entry node’s Input Location Type was Station called EntryStation).
Add an EndTransfer step at the start of the process, before the Seize step. This will stop the transfer into the model
so that other logic may begin.
Place a Transfer step after the Release step. Change the From property to ‘CurrentStation’, since we entered this
process via station ( EntryStation). The To property should be ‘ParentExternalNode’, with the External Node Name of
‘Node2’ (name of exit node in External Window).
Using the SeizeDelayRelease Model in Another Model
Open a new model and within its Facility Window, place a Source and Sink from the Standard Library and a
SeizeDelayRelease model from the Project Library and connect them with Paths. Place a Resource and change the
Name to ‘Resource1’. 206 / 1277
Name to ‘Resource1’.
Highlight SeizeDelayRelease and specify the ResourceName as ‘Resource1’ and the DelayTime as ‘3.1’.
When you run this new model, the logic behind SeizeDelayRelease then includes all process logic specified within
that model. You may place SeizeDelayRelease as many times in your new model as you like with varying
ResourceName and DelayTime properties.
207 / 1277
Simio Reference Guide
RandomValueFromTable - SimBit
Problem:
I would like to use real data for my system, including time between arrivals and processing times, instead of distribution
data. Recent research1 suggests that sampling directly from real data may be more accurate than using a fitted distribution.
Categories:
Arrival Logic, Data Tables, Entity Characteristics
Key Concepts:
Before Creating Entities, Data Table, Foreign Key, Object Reference Property, RandomRow, RandomValue, Table Foreign
Key Property, Table Row Referencing
Technical Approach:
This model illustrates use of two different types of data. The top subsystem illustrates using data where you have a
standalone set of collected values, for example historical processing times. The bottom subsystem illustrates using data
where you have a set of collected values with identifying or categorizing information, for example historical processing
times by entity type.
Create a table for each set of arrival and/or processing data that will be read during the simulation run. For data that is
entity type specific, a foreign key column within a table is utilized to classify the data. In this example, the first
Source/Server/Sink combination will read data for both source arrivals, as well as server processing times from two
separate tables. In the second Source/Server/Sink combination, two entity types will be generated that have processing
time information located within a relational table.
Details for Building the Model:
Simple System Setup
Place a Source, Server and Sink in the Facility window. Connect these with Paths.
Place a second Source, Server, and Sink combination in the Facility window and connect as well.
Place 3 ModelEntity objects from the Project Library into the Facility Window and change the Name property values
to ‘Green’, ‘Red’ and ‘Blue’- change their picture colors to match.
Defining the Data Tables with Product Information
Click on the Data tab of the model and select the Tables panel. Add a DataTable with the Name ‘Source1Table’ and
add a ‘Real’ type property named ‘ArrivalTimes_1’. Copy and paste in any ‘real’ data you may have for time between
arrivals (in this example, we generated 50 data points from StatFit2).
Add a DataTable with the Name ‘Server1Table’ and add a ‘Real’ type property named ‘ProcessingTimes_1’. Copy and
paste in any ‘real’ data you may have for processing times (in this example, we generated 100 data points from
StatFit2).
Add a third Data Table with the Name ‘PartTypes’. Add two column properties; including an Entity Object Reference
property named ‘WhichType’ and an Integer type property named ‘HowMuch’. Add ‘Red’ and ‘Green’ to the Entity
Object Reference column and have corresponding ‘HowMuch’ property values of ‘40’ and ‘60’. We will use the
RandowRow function to generate the entity type from Source2. Click on the column ‘WhichType’ and select the Set
Column as Key button. We will use this as a key for the next table.
Finally, add a Data Table with the Name ‘Server2Table’ that includes a Foreign Key column named ‘PartType’ as well
as a real type column named ‘ProcessingTimes_2’. For the ‘PartType’ column, set the column property named Table
Key to ‘PartTypes.WhichType’, which references the column noted in previous step. In this table, you will add
associated times for both ‘Blue’ and ‘Red’ type parts. The RandomValue function will be used to randomly pick a
value from the associated data for the given part type calling the table.
Generating Random Values for Source1 and Server1
Within Source1, change the Entity Type to ‘Green’ and the Interarrival Time to
‘Source1Table.ArrivalTimes_1.RandomValue’. This will randomly select a value from the Source1Table ( ArrivalTimes_1
property) as the interarrival time each time an entity is generated.
Within Server1, change the Processing Time property to ‘Server1Table.ProcessingTimes_1.RandomValue’. This
function will pull a random value from the Server1Table’s ProcessingTimes_1 column each time an entity is208 / 1277
function will pull a random value from the Server1Table’s ProcessingTimes_1 column each time an entity is
processed.
Generating Random Entity Types and then Random Values from Relational Table
Within Source2, open the Table Row Referencing->Before Creating Entities section of properties and specify the Table
Name as ‘PartTypes’ and the Row Number as ‘PartTypes.HowMuch.RandomRow’.
Change the Interarrival Time to ‘Random.Exponential(6)’. The Entity Type can then be specified as
‘PartTypes.WhichType’, which will be based on the part type generated (40% Blue and 60% Red based on HowMuch
column property values).
Within Server2, change the Processing Time property to ‘Server2Table.ProcessingTimes_2.RandomValue’. This
function will pull a random value from the associated part type’s ProcessingTimes_2 column entries each time an
entity is processed.
Footnote:
1) Nelson, WSC2013, http://www.simio.com/resources/presentations/2013-Winter-Simulation-Conference/pdfs/WSC2013-
Titan-Keynote-Nelson-Simulation-Curmudgeon.pdf
209 / 1277
Simio Reference Guide
RecordDistanceTraveled - SimBit
Problem:
I want to record the distance traveled by a vehicle per hour.
Categories:
Custom Statistics, Vehicles, Custom Object
Key Concepts:
Subclass, Real State Variable, Discrete State, TallyStatistic, Movement, Distance, Periodic Statistic, Hourly Statistic
Technical Approach:
The Vehicle object will be sub-classed to make a customized vehicle in order to add a state and statistic on top of the
standard vehicle behavior. A process will be added to the vehicle to update the state and record the periodic statistic.
Details for Building the Model:
Creating a Sub-Classed Object MyVehicle
Create a new vehicle class called MyVehicle that is sub-classed from Vehicle by right-clicking on Vehicle in the
Standard Library and choosing Subclass.
Adding the State and Statistic to MyVehicle
Select MyVehicle in the Navigation window and click on the Definitions tab, States panel to add a discrete state with
Name ‘PreviousDistanceTraveled’ and Unit Type of ‘Length’. This will be used to record the distance traveled at the
beginning of each period (each hour).
Also within the Definitions window, select the Elements panel and add a Tally Statistic with Name
‘DistanceTraveledPerHour’ and Unit Type of ‘Length’. To make this statistic appear beside the existing distance
traveled statistic, under the Results Classification properties, use Data Source of ‘[ Object]’, Category of ‘Travel’ and
Data Item ‘DistanceTraveledPerHour’.
Also within the Definitions window Elements panel add a Timer with Name ‘HourlyTally’ and Time Offset of ‘1’. This
will be used to trigger a process at the end of the first hour and each subsequent hour.
Within the Processes window add a new process with Name ‘RecordAndResetDistanceTraveled’ and Triggering Event
Name of ‘HourlyTally.Event’. This process will be triggered at the end of each hour so we can calculate and record the
travel during that hour and then reset our internal state. Add two steps to this process.
Add a Tally Step with Tally Statistic Name of ‘DistanceTraveledPerHour’ and Value of ‘TotalDistanceTraveled -
PreviousDistanceTraveled’.
Add an Assign Step to assign the State Variable Name ‘PreviousDistanceTraveled’ to the New Value of
‘TotalDistanceTraveled’.
Building the Model
Select Model from the Navigation window and within the Facility window, place a Source and Sink and connect them
with two paths, one from Source1 to Sink1 and the other from Sink1 to Source1.
Within the Source, change the Interarrival Time to be ‘Random.Exponential(10)’.
Change the Source’s Output TransferNode property Ride On Transporter from ‘False’ to ‘True’. Then change the
Transporter Name property to ‘MyVehicle1’.
Place one of the subclassed vehicle objects by selecting MyVehicle from the Project Library on the left. Specify the
Initial Desired Speed to be '0.5' and the Initial Node (Home) to be ‘Input@Sink1’.
Embellishment:
Add a floor label that will display the distance traveled using the Expression ‘MyVehicle1[1].TotalDistanceTraveled’. You can
also display the travel distance within the current hour by calculating it from the expression
‘MyVehicle1[1].TotalDistanceTraveled - MyVehicle1[1].PreviousDistanceTraveled’. An attached label could be made to the
vehicle in a similar fashion but omitting the ‘MyVehicle1[1].’ term in each expression.
Advanced Notes:
210 / 1277
The TotalDistanceTraveled function is very efficient because it is based on a level which is only updated on demand. But if
this function (or any level) is used in certain types of animation and status displays like a floor label or plot, the frequent
updating required may cause noticeable speed degradation.
The changes made to the subclassed vehicle in this SimBit are all “safe” additions, no built-in logic was overridden. This
means that you can confidently update such an object when new changes are introduced by Simio.
211 / 1277
Simio Reference Guide
ReferenceBatchedEntity - SimBit
Problem:
I would like to make a decision based on the state (priority) of a batched entity. The Vehicle that the parent entity should
select is determined by the priority state of the member entity.
Categories:
Combining and Separating Entities, Entity Characteristics, Vehicles
Key Concepts:
Allow Passing, BatchMembers Queue, Before Exiting, Bidirectional Path, Combiner, Condition Based, Current Symbol
Index, Object Reference State, Priority, Ride on Transporter, Selection Rule, State Assignments, Vehicle
Technical Approach:
There are three Sources which create entities that will enter a Combiner. One Source creates what will become the parent
entity and the other two Sources create member entities. One of the member Sources assigns a priority of ‘2’ to the
member entity and the other assigns a priority of ‘3’ to its entities. After entities are combined, they ride on a Vehicle. There
are two Vehicles to select from and one has a priority value of ‘2’ and the other has a priority value of ‘3’. The Parent entity
must have knowledge of the priority state on the member entity because the value of the member entity’s priority must
equal the value of the Vehicle’s priority. The parent entity has an entity reference state which stores a reference to the
batched member entity so that it can use a function to determine the priority of the member entity.
Details for Building the Model:
Simple System Setup
Place three Source objects into the Facility window. Name them Source_Parent, Source_MemberA and
Source_MemberB.
Set the Interarrival Time of Source_Parent to ‘Random.Exponential(.5)’
Set the Interarrival Time of Source_MemberA to ‘Random.Exponential(.75)’ and set the Time OffSet to ‘.2’
Set the Interarrival Time of Source_MemberB to ‘Random.Exponential(.75)’
Place a Combiner object and a Sink object. Connect the Combiner object to the Sink object with a Path. Set the Type
property of this path to ‘Bi-Directional’ and the Allow Passing property to ‘False’. This will allow Vehicles to travel
back and forth on the path and not travel on top of each other.
Connect Source_Parent to the Parent Input Node of the Combiner with a Path. Connect both Source_MemberA and
Source_MemberB to the Member Input Node of the Combiner with Paths.
Place two Vehicle objects into Facility window. Name one VehicleA and keep its color the default blue. Name the
other VehicleB and change its color to red by selecting red from the Color drop down in the ribbon while that
Vehicle object is selected in the Facility window.
Create a Transporter List
Select VehicleA and right click. Select ‘Add to Transporter List’ and then select ‘Create New Transporter List’. Name
this list, ‘TransporterList1’.
Select VehicleB and right click. Select ‘Add to Transporter List’ and select ‘TransporterList1’.
To view this List that was just created with a right click shortcut, go to the Definitions tab and then to the Lists Panel.
Lists can also be created in this window.
Create Additional Entity Symbols
Place a ModelEntity into the Facility window. Select the entityand give it a total of three symbols by clicking on the
Add Additional Symbol icon in the ribbon twice so that the Active Symbol drop down now has a symbol for index 0,
1 and 2.
Select index 1 from the Active Symbol drop down and select a new color (i.e. light blue) and cli