Jump to content

Basisanlage mit Schattenbahnhof


Eisbär
 Share

Recommended Posts

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

Link to comment
Share on other sites

Hallo Eisbär ( Christian ) 

Screenshot_231.thumb.jpg.d54fc972fd3ea6110224f51ee0095884.jpg

Die BR 24 bleibt irgendwie falsch stehen .

Screenshot_232.thumb.jpg.74000f1f4ddf3d553c80546544ec84b7.jpg

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

H:xnS

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

temp.JPG

Edited by RoniHB
Rechtschreibung
Link to comment
Share on other sites

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.

1641956703_2020-04-2517_55_27-3D-ModellbahnStudioV5.thumb.jpg.0485b2b78f830d83be1517869d20ed43.jpg

 

VG
Christian

Link to comment
Share on other sites

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.

 

Edited by Goetz
Nachtrag
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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. 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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?

Objektlisten.thumb.jpg.4e807f78c7511f0ab44f1103e6031af4.jpg

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

 

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