Jump to content

Korrespondierende Listen und Tabellen in der Ereignisverwaltung


BahnLand

Empfohlene Beiträge

Hallo @Neo, @Goetz, @prinz und alle anderen, die schon Erfahrung mit Listen und Tabellen in der Eregnisverwaltung gesammelt haben,

bisher konnte ich mich bei meinen Ereignissteuerungen erfolgreich um Listen und Tabellen herumdrücken. Doch mit der Absicht, ein vordefiniertes Bahnhofsmodul zu bauen, mit dem Bahnhof-zu-Bahnhof-Verbindungen bis auf wenige Verknüpfungsarbeiten nur noch "zusammengesteckt" werden müssen, und dann die Zugsteuerung automatisch abläuft, komme ich um die Verwendung zumindest von Listen nicht mehr herum. Und da habe ich nun ein Realisierungsproblem.

Zunächst eine kurze Beschreibung der Aufgabe:

471113852_01Beispielkonfiguration.thumb.jpg.f595a157a285020974b3c1bff9c53418.jpg

Ich möchte aus einem Ausgangsbahnhof mit einer bestimmten Anzahl von Bahnhofgleisen ebenfalls eine bestimmte Anzahl von Zielbahnhöfen erreichen können, die jeweils über eigene Strecken vom Ausgangsbahnhof aus erreichbar sind. Im oben gezeigten Beispiel sind es 2 Bahnhofsgleise (links) und 2 Fahrziele (rechts). Von jedem Bahnhofsgleis aus gibt es zu jedem Fahrziel eine Fahrstraße, die im beigefügten Gleisbildstellpult über die neben den Signalen angeordneten Ausfahr- und Fahrzieltasten eingestellt werden können sollen. Hierbei wird zuerst eine Fahrzieltaste und anschließend eine Ausfahrtaste gedrückt, wodurch die Fahrstraße eindeutig bestimmt wird. Es soll aber auch möglich sein, nur eine Ausfahrtaste zu drücken, ohne vorher eine Fahrzieltaste gedrückt zu haben. Wird beim Drücken der Ausfahrtaste keine gedrückte Fahrzieltaste vorgefunden, soll die Ereignissteuerung anhand der aktuellen Belegungssituationen in den Zielbahnhöfen selbst entscheiden können, wohin der ausfahrbereite Zug gelenkt werden soll. Genau aus diesem Grund werden die Ausfahr- und die Fahrziel-Tasten gegenüber der Realisierung von @Goetz in seinem Twitch-Tutorial in umgekehrter Reihenfolge angeklickt.

Um nach dem Drücken der Ausfahrtaste die gedrückte Fahrzieltaste (falls vorhanden) zu finden, müssen alle betroffenen Fahrzieltasten geprüft werden, weshalb ich diese in einer Listen-Variable "Fahrziel" zusammengefasst habe, die dem Weichenbereich an dieser Bahnhofsausfahrt zugeordnet ist. Jeder Ausfahrtaste habe ich eine Liste "Fahrstraßen" zugeordnet, in der die von dem zugehörigen Bahnhofsgleis ausgehenden Fahrstraßen zu allen Fahrzielen hinterlegt sind. Diese Fahrstraßen sind in den jeweiligen Listen in derselben Reihenfolge eingetragen wie die Fahrziele in der Fahrziel-Liste. Meine Idee war nun, über eine Wiederholungs-Anweisung die komplette Fahrziel-Liste nach einer gedrückten Fahrzieltaste zu durchsuchen und dann, sofern, diese gefunden wurde, mithilfe von deren Index in der zur Ausfahrtaste gehörenden Fahrstraßen-Liste die korrekte Fahrstraße auszuwählen. Nur ist es mir bisher nicht gelungen, bei dem Treffer in der Fahrziel-Liste den Index des gefundenen Elements auszulesen. Gibt es diese Funktion bisher überhaupt nicht (wäre in meinen Augen wünschenswert) oder habe ich einfach nur Tomaten auf den Augen?

Ich konnte das Problem umgehen, indem ich als Modulvariable "Indizes" eine Liste angelegt habe, deren Elemente Zahlen sind, die mit dem Index jedes einzelnen Elements identisch sind. Anstatt die Fahrziel-Liste selbst zu durchsuchen, wende ich die Wiederholung auf die Index-Liste an und prüfe bei jedem Durchlauf, ob in der Fahrziel-Liste ein Element (eine Fahrzieltaste) mit diesem Index existiert und gedrückt ist. Wenn ja, kann ich nun die Fahrstraße in der Fahrstraßen-Liste der gedrückten Ausfahrtaste mit diesem Index auswählen und weiterverarbeiten.

Korrespondierende Listen.mbp

Das in der obigen mbp-Datei hinterlegte Beispiel ist mit diese Hilfsliste "Indizes" realisiert und funktioniert auch:
Werden zuerst eine Fahrzieltaste und dann eine Ausfahrtaste gedrückt, werden das Fahrziel und die passende Fahrstraße ausgegeben. Mit dem Anschalten der Ausfahrtaste erlischt die Fahrzieltaste (damit sie beim endgültigen Modul für eine mögliche weitere Fahrstraßenaktivierug zur Verfügung steht). Beim Ausschalten der Ausfahrtaste werden die Angaben zum Fahrziel und zur Fahrstraße zurückgesetzt. Wird nur eine Ausfahrtaste gedrückt, erscheint konsequenterweise keine Anzeige.

Obwohl das Beispiel funktioniert, empfinde ich diese Lösung als eine "Von hinten durch die Brust"-Realisierung. Das Auslesen des Index der gefundenen Fahrzieltaste in der Fahrzielliste, um ihn dann für die Adressierung der Fahrstraße in der Fahrstraßen-Liste der gedrückten Ausfahrtaste zu verwenden, würde ich als "eleganteren" Weg ansehen. Oder gibt es da eine andere elegante Möglichkeit, die ich bisher übersehen habe?

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit Fahrziel A setzt du eine Variable Index auf 1.  Mit B auf 2. Zu jeder Ausfahrt nutzt du nun deine Fahrstrassen Liste und aktivierst die FS mit dem Index aus der Variablen. Wenn die Variable Index 0 ist, fragst du ab, ob es ein freies Gleis gibt oder aktivierst eine Zufalls Fahrstraße, die eher eventuell warten muss. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @HaNNoveraNer,

vor 6 Stunden schrieb HaNNoveraNer:

Mit Fahrziel A setzt du eine Variable Index auf 1.  Mit B auf 2. Zu jeder Ausfahrt nutzt du nun deine Fahrstrassen Liste und aktivierst die FS mit dem Index aus der Variablen.

vielen Dank für Deinen Lösungsvorschlag. Dadurch kann ich auf die Hilfsliste "Indizes" verzichten.

vor 6 Stunden schrieb HaNNoveraNer:

Wenn die Variable Index 0 ist, fragst du ab, ob es ein freies Gleis gibt oder aktivierst eine Zufalls Fahrstraße, die eher eventuell warten muss.

Bei der Ausfahrtaste werde ich weiterhin das Fahrziel (die gefundene aktive Fahrzieltaste oder "Leer") anstatt des gefundenen Index (oder "0") hinterlegen, weil ich auf die Informationen der über die Fahrzieltaste zu verlinkenden Einfahrt in den Zielbahnhof möglicherweise später noch zugreifen muss.

Anbei mein entsprechend angepasstes Beispiel:

Korrespondierende Listen 2.mbp

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @BahnLand,

Danke für Dein angepasstes Beispiel. Es hat zwar lange gedauert, bis ich durchgestiegen bin - aber nun funktioniert es langsam auch bei mir.

Trotzdem ist mir nicht klargeworden, was es mit der Variable "Weichenbereich" auf sich hat.
Ich habe Dein Beispiel so verstanden,

  • das es sich im "Weichenbereich" um eine Liste von Objekten der Fahrstraßentasten handelt, die als Ziel ausgewählt werden können. 
  • In jeder dieser Zieltasten gibt es einen Index, der die Reihenfolge für die Zuordnung einer Fahrstaße festlegt, also hat jede Zieltaste einen eigenen Index,
  • jede Starttaste hat eine individuelle Liste mit den Namen der MSB-Fahrstraßen, die so in die Reihenfolge gebracht werden müssen, daß sie mit dem Index der Zieltaste übereinstimmen. Alle Fahrstaßen, die an erster Stelle eingetragen sind, zeigen also auf die Zieltaste mit dem Index 1, die an zweiter Stelle gennannten zeigen auf Zieltaste 2 usw. Führt ein Startgleis nicht auf ein indizertes Zielgleis, kann man den leerbleibenden Index mit
    3DMBS_2021_N00871.thumb.jpg.9a2fe8920046281df2435638f66c0d6b.jpg
    ersetzen.
  • Daraus resultiert letztendlich die gewünschte Fahrstraße.

aber - warum muß man noch zusätzlich das Weichenfeld aller beteiligten Gleise/Weichen zu einem Objekt "Weichenbereich" als Gruppe zusammenfassen ? Nach meinem Verständnis wurden diese doch schon in der MSB-Fahrstraße definiert .

fragt Henry

Bearbeitet von Henry
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Henry,

vor 14 Stunden schrieb Henry:

warum muß man noch zusätzlich das Weichenfeld aller beteiligten Gleise/Weichen zu einem Objekt "Weichenbereich" als Gruppe zusammenfassen ?

Das muss man nicht. Das habe ich hier einfach so gemacht, um irgendein Objekt zu bekommen, welches den Einfahr- und Ausfahrbereich auf dieser Seite repräsentiert. Denn ich benötige sowohl für den Bahnhof selbst als auch für die Ein-und Ausfahrbereiche auf beiden Seiten ein Objekt, dem ich Objektvariablen zuordnen kann, welche sich auf den Bahnhof insgesamt oder auf die jeweilige Ein- und Ausfahrt an jedem Bahnhofsende beziehen. Und die Liste aller Zielbahnhöfe, die von der jeweiligen Bahnhofsausfahrt aus erreicht werden, repräsentiert durch die entsprechenden Fahrzieltasten auf dem Gleisbildstellpult, wird durch eine solche Objektvariable referenziert, die genau dieser Bahnhofsausfahrt zugeordnet ist.

Im obigen Beispiel habe ich hierzu die Gleise des Weichenfelds gruppiert und diese Gruppe als Objekt für die Objektvariable "Fahrziele" ausgewählt, was vielleicht etwas ungeschickt war. Ich hätte stattdessen auch das Einfahrsignal A (Einfahrt in den fernen Bahnhof A - aber nicht auch Einfahrsignal B) oder auch ein Stellwerk-Modell auf dieser Seite des Bahnhofs als "Besitzer" dieser Objektvariable hernehmen können.

Die Fahrstraßen, welche aus jedem Bahnhofsgleis heraus andere sind, sind daher jeweils einem Objekt aus dem zugehörigen Bahnhofsgleis zugeordnet, und da diese Fahrstraßen auch für jede Fahrtrichtung aus dem Bahnhof heraus andere sind, können sie nicht dem Bahnhofsgleis selbst zugeordnet werden. Ich habe daher hier als "Besitzer" der referenzierenden Objektvariable "Fahrstraßen", welche die Liste aller Fahrstraßen aus diesem Bahnhofsgleis in Richtung der jeweiligen Fahrziele enthält, Die Ausfahrtasten hergenommen.

1172895830_20FahrstraenundFreigleise.thumb.jpg.4e2ee87de2c5bd7d6562f8f688187f53.jpg

Ein weiterer Grund, warum ich Objekte benötige, welche den Bahnhof (im obigen Bild Bahnhof A) und die beiden Ein-/Ausfahrten in Ost- und Westrichtung (Einfahrt Ao und Aw) repräsentieren, sind die Freigleiszähler, mit denen ich sicherstellen möchte, dass ein Zug der von einem anderen Bahnhof aus (hier die Bahnhöfe B-E) in Richtung Bahnhof A ausfahren möchte, in letzterem auch tatsächlich einfahren kann (wenn auch nicht sofort, dass doch zumindest nach einer gewissen Wartezeit am Einfahrsignal).

Deshalb wird die Anzahl freier Gleise in einem Objekt "Bahnhof" als Objektvariable abgelegt. Möchte nun ein Zug aus einem der Nachbarbahnhöfe zum Zielbahnhof A in der Mitte des obigen Bildes ausfahren, darf er das nur tun, wenn im Zielbahnhof noch ein freies Gleis vorhanden ist, dies wird dann auch gleich von dem Kontingent freier Gleise im Bahnhof abgezogen, damit es nicht  noch einmal "vergeben" werden kann. Die Zuweisung eines konkreten Bahnhofsgleises ist damit nicht verbunden. Welches der freie Bahnhofsgleise tatsächlich zugewiesen wird, wird erst dann entschieden, wenn sich  der Zug bereits in Annäherung befindet.

Dies reicht aber nicht aus, um gegenseitige Blockaden zu verhindern. Angenommen, im 3-gleisigen Bahnhof A stehen 3 Züge, die alle in Richtung der Bahnhöfe B und C ausfahren wollen, gleichzeitig sollen in den Bahnhöfen B und C jeweils 2 Züge stehen, deren Fahrziel der Bahnhof A ist. Dann ist alles blockiert, weil keiner der Züge sein Bahnhofsgleis frei machen kann, um dieses für einen Zug aus einem Bahnhof "am anderen Ende der Strecke" freigeben zu können.

Deshalb wird das Kontingent der Züge, welche aus einer bestimmten Richtung in einen Bahnhof einfahren können, gegenüber der Anzahl der Bahnhofsgleise um 1 reduziert. Wenn nun ein Zug aus den Bahnhöfen B und C zum Bahnhof A hinausfahren möchte, muss neben der oben beschriebenen Prüfung, ob im Bahnhof A selbst überhaupt noch ein Gleis frei ist, auch geprüft werden, ob auch das Kontingent der Züge, die aus dieser Richtung in den Bahnhof einfahren dürfen, noch nicht erschöpft ist. Dann wird auch hier das freie Kontingent um 1 reduziert, und der Zug kann zum Bahnhof A hin aufbrechen.

Da dieses Kontingent bei leerem Bahnhof (alle Gleise frei) um 1 niedriger als die Gesamtzahl der freien Gleise im Bahnhof angesetzt wird, ist gewährleistet, dass im Bahnhof nie alle Gleise gleichzeitig von Zügen mit derselben Fahrtrichtung belegt sein können. So kann jeder Zug, der in einem Bahnhof ein Gleis belegt, spätestens dann seinen Bahnhof in Richtung seines nächsten Zielbahnhofs verlassen, wenn dort ein in diwselbe Richtung fahrender Zug sein Gleis freigemacht hat. Diese Richtungs-spezifischen Freigleiszähler müssen ebenfalls als Objektvariablen an einem entsprechenden Objekt hinterlegt sein, welches die jeweilige Einfahrt eines Bahnhofs repräsentiert.

In Summe werden also ein Objekt "Bahnhof" für den "globalen" Freigleiszähler sowie für jede  Einfahr-Richtung in den Bahnhof ein Objekt "Einfahrt" (also im obigen Bild "Einfahrt Ost (Ao)" und "Einfahrt West (Aw)") für den Freigleiszähler der jeweiligen Einfahrt benötigt, welches dann auch gleichzeitig die Fahrziel-Liste vom jeweiligen Ende des Bahnhofs als Objektvariable aufnehmen kann.

Man kann hier entweder eigenständige Objekte "Bahnhof" und "Einfahrt Ost/West" anlegen (z.B. das Bahnhofs-Hauptgebäude und vorgelagerte Stellwerke an beiden Bahnhofs-Enden), oder diese Funktionalität auch an bestimmte andere Objekte übertragen (z.B. Sonderstatus von Bahnhofsgleis 1 (Bahnhof) und Sonderstatus der  Einfahrsignale aus den Strecken aus Richtung Bahnhof B und D (Einfahrt Ost (Ao) und Einfahrt West (Aw))).

Genau letztere Aufgabe hat die Gruppe "Weichenbereich" in dem Anlagenbeispiel "Korrespondierende Listen 2.mbp" aus diesem Beitrag erfüllt.

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo BahnLand, also darf ich das so verstehen, dass das Ganze ähnlich wie ein Selbstblock funktioniert, welcher durch x Bahnhöfe unterbrochen wird, in denen eigentlich immer ein Gleis frei sein muss und um keinen Stau zu produzieren. Und über Ein und Ausfahrten von Zügen in/aus den einzelnen Bahnhöfen steuerst du die angrenzenden Blockabschnitte um so einen sicheren Rundlauf zu erreichen?

LG  Atrus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Atrus,

ein "Selbstblock" im engeren Sinne ist es nicht.

Denn das von mir beschriebene Verfahren muss auch angewendet werden, wenn die Züge beispielsweise über ein Gleisbildstellpult von Hand gestartet werden. Auch da darf ein Zug aus einem Bahnhof nur dann ausfahren, wenn sichergestellt ist, dass die beiden von mir formulierten Freigleis-Bedingungen beide erfüllt sind. Man kann dies natürlich via "Augenschein" machen. Aber sicherer ist es jedenfalls, wenn man diese Prüfung und Freigabe durch die Ereignissteuerung erledigen lässt. 

Allerdings kann man hiermit auch eine Vollautomatik realisieren, indem man auch die zusätzlichen Bedingungen, die für die einzelnen Züge gelten sollen (z.B. geplante Durchfahrt ohne Zughalt oder automatischer Start nach Ablauf einer bestimmten Haltezeit) durch die Ereignisverwaltung abarbeiten lässt.

Wenn ich den hier geplanten Bahnhofsbaustein fertig habe, plane ich, eine entsprechende Anlage mit mehreren Bahnhöfen (auch Verzweigungsbahnhöfen) zu planen, zwischen welchen vollautomatischer Zugverkehr abläuft. Das wird allerdings noch ein bisschen dauern.

Auch meine Gotthard-Anlage soll hiervon profitieren.

Viele Grüße
BahnLand

Bearbeitet von BahnLand
Link zu diesem Kommentar
Auf anderen Seiten teilen

PS: Mein Ziel ist es ja eigentlich den Personenverkehr mit Vollautomatik zu betreiben um den Schwerpunkt des Geschehens mehr auf den Rangierbahnhof zu fokussieren. Manuelles eingreifen bei den Personenzügen wäre dann nur noch in Notfällen erforderlich, weil die ja sowieso höhere Priorität haben und auch schneller fahren. (eventuell bei kurzfristigem Linksverkehr). Aber da ja Schattenbahnhöfe mittler weilen der Vergangenheit angehören, überlege ich gerade, diese in Depot's zu verwandeln, um von dort aus das Ganze in den Griff zu bekommen?

LG  Atrus 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Atrus,

Deine Aussage, dass Schattenbahnhöfe mittlerweile der Vergangenheit angehören, finde ich so nicht richtig. Der Nutzer des MBS hat ja immer noch die Alternative, sich einen konventionellen Schattenbahnhof mit Gleisen zu bauen, was meiner Auffassung nach dem realen Modellbahnbau entspricht, und dem lediglich aus Portalen und Depots bestehendem Schein-Schattenbahnhof. Das ist übrigens sicherlich bequemer für den Nutzer, bedeutet aber für mich (und andere) sich etwas vorzustellen, was nicht da ist. Das sehe ich nicht als Fortschritt in Sachen Vereinfachung für Nutzer des MBS, allenfalls als Beitrag zur Entlastung der Rechnerperformance. Ein Bahnhof ohne Gleise dürfte sich eigentlich nicht mal Bahnhof nennen.

Gruß

streit_ross

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo streit_ross, 

Du hast recht, ich muss mich korrigieren, das war jetzt nur auf meine persönliche Form der Nutzung des MBS bezogen. Jeder kann natürlich weiterhin seine Anlagen mit oder ohne Schattenbahnhöfen bauen, ganz wie er will. Ist mir auch klar, das es da in echt Gleise geben muss, auf denen die Züge wirklich fahren können. Andererseits ist die Verwendung von Portalen und Depots für Leute wie mich, die eben keine reale Modellbahn besitzen, natürlich sehr reizvoll. Man spart sich eine Menge Gleise zu legen. Und zwar virtuelle Gleise die es sowieso nicht gibt. In diesem Bezug sehe ich da schon eine Vereinfachung für den MBS User. Schön, das man mehrere Varianten zur Auswahl hat.

LG  Atrus

Bearbeitet von Atrus
Korrektur
Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...