Jump to content

dsturrock

Simio Employee
  • Posts

    1,654
  • Joined

  • Last visited

  • Days Won

    52

Everything posted by dsturrock

  1. 1) Look at the SimBit EntityFollowsSequenceWithTable2, it is very close to what you want to do, including entity-specific processing times. If that is too much to digest in one SimBit, that SimBit is actually the 4th SimBit in a set of similarly named SimBits - work your way through them. 2) Look at the new features added in Sprint 119. This is another totally different way of implementing sequential and parallel activities.
  2. Attaching your model would be helpful so we can see what you are doing. Are you specifying random number streams? Have you incorporated any replication-specific logic in your model? To greatly oversimplify... you could think of every replication 1 uses seed 1 for every scenario. Every replication 2 uses seed 2 forevery scenario. ... So if you set up 5 identical scenarios (e.g. the controls are the same and the reps required are the same) then they all use the same pseudo-random numbers and you will get identical results for each rep of each scenario. But each rep 2 will be different than rep 1 because it is using a different seed. As soon as you change anything from scenario 1 to scenario 2, then you will probably cause the streams to be pulled in a different order and then generate different results.
  3. Try this: It works for all constructs currently placed in your model.
  4. You could rank the queue Low Value First based on Entity.Priority. Just before the entity arrives at the queue assign its priority to TimeNow, or assign it to 0.0 if you want to push it to the front.
  5. I believe that the behavior you are asking for is the default behavior for an on-demand vehicle. It will accept reservations only for entities moving from the same location to the same destination. But regardless, you can add some process logic to the Evaluating Transport Request add-on process to only allow the pickups that you desire (e.g. if it's empty take any entity, if its not empty only accept entities that have the same destination as the first entity).
  6. If you look at the trace it shows you that the last thing that happens is the vehicle is waiting for its dwell time to end. Your vehicle is specified to Dwell Until Full - this applies at every node. You need to use the Dwell Only If property to specify which nodes where you want to wait for that condition. For example: Vehicle.CurrentNode==TransferNode1
  7. You can do it with the Server, but Workstation has that exact functionality.
  8. Here is Petr's model with some animation to make it look more like a lock.WaterLockByTulach.spfx
  9. Petr, Good idea to think of it as an elevator. Look at SimBit: Simple Elevator Object for an example.
  10. It sounds like you already discovered the easiest approach. That approach is most applicable when the resource is something like a fixture that truly is seized and held. Note that you can do that with any object. The Server makes it easy to do with properties, but in any other object you can use Seize and Release steps in an add-on process. If instead you just want periodic access to the same resource used previously, it is slightly more difficult, but you can do that too. Look to SimBit: Seizing Same Resource From List for an example of that.
  11. Its a little bit tricky because you can't remove entities from a link and often the first entity in the queue is already transferring onto the link. The basic concept is to periodically (I used a Timer) Search for all entities in that queue that are not currently transferring, then for each match, Remove it and do something with it (I reset its destination and sent it to Sink2). In this example I clear the source buffer every two minutes.ClearingSourceBuffer.spfx
  12. Without a custom object, you can create an integer state (call it WIP) and two simple add-on processes which do the job: From the Entered add-On Process Triggers you have a process called IncrementWIP which contains an Assign that increments the state WIP by 1. From the Processing add-On Process Triggers you have a process called DecrementWIP which contains an Assign that decrements the state WIP by -1. In each of your servers you would reference those same two processes. The State WIP would contain the total, and you could create a StateStatistic Element on it to report its statistics.
  13. A schedule period (day) represents one calendar day (24 hours - 0:00 to 24:00). While you can have as many disjoint work periods in a day as you want, you cannot have a work period that itself spans multiple days. When you are defining the work periods for Monday, you cannot talk about Tuesday. Assuming that your shift schedule begins at 7am Monday and each of the shifts works 5 consecutive days: -On Monday your 3rd shift would work 11pm-Midnight. -On Tuesday-Friday your 3rd shift would work Midnight to 7am and 11pm to midnight. -On Saturday your 3rd shift would work Midnight to 7am. Of course you might also need to factor in some break periods if appropriate.
  14. OnRunInitialized could have multiple Execute steps with the Token Wait Option of None. So each set of servers would have its own process and its own repair time state. Or, as you seem to have discovered you can bypass the OnRunInitialized option, simplify the processes and simply have a Timer dedicated to each server group and that timer is what initiates the process.
  15. So if i understand correctly, you want all of the servers to fail at the same time, then get repaired at the same time? You could do it with a custom object, but perhaps there is a simpler way. 1) Create a Process that has 3 steps: -Delay until next Failure time. -Assign a custom state (for example TimeToRepairMyServers) a value drawn for a distribution. -Fire an event (like FailMyServers), then connect to input side of Delay to cause it to repeat the logic. 2) In each server's Reliability Logic: -FailureType: Event Count Based -Event Name: FailMyServers -Count Between Failures: 1 -Time To Repair: TimeToRepairMyServers All your servers will fail at the same time when the even is fired. And all will use the current value stored in TimeToRepairMyServers as their repair time.
  16. You are correct that the automatic "Entered" event on a node fires whenever any entity enters that node. Unfortunately a Vehicle is a type of entity. So a vehicle delivering an entity causes the event to fire twice, once when the vehicle arrives and once when it delivers the entity and IT arrives. The solution involves: 1) Create a custom event on the Definitions>Events tab. 2) Trigger that event. Perhaps the easiest way is to add a process the the Sink Entered (Sink>AddOnProcessTriggers>Entered). This process can be a single Fire step that triggers that new Event. 3) Change the source to use that new event. Here is an example:EntityArrivalEventToSink.spfx
  17. Schedules are associated with resources. The standard library Source object does not have a resource because there was no obvious purpose to it. You could certainly create your own implementation of Source that has a resource and lets that resource follow a schedule. Why are you looking to have Source follow a schedule? If it is to control entity creation, there are several obvious ways (Arrival Mode) and less-obvious ways (creative use of more advanced Tables, Functions, and Schedules) of doing that.
  18. Basically use a Decide to take action based on their difference. How are the entities different? If they are different entity types (objects or instances) you can use the "IS" function (e.g., Is.PartA) Or perhaps they have different state values? Just check that value (e.g., ModelEntity.Priority==2)
  19. All tables must be defined in the top level model. The tables can be passed as repeat groups into another object.
  20. It sounds like you need an intelligent object. The details of your system might dictate where that intelligence is built. For example, perhaps the machine is "smart" - e.g. it has process logic that interacts with others. It might determine when it seizes a secondary resource if an extra setup time is required. Or perhaps the secondary resource itself is smart. It know the details of its current state and location, and what it was working on last. It can decide when it is asked to do a new task (seize request) if some setup will be required.
  21. See SimBits: SelectEntityTypeFromTable and AppointmentArrivals. I think they will help.
  22. Look at SimBit KeepQueueTimeForLast10Entities. While this actually does much more than what you need to do, the basic approach is the same. Essentially just before an entity enters a queue (Entered process) you record the time on an entity state. Then when you leave the queue (BeforeProcessing process) you calculate the time it spent n the queue and if it exceeds the threshold, then you record it in a Tally.
  23. If jumping from position to position is adequate, I might try a Storage with its queue animated. If you need more detail than that, I would probably create a custom object with the entities moved exactly how and where you want them using Free Space.
  24. What your subject line asked is covered exactly in a SimBit. What your message asked for is slightly different, so I'll answer that here. One way, if you have a fixed number of rows is to explicitly reference the table data in a distribution. For example Random.Discrete(Table1[1].CumProb, Table1[1].Value, Table1[2].CumProb, ...) Probably the easiest and most flexible way is to use the built-in RandomRow function in an expression like this: Table1[Table1.Weight.RandomRow].Value This uses a column named Weight to select a row, then goes to that row to return the value from another column named Value. Here is an example (done in 7.114):AssignmentFromTableBasedOnRandomRow.spfx
  25. Another approach might be to use a Time-Index Table. Here is an excerpt from help: Time-Indexed Table Properties Within the properties of a data table, under the Advanced Options section, is a Time-indexed property that may be set to 'True' or 'False'. By default, all tables are set to 'False'. By changing this to 'True', additional properties for the table, such as Starting Time, Interval Size and On Interval Process may be specified. Within a time-indexed table, you can then have a column(s) of values within the table and retrieve a single value from the column, not by direct indexing, but indirectly, based on the current simulation time. The values within the table can be accessed using a function for time-indexed tables. TableName.PropertyName.TimeIndexedValue: returns the value of the property in the row that corresponds to the current simulation time. If the current time is out of range of the table's rows, then this will return either the first row's or last row's value for the requested property.
×
×
  • Create New...