Jump to content

Magnetilo

Mitglieder
  • Gesamte Inhalte

    27
  • Benutzer seit

  • Letzter Besuch

Beiträge erstellt von Magnetilo

  1. Hallo zusammen,

    ich möchte Euch gerne mein neues Projekt im MBS V7 vorstellen: Anlage Wunschhausen in der XL-Variante im Maßstab H0.

    Zunächst die Eckdaten:

    • Anlagenform: U-Form
    • Grundfläche: 8,71 m²
    • Gleislänge: 140,53 m
    • Ebenen: 4
    • Schattenbahnhof: 3 (inkl. 1x Nebenbahn)
    • Bahnsteiglänge: 194 cm
    • Längster Zug (SBF): 360 cm (Güterzug)
    • Anzahl Züge (max.): 30 inkl. Nebenbahn

    Die Idee für die Anlage stammt von Guido Meißner vom Meises Modellbahncenter.

    Zitat

     

    Wunschhausen, weil fast alle Standard-Modellbahnwünsche auf dieser kompakten U-Anlage umgesetzt werden konnten:

    2-gleisige Hauptbahn im Hundeknochen-Prinzip mit 2 Schattenbahnhöfen und schöner geschwungener Paradestrecke
    Bahnbetriebswerk mit [...] Drehscheibe
    1-gleisige Nebenbahn mit bis zu 3 Zügen befahrbar inkl. verstecktem unsichtbarem Abstellgleis für Pendelzug

     


    Eine detaillierte Vorstellung findet ihr hier: Vorstellung: Märklin C-Gleisplan Wunschhausen XL für 30 Züge

    Zum Abschluss noch ein paar Bilder aus dem Video:

    XL-linkerSchenkel.thumb.jpg.ab2c7d43ed2adbdc68247edf4de2594d.jpg

    XL-Mitte.thumb.jpg.841e151faf3f8c856c248011655ce3db.jpg

    XL-rechts.thumb.jpg.4c2bdb593b6ff698c2a43bfc20289d9b.jpg

    XL-Seitenansicht.thumb.jpg.4a51a5950c01e735bdcaca1af0112bab.jpg

    Viele Grüße
    Magnetilo

  2. Am 12.12.2022 um 19:38 schrieb EASY:

    Hallo,

    ... ich weiß ja nicht genau was Du damit vor hast... mein erster Gedanke hierzu war den Fahrstraßen die nicht ausgeschlossen werden sollen ein zweites Schlagwort zu verpassen. Dann kannst Du mit layout:getRoutesByKeyword() mit dem ersten Schlagwort alle Fahrstraßen und mit dem zweiten Schlagwort die nicht ausgeschlossenen auswählen...

    Gruß
    EASY

    Mir ist noch was eingefallen:

    Die Funktion einfahrt kann ich ja bei jeder Abzweigung auf meiner Anlage einsetzen. Folglich kann ich auch soetwas schreiben:

    $("seltenBefahreneFahrstrasse").variables["gesperrt"] = (math.random(10) < 7)
    einfahrt("1_einf_lks")
    $("seltenBefahreneFahrstrasse").variables["gesperrt"] = false

    und damit eine Art Lastverteilung erzeugen.

  3. vor 14 Stunden schrieb EASY:

    Hallo,

    ... ich weiß ja nicht genau was Du damit vor hast... mein erster Gedanke hierzu war den Fahrstraßen die nicht ausgeschlossen werden sollen ein zweites Schlagwort zu verpassen. Dann kannst Du mit layout:getRoutesByKeyword() mit dem ersten Schlagwort alle Fahrstraßen und mit dem zweiten Schlagwort die nicht ausgeschlossenen auswählen...

    Gruß
    EASY

    Hallo @EASY,

    Schlagwörter kann ich meines Wissens nach programmtechnisch nicht ändern.

    Eine Anwendung wäre beispielsweise die Abriegelung eines Bereiches in dem ich dann manuell rangieren kann.

    Generell möchte ich eine Art Halbautomatikbetrieb erreichen. Gewisse Entscheidungen trifft der Computer, andere ich mit Schaltern.
    Das geht dann schon in Richtung Stellwerkssimulation.

    Keine Ahnung, ob mir das Spaß macht, aber alles selber steuern ist mir zu mühsam und nur zuschauen wie alles autromatisch läuft zu langweilig.

    Viele Grüße
    Magnetilo

  4. Das ganze ist schon recht tricky. Nicht umsonst muss ich immer mal nachbessern. :D

    Momentan überlege ich mir, ob es eine Möglichkeit gibt, Fahrstraßen auf Knopfdruck nicht verfügbar zu machen.
    So könnte man ganze Bereiche der Anlage vom Fahrverkehr ausschließen.

    Das Schlagwort der Fahrstraße lässt sich wohl nicht ändern. Aber mit einer Variablen müsste es gehen, oder?

  5. Hallo Götz,

    vielen Dank für den Hinweis.

    Meine Tests haben ergeben, dass bei der Funtion canActivate() die gesamte Fahrstraße frei sein muss.
    Es kann aber sein, dass die Fahrstraßen nach dem Einfahrtsignal ein Stück lang zusammen verlaufen bevor sie sich auffächern.
    Fährt dort noch ein Zug während ein neuer ans Signal kommt, werden dann alle Fahrstraßen als belegt gekennzeichnet.

    Mein Code erlaubt dies jedoch (Neue Fahrstraße wird vorgemerkt).
    not(f.active) verhindert lediglich, dass der wartende Zug auf das gleiche Gleis wie der vorangehende Zug einfährt.

    Freundliche Grüße
    Magnetilo

  6. Verbesserte Version der beiden Routinen und Beispielanlage

    Ich habe nochmals die beiden Routinen leicht verbessert und zur Demonstration eine Beispielanlage mit einer kleinen Erweiterung beigefügt:

    Beim Einfahrtsignal fahren Personenzüge auf ein zufällig ausgewähltes Gleis im Bahnhof, Güterzüge (Zugtyp="Cargo") fahren direkt am Bahnhof vorbei.

    function einfahrt(fskeyword)
      local routes = { }
      local fs=layout:getRoutesByKeyword(fskeyword) -- alle passenden Fahrstraßen zusammentragen
    
      for k,f in ipairs(fs) do
        -- print("Fahrstraße "..f.name.." gefunden!")
        -- print("Letztes Gleis: "..f.tracks[#route.tracks].name)
        -- freies Gleis?
        if (#layout:getVehiclesOn(f.tracks[#f.tracks]) == 0) and not(f.active) then
          table.insert(routes, f)
        end
      end
      print(#routes.." freie Fahrstraßen gefunden!")
    
      local random_number = 0
      local random_route = Nil
    
      if #routes == 0 then
        random_number = math.random(#fs) -- zufällige Fahrstraße auswählen, selbst wenn belegt
        random_route = fs[random_number]
      else
        random_number = math.random(#routes) -- zufällige freie Fahrstraße auswählen
        random_route = routes[random_number]
      end
    
      --random_route.autoActivate = true -- bestehende Aktivierung aufrecht erhalten
      random_route.active = true
    
      print("Funktion Einfahrt hat Fahrstraße "..random_route.name.." aktiviert")
    end
    
    function ausfahrt(fskeyword)
      local routes = { }
      -- alle passenden Fahrstraßen zusammentragen
      local fs=layout:getRoutesByKeyword(fskeyword)
      for k,f in ipairs(fs) do
        -- print("Fahrstraße "..f.name.." gefunden!")
        -- print("Erstes Gleis: "..f.tracks[1].name)
        -- steht ein Zug bereit?
        if #layout:getVehiclesOn(f.tracks[1]) > 0 then table.insert(routes, f) end
      end
      print(#routes.." freie Fahrstraßen gefunden!")
    
      if #routes == 0 then
        print("Keine wartenden Züge gefunden!")
      else
        -- zufällige Fahrstraße auswählen
        local random_number = math.random(#routes)
        local random_route = routes[random_number]
    
        random_route.autoActivate = true -- bestehende Aktivierung aufrecht erhalten
        random_route.active = true
    
        print("Funktion Ausfahrt hat Fahrstraße "..random_route.name.." aktiviert")
      end
    end

     

    Bahnhof mit zufälliger Ein- und Ausfahrt.mbp

  7. Vielen Dank @paul5102 für den Hinweis.

    Ich habe das korrigiert und noch ein paar Verbesserungen eingefügt:

    • Wenn alles belegt, dann trotzdem eine Fahrstraße auswählen, da der Zug sonst ewig wartet
    • Erst autoactivate und dann active aufrufen, sonst kommt es zu Problemen
    function einfahrt(fskeyword)
      local routes = { }
      local fs=layout:getRoutesByKeyword(fskeyword) -- alle passenden Fahrstraßen zusammentragen
    
      for k,f in ipairs(fs) do
        -- print("Fahrstraße "..f.name.." gefunden!")
        -- print("Letztes Gleis: "..f.tracks[#route.tracks].name)
        -- freies Gleis?
        if #layout:getVehiclesOn(f.tracks[#f.tracks]) == 0 then table.insert(routes, f) end
      end
      print(#routes.." freie Fahrstraßen gefunden!")
    
      local random_number = 0
      local random_route = Nil
    
      if #routes == 0 then
        random_number = math.random(#fs) -- zufällige Fahrstraße auswählen, selbst wenn belegt
        random_route = fs[random_number]
      else
        random_number = math.random(#routes) -- zufällige freie Fahrstraße auswählen
        random_route = routes[random_number]
      end
    
      random_route.autoActivate = true -- bestehende Aktivierung aufrecht erhalten
      random_route.active = true
    
      print("Funktion Einfahrt hat Fahrstraße "..random_route.name.." aktiviert")
    end

     

     

  8. vor 8 Stunden schrieb streit_ross:

    Gestatten Sie eine kleine Zwischenfrage, Herr Kollege ?:D

    Das MBS in Version 7 ist nun bald wieder Geschichte. Aber es scheint so, das bis zu deren Ablösung hin die Fahrstraßenlogik hin ein Brocken bleibt, den immer noch nicht jeder schlucken kann. Ich schließe daraus alleine gestützt auf die Menge der Anfragen zu nach wie vor bestehenden Anfragen in Bezug auf Fehlerursachen bei der Erstellung von Fahrstraßen, das dieses mit V7 angebotene Werkzeug kein Erfolgsschlager für die Mehrzahl der Nutzer geworden ist. Mir erschließt sich bis heute nicht die Notwendigkeit der Einführung eines solchen Features. Das mag aber meinem konservativem und meinetwegen auch begrenztem Verstand geschuldet sein. Andererseits erscheint es mir daher um so erstaunenswerter, das es mir nach wie vor gelingt, dass auch ohne Fahrstraßenlogik auf meinen Anlagen Züge ihren Weg von A nach B über 7 und mehr Weichen finden und unterwegs nicht zusammenstoßen. Zugeben muss ich allerdings, dass ich bei meinen "Fahrstraßen" nicht immer die Eisenbahnverordnung der DB praxisgerecht umsetze. Dafür brauche ich mich ja wohl nicht entschuldigen und viel wichtiger noch aus meiner Sicht: Ich brauche viel seltener hier um Rat fragen.. Aber eines ist mir dann doch klar. Was die Konkurrenz schon früher angeboten hat, muss auch das MBS aus Wettbewerbsgründen auch haben - ob es der Nutzer haben will bzw. vermisst hat oder nicht.  Vor allem lässt sich damit eine ganze neue Version gut vermarkten. Solange mir der Herausgeber neben der Regierung nicht den Gashahn zudreht, bleibe ich glücklich mit meiner Version 5. Ach so, vielleicht noch zu einem möglichen Argument, dass ja niemand auf das Fahrstraßenfeature zwingend angewiesen ist. Dann hätte ich allerdings stattdessen andere aus meiner Sicht längst überfällige Verbesserungen anzuführen.

    Gruß

    streit_ross

     

     

     

     

    Dem möchte ich kurz widersprechen. Die Fahrstraßen sind ein absolut geniales Feature.

    Und der Grund, warum ich noch nicht voll den Durchblick habe, mag daran liegen, dass ich das Modellbahnstudio erst vor ein paar Wochen kennengelernt habe.

    Aber auf die Fahrstraßen würde ich nicht mehr vberzichten wollen. Absolut empfehlenswert.

  9. vor 6 Minuten schrieb Goetz:

    Das widerspricht der Fahrstraßenlogik. 
    Sinn der Fahrstraßen ist, dass Züge nur in Abschnitte eingelassen werden, die nicht blockiert sind.

     

    Er steckt darin, dass die ganze Mimik überhaupt nicht dafür gedacht ist, in Schleifen permanent aufgerufen zu werden.

    Reagiere doch einfach auf das Ereignis "FS wird aktiviert/deaktiviert".
    Prüfe, ob sie deaktiviert wurde und aktiviere sie in diesem Fall wieder.
    Ganz einfach.

    Hallo @Goetz,

    entschuldigung, da habe ich Müll geschrieben. Richtig muss es heißen:

    Ich möchte, dass auf einen Trigger hin, ein Zug ausfährt. Falls die Fahrstraße noch blockiert ist, dann soll der Zug ausfahren sobald sie frei ist.

    Also genau das, wofür es AutoActive gibt.

    Kann ich Dir meinen Kreis mal schicken?

  10. vor 55 Minuten schrieb Old Grey:

    Hallo Goetz,

    ich habe gerade versucht eine Selbstblockstrecke wie oben von Dir beschrieben zu erstellen. Ich habe dafür eine einfache Rundstrecke mit 6 Blöcken und zwei Triebwagen erstellt. Dazu einen Schalter, der die Blöcke aktiviert bzw. wieder deaktiviert.

    Ich hatte erwartet, daß die Fahrstraße immer aktiviert wird, wenn der wieder Block frei wird. Dummerweise funktioniert es nur in der ersten Runde. Danach sind alle Fahrstraßen wieder deaktiviert.

    
    if controller.state == 1 then
      local t = layout:getRoutesByKeyword("Block")
      for i, Wdh in ipairs(t) do
        Wdh.autoActivate = true
        Wdh.active = true
      end
    else
      local t = layout:getRoutesByKeyword("Block")
      for i, Wdh in ipairs(t) do
        Wdh.active = false
      end
    end

    Wo steckt mein Fehler?

    Gruß Old Grey

    Hallo @Old Grey,

    füge mal print-Anweisungen hinzu. Dann kannst Du sehen, wann was ausgeführt wird.

    Viele Grüße
    Magnetilo

  11. vor 7 Stunden schrieb Goetz:

    Logisch!

    fs.active = true setzt die Fahrstraße aktiv oder merkt die Aktivierung vor, falls die Fahrtstraße blockiert ist. 

    fs.autoActivate = true merkt eine erneute Aktivierung vor, falls dieselbe Fahrtstraße schon aktiv ist. Mit dieser Option erzwingt man, dass eine Fahrstraße nach Auflösung gleich wieder scharf geschaltet werden soll.

    Das eignet sich (nur?) für Gleise im Schattenbahnhof und Selbstblock-Blockstrecken.
    Also für solche Abschnitte, die permanent auf Grün stehen sollen, wenn sie nicht gerade besetzt sind. 
    Wenn du eine Fahrstraße anforderst, die akkut schon aktiv ist, dann wird deine Anforderung ohne diese Option als "erledigt" abgehakt. 

    Eine Fahrstraße muss mit dieser Option aktiviert werden, damit der Effekt greift.
    Deshalb ist die Befehlsreihenfolge, die man bei der Umwandlung dieses Befehls bekommt, zwingend und nicht beliebig.

    1134364142_fsautoActivate.thumb.jpg.44e14ac1554ba7e6cd04973d3b7c27b8.jpg

    Viele Grüße
    Götz

    Hallo @Goetz,

    ich möchte, dass auf einen Trigger hin, ein Zug ausfährt, auch wenn die Fahrstraße noch blockiert ist.
    Das gelingt mir nur, wenn autoActive zuerst kommt. Aus meiner Sicht ein Fehler.

    Ich kann das an einem einfachen Kreis, mit einer Lok, zwei Fahrstraßen und zwei Signalen, die jeweils den nächsten Halbkreis aktivieren nachvollziehen.

    Bei

    fs.active = true
    fs.autoActivate = true

    sind irgendwann beide Signale immer offen, weil komischerweise die letzte Fahrstraße vorzeitig aktiviert wird.

    Bei

    fs.autoActivate = true
    fs.active = true

    habe ich das erwartete Verhalten.

    Viele Grüße
    Magnetilo

  12. Folgendes Skriptmodul dient zur Steuerung einer Ausfahrt aus einem Bahnhof von einem zufälligem Gleis bzw. Einfahrt in Bahnhof auf ein zufälliges freies Gleis.

    1. Definiere Fahrstraßen mit Schlagwort "Ausf_lks" bzw. "Einf_lks" von jedem Gleis im Schattenbahnhof bis zum ersten Signal

    2. Aktionen im Trigger (beispielsweise Zug fährt ein, Taster oder Timer):

    ausfahrt("Ausf_lks")

    bzw.

    einfahrt("Einf_lks")

    3. Code im Modul

    function ausfahrt(fskeyword)
      local routes = { }
      -- alle passenden Fahrstraßen zusammentragen
      local fs=layout:getRoutesByKeyword(fskeyword)
      for k,f in ipairs(fs) do
        print("Fahrstraße "..f.name.." gefunden!")
        -- print("Erstes Gleis: "..f.tracks[1].name)
        -- steht ein Zug bereit?
        if #layout:getVehiclesOn(f.tracks[1]) > 0 then table.insert(routes, f) end
      end
      -- zufällige Fahrstraße auswählen
      local random_number = math.random(#routes)
      local random_route = routes[random_number]
      random_route.active = true
      -- bestehende Aktivierung aufrecht erhalten
      random_route.autoActivate = true
    
      print("Funktion Ausfahrt hat Fahrstraße "..random_route.name.." aktiviert")
    end
    
    function einfahrt(fskeyword)
      local routes = { }
      -- alle passenden Fahrstraßen zusammentragen
      local fs=layout:getRoutesByKeyword(fskeyword)
      for k,f in ipairs(fs) do
        print("Fahrstraße "..f.name.." gefunden!")
        -- print("Letztes Gleis: "..f.tracks[#route.tracks].name)
        -- freies Gleis?
        if #layout:getVehiclesOn(f.tracks[#route.tracks]) = 0 then table.insert(routes, f) end
      end
      -- zufällige Fahrstraße auswählen
      local random_number = math.random(#routes)
      local random_route = routes[random_number]
      random_route.active = true
      -- bestehende Aktivierung aufrecht erhalten
      random_route.autoActivate = true
    
      print("Funktion Einfahrt hat Fahrstraße "..random_route.name.." aktiviert")
    end

    Idee von Ruud Boer für EEP, Umsetzung für 3D-Modellbahnstudio ist von mir.

    Viel Spaß damit!

     

  13. Und noch eine zweite Lösung mit einem etwas anderem Ansatz:

    1. Definiere Fahrstraßen mit Schlagwort "2_Ausf_lks" von jedem Gleis im Schattenbahnhof bis zum ersten Signal

    2. Aktionen im Trigger (hier für 3 Gleise)

    ausfahrt("2_Ausf_lks")

    3. Code im Modul

    function ausfahrt(fskeyword)
      local routes = { }
    
      local fs=layout:getRoutesByKeyword(fskeyword)
      for k,f in ipairs(fs) do
        print("Fahrstraße "..f.name.." gefunden!")
        print("Erstes Gleis: "..f.tracks[1].name)
        if #layout:getVehiclesOn(f.tracks[1]) > 0 then table.insert(routes, f) end -- Gleis belegt?
      end
    
      local random_number = math.random(#routes)
      local random_route = routes[random_number]
      random_route.active = true
    
      print("Funktion Ausfahrt hat Fahrstraße "..random_route.name.." aktiviert")
    end

    Vielleicht sogar einfacher und eleganter?!

    Trotzdem komisch, dass man Fahrstraßen nicht mit dem Namen ansprechen kann.

    Und warum über Schlagwort und nicht über Kategorie?

  14. Hallo @Goetz,

    das Ansprechen der Fahrstraße mit ihrem Namen war für mich einfach der intuitive Ansatz.
    Genauso mache ich das ja auch mit Gleisen, Signalen, Gleiskontakten usw.

    Das konkrete Problem war:

    Ausfahrt von einem Schattenbahnhof von einem zufälligem Gleis

    1. Definiere Fahrstraßen mit Schlagwort "Route" von jedem Gleis im Schattenbahnhof bis zum ersten Signal

    2. Aktionen im Trigger (hier für 3 Gleise)

    local items = {
            {["gleis"]="2_Sgl_lks_1", ["route"]="N1-S1" },
            {["gleis"]="2_Sgl_lks_2", ["route"]="N2-S1" },
            {["gleis"]="2_Sgl_lks_3", ["route"]="N3-S1" },
    }
    
    ausfahrt(items)

    3. Code im Modul

    function ausfahrt(arr)
      local routes = { }
    
      for k,v in pairs(arr) do
        if #layout:getVehiclesOn(layout:getEntityByName(v.gleis)) > 0 then table.insert(routes, v.route) end -- Gleis belegt?
      end
    
      local random_number = math.random(#routes)
      local random_route = routes[random_number]
    
      setRouteActive(random_route)
      print("Funktion Ausfahrt hat Fahrstraße "..random_route.." aktiviert")
    end
    
    function setRouteActive(name)
      local fs=layout:getRoutesByKeyword("Route")-- Fahrstraßen mit Schlagwort "Route" einlesen
      for k,f in ipairs(fs) do -- Für alle Fahrstraßen...
        if f.name==name then
          f.active = true
        end
      end
    end

     

  15. Hallo @Goetz,

    vielen Dank für Deine Hilfe.

    Dein erstes Skript würde gut passen, erzeugt aber leider eine Fehlermeldung:

    unexpected symbol near "$"

    Soweit ich verstehe, funktioniert $ nicht mit Variablen.

    PS: Das Schlagwort benutze ich momentan nur, weil es anders nicht geht. Brauche ich aber eigentlich nicht.

  16. Hallo @Goetz,

    durch die Fahrstraßen vereinfacht sich mein Problem drastisch. Das Ganze lässt sich nun mit ein paar Zeilen Code realisieren.

    Unschlüssig bin ich noch beim Aktivieren von Fahrstraßen. Ist dies so guter Code?

    function setRouteActive(name)
      local fs=layout:getRoutesByKeyword("Route")-- Fahrstraßen mit Schlagwort "Route" einlesen
      for k,f in ipairs(fs) do -- Für alle Fahrstraßen...
        if f.name==name then
          f.active = true
        end
      end
    end

    Ich spreche die Fahrstraßen über den Namen an.

    Wann würde man ein Schlagwort und wann eine Kategorie setzen?

  17. Hallo @Goetz,

    vielen Dank für die Links.

    Ich brauche jetzt mal ein bisschen Pause nachdem ich ewig über einer Steuerung gesessen habe, die nicht funktioniert hat.

    Ursache war dann die fälschliche Benamung der Geraden, statt der Weiche daneben. 9_9

    Liebe Grüße
    Magnetilo

×
×
  • Neu erstellen...