Jump to content

Fahrplan mittels Tabelle


MarkoP

Empfohlene Beiträge

Hallo,

ich würde gerne einen Fahrplan mittels einer Tabelle erstellen.

Also mehrere Abfahrtzeiten als Index. Pro Zeile sollen dann noch andere Variablen wie Ziel etc. befüllt werden.

Dazu habe ich mir für jeden Zug eine List angelegt und jedem Listeneintrag eine Tablle mit verschiedenen Werten angeführt der Zeit zugewiesen.

 

Leider finde ich bisher keine Möglichkeit mit  der EV zu prüfen ob einer dieser Zeitpunkte erreicht ist. Gibt es da eine Möglichkeit oder wie habt ihr sowas gelöst?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo MarkoP,
ich habe dafür einen Sekundenticker. Zusätzlich rechne ich diesen Wert noch einmal um (Lua-Funktionen). So bedeutet der Wert 915 letztlich 9:15 Uhr. Damit kann man noch eine gute Lesbarkeit in der Tabelle erreichen. Wenn Du nur aufsteigende Werte in der Tabelle hast, kannst Du da einfach einen Index hochlaufen lassen, der nur den Eintrag mit dem Zeitwert vergleicht, auf den der Index verweist.

Gruß
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Noch was: bei derart zeitbezogenen Systemen mußt Du höllisch aufpassen beim Testen, speziell beim Speichern!!! Zu schnell hat man mal an der falschen Stelle die Grundstellung überschrieben und dann könnte das ganze Projekt hinüber sein! Ich kann da ein Lied singen.

Gruß
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

bei der Arbeit mit Zeitwerten empfehle ich das Ereignis Zeitpunkt wird erreicht mit der Angabe "Jede Minute". Dieses Ereignis besitzt den Auslöser "Zeit" im Format hh:mm. Wenn du nun für deine Indizes in den Tabellen dieses Format nutzt, kannst du direkt per Auslöser auf den Tabelleneintrag zugreifen (mit den Standardmitteln der grafischen EV/Lua).

Auf Timer würde ich verzichten, da sie nicht direkt an die Simulationszeit gekoppelt sind.

Viele Grüße,

Neo

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Andy,

vor 5 Minuten schrieb Andy:

was, wenn auf einen Eintrag einer mit der gleichen Zeit folgt?

soweit ich MarkoP richtig verstehe, verwendet er die Abfahrtszeiten als Index in einer Tabelle. Doppelte Indizes können in einer Tabelle nicht vorkommen.

Viele Grüße,

Neo

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Minuten schrieb Andy:

alles andere als eine natürliche Zahl kann ich mir als Index nicht vorstellen.

Hallo Andy,

Der Bezeichner kann wahlweise eine Zahl oder ein String sein.

Zahlen als Index ergeben eine Liste
Strings als Index ergeben eine Tabelle. Den "NeunUhrFünften" Eintrag gibt es in dieser Form nicht, weil in einer Tabelle nichr durchgezählt wird. Strings als Bezeichner kannst du besser mit Sprungadressen vergleichen.

Viele Grüße
Götz

Bearbeitet von Goetz
Ergänzungen
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Götz,
ist gut gemeint, aber offensichtlich bin ich in einem anderen Universum groß geworden. Bei mir hat eine Tabelle (Array) Indizes (ggf. mehrere, je nach Dimension) und eine Liste (List) keinen, weil dort die Datenelemente Einträge besitzen, die auf das vorangegangene bzw. folgende Listenelement verweisen. Bitte laß uns die Diskussion an dieser Stelle beenden, ich mag nicht mehr. Warten wir darauf, was MarkoP dazu sagt.

Gruß
  Andy

Bearbeitet von Andy
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Andy:

offensichtlich bin ich in einem anderen Universum groß geworden

Stimmt, Andy.
Dieselben Begriffe werden in den verschiedenen Programmiersprachen sehr unterschiedlich verwendet. Man muss sich da jeweils anpassen und umdenken. Meine Beschreibung bezieht sich auf die Bedeutung von Listen und Tabellen im MBS. Weil die (und nur die) relevant ist, wenn man im Studio Listen oder Tabellen verwendet.

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Neo

Wenn ich mit "jede Minute" auf den Indizes abgleichen, wie kann  ich dann feststellen welche Zeile zutrifft.

Um die anderen Felder der Tabelle zuzuweisen muss ich ja dann eine bestimmte Zeile der Tabelle vorgeben. Das zuweisen erfolgt ja nicht im gleichen Schritt.

Weiterhin muss ich mir was überlegen wie ich die zu benutzende Fahrstraße in Abhängigkeit des Gleises und Ziels anfordern kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 38 Minuten schrieb MarkoP:

Wenn ich mit "jede Minute" auf den Indizes abgleichen, wie kann  ich dann feststellen welche Zeile zutrifft.

Hallo Marko

Wenn du noch ein paar Tage Geduld hast (bis ich wieder zuhause bin), dann versuche ich gerne ein Beispiel für dich zu erstellen.

Viele Grüße

Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da ich mit dem Bereich Listen/Tabellen nicht wirklich klar komme (in der Form wie sie im Modelleisenbahnplaner benutzt werden) nehme ich jede Hilfe an. Generell komme ich mit der aktuellen grafischen EV nicht wirklich klar und habe unheimlich Verständnisprobleme bei der Auswahl von Objekten/Variablen etc.

Natürlich probiere ich in der Zeit auch selber noch weiter rum.

 

Damit du etwas mehr Hintergrundinfos hast:

Meine Loks haben verschiedene Objektvariablen. Da ist das Ziel, die Route, die Zugnummer, der Loktyp, die Zugart und das Zielgleis.

Die ersten drei dienen dem Befüllen der Anzeigetafeln im Bahnhof, Loktyp und Zugart zur Routenauswahl, also woher, wohin und welche Strecke und das Zielgleis gibt vor welches Gleis im Bahnhof angesteuert werden soll, also welche Fahrstraße freigegeben werden muss.

Nach dem Halt, müssen die Variablen zum Teil dann mit neuen Werten gefüttert werden.

Dazu habe ich wie gesagt eine unabhängige Variable mit einer Liste erstelle bei der jeder Listenpunkt eine Tabelle mit Abfahrtszeit, Ziel (Endziel als Anzeige), Route und Zielgleis sowie den nächsten Bahnhof (für die Richtungswahl) beinhaltet.

Ich möchte also mit "jede Minuten" prüfen ob die aktuelle Zeit zu einem der Werte in den jeweiligen Tabelleneinträgen der Listen passt.
Wenn dem so ist, sollen die Objektvariablen mit den Tabelleninhalten neu befüllt werden und die Fahrstraße für das Ausfahrtsgleis (in Abhängigkeit des Gleises auf dem der Zug steht und der Richtung in die er fahren soll) angefordert werden.

 

Ein weiteres Problem bei der Bahnhofssteuerung ist auch der Richtungswechsel. Die Einfahrt erfolgt über eine Fahrstraße bei der das Ausfahrtssignal auf HP00 gestellt wird. Bei einem Richtungswechsel müsste aber nicht das Ausfahrtssignal reagieren, sondern das Einfahrtssignal nach dem Überfahren.

Und zur Vereinfachung würde ich gerne beim Richtungswechsel die Triebwagen wechseln, also einfach den Moter beim einen ausschalten und beim anderen einschalten - geht sowas ohne den Namen der Lok zu kennen?

 

Soweit meine Idee - mal sehen was dir dazu einfällt (oder mir)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 27.1.2022 um 19:55 schrieb MarkoP:

Ich möchte also mit "jede Minuten" prüfen ob die aktuelle Zeit zu einem der Werte in den jeweiligen Tabelleneinträgen der Listen passt.

Hallo Marko,
das kannst du theoretisch zwar machen, aber es erzeugt eine gigantische Rechnerlast, die nicht notwendig ist.
Denn du müsstest bei diesem System alle Tabelleneinträge durchforsten, bis du den passenden gefunden hast.

Wenn du stattdessen die Uhrzeiten als Bezeichner für Tabellenplätze verwendest, dann kannst du jede Minute ganz einfach prüfen, ob ein Tabellenplatz existiert, der die aktuelle Uhrzeit als Bezeichner hat. Und wenn es den Platz gibt, dann nutzt du den Inhalt dieses Tabellenplatzes um z.B. eine Fahrstraße zu schalten.

Die Tabelle sieht in dem Fall so aus:

373118913_Fahrplan01.jpg.292fecde6c0cc40540b61465a2aceb48.jpg

 

Und die EV für das Ereignis "Zeitpunkt erreicht" sieht so aus:

665286607_Fahrplan02.thumb.jpg.f30e2718d352e5c8e2c27cf53ba42c80.jpg

 

In diesem sehr einfachen Beispiel wird nur jede Minute ein neuer Text in ein Textfeld geschrieben.
Wenn die Uhrzeit in der Tabelle gefunden wird, dann wird der Text aus der "Fahrplan" Tabelle genommen. Andernfalls wird einfach die Uhrzeit auf das Textfeld geschrieben.

Jedes Ereignis bringt in dem Moment, wo es ausgelöst wird, eine oder mehrere Variablen mit. Das sind Werte, die individuell zu diesem Ereignis gehören.
Beim Ereignis "Zeitpunkt erreicht" ist es eine einzelne Variable. Sie enthält die Uhrzeit in Form eines Strings (sprich: in Textform).
Die individuellen Parameter, die vom Ereignis selbst mitgegeben werden, findet man stets über das Zahnrad mit dem Begriff "Auslöser"

Deshalb bekomme ich im obigen Beispiel jede Minute mit "Auslöser" die Zeit zu fassen, um die das Ereignis ausgelöst wurde. Und kann prüfen, ob es einen Tabellenplatz mit diesem Namen gibt.

Weil das MBS wirklich sehr gut durchstrukturiert ist, funktioniert die oben beschriebene Methode bei jeder Geschwindigkeit, egal ob ich in den Anlageneinstellungen die Dauer eines Tages ändere ...

997879374_Fahrplan03.jpg.7a8e7b5f25437b2b73bdaeaf494f1d25.jpg

oder oben in der Kopfleiste eine höhere Abspielgeschwindigkeit wähle.

Referenz bleibt in jedem Fall die unten angezeigte Uhrzeit.

 

Am 27.1.2022 um 19:55 schrieb MarkoP:

Generell komme ich mit der aktuellen grafischen EV nicht wirklich klar

Vielleicht müssten wir zunächst hier ansetzen, bevor wir eine komplexe Fahrplansteuerung mit Anzeigetafeln und vielerlei mehr angehen?
Ich weiß nur leider nicht, wo genau deine Verständnisprobleme sitzen. Deshalb kann ich dir noch nicht die entscheidenden Hinweise geben.

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mein grundsätzliches Verständnis ist in so fern unklar, dass ich nie die Reihenfolge und Zugehörigkeit erkenne.

Was ich meine lässt sich am einfachsten an einem Beispiel erklären: ich möchte aus einer Objektvaribale einer Lok beim berühren eines Gleiskontaktes einen Wert auslesen.

Mein Problem ist, dass ich nicht begreife ob ich erst den Auslöser und dann das Objekt und zuletzt die Variable auswählen muss oder beispielsweise erst die Variable des Objekts das den Kontakt auslöst oder womöglich erst den Kontakt und dann die Variable des Objekts.

Ich hoffe es ist verständlich geschrieben. 

 

Was den Fahrplan angeht ist das schon so wie ich es mir gedacht habe. Lediglich weiß ich nicht, wie ich an die restlichen Werte aus der Tabellenzeile der zutreffen Zeit komme.

Ich kann mit jede Minute eben nur prüfen ob ein Eintrag der Tabelle mit der aktuellen Zeit übereinstimmt. Aber ich muss ja an die restlichen Felder dieser einen Zeile rankommen. Denn ich will ja bei erreichen von z.b. "12:05" das Ziel, die Route etc. aus genau dieser Zeile an die Lok übertragen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Minuten schrieb MarkoP:

Ich hoffe es ist verständlich geschrieben. 

Ja, das ist es.

Und die Antwort ist:
Du musst immer zuerst das Objekt nennen und dann die Variable in diesem Objekt.
Wenn es sich um eine Lok handelt, die einen Gleiskontakt betritt, dann bringt dieses Ereignis zwei Argumente mit:

  1. den Kontakt, der betreten wurde
  2. die Lok, welche den Kontakt betreten hat

Deshalb musst du als Objekt "Auslöser" wählen und dann aus der Liste von Auslösern das "Fahrzeug" nehmen.

Der Weg zur Variable im auslösenden Fahrzeug führt über die "erweiterte Variable". Die bietet dir zwei Felder, damit du im oberen Feld das auslösende Fahrzeug angeben kannst und im unteren dann den Namen der Variablen, die in diesem Fahrzeug gefunden werden soll:

1971434642_Fahrplan04.jpg.7a51ea95086b3cd92789fdfd4ba90773.jpg

 

vor 12 Minuten schrieb MarkoP:

Lediglich weiß ich nicht, wie ich an die restlichen Werte aus der Tabellenzeile der zutreffen Zeit komme.

Das kannst du im obigen Beispiel sehen.
In meinem Fall ist der Inhalt nur ein Text. Aber das Prinzip ist immer gleich:

Du wählst unter dem Zahnrad den letzten Punkt "Variable (Liste/Tabelle)". Das ist dein Zugriff auf den Inhalt dieser Zelle. Wenn der wiederum eine Tabelle mit mehreren Einträgen ist, dann musst du dasselbe Prinzip noch einmal anwenden, um an die Untertabellen zu gelangen. 

1286687612_Fahrplan05.jpg.47b19d97f43493a35cb13ba1f48b124c.jpg

 

Viele Grüße
Götz

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 16 Minuten schrieb MarkoP:

Ich weiß nicht wo du den Index "Zeit" hernimmst.

Jedes Ereignis bringt - wie ein Funktionsaufruf - Argumente mit. Also einen oder mehrere Parameter.
Das Ereignis "Zeitpunkt erreicht" stellt unter "Auslöser" den Parameter "Zeit" zur Verfügung.
Er enthält die aktuelle MBS-Uhrzeit als Text in der Form "hh:mm", also Stunde und Minute jeweils zweistellig geschrieben, mit einem Doppelpunkt dazwischen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb MarkoP:

Was den Fahrplan angeht ist das schon so wie ich es mir gedacht habe.

Tut mir leid, Marko, aber das ist es nicht.

Deine Tabelle ist nicht nach dem Muster organisiert, welches ich dir vorgeschlagen habe:

145925181_Fahrplan06.jpg.57c5e328019f1ce0ac121d0784ec3021.jpg

Du verwendest nicht, wie von mir empfohlen, die Uhrzeit als Bezeichner.

Siehst du den Unterschied?

373118913_Fahrplan01.jpg.292fecde6c0cc40540b61465a2aceb48.jpg

 

Dieses Ereignis

1227366939_Fahrplan07.jpg.f4d326ccec32a1fcf38ef3014cc97fdb.jpg

hat auch nur wenig Ähnlichkeit mit dem, was ich dir vorgeschlagen habe.
 

Außerdem würde ich dir dringend empfehlen, deine große Anlage beiseite zu legen und das ganze Prinzip mit Minibeispielen zu erforschen. 

Viele Grüße
Götz

 

Bearbeitet von Goetz
Ergänzungen
Link zu diesem Kommentar
Auf anderen Seiten teilen

Sorry, du hast die falsche Tabelle erwischt. Die ICE 32 war ein erster Versuch.

Ich arbeite im Moment mit der ICE  411-Tablle und eben diesem Zug (der ICE3 mit dem roten Streifen)

 

In der aktuellen Version habe ich es geschafft, dass der Zeitpunkt erkannt wird.
Leider läuft die Aktion der Variablenübertragung in einen Fehler. Und die Fehlermeldungen sind für mich leider nicht wirklich aussagekräftig.

 

Bahnhof V2.mbp

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 22 Minuten schrieb MarkoP:

Ich arbeite im Moment mit der ICE  411-Tablle

Die ist in dem Beispiel, das du mir zuerst geschickt hattest, komplett leer gewesen.
Deshalb hatte ich mich auf die Tabelle konzentriert, die wenigstens einen Inhalt hatte ...

Bearbeitet von Goetz
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...