Jump to content

Ausfahrt aus Bahnhof von einem zufälligem Gleis bzw. Einfahrt in Bahnhof auf ein zufälliges freies Gleis


Empfohlene Beiträge

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!

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 Monate später...
  • 2 Wochen später...

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

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Magnetilo,
wenn ich darf, dann habe ich zu deinem:

vor 2 Stunden schrieb Magnetilo:
if (#layout:getVehiclesOn(f.tracks[#f.tracks]) == 0) and not(f.active) then

 einen Alternativvorschlag:

if f:canActivate() then

Diese Bedingung ist erst später hinzugekommen und dir eventuell nicht bekannt?
Du findest sie auch in der grafischen EV:

28539301_FSkannaktiviertwerden.jpg.8394b1435433b8691f45d24e7beea09e.jpg

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

vor 3 Stunden schrieb Magnetilo:

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?

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Magnetilo:

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

Stimmt. Denn das Schlagwort ist der Name einer Variablen vom Typ Schlagwort.
Das Schlagwort ändern hieße also den Variablennamen ändern.

Aber du kannst diese Variable löschen, Und eine neue mit anderem Namen anlegen.

Klüger ist es so, wie du es vorhast. Eine Variable (boolean), die den Status (geht / geht nicht) enthält.

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...
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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...