Jump to content

Nachfrage zum Wiki


MarkoP

Empfohlene Beiträge

Hallo Neo,

ich denke ich habe bei einem deiner Wiki-Beiträge ein Verständnisproblem.

Unter http://www.3d-modellbahn.de/wiki/4437 erklärst du die Erweiterte Zugsteuerung mit der Ereignisverwaltung.
Darin enthalten unter anderem die automatische Ausfahrts-Steuerung mehrerer Bahnhofsgleise mit Hilfe einer Lock-Variablen.

Wenn ich deine Anleitung übernehme tritt jedoch das Problem auf, dass die Stuerung komplett abbricht wenn an einer Stelle eine Bedingung nicht erfüllt ist.
Wenn als Beispiel unter

Gleis-Vereinigungen und -Verzweigungen

 die Variable "Belegungs-Lock 6" nicht auf 0 steht - also nicht erfüllt ist - wird die Abfolge komplett gestoppt und auch nicht automatisch neu gestartet. Gleiches gilt, wenn die Lock-Variable nach Anforderung der Gleise 1, 2 und 3 z.B. auf 2 steht, dann wird die weitere Verarbeitung für die Gleise 1 und 3 komplett unterbrochen anstatt solange geprüft zu werden bis die Ausfahrt ebenfalls möglich ist.

Habe ich einen Denkfehler oder müsste eine Countdownanforderung neugestartet werden, damit die restlichen zwei Züge auch weiterhin geprüft werden.

Gruß
MarkoP

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Marko,

wenn ein Zug aus einem "Zweiggleis" in die "gemeinsame Strecke" ausfahren möchte, muss er sich mit Zügen in den anderen Zweiggleisen synchronisieren (siehe die Beispiel-Anlage "Automatik-Steuerung 05b - Streckenvereinigung und -verzweigung" mit der "Gleisharfe"). Hierzu wird der über eine Ereignisvariable realisierte "Lock" verwendet. Jeder Zug, der sein Zweiggleis verlassen möchte, muss diesen Lock anfordern und warten, bis er ihn "sicher" zugeteilt bekommen hat. Dann kann er das Zweiggleis gefahrlos verlassen, ohne mit einer "Flankenfahrt"  durch einen anderen Zug rechnen zu müssen.

Die Lock-Variable ist eine Ereignis-Variable, die von allen Zügen in den Zweiggleisen gemeinsam verwendet wird, um sich über diese Variable zu synchronisieren. Jedem Zweiggleis wird ein bestimmter eindeutiger Variablen-Wert zugeordnet, über den für den Zug eines jeden Zweiggleises entschieden werden kann, ob der Lock zugeteilt ist oder nicht (Wert 1 für Gleis 1, Wert 2 für Gleis 2 usw.; Wert 0: Lock ist frei).

Es gibt pro Zweiggleis 4 Ereignis-Definitionen, die für die Lock-Anforderung relevant sind, wobei die Ereignisse 4 und 5 alternativ sind in Abhängigkeit davon, ob der in das Zweiggleis einfahrende Zug einen geplanten Halt einlegen oder - falls möglich - durchfahren möchte:

  1. Ausfahrt sperren
    Auslöser: Verlassen der Sperrweiche bei der Ausfahrt
    Aktion: Ereignis "Ausfahrt frei" deaktivieren
  2. Ausfahrt bereit
    Auslöser: Aktivierung des Ereignisses "Ausfahrt frei"
    Aktion: Belegen der Lockvariable mit eigenem Wert, falls Wert "0" vorgefunden
  3. Ausfahrt frei
    Auslöser: Freigabe der Lockvariable durch Überschreiben der aktuellen Lock-Belegung mit "0" (durch anderen Zug)
    Aktion: Belegen der Lockvariable mit eigenem Wert, falls Wert "0" vorgefunden
  4. Pause beendet (nach geplantem Zughalt)
    Auslöser: Haltezeit-Countdown läuft ab
    Aktion: Ereignis "Ausfahrt frei" aktivieren
  5. Gleis belegen (bei beabsichtigter Durchfahrt ohne Halt)
    Auslöser: Einfahrt in das Zweiggleis
    Aktion: Ereignis "Ausfahrt frei" aktivieren

Im "Normalzustand" (Zweiggleis leer oder Zug auf Zweiggleis im Haltezeit-Countdown) ist das Ereignis "Ausfahrt frei" deaktiviert. In diesem Zustand wird das Setzen der Lock-Variable (durch einen anderen Zug) auf den Wert "0" ignoriert. Das Ereignis wird explizit aktiviert, wenn ein "durchfahr-williger" Zug in das Zweiggleis einfährt (Ereignis "Gleis belegen") oder ein geplanter Halt beendet wird (Ereignis "Pause beendet"). In beiden Fällen "signalisiert" der Zug, dass er für die Ausfahrt aus dem Zweiggleis "bereit" ist. Die Aktivierung des Ereignisses "Ausfahrt bereit" erfüllt gleichzeitig 2 Funktionen:

  1. Es wird die für die "sichere" Ausfahrt benötigte Lock-Anforderung explizit angestoßen.
  2. Es wird durch die Aktivierung des Ereignisses "Ausfahrt bereit" sichergestellt, dass dieses ausgelöst wird, wenn die Lockvariable auf "0" zurückgesetzt wird.

Ist die explizit angestoßene Lock-Anforderung nicht erfolgreich (Lock wird von einem anderen ausfahrenden Zug gehalten), bleibt der Zug vor dem geschlossenen Ausfahrsignal stehen bis die zuvor als "belegt" vorgefundene Lockvariable von jenem Zug auf "0" zurückgesetzt wird. Dies löst, da aktiviert, automatisch das Ereignis "Ausfahrt frei" aus, durch welches erneut versucht wird, den Lock anzufordern. Ist der Lock nun wieder anderweitig belegt, weil ein anderer Zug zuvorgekommen ist, wird das ganze Spielchen bei der nächsten Freigabe des Locks automatisch wiederholt.

Beim Verlassen des Zweiggleises wird das Ereignis "Ausfahrt frei" wieder deaktiviert, bis ein neuer Zug in diesem Gleis die Ausfahrt anfordert.

Jeder Zug, der bei der Ausfahrt aus dem Zweiggleis den Lock besitzt (also mit seinem "eigenen" Wert belegt hat), behält diesen Lock, bis er den Blockabschnitt, in den er aus dem Zweiggleis eingefahren ist, wieder verlässt. Damit gibt er den Blockabschnitt für den nächsten aus einem Zweiggleis ausfahren wollenden Zug frei, indem der den gehaltenen Lock durch Zuweisung des Werts "0" an die Lockvariable frei gibt.

Fazit:
Ein expliziter Anstoß der Lock-Anforderung durch den Zug im Zweiggleis erfolgt nur einmal, nämlich bei einer geplanten Durchfahrt während der Einfahrt oder bei einem geplanten Halt nach Ablauf der Wartezeit. Alle weiteren Lock-Anforderungen, die dann notwendig werden, wenn der Lock bei einer Anforderung nicht zugeteilt wird, werden durch den Zug, der den Lock gerade hält und beim Verlassen des auf die Zweiggleise folgenden Blockabschnitts wieder frei gibt, ausgelöst.
Deshalb muss kein Countdown aufgezogen werden, um den nicht erhaltenen Lock erneut anfordern zu können.

Jetzt hoffe ich, dass ich mich verständlich ausdrücken konnte. Schau Dir einfach in der Gleisharfen-Anlage die Ereignisse aus der Ereignisdefinition an (Gleis 5 ist das Durchfahrgleis, alle anderen Gleise realisieren einen geplanten Halt), auf die ich mich in der Beschreibung hier bezogen habe. Dann wirst Du erkennen, warum das ganze Szenario ohne eine "aktiv angestoßene" Wiederholung der Lock-Anforderung funktioniert.

Viele Grüße
BahnLand

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Marko,

hier noch eine kurze "chronologische Ablauf-Beschreibung" als Ergänzung:

  1. Ereignis "Gleis belegen" bei Einfahrt in ein Zweiggleis: Blockierung des Zweiggleises gegen das Befahren durch weitere Züge.
  2. Ereignis "Gleis belegen" (nur bei geplanter Durchfahrt): "Ausfahr-Bereitschaft" herstellen durch Aktivierung des Ereignisses "Ausfahrt frei".
    Wenn die Ausfahrt blockiert ist, wird gezwungenermaßen trotzdem angehalten. Weiter mit Punkt 5.
  3. Geplant anhalten und Haltezeit Countdown einstellen (nur falls geplanter Halt vorgesehen).
  4. Ereignis "Pause beendet" (Ablauf des Haltezeit-Countdowns): "Ausfahr-Bereitschaft" herstellen durch Aktivierung des Ereignisses "Ausfahrt frei".
  5. Ereignis "Ausfahrt bereit" (Aktivierung des Ereignisses "Ausfahrt frei"): Anstoß der Lock-Anforderung durch den ausfahrbereiten Zug.
  6. Lock-Anforderung durch den ausfahrbereiten Zug.
  7. Lock-Anforderung erfolgreich: Der ausfahrbereite Zug besitzt nun den Lock. Weiter mit Punkt 10.
  8. Lock-Anforderung fehlgeschlagen: Warten auf Eintreffen des Ereignisses "Ausfahrt frei".
  9. Ereignis: "Ausfahrt frei" (angestoßen durch die Freigabe des Locks durch jenen Zug, der den Lock bisher besessen hat): Weiter mit Punkt 6.
  10. Ausfahrt aus dem Zweiggleis in den ersten Blockabschnitt der freien Strecke.
  11. Ereignis "Ausfahrt sperren" (ausgelöst durch das Verlassen des Zweiggleises):
    Aufhebung der Ausfahrbereitschaft für das verlassene Zweiggleis durch Deaktivierung des Ereignisses "Ausfahrt frei".
    Freigabe des verlassenen Zweiggleises für den nächsten einfahrenden Zug.
  12. Verlassen des ersten Streckenblock-Abschnitts: Freugabe des gehaltenen Locks durch Überschreiben der Lockvariable mit dem Wert "0".
    Dies löst für alle in diesen Blockabschnitt führenden Zweiggleise mit ausfahrbereiten Zügen das Ereignis "Ausfahrt frei" aus (Punkt 9).

Die bei fehlgeschlagener Lock-Anforderung zu durchlaufende Schleife für die Wiederholung der Lock-Anforderung erstreckt sich also über die Punkte 6-9.

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Bahnland,

ich habe jetzt nicht alles gelesen was du geschrieben hast, aber das ist eigentlich auch nicht nötig. Wie und warum der Lock funktioniert war/ist klar.
Trotzdem Danke für deine Ausführungen.

Aber es geht darum, dass das zweite belegte Gleis den Lock erst neu anfordern kann wenn das erste Gleis wieder neu belegt ist und damit die Lock-Anforderung ausgelöst wird. Es fehlt die wiederholung der Prüfung ob die Bedingungen für eine Ausfahrt vorhanden sind. Es ist also unmöglich, dass ein Zug den Bahnhof verlässt und der zweite automatisch anfährt sobald der erste den Blockbereich hinter dem Bahnhof verlassen hat. Es wird bei deinem Beispiel zwar der Blockbereich wieder freigegeben, aber beim zweiten Zug wird nicht mehr abgefragt ob eine Freigabe vorliegt.

Ich habe aber für mich bereits eine Lösung gefunden die meinen Anforderungen entspricht.

Gruß
MarkoP

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Marko,

schade, dass Du nicht alles gelesen hast. Denn sonst wüsstest Du jetzt, dass die wartenden Züge sehr wohl erneut eine Lock-Anforderung starten, sobald der Zug, der den Lock gerade besitzt, diesen wieder frei gibt (das Überschreiben der Lock-Variable mit dem Wert "0" löst die Lock-Anforderung für alle auf den Zweiggleisen wartenden Züge aus !!!). Die Lock-Anforderung beinhaltet die Prüfung, ob die Bedingung für eine mögliche Ausfahrt erfüllt ist (Prüfung, ob die Lock-Variable den Wert "0" enthält).

Die Einfahrt eines Zuges in ein freies Zweiggleis bewirkt dagegen nicht, dass ein wartender Zug auf dem anderen Gleis erneut den Lock anfordert, sondern nur die "eigene" Lock-Anforderung durch den einfahrenden Zug, wenn dieser keinen planmäßigem Halt einlegen möchte.

Dass die Ausfahrt des wartenden Zuges nach Verlassen des Streckenblock-Abschnitts durch den vorausfahrenden Zug auch dann funktioniert, wenn in das zweite (leere) Gleis kein Zug einfährt, kannst Du sehr leicht an der Demo-Anlage "Automatik-Steuerung 05 - Streckenvereinigung und -verzweigung" verifizieren, indem Du, solange ein Zug auf dem äußeren Gleis auf die Ausfahrt wartet, bis der vorausfahrende Zug seinen Blockabschnitt frei gibt, den nachfolgenden Zug durch explizites Schließen des Einfahrsignals daran hinderst, in das innere Bahnhofsgleis einzufahren. Der Zug im äußeren Gleis wird dann trotzdem losfahren. Bei der umgekehrten Situation (Zug wartet im inneren Gleis und das äußere Gleis ist frei) funktioniert dieses "Test"-Verfahren nicht immer, da der wartende Zug sich noch im "geplanten Haltezustand" befinden könnte und daher auf die Freigabe des Streckenblocks durch den vorausfahrenden Zug überhaupt nicht reagiert (wird dann beim Ablauf des Haltezeit-Countdowns aufgefordert, den Lock anzufordern).

Wenn Du jetzt diesen Text wieder nicht liest, kann ich Dir leider auch nicht weiterhelfen und Dich von dem Glauben abbringen, dass mein Lock-Mechanismus (mit Überprüfung, ob die Ausfahrt frei ist) nicht funktionieren könnte. Die Demo-Anlagen (zweigleisiger Bahnhof und Gleisharfe) beweisen das Gegenteil.

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Bahnland,

ich wollte dir nicht auf die Füße treten, sorry. Ich finde gut das du dir soviel Zeit nimmst.

Ich werde alles nochmal genau nachstellen und ausprobieren. Bei mir war jedoch niemals ein Countdown für den zweiten Zug aktiv sobald eine Bedingung nicht mehr erfüllt war und an anderer Stelle wird die Lock-Variable ja nicht geprüft. Werde aber auf jedenfall noch mal schauen ob ich nicht irgendwo einen Eintrag übersehen habe.

Wie gesagt habe ich in der Zwischenzeit auch bereits eine für mich funktionierende Lösung gefunden, wobei du mich gerade auf eine Idee gebracht hast, die ich vielleicht noch zur Vereinfachung nutzen kann.

Gruß
MarkoP

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Marko,

die Lock-Variable wird geprüft

  1. vom in ein Zweiggleis einfahrenden Zug, wenn er beabsichtigt. durchzufahren,
  2. vom planmäßig haltenden Zug, wenn der Haltezeit-Countdown abgelaufen ist,
  3. von jedem auf einem beliebigen der Zweiggleise auf Ausfahrt wartenden Zug, wenn die Lock-Variable vom aktuellen Besitzer auf "0" zurück gesetzt wird.

Es gibt für einen auf Ausfahrt wartenden Zug keinen Countdown, um nach dessen Ablauf erneut eine Prüfung der Lock-Variable anzustoßen. Dies wird von der oben aufgelisteten Variante "3" erledigt, bei der die Lock-Variablen-Prüfung bei jedem wartenden Zug automatisch angestoßen wird, sobald die Lock-Variable auf "0" gesetzt wird. Nachfolgend noch einmal konkret die Ereignis-Definitionen für die Abfolge der Lockzuteilung im Falle der "auf Ausfahrt wartenden" Züge (die Lock-Anforderung aufgrund einer Durchfahrt-Absicht oder des Ablaufs der geplanten Haltezeit habe ich hier der Übersichtlichkeit wegen weggelassen).

Beim zweigleisigen Bahnhof habe ich noch eine "Prioritäten-Steuerung" eingebaut, weshalb dort ein Schritt mehr vorhanden ist als bei der Gleisharfe.


Chronologische Ereignisfolge bei Anlagenbeispiel "Automatik-Steuerung 05 - Streckenvereinigung und -verzweigung":

  1. Streckenblock 6: Ausfahrt blockieren: Belegungslock 6 (besagte Lock-Variable) wird auf "0" gesetzt und
                                                                    Abfahr-Auftrag 1+2 Abfahrauftrag wird angestoßen (Countdown mit 0 Sekunden für eine sofortige Ausführung)
  2. Bahnhofsgleis 1: Ausfahrt freigeben: Prüfung Belegungslock 6 und Aktivierung nächsten Schritt ohne Wartezeit (Countdown 0,0 sec)
    Bahnhofsgleis 2: Ausfahrt freigeben: Prüfung Belegungslock 6 und Aktivierung nächsten Schritt mit Wartezeit (Countdown 0,2 sec)
  3. Bahnhofsgleis 1 und 2: Ausfahr-Lock anfordern: Belegungslock 6 erneut prüfen und "eigenen" (Zweiggleis-spezifischen) Wert eintragen
  4. Bahnhofsgleis 1 und 2: Lock-Countdown: Belegungs-Lock 6 prüfen, ob erfolgreich zugeteilt, und nur dann Ausfahrsignal öffnen (erfolgreich nur für 1 Gleis!)

Wenn die eigene Lock-Belegung (Punkt 3+4) nicht funktioniert, ist der "Konkurrent" auf dem anderen Bahnhofsgleis zuvorgekommen. Dann löst dieser beim Verlassen der Blockabschnitts 6 die obige Ereignisfolge, beginnend mit Punkt 1, erneut aus, wodurch dann der zweite Zug die Prüfung nochmals durchläuft.


Chronologische Ereignisfolge bei Anlagenbeispiel "Automatik-Steuerung 05b - Streckenvereinigung und -verzweigung":

  1. Block 11: Harfen-Ausfahrt frei: Lock-Variable "Ausfahrt-Lock" wird auf den Wert "0" gesetzt
  2. Gleis 01 bis 09: Ausfahrt frei: "Ausfahrt-Lock" (ohne Prüfung, wurde ja auf "0" gesetzt) auf den Harfengleis-spezifischen Wert setzen
  3. Gleis 01 bis 09: Ausfahrt zugeteilt: "Ausfahrt-Lock" prüfen, ob erfolgreich zugeteilt, und nur dann Ausfahrsignal öffnen (erfolgreich nur für 1 Gleis!)

Wenn die eigene Lock-Belegung (Punkt 2+3) nicht funktioniert, ist ein "Konkurrent" auf einem anderen Harfengleis zuvorgekommen. Dann löst dieser beim Verlassen der Blockabschnitts 11 die obige Ereignisfolge, beginnend mit Punkt 1, erneut aus, wodurch dann die noch wartenden Züge die Prüfung nochmals durchlaufen.

Du kannst ja, wenn Du Lust hast, Deine Synchronisierungs-Variante hier ebenfalls kurz vorstellen.

Viele Grüße
BahnLand

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Bahnland,

ich hatte folgenden Punkt nicht gesehen "6: Ausfahrt blockieren". Ohne diesen Punkt wird der zweite Zug eben nicht gestartet, weshalb ich den Countdown-Aufruf in jedes Gleis als Aktion bei nicht erfüllter Bedingung eingefügt habe. Nachdem ich deinen vorletzten Beitrag gelesen hatte, ist mir der Aufruf aber nachvollziehbar geworden (das meinte ich mit Idee zur Vereinfachung).

Generell arbeite ich aber ohne Sperrweichen (dafür mit entsprechenden Gleislängen die eine Bremsung bie reduzierter Lokgeschwindigkeit garantieren) und ohne Ereignis aktivierung/deaktivierung. Als Ersatz regel ich dies über die Nicht erfüllt Aktion. Mal schauen wie ich es darstellen und hier präsentieren kann. Wird aber wahrscheinlich ein paar Tage dauern.

Gruß
MarkoP

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...