virt. Depotausfahrt nach Uhrzeit

!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
  • Hallo in die Runde,


    benötige einen Denkanstoss für mein Versuchscript, die Züge sollen jeweils nach

    der vorgegebenen Uhrzeit ausfahren.
    Nur wird durch das triggern der Funktion in der EEPMain() die Ausfahrtfunktion

    in der Minute alle 200 ms augerufen und ausgeführt.
    Wie kann ich den Funktionsaufruf EEPGetTrainFromTrainyard(3, "", 4, 0)

    auf einen Aufruf jeweils begrenzen?


    Gruß Dieter

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E, HomeNos 15


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    https://www.twitch.tv/parry_36/

    The post was edited 2 times, last by Parry36 ().

  • Ja, das könnte funktionieren, danke für den Rat.


    Gruß Dieter

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E, HomeNos 15


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    https://www.twitch.tv/parry_36/

  • oder so:

    LUA Source Code
    1. if lastMinute ~= EEPTimeM then
    2. lastMinute = EEPTimeM
    3. ...
    4. end

    So bist du nicht darauf angewiesen, dass die EEPMain exakt 300x pro Minute ausgeführt wird.


    Viele Grüße

    Benny


    PS: Ich bin kein Fan von Abkürzungen, da sie normalerweise nur (unnötiges) Nachdenken verursachen. In diesem Fall ist mir immer noch nicht klar, was du mit "vert." im Thementitel meinst.

  • Ja, @Benny,

    das könnte auf jeden Fall sicherer sein.
    Danke, werde das ausprobieren.


    Gruß Dieter

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E, HomeNos 15


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    https://www.twitch.tv/parry_36/

  • Man könnte das Ganze auch noch weiter verfeinern, in dem
    in der Tabelle a_Rl_Gw auch noch der Zugname aufgenommen wird.

    Etwa so:

    LUA Source Code
    1. a_Rl_Gw = {["05:05"] = "DB_Pers_01",
    2. ["06:13"] = "#Rheingold", ... usw.}

    PS: @BH2, Benny, da habe ich mich glatt vertippt, es müsste virt. Depot heißen.

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E, HomeNos 15


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    https://www.twitch.tv/parry_36/

    The post was edited 1 time, last by Parry36 ().

  • Anscheinend ist mein Codeschnipsel oben nicht selbsterklärend, deshalb reiche ich hier noch eine solche nach.


    Das Ziel ist, den Code (...) nur einmal pro Minute auszuführen, ohne die Durchläufe der EEPMain zählen zu müssen (das kann schiefgehen).


    Die Lösung besteht darin, den Code nur dann auszuführen, wenn sich die Minute ändert. Dazu wird die Minute des vorherigen EEPMain-Durchlaufs in lastMinute gespeichert, und jedesmal verglichen.

    Ist die aktuelle Minute (EEPTimeM) gleich der gespeicherten? Dann mach nichts, denn diese Minute wurde ja schon abgehandelt.

    Wenn die aktuelle Minute sich aber von der gespeicherten unterscheidet, sind wir in einer "neuen Minute" angekommen. Dann wird lastMinute auf die aktuelle Minute aktualisiert, und der gewünschte Code einmal ausgeführt.


    Falls immer noch etwas unklar ist, einfach nochmal fragen.


    Viele Grüße

    Benny

  • Gemeinsam mit Benny ist folgender finaler Code entstanden:


    Gruß Dieter

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E, HomeNos 15


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    https://www.twitch.tv/parry_36/

    The post was edited 2 times, last by Parry36: Rechtschreibfehler ().

  • Ich möchte gerne

    einen Denkanstoss

    ... zu den Uhrzeiten beisteuern:

    Wenn man die Tabelle im Vorfeld einmal umformt und aus den Strings Zahlen macht, dann erleichtert das den späteren Vergleich in jedem Main Zyklus ganz erheblich.



    Die Zeilen 5-9 ersetzen jeden String in a_Rl_Gw durch eine äquivalente Zahl (Sekunden seit Mitternacht)

    Diese Zahl kann man bequem mit EEPTime (Sekunden seit EEP-Mitternacht) vergleichen.


    Und wenn man davon ausgeht, dass die Uhrzeiten in a_Rl_Gw chronologisch aufgeführt sind, dann muss man in jedem Main-Zyklus nur den ersten Eintrag in der Tabelle betrachten. Ist dieser Wert größer als die aktuelle Uhrzeit, dann geschieht nichts.

    Entspricht er der aktuellen Uhrzeit, dann wird ein Zug rausgeschickt. Gleichzeitig wird dieser Eintrag ans Ende der Tabelle verfrachtet, weil er erst am Folgetag wieder dran ist. Damit entfällt die Prüfung, ob diese Minute schon erledigt wurde.


    Ist der Tabellenwert niedriger als die aktuelle Zeit, dann wurde die Anlage "mitten am Tag" gestartet. Also muss er ebenfalls ans Tabellenende, um für den Folgetag wieder verfügbar zu sein.


    Wenn man mit unsortierten Uhrzeiten rechnen muss, dann erweitert man das Skript dahingehend, dass man die Tabelle nach Umformung einmal sortiert.


    Viele Grüße

    Götz

    Zug! Ich bin dein Vater!

    The post was edited 2 times, last by Goetz ().

  • Noch besser gefällt mir Parrys Idee, die Uhrzeit als Index zu verwenden.

    Aber nicht als String, sondern als Zahl.

    Kombiniert mit Bennys lastTime ~= EEPTimeM erspart einem das ebenfalls, die ganze Tabelle nach einem passenden Eintrag abklappern zu müssen.


    Zug! Ich bin dein Vater!

    The post was edited 3 times, last by Goetz: Die Möglichkeit Dateianhänge zu nutzen, ist nicht dafür gedacht *.zip Dateien anzuhängen. ().

  • Danke euch allen :aa_1:

    bin gerade dabei mein Projekt Oldenburer HBF über Fahrplan zu erstellen.

    Hatte nach einer Lösung bezüglich der Zeiten gesucht, Wollte dies über Sekunden erst einstellen, aber mit Minuten ist dies sinnvoller!


    Gruß Reinhard

    Der Oldenburger :bd_1:

    EEP 15 Plugin1/16 Plugin 1und2|Home-Nos 15 / 16 |Moodellkatalog|Bilder Scanner|Modell Explorer

    Desktop:Gigabyte Z270-HD3P|Intel i5-7400|Corsair Venegance 16 GB DDR4|Gigabyte GeForce GTX 1050Ti|1TB SSD + 3x 1TB HD

    Samsung SyncMaster S27D390 + Samsung SyncMaster P2450|Win 10 Pro

    Laptop Acer Aspire E17|17 Zoll FullHD|i5-6200U|12 GB DDR4|GeForce 940mx 2GB DDR5|256GB SSD|1TB HD|Win 10 Home

    von Blender über HomeNos zu EEP -> Mein youtube Kanal

  • Dank an alle Ratgeber, das finale Script funktioniert prima.

    So ein Echo hatte ich nicht erwartet.


    Lua kann mehr als man denkt, anders gesagt; man kann fast alles

    mit Lua programmieren und wenns hakt, dann eben "together".


    Gruß Dieter

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E, HomeNos 15


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    https://www.twitch.tv/parry_36/

    The post was edited 1 time, last by Parry36 ().

  • Hallo Goetz ,


    ich muss dir leider mitteilen, dass dein Skript Version 2 nicht richtig funktioniert.

    Setze mal beim Start die EEPZeit auf 08:40 Uhr. Nach einer Minute wird der 08:41-Zug pünktlich kommen.

    Wenn er durch ist, setze die EEP-Zeit auf 11:40 Uhr.

    Nun wirst du vergeblich auf den Zug um 11:41 Uhr warten. Der fällt heute aus. :ma_1:

    Dafür kommt aber der 11:42-Zug wieder pünktlich. :ap_1:


    Woran es liegt? Es dürfen 2 aufeinander folgende Abfahrtszeiten nicht zur selben Minute erfolgen. EEPTimeM ist dann nämlich gleich lastTime.

    Wie kann ich dennoch z.B. einen stündlichen Takt zur gleichen Minute realisieren?

    Die Lösung lautet: nicht inMinuten sondern inSekunden. Dann dürfen zwar auch nicht die AbfahrSekunden gleich sein, aber wenn ich 00 und 01 abwechsle, merkt man das nicht.


    Fried-liche Grüße:aq_1: Haltet die Ohren steif, sonst hält die Maske nicht!

    Laptop: i7-4710HQ 2,5GHz, 8GB RAM, Intel HDGraphics 4600, NVIDIA GeForce GTX860M, Windows 10 Pro 2004 64bit

    EEP: Aktuell 15.1.2 und 16.2.3_Plug-in1, HomeNos16, ModellKatalog, Modell-Explorer, Zug-Explorer, BulkInstaller, TauschManager


    Man soll keine Dummheit zweimal begehen. Die Auswahl ist schließlich groß genug.

  • Es dürfen 2 aufeinander folgende Abfahrtszeiten nicht zur selben Minute erfolgen.

    Da es um eine Ausfahrt aus einem Depot nach Fahrplan ging, habe ich ausgeschlossen, dass zwei Züge in der selben Minute ausfahren sollen.

    Und wenn man händisch die Uhrzeit ändert, dann ist es ratsam auch das Skript einmal neu zu starten.


    Eigentlich wollte ich aber auch nur demonstrieren, wie man sich den sehr "teuren" Vergleich vieler Strings in jedem Durchlauf sparen kann.


    P.S.: Wenn du aus einem String drei Zahlen extrahierst, dann bekommst du auch drei Positionswerte, die du auffangen musst. :ae_1:

  • Nein, Götz, das Problem liegt weder am Zeit-Vorstellen, noch an zwei Zügen, die zur selben Zeit losfahren.

    Das Problem tritt dann auf, wenn zwischen zwei Zügen genau eine Stunde (oder ein Vielfaches davon) liegt, sie also zur selben Minute in einer anderen Stunde losfahren sollen. Das tut der zweite Zug nämlich nicht, weil dann (wie von Fried geschrieben) lastTime ~= EEPTimeM ist. Das Zeit-Vorstellen von Fried dient nur dazu, dass du nicht 3 Stunden warten musst.


    Mit einer kleinen Modifikation lässt sich die Variante aber "retten", namlich indem man die Aktualisierung von lastTime nicht daran koppelt, dass auch ein Zug losfährt:

    LUA Source Code
    1. function Depot_Rl()
    2. if lastTime ~= EEPTimeM then
    3. lastTime = EEPTimeM
    4. if Fahrplan[EEPTime//60] then
    5. print(DemoText())
    6. EEPGetTrainFromTrainyard(1, "", 1, 0)
    7. end
    8. end
    9. end


    Viele Grüße

    Benny

  • Und sorry Fried dass ich deinen Hinweis nicht genauer gelesen hatte.

    keine Ursache.:bg_1:

    Ich muss dich aber leider noch auf einen Irrtum hinweisen (oder ich habe ihn falsch verstanden):


    Wenn du aus einem String drei Zahlen extrahierst, dann bekommst du auch drei Positionswerte, die du auffangen musst.

    Lt. Lua-Ref. V5.1 bekommt man mit string.find immer nur 2 Positionswerte zurück, nämlich den 1. und den letzten des Suchmusters und danach soviel Werte, wie die Funktion findet (bei inSekunden 3 : H, M und S). Wusste ich so auch nicht auswendig. Darum hatte ich die Funktion nachgeschlagen als ich sie in deinem Code fand, um zu verstehen, was in pos1 und pos2 steht.


    Ich bin auf die Sache gestoßen, weil ich aus dem hier entwickelten Code einen Fahrplan für die Ausfahrt aus mehreren Depots für definierte Züge zu bestimmten Zeiten entwickeln wollte. Dabei kann es natürlich zu gleichen Abfahrtszeiten aus verschiedenen Depots kommen. Das wollte ich mit unterschiedlichen Abfahrtssekunden umgehen, daher inSekunden. Dazu hatte ich an die im Skript enthaltenen Zeiten immer nur eine :00 angehängt und mich gewundert, dass der 2 Zug (11:42:00) nie kam, bis ich die Ursache fand.

    Fried-liche Grüße:aq_1: Haltet die Ohren steif, sonst hält die Maske nicht!

    Laptop: i7-4710HQ 2,5GHz, 8GB RAM, Intel HDGraphics 4600, NVIDIA GeForce GTX860M, Windows 10 Pro 2004 64bit

    EEP: Aktuell 15.1.2 und 16.2.3_Plug-in1, HomeNos16, ModellKatalog, Modell-Explorer, Zug-Explorer, BulkInstaller, TauschManager


    Man soll keine Dummheit zweimal begehen. Die Auswahl ist schließlich groß genug.

  • Man könnte das Ganze auch noch weiter verfeinern, in dem
    in der Tabelle a_Rl_Gw auch noch der Zugname aufgenommen wird.

    und nicht nur das. Man könnte auch

    - die Depot-ID (um Ausfahrten aus mehreren Depots zu verwirklichen) und

    - die Zugrichtung bei der Ausfahrt (für Wendezüge) und

    - das Gleis im nächsten Bahnhof (zur Fahrstraßensteuerung) und

    - einen Link für die ZZA im nächsten Bahnhof

    aufnehmen, um nur einige als weiteren Denkanstoß zu nennen.


    Leider ist es mir nicht gelungen, aus den internen Tabellen Timetable und Depot_exits eine Tabelle zu machen. :ao_1:

    Bei allen Möglichkeiten die mir bislang einfielen, kam es bei der dann entsprechenden if-Abfrage in Zeile 61 zu einer Fehlermeldung.:am_1:


    Vielleicht fällt ja den Experten:ba_1:  Benny (BH2) , Goetz , Parry36 (in alphabetischer Reihenfolge:av_1:) oder … etwas dazu ein.

    Fried-liche Grüße:aq_1: Haltet die Ohren steif, sonst hält die Maske nicht!

    Laptop: i7-4710HQ 2,5GHz, 8GB RAM, Intel HDGraphics 4600, NVIDIA GeForce GTX860M, Windows 10 Pro 2004 64bit

    EEP: Aktuell 15.1.2 und 16.2.3_Plug-in1, HomeNos16, ModellKatalog, Modell-Explorer, Zug-Explorer, BulkInstaller, TauschManager


    Man soll keine Dummheit zweimal begehen. Die Auswahl ist schließlich groß genug.