Jump to content

Hilfe bei der EV für eine Zuganzeige


Empfohlene Beiträge

Hallo,

 

ich möchte gerne eine Zuganzeige wie an Bus- oder S-Bahn-Stationen hängt basteln.
Dafür gibt es ja das Modell mit Beschriftungsfunktion.

Würde da jetzt eine Variable mit einer Liste erstellen, in der die einzelnen Zug/Bus-Daten stehen die an dieser Station halt machen.
Allerdings habe ich noch keine Idee wie ich die Datensätze "hochschieben" nach einer Abfahrt bzw. wie ich neue Einträge an die Liste anhängen kann um sie zu ergänzen wenn der nächste Bus/Bahn kommt.

Irgendwie muss das ja mit der Auslöser-Funktion in der EV gehen, aber das ist im Moment ein rotes Tuch für mich.

Wer könnte mir da mal mit Rat und Tat zur Seite stehen und eine beispielhafte Anzeige inklusive zugehöriger EV-Steuerung mit mir zusammen erstellen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Anlagendesigner,

gib' mal die ID des Modells mit Beschriftungsfunktion, das Du meinst. Es gibt mehrere.

Ist die Zugfolge immer gleich? Dann könnte man eine kreisförmige Liste bauen. Oder kommen die Züge mal so mal so? Dann müssen die erforderlichen Daten in den Zügen hinterlegt werden. Diese Lösung ist flexibler, es braucht keine Liste und man muss auch nichts "hochschieben". Und Du könntest mehrere Stationen mit Zuganzeige haben, welche dann mit der gleichen Routine den jeweils nächsten Zug anzeigen.

Beste Grüße

Phrontistes

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Anzeige die ich aktuell verwende hat die ID: 04506C8C-DEF2-4091-9CEF-91FAC6DCD25D

Welche anderen gibt es denn da noch mit denen man mehrere Objekte untereinander listen kann. Die anderen mir bekannten sind für die Bahnsteige mit weitergehenden Informationen wie Ziel, Gleis etc.. Für meinen Zweck habe ich bisher nur dieses eine Modell als gut geeignet gefunden. Was nicht heißt, dass mir was entgangen ist.

Grundsätzlich sollen die Busse und S-Bahnen immer in gleicher Reihenfolge kommen und im Kreis fahren mit passendem Gegenverkehr. Also ein Kreis in Richtung X und ein Kreis in Richtung -x mit jeweils 2-3 Bussen/S-Bahnen auf jeder Linie.

Da ich mich grundsätzlich bemühe flexibel zu bauen ist die Variante mit den Daten aus den Zügen wohl effektiver und anpassbarer, besonders, da gerade beim Busverkehr die gleiche Reihenfolge ja nicht 100% garantiert werden kann (bedingt durch Ampeln und Kreuzungen an denen gewartet werden muss). Aber muss nicht auch dann in der EV ein Listenobjekt für die Anzeige genutzt werden? Wie sonst sollen die Daten vom Bus/S-Bahn in die Anzeige "eingereiht" (also angehangen) werden? Die Daten aus den Zügen zu übergeben bekomme ich hin, aber die Reihenfolge auf der Anzeige einzuhalten bereitet mir Probleme.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Anlagendesigner,

vergesse das Listenobjekt. Es reicht, wenn Du in den Fahrweg einen Gleiskontakt rechtzeitig vorher setzt, der dafür sorgt, das die im Zug in Variablen hinterlegten Beschriftungen in die Anzeige geschrieben werden. Und wenn der Zug ausfährt, setzt Du die Anzeige auf "leer". Wenn Du mehrere Haltstellen entsprechend "bestücken" willst, dann musst Du im Gleiskontakt logischerweise auch noch das ihm zugehörige Anzeigenobjekt hinterlegen.

Hier ein Beispiel, wie man das machen kann. Die Ereignisse "Zielanzeige setzen" und "Zielanzeige löschen" sind allgemeingültig. Du musst nur noch in "passenden" Kontakten das Auslöser-Schlagwort und in den Zügen die Beschriftungsvariablen eintragen.

Anlagendesigner Zugzielanzeige.mbp

Beste Grüße

Phrontistes

Bearbeitet von Phrontistes
typo
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich habe mir mal noch überlegt, wie man automatisiert die Abfahrzeit der Zuganzeige sinnvoll füllen könnte, nämlich mit der aktuellen Simulationszeit (wer die Simulationszeit nicht laufen lässt, kann sich den Aufwand sparen) + x min. Das kann man so umsetzen (nur mit Lua möglich):

Screenshot2024-05-28172136.jpg.3062a87ac4b4089e0bf61c8f674c900d.jpg

local inputTime = tostring(layout.time)
local hours, minutes = inputTime:match("(%d%d):(%d%d)")
minutes = tonumber(minutes) + AddMinutes
if minutes >= 60 then
    minutes = minutes - 60
    hours = tonumber(hours) + 1
end
local newTime = string.format("%02d:%02d", hours, minutes)
LabelObject.labels[LabelText].text = newTime
  • AddMinutes (number) muss man austüfteln; das hängt u.a. davon ab, wie schnell man die Simulationszeit laufen lässt. Mehr als 60 darf man nicht übergeben; diesen Fehler fange ich nicht ab.
  • LabelObject (object) ist das Zuganzeigeobjekt
  • LabelText (text) ist bei 04506C8C-DEF2-4091-9CEF-91FAC6DCD25D immer "01 Abfahrtszeit"

Beste Grüße

Phrontistes

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo, so weit ist das klar, aber ich deke wir reden aneinander vorbei.

Mir geht es um eine Liste der kommenden Busse/S-Bahnen pro Haltestelle wie zb so:

L1     Hauptbahhof            5 Min
L3     Dom                          8 Min
SB1   Agentur f. Arbeit     10 Min
L2     Schwimmbad           12 Min

Die Zeitanzeige kann auch als richtige Abfahrtzeit angegeben werden.

Es geht also nicht um den nächsten Zug, sondern um die 3-4 kommenden Züge.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb Anlagendesigner:

Es geht also nicht um den nächsten Zug, sondern um die 3-4 kommenden Züge.

Dann musst Du halt drei oder vier 04506C8C-DEF2-4091-9CEF-91FAC6DCD25D übereinanderstellen und mit entsprechend entfernten Gleiskontakten füllen und immer wenn ein Zug abfährt die Einträge eines aufrücken (in die jetzt freie Stelle 1 kopieren, was in 2 steht usw.).

Beste Grüße

Phrontistes

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann müsste ich dutzende Gleiskontakte verbauen, da die Busse/S-Bahnen nicht alle die gleiche Route fahren. Es soll wie im echten Leben mehrere Linien geben, die ein und die gleiche Station anfahren aber verschiedene Strecken und dadurch unterschiedliche Stationen anfahren.

Da einige Busse/S-Bahnen dann natürlich ebenfalls diese Strecken und Gleiskontakte befahren, die betreffende Station aber nicht anfahren, müsste schon wieder eine Bedingung vorher abgefragt werden ob die betreffende Station angefahren wied oder nicht.

 

Ist halt etwas komplexer als eine einfache Zuganzeige am Bahnhof, die lediglich den nächsten eintreffenden Zug anzeigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 27.5.2024 um 22:18 schrieb Anlagendesigner:

(k)eine Idee wie ich die Datensätze "hochschieben" nach einer Abfahrt bzw. wie ich neue Einträge an die Liste anhängen kann

Hallo Anlagendesigner,
um den Inhalt einer Liste zu verschieben oder zu rotieren, musst du bitte Lua bemühen.
Dazu übergibst du zuerst die im Studio angelegte Liste an eine Lua Variable.
Diese Kopie kannst du mit Lua verändern.
Anschließend übergibst du die veränderte Liste wieder ans Studio.

Hier ist ein Beispielskript:

local t = $("Ereignisse").variables["Beatles"]
table.insert(t, table.remove(t, 1))
$("Ereignisse").variables["Beatles"] = t

und die Beispielanlage dazu:

Liste weiterschieben.mbp

Schau mal bitte, ob dir das bei deinen Überlegungen weiterhilft?
Götz

 

Ergänzung:

Um zu der aktuellen Anlagenzeit ein paar Minuten zu addieren, genügt eine einzelne Lua Zeile:

$("Textfeld").text = layout.time + toTime("00:20")    

Da bei dieser Methode die Zeit ein Objekt vom Typ Zeit bleibt, muss man sich weder um den Sprung von Minuten zu Stunden, noch um die Rücksetzung um Mitternacht kümmern. Das erledigt das Objekt selbständig. 

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

Hallo @Goetz,

da ich mit Lua bisher nichts zu schaffen habe würde ich eine Variante ohne Lua bevorzugen. Würde ungern noch eine Programmiersprache lernen müssen, da ich im Webdesin mit HTML, php, python, java etc. schon genug Sprachen beherschen muss.

 

Wenn es nicht anders geht ist es halt so, aber vielleicht gibt es da ja eine Alternative.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Anlagendesigner,
wenn du schon so viele Sprachen beherrscht, dann weißt du doch inzwischen, dass sie im Kern alle dasselbe tun.

Unterschiedliche Schreibweisen kannst du nachlesen. Darüber hinaus bietet dir das Studio viel Hilfe.
Du kannst jeden Eintrag in der grafischen EV direkt in Lua wandeln.
Und du kannst im Editor zu jedem Befehl eine kurze Hilfe (Strg + Leertaste) öffnen. 

Für komplexe Vorhaben wie deins ist Lua die einzig vernünftige Alternative. Mit der graphischen EV wird das sehr hampelig.

Deine Entscheidung
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das die Funktionsweisen gleich sind ist sicherlich richtig, doch wie du selbst sagst ist die Syntex und auch die Symantic in jeder Sprache anders.
Deshalb versuche ich nur das zu lernen was ich wirklich brauche. Bestes Beispiel ist Typoscript in Typo3. Funktionsweise ist praktisch identisch mit Javascript, dennoch in vielen Belangen eine andere Syntex die man sich wieder merken muss.

Bisher kam ich ohne Lua nur mit der grafischen EV ganz gut klar, habe allerdings vermutet, dass ich irgendwann um die Programmiersprache nicht mehr herum komme. Dennoch würde ich es erst einmal gerne in der grafischen EV probieren. Schließlich ist mein Problem weniger in der Programmierung als im Verständnis des Ablaufs zu Grunde gelegt. Auch bei Lua muss ich ja erst einmal verstehen wann ich was wie wo eintagen muss um mein Ziel um erreichen. Und da hapert es ja im Augenblick eigentlich mehr.

Ich hatte irgentwann mal gelesen, dass man die Angaben in einem Listenobjekt speichern soll und dann bei jedem ein-/ausfahrenden Buss/S-Bahn mit den einzelnen Datensätzen des Listenobjekts vergleichen muss. Doch bei mir fehlt aktuell schon das Verständnis wie ein solches Listenobjekt aufgebaut sein sollte. Wenn du oder jemand anderes mir also dabei behilflich sein könnte, würde ich anschließend den nächsten Schritt angehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Minuten schrieb Anlagendesigner:

wie ein solches Listenobjekt aufgebaut sein sollte

Für die Anzeigetafel benötigst du eine Liste.
Jedes Element dieser Liste ist dann eine Tabelle mit den Inhalten für die einzelnen Textfelder jeder Zeile:

Abfahrtzeiten.thumb.jpg.f9c2f97da19dffa7636fb99ea1738366.jpg

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, das kann ich erstmal imsetzen.

Wie kann ich dann die einzelnen Felder ansprechen?

Ist ja zb. das 3. Feld der ersten Zeile oder das 2. Feld der zweiten Zeile. Also nicht zwingend die Felder in der vorliegenden Reihenfolge.

 

Sowohl das Befüllen als auch das Auslesen der einzelnen Felder.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gerade eben schrieb Anlagendesigner:

Wie kann ich dann die einzelnen Felder ansprechen?

Du wählst für den Inhalt per Zahnrad "Variable (Liste/Tabelle)" und dann anstelle der Variablen noch ein zweites Mal "Variable (Liste/Tabelle)".
Damit bekommst du die benötigte Struktur Variable[Index][Bezeichner], um aus deinem Listenkonstrukt die passenden Inhalte für die einzelnen Textfelder zu holen:

Abfahrtzeiteneintragen.thumb.jpg.c4555cec429cdf14ad786becc4523493.jpg

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Goetz,

danke für die Informationen. Da fängt es bei mir mit der Verständnisproblem nämlich an. Ich kapiere z. B. nicht warum die Variable (List/Tabelle) doppelt vorhanden muss. Die Logik dahinter erschließt sich mir einfach nicht und daher die Probleme beim Verstehen.

Hast du da Hintergrundinfos warum?

Tabelle heißt für mich ja x Zeilen und x Spalten. Mit dem Doppeleintrag habe ich ja quasi in jeder dieser Zellen wieder x Spalten und x Zeilen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Minuten schrieb Anlagendesigner:

warum die Variable (List/Tabelle) doppelt vorhanden muss.

Weil ich eine Liste von Tabellen angelegt habe.

Für eine Zeile der Anzeigetafel muss ich mehrere Felder befüllen:
Zeit - Linie - Zwischenhalt - Ziel
Das ist eine Tabelle.

Wenn ich mehrere Zeilen dieser Art befüllen muss, lege ich eine Liste an, deren Elemente jeweils solch eine Tabelle sind.

Also benötige ich zum Ansprechen den Namen der Liste, den Index zur Zeile und dann unter diesem Index die einzelnen Elemente der Tabelle.

Das ist ein XY Konstrukt 

X = Liste = Zeilennummer
Y = Tabelle = Spaltenname

Tabelle bedeutet nur, dass jede Zeile einen Bezeichner hat.
Im Gegensatz dazu sind bei Listen die Elemente fortlaufend nummeriert.

 

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

vor 6 Minuten schrieb Anlagendesigner:

eine ID, z. B. die Zugnummer oder Liniennummer

Nein, die Zeilen sind einfach nur von oben nach unten durchnummeriert.
Das hat mit der Liniennummer nichts zu tun.

Die Linie (sowie Uhrzeit, Fahrziel etc.) trägst du dann als Inhalt in diese Zeile ein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Anlagendesigner:

dass ich den Bus/S-Bahn nicht einer speziellen Zeile zugeordnen kann

Diese Zuordnung wäre doch auch falsch.
Die Reihenfolge auf der Tafel richtet sich doch nach den Abfahrzeiten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum willst du einen Bus einer bestimmten Zeile zuordnen?
Der erste Bus, der kommt, wird mit all seinen Details in die oberste Zeile geschrieben.
Der nächste Bus kommt in Zeile 2 usw.

Fährt der erste Bus ab, dann werden alle Texte um eine Zeile nach oben gerückt.

das heißt:

  1. Abfahrtzeiten[1] bekommt die komplette Tabelle aus Abfahrtzeiten[2]
  2. Abfahrtzeiten[2] bekommt die komplette Tabelle aus Abfahrtzeiten[3]

usw.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich bin jetzt seit über zwei Stunden dran und bekomme es einfach nicht hin.

Grundsätzlich erstmal die Frage ist die Liste eine Objektvariable oder eine Programmvariable, falls Objektvariable, dann zu welchem Objekt zugeordnet Bus/S-Bahn oder Anzeigetafel (Gesamte Gruppe oder Einzelelement)?

Dann kann ich aktuell nur die Zeilennummer als Variablennamen auswählen beim Textzuweisen (lasse ich aktuell von einem Gleiskontakt auslösen). Bricht aber beim Auslösen die Verarbeitung ab.

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