Timba Geschrieben 23. September 2019 Geschrieben 23. September 2019 Hallo meine lieben Programmierer, meine Suche nach der Syntax des Befehls, mit der man z.B. die Minuten aus einer Variable vom Typ "Zeit" herauszieht war leider irgendwie erfolglos. Geht das nur über "os.date"? Und wenn ja, wie sind die entsprechenden Parameter? So weit ich das verstanden habe muss zuerst der Format Minute (%M) und dann die Zeit, aus der die Minuten rausgerechnet werden sollen, also entweder eine Variable oder die Anlagenzeit, Korrekt?
Neo Geschrieben 23. September 2019 Geschrieben 23. September 2019 Hallo Timba, was möchtest du denn erreichen? Viele Grüße, Neo
Timba Geschrieben 23. September 2019 Autor Geschrieben 23. September 2019 Steht noch nicht genau fest, ist Experimentierphase. Zum Beispiel könnte ich dann für einen 10-minütlich (Anlagenzeit) wiederkehrenden Prozess bedingen, dass ein Minutenwert durch 10 teilbar ist. Geht wahrscheinlich auch auf andere Weise, aber wie gesagt, Lua finde ich interessant und daher probiere ich alles mögliche aus, inwiefern das mit meinen Erfahrungen mit Basic in Einklang zu bringen ist.
Goetz Geschrieben 23. September 2019 Geschrieben 23. September 2019 (bearbeitet) vor 16 Minuten schrieb Timba: für einen 10-minütlich (Anlagenzeit) wiederkehrenden Prozess sind die Timer gedacht. Das würde ich nicht mit Lua machen, weil das nur unnötig kompliziert wird. os.time() ist im 3D-MBS nicht verfügbar, würde dir aber auch nichts nützen. Denn es würde die Systemzeit deines Rechners enthalten und nicht die Uhrzeit auf deiner Anlage. Die Anlagenzeit ist in layout.time gespeichert. Mit der Bedingung "Zeitpunkt ist überschritten" kannst du nach einem Druck auf <> sehen, wie es in Lua geschrieben wird. Und in der Hilfe zu toTime() siehst du, welche Werte layout.time enthalten kann und was sie bedeuten. Bearbeitet 23. September 2019 von Goetz Ergänzungen
Timba Geschrieben 23. September 2019 Autor Geschrieben 23. September 2019 vor 13 Minuten schrieb Goetz: sind die Timer gedacht. Das würde ich nicht mit Lua machen, weil das nur unnötig kompliziert wird. Wie ich bereits an Neo schrieb geht es im Moment nicht um ein konkretes Problem, sondern einfach nur darum auszuprobieren, was geht, und vor allem was nicht geht. Du hast eine wunderschöne Anleitung geschrieben für Einsteiger, wofür dir ein ganz großes Lob gebührt, aber natürlich musstest du dich dabei auf das Wesentliche beschränken, sonst wären es 1.000 Seiten geworden und die würdest heute noch daran schreiben. Ergo ist der Forscherdrang der potentiellen Programmierer gefordert. Mir macht das Riesenspaß, die Möglichkeiten von Lua zu entdecken. Bevor ich von V4 auf V5 updatete wusste ich nicht mal was von der Existenz dieser Sprache. vor 18 Minuten schrieb Goetz: os.time() ist im 3D-MBS nicht verfügbar, würde dir aber auch nichts nützen. Denn es würde die Systemzeit deines Rechners enthalten und nicht die Uhrzeit auf deiner Anlage. Ok. Dann ist diese Anzeige im MBS allerdings falsch. Denn die Anzeige suggeriert, dass "os.time" verfügbar wäre und auf die aktuelle Simulationszeit verweist. Nach meinem Verständnis ist das NICHT die Systemzeit meines Rechners. Ich nehme mal an, wenn os.time nicht verfügbar ist, dann kann man auch nicht mit Sekunden hantieren, der feineren Auswertung halber , da die Simulationszeit offenbar nur mit Minuten arbeitet. Außer vielleicht wenn man den Zeitwert in den Zahlenwert konvertiert und mit der irgendwie 25. Nachkommastelle rechnet. Auch hier kein konkretes Problem, sondern nur die Pflege des Entdecker-Gens.
Goetz Geschrieben 23. September 2019 Geschrieben 23. September 2019 (bearbeitet) vor 11 Minuten schrieb Timba: die Anzeige suggeriert, dass "os.time" verfügbar wäre und auf die aktuelle Simulationszeit verweist Oh, pardon. Das hatte ich noch nicht entdeckt. Gut möglich, dass Neo eine eigene Funktion gleichen Namens implementiert hat, welche die Simulationszeit liefert. Das Format schein dasselbe zu sein wie bei layout.time. Die 24 Stunden des Tages werden auf die Werte von 0 bis 1 abgebildet. D.h.: 0 steht für Mitternacht, 0.5 für 12 Uhr Mittags. Damit sind 10 Minuten ein Abstand von 1 / (24 * 6) = 0,00694444 Eine Sekunde wäre 0,0000115740740 Bearbeitet 23. September 2019 von Goetz
Timba Geschrieben 23. September 2019 Autor Geschrieben 23. September 2019 vor 1 Minute schrieb Goetz: Die 24 Stunden des Tages werden auf die Werte von 0 bis 1 abgebildet. D.h.: 0 steht für Mitternacht, 0.5 für 12 Uhr Mittags. Damit sind 10 Minuten ein Abstand von 1 / (24 * 6) = 0,00694444 Ja, das hatte ich bereits im Lua Reference Manual gefunden, trotzdem vielen Dank. Damit lässt sich ja auch schon eine Menge bewerkstelligen.
Andy Geschrieben 23. September 2019 Geschrieben 23. September 2019 (bearbeitet) Hallo Timba, ich lasse da einen 0,1 s-Timer laufen. Dann habe ich drei Zähler. Der erste zählt 0-9 und ist die virtuelle Sekunde. Der zweite zählt 0-59 und ist die virtuelle Minute und der dritte zählt 0-23 und ist die Stunde. Und jetzt paß auf: ein weiterer Zähler macht aus der virtuellen Minute und der virtuellen Stunde eine Zahl. Der springt von 59 auf 100. Und von 159 auf 200 etc., und von 2359 auf 0. Damit muß ich a) nicht den Doppelpunkt aus der 'echten' Simulationszeit rausholen und ihn b) vor allen Dingen bei Vergleichen nicht reinstopfen. Ich kann mit Lua-Zusatzfunktionen auch damit rechnen. Den ganz kleinen Zähler nutze ich, um bei Prozessen, die eigentlich gleichzeitig stattfinden sollten, diese praktisch mit einer Phasenverschiebung aufzusplitten. Beispiel: Jim Knopf's große Straßenanlage mit vielen Ampeln. Wenn da gleichzeitig viele Ampeln schalten, müssen noch mehr Autos gleichzeitig behandelt werden. Da hat V4 einen Schluckauf bekommen. Axel hat, nachdem wir es entdeckt hatten, jede einzelne Ampel noch mit einer kleinen im Kreis fahrenden Steuerlok gelöst, die dann wieder je nach Ampel leicht verschoben aufgesetzt wurde. Dann lief's wie's Lottchen. Das erreiche ich mit meiner Phasenverschiebung bei meinen Fahrplänen auch. Gruß Andy Bearbeitet 23. September 2019 von Andy
Neo Geschrieben 23. September 2019 Geschrieben 23. September 2019 Hallo Timba, vor 4 Stunden schrieb Timba: Dann ist diese Anzeige im MBS allerdings falsch. Denn die Anzeige suggeriert, dass "os.time" verfügbar wäre und auf die aktuelle Simulationszeit verweist. hier darfst du dich nicht täuschen lassen, die Autovervollständigung beachtet nicht die Bezeichner vor dem Punkt oder Doppelpunkt, sondern nur die Bezeichner danach. Das Studio selbst kann während der Entwicklungszeit nicht prüfen, was hinter "os" steht. Es könnte sich ja um folgendes Konstrukt handeln: local os = layout print(os.time) Dieser im Studio gültige Code kann nur während der Laufzeit analysiert werden, weshalb die Autovervollständigung alle Vorschläge anzeigt. Grundsätzlich handelt es sich bei einer Zeitangabe um ein Objekt mit Methoden und Eigenschaften. So kannst du z.B. mit Zeiten rechnen und diese vergleichen: local time = layout.time + toTime("0:30") -- Halbe Stunde addieren if time > toTime("15:45") then ... end Wie die Zeit intern verarbeitet wird spielt für den Aufrufer gar keine wirkliche Rolle, wobei es auch kein Thema wäre, dem Objekt weitere Funktionen zu spendieren, um an weitere Informationen heranzukommen, wie z.B. der Stunde, Minute oder Sekunde. Viele Grüße, Neo
Timba Geschrieben 23. September 2019 Autor Geschrieben 23. September 2019 @Andy, das mit den Timern ging ja in V4 auch schon und habe ich auch ausgiebig genutzt. Hier ging es mir ja, wie schon mehrfach gesagt, ums Austesten, welche Möglichkeiten sich mir mit V5 in Verbindung mit Lua auftun. So bin ich halt, ich will immer möglichst ALLES wissen und im Moment ist mir das Ausprobieren wichtiger als dass die Lok im Kreis rumfährt. @Neo, ok, leuchtet ein und ist im Hinterstübchen notiert.
Andy Geschrieben 23. September 2019 Geschrieben 23. September 2019 vor 30 Minuten schrieb Neo: So kannst du z.B. mit Zeiten rechnen und diese vergleichen Das ist doch auch eine sehr wichtige Information! Beim ersten Hinsehen sieht's ja aus wie ein String, mit dem das so nicht geht. Ist damit ein perfektes Argument denjenigen gegenüber, die meinen, es gäbe zuviel unterschiedliche Typen. Aber so muß das sein Neo! Timba, dann braucht's meinen Datentyp nicht. Gruß Andy
Timba Geschrieben 23. September 2019 Autor Geschrieben 23. September 2019 vor einer Stunde schrieb Andy: Timba, dann braucht's meinen Datentyp nicht. Ach Andy, ich kann alles gebrauchen. Was ich gerade merkwürdig finde (weil unüblich), ist, dass ich problemlos einen Zahlenwert in einen Zeitwert konvertieren kann, z.B.: $("Ereignisse").variables["Abfahrt"] = toTime(0.75) jedoch umgekehrt funktioniert es nicht: $("Ereignisse").variables["Versuch"] = tonumber($("Ereignisse").variables["Ankunft"]) Da wird sogar die Variable gelöscht. Ich nehme an, weil das Ergebnis des Konvertierungsversuchs "nil" war. Mit dem Zeug, mit dem ich bisher programmiert hatte, gings auch in die entgegengesetzte Richtung, wenn's in die eine Richtung ging. Naja, man kann nicht alles haben.
Goetz Geschrieben 23. September 2019 Geschrieben 23. September 2019 (bearbeitet) vor 46 Minuten schrieb Timba: Da wird sogar die Variable gelöscht. Ich nehme an, weil das Ergebnis des Konvertierungsversuchs "nil" war. Korrekt. Wenn du einer Variablen (oder einem anderen Speicher wie z.B. einem Tabellenplatz) den Wert nil zuweist, dann wird sie gelöscht. Und die Funktion tonumber() erwartet einen String als Argument. Dieser String darf nur eine Zahl in String-Form enthalten. Nicht mehr. Also auch keinen Doppelpunkt! Andernfalls ist das Ergebnis der Wandlung leer und dafür hält Lua den speziellen Wert nil mit der Adresse 0x00000000 bereit. tonumber("12.34") == 12.34 tonumber("12:34") == nil Außerdem weiß tonumber() nichts vom speziellen Zahlenformat in layout.time. Es wandelt eine Uhrzeit in String-Form nicht in die Zahl, die du benötigst. Weil tonumber() aus der Standardbibliothek von Lua stammt und den speziellen Zeitwert des MBS nicht kennen kann. Bearbeitet 23. September 2019 von Goetz Ergänzungen
Timba Geschrieben 23. September 2019 Autor Geschrieben 23. September 2019 Danke, Goetz. Immerhin geht es ja, die Zeit mit tostring() in einen String zu verwanden und dann kann ich mir mit Stringoperationen ja daraus die benötigten Werte ziehen, falls ich es mir gar nicht verkneifen kann. Übrigens denke ich inzwischen, dass es nicht nur den "speziellen Zeitwert des MBS" betrifft, sondern aufgrund meiner umfangreichen Recherchen geht das wohl auch nicht mit der Systemzeit, also ich meine mit tonumber(Zeit) eine Konvertierung durchführen. Wohl kann man mit speziellen Parametern Jahr, Monat, Tag, Wochentag und diverse andere Werte aus der Systemzeit extrahieren, aber eine direkte Konvertierung ist offenbar nicht vorgesehen. Ok. Für heute genug gelernt. Gut's Nächtle!
Goetz Geschrieben 23. September 2019 Geschrieben 23. September 2019 vor 36 Minuten schrieb Timba: aufgrund meiner umfangreichen Recherchen geht das wohl auch nicht mit der Systemzeit, also ich meine mit tonumber(Zeit) eine Konvertierung durchführen. Natürlich nicht. Die Systemzeit ist kein String! tonumber() ist das Gegenteil von tostring() und nicht das Gegenteil von toTime(). Letzteres entstammt auch nicht der Standardbibliothek von Lua. Beachte die Schreibweise mit dem großen T
Timba Geschrieben 24. September 2019 Autor Geschrieben 24. September 2019 vor 7 Stunden schrieb Goetz: Beachte die Schreibweise mit dem großen T Oh ja, hatte ich bereits bemerkt, dass das case-sensitive ist. Mit kleinem t wollte die Kiste einfach nicht das tun was ich wollte. Nennt man wohl "learning by doing".
Goetz Geschrieben 24. September 2019 Geschrieben 24. September 2019 vor 38 Minuten schrieb Timba: hatte ich bereits bemerkt, dass das case-sensitive ist. Das wollte ich damit nicht sagen. Sondern, dass die Schreibweise mit Großbuchstaben in der Standard-lib von Lua nicht vorkommt und du somit am Großbuchstaben erkennen kannst: Das ist keine Funktion aus Luas Standard-Lib.
Timba Geschrieben 24. September 2019 Autor Geschrieben 24. September 2019 Ach so. Ok, aber dann ist es trotzdem case-senstive, weil sonst hätte es ja funzen müssen. Unix ist (oder war, gibt's Unix überhaupt noch?) ebenfalls case-sensitive, soweit ich mich erinnere. Bei MS Visual Basic ist es hingegen völlig wurscht ob man groß oder klein schreibt, in beiden Fällen passiert dasselbe. Ok, das nur am Rande. Wenn man's weiß, passt man halt auf. Darum danke für die Info.
Goetz Geschrieben 24. September 2019 Geschrieben 24. September 2019 vor einer Stunde schrieb Timba: trotzdem case-senstive Natürlich sind in Lua alle Namen case-sensitive. Genauso, wie in Java, Python, C, C++, C# und wahrscheinlich den meisten anderen Programmiersprachen auch. Basic ist da eine seltene Ausnahme.
Neo Geschrieben 24. September 2019 Geschrieben 24. September 2019 vor 32 Minuten schrieb Goetz: Basic ist da eine seltene Ausnahme. Und Delphi, der Programmiersprache vom MBS Unabhängig davon finde ich die konsequente Kleinschreibung von Lua nicht besonders gut, ich hätte mir lieber ein toString() oder toNumber() gewünscht. In der Programmierung ist es wichtig, konsistent zu bleiben, und wenn man das bei Lua strikt einhalten wollen würde, würde das sehr unleserlich werden: layout:getentitiesbykeyword. Aus diesem Grund habe ich mich für camelCase entschieden und das entsprechend konsistent durchgezogen, weshalb es toTime() und nicht totime() heißt. Viele Grüße, Neo
Andy Geschrieben 24. September 2019 Geschrieben 24. September 2019 Mag ich auch. Wer bringt schon eine Zeichenkette mit der Zeit t vom Ostring in Verbindung
Timba Geschrieben 26. Oktober 2019 Autor Geschrieben 26. Oktober 2019 Hallo, ich brauche mal dringend die Hilfe der Programmierexperten, bevor ich noch durchdrehe. Ich versuche eine verschachtelte Variable (nennt man das so?) in ein Lua-Skript zu schreiben und es will nicht klappen. Hier ist eine Objektvariable, nehmen wir mal $("BR 103").variables["Gleis"] Das Objekt ist allerdings nicht gegeben, sondern steht in einer Tabelle $("Ereignisse").variables["LocklisteL"][1].Zug Wie bringe ich die beiden zusammen? Ich habe schon 1.000 Variationen versucht und nichts geht. Die grafische EV scheint damit auch überfordert zu sein, jedenfalls bekomme ich es damit auch nicht hin. Ich mach dann schon mal Platz im Garten, weil gleich der PC aus dem Fenster fliegt. Ostwestfälischer Gruß entnervter Timba
Timba Geschrieben 26. Oktober 2019 Autor Geschrieben 26. Oktober 2019 Erledigt! Der 1.378. Versuch hat geklappt. Es muss heißen: $("Ereignisse").variables["LocklisteL"][1].Zug.variables["Gleis"] Warum gibt's da eigentlich keinen Automaten für? Ein fröhlichen Gruß vom Timba
Goetz Geschrieben 26. Oktober 2019 Geschrieben 26. Oktober 2019 Manchmal hilft es dem Verständnis, enen Teil (wie in diesem Fall die Objektadresse) an einen Zwischenträger zu übergeben. Das macht die einzelnen Zeilen kürzer und bringt mehr Übersicht. local Objekt = $("Ereignisse").variables["LocklisteL"][1].Zug Objekt.variables["Gleis"]
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