Jump to content

Goetz

Mitglieder
  • Gesamte Inhalte

    5984
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Goetz

  1. Wow - das hast du alles sehr gut umgesetzt, Aloys Funktioniert prächtig. Dass am Signal 201 die Besetztanzeigen nicht gelöscht werden. liegt am vorherigen Schritt. Der kann beim Signal 201 nicht ausgeführt werden Es soll eine Weiche umgestellt werden. Und das Signal 201 hat als einziges keine zugeordnete Weiche. Deshalb habe ich, wie du im Bild oben siehst, diesen Schritt in eine Bedingung gesetzt. Ich prüfe damit zuerst, ob überhaupt im Signal eine Weiche gespeichert ist. Wenn nicht, dann wird auch nicht versucht eine Weiche umzuschalten. Wenn ein Befehl "ins Leere greift" - also beispielsweise die benötigte Variable nicht findet - dann werden alle nachfolgenden befehle nicht mehr ausgeführt. Das ist eine Schutzmaßnahme, die verhindert dass an solch einer Stelle Unsinn passiert. Anbei die korrigierte Fassung: Aloys Schattenbahnhof (korrigiert).mbp.
  2. Oh ja, den P111 erinnere ich noch gut. Mein Onkel hatte einen und mein Cousin fuhr mit mir damit über den kleinen Erdbeeracker hinter'm Haus. Das war in etwa zu der Zeit, aus der auch mein Avatar Bild stammt.
  3. Die sind in diesem Fall aber in ihrer Auswirkung sehr verschieden. Es ist ratsam, Objekte immer über ihre Adressen anzusprechen und nicht mittels ihrer Namen. Weil man in Lua auch andere Variablen verwendet als Objektvariablen. Wenn du Eins Zwei = 12 schreibst, dann interpretiert Lua das Leerzeichen als Trenner zwischen zwei Namen oder Schlüsselworten. Aber die Objektvariable ist eigentlich ein Bezeichner in einer Tabelle. Daher die Schreibweise ["Eins Zwei"] Und die Anführungszeichen deklarieren alles dazwischen als einen String und somit auch als einen Bezeichner. Damit hast du bei Objektnamen und Objektvariablen viel Freiheit.
  4. Für Objektvariablen gelten andere Regeln, Ronald. Denn diese Namen sind Bezeichner in einer Tabelle. Das erkennst du an der Lua-Schreibweise dieser Namen in eckigen Klammern und Anführungsstrichen. Leer- und Sonderzeichen in Variablennamen bereiten Lua keine Probleme, wenn sie eindeutig als Teil des Namens erkennbar sind. Ich habe übrigens für meine Korrektur Aloys Original Versuch benutzt. Die enthält keine Änderungen von dir.
  5. Hallo @aloys63 Deine EV enthielt nur einen klitzekleinen Fehler. Du hast im Signal den Namen des Zugs gespeichert. Du musst aber die Objektadresse speichern. Das sieht oberflächlich betrachtet gleich aus. Aber es sind zwei verschiedene Dinge. So sieht der Eintrag in der EV bei dir aus: Und so müsste er richtig aussehen: Mit dieser einen Änderung funktionieren bei dir alle Signale so, wie du es vorgesehen hattest: Aloys Versuch (korrigiert).mbp Wenn du Objekte in Variablen speicherst, dann zeigt dir das Modellbahnstudio den Namen des Objekts. Aber es merkt sich nicht den Namen, sondern "das Ding", welches diesen Namen hat. Du könntest drei Loks mit identischem Namen auf der Anlage haben und das Modellbahnstudio wüsste trotzdem immer, welche von den drei Loks gemeint ist, wenn du die Objektadresse speicherst. Es ist übrigens völlig egal, ob dieses Objekt Leerzeichen im Namen hat oder nicht. Viel Spaß mit deiner korrigierten Anlage und deinen weiteren Experimenten Götz
  6. Eine Liste hat fortlaufend nummerierte Zellen. in einer Tabelle hingegen hat jede Zelle einen Bezeichner. Damit haben die Elemente einer Liste eine Reihenfolge, die einer Tabelle jedoch nicht. Diese Unterscheidung wird in fast allen Programmiersprachen getroffen. Und somit auch im MBS. Wenn du eine Tabelle erstellst, dann wirst du bei jedem Element nach einem Namen gefragt. Bei einer Liste ist das nicht der Fall. Lua fasst beide Arten von Elementen in einer Tabelle zusammen. In dieser Hinsicht ist diese Skriptsprache ein Exot. Aber die Tabellen und Listen in den MBS-Objekten haben nichts mit Lua zu tun. Lua hilft dir nur, sie zu verwalten.
  7. Ein Programm verhält sich nur dann verschieden, wenn es (irgendeinen) Unterschied gibt. Sonst nicht. Es hat kein Eigenleben ... "Ich sehe keinen Unterschied" oder "Ich finde keinen Unterschied" ist die bessere Einstellung. Weil du so nicht den Blick für Unterschiede verschließt. Wenn du steif behauptest es gäbe keinen, dann wirst du ihn (und somit die Ursache) auch nur schwer entdecken können.
  8. Versuch doch mal bitte, dem Tabellenplatz zuerst einen anderen Wert zuzuweisen, bevor du ihn löscht. $("Abzweigung").variables["Wartender_Obj"] = 1 -- erst Objekt ersetzen table.remove($("Abzweigung").variables["Wartender_Obj"],1) -- dann löschen
  9. ist immer ein Hinweis darauf, dass die Umstände nicht identisch sind. Da wir dir nicht zuschauen, können wir nur schwer einschätzen, worin genau der Unterschied bestehen mag. Wenn ich bei einem vermeintlichen Klick aufs Gleis die Maus ein wenig ziehe, dann wird das neue Stück angehängt. Lasse ich die Maus still liegen, dann erzeugt der Klick die Kopie an Ort und Stelle. Aber ich kann nicht sagen, ob du vielleicht auf die gleiche Weise mal dieses, mal jenes Verhalten erzeugst.
  10. Das liegt nicht an Lua. Deine Objekttabelle steht im MBS. Dort gelten andere Regeln (weil das MBS nicht in Lua programmiert ist.) Probiere mal bitte, ob du den Tabellenplatz mit table.remove löschen kannst, wenn du ihm zuvor etwas anderes als ein Objekt zuweist.
  11. Musst du nicht. Ich lege die dauerhaft entweder auf dem Twitch Kanal ab oder auf meinem YouTube Kanal. Und die Links zu beiden Orten hast du ja jetzt. Weil es noch nicht 11 Uhr war, ich den Stream aber schon gestartet hatte, fahren am Anfang alle Züge ein paar Runden, bevor es los geht. Und da hatte ich das Mikro noch ausgeschaltet.
  12. Die müssen von jemandem anderen sein. Zum Video EV Baiscs aus dem ersten Posting in diesem Thread gibt es bislang von mir noch keine Fortsetzung. Aber in den beiden Sendungen von gestern und heute lernst du (unter anderem) Schlagwörter, Listen und Tabellen kennen.
  13. Die Sendungen von gestern und heute findest du mit diesem Link: Falls du aber die Anlage meinst, die ich für das Video im ersten Posting oben gebaut hatte: Die gibt es nicht fertig. Aber du kannst sie sehr leicht selbst bauen. Denn sie besteht nur aus Modulen der Minimax-Serie. Diese Module findest du in deinem Modellbahnstudio unter der Kategorie "Landschaftselemente"
  14. Wie versprochen habe ich in der heutigen (2-stündigen) Sendung den Zügen "beigebracht", am Einfahrsignal zu stoppen. Außerdem habe ich den Ring mit Blocksignalen in drei Abschnitte unterteilt. Sie arbeiten nach dem "Selbstblock" Prinzip. Hier ist die Anlage, die im Laufe der Sendung entstanden ist: Schattenbahnhof 02 (WIP).mbp
  15. Vielen Dank für dein Feedback, Martin. Das Einfahrsignal wird im aktuellen Stand der Anlage noch ignoriert - stimmt. Soweit bin ich noch nicht. Ich will versuchen, heute (Sonntag) ab ca. 11 Uhr mit der Anlage weiterzumachen. Dazu gehört dann sicher auch, dass eintreffende Züge das Einfahrsignal beachten. Hier ist der Stand der Anlage, den ich in der gestrigen Sendung erreicht hatte: Schattenbahnhof 01 (WIP).mbp
  16. Ich zeige heute auf meinem Twitch-Kanal wieder Basics zur Ereignisverwaltung in V5. Beginn der Sendung ist vermutlich um 10:30 Uhr. Als Beispielanlage verwende ich den kleinen Schattenbahnhof von @ger klunder. Denn damit lässt sich vieles sehr schön zeigen. Ich hatte es am Mittwoch und Freitag schon einmal auf Englisch versucht. Aber ich war mit dem Ergebnis unzufrieden. Deshalb fange ich heute noch einmal von vorne an und erkläre diesmal alles auf Deutsch. Ich freue mich, wenn jemand Zeit und Lust hat live dabei zu sein. Die Sendung ist aber auch später noch ein paar Tage auf Twitch abrufbar. Viele Grüße Götz
  17. @streit_ross Das ist keineswegs eine "unnütze Spielerei". Im Gegenteil ist das gemeinsame und gleichzeitige Agieren in derselben "Welt" der Kern dessen, was andere Spiele sehr populär macht. Bei der realen Modellbahn ist es genauso reizvoll, mit anderen gemeinsam an derselben Platte zu arbeiten. Die Popularität von Minecraft beruht ebenfalls (unter anderem) auf der Möglichkeit, gemeinsam zu bauen. Genau diese Möglichkeit war der Grund, warum unser 9-jähriges Enkelkind nicht genug davon bekommen konnte, mit mir Minecraft zu spielen. Die Umsetzung einer Multiplayer Version ist nicht so einfach, wie es auf den ersten Blick scheinen mag. Aber es wäre ein Feature, welches die Popularität vom MBS enorm steigern würde.
  18. Nein - vollkommen richtig. Ich hatte das nur übersehen. Pardon. Ich hatte die Funktionsdefinition SendCom() überflogen und dort kein local gesehen. Da du die Variablen in der Funktion neu befüllst, kannst du sie übrigens bedenkenlos beim Verlassen der Funktion löschen. Also innerhalb der Funktion local anlegen. Das hat - soweit mein bisheriges Verständnis dieser Materie - zwei Vorteile. Du kannst den selben Namen für weitere lokale Variablen an anderen Orten nutzen, ohne Konflikte befürchten zu müssen. Lokaler Speicher ist schnell, aber auch wertvoll. Deshalb ist es gut, den nur für den Moment zu beanspruchen, in dem man eine Variable wirklich braucht. Wenn sie beim nächsten Funktionsaufruf einen neuen Wert bekommt und der letzte Wert bedeutungslos ist, dann kann man die Variable ebenso gut in dem Moment frisch anlegen, in dem sie eingesetzt wird. Oftmals sind die Variablen ja nur Zwischenträger, um Daten von A nach B zu bringen. Ich glaube, dass es generell eine gute Praxis ist, die Lebensdauer von Variablen kurz zu halten. Wenn der aktuelle Wert nicht mehr benötigt wird - weder direkt noch indirekt (für Additionen etc.), dann ist die Variable passé. Dass ich später unter dem selben Namen wieder einen Wert bilde, macht keinen Unterschied. Ich muss nicht permanent ein Plätzchen frei halten. Ich könnte mir auch vorstellen, die Tabelle ComAnswer() ebenfalls lokal in der Funktion SendCom() zu erzeugen und mit return an den Aufrufer zu übergeben. Das wäre meines Erachtens sauberer, weil diese Tabelle ebenfalls bei jedem Funktionsaufruf neu gebildet werden muss. Und das ist mit einer lokalen Tabelle innerhalb der Funktion automatisch gewährleistet. Der Empfänger ist dann eine neue lokale Adresse beim Aufrufer. Dort wird die Tabelle für die print-Ausgabe verwendet und anschließend der Müllabholung überlassen. Zu print() habe ich auch noch einen Vorschlag. Die Funktion print() ist eine echte Bremse. Sie kostet viel Rechenzeit. Deshalb ist es ratsam, zuerst den gesamten Ausgabetext in einem einzigen String zusammenzufassen und diesen dann mit einem einzigen print() auszugeben. Lua hat dafür etwas sehr nettes: table.concat() Beispiel = {"Lua", "und", "die", "weite", "Welt"} s = table.concat(Beispiel, " ") print(s) Das zweite Argument für table.concat ist das einzusetzende Trennzeichen. Im obigen Beispiel ist es ein Leerzeichen. Die "alles in einen String" Methode ist aber auch ratsam, wenn du z.B. in einer Schleife wiederholt print() verwendest. Bau mit der Schleife lieber den String zusammen und gib ihn dann einmal komplett aus. Weil ich oft missverstanden wurde: All das meine ich in keiner Weise als Kritik. Was du programmiert hast, ist alles prima. Ich will nur gerne beitragen, was ich entdeckt habe und nützlich finde. Viele Grüße Götz
  19. Spontan habe ich nur zwei Kleinigkeiten: statt if ok == nil then kannst du auch schreiben if not ok then, denn nil wird in Lua als false gewertet. Variablen sind in Lua per se global angelegt. Lokale Variablen muss man explizit erzeugen. Deshalb wäre es besser, du würdest local ok, status = tcp:connect(host, port) schreiben. Das Schlüsselwort local deklariert alle dahinter aufgezählten Variablen als lokal Funktionsargumente, Iteratoren etc. sind natürlich auch in Lua per se lokal definiert.
  20. Ich kann es nicht sicher sagen, aber ich fürchte, an diese Werte kommst du erst in der V5 per Ereignisverwaltung dran. In V4 müsste man - wenn es ginge - eine Variable im Auslöser $_trigger1 (dem auslösenden Fahrzeug) ändern. Ich habe verschiedene Varianten wie z.B. $_trigger1.delereration ausprobiert, leider ohne Erfolg. Alle haben nur neue Variablen mit dem angegebenen Namen im auslösenden Fahrzeug angelegt, aber nicht die Eigenschaft des Fahrzeugs geändert. Wenn du an solchen Feinheiten wie der Verzögerung per EV Einfluss nehmen willst, dann tust du dir mit der V5 aber sowieso einen Riesengefallen. Die ganze EV ist dort viel einfacher zu handhaben.
  21. I wonder why you ran into the same problems. The system works fine here. https://youtu.be/bTizS_WmenU As is, the system has two flaws. it allows trains to enter a fully occupied station. it may change a switch underneath an incoming train, if the timing of an outgoing train is unfortunate. There are better ways to handle the track finding. But I wanted to show you that your concept idea wasn't wrong. It was only incomplete.
  22. Hello @ger klunder Your method works. You only missed one crucial detail: A train which enters the station, must "shut the door behind", figuratively speaking. In other words: When entering the station, you must switch the point at the entrance side away from the track you've just entered. Because that track is now occupied. When you do that, you may use your tactic to have the leaving train switch the path into this track. Here's your original layout with the required alteration: Ger Klunder Sample (fixed).mbp Apart from that one change, the EV is as it were before. I also took the liberty to move the signals to the appropriate (right) side of the track. And I move the entire layout to the center of the world (coordinates 0, 0) Greets Goetz
  23. Mit dem Hinweis von @streit_ross wurde mir klar, warum es bei dir nicht klappt, @aloys63 Das 3D-Modellbahnstuduo darf nicht geöffnet sein, wenn du hier eine Beispielanlage anklickst.
  24. Ja, da liegst du leider falsch. Das Ereignis "Zug betritt Gleis" gehört im MBS zum Gleis und nicht zum Zug.
  25. Stimmt genau. Wenn es sich um eine Anlage handelt, dann musst du auf der Startseite zum Online-Katalog gehen und auf der nächsten Seite oben rechts die ID eingeben: Am besten nutzt du dafür Kopieren und Einfügen.
×
×
  • Neu erstellen...