# Programmierstrategie für ein monoschienen Transportsystem



## drfunfrock (15 August 2004)

Wir haben hier eine Anlage mit einer 
"Einschienenbahn" von Montech, so dass die 
Produkte von Station zu Station gefahren werden 
können. Eigentlich ganz nett die Sache, nur soll 
ich jetzt die Anlage neu programmieren und mir 
ist die Strategie noch nicht so ganz klar, denn 
auch Parallelstrecken mit Weichen sind möglich, 
um die Kapazität zu erhöhen. Wir haben hier auf der Anlage bis zu 30 Wagen laufen.

Bisher hatte ich das so gedacht, dass ich eine 
globale Liniensteuerung habe, die für jede 
Station ein Array mit den Wagennummern 
verwaltet, die Platz vor einer Station finden können. 
Zusätzlich wird noch eine Variable angelegt, die 
jeweils auf die nächste Station verweist. Damit 
lässt sich eine verzweigende Weiche (Station) 
gut verwalten, aber eine zusammenführende nicht. 
Ich möchte verhindern, dass im Code der 
Stationen irgendetwas von der Liniensteuerung 
auftaucht, um die Komplexität in Grenzen zu 
halten. Eine Station braucht daher auch nichts mit der Liniensteuerung zu tun zu haben.

Vielleicht kennt jemand eine bessere Strategie?


----------



## Zottel (15 August 2004)

Ohne die Anlage zu kennen:
Ich würde den Wagen einen Zustand zuordnen. Dieser besagt, wo sich der Wagen befindet, entweder in einer Station oder auf einem bestimmten Abschnitt dazwischen. Ein weiterer Zustände könnte einen Wagen als "nicht im System" bezeichnen.


Ein Fahrauftrag wäre zunächst durch Start und Ziel definiert. Den Teilstrecken würden "Kosten" zugeordnet, z.B. im einfachsten Fall die Länge. Das Programm addiert die Kosten der Teilwege für alle möglichen Wege zum Ziel und nimmt den mit der niedrigsten Kostensumme. Teilwegen, die in mehreren oder vielen Strecken auftauchen, kannst du höhere Kosten zuordnen, so daß sie nach Möglichkeit gemieden werden. Dies sollte zu einer besseren Verteilung der Auslastung führen.

Welcher Wagen einen solchen Auftrag ausführt, kannst du entscheiden lassen, indem für jeden verfügbaren Wagen die Kosten der Leerfahrt vom Standort zum Start ermittelt werden.

Falls das Durchfahren des gleichen Streckenabschnitts verlangt, das ein Wagen darauf wartet, daß der vorige den Abschnit verläßt, und du hättest hier auch die Möglichkeit, einen Parallelweg zu fahren, so kannst du zunächst einen Fahrauftrag bis zu dieser Stelle generieren. Wenn der Wagen dort angekommen ist, wird ein weiterer Fahrauftrag generiert, wobei momentan belegten Abschnitten dynamisch höhere Kosten zugewiesen werden.
Dabei kann es aber dazu kommen, daß ein Weg gewählt wird, bei dem eine Wartesituation an einer jetzt noch freien, bei Ankunft des Wagens aber belegten Teilstrecke entsteht.
Um dies zu vermeiden, müßtest du für jeden Fahrweg eine Weg-Zeittabelle erstellen. 
Die durch die Fahrt belegten Abschnitte erhalten dann für die Zeit der Durchfahrt erhöhte Kosten und ein weiterer Fahrweg müsste mit diesen zeitabhägigen Kosten geplant werden.

Du kannst auch Kosten für das Umstellen von Weichen festlegen, falls das lange dauert oder Verschleiß mit sich bringt.


----------



## drfunfrock (15 August 2004)

Zottel schrieb:
			
		

> Ohne die Anlage zu kennen:
> Ich würde den Wagen einen Zustand zuordnen. Dieser besagt, wo sich der Wagen befindet, entweder in einer Station oder auf einem bestimmten Abschnitt dazwischen. Ein weiterer Zustände könnte einen Wagen als "nicht im System" bezeichnen.



Ich sehe schon, dass ich ein wenig ausführlicher sein sollte. Die Wagen laufen völlig selbstständig bis zu einer Stop-Marke. Erst nach einem Start-Signal geht es weiter. Jede Stop-Marke gilt als Station. Da die Wagen auch vor Weichen halten, gilt eine Weiche als Station, ebenso wie die Start-Strecke. Jede Station verträgt eine bestimmte Anzahl Wagen, der erste ist jeweils in der Bearbeitung oder wartet auf ein Start-Signal.
Die Stationen werden einfach der Reihe nach durchlaufen. Gibt es 2 parallele Stationen (Gleiche Funktion), dann wird einfach nach Füllstand entschieden, wo der Wagen hin soll. Deswegen habe ich auch die Arrays vorgesehen, die jeweils Nummern der Wagen in der Station aufnehmen. Das Problem, dass ich habe, ist, dass Weichen entweder 2 Nachfolgestationen oder 2 Vorgänger haben. Ansonsten ist die Steuerung fast trivial. Wenn die Liniensteuerung die Station anweist einen Wagen loszuschicken, dann übergebe ich die Wagennummer dem Array der nächsten Station und lösche es aus dem Stationsarray für die Verwaltung der Wagen.

Dein Vorschlag würde darauf hinauslaufen, dass man parallele Wege hätte, eine Idee die sich hier nicht realisieren lässt, da die Anlage fertig als Kette aufgebaut wurde und am Ende wieder auf die Startstrecke zurückführt.

Aber die Idee mit den Zuständen für die Wagen bringt mich auf die Idee, dass man diese Weise einen Anlagenstopp in den Griff bekommt. Und vielleicht sollte ich die möglichen Wege, über verkettete Structs realisieren?

Vieleicht gibt es zu diesem Thema auch eine Weebseite?


----------



## Zottel (16 August 2004)

> zusätzlich wird noch eine Variable angelegt, die
> jeweils auf die nächste Station verweist.


Wozu ist die nötig?


> Damit lässt sich eine verzweigende Weiche (Station)
> gut verwalten, aber eine zusammenführende nicht.


Warum?


> . Gibt es 2 parallele Stationen (Gleiche Funktion), dann wird einfach nach Füllstand entschieden, wo der Wagen hin soll. Deswegen habe ich auch die Arrays vorgesehen, die jeweils Nummern der Wagen in der Station aufnehmen. Das Problem, dass ich habe, ist, dass Weichen entweder 2 Nachfolgestationen oder 2 Vorgänger haben.


Du musst die zusammenführende Weiche steuern, damit sie einen Wagen vom Zugang A oder B aufnehmen kann?
[/quote]


----------



## drfunfrock (16 August 2004)

Zottel schrieb:
			
		

> > zusätzlich wird noch eine Variable angelegt, die
> > jeweils auf die nächste Station verweist.
> 
> 
> ...


[/quote]


1) Wenn ich eine Variable auf die nächste Station vorsehe, kann ich alle Stationen der Reihe nach in einer FOR-Schleife abarbeiten. Alle Infos über eine Station werden in einer Struct abgelegt. Diese wiederum liegt dann in einem Array für alle Stationen.. Somit habe ich über den Index stets elle Infos über eine Station.

2)  Eine zusammenführende Weiche ist eine, wenn eine Strecke C die Wagen von Strecke A und B aufnimmt. 

Mein Ziel ist es, dass die Anlage erweitert werden kann, ohne die Programmstruktur zu ändern. In der Vergangenheit ist dieses mehrmals geschehen,  so das nun ein Chaos herrscht. So will ich verhindern, dass Code von der Liniensteuerung im Code für die Stationen auftaucht. Weiterhin muss ich aus Wartungsgründen parallele Strecken mit gleicher Funktion abschalten können.

Bald bekommen wir Erweiterungen für leicht variierte Produkte und ich muss damit rechnen, dass wir parallele Strecken bekommen, die nicht funktionsgleich sind. Es gilt zwar weiterhin, dass die Wagen einfach von Anfang bis Ende die Strecke durchfahren, aber auf unterschiedlichen Wegen. 

Eine Datenstruktur für so ein Problem ist nicht leicht zu entwerfen. Ich frage mich, ob ich da den richtigen Weg einschlage.


----------



## Limbo (25 Oktober 2004)

Du mußt das Problerm so Lösen, dass Du einer zusammenführende Weiche eine Station (Staustrecke) hinter der Weiche zuweist. So hast Du es ja auch bei der verteilenden Weiche mit Station (Staustrecke) vor der Weiche gelößt. 

Wie bei der großen Eisenbahn wird der zuerst kommende Wagen vor der zusammenführenden Weiche auf seinem Zweig (A) von einem Sensor erfasst, und stellt sich die Weiche in seine Richtung. Die Zufahrt über den anderen Zweig (B) wird dabei gesperrt, bis sich ggf. der nächste Wagen auf dem Zweig (B) kollisonsfrei hinter dem Vorläufer einreihen kann.

Limbo


----------



## drfunfrock (26 Oktober 2004)

Limbo schrieb:
			
		

> Du mußt das Problerm so Lösen, dass Du einer zusammenführende Weiche eine Station (Staustrecke) hinter der Weiche zuweist. So hast Du es ja auch bei der verteilenden Weiche mit Station (Staustrecke) vor der Weiche gelößt.
> 
> Wie bei der großen Eisenbahn wird der zuerst kommende Wagen vor der zusammenführenden Weiche auf seinem Zweig (A) von einem Sensor erfasst, und stellt sich die Weiche in seine Richtung. Die Zufahrt über den anderen Zweig (B) wird dabei gesperrt, bis sich ggf. der nächste Wagen auf dem Zweig (B) kollisonsfrei hinter dem Vorläufer einreihen kann.
> 
> Limbo



Danke für den Tip! Ich bin aber auch schon drauf gekommen. 

Doc Funfrock


----------

