Eisbär Geschrieben 24. April 2020 Geschrieben 24. April 2020 Hallo zusammen. Nachdem ich mich jetzt 2 Wochen lang mit dem MBS beschäftigt habe stelle ich nun meine erste Anlage vor. Ich habe die Anlage eben unter dem Namen "Schattenbahnhof" veröffentlicht (ID=80D60E0E-CDD1-4DEF-8D99-86A9979568A4). Es handelt sich um eine Anlage mit nur einem großen Gleisoval auf der Hauptebene und darunter einem Schattenbahnhof. Der hat 6 Wartegleise und viel Platz für weitere Ideen (Abstellgleise, Rangierbereich, etc.). Man kann Aktionen erstellen und diese über das Steuerpult ausführen lassen. Derzeit kann man sich damit jeden der 6 Züge auf der Hauptebene bereitstellen und sie auch wieder abstellen lassen. Natürlich kann man weiterer Aktionen ergänzen. Sollte Interesse bestehen erkläre ich gerne was dafür zu tun ist. Die 6 Züge sind mit 6 Fahrreglern verbunden. Wenn man einen Fahrregler mit einem neuen Zug verbindet sollte man die Beschriftung darunter ändern. Das habe ich nicht automatisiert weil die Zugnamen oft sehr lang sind. Zweck dieser sehr nackten Anlage ist es die Basis für den Aufbau neuer Anlagen zu sein, die dann gleich über den Schattenbahnhof und über nützliche LUA-Funktionalitäten verfügen. So kann man zum Beispiel auf den Schaltpulten (links Schattenbahnhof, rechts Hauptebene) verfolgen wie sich die Züge bewegen, weil die Gleisnanzeige automatisch rot wird, wenn sich ein Fahrzeug auf dem korrespondierenden Gleisabschnitt befindet und die Anzeige geht ebenso automatisch wieder aus wenn das Gleis leer ist. Hoffentlich habe ich mich bei meinem Erstlingswerk nicht zu blöd angestellt und gute Lösungen gefunden. Ich freue mich auf Eure Meinungen. VG Christian
h.w.stein-info Geschrieben 24. April 2020 Geschrieben 24. April 2020 Hallo Eisbär ( Christian ) Die BR 24 bleibt irgendwie falsch stehen . Normaler Weise müsste sie doch bei der Ausfahrtsignal zum stehen kommen . Oder hab ich ein Bedienungsfehler gemacht ? Zug mit Pfeiltaster gewählt und dann auf linke Taste ( grün ) bestätigt . Dann fing unten eine Lampe an zu Blinken ( Timer , Countdown ? ). Zug fuhr eine Runde und dann blieb sie stehen , siehe Bild oben . Ich hab keine Ahnung von der Steuerung , da ich nicht alles ausprobiert habe . Viele Grüße und bleib Gesund HnS
Eisbär Geschrieben 25. April 2020 Autor Geschrieben 25. April 2020 vor 10 Stunden schrieb h.w.stein-info: Zug fuhr eine Runde und dann blieb sie stehen , siehe Bild oben . Hallo Hans. Zunächst einmal das Blinken signalisiert, dass eine Aktion ausgeführt wird. Man sollte währenddessen keine manuellen Eingriffe vornehmen, denn dieses Aktionen sind ganz einfache Stuerungen, die starr veine Abfolge von Steueranweisungen ausführt, abhängig von bestimmten Gegebenheiten (Zugposition, Geschwindigkeit, etc.) und feste Wartegleise für die Züge erwarten. Auf dem Fahrpultbild ist zu erkennen (untere Textausgabe), dass die Aktion abgeschlossen wurde. Das wird durch folgende Situaltion ausgelöst: Der Zug befindet sich auf seinem Wartegleis im Schattenbahnhof. Er hat die Abbremsgeschwindigkeit (einstellbar über Tabelle "Abbremsgeschwindigkeit" im Ereignisdialog unter Ereignisse Skripte) erreicht. Den Rest erledigt dann das rote Signal des Gleises und der verbundene Gleiskontakt. Bei mir klappt alles tadelos und ich habe seit der Veröffentlichung nichts verändert. Deshalb muss ich davon ausgehen, dass Du mit manuellen Eingriffen das Fehlverhalten verursacht hast. Wahrscheinlich hast Du zeitgleich einen anderen Zug manuell gesteuert, der auf ein anderes Gleis fahren sollte, aber auf dem Gleis der BR24 gelandet ist, weil die aktive Aktionssteuerung die Weichen immer wieder für die Aktionsfahrt einstellt. Wenn ich mir die Gleisanzeigen auf dem Steuerpult für den Schattenbahnhof ansehe wird auch klar was passiert ist. Auf Wartegleis 1 steht ein kurzer Zug, also wohl eine einzelne Lok und nicht der ICE (für den dieses Gleis reserviert ist). Am roten Einfahrtsignal von Wartegleis 4 steht ein sehr langer Zug, vermutlich der ICE. Lösung: Manuell alle Züge wieder auf die richtigen Wartegleise im Schattenbahnhof fahren. Dabei Einfahrtsignal auf grün und Ausfahrtsignal auf rot und nach abstellen des Zuges Einfahrtsignal auch wieder auf rot. Hinterstes Wartegleis ist Gleis 1, gehört zu Zug 1 (ICE), gesteuert mit dem linken Fahrregler, usw. Verhindern dass das wieder passiert: Zukünftig nicht mehr manuell im Schattenbahnhof steuern oder sicherstellen, dass am Ende alle Züge wieder auf Ihren Gleisen stehen, oder die automatisierten Aktionen nicht mehr benutzen. Eine andere Möglichkeit (falls Du Dich irgendwann mal mit der programmatischen Steuerung auseinander setzen solltest) ist es intelligentere Aktionsskripte zu schreiben. Für mich reicht das so, ich wollte damit nur erreichen, dass ich mir nach Belieben einen Zug auf die Hauptebene holen und auch genauso einfach wieder abstellen kann. VG Christian
RoniHB Geschrieben 25. April 2020 Geschrieben 25. April 2020 (bearbeitet) Hallo @Eisbär, also wenn ich die Funktion richtig verstehe, wählt man einen Zug aus dem Schattenbahnhof mit der Funktion "Bereitstellen' aus, drückt den Startknopf und der Zug komm an die Oberfläche und hält vor den Drehreglern. Jetzt kann man mit dem Drehregler den Zug auf der oberen Platte fahren lassen. Wenn man eine andern Zug fahren lassen möchte, schickt man ihn mit der Funktion 'Abstellen' wieder in den Untergrund. wenn der dort angekommen ist, kann man das gleiche Spiel mit einem anderen Zug durchführen. So weit so gut. Das funktioniert aber nur mit einem Zug zur Zeit, sonst kommt es zu Problemen, oder. Wozu dient der rote Knopf neben dem grünen? LG Ronald Bearbeitet 25. April 2020 von RoniHB Rechtschreibung
Eisbär Geschrieben 25. April 2020 Autor Geschrieben 25. April 2020 Hallo Ronald. Ich hatte gehofft das mit dem grünen und dem roten Knopf sein intuitiv... Der rote dient dazu eine laufende Aktion abzubrechen. Es klappt mit allen Zügen, sie müssen nur da stehen, wo die sehr starr geschriebenen Aktionsskripte sie beim Start erwarten. Das heißt zum Holen muss der Zug auf seinem Wartegleis im Schattenbahnhof stehen (von hinten nach vorne durchnumeriert). Zm Abstellen muss er ungefähr da stehen, wo er auch bereit gestellt wird. Während laufender Ationen sollte man keine manuellen Bedienvorgänge durchführen! Die Skripte können natürlich geändert werden und man kann eigene hinzufügen. Eigene Skripte ändert man so: Im Ereignisverwaltungsdialog unter "Ereignisse/Skripte/Fahraktionen/Pläne" eigenes Skript erstellen. Unter Ereignisse/Skripte auf Variablen gehen, den Dialog für die Tabellenvariable "Aktionspläne" öffnen und neuen Skript ergänzen. Als Name bitte den Namen eingeben, der in der Auswahlliste angezeigt werden soll. Als Wert den neuen Skript wählen. Fertig, schon gibt es einen neuen Skript. Die vorhandenen Aktionen habe ich für mich gemacht. Es ist aber jeder herzlich eingeladen eigene zu ergänzen und ich würde mich freuen, wenn die veröffentlicht würden. So entstünde ein Mehrwert für alle Nutzer. VG Christian
Goetz Geschrieben 27. April 2020 Geschrieben 27. April 2020 (bearbeitet) Am 24.4.2020 um 20:30 schrieb Eisbär: Hoffentlich habe ich mich bei meinem Erstlingswerk nicht zu blöd angestellt und gute Lösungen gefunden. Das ist ein beeindruckendes Erstlingswerk. Es ist nicht besonders pflegeleicht, weil es viel "Copy & Paste" Code enthält. Zum Beispiel sind die Skripte unter "Fahraktionen" sechs Mal nahezu identisch. Jede eventuelle Korrektur und Verbesserung müsstest du sechs Mal durchführen. Das finde ich insofern verblüffend, als du gleich darunter (im Ordner "Planmuster") generische Ereignisse hast, die du mit unterschiedlichen Argumenten aufrufst. Dir ist das Prinzip also eigentlich geläufig. Insgesamt ist die EV für das, was sie tut, sehr groß geraten. Deshalb überblicke ich auch noch nicht im Einzelnen, was du wo tust und warum. Man sieht einerseits, dass du eine Menge Werkzeuge kennst, wie z.B. die Verwendung einer namenlosen Funktion, die du an Ort und Stelle definierst. Und andererseits gehst du dann in dieser Funktion hin und prüfst exakt dieselbe Bedingung zweimal, um zwei Tabellen (für Fahrregler und für Loks) zu erstellen. Vorschlag: layout:enumEntities( function(entity) if (string.sub(entity.name, 1, 4) == "Fre_") then -- Fahrregler table.insert($("Skripte").variables["Fahrregler"], entity) -- Loks if (not (entity.connection == nil)) then table.insert($("Skripte").variables["Loks"], entity.connection) end end ) anstatt layout:enumEntities( function(entity) -- Fahrregler if (string.sub(entity.name, 1, 4) == "Fre_") then table.insert($("Skripte").variables["Fahrregler"], entity) end -- Loks if (string.sub(entity.name, 1, 4) == "Fre_") then if (not (entity.connection == nil)) then table.insert($("Skripte").variables["Loks"], entity.connection) end end ) aber das ist sicher Geschmacksache. In Lua gilt übrigens jeder Inhalt einer Variablen als true. Also im Gegensatz zu anderen Sprachen auch die 0 und ebenso ein leerer String. Du kannst also -- statt if (not (entity.connection == nil)) then -- einfach if entity.connection then schreiben. Sorry - das sind einfach nur ein paar beliebige Punkte, die ich spontan kommentiere. Ich hoffe, du kannst damit etwas anfangen. Ich will nicht an deinem Code rumnörgeln sondern nur schauen, ob ich ein paar Anregungen beisteuern kann. Nachtrag: if Bedingung == true then ist eine Zeile, die ich in sehr vielen Skripten lese. Meines Erachtens ist das weder sinnvoll, noch erhöht es die Lesbarkeit. Aber es ist ein Hinweis darauf, dass man Vergleichsoperatoren noch nicht vollends durchschaut hat. Jeder Vergleich kann nur entweder true oder false liefern. Sonst nichts. Und genau das sucht if: entweder ein true oder ein false. Sonst nichts. Wenn also in der Bedingung selbst schon true resp. false steht, dann ist if Bedingung then die bessere Schreibweise. Für die Lesbarkeit wählt man geeignete Variablennamen. -- beispielsweise if Besetzt then -- oder if Zug_ist_bereit then -- oder if habeAnmeldung then -- etc. Bearbeitet 27. April 2020 von Goetz Nachtrag
Eisbär Geschrieben 28. April 2020 Autor Geschrieben 28. April 2020 Hallo Goetz. Erstmal vielen Dank zu Deinem Kompliment zu meinem Erstlinggswerk. Und natürlich auch für die konstruktive Kritik. An der Stelle zu der Du mir die Korrektur vorschlägst kann ich nur sagen: "Verdammte Kopierpaste!" Da habe ich wohl beim Einfügen gestottert... Ich bin professioneller Softwareentwickler. LUA ist aber Neuland für mich und entsprechend bewege ich mich hier noch ein wenig schwerfällig. Das ich ein Objekt wie einen booleschen Wert nutzen kann wusste ich zum Beispiel nicht. Ich kenne es von "echten" Programmiersprachen so, dass das zu einer Exception führt. Das mit den 2 x 6 fast identischen Skripten hat aber seinen Grund. Eine Tabelle in den Variablen unter "Ereignisse/Skripte" nimmt alle verfügbaren Aktionen auf. Der Schlüssel ist der in der Oberfläche anzuzeigende Name und der Wert ist der auszuführende Skript. Das Konzept sieht also einen Skript für pro angebotener Aktion vor. Da es derzeit 6 Skripte gibt, um die 6 Züge hervorzuholen und 6 Skripte um sie wieder abzustellen, hätte ich 6 fast identische Skripte für das Hervorholen gehabt und weitere 6 Skripte fürs abstellen, die sich nur wenig unterscheiden. Deshalb habe ich im Ordner "Planmuster" generische Skripte gebaut, die alles beinhalten was immer gleich ist. Die Skripte, die über die Aktionstabelle benannt sind, sehen, machen nichts anders als die Parameter für den jeweiligen generischen Skript zusammenzustellen (zu stellende Weichen mit Position, Signale, welcher Zug, etc.) und diesen dann aufzurufen. VG Christian
Goetz Geschrieben 28. April 2020 Geschrieben 28. April 2020 vor 1 Stunde schrieb Eisbär: Das ich ein Objekt wie einen booleschen Wert nutzen kann wusste ich zum Beispiel nicht. In diesem Punkt (und einigen anderen) ist Lua "frech". Und ich kann jeden Programmierer verstehen, dem es widerstrebt diese Frechheiten auszunutzen. vor 1 Stunde schrieb Eisbär: Das mit den 2 x 6 fast identischen Skripten hat aber seinen Grund. Eine Tabelle in den Variablen unter "Ereignisse/Skripte" nimmt alle verfügbaren Aktionen auf. Du könntest für die individuellen Unterschiede Datensätze (am besten in Tabellenform) bereithalten und an deine generische Funktion übergeben. Du kannst Tabellen anlegen, die wiederum Wertepaare enthalten. Zum Beispiel Weichen und ihre Stellungen. Und dann deine generische Routine so anlegen, dass sie die Tabelle abklappert und jeder darin enthaltenen Weiche ihre Stellung zuweist, um einen bestimmten Weg zu schalten. Wenn du diese Routine später erweitern möchtest, um beispielsweise Konflikte auszuschließen, dann hast du dafür eine zentrale Stelle ... (sorry, das weißt du als Profi besser als ich ) Lua unterscheidet nicht zwischen Arrays, Tables, Dictionaries, Lists etc. - das ist in dieser Sprache alles dasselbe und obendrein kann man alles in einer Tabelle vermischt anwenden und nach Belieben nesten. Das macht Tabellen in Lua zu einem sehr mächtigen Werkzeug. Geradezu ideal für die Verwaltung von Bahnverkehr etc. Leider bringe ich aktuell nicht die nötige Konzentration auf um dir das anhand eines praktischen Beispiels richtig zu demonstrieren. Randnotiz: Du musst dabei bitte beachten, dass die Tabellen und Listen in Objektvariablen Elemente des MBS sind und an dieser Stelle noch nichts mit Lua zu tun haben. Dort werden Listen und Tabellen unterschieden.
gmd Geschrieben 28. April 2020 Geschrieben 28. April 2020 8 minutes ago, Goetz said: Du könntest für die individuellen Unterschiede Datensätze (am besten in Tabellenform) bereithalten und an deine generische Funktion übergeben. 5CB72297-8285-461B-A14F-B30EA6C50C48 Goetz, Blockdemo4 zeigt genau was du gesagt hast. Das ist ja die Basis fuer meinen generator. gruss gmd
Goetz Geschrieben 28. April 2020 Geschrieben 28. April 2020 Vielen Dank, @gmd Hallo @Eisbär je mehr ich in deiner EV stöbere, desto bescheidener werde ich. Aber es reizt mich, ein paar Tricks beizusteuern, die dir gefallen könnten. Lua beherrscht beispielsweise folgenden Trick: Die Operatoren and und or liefern den ersten oder zweiten Ausdruck als Ergebnis. Das heißt: true or true -- ergibt true, weil der erste Wert true ist 1 or true -- ergibt 1, weil der erste Wert eine 1 ist, die als true gewertet wird true and 1 -- ergibt ebenfalls 1. Beim and wird der zweite Wert zurückgegeben, wenn der erste Wert true ist -- positiv oder negativ? Vorzeichen = x < 0 and -1 or 1 Wusstest du, dass du Objektlisten erstellen kannst, indem du die Objekte (mit Lasso oder Strg) auswählst, Strg+C für Copy drückst und dann die Liste in der EV mittels Paste einfügst? Wenn du deine Listen schon auf diesem Weg erstellt hattest - super! Wenn nicht, dann wirst du den Tipp sicher zu schätzen wissen Gruß Götz
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