I am modelling earthmoving operation. Every trench agent seize two transporters, one excavator, and one truck. When truck is released it will do some other job before been seized again by the same trench. So this process repeat until the trench will be empty.
The process is occuring for two three times without any problem but after two three times the trench agent is not go out of the seizeTransporter block (the one that seize truck). I have a delay block after the seizeTransporter block and it use Maximum Capacity. So it should not be a problem and it should not prevent the seizeTransporter block out port to push the trench out.
I noticed this is hapenning when the truck stop to resolve a collision. It looks like the collision cannot be resolved and the truck stay where it is for ever. :))
I have tried so many things that could solve this problem but none of them works.
There is an option in the material-handling library TransporterControl element to override transporter conflicts after some time. Maybe reduce the default timeout of 10 model time units, see below:
Related
I am trying to simulate manufacturing process by using statechart. And i have created agents for particular machines by statecharts and connecting those agents according to manufacturing process with help of resource pool, seize block and release block
My agent is passing through the resource pool and seize block. And I am expecting to run the model one after another seize blocks. However, when I run the model my all three statcharts are active at a same time, which I do not want. can anybody suggest me a possible way to avoid simultaneous process?
I'm assuming your manufacturing processes don't take 0 time. You're missing Delay blocks, causing all your blocks to execute at the same, instantaneous moment.
On a side note, what you're showing us isn't a statechart, but a flowchart.
I want to halt patients (agents) from seizing treatment rooms (resource) from two resource pools until one of the pools has one room available. This because once the patient has seized from one pool, it will be blocked to evaluate seizure from the other. I've tried to use "recalculateResourceChoiceConditions()" to fix this problem.
Now, I tried using a Hold block which in my head should work perfectly as long as the blocking condition is "(TreatmentRooms.idle() + TreatmentRooms1.idle()) == 0 ". This, however, yields a logical error saying that the agent cannot leave the previous block. Is there another block I can use to emulate the wanted logic, or is there something I can do with the Hold block to circumvent this error?
You need a queue ahead of the hold block. "Hold" does not come with its own queue.
I'm a new AnyLogic user so hopefully this is a simple problem. I would like to use a block as to represent a storage area for items to be used in an assembly, I am using the delay block with delay time of 0, but maybe the queue block would be more appropriate? I have set up a model in which every X number of seconds a "truck" arrives and if the delay block contains less than a specified capacity of elements, the inject function is called to refill the block. This sort of works, but is seems that the agents are flowing through the delay block's out port and thus do not count toward its capacity (that makes sense to me...) resulting in my source blocks continuing to create agents when the system isn't ready for them. My delay block is followed by a "move by transporter" block which seems to be getting all of the delay blocks outputs immediately. There are only two transporters in my model and I am not sure why more than two agents can be accepted by the transporter block at a time. I set my transporter fleet to have a capacity of 2 but that did not solve the problem.
Any advice would be helpful! Perhaps a different approach is needed. My goal is to have an essentially unlimited pool of parts at the inlet of the factory, but only create agents when the downstream processes are able to pull them in. Thanks in advance!
Welcome to SOF :)
Best use a "Wait" block here:
Let your trucks dump stuff into "Wait" whenever they arrive. Your downstream block can now pull them when they are ready using myWaitBlock.free(someAgent for as many agents as they want to pull from it.
Similarly, you can use a Delay with infinite capacity and set its type to "Until stopDelay() is called". Then similarly as the "Wait" block, you call myDelayBlock.stopDelay(someAgent) when you want.
Another option: Use a hold-block in front of a normal (infinite) queue and unblock it when ready: myHoldBlock.unBlock(numToLetThrough) --> probably the easiest
PS: Please also check how to ask good questions here on SOF, yours is very long, much easier to understand with some screenshots :) --> https://stackoverflow.com/help/how-to-ask
I have a model that generates a total of 5 loads, each load generated every 2 seconds. When the 5 loads are waiting to be transported, only 1 transporter is called. The transporter fleet has 9 vehicles here.
I have tried to use a seize transporter block before the convey block, but that only results in 5 transporters queuing at the conveyor for the loads to be generated and picked up.
How can I call a transporter for each of the loads? (In the solution, 5 transporters should be called when they enter the conveyor) Thanks for your help in advance, I am stuck.
EDIT 1
I tried out a suggested approach, but my method only generates new transporters with the agent name "Car". How can I call Cars from the existing transporter fleet?
As usual, many ways :-)
One could be to create a separate flowchart for your transporters. When a package enters the top conveyor, it can trigger 1 transporter to MoveTo the end of the conveyor location. For that, add a MoveTo block into the new, separate transporter flowchart.
This will make transporters waiting at the conveyor exit, ready to pick up stuff.
Be careful, though, to only summon transporters that are idle anyway.
cheers
I'm new to Anylogic, and I was wondering if it's possible to have two queues go into one delay block. I'm trying to simulate products coming from 2 separate welding robots that then go into a sandblasting (delay block) installation. This installation can either blast 3 products from one robot or 1 from the other robot.
Maybe it's also possible to have one delay process be blocked as long as the other one is working, and then unblock it as soon as the other one is finished?
Here's a picture of the process.
So this is one way of doing it... I added hold blocks after each queue... one of the hold blocks is initially blocked.
I added a button to toggle the state of the hold block:
hold.toggleBlock();
hold1.toggleBlock();
This is the basic structure... of course the way you block/unblock the holds is up to you.