Frage zu einer Lua Abfrage

!!! 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.
  • Ich habe mich heute mal mit dem Befehl EEPGetTrainLength beschäftigt. Ich will nach der Ermittlung der Länge des Zuges ein Signal in der Mitte oder am Ende des Bahnsteiges auf Halt setzen.

    Ich hatte den TW 6000 genommen. Ein Kurzzug (1 Wagen) hat den Wert 27,46, ein Doppelzug ( 2 Wagen) hat den Wert 54,92.

    Nun wollte ich diese Werte abfragen, habe es aber nicht hinbekommen, weil die Abfrage nicht funktioniert hat. Mein Gedanke war, das es an den dem Punkt in dem Wert liegt. Ich habe mir erstmal damit geholfen, das ich die Werte mit string.sub auf 27 bzw 54 gebracht habe. Und mit diesen Werten klappt die Abfrage.

    Meine Frage: Kann man die Werte 27.46 bzw 54,92 in eine Abfrage bringen und was muß man da beachten.

    Danke für einen Tipp.


    Peter

    Betriebsystemname: Microsoft Windows 10 Pro Education

    Prozessor: AMD Ryzen 5 1600 Six-Core Processor, 3200 MHz, 6 Kern(e), 12 logische(r) Prozessor(en)

    PC:RAM 16 GB

    Grafik Karte: Name NVIDIA GeForce GTX 1060 6GB


    EEP6 mit allen Plugins und Patches
    EEP7 bis13 mit allen Patches und Plugins

    EEP 14 und EEP 15
    Modelkonverter
    PlanEx 3.1
    Home-Nostruktor 13.0
    Modellkatalog
    Bodentextur Tool



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

  • Mußt Du den genauen Wert wissen?


    Sonst würde ich auf "kleiner" als 28 oder "größer" als 54 oder was auch immer abfragen.


    Was liefert denn die Funktion EPGetTrainLength zurück, wenn Du Dir den Wert mit PRINT im LUA Fenster ausgibst?


    Gruß

    Thomas

    EEP15, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager, Hugo :aq_1:

  • Da gibt er den genauen Wert von 27.46 bzw. 54.92 aus. Darum war ich ja erstaunt, das die Abfrage nicht funktioniert.

    Ich kann mit meiner Lösung string.sub leben.


    Peter

    Betriebsystemname: Microsoft Windows 10 Pro Education

    Prozessor: AMD Ryzen 5 1600 Six-Core Processor, 3200 MHz, 6 Kern(e), 12 logische(r) Prozessor(en)

    PC:RAM 16 GB

    Grafik Karte: Name NVIDIA GeForce GTX 1060 6GB


    EEP6 mit allen Plugins und Patches
    EEP7 bis13 mit allen Patches und Plugins

    EEP 14 und EEP 15
    Modelkonverter
    PlanEx 3.1
    Home-Nostruktor 13.0
    Modellkatalog
    Bodentextur Tool



  • Hallo Peter wassermann50


    Versuch einer Erklärung (am "hellen" Morgen :ao_1:)


    durch das Komma/Punkt der Längenzahlenwerte nimmt sie Lua als real-Zahlenwert (Basis plus Hochzahl)

    und die enden (nie?) auf zwei Stellen hinter dem Komma genau. :ar_1::as_1:


    Deshalb ist Thomas' Hinweis auf größer/kleiner-Vergleich eigentlich der übliche Weg.


    Bei dir Jedoch können dann auch andere Züge ins Raster fallen, deshalb ist deine string.sub-Lösung schon nicht schlecht. :be_1:

    Falls obiges "Unsinn", bitte korrigieren.

    :aq_1:


    print-Ausgaben in diesem Zusammenhang sind mit Vorsicht zu geniessen, da sie formatiert sein können.


    Bei mir kommt in früheren Versuchen bei normalem print so etwas heraus:




    Intel i3-540 3,2GHz 8GB, RAID10, HD 6570 1GB, W7/64 Prof., EEP 6-6.1, 10-15, HN13+15, TM, "Schiefe Ebene 6 + 8", "Bahn2000", "Faszination der St. Gotthard-Nordrampe"

    MK, ModellKonverter 1.0 wo nicht mehr tut. Ganz schnell ausgeschrieben, wg. Mod-Drohung: Ansonsten ... :am_1:

  • Code
    1. function LangeTest (Zug)
    2. print (Zug)
    3. ok, Laenge = EEPGetTrainLength(Zug)
    4. print (Laenge)
    5. Zugl = (string.sub (Laenge,1,2))
    6. print (Zugl)
    7. if Zugl == "54" then EEPSetSignal(41,2)print ("Langzug")
    8. else Zugl = "27" EEPSetSignal(42,2) print ("Kurzzug")
    9. end
    10. end

    Hallo Hans Christian,


    Das ist jetzt das Script, was funktioniert.

    Ich hatte in der Abfrage erst den Wert 54.92 bzw. 27.46 eingetragen. Da hat die Abfrage nicht funktioniert. Bei dem print Befehl wurde der ganze Wert ausgegeben. Deshal habe ich den Wert eben auf die Zahl vor dem Punkt reduziert.

    Ich bin kein Fachmann in Sachen Lua, sondern ein Anfänger, der probiert.


    Peter

    Betriebsystemname: Microsoft Windows 10 Pro Education

    Prozessor: AMD Ryzen 5 1600 Six-Core Processor, 3200 MHz, 6 Kern(e), 12 logische(r) Prozessor(en)

    PC:RAM 16 GB

    Grafik Karte: Name NVIDIA GeForce GTX 1060 6GB


    EEP6 mit allen Plugins und Patches
    EEP7 bis13 mit allen Patches und Plugins

    EEP 14 und EEP 15
    Modelkonverter
    PlanEx 3.1
    Home-Nostruktor 13.0
    Modellkatalog
    Bodentextur Tool



  • @ eep_gogo

    @ HaNNoveraNer


    Danke für die Beiträge.

    Da mir das Raster größer/kleiner zu grob ist, bleibe ich bei dem string.sub, da ich hier genauer abfragen kann.

    Dann war meine Vermutung mit dem Punkt in dem Wert nicht ganz falsch:aa_1:.


    Peter

    Betriebsystemname: Microsoft Windows 10 Pro Education

    Prozessor: AMD Ryzen 5 1600 Six-Core Processor, 3200 MHz, 6 Kern(e), 12 logische(r) Prozessor(en)

    PC:RAM 16 GB

    Grafik Karte: Name NVIDIA GeForce GTX 1060 6GB


    EEP6 mit allen Plugins und Patches
    EEP7 bis13 mit allen Patches und Plugins

    EEP 14 und EEP 15
    Modelkonverter
    PlanEx 3.1
    Home-Nostruktor 13.0
    Modellkatalog
    Bodentextur Tool



  • Der Rückgabewert von EEPGetTrainLength ist eine Zahl, kein String. Wenn du eine Zahl mit einem String vergleichst, wird immer false herauskommen. Wenn du eine Zahl auf Gleichheit mit einer anderen Zahl prüfst, wird im Normalfall auch false herauskommen, weil es fast unmöglich ist, alle Nachkommastellen exakt zu "erraten".

    Dein string.sub ist nur eine umständliche Möglichkeit, die Zahl abzurunden. Genauso gut geht das mit math.floor (das liefert dir das gleiche Ergebnis als Zahl).


    Ich würde aber gar nicht auf feste Werte prüfen, sondern (wie schon vorgeschlagen) eine "Grenze" ziehen, z.B. 40 Meter. Alles was länger ist, gilt als Langzug und hält am Bahnsteigende, alles was kürzer ist, gilt als Kurzzug und hält in Bahnsteigmitte.

    Für Züge mit einer der erwarteten Längen (27 oder 54 Meter) funktioniert das genauso wie deine Lösung. Züge mit anderen Längen (z.B. wenn du mal eine andere Triebwagenbauart einsetzt) halten mit dieser Lösung auch (ungefähr) passend. Mit deiner Lösung würden sie ohne Halt durchfahren.


    Viele Grüße

    Benny

  • Hallo Peter,

    if Zugl == "54"

    mit den Gänsefüßen wandelst du die Zahl in einen String. (Text)

    Das ist nicht nötig und das könnte auch das Problem sein.

    if Zugl == 54.92

    oder

    if Zugl == 54,92

    funktioniert vermutlich.


    Gruß, Hans-Christian


    Benny war schneller.

  • Allen Danke für Hinweise.

    Ich denke, die Lösung von Benny werde ich nun einbauen.

    man lernt nie aus.


    Peter

    Betriebsystemname: Microsoft Windows 10 Pro Education

    Prozessor: AMD Ryzen 5 1600 Six-Core Processor, 3200 MHz, 6 Kern(e), 12 logische(r) Prozessor(en)

    PC:RAM 16 GB

    Grafik Karte: Name NVIDIA GeForce GTX 1060 6GB


    EEP6 mit allen Plugins und Patches
    EEP7 bis13 mit allen Patches und Plugins

    EEP 14 und EEP 15
    Modelkonverter
    PlanEx 3.1
    Home-Nostruktor 13.0
    Modellkatalog
    Bodentextur Tool



  • Sorry, iIch sehe jetzt erst, dass Zugl ein String ist, dann macht die Abfrage mit den Gänsefüßen natürlich Sinn.


    Dann hast du vermutlich Komma und Punkt vertauscht.

    if Zugl == "4,92"

    oder

    if Zugl == "4.92"

    eines von beidem sollte klappen, aber egal, Bennys Vorschlag ist besser.


    Gruß, Hans-Christian

  • >>> Dein string.sub ist nur eine umständliche Möglichkeit, die Zahl abzurunden. <<<

    Komisch, daß es überhaupt mit einer Zahl funktioniert.

    Da muß die Zahl ja automatisch in einen String gewandelt werden von LUA, damit es weitergeht...

    Wandelt er dann auch um, wenn auf "24,35" statt 24,35 abgefragt wird?

    Und was ist nun richtig "." oder "," ?

    Wo lag denn nun das eigentliche Problem?

    Bzw. wie kann man denn den exakten Wert weiterverarbeiten?


    :-)

    EEP15, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager, Hugo :aq_1:

  • ich sehe jetzt erst, dass Zugl ein String ist ...

    string.sub() macht aus dem Argument einen String, falls es ursprünglich eine Zahl ist. Und dieser String enthält einen Punkt als Dezimal-Trennzeichen, kein Komma. So, wie es in allen Programmiersprachen, ungeachtet der Ländereinstellungen auf den Rechnern, gehandhabt wird.


    EEPGetTrainLength() liefert natürlich keinen String, sondern eine Fließkomma-Zahl.

  • Wo lag denn nun das eigentliche Problem?

    Das wissen wir nicht. Peter zeigt uns nur den Code der funktioniert hat.

    Da hat er mit EEPGetTrainLength eine Zahl erhalten, die dann mit string.sub gekürzt und dabei automatisch in einen String gewandelt und den dann als String abgefragt: "54" . Und das klappt dann natürlich auch.


    Gruß, Hans-Christian

  • Ich habe versucht, mit dem Werten, die ich bekommen habe, (27.46 bzw. 54.92) eine Abfrage zu erstellen.

    Und das hat nicht geklappt. Habe es mal mit, mal ohne Gänsefüßchen versucht.

    Betriebsystemname: Microsoft Windows 10 Pro Education

    Prozessor: AMD Ryzen 5 1600 Six-Core Processor, 3200 MHz, 6 Kern(e), 12 logische(r) Prozessor(en)

    PC:RAM 16 GB

    Grafik Karte: Name NVIDIA GeForce GTX 1060 6GB


    EEP6 mit allen Plugins und Patches
    EEP7 bis13 mit allen Patches und Plugins

    EEP 14 und EEP 15
    Modelkonverter
    PlanEx 3.1
    Home-Nostruktor 13.0
    Modellkatalog
    Bodentextur Tool



  • Wo lag denn nun das eigentliche Problem?

    vermutlich darin, dass Wassermann50 ungenaue Zahlenwerte benutzt hat, weil er mit print(Laenge) gekürzte Werte gezeigt bekam. Ich kann es leider gerade nicht testen, weil ich unterwegs bin und nur mein Tablet dabei habe.


    Aber ich habe den Verdacht, dass print() Dezimalwerte verkürzt ausgibt, wenn man sie einfach als Zahl übergibt.


    Probier mal bitte, ob die drei print()-Zeilen im folgenden Beispiel unterschiedliche Resultate zeigen.

    LUA Source Code
    1. Beispiel = 12.345678
    2. print(Beispiel)
    3. print(tostring(Beispiel))
    4. print(("%.6f"):format(Beispiel))

    Code kann Syntaxfehler enthalten

  • Tun sie.

    Ich habe es vorhin mit einem S-Bahn-Zug getestet, der ca. 78m lang war. Mit einfachem print wurden 3 Nachkommastellen angezeigt, mit tostring geschätzt 10.

    Aber selbst wenn ich die alle hinter == schreibe, bekomme ich immer noch kein true.

    Fazit für mich: Exakte Zuglängen mit == vergleichen geht nicht.

    Und macht in meinen Augen auch nicht wirklich Sinn. In den allermeisten Fällen sollte es reichen, die Zuglänge in zwei (oder mehr) Bereiche "einzusortieren".


    Viele Grüße

    Benny

  • Dann weiß ich ja, warum es nicht so geklappt hat.

    Habe nun Bennys Script genommen und bin zufrieden. ist alles so wie ich es wollte.:aa_1::aa_1:


    Peter

    Betriebsystemname: Microsoft Windows 10 Pro Education

    Prozessor: AMD Ryzen 5 1600 Six-Core Processor, 3200 MHz, 6 Kern(e), 12 logische(r) Prozessor(en)

    PC:RAM 16 GB

    Grafik Karte: Name NVIDIA GeForce GTX 1060 6GB


    EEP6 mit allen Plugins und Patches
    EEP7 bis13 mit allen Patches und Plugins

    EEP 14 und EEP 15
    Modelkonverter
    PlanEx 3.1
    Home-Nostruktor 13.0
    Modellkatalog
    Bodentextur Tool



  • Da nun meine Bahnen zielgerecht an den Bahnsteigen halten, habe ich die Zusatzzeichen 33x60von DH1 für die Halteschilder benutzt. Diese Zeichen stehen hier in Hannover an den Stationen und es wird angezeigt, wo die verschiedenen Zuglängen halten werden. Auch als Fahrgast immer eine Hilfe, wo man stehen sollte, wenn man vorne oder hinten einsteigen möchte. Es wird manchnmal sogar angezeigt, wenn es verschiedene Längen von den 3 Wagentypen gibt. Dann steht noch auf den Schilder -2000,3000,6000.


    Gruß


    Peter



    Betriebsystemname: Microsoft Windows 10 Pro Education

    Prozessor: AMD Ryzen 5 1600 Six-Core Processor, 3200 MHz, 6 Kern(e), 12 logische(r) Prozessor(en)

    PC:RAM 16 GB

    Grafik Karte: Name NVIDIA GeForce GTX 1060 6GB


    EEP6 mit allen Plugins und Patches
    EEP7 bis13 mit allen Patches und Plugins

    EEP 14 und EEP 15
    Modelkonverter
    PlanEx 3.1
    Home-Nostruktor 13.0
    Modellkatalog
    Bodentextur Tool



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

  • Hallo ,


    ich habe eine kleine Anfrage.


    Bei mir liefert EEPGetSignal einen Wert von " 1.0 in c2 " ? (siehe Code unten)

    War das schon immer so ?


    war immer der Meinung die Abfrage EEPGet..... fuer Signal oder Weiche liefert eine Ganzzahl.

    Ich wollte das Ergebnis nicht noch mit math.floor bearbeiten.


    Gruß Hans

    EEP 15 Plugin 1
    Win 10 i7 3,5 GHz 16GB RAM mit Nvidia Gforce 970 4GB

    Erazer Win 10 i7 32GB RAM mit Nvidia Gforce 1070

    Tauschmanager, Hugo