Jump to content
Simio Forum

Welcome to the Simio Forum

Welcome to the Simio Forum! Experience the full experience of the forum by becoming a Simio Insider! You must be an Insider to post on any forum!



Simio Employee
  • Content Count

  • Joined

  • Last visited

  • Days Won


Posts posted by KatieP

  1. Off Shift Rule is a List Property.  The list is inside the server, but when referencing it, you need to create a list on the main model too.  First Create a string list with 2 rows SuspendProcessing; FinishWorkAlreadyStarted (in that order).  Then create a table with a List Column (in Standard Property).   Set the List Name to the List you just Created.  



  2. If you mean that an entity should not advance to the next location unless it is available:

    Try using Node Lists when routing entities to the next location. Lists automatically block the entity from moving forward if the destination server is not available.

    1. Create a node list in Definitions>Lists

    2. Set the input and output buffers to 0 on your servers

    3. On the output nodes, set Entity destination type to "Select From List" and choose the node list.

    If you mean you have a group entities that are processing at different servers and none in that group can advance until all are processed:

    Use a Wait step and event. After each entity finishes, trigger the wait step to wait for an event. After the last entity finishes, fire the Event. You will probably also use a Decide step to separate the non-last entities (wait for event) from the last entity (fire event).

  3. If you want to change the capacity of the server at Initialization, create a control property and reference this control value on the Capacity property of each Server. If you want to change the server capacity during the run Assign the variable ServerName.CurrentCapacity the new value. If all workers are always working at the same server, you may want to just batch the orders together then seize the correct number workers (actually, you wouldn't even need to increase the number workers).

    If one of the above solutions does not help, please attach a model to clarify what you are trying to do.

  4. The problem is that when the Vehicle is not moving, the Vehicle does not seize itself, so it is not one of its Seized Resources. The Second Search will not find the Vehicle. If the vehicle is the only thing that seizes the Grutier and IAccrocheur, then you don't need the 2nd Search. The ResourceOwner of the Worker is the Vehicle, so you don't need to search the Vehicle's Seized Resources. If entities can also seize the workers, then split logic for vehicle seize and entity seize.

  5. Hi,

    The Decide step is looking a the variable ModelEntity.CustWaitTime but that state is never assigned a value so it is always False. Also this state is a DateTime state, but should probably be a Real State instead with the Units of Time. Assign the state a value or just use 'TimeNow - ModelEntity.TimeCreated > (5/60)' expression.

    To use a Tally as a count, I would recommend just using the Number Observations result (automatically recorded) and either set the Expression to '1' or actually record something like 'Run.TimeNow - ModelEntity.TimeCreated'. You cannot use the TallyStatistic Name in the expression.



  6. 1. If you look at the results in the pivot grid for your vehicle, you will see that the Resource State Time Offshift Busy is very high. This means your Vehicles are still processing (utilized) after they went offshift. Scheduled utilization is based on how long the Resource is utilized vs how long the Resource is scheduled to be onshift. By default, Resources finish processing their current entity before going offshift, during this in bewtween time it is a state called OffshiftBusy. You have to put additional logic if you want something different to occur. Look into the Interrupt or Suspend/Resume steps.

    2. None of your Entities are Destroyed. There is no Sink object in the Pivot Grid because no entities ever enter it (usually it is shown in the pivot grid). If you look in Trace, you'll see that none of the Entities are ever sent to the Sink. The entities are routed using a Sequence Table, but the Sequence Table does not have a row for Input@Finished...The sequence restarts if it gets to the end of the sequence.

  7. ExcelRead only reads String and Numeric values. These string values cannot be applied to an object type state. However, you can bind your Excel file to our Tables and import your data in that way. Attached is model that demonstrates this. First, bind the Excel file to a Data table: Create a data Table (no columns), Bind to Excel file, Change Column Type to Object>Node, and Import data. Check out Help Topic Importing and Binding To Tables for more info on binding. Import can be set to Automatic (default) or Manual. Then modify your process logic to use a SetRow step instead of ExcelRead, start ExcelRow as '1', and set the Transfer and SetNode to reference the table.

    TableBind Node Reference State variable.spfx

  8. Tally Statistics are more for recording the same numeric expression throughout the simulation.

    You should use the Write or ExcelWrite steps under User Defined steps in the Processes tab. The Write step write data to a csv file and is usually faster than writing to an Excel file with ExcelWrite. Check out the SimBits Writing To A File and Excel Read Write. You can record numeric and string value. The Date expression should look like 'String.FromDateTime( TimeNow, "MM/dd/yyyy HH:mm:ss")', and then Excel will convert the string to a date if need be. For the Entity ID the expression would be 'ModelEntity.ID' and for the Server name use the expression 'Server.Name'.

    If you only want to write data in interactive mode and have an Enterprise license, you can use an Output Table. SimBit Using Add Row And Output Table Enterprise

  9. If you are searching a table, then there is no candidate. The expression should look like 'TableName.ColumnName==ModelEntity.StateVariable' . The row for which this expression is true, is the row that is references by the Found branch.

  10. The Server knows that there are 20 units on the pallet, but it cannot access the individual processing times for each product without using process logic. Use a Search step to find all the units on the pallet and add the individual processing times to a state on the pallet, then use this state variable as the processing time on the server.

    To do this, use a process on the Before Processing trigger. Add a Search step to search the QueueState 'ModelEntity.BatchMembers' (and set the Limit property to 'Infinity'). Create 1 state variable on the model - TempStateName, and 1 on the ModelEntity - TotalProcessingTime. Then on the Found branch put as Assign step to assign a State variable the value of the individual processing time for each unit. Setup the Assign state like the following: State Variable: TempStateName, New Value: TempStateName+ (Unit processing time). TempStateName is a variable used to collect the sum of the unit processing time and save that value to the state on the pallet. Then on the Original branch put another Assign step:State Variable:ModelEntity.TotalProcessingTime, New Value: TempStateName. Then add an Assign to reset the TempStateName to 0. On the Server's Processing Time property, put 'ModelEntity.TotalProcessingTime'

  11. One way is to change a variable when a Worker is seized, and check that variable in the Worker_EvaluatingSeizeRequest process. If the variable is 1, accept the request, but if it is 0, reject the request because the Worker still needs to transport the other entity. In the attached model, the variable Worker.priority is changed to 0 when the worker is seized and back to 1 when the entity is unloaded in process Worker_Unloaded. Worker_EvaluatingSeizeRequest checks the value of Worker.Priority to accept/reject seize request.

    In sprint 7.123, you can reserve the Worker so it can't be seized by other entities. Since the model is very simple, this method works well. There are other ways to model this, if this method does not work.



  12. Try using the Rate Scale Factor on the Source for Rate Table. The Rate Scale Factor can be used to increase or decrease the values in the Rate Table by a given amount. For example, to increase the Rate Table values by 50%, the Rate Scale Factor should be 1.5. Set the Rate Table Factor as a state variable that changes everyday.

  13. Create a Model Entity variable and assign each Entity Type a different value (1,2,3,...). On the Workshedule Day Pattern, put the variable number for the entity the server can process for the time period in the Value column. Then use the Evaluating Seize Request Add-on Process Trigger on the Server. On the process logic put a Decide step with expression: ModelEntity.StateName==WorkSheduleName.Value(TimeNow). On the False branch put an Assign step with variable Name: Token.ReturnValue and New Value 0.

  14. One way to do this is by using a Process. Create a table with a string column (PartType) and an expression column (ProcessingTime). Create a new token(MyToken1) in Definitions Tab with a real state variable: Index. Set the process to be triggered by a timer which is set to 24 hour interval and set the token class to MyToken1. Use a Search Step with Collection Type: TableRows, Table Name: Table1, Limit: Infinity, and Save Index Found: MyToken1.Index. On the Found branch use a Create step to create a new object Entity Type: Parts. On the Created branch use a SetRow step with Table Name: Table1 and Row Number: MyToken1.Index and a Transfer Step. Set the Server Processing Time to Table1.ProcessingTime. Rename the DefaultEntity parts. The entities are all the same Entity Type. You don't need a source.

  15. It looks like both the person and bag are from the same EntityClass: ModelEntity. Assuming that is true, before the CreateStep put Assign: Variable: ModelEntity.StringStateName New Value: ModelEntity.Name On the Create Step, set Create Type:CopyAssociatedObject and EntityType:Bag. ALL the personEntity states and properties overwrite the bagEntity's. If bag entity has settings that shouldn't be overwritten then you can subclass ModelEntity to make a bagEntityClass. If the bagEntity is from a subclass of the ModelEntity, then only states and properties in common change. No additional Assign is needed. The person and bag EntityClasses could be unrelated. If so, an additional assign Step is needed after Create with Variable: BagClass.StringStateName1 & NewValue: ModelEntity.StringStateName Then only that state changes.

  16. 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.

    The SimBit Top Level Model (from project Hierarchy With Tables) is an example of using repeating groups.

    In Help Using A Custom Object In A Model: Data Tables explains how to move your data from the submodel to the main model, map it to the Repeating Group and convert the submodel table to a repeating group in a few short step.

  • Create New...