Magnetilo Geschrieben 12. Juli 2022 Geschrieben 12. Juli 2022 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!
Paul5102 Geschrieben 12. November 2022 Geschrieben 12. November 2022 @Magnetilo Servus, ich habe Dein script ausprobiert. Aber bereits mit der function einfahrt() habe ich Probleme. Ich habe bemerkt, dass die locale "routes" im code danach mit "route" angesprochen wird. Aber nach Änderung bekomme ich diese Meldung im Protokoll. Vielleicht findest Du Zeit Dir das anzuschauen. LG Paul
Magnetilo Geschrieben 22. November 2022 Autor Geschrieben 22. November 2022 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
Paul5102 Geschrieben 28. November 2022 Geschrieben 28. November 2022 Halle @Magnetilo, hab erst jetzt die Korrektur bemerkt. Danke Dir!
Magnetilo Geschrieben 11. Dezember 2022 Autor Geschrieben 11. Dezember 2022 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
burkhard Geschrieben 11. Dezember 2022 Geschrieben 11. Dezember 2022 Danke dafür, jetzt sehe ich durch
Goetz Geschrieben 11. Dezember 2022 Geschrieben 11. Dezember 2022 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: Viele Grüße Götz
Magnetilo Geschrieben 12. Dezember 2022 Autor Geschrieben 12. Dezember 2022 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
Goetz Geschrieben 12. Dezember 2022 Geschrieben 12. Dezember 2022 Hallo Magnetilo, vielen Dank für deine Erläuterung zum Skript. Viele Grüße Götz
Magnetilo Geschrieben 12. Dezember 2022 Autor Geschrieben 12. Dezember 2022 Das ganze ist schon recht tricky. Nicht umsonst muss ich immer mal nachbessern. 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?
Goetz Geschrieben 12. Dezember 2022 Geschrieben 12. Dezember 2022 vor 21 Minuten schrieb Magnetilo: Aber mit einer Variablen müsste es gehen, oder? Ja, ich denke das geht. So würde ich es auch versuchen.
EASY Geschrieben 12. Dezember 2022 Geschrieben 12. Dezember 2022 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
Paul5102 Geschrieben 12. Dezember 2022 Geschrieben 12. Dezember 2022 Hallo Magnetilo, Ich wollte Deine Beispielanlage ausprobieren, aber da tut sich garnix. Kommt kein Zug. Überseh ich was? Bei Druck auf blauen Knopf gibts das:
Eggu Geschrieben 12. Dezember 2022 Geschrieben 12. Dezember 2022 Zunächst mit grünem Knopf Züge aus Depot ausfahren lassen (aber nicht alle auf einmal)
Paul5102 Geschrieben 13. Dezember 2022 Geschrieben 13. Dezember 2022 Ups, Danke Eggu! Den Grünen habe ich nicht entdeckt. Beim Laden der Anlage bei mir nicht zu sehen. Auch den blauen Knopf sehe ich erst wenn ich etwas heranzoome.
Magnetilo Geschrieben 13. Dezember 2022 Autor Geschrieben 13. Dezember 2022 Jaja, ich weiss. Alles noch verbesserungsfähig.
Magnetilo Geschrieben 13. Dezember 2022 Autor Geschrieben 13. Dezember 2022 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
Goetz Geschrieben 13. Dezember 2022 Geschrieben 13. Dezember 2022 (bearbeitet) 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 13. Dezember 2022 von Goetz
Magnetilo Geschrieben 14. Dezember 2022 Autor Geschrieben 14. Dezember 2022 Beispielanlage erweitert um ein vernünftiges Schaltpult und einer Möglichkeit, Fahrstraßen zu sperren. Bahnhof mit zufälliger Ein- und Ausfahrt_V1.1.mbp
Paul5102 Geschrieben 15. Dezember 2022 Geschrieben 15. Dezember 2022 @MagnetiloDas schau ich mir natürlich auch gerne an!
Magnetilo Geschrieben 29. Dezember 2022 Autor Geschrieben 29. Dezember 2022 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.
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