Frage zu einer Lua Abfrage

Achte bitte darauf, dass Du mit deinem Thema bzw. mit deiner Frage im richtigen Bereich bist.
Die Bereiche sind: Einstellungen im Forum, EEP aktuell ab EEP7 , Splines, Rollmaterialien, Immobilien, Landschaftselemente, Signale und Schaltung, Anlagenvorstellungen, Schnappschüsse Konstrukteure, EEP Treffen , Laberecke, Online - Handbuch EEP Vielen Dank für die Unterstützung das Forum übersichtlich zu halten.
Bilder/Fotos aus dem Internet sind nur als Link gestattet. Eigene Fotos, also Fotos aus dem realen Leben, sind erstens mit Eigenes Bild als Quellenangabe zu kennzeichnen und zweitens nur als Dateianhang im Beitrag zulässig. Bilder ohne Quellenangaben und Bilder dessen Quelle das Internet wie z. B. Google ist, werden gelöscht.
  • 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 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.0, Modellkatalog, Bodentextur Tool

    2 Mal editiert, zuletzt von wassermann50 (20. Juni 2019 um 08:02)

  • 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

    EEP16.1 Patch 2, 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 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.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:



    eep_gogo ( RG3 )

    -------------------------

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

  • Code
    function LangeTest (Zug)
    print (Zug)
    ok, Laenge = EEPGetTrainLength(Zug)
    print (Laenge)
    Zugl = (string.sub (Laenge,1,2))
    print (Zugl)
     if Zugl == "54" then EEPSetSignal(41,2)print ("Langzug")
      else Zugl = "27"   EEPSetSignal(42,2) print ("Kurzzug")
      end    
    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 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.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 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.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 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.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?

    :)

    EEP16.1 Patch 2, 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 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.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
    Beispiel = 12.345678
    print(Beispiel)
    print(tostring(Beispiel))
    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 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.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 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.0, Modellkatalog, Bodentextur Tool

    Einmal editiert, zuletzt von wassermann50 (22. Juni 2019 um 13:43)

  • 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 Version 17 ; Plugins 1 ; Patches all in
    Win 10 i7 3,5 GHz 16GB RAM mit Nvidia Gforce 970 4GB

    Erazer Win 10 i7 32GB RAM mit Nvidia Gforce 1070

    Model-Katalog&Explorer , Tauschmanager, Hugo, Noel's Tool's, Inventar/Gleisplan, Schildgenerator