Anlagendesigner Geschrieben 27. Mai Geschrieben 27. Mai 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?
Phrontistes Geschrieben 27. Mai Geschrieben 27. Mai 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
Anlagendesigner Geschrieben 28. Mai Autor Geschrieben 28. Mai 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.
Phrontistes Geschrieben 28. Mai Geschrieben 28. Mai (bearbeitet) 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 28. Mai von Phrontistes typo
Phrontistes Geschrieben 28. Mai Geschrieben 28. Mai 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): 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
Anlagendesigner Geschrieben 28. Mai Autor Geschrieben 28. Mai 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.
Phrontistes Geschrieben 28. Mai Geschrieben 28. Mai 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
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai 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.
Goetz Geschrieben 29. Mai Geschrieben 29. Mai (bearbeitet) 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 29. Mai von Goetz Ergänzungen
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai 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.
Goetz Geschrieben 29. Mai Geschrieben 29. Mai 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
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai 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.
Goetz Geschrieben 29. Mai Geschrieben 29. Mai (bearbeitet) 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: Bearbeitet 29. Mai von Goetz
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai 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.
Goetz Geschrieben 29. Mai Geschrieben 29. Mai 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:
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai 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.
Goetz Geschrieben 29. Mai Geschrieben 29. Mai (bearbeitet) 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 29. Mai von Goetz Ergänzungen
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai Bedeutet ich habe je Zeile (Bus/S-Bahn) eine ID, z. B. die Zugnummer oder Liniennummer. Die muss ich bei jedem Zug vergleichen der ein-/ausfährt. Werde heute Nachmittag mal probieren das am realen Beispiel nachzubilden.
Goetz Geschrieben 29. Mai Geschrieben 29. Mai 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.
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai Dann habe ich aber doch wieder das Problem, dass ich den Bus/S-Bahn nicht einer speziellen Zeile zugeordnen kann oder was verstehe ich nich?
Goetz Geschrieben 29. Mai Geschrieben 29. Mai 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.
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai Dann habe ich aber doch wieder das Problem, dass ich den Bus/S-Bahn nicht einer speziellen Zeile zugeordnen kann oder was verstehe ich nich?
Goetz Geschrieben 29. Mai Geschrieben 29. Mai 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: Abfahrtzeiten[1] bekommt die komplette Tabelle aus Abfahrtzeiten[2] Abfahrtzeiten[2] bekommt die komplette Tabelle aus Abfahrtzeiten[3] usw.
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai Ich schätze ich denke zu kompliziert. Lsss mich das mal im Studio real nachbilden. Denke so gegen 15 Uhr bin ich zu Hause und kann das probieren.
Anlagendesigner Geschrieben 29. Mai Autor Geschrieben 29. Mai 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.
Empfohlene Beiträge
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 erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden