Jump to content

Zeitverarbeitung mit Lua


Timba
 Share

Recommended Posts

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?

Link to comment
Share on other sites

Steht noch nicht genau fest, ist Experimentierphase. :D 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.

Link to comment
Share on other sites

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.

Edited by Goetz
Ergänzungen
Link to comment
Share on other sites

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

beispiel.thumb.jpg.764beb1ba024e3a8a137361cf6210ae4.jpg

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. ;)

Link to comment
Share on other sites

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

Edited by Goetz
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 

Edited by Andy
Link to comment
Share on other sites

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

Link to comment
Share on other sites

@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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

vor einer Stunde schrieb Andy:

Timba, dann braucht's meinen Datentyp nicht.

Ach Andy, ich kann alles gebrauchen. :D;)

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.

Link to comment
Share on other sites

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.

Edited by Goetz
Ergänzungen
Link to comment
Share on other sites

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. :D Ü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!

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

vor 7 Stunden schrieb Goetz:

Beachte die Schreibweise mit dem großen T

Oh ja, hatte ich bereits bemerkt, dass das case-sensitive ist. :D Mit kleinem t wollte die Kiste einfach nicht das tun was ich wollte. Nennt man wohl "learning by doing". ;)

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

  • 1 month later...

Hallo,

ich brauche mal dringend die Hilfe der Programmierexperten, bevor ich noch durchdrehe. :D

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. :D

 

Ostwestfälischer Gruß

 entnervter Timba

Link to comment
Share on other sites

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"]

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...