Jump to content

Variablen mal wieder


astt

Empfohlene Beiträge

Hallo zusammen,

ich habe mal eine Frage an Euch Experten.

Kann man eine Objektvariable als Aktion mit dem Wert _RandomX  irgendwie auslesen, Diese anhalten und später wieder starten ?

Ich habe einen Schattenbahnhof mit einer Zufallssteuerung versehen. Nun habe ich das Problem, wenn ein Zug auf dem Haltegleis des ersten Streckenblocks steht, daß die Zufallssteuerung trotzdem einen weiteren Zug in die Strecke schickt. Da ich unterschiedliche Geschwindigkeiten für die Züge definiert habe, kann es passieren, daß nun der zweite Zug den ersten einholt, entweder noch am Streckenblock oder unterwegs zum nächsten Block. Ich habe schon Einiges (Ereigniss deaktivieren/aktivieren mit und ohne Countdown) ausprobiert. Die Varable hält zwar an, startet aber dann nicht mehr, obwohl Sie aktiviert wurde. Muss erst einen Zug per Hand los schicken, ehe Sie wieder rund läuft.

Nun ist meine Gedanke, das man explizit die Variable (oder den Wert), die gerade aktiviert werden soll anhält und erst dann wieder startet, wenn der erste Streckenblock wieder frei ist. Ich komme aber nicht darauf, wie ich es machen könnte.

Vielleicht weiss ja einer von Euch einen Rat.

Schöne Woche wünscht

astt

Bearbeitet von astt
Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hältst eine Variable an und startest sie wieder?

Wie machst du das? Und wozu?

Eine Variable bekommt einen Wert zugeordnet und behält diesen so lange, bis der Wert durch einen anderen ersetzt wird. Und das ist nur dann sinnvoll, wenn sich Bedingungen so geändert haben, dass sich die Variable einen neuen Wert benötigt..

Willst du beispielsweise eine Zufallszahl haben, dann "würfelst" du diese Zahl einmal und speicherst das Ergebnis in der Variablen. Und die nächste Zufallszahl erzeugst du erst dann, wenn du wirklich eine benötigst. Nicht ständig!

 

Um zu vermeiden, dass Züge, die den Schattenbahnhof verlassen, auf vorausfahrende Züge auffahren, musst du Streckenabschnitte definieren und sichern. Für diesen Zweck sind Signale zuständig. (Die alleine können im MBS aber keinen Streckenabschnitt sichern. Dazu gehört mehr.)

Wenn ein Zug den Abschnitt hinter dem Schattenbahnhof verlässt, wenn er also das folgende Signal passiert, dann musst du mit einem Ereignis "Zug verlässt Gleis" diese Tatsache in der EV verwerten. Erst, wenn diese Bedingung erfüllt ist, darf ein weiterer Zug ausfahren. Und dieser Zug darf zunächst nur bis zu diesem Signal fahren. Bevor er das passieren darf musst du prüfen, ob der nachfolgende Streckenabschnitt frei geworden ist. Weshalb der vorausfahrende Zug beim nächsten Signal wieder melden muss "Zug verlässt Gleis". Solange er das noch nicht gelmeldet hat muss der nachfolgende Zug am ersten Signal gestoppt werden. Und so geht das Abschnitt für Abschnitt weiter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Götz,

soweit so gut.

Auch auf meinen Streckenblöcken regeln Signale und Sperrweichen den Ablauf. Auch bei den Variablen und der Sache mit dem "würfeln" gebe ich Dir Recht.

Nur, wie sage ich der Variablen "Würfel", daß Er würfeln darf. Oder anders, wie sage ich der Zufallssteuerung, daß der folgende Streckenblock frei ist. Ich könnte es ebenfalls mit Signalen und Sperrweichen machen. Aber ich bin mir nicht sicher, ob es die Variable versteht, bzw. ich weiss nicht, wie ich der Variablen erklären soll, das der folgende Streckenblock durch das Sinal gesperrt ist.

Ich kann zwar, um mal bei einem Gleis zu bleiben, dieses Gleis sperren. Aber die Zufallssteuerung wird trotzdem den Zug auf dem Gleis losschicken wollen. Der fährt aber nicht, weil das Gleis gesperrt ist. Das Ergebniss wäre, der Zug, der auf die Einfahrt in eben dieses Gleis wartet, würde losfahren und ebenfalls auf dem Gleis zum stehen kommen und das Chaos wäre perfekt.

Deshalb würde ich gerne die Variable anhalten, solange das Gleis gesperrt ist.

Bearbeitet von astt
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ereignis: Zug verlässt Gleis (und damit den Abschnitt zwischen Schattenbahnhof und dem ersten Block)
Aktion: Variable setzen - Name: DeinZufallsWert Wert: Random (genaue Schreibweise habe ich gerade nicht parat)

Ereignis: Variable wurde gesetzt - Name: DeinZufallsWert Wert: $DeinZufallsWert
Aktion: nächsten Zug rausschicken und dafür den aktuellen Wert der Variablen verwenden, um zu bestimmen, welcher Zug ausfahren soll.

 

Ich begreife immer noch nicht, warum du deine Variable anhalten willst, weil ich nicht verstehe, wieso deine Variable läuft? Eine Variable läuft doch nicht. Sie enthält einen Wert. Eine Variable ist wie ein Notizzettel, auf dem etwas steht das man sich merken möchte. Und den man dann ablesen kann, wenn man die auf dem Zettel notierte Information benötigt.

 

Im obigen (vereinfachten) Beispiel wird genau einmal ein Wert erzeugt und in der Variablen abgelegt. Nämlich genau dann, wenn der abschnitt für die Ausfahrt aus dem Schattenbahnhof frei geworden ist. Das passiert im ersten Ereignis. Und im zweiten Ereignis wird der Wert, welcher gerade gewürfelt und in der Variablen abgelegt wurde, benutzt um den nächsten Zug rauszuschicken.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Götz,

 

im Prinzip hast Du Recht.

Mal zur Erklärung. Bei mir läuft es auch so, Ein Zug betritt ein Gleis vor dem Schattenbahnhof, setzt eine Variable und löst mit dieser die Auswahl des Gleises aus, das im Schattenbahnhof aktiviert wird. Zug im aktivierten Gleis verlässt Dieses und gibt damit die Einfahrt frei, für denn ersten Zug, der am Anfang die Variable gesetzt hat. Dieser fährt nun in das freigewordene Gleis ein, wird gestoppt und meldet sozusagen Gleis besetzt. Und diese Prozedur läuft bisher mit ca. 20 Zügen in eine Richtung ab. Heisst, das manchmal mehr, manchmal weniger Züge vor dem Schattenbahnhof ankommen und die selbe Prozedur auslösen. Da nun die Züge unterschiedliche Geschwindigkeiten haben, kann es passieren, das ein Schnellzug kurz hinter einem Güterzug den Schattenbahnhof verlässt, oder aber ein bereits vor kurzem ausgefahrener Zug, muss am ersten Block halten, weil Er blockiert ist. Nun kann es passieren, daß der schnellere Zug den Haltenden oder langsamfahrenden Zug einhohlt.

Diese letzte Problem bereitet mir Kopfzerbrechen.

Ich kann zwar mit Signalen und Sperrweichen die Ausfahrt blockieren, aber deshalb kommt trotzdem wieder ein Zug am Anfang an und setzt obiges Prozedere in Gang. Ich möchte einfach, den Ablauf im Schattenbahnhof anhalten und wieder starten, wenn der erste Blok frei ist. Wobei ich sicher schon eine Woche rumgedoktert habe aber auf keine Lösung gestossen bin. Vielleicht drücke ich mich da falsch aus, aber deshalb die Idee, die Variable zu pausieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb astt:

Ein Zug betritt ein Gleis vor dem Schattenbahnhof, setzt eine Variable und löst mit dieser die Auswahl des Gleises aus, das im Schattenbahnhof aktiviert wird. Zug im aktivierten Gleis verlässt Dieses und gibt damit die Einfahrt frei, für denn ersten Zug, der am Anfang die Variable gesetzt hat.

Wenn ich dich richtig verstehe, dann löst ein ankommender Zug aus, dass ein anderer den Schattenbahnhof verlässt? Ohne Prüfung, ob der Ausfahrtbereich und der erste Streckenabschnitt hinter dem Schattenbahnhof frei ist? Wenn ja, dann ist diese Taktik die Hauptursache für deine Probleme. Warum meldet der ausfahrende Zug überhaupt "Gleis besetzt", wenn der nächste einfahrende Zug diese Information nicht auswertet und einfach einen weiteren Zug auf die Reise schickt?

 

vor 1 Stunde schrieb astt:

Vielleicht drücke ich mich da falsch aus ...

Du drückst dich - bitte verzeih mir - schwer verständlich aus.

Und du beantwortest meine Frage nicht.

Wieso läuft deine Variable? Variablen kann man nicht pausieren, weil Variablen nicht laufen ...
Was genau passiert also mit deiner Variablen, das du als Laufen bezeichnest? Und wie sieht der Eintrag in deiner EV aus, durch den deine Variable läuft?

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo astt,

ich glaube, dass ich Dein Problem verstanden habe:

Der vor dem Schattenbahnhof ankommende Zug beauftragt einen per Zufallszahl ausgewählten Zug im Schattenbahnhof, auszufahren, damit er selbst in das dann frei werdende Gleis einfahren kann. Dazu startet er einfach den ausgewählten Zug, der dann möglicherweise auf den voraus fahrenden Zug auffährt, wenn dieser nicht schnell genug war, um den Block hinter der Schattenbahnhofs-Ausfahrt rechtzeitig zu verlassen.

Du kannst das Problem wie folgt lösen:

Der aus dem Schattenbahnhof ausfahrende Zug setzt einen Lock (eine Variable), mit der er den Blockabschnitt hinter dem Schattenbahnhof (also jenen, in den er gerade einfährt) blockiert. Er gibt den Lock erst wieder frei (Variable auf 0 setzen), wenn er den Blockabschnitt verlassen hat und damit der nächste Zug aus dem Schattenbahnhof "gefahrlos" ausfahren kann. Wird nun ein Zug im Schattenbahnhof von dem einfahrwilligen Zug vor dem Schattenbahnhof aufgefordert, den Schattenbahnhof zu verlassen (der einfahrwillige Zug hat diesen ja mittels Zufall ausgewählt), kann er nur dann ausfahren, wenn der Lock des Ausfahr-Blockabschnitts frei ist. Ansonsten muss er das Ereignis "Lock-Variable wird auf 0 gesetzt" abwarten, bevor er den Lock selbst nehmen und dann losfahren kann. Damit die Freigabe der Lock-Variable nicht jeden Zug im Schattenbahnhof in Bewegung setzt, darf die Ereignisbehandlung für "Lock wird frei" nur von jenem Zug ausgeführt werden, der den Auftrag zur Ausfahrt hat (kann über die Aktivierung/Deaktivierung dieser Ereignisdefinition gesteuert werden).  Erst wenn der Zug tatsächlich den Schattenbahnhof verlassen und damit das vom einfahrwilligen Zug angeforderte Gleis freigegeben hat, kann dieser einfahren, und damit die Annäherung des nächsten Zuges an die Einfahrt in den Schattenbahnhof ermöglichen, durch den dann dann das ganze Szenario wieder von vorne beginnt.

Diese Vorgehensweise ist streng sequentiell und kann daher nicht zu einem Auffahren von Zügen führen. Hier noch einmal die Ereignisfolge formal in Kurzform:

  1. Zug kommt an der Einfahrt des Schattenbahnhofs an und wählt per Zufallsvariable das Gleis aus, in das er einfahren möchte.
  2. Einfahrwilliger Zug stößt Ausfahrt für Zug aus dem ausgewählten Schattenbahnhof-Gleis an.
  3. Zug im Schattenbahhof, der ausfahren soll, prüft ob Blockabschnitt hinter der Ausfahrt aus dem Schattenbahnhof frei ist (Prüfung Lock-Variable). Ist die Lock-Variable 0 (also der Blockabschnitt frei), wird mit Punkt 7 fortgefahren.
  4. Zug muss auf Freigabe des noch belegten Blockabschnitts warten (Ereignis "Lockvariable geht auf 0" wird aktiviert - Sensibilisierung auf Lock-Freigabe).
  5. Wenn der vorausfahrende ZUg den Blockabschnitt verlassen hat, gibt er den Lock frei.
  6. Wenn der im Schattenbahnhof auf Ausfahrt wartende Zug die Lock-Freigabe erkennt, deaktiviert er das "Lockvariable geht auf 0"-Ereignis und fährt mit Punkt 7 fort.
  7. Zug im Schattenbahnhof fährt aus, ohne Gefahr zu laufen, auf einen vorausfahrenden Zug aufzufahren.
  8. Nach dem Verlassen des Schattenbahnhofs gibt der Zug das Gleis für den vor dem Schattenbahnhof wartenden Zug frei
  9. Zug vor dem Schattenbahnhof fährt in das nun freie Gleis (das per Zufallszahl ausgewählt wurde) ein.
  10. Nachdem die Einfahrt des Zuges in den Schattenbahnhof abgeschlossen ist, kann der nächste Zug auf der Strecke vor dem Schattenbahnhof aufrücken.

Nach Punkt 10 wird wieder mit Punkt 1 gestartet.

Viele Grüße
BahnLand

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Bahnland,

Danke für Deine Erklärung. Genau so etwas habe ich gesucht. Da werde ich mich mal dran setzen und probieren. Habe ja jetzt den Lösungsweg vor Augen. :D

@Goetz

Zitat

  Wenn ich dich richtig verstehe, dann löst ein ankommender Zug aus, dass ein anderer den Schattenbahnhof verlässt? Ohne Prüfung, ob der Ausfahrtbereich und der erste Streckenabschnitt hinter dem Schattenbahnhof frei ist?

Genau für dieses Problem suchte ich nach einer Lösung, die mir Bahnland nun aufgezeigt hat.

Zitat

Warum meldet der ausfahrende Zug überhaupt "Gleis besetzt", wenn der nächste einfahrende Zug diese Information nicht auswertet und einfach einen weiteren Zug auf die Reise schickt?

Nicht der Ausfahrende, sondern der Einfahrende meldet "Gleis besetzt ". Aber eben nur das Bahnhofsgleis.

"Läuft" ist sicher wirklich ein falscher Begriff. Aber, da sich die Variable bei jedem Zug der ankommt, ändert, kann man diesen Begriff sicher als Metapher verwenden. Sorry, wenn Du es falsch verstanden hast.

Schönen Tag wünscht

astt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo zusammen,

der eigentlichen Idee der Blocksteuerung folgend sollte der Zug, der den Ausfahrt-Block verlassen hat, die zufällige Freigabe des nächsten Zuges aus dem Schattenbahnhof veranlassen. Dann, nach Ausfahrt, kann der Zug, der in den Schattenbahnhof soll, das freigewordene Gleis im Schattenbahnhof nutzen.

Sicherheit heißt in diesem Fall: Zug verlässt Block 2, setzt Signal Block2 auf rot und - weil Block2 jetzt leer - Signal Block1 auf grün oder besser:

Einfahrt(Block1) -> Schattenbahnhof(Block2) ->Ausfahrt(Block3) -> ..... -> Block(n-1)       -> Block n          -> Einfahrt(Block1)

Block n rot               Block 1 rot                           Block 2 rot                        Block (n-2) rot     Block(n-1) rot    Block n rot

Block(n-1) grün       Block n grün                        Block 1grün                      Block(n-3) grün   Block(n-2) grün Block(n-1) grün

siehe Bahnlands Blockstellenbeschreibung oder Michel test Blockstellen in experimentell

Gruß Michel, der N-Bahn-Bastler
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb astt:

"Läuft" ist sicher wirklich ein falscher Begriff.

Das Problem ist, dass dieser falsche Begriff bei dir zu einer falschen Vorstellung führt.
Und diese falsche Vorstellung bringt dich dann auf die falsche Idee, eine Variable "anhalten" zu wollen.

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