Wagen einzeln beladen + Zeitverzögerung simple ?

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.
  • Hallo ihr lieben,

    nun habe ich mich mal tatsächlich einen ganzen tag mit LUA beschäftig.... und tatsächlich, mein Vorhaben, so simple es für Euch ist, es funktioniert. Zumindest mein Experiment. Doch nun hänge ich halbwegs fest. Ich könnte zwar weiter machen, würde aber viel Ressourcen und Zeit verlieren.

    Es geht um das einzelne Beladen von stehenden Wagons. War schon paar mal das Thema, wo ich mich heute durchgeschlengelt habe.

    Doch dazu gleich zwei Fragen:

    Ich erinnere mich noch an QBasic. Dort konnte man wunderbar Namen mit Nummern am Ende mit 1 addieren, um das nächste Objekt anzusprechen. Ich habe hier später dann 3 Züge à 20 Wagons ... macht also 60 Wagons. Sprich zum Be+Entladen benötige ich dann zusammen 120 KP's und eben so viele Einträge bei Lua. In meiner Testversion habe ich vorerst nur drei Wagen den Namen "K1", "K2", "K3" gegeben. Gibt es eine Möglichkeit innerhalb von LUA die Namen in den Anweisungen auch um "1" zu steigern ? So als Beispiel, "K1" bekäme eine Variable alias X=01 und mit dem Befehl X=X+1 hätte ich dann 02 alias "K2".

    Ich sehe ja oft solche Additionen, aber lässt sich so etwas auch auf Namen beziehen ?

    So dass ich nur ein Kontaktpunkt in einem Steuerkreis habe, mit der (Beispiel-)Funktion "Entladen X" worauf in Lua dann nach und nach K1,K2,K3 u.s.w. beladen werden, bis K20 erreicht ist ?

    Und wenn ja, (zweite Frage) lässt sich das ganze denn zeitweise unterbrechen ? In einem Beispiel so, dass K1 erst zu 33% gefüllt wird, 30 Sekunden Später zu 66% und weitere 30 Sekunden dann zu 100%. 20 Sekunden darauf sollte dann K2 an der Reihe.

    Anbei der LUA Eintrag, rot markiert ist mein derzeitige Fortschritt in dem Test.

    Danke schon mal im Vorraus

    LG

    Marcel

    Angefangen vor Jahrzehnten mal mit EEP 2.43. Doch ohne DSL und richtigem Zugang ins Inet verlor man schnell die Lust

    2017 erbte ich EEP 6.1 und wollte mich nochmal etwas reinhängen. Nun ein Sprung zu EEP 14 oder/und EEP15. ok, nun schon auf 16 ;) Mal schauen, wie das läuft...:aq_1:

  • Hallo Puffer-MBO ,

    einen alphanumerischen String um 1 erhöhen, z.B.

    Code
    strTest = "K1"
    
    strTest1 = string.sub(strTest,1,1) .. tostring(tonumber(string.sub(strTest,2)) + 1)

    Wegen der Zeitverzögerung.

    Lua kennt keine Zeitverzögerungs-Funktion.

    Such einfach hier im Forum nach Lua und Zeitverzögerung.

    Da solltest Du einige Anregungen finden, die vor allem auch während der Wartezeit Lua nicht ausbremsen.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    Einmal editiert, zuletzt von JuergenSchm (12. Juli 2021 um 18:01)

  • einen alphanumerischen String um 1 erhöhen, z.B.

    Hi Jürgen,

    und schon sehe ich schwarz, bei meinen Kentnissen.

    Also > strTest = "K1" < müsste demnach noch vor der Funktionsbezeichnung "function Entladen_01()" stehen. Um strTest auf K1 zurück zu setzen.

    Denn käme die Bezeichnung > function Entladen_01() <

    und der Rest

    >

    print("Kohle entladen 01")

    EEPRollingstockSetAxis("K1" , "Kohle-Eas5971-DR" , 0) <


    gefolgt von

    > strTest1 = string.sub(strTest,1,1) .. tostring(tonumber(string.sub(strTest,2)) + 1) <

    und dann das End

    Während alles andere darunter (Entladen 02....) wegfällt.

    Und was von dem Variabeln kommt dann in die Zeile > EEPRollingstockSetAxis("K1" , "Kohle-Eas5971-DR" , 0) < anstelle des "K1" ?


    EDIT:

    Denn könnte ich ein Steuermobil nehmen, dass in gewissen Zeitabständen einen KP überfährt, um die Anweisung/Funktion "function Entladen_01()" aufzurufen ?

    Angefangen vor Jahrzehnten mal mit EEP 2.43. Doch ohne DSL und richtigem Zugang ins Inet verlor man schnell die Lust

    2017 erbte ich EEP 6.1 und wollte mich nochmal etwas reinhängen. Nun ein Sprung zu EEP 14 oder/und EEP15. ok, nun schon auf 16 ;) Mal schauen, wie das läuft...:aq_1:

  • Hallo Puffer-MBO ,

    das mit dem Steuermobil ist eine der Möglichkeiten, um eine Zeitverzögerung hinzubekommen.

    (wie ich finde, eine brauchbare)

    Erstmal, bitte verwende nicht strTest als Variablenname (das war nur ein Beispiel von mir).

    Besser, Du verwendest einen Variablennamen, mit dem Du auch in ein paar Monaten noch weißt, was diese Variable macht.

    Damit das Ganze für alle Waggons funktioniert, müsstest Du meine Variable strTest1 noch durch strTest (bzw. den Namen, den Du der Variablen gibst) ersetzen, damit die Erhöhung um 1 für den nächsten Aufruf der Funktion Entladen_01() verfügbar ist.

    In der Funktion Entladen_01() müsste noch die Konstante "K1" in EEPRollingStockSetAxis durch den Variablennamen (mein Name strTest) ersetzt werden.

    Zusätzlich brauchst Du in der Funktion noch eine Bedingung, die beim letzten Waggon das Steuermobil stoppt.

    Z.B. ein Signal im Steuerkreis auf Halt stellt.

    Ich hoffe, ich habe jetzt nichts vergessen, denn praktisch habe ich das Ganze jetzt bei mir nicht nachgestellt.

    Und da es mein Prinzip ist, dass ich keine fertigen Skripte zum Kopieren bereitstelle, denn da lernt der Fragesteller nichts.

    Und, da uns für EEP-Lua kein Debug-Modus zur Verfügung steht.

    Wenn etwas nicht, wie gewünscht funktioniert, zum Testen mit entsprechenden Print-Befehlen z.B. den Variablenwert anzeigen lassen.

    Wenn noch was fehlt, einfach nochmal fragen.

    Ergänzung:

    Deine Vermutung, dass strTest ="K1" außerhalb der Funktion Entladen_01() stehen muss, ist richtig.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    2 Mal editiert, zuletzt von JuergenSchm (12. Juli 2021 um 20:32)

  • Hallo Jürgen, nochmal,

    das mit dem Steuermobil ist eine der Möglichkeiten, um eine Zeitverzögerung hinzubekommen.

    (wie ich finde, eine brauchbare)

    War bisher immer meine übliche Methode für alles Doch irgendwo haben die dann auch Grenzen.

    Erstmal, bitte verwende nicht strTest als Variablenname (das war nur ein Beispiel von mir).

    Besser, Du verwendest einen Variablennamen, mit dem Du auch in ein paar Monaten noch weißt, was diese Variable macht.

    Bin jetzt voll von ausgegangen, dass wäre eine spezielle Variable, also mit einer versteckten Funktion.

    Somit gehe ich von aus, "String.Sub" sei auch nur eine Variable nach Zufall. Aber was ist denn StrTest1 ? Meine Anfangsvariable mit einer 1 am Ende ?

    Zusätzlich brauchst Du in der Funktion noch eine Bedingung, die beim letzten Waggon das Steuermobil stoppt.

    Z.B. ein Signal im Steuerkreis auf Halt stellt.

    Das ist das geringste Problem. KP für eine Weiche auf dem Steuerkreis, das nach dem X. Male das Steuermobil aus dem Kreis zieht und erst wieder rein lässt, wenn er benötigt wird.

    Ergänzung:

    Deine Vermutung, dass strTest ="K1" außerhalb der Funktion Entladen_01() stehen muss, ist richtig.

    Ich weiß nun nicht wie das Skript abgearbeitet wird, liest EEP das ganze einfach von Oben nach unten durch und sucht dann im Nachhinein die einzelnen Funktionen oder fängt EER nach Ende wieder von vorn an. Hinzu muss es ja auch ein Befehl geben, das NACH dem Entladen Kx wieder auf K1 setzt. Bzw. bei weiteren Zügen halt Ky auf K20 und Kz auf K40. Somit müsste das Zurücksetzen eine bzw. drei unterschiedliche "funktion"en sein, die z.B. das Steuermobil beim Verlassen der Steuerstrecke auslöst. Geht denn soetwas überhaupt ?


    Schönen Abend noch

    LG

    Marcel

    PS: ne Weile bin ich noch wach...., falls Du heut noch antwortest

    Angefangen vor Jahrzehnten mal mit EEP 2.43. Doch ohne DSL und richtigem Zugang ins Inet verlor man schnell die Lust

    2017 erbte ich EEP 6.1 und wollte mich nochmal etwas reinhängen. Nun ein Sprung zu EEP 14 oder/und EEP15. ok, nun schon auf 16 ;) Mal schauen, wie das läuft...:aq_1:

  • Hallo Marcel ( Puffer-MBO ),

    in meinem Beispiel sind strTest und strTest1 zwei Variablen. Wovon Du strTest1 nicht benötigst, da Du diese durch strTest ersetzen musst.

    Der Variablen kannst Du jeden Namen geben , der Dir gefällt.

    Da ich mehr als 40 Jahre Programmierer war, habe ich mir angewöhnt, dass der Variablennamen auch den Typ der Variablen enthält.

    Darum das strTest für eine String-Variable, wie gesagt, Du kannst ihr jeden Namen geben.

    string.sub

    Ist eine Lua-Funktion, mit der man eine String-Variable teilen kann.

    Sie benötigt den Variablennamen, die Position des ersten Zeichens und optional die Position des letzten Zeichens der Zeichenkette, die ausgeschnitten werden soll.

    Ohne Angabe der letzten Position wird alles ab dem angegebenen ersten Zeichen, bis zum Ende, ausgeschnitten.

    In meinem Beispiel wird die Zeichenkette "K1" in "K" und "1" geteilt.

    Das "1" wir in eine Zahl gewandelt und 1 addiert und danach wieder in ein Zeichenkette gewandelt.

    Durch das .. werden die beiden getrennten Zeichenketten wieder zu einer Zeichenkette vereint.

    tostring und tonumber

    Sind ebenfalls Lua-Funktionen.

    Die erste wandelt eine numerische Zahl in eine Zeichenkette und die Zweite wandelt eine numerische Zeichenkette in eine Zahl.

    Wie läuft das Skript ab.

    Deine Funktion Entladen_01() wird durch das Steuermobil, dass sich bis der letzte Waggon erreicht ist, im Kreis bewegt, aufgerufen.

    Die Zeile

    strTest = "K1"

    (strTest ersetzt Du durch Deinen Variablennamen)

    packst Du in eine neue Funktion.

    Diese Funktion lässt Du z.B. durch den zum Entladen einfahrenden Zug über einen Kontaktpunkt (ich verwende für Lua-Funktionen meist den Sound-Kontaktpunkt) aufrufen.

    Damit hast Du immer, wenn ein neuer Zug zum Entladen einfährt, die Variable auf den ersten Waggon eingestellt.

    Ein weiteres Problem, auf das Du noch stoßen wirst, wird sein.

    (beim nochmals lesen habe ich gesehen, Dir ist dieses Problem bereits augefallen)

    Wenn du mehrere Züge entladen willst, heißt der erste Waggon nicht bei allen Zügen "K1".

    Aber dies kannst Du über entsprechende Bedingungen in der neuen Funktion lösen, indem Du bei strTest="K1" den wirklichen Namen des ersten Waggons des Zuges einträgst.

    Es gibt z.B. eine EEP-Lua-Funktion mit der Du den Namen des ersten Waggons (eigentlich sogar aller Waggons des Zuges) ermitteln kannst.

    Natürlich könntest Du auch den ersten Waggon-Namen durch Abfrage des Zugnamens ermitteln, wenn Du festlegst, wie die Waggons bei den einzelnen Zügen heißen.

    Ich würde aber vorschlagen, dass Du das Ermitteln aller Waggons eines Zuges und das eventuelle Speichern in einer Tabelle erst in Angriff nimmst, wenn die erste Version funktioniert. Denn die gespeicherten Inhalte dieser Tabelle müssen auch einen Anlagen-Neustart "überleben".

    Ich wünsche Dir ebenfalls einen schönen Abend.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    4 Mal editiert, zuletzt von JuergenSchm (12. Juli 2021 um 23:33)

  • und nochmals Hallo Jürgen ...

    .. glaube eine Art Chat hätte so einiges beschleunigt :)

    habe ich mir angewöhnt, dass der Variablennamen auch den Typ der Variablen enthält.

    gute Idee !

    string.sub

    Ist eine Lua-Funktion, mit der man eine String-Variable teilen kann.

    Sie benötigt den Variablennamen, die Position des ersten Zeichens und optional die Position des letzten Zeichens der Zeichenkette, die ausgeschnitten werden soll.

    darauf war ich irgendwie hinaus, wie gesagt, bei Basic gab es auch solch eine Möglichkeit ... aber das sind auch schon 30 Jahre her. Ich fing damals noch auf dem KC85 an... später dan lag der Rechner eher in der Ecke, gab schönere Sachen in der Jugend. In den 90-ern war zwischendurch nochmal QBasic interessant. Damit erstellte ich mir Universal-CD's mit Menüs -basierend noch auf Qbasic und MS Dos- zum Installieren unterschiedlicher Windowsversionen, zum Formatieren, kopieren u.s.w.

    tostring und tonumber

    Sind ebenfalls Lua-Funktionen.

    Die erste wandelt eine numerische Zahl in eine Zeichenkette und die Zweite wandelt eine numerische Zeichenkette in eine Zahl.

    Das hatte ich mir schon gedacht.... steht ja auch so da, fehlt nur das Leerzeichen ;)


    Wie läuft das Skript ab.

    Deine Funktion Entladen_01() wird durch das Steuermobil, dass sich bis der letzte Waggon erreicht ist, im Kreis bewegt, aufgerufen.

    Mir ging es darum, ob das Skript permanent durchläuft, unter dem Motto, wenn der Befehl/Funktion nicht aufgerufen ist, springe weiter zum nächsten, ODER Ob EEP das am Start einmal liest, und sich dann merkt, welche Funktion an Welcher Stelle steht, falls sie aufgerufen wird. Ich vermute letzteres, da es sonst nicht nötig wäre, nach Änderung den Skript neu einlesen zu lassen.

    Die Zeile

    strTest = "K1"

    (strTest ersetzt Du durch Deinen Variablennamen)

    packst Du in eine neue Funktion.

    Da dachte ich auch schon nach..... selbes dann mit den anderen Zügen, Variable = K1 bzw. K21 oder K41 je nachdem, welcher Zug einfährt.

    Dem müsste ich dann auch ein Namen für die "function" geben und unter der Zuordnung ein end ... Korrekt ?

    (ich verwende für Lua-Funktionen meist den Sound-Kontaktpunkt)

    Naja, da werde ich vermutlich den KP nutzen, der dann auch das Signal/Weiche für das Steuermobil freischaltet. So liegt alles in einem festen Bereich.


    Ein weiteres Problem, auf das Du noch stoßen wirst, wird sein.

    Wenn du mehrere Züge entladen willst, heißt der erste Waggon nicht bei allen Zügen "K1".

    s. weiter Oben. Da die Züge nicht alle gleichzeitig unter dem Bagger stehen, dürfte es auch so funktionieren, wie ich es oben weiter beschrieben habe. Jeder Zug setzt bei der Einfahrt die Variable auf K1, K21 oder K41

    DANKE

    In zwei Wochen habe ich das hoffentlich nicht wieder vergessen, dann geht es vermutlich erst wieder intensiv weiter.

    Schöne Tage bis dahin

    LG

    Marcel

    Angefangen vor Jahrzehnten mal mit EEP 2.43. Doch ohne DSL und richtigem Zugang ins Inet verlor man schnell die Lust

    2017 erbte ich EEP 6.1 und wollte mich nochmal etwas reinhängen. Nun ein Sprung zu EEP 14 oder/und EEP15. ok, nun schon auf 16 ;) Mal schauen, wie das läuft...:aq_1:

  • Es geht um das einzelne Beladen von stehenden Wagons. War schon paar mal das Thema, wo ich mich heute durchgeschlengelt habe.

    Ich habe hier später dann 3 Züge à 20 Wagons ... macht also 60 Wagons. Sprich zum Be+Entladen benötige ich dann zusammen 120 KP's und eben so viele Einträge bei Lua.

    Für ein Beladungsgleis (Gleise) brauche ich grundsätzlich nur einen Kontaktpunkt. Alles Andere macht Lua für mich. Ich muß nur die entsprechende Tabelle mit Informationen füllen.

    Ich werde aber nicht hier ein fertiges Skript zeigen, nur soviel, der Kontaktpunkt-Aufruf gibt mir den Namen des Zugverbandes und die Gleis-ID zurück, alles Andere kann ich über Lua herausfinden (Name vom Rollmaterial (RM) im Zugverband (ZV), Richtung des RM im ZV, usw..) Wichtig ist die Gleisrichtung. Und ich arbeite mit der Achsengruppen-Speicherung.

    MfG. Jörg
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP17.2 Plugin 1 + 2

    Zusatzprogramme: ResourcenSwitcher2 (BH2), EEP-Gleisplan (Frank Buchholz)

  • Da muß ich Tufftuff,

    ausnahmsweise recht geben, mit Lua ist das eine ganz simple Angelegenheit. :ap_1:

    z.B. in einer Startfunktion werden der Zugname, die Anzahl der Waggons

    und die Namen der Waggons in eine Tabelle hinterlegt--> ende

    In einer Zweiten kleinen Funktion z. B. "Beladen"

    gehts zur Sache, der Zeitablauf wird in einer Schrittvariablen der Reihe

    nach abgearbeitet, --> Axen, Zugvorschub und Abfahrt. --> ende

    Aber dann alles in der EEPMain() triggern und keinen Schaltkringel nutzen.

    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/

  • Hallo Dieter ( Parry36 ),

    der Kringel hat eigentlich nur die Funktion der Zeitverzögerung.

    Kann man über Modulo natürlich auch in der EEPMain() machen.

    Aber warum sollte ich die EEPMain ständig mit einer Funktionalität "belasten", die nur benötigt wird, wenn ein Zug zum Entladen einfährt.

    Waggons in einer Tabelle speichern, bedeutet natürlich auch, dass diese Tabelle einen Anlagen-Neustart überstehen muss.

    Und bei dem Wissensstand von Puffer-MBO macht dies das Erklären auch schon wieder komplizierter.

    Da ich ja aus Prinzip keine fertigen Skripte zum einfachen Kopieren bereitstelle.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    2 Mal editiert, zuletzt von JuergenSchm (12. Juli 2021 um 23:57)

  • Jürgen, nicht über Modulo, sondern eine Schrittvariable die am Funktionsende

    dann wieder 0 ist.

    Und die Startfunktion stößt nur die Beladenfunktion an, wenn Beladen,

    dann geht alles wieder in Wartestellung.

    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/

  • Hallo Dieter ( Parry36 ),

    ich finde, wie die Verzögerung gemacht wird, ob über Schrittvariable oder Modulo und Kennzeichenvariable "Zug ist da/Waggon der Entladen werden soll" ist im Prinzip egal. Aber beide Variablen müssen einen Anlagen-Neustart überstehen. Und die Erklärung des Speicherns verkompliziert das Ganze für einen Neueinsteiger, der aber weiß, was ein Kringel macht und sich möglichst den Ablauf im Skript selbst erstellen und verstehen sollte (und eventuell auch möchte).

    Für Fortgeschrittene sieht die Funktionalität natürlich anders aus.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    2 Mal editiert, zuletzt von JuergenSchm (13. Juli 2021 um 00:32)

  • Herzlich willkommen bei Lua und der spannenden Reise in die Programmierung!

    [Ups, für den folgenden Teil hatte ich mich vorher beim Lesen des Threads ziemlich verhaspelt. Daher streiche ich den Text durch.]

    Theoretisch kann man schon in Lua das gute alte QBasic simulieren und solche Tricks wie dynamisch berechnete Variablennamen (K1, K2,…) verwenden. Ich glaube allerdings dass die so ein Programmiermodell sowohl in umständliche Befehlsketten wie dich auch in Programmier-Sackgassen führt.


    In Lua nutzt man In solchen Fällen Tabellen deren Elemente dann z.B. so angesprochen werten: K[1] bzw. K[2] usw.


    Viel Spaß also mit deinen weiteren wertvollen Experimenten und dem Entdecken der Fähigkeiten von Lua.

    Online EEP-Tools: Gleisplan-Programm / Inventar-Programm

    EEP 15 ab Mai 2019 und EEP 17 ab Nov. 2021
    EEP 6 in 2011 und EEP 13 ab Januar 2019 sind eingemottet
    XMP Core 17 Laptop mit Intel Core i7-10870H 8-Core-CPU, 16 GB Arbeitsspeicher, NVIDIA GeForce RTX 3060 Laptop GPU mit DirectX 12

    Einmal editiert, zuletzt von frank.buchholz (13. Juli 2021 um 18:31)

  • Hallo Frank ( frank.buchholz ),

    danke für Dein Plädoyer für die so gelobten Tabellen.

    Gut, ich muss die Tabelle mit etwas, den Waggon-Namen eines Zuges füllen, die laut dem Fragesteller bereits fest vorgegeben sind und was ich problemlos, ohne Tabelle, auch aus der Zug-Information auslesen könnte.

    Auch hier muss ich wieder sagen, der Tabelleninhalt muss einen Anlagen-Neustart "überleben".

    Das ist natürlich alles machbar und für einigermaßen Versierte, die auch die Dataslot-Belegung (wenn die Speicherung in Dataslots erfolgen soll) ihrer Anlage und der von ihnen eventuell noch verwendeten Lua-Tools kennen.

    Und das ist natürlich für einen Lua-Beginner, der nach meinen Vorstellungen nicht durch "Kopieren und Einfügen" von Funktionen, die er nicht nachvollziehen kann, mit Lua anfangen sollte, einfacher, als eine ihm von "früher" bekannte Funktion zu verwenden (ok, ich kann nichts dafür, dass er eine Basic- und keine Pascal-Funktion kannte :aa_1:)

    Was nun die "dynamisch berechneten Variablennamen" mit diesem Thread zu tun haben, kann ich leider nicht nachvollziehen.

    Denn es werden die Waggon-Namen-Zeichenketten "berechnet" und immer in der selben Variablen (deren Inhalt natürlich auch für einen Anlagen-Neustart z.B. in der Tag-Eigenschaft einer Immobilie gespeichert werden müsste) gespeichert.

    Aber, wie das nun mal so ist. Die Auffassung über die "richtige" Programmierung ist so verschieden, soviele Programmierer es gibt.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    3 Mal editiert, zuletzt von JuergenSchm (13. Juli 2021 um 14:00)

  • Hallo Frank

    In Lua nutzt man In solchen Fällen Tabellen deren Elemente dann z.B. so angesprochen werten: K[1] bzw. K[2] usw.

    auch so etwas konnte Basic. Eine externe Datei, aus der Daten Importiert werden. Diese Dateien erstellte ich später mit MS Works. Input X ; ..... "Dateiname.txt"; Position des Wertes

    Angefangen vor Jahrzehnten mal mit EEP 2.43. Doch ohne DSL und richtigem Zugang ins Inet verlor man schnell die Lust

    2017 erbte ich EEP 6.1 und wollte mich nochmal etwas reinhängen. Nun ein Sprung zu EEP 14 oder/und EEP15. ok, nun schon auf 16 ;) Mal schauen, wie das läuft...:aq_1:

  • Hallo Parry36 und Tufftuff

    Danke für Eure Kommentare, aber wie JuergenSchm schon schreibt, bin ich eher ein Quereinsteiger bei LUA. Bisher hielt ich nicht viel von, in sofern ich mir bereits bei EEP 2,43 und EEP 6.1 mir etliche Tricks Steuerkreisen selbst entwickelt hatte. Gegebenenfalls kombinierte ich Steuerkreise mit was sinnvollem, wie ein Vogel oder Motorboote die Kreuz und quer übers Wasser fuhren.

    Der Bagger, der die Züge beladen hatte war ebenfalls die Steuerung für den zu beladenen Zug / Züge. Derzeit gab es aber kein sanftes ankuppeln und andere Gerätschaften zum Beladen. Was hier die alte Variante etwas umständlicher macht.

    Anbei geht es mir bei EEP weniger ums Programmieren, sondern hauptsächlich um ein Streckennetz alias Straßen und paar Züge. Sprich eher um den Verkehr selber inkl. festen Fahrplan. Auch die Feinarbeiten wie das Bestücken von Bahnsteigen, Leitungsmasten ectr. sind weniger mein Ding, gehört aber mit dazu - als Beschäftigung in kleinen Pausen, sprich, wenn ich mal nur eine Stunde Zeit habe, wobei sich ein Einstieg in komplizierteren Dingen nicht lohnt.

    LG

    Marcel

    Angefangen vor Jahrzehnten mal mit EEP 2.43. Doch ohne DSL und richtigem Zugang ins Inet verlor man schnell die Lust

    2017 erbte ich EEP 6.1 und wollte mich nochmal etwas reinhängen. Nun ein Sprung zu EEP 14 oder/und EEP15. ok, nun schon auf 16 ;) Mal schauen, wie das läuft...:aq_1:

  • Hallo JuergenSchm

    der Kringel hat eigentlich nur die Funktion der Zeitverzögerung.

    Naja, ich werd noch paar andere Funktionen in den Kringel integrieren, so wird nebenbei der Haufen neben den Bagger dann bei jeder Überfahrung eines KP's kleiner werden, das übernahm der Kran damals mit einer kleinen fast unaufälligen Hin-und Her-Bewegung zusammen mit den eigenen Funktionen (Drehen, Staub, Greifen ectr.), dem abkuppeln und zu Letzt der Lok, die nach 3 Baggerladungen Kohle sich dann für X Sekunden weiter bewegt, um den jeweils abgekuppelten letzten und beladenen Wagon weiter zu schieben und den nächsten Wagon abzukuppeln, bevor er unter dem Bagger ankommt.

    So lange kein Zug zum Beladen bereit steht, wird wohl auch dieses Steuermobil auf einem parallelen Steuerkreis eine Art Raupe steuern, die dann den Haufen wieder anhebt. EDIT:

    Naja, da werde ich vermutlich den KP nutzen, der dann auch das Signal/Weiche für das Steuermobil freischaltet. So liegt alles in einem festen Bereich.

    Sprich das Steuermobil kümmert sich die ganze Zeit um die Raupe bis ein Zug einfährt. Je nachdem welcher Zug kommt, wird dann wohl eine von 3 Weichen das Steuermobil aus diesem Kreis ziehen, via KP die Weiche hinter sich wieder zurückstellen und dabei die Variable auf K1,21 oder 41 setzen. Ein KP mit zwei Funktionen...

    Aber ein anderes Problem geht mir durch den Kopf, dass ich damals mit einem Extra-Steuerkreis lösen konnte.

    Wenn der Zug gerade beim Be- bzw. Entladen ist, was passiert, wenn ich zu diesem Zeitpunkt Anlage speichere bzw. EEP beende ?

    Woher weiß LUA bei welchem Wagen ich stehen geblieben bin ? Würde er nicht beim Neustart automatisch Kx wieder auf K1 setzen ?

    Derzeit kann ich nicht Testen/Experimentieren, ich hab den Rechner mit der großen Anlage nicht dabei. Erst in zwei Wochen habe ich dann wieder mehr Zeit. Stelle Dich schon mal auf weitere Fragen ein ;)

    LG

    Marcel

    Angefangen vor Jahrzehnten mal mit EEP 2.43. Doch ohne DSL und richtigem Zugang ins Inet verlor man schnell die Lust

    2017 erbte ich EEP 6.1 und wollte mich nochmal etwas reinhängen. Nun ein Sprung zu EEP 14 oder/und EEP15. ok, nun schon auf 16 ;) Mal schauen, wie das läuft...:aq_1:

    Einmal editiert, zuletzt von Puffer-MBO (14. Juli 2021 um 01:40)

  • Code
    strTest = "K1"

    strTest1 = string.sub(strTest,1,1) .. tostring

    (tonumber(string.sub(strTest,2)) + 1)

    "string.sub(strTest,1,1)" bezieht dich also auf ",1" für das K und die zweite ",1" auf die Zahl/die zweite Stelle. Richtig ?

    Denn müsste ich das aber ändern. Statt K1 dann K01 für die Werte über 9 und statt 1,1,1 dann eigentlich ,1,1,1 , da das denn dreistellig ist.

    Das selbe Spiel dann mit tonumber. Die 2 bezieht sich auf die 2. Stelle des Namens. Ab K10 sind es aber drei stellen.

    ODER

    sehe ich da was falsch. Dass bei tonumber die 2. Stelle als Wert gesehen wird ??? Diese dann mit 1 addiert und das Ergebnis wieder als Name einfügt.

    LG

    Marcel

    Angefangen vor Jahrzehnten mal mit EEP 2.43. Doch ohne DSL und richtigem Zugang ins Inet verlor man schnell die Lust

    2017 erbte ich EEP 6.1 und wollte mich nochmal etwas reinhängen. Nun ein Sprung zu EEP 14 oder/und EEP15. ok, nun schon auf 16 ;) Mal schauen, wie das läuft...:aq_1:

  • Hallo Marcel ( Puffer-MBO ),

    string.sub(strTest,1,1)

    heißt, nimm von strTest das erste bis erste Zeichen.

    Also

    von "K1" das "K"

    von "K21" das "K"

    In dem Teil

    tostring(tonumber(string.sub(strTest,2)) + 1)

    wird von Lua alles innerhalb der Klammern in der Reihenfolge von innen nach außen ausgeführt.

    Und darum wird zuerst

    string.sub(strTest,2)

    ausgeführt und das heißt, nimm von strTest vom 2. Zeichen bis zum letzten Zeichen (weil hier der 3. Parameter (bis) nicht angegeben ist) alles.

    Also

    von "K1" die "1"

    von "K21" die "21"

    von "K123" die "123"

    Und danach würde ausgeführt, wandle das Ergebnis in eine Zahl um und addiere 1

    Also

    1 + 1 = 2

    21 + 1 = 22

    123 + 1 = 124

    Und danach, wandle das Ergebnis in einen String

    Also

    2 in "2"

    22 in "22"

    124 in "124"

    Und das .. heißt.

    Fasse die beiden Zeichenketten wieder zu einer zusammen.

    Also

    "K" .. "2" = "K2"

    "K" .. "22" = "K22"

    "K" .. "124" = "K124"

    Jetzt mußte Du aber nochmal überlegen.

    Wie heißt bei Dir z.B. der 2. Waggon "K2" oder "K02"?

    Wenn "K02", dann siehst Du bei der Berechnung kommt ein falscher Waggon-Name heraus.

    Was müsste geändert werden?

    Kleine Hilfe.

    Wir müssten an der Stelle nach wandle in einen String, falls erforderlich, noch eine "0" vor das Ergebnis einfügen.

    Lua stellt uns dafür auch eine Funktion zur Verfügung.

    string.format("%02d","1")

    liefert als Ergebnis

    "1" = "01"

    "21" = "21"

    "123" = "123"

    Der Formatierunsparameter "%02d" bedeutet, dass das Ergebnis mindestens 2 Stellen haben muss. Notfalls fügt Lua eine "0" am Anfang ein.

    Bitte versuche erstmal selbst, die Funktion noch in die obige Formel einzufügen.

    Wenn's nicht klappt, nochmal fragen.

    Übrigens, falls Du es noch nicht wusstest.

    Man kann Lua auch außerhalb von EEP testen.

    Natürlich nur die Lua-Funktionen, EEP-Lua-Funktionen liefern dort natürlich einen Fehler, da diese dort unbekannt sind.

    Gib in Google als Suchbegriff "Lua Test" ein.

    Das Ergebnis liefert Dir einen Link auf eine Demo-Seite, die die Lua-Entwickler zur Verfügung stellen.

    Dort kannst Du alle reinen Lua Zeilen einer Funktion eingeben und über "run" werden diese ausgeführt.

    Z.B.

    print(string.format("%02d","1"))

    Button "run"

    liefert als Ergebnis "01"

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    2 Mal editiert, zuletzt von JuergenSchm (14. Juli 2021 um 08:04)

  • Hallo Marcel ( Puffer-MBO )

    wegen dem "Retten" von Werten über den Anlagen-Neustart.

    EEP stellt uns zwei Orte bereit, in denen wir Werte speichern können, die auch nach einem Neuladen/Neustart der Anlage noch vorhanden sind.

    1. die 1000 Dataslots

    2. die Tag-Eigenschaft von Immobilien (beliebig vielen)

    Ich persönlich bevorzuge die Immobilie.

    Ich habe mir auch eine, nicht sehr gewichtige, Begründung bereitgelegt, warum nicht die Dataslots.

    1. Selbst, wenn ich keine Fremd-Lua-Tools einsetze, muss ich mir genau merken, welche Dataslots ich bereits verwendet habe und welche noch frei sind.

    Beim Einsatz von Fremd-Lua-Tools wird's noch schwieriger, die Übersicht zu behalten.

    2. "Früher" habe ich einmal gegen meine Regel verstoßen, dass ich keine Änderung an EEP-Dateien außerhalb von EEP vornehme.

    Ich habe Werte in Dataslots, die in der Lua-"Hauptdatei" gespeichert sind, mit einem Texteditor geändert und dabei einen Fehler gemacht.

    Das Ergebnis war, dass EEP mein Lua-Skript durch sein Default-Lua-Skript ersetzt hat.

    Gut, ich hatte natürlich eine aktuelle Datensicherung, darum war's nicht schlimm, aber als Begründung reichte es mir.

    Also meine Erklärung für Immo-Tag.

    Du hast für diese Funktionalität, um die es hier geht, eine Variable, deren Wert auch nach dem Neuladen der Anlage noch vorhanden sein muss.

    Bei meinem Beispiel heißt diese strTest, Du hast ihr hoffentlich einen besseren Namen gegeben.

    Vor der Verwendung dieser Variable, muss diese aus dem Immo-Tag gefüllt werden.

    Nach dem Ändern des Inhaltes dieser Variablen muss der Inhalt sofort im Immo-Tag gespeichert werden.

    Es gibt dafür zwei EEP-Funktionen

    hResult,strTest = EEPStructureGetTagText(ImmoID)

    EEPStructureSetTagText(ImmoID,strTest)

    Was fürs Speichern/Lesen verwendet wird, kannst Du dem Funktionsnamen entnehmen.

    Du hast sicherlich eine Immobilie in der Nähe, ansonsten stellst Du eine auf (sie könnte sich natürlich auch unter der Anlagenoberfläche befinden).

    Die ImmoID entnimmt man der Objekt-Eigenschaft der Immobilie.

    Wobei man vom Lua-Namen soviel braucht, bis es eindeutig ist (die Nummer ist immer eindeutig)

    Also, wenn da stehen würde

    #1234_TestImmobilie

    wäre die ImmoID

    "#1234_"

    Bitte auch den _ mit nehmen, denn sonst könnte es bei zwei Immobilien #1234_Test1 und #12349_Test2 Verwechslungen geben).

    Die genaue Syntax der Funktionen kannst Du auch dem Lua-Handbuch entnehmen.

    Bitte füge die Funktionen erstmal selbst in Dein Skript ein, die ungefähren Orte hatte ich Dir genannt.

    Falls noch Fragen sind, einfach fragen.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB