in a project, that I'm currently working on, I have the following situation:
I have network of two-lane tracks connecting different stations and transporters that run between them. The transporters have individual schedules and set their speed according to the track length to the next station and the scheduled time difference.
My Problem is, that some of the transporters may share the same schedules (so same speed and basically the same position), whereas others use the same track but need to be faster to arrive at their destination on time.
Therefore my transporters need to be able to overtake each other. Accordingly to an older forum topic (http://community.plm.automation.siemens.com/t5/Plant-Simulation-Forum/Can-a-Transporter-overtake-on-...
I tried implementing a CollisonControl. This works fine, as long as there is just one transporter to overtake.
In Order to overtake multiple transporters, my first idea was to use:
while frontobj/=VOID AND self.~.speed-frontobj.speed>0.1 loop
But the Problem with this code is, that it will run through all MUs, that are on the same track as my Transporter and in front of it. So in an extreme case, my transporter can jump the whole track but really only needs to overtake 2 transporters.
I also tried using the contenttable with a kind of bubblesort algorithm.
I added an extremly simplyfied version of my problem (multiple transporters with different fixed speeds and my test collision control).
In this model, you can see my two approaches for switching places:
1. put the slower transporter on a dumy, move the faster transporter ahead and reinsert the slower transporter again. repeat until there are no more slower transporters directly ahead.
2. shrink the two transporters, let them switch positions on the track and resize again. also continue until there a no more slower transporters directly ahead.
But as you can see when running the model, both of the described algorithms don't work.
So, please if anybody has an idea on how to fix my basic problem, let me know.
Thank you for reading and thank you for any suggestions.
Solved! Go to Solution.
here you see a "brute force" overtake mechanism (collision control; try to move back until it was successful). In this case you need some additional lanes for overtaking. It is more effort while creating the model, but the behavior is much better than the beaming of the transporters (and it remembers a little bit on the "German Autobahn").
thank you for your answer and approach for fixing my problem. It really reminds me of the autobahn and is quite mesmerizing to watch.
Unfortunatelly, working with additional overtaking lines does not work for me because it would require a lot of work on a quite complex model. Furthermore, I discovered that at some point (3:12:26 for your model) the simulation runs into a gridlock because of too many suspended methods.
I also took your brute force approach and adjusted my collision control to work without additional tracks, but here I have the same problem (see attached model).
Are there any other ideas?
brute force 2: insert works better than move; just try to insert the transporter infront at increasing distances
Thank you very much.
Using moved:=self.~.insert(...) did the trick and on top your method is also a lot faster.
I have the same problem, but on a single track.
Currently i use this method to let my transporter overtake.:
if @.collided then
But if i have two transporters with a similiar speed, the third one can not overtake any longer and there will be a queue.
Do you have an idea how to adjust your method?
Thank you very much!
you will find the transporter infront with frontMU (if there is one), so you can check, if there is infront of the transporter infront another transporter, check its frontPosition, if it is inside the distance of your jump --> calculate a new distance ( e.g. @.frontMU.frontMU.frontPos+@.length) for the jump