Jump to content

Goetz

Mitglieder
  • Gesamte Inhalte

    5984
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Goetz

  1. Finde ich gut. Ich habe es auch durch die Beschäftigung mit Programmen wie dem 3D MBS gelernt (und lerne noch immer) Die Fahrpläne gibt es, aber sie schalten nichts selbständig. Sondern Fahrdienstleiter regeln den gesamten Verkehr an jedem Punkt. Sie richten sich dabei nach den Fahrplänen. Sie wissen anhand der Pläne, wer wann wo zu erwarten ist. Und sie überblicken ständig, wer sich gerade wo befindet. Außerdem stehen sie per Funk mit den Lokführern in Verbindung und geben Anweisungen. Fahrdienstleiter greifen also nicht nur in Ausnahmefällen ein, sondern steuern ständig alles. Wie ein Dirigent.
  2. Es geht weniger um die späte Sicht als vielmehr um den Bremsweg. Wenn der Zugführer die Stellung des Hauptsignals erkennen kann, dann ist es - auch auf gerader Strecke und bei guter Sicht - zum Bremsen viel zu spät. Das Vorsignal sagt also "Brems!" und das Hauptsignal sagt nur noch "und warte hier, bis du weiter darfst." Der typische reale Abstand des Vorsignals zum Hauptsignal beträgt meist 800 bis 1000 Meter (= 1 Kilometer). "Notlösungen" wie einen Rechts-vor-Links-Verkehr oder andere Vorfahrtregeln gibt es bei der Bahn nicht. Niemand fährt ohne explizite Erlaubnis irgendwo hin. Nur so kann Sicherheit gewährleistet werden.
  3. Ich denke, dass streit_ross da nur das Verhalten auf seiner Anlage beschreiben wollte und nicht die Regeln bei der realen Bahn. Vorfahrtregeln kann es bei der Bahn natürlich nicht geben, wie Andy ganz richtig sagt. Aber Engpässe gibt es ständig und dann hängt es vermutlich von den örtlichen Gegebenheiten und weiteren Faktoren ab, wen der Fahrdienstleiter zuerst durchlässt. Folgt kurz hinter der Einmündung ein Haltepunkt, dann kann es sinnvoll sein den Güterzug vorzulassen, weil der diesen Haltepunkt durchfährt, der Personenzug hingegen nicht. Ist der Personenzug aber ein Schnellzug, der den Haltepunkt ebenfalls ohne Stopp passiert, dann wird man ihm vielleicht den Vorzug geben. Im Modellbahn Studio regeln viele User den Verkehr durch Einträge in der Ereignisverwaltung. Und wenn man die Abläufe so automatisiert, dann muss man selbst Regeln festlegen, nach denen entschieden wird. Solch eine Regel hat streit_ross für sich entworfen und auf die bezieht sich seine Aussage.
  4. Reale Bahnfahrten mit Lokführer-Perspektive finde ich inspirierend. Man sieht zum Beispiel, wie sich Gleise zum Bahnhof hin auffächern, wo welche Signale stehen, wie Oberleitungen aufgespannt sind, was typischerweise links und rechts neben Bahnstrecken angesiedelt ist und vielerlei mehr. Mein besonderer Favorit bei YouTube nennt sich Ananas747. Er zeigt viel Geschick beim Umgang mit seiner Videokamera und bietet oft sehenswert gute Aufnahmen. Drum wollte ich hier gerne auf seinen Kanal aufmerksam machen. Ich hoffe, das ist okay?
      • 1
      • Gefällt mir
  5. Goetz

    Neue Beta-Version V5

    @Andy Alle Skripte, die direkt im Hauptmodul oder einem der Untermodule angelegt sind, werden gleich nach dem Start der EV einmal komplett abgearbeitet. @Neo Zu diesem Zeitpunkt stehen die Library Funktionen von Lua noch nicht zur Verfügung. Beispielsweise führt ein print() oder ein layout:getEntityByName() im Skript zu der Fehlermeldung, dass diese globale Funktion nicht definiert sei. Somit akzeptieren diese Skripte auch noch keine Objekte. Ein $("Dingsbums") liefert nil zurück. Ich kann also eine Tabelle Dinge = { "Dings 1", "Dings 2", "Dings 3", "Dings 4" } im Hauptskript anlegen und sie steht mir anschließend zur Verfügung. Aber eine Tabelle Dinge = { $("Dings 1"), $("Dings 2"), $("Dings 3"), $("Dings 4") } bleibt leer, weil die Funktion $() zu diesem Zeitpunkt noch nichts zurück gibt.
  6. Das halte ich - anders als Tom - für den besseren Weg. Es ist wie beim Erlernen von Sprachen. Die ständige Übersetzerei wird schnell zum Hindernis. Die Muttersprache hat man auch nicht mit einem Vokabelheft gelernt sondern dadurch, dass man sie unvoreingenommen benutzt hat. Erst im Kleinen und dann in zunehmend komplexeren Zusammenhängen. Durch Probieren, Aufnahme von Hinweise zu Verbesserungsmöglichkeiten, Mut zur Lücke und vor allen Dingen viel Freude an jedem kleinen Erfolg! Das ist die Methode, mit der Kinder so bewundernswert schnell und gut lernen.
  7. Ich weiß es ehrlich nicht, aber meine Vermutung ist, dass es keinen Unterschied macht. Weil eben in einer Tabelle nur Adressen liegen. Da dürfte auch eine Schnitzeljagd über mehrere gestaffelte Adressen keine Belastung darstellen. Auch dann nicht, wenn diese Adressen während des Programmablaufs dynamisch gebildet werden.
  8. Der Doppelpunkt gibt den Teil links davon als erstes Argument an den Funktionsaufruf, der rechts vom Doppelpunkt steht. Diese Schreibweise ist dann sinnvoll, wenn die Funktion in derselben Tabelle steht wie die Daten, welche die Funktion nutzen soll. Im MBS sind viele Funktionen Teil der jeweiligen Modelle. Ein Riesenrad enthält je eine Funktion play und eine Funktion stop für jede darin verbaute Achse. Deshalb wandelt das MBS diesen Eintrag in der EV in diesen Lua Code um: $("Riesenrad").animations["Rad drehen"]:play(0, 1) Ich habe lediglich in meinem Beispiel den langen Adressteil links vom Doppelpunkt zuerst in einem kurzen Namen zusammengefasst und dann die Funktion aufgerufen. Sonst werden mir die Zeilen zu lang und unleserlich. Die Funktionen play und stop sind im MBS Teil einer Klassendefinition. Deshalb muss man beim Aufruf der Funktionen die Adresse des Objekts und seiner Achse als Argument mit übergeben. Neo hat sich bei solchen Funktionsaufrufen an die in Lua übliche Schreibweise gehalten. Lua kennt zwar keine Klassen, aber die Tabellen kommen dem schon recht nahe.
  9. Ich würde dir gerne helfen, es zu verstehen. Denn das ist der Zweck, den ich damit verfolge. Ich mag keine langen if-Konstrukte. Ein if ist gut, wenn ich einen ja/nein Fall habe. Aber wenn ich viele mögliche Werte habe, auf die ich unterschiedlich reagieren will, dann klappere ich die nicht gerne mit if-Ketten ab. Insbesondere die Tabellen, die Lua bietet, sind da ein bequemerer Weg. Wenn ich die möglichen Werte, die ich zur Auswahl bekomme, als Tabellenindexe (Indizes?) nutze und unter diesen Adressen das ablege, was ich im Falle des jeweiligen Wertes brauche, dann kann ich den entstandenen Wert direkt nutzen, um aus der Tabelle das passende rauszupicken. Anhand eines Beispiels kann ich es vielleicht besser verdeutlichen. Nehmen wir ein Signal mit vier Stellungen und die Geschwindigkeiten, die der Zug fahren darf: Stellung 0 - HP0 - Geschwindigkeit 0 Stellung 1 - HP1 - Geschwindigkeit 120 (nur für dieses Beispiel. HP1 bedeutet "Fahrt") Stellung 2 - HP2 - Geschwindigkeit 40 Stellung 3 - SH1 - Geschwindigkeit 25 Ich kann jetzt die Stellung auslesen und dann alle Möglichkeiten durchtesten: Stellung = signal.state if Stellung == 0 then vehicle.targetSpeed = 0 elseif Stellung = 1 then vehicle.targetSpeed = 120 elseif Stellung = 2 then vehicle.targetSpeed = 40 elseif Stellung = 3 then vehicle.targetSpeed = 25 end Oder ich weise die Geschwindigkeiten in einer Tabelle den Signalstellungen zu: Stellung = signal.state SpeedTable = { [0] = 0, [1] = 120, [2] = 40, [3] = 25 } vehicle.targetSpeed = SpeedTable[Stellung] Ich benutze hier die Signalstellung als Index, um mir aus der Tabelle den passenden Wert rauszupicken. Die Nummern vorne in den eckigen Klammern wären nicht nötig. Bis auf eine: die Null. Wenn man keinen Index vergibt, dann bekommt das erste Element in einer Tabelle die Nummer 1. Deshalb habe ich die Null in eckige Klammern als Index vorgeben müssen. Und dann habe ich das Prinzip für die übrigen Werte beibehalten. Alternativ ginge es auch so: Stellung = signal.state SpeedTable = {0, 120, 40, 25} vehicle.targetSpeed = SpeedTable[Stellung + 1] aber die erste Form macht deutlicher, was wozu gehört. Man kann dieses Prinzip auf die Spitze treiben, indem man an passenden Stellen keine Werte in der Tabelle ablegt, sondern ganze Funktionen. Lua macht da keinen Unterschied, weil es eigentlich immer nur Pointer sind, die an diesen Stellen liegen. Also Adressen. Ob dann an dieser Adresse eine Zahl, ein Text, eine weitere Tabelle oder eine Funktionsdefinition hinterlegt ist, spielt für den Tabelleneintrag keine Rolle.
  10. Es ist zwar sicher nicht ganz das, was du damit gemeint hast, aber ich habe eine alternative Version deiner Demo gebaut. Animationstabelle Version Goetz.mbp
  11. Die Anlage aus der gestrigen Sendung (die ich als sogenanntes Highlight dauerhaft bei Twitch gespeichert habe) hänge ich mal hier an. Dann ist sie in diesem Stadium konserviert, auch wenn ich sie demnächst weiterbaue. MaerklinMagazin 2015 5 Bahnhof Trossingen.mbp
  12. Genau - das ist der Fehler, der da bemängelt wird. Eine schließende Klammer fehlt noch. Sehr gut erkannt. Die Anlage, auf die du dich in den Screenshots beziehst, ist schon im Bereich "Entwurf" hochgeladen. Hier ist die Content-ID: 9967751A-FA43-45BE-88AF-B9A0E28E00F9 Die Funktionsweise hast du im Übrigen genau richtig verstanden. Ich habe eine Idee, wie das gehen könnte. Aber ich möchte es erst selbst ausprobieren, bevor ich es hier erläutere.
  13. Goetz

    Neue Beta-Version V5

    Yes, it does. The translation is literal, to be safe that it stays true to the original. The resulting code cannot be reproduced 1:1 from scratch in V5. And there is no reason why anyone should write new code in this old, cumbersome way when generating a new bit of EV. The effect that the code has can be reproduced perfectly and in a much better (= simpler) form, as Andy has shown. Andy and others are giving their best to achieve just that. You may want to be a bit more grateful for that, even if you don't immediately understand all the answers. Also, please note that we're all still learning. And that this is early on in the beta phase. So nothing's "urgent" yet. Take it easy, André.
  14. Goetz

    Neue Beta-Version V5

    Try the cog wheel next to the field. If the triggering object can be referenced, you'll find "Trigger" in the context menu attached to that cog.
  15. Goetz

    Neue Beta-Version V5

    und eine variable Schriftgröße (Strg + Mausrad)
  16. Goetz

    Neue Beta-Version V5

    Ich zumindest würde mich auch freuen, wenn das Verhalten des Editors an andere angeglichen werden könnte.
  17. Hallo, liebe MBS Freunde! Heute Mittag ab ca. 12 Uhr zeige ich wieder auf Twitch für ein bis zwei Stunden meine Experimente mit dem 3D Modellbahn Studio. Ich weiß, dass die Mittagszeit für viele nicht besonders günstig ist. Aber ich muss die Zeiten nutzen, in denen ich hier die nötige Ruhe für eine Sendung habe. Viele Grüße Götz
  18. kannst du auch mit V5 weiter betreiben. Probiere es aus. Du kannst ja die V5 in der kostenlosen Standard-Version runterladen und damit deine V4 Anlage öffnen und bespielen.
  19. Goetz

    Neue Beta-Version V5

    You can switch back and forth as long as you don't alter the script. Once you've changed it, it's not possible to convert it back because Lua offers many commands for which there is no equivalent in the graphical EV. Because you've placed the last command in the lower box of your condition. The upper box (above the thin black line) is for all "condition is met" cases. The lower box (below the thin black line) is for the "condition is not met" case.
  20. Das wäre im Ernstfall wirklich fatal. Das Gleis muss als "besetzt" gelten, sobald es einem einfahrenden Zug zugewiesen wurde. Keine Frage! Aber der Zweck der Übung war doch eine kompakte Routine für die "Besetzt"-Prüfung. Das drumherum hatte ich deshalb bewusst einfach gehalten, weil es dafür irrelevant war.
  21. Das ahnte ich, weil du es an anderen Stellen nutzt. Ich hatte mich entschlossen es trotzdem zu schreiben, weil es dann vielleicht ein oder zwei stillen Mitlesern zu einem besseren Verständnis hilft.
  22. Hallo @fzonk, wenn ich darf, dann würde ich gerne zwei kleine Anregungen zu deiner EV beisteuern. Wenn sich die Besetzt-Variable ändert, dann reagierst du darauf und schaltest die Signallampen entsprechend um. Für diesen Zweck machst du zwei Prüfungen: Erst prüfst du, ob die Variable auf "True" gesetzt wurde. Und schaltest in dem Fall die Lampe auf Rot. Und dann prüfst du erneut, ob die Variable auf "False" gesetzt wurde (um in diesem Fall die Lampe auf Grün zu setzen) Die zweite Prüfung ist eigentlich redundant, denn wenn das Ergebnis der ersten Prüfung ergab, dass die Bedingung nicht erfüllt war, dann kann die Variable nur noch "False" sein. Für diesen Fall (Bedingung nicht erfüllt) gibt es im gelben Prüfungsblock ein zweites Fach. Das ist zwischen der schwarzen Trennlinie und dem unteren gelben Balken. Dort kannst du die alternative Aktion "Lampe auf Grün setzen" hineinlegen: Das kann die EV schneller verarbeiten und lesbarer ist es auch. Der gleiche Trick funktioniert auch für den umgekehrten Fall "Lampe wurde umgeschaltet, Variable muss gesetzt werden" Viele Grüße Götz
  23. Das wäre fantastisch. Ich würde mich freuen, wenn ich alle Objekte ermitteln könnte, die einen Zugverband ausmachen. Damit hätte ich wiederum Zugriff auf die Eigenschaften dieser Objekte und auf ihre Gesamtzahl. Alternativ würde auch ein "wer hängt an dieser Kupplung" funktionieren. Damit kann man die Kette selbst aufbauen und auch herausfinden, wer im Verband welche Ausrichtung hat (was zum Beispiel von Bedeutung ist, wenn man eine Tür öffnen möchte.)
  24. Goetz

    Neue Beta-Version V5

    Ernsthaft: Das MBS wäre - insbesondere jetzt in der Version 5 - eine fantastische Lernhilfe für alle, die in die Programmierung einsteigen wollen. Egal, ob Schüler, Studenten, Lehrer oder Profs. Weil ein Zug, der das richtige Gleis findet eine viel schönere Belohnung ist als ein "Hallo Welt" auf dem Bildschirm.
  25. Goetz

    Neue Beta-Version V5

    Die ist köstlich, Easy! Und sie ist ein ideales Übungsobjekt für die Rekursion, die in diesem Video besonders schön erklärt wird.
×
×
  • Neu erstellen...