Jump to content


  • Posts

  • Joined

  • Last visited

  • Days Won


Everything posted by agraunke

  1. From the project view, select "Copy from library to edit" and choose the transfer node. Copying from the library breaks inheritance (so you are no longer working with a subclass of a TransferNode), and because of that you can change the definitions of that object. Subclassing only allows one to extend definitions or override processes. My understanding is that this is good object-oriented design, rather than a bug The downside is that since you've copied the object, rather than subclassed it, your new object will no longer be updated as a TransferNode (in future sprints). You will essentially have a brand new object definition and it is up to you to maintain the definition. -Adam
  2. I think "TheCombinersName.MemberInputBuffer.Contents.AverageTimeWaiting" is the expression you are looking for. -Adam
  3. When you bind a data table to an excel file, the file selection interface allows you to select any file on your local computer or any networked folder/server. (The button with three dots next to the "file name" input will pull up the file selection interface). Searching the help for "excel" will give you some more detailed info, too. You can also use the ExcelRead step, in conjunction with the ExcelConnect element if you do not want to use tables and table binding. These are "user-defined" steps and elements that are included with the software. -Adam
  4. The general idea is that you will need a process (maybe at the beginning node?) that uses the search step, and then stores the resulting expression in a state on the entity (such as MyTravelTime). Then, you can refer to that entity state in the travel time property of the time path. travel time --> ModelEntity.MyTravelTime Alternatively, you can refer to the row directly, if (for example), you have an integer state/property that indicates the entity type, and that corresponds to a row in the table: travel time -> Table1[EntityType].TimeExpression (Here EntityType is a state or property that you've set somewhere else, and corresponds to the index of a row in the table). Lastly, you can use the "set row" step in a process to link a row to an entity (or use the built-in Table row referencing properties on the source object). Then, you'd just need to reference the table column in the time expression: travel time -> Table1.TimeExpression -Adam
  5. You can use the search step to give you access to all members of a population. If you want utilization as a response you may have to create a state variable and use a process on run ending. The search would then find all the workers (subject to any conditions, if needed) and then add the desired value to the state variable. Then set the state variable as the response expression in your experiments. -Adam
  6. Is the search step being executed? Have you tried a break point on that step? If tokens are entering that step but not exiting through either the "original" or the "found" branch that would imply a pretty major bug, I think Can you post an example model demonstrating the behavior you are seeing? -Adam
  7. Alternatively, instead of using a mapped drive you can use a network location (i.e. \\servername\sharedfoldername\filename.xlsx).
  8. There are two approaches that should work: 1. Local data with relative file paths. In this case, the Simio model and data file need to be in the same directory as each other, on each computer where you want to run the model. The file path in the binding dialog box would look like the image my first post. A downside is that the data may become difficult to manage if you need it to remain consistent, as it must be duplicated to each machine running the model. 2. Network data source Here the binding info would point to a data source on a network-connected computer/server. The model file will remain bound on any computer that has network access to the linked data source. The data only exists on the network, so there are no concerns with data consistency, but any machine must be able to access the data location for any updates to get pulled into the model. Are you trying either of these, and if so what specific error are you getting? What sprint are you using? -Adam
  9. Will the excel file also be on the other computer(s), or is it network accessible? You can use relative paths for binding-- if the data file is in the same folder as the Simio model, you can just enter the file name: If the data file is on a network, you should be able to update the data from the model running on any computer attached to that network with the appropriate permissions. Also, once imported the data will remain in the table even if the source is no longer available. It won't update if the source data changes, though. -Adam
  10. This is one of my favorite ways to have a server "delay" based on the work content and the quantity of workers available over time (for example, if the activity starts with one worker and then another becomes available part-way through to help): http://www.simio.com/forums/viewtopic.php?f=6&t=2196&p=7149#p7149 -Adam
  11. Just wanted to chime in that I've run into this a lot, too. I notice it particularly when trying to bind tables. The bind and import will work the first time, but I will get an out-of-memory exception if I try to manually re-import the data (although, it appears that the auto-import works fine). Restarting Simio appears to fix the issue, but it is annoying -Adam
  12. Do you have a version of your model that you could post? This is hard to troubleshoot without seeing what is happening. Have you looked at the trace window for the create step? That might tell you what is going on. -Adam
  13. You can use a regular table with 24 rows, one for each of your hourly distributions. Then you can reference each using something like Table1[Math.ceiling(Math.Remainder(Run.TimeNow, 24))].Distribution as a processing time. One thing to note is that Run.TimeNow returns the run time, not the clock time. So you may have to use some offset to line up your clock hour to the right table row. -Adam [edited to fix table row syntax ]
  14. Thanks for the help-- the Gantt chart is a good idea to test sequences. For my next challenge, what about the following sequence: Thanks! Adam
  15. Hi All, Can you please help construct the appropriate task sequence numbers for the following task network? More generally, is there an algorithm for creating task sequence numbers for a network defined by predecessors or successors? Either of the following tables fully represent the graph above, for example. Without an automated approach task sequences will have limited applicability for the size/complexity of networks I am interested in modeling. Thanks! Adam
  16. I don't think you need qoutes around Pass.D. Another option is String.Compare(string1, string2). For your other error, try it without the quotes. Also, are you using single quotes in the Simio expression, or is that just formatting in your post? Because using quotes around the entire expression is incorrect. But I suspect that is not the issue... the best way to get help is to post an example model. Although, I think that the error is not only with your string comparison. I believe Simio uses lazy evaluation of logical expressions (which is supported by the fact that you do not get an error on the AND expression), which means that the first half is what is not evaluating the way you'd expect. So, I'd investigate how you are assigning the flight numbers before getting too caught up in the string comparison. What happens when you use just Candidate.counter.FN == Pass.FN? -Adam
  17. The Member Match Expression is an expression that gets evaluated for each entity in the member input buffer. The combiner will batch all members that evaluate that expression to the same value into a batch size set in the “Batch Quantity” property. So in your case, you would like to construct an expression that will match one each of two types of member entities. We also need to clarify what you mean by entity types. In Simio, you create object definitions that you can then place, or instantiate, in the model’s facility view. A default entity definition called “ModelEntity” is already created for you. If you would like entities with completely different definitions, you must create new object definitions with all the corresponding properties, logic, and states. However, in your case (and many cases) I think you are interested in different instances of the same entity type. So, we can place three entity instances of the object “ModelEntity” in the facility view and name them Entity1, Entity2, and Entity3. Importantly, these entity instances are all the same type of entity… namely, ModelEntities. However, each instance can (and usually will) have different property settings (the most obvious one being the name). Now, we need to find a way to match the member entities. Again, that is done by way of an expression that will evaluate to the same value for the members we want to batch together. I’ll make the assumption that we want to batch one of each member entity in a first in first out (by entity instance) fashion. One way to do so is to create a state variable on the ModelEntity object definition that we can use to count the number of entities created at each source. Then, we can just match member entities that have the same count value. 1. Create the integer state variable in the ModelEntity definition tab. 2. Set the state value to the number of entities produced at each source upon entity creation. In each source that makes member entities, under State Assignments, set ModelEntity.IntegerState1 to Source2.OutputBuffer.NumberExited and Source3.OutputBuffer.NumberExited 3. Batch the entities: Batch Quantity = 2 Matching Rule = Match Members Member Match Expression = ModelEntity.IntegerState1
  18. Are you running Simio in 64-bit mode? http://www.simio.com/forums/viewtopic.php?f=38&t=1537 -Adam
  19. I think the issue is that the value of ModelEntity.StateName is set at the population member level. So, your expression needs to be evaluated in the context of a specific entity or using a reference to a specific population member. Your approach works with the model level state variable because there is no ambiguity in the reference. In fact, I think gocken’s suggestion will result in the same error for this reason. When are you trying to evaluate the expression TableName[ModelEntity.StateName].PropertyName? Which entity population member do you want to refer to? Is the ModelEntity state variable intended to be the same value across the population? If so, Simio does not offer that functionality exactly… you can set a Property value on the entity instance, and state values on the population members, but no state values on the population as a whole (unless this has been updated): http://www.simio.com/forums/viewtopic.php?f=18&t=1030 -Adam
  20. The standard way is to use "Load Library" to load the project with the existing model into your new project. That will give you the option then of just using your object (similar to objects in the standard library)... of course you can then subclass, copy, or clone if needed. -Adam
  21. There are multiple ways to deal with this issue, so I’ll go over my thought process and show you one way that I think will do what you need. You created several object definitions, which is key in Simio’s object oriented paradigm. However, the difficulty comes in interfacing objects with data and processes in the parent model where the objects are instantiated. One indicator that the full object-orientedness is not being used is the creation of multiple processes at the parent model level that do exactly the same thing, only they refer to different object instances in the model. This indicates that either the process is inherent to the object, and so should be included in the object definition or that the process can be generalized at the parent model level and use states/properties of the object instances. Your model has exactly this scenario with the “ChannelCommunication” processes—they are all exactly the same but just pointing at different Channel instances. Your idea of using the API to place the channels is reasonable, but you run into the issue of not being able to create instance-specific processes, as you’ve found. In your case, you make use of a global state array, so I kept the ChannelCommunication logic at the parent level. This allows us to refer to that state array directly. The approach is to reduce all those processes into one process that can take information about each channel instance to update the appropriate state in the array. I noticed you already have a property called “Position” defined on the Channel object, so we have that data available. Now we need a way to run that process from within the Channel object, so I created a process property on the Channel object called "ProcessProperty1". In the Channel’s process “AssignmentToProduct” I added an “Execute” step before “Fire2” with the value of “ProcessProperty1”. Now, in the parent model, we need to delete all but one of the ProcessXX in the ChannelCommunication group—rename that remaining process ChannelCommunicationUpdate for clarity. Next, we need to generalize the values in that assignment step and remove the triggering event name (we are using the execute step in the Channel definition, so we don’t need a specific event to trigger the process anymore). This is a little messy—there might be a better way to do this. My approach is to make use of the location.parent property available on each object. Through trial and error, I found that the object executing the ChannelCommunicationUpdate process is a Product entity in a combiner object in the Channel object. That means we can access the relevant properties on a Channel via the following expression: Product.Location.Parent.Combiner.Location.Parent.Channel Thus on the assignment step the fields become: Row: Math.If(MODE==0,Product.Location.Parent.Combiner.Location.Parent.Channel.Position,Product.Location.Parent.Combiner.Location.Parent.Channel.ProductCreated) Column: Product.Location.Parent.Combiner.Location.Parent.Channel.Position New Value: Math.If(MODE == 0, PlaceOfREF[Product.Location.Parent.Combiner.Location.Parent.Channel.Position, Product.Location.Parent.Combiner.Location.Parent.Channel.Position] + 1, PlaceOfREF[Product.Location.Parent.Combiner.Location.Parent.Channel.ProductCreated, Product.Location.Parent.Combiner.Location.Parent.Channel.Position] + 1) Now, the ProcessProperty1 on each channel instance needs to be set to that ChannelCommunicationUpdate process. For future “builds” of the model, you can either set ProcessProperty1’s default value to be ChannelCommuncationUpdate or set the property value when placing the object. I think that will give you the ability to create an arbitrary number of channel instances via the API and have the logic apply to each instance. Hope it helps -Adam
  22. A quick work-around is to set the add-on process to consist of a single execute step, with Execute -> Advanced Options -> Token Wait Action set to None (Continue). Have that Execute step execute the same seize-delay-release process from my first comment, and you should be able to get concurrent seizing of both the secondary resource and the server during processing. With your approach, it seems like the seize process is at the model level, meaning that the model object is attempting to seize (and release) the resource, rather than the server or the entity. The error message indicates that the release step is trying to release a quantity (1) of resource, but it doesn’t have any quantity of that resource seized. You could try running the model with the trace window open to determine how the model is behaving (i.e. what is trying to seize what, and when). -Adam
  23. A very basic solution is to use a simple add-on process to your server. Create an expression property (in the definitions tab) called something like “FixedResourceTime” and give it the appropriate time units. Then, on your server, create an add-on process for “Processing”. This add-on process will be a simple seize-delay-release, with the delay step using the “FixedResourceTime” property. Some considerations: what happens if the fixed time is greater than the processing time? Is this behavior on more than one server instance? If so, consider sub-classing the server to build the behavior internally and to allow for more general use. Also, advice on the forums will be much more helpful if you can include a model with the behavior, or at least describe the error in more detail -Adam
  24. Ok, good to know. I’ve come across the Academic/Commercial divide with example models here on the forums, so I wasn’t sure about between other license types. I have a related feature request: it would be nice to open/run/save a model with a specific license type (“below” the license in use). The example use case is that I am developing a model for a customer who has Team Edition. I have Enterprise Edition, but I want to make sure that I am not using any Enterprise-only features so that I can guarantee full functionality of the model upon delivery. Thanks! -Adam
  • Create New...