Jump to content

Listen automatisch füllen, Anzahl Einträge ermitteln


Empfohlene Beiträge

Hallo zusammen,

Es geht mal wieder um Einfahrten in einen BHF bzw irgendwas mit mehreren Gleisen.

Ich möchte eine zufällige Einfahrt auf freie Gleise in Abhängigkeit von Zugtypen ermöglichen.

 

Mein Ansatz dazu…….

Nehmen wir einen BHF mit 12 Gleisen

-          Nahverkehr – Gleise/FS  1, 2, 8 , 9, 11, 12

-          Fernverkehr – Gleise/FS  3, 4 , 6 ,7

-          Güter Durchfahrt – Gleise/FS  5, 10

 

Mein Ansatz;

11      Fahrstraßen vom Einfahrsignal zu den jeweiligen Haltesignalen am Gleisende.

22      Jeder Zug hat ein Schlagwort (Fernzug, Nahzug, Güterzug)

33      Drei Listen „FS Nah“, „FS Fern“ und „FS Güter“, in denen jeweils alle zugeordneten FS enthalten sind.

44     Bei Betreten des Einfahrsignals wir in Abhängigkeit zum Schlagwort eine der drei Listen genommen und geschaut, welche FS inaktiv (frei) sind, diese werden in eine weitere temporäre Liste eingetragen. Darauf folgt die Aktion „Fahrstraße aktivieren“, hier wird die temporäre Liste herangezogen und eine freie FS  per Index Zufall (1 – „Anz FS“ (Anzahl der Einträge)) ausgewählt / freigegeben.

 

Soweit die Theorie, also die Drei Listen habe ich, das zufällige auswählen einer FS aus einer Liste ist auch kein Problem. Aber ….. wie kann ich in der EV eine temporäre Liste mit den leeren Gleisen bzw Fahrstraßen füllen ?

 

Schätze mit einer Wiederholung alle FS aus der ersten Liste durchgehen und wenn inaktive gefunden, dann als jeweils neuen Eintrag in die temp Liste schreiben und die Anzahl in eine temp Variable „Anz FS“ (Zahl) schreiben.
Das bekomme ich jedoch nicht hin … kann mir da jemand helfen ?

Gruß Ralf

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Ralf,

mal zunächst in der grafischen EV erstellt:

TemporreListe.jpg.0116f3220a4dddfa6bc364e1e5cec522.jpg

Beim Überarbeiten in Lua habe ich gesehen, dass es besser ist, den Zufallswert in der letzten Aktion vor Aktivierung der Fahrstraße zu ermitteln, da er sonst für autoAcitvate und activ3 unterschiedlich sein kann.


if vehicle.variables["Nahzug"] ~= nil then
  contact.variables["aktuell"] = contact.variables["FS Nah"]
else
  if vehicle.variables["Fernzug"] ~= nil then
    contact.variables["aktuell"] = contact.variables["FS Fern"]
  else
    contact.variables["aktuell"] = contact.variables["FS Güter"]
  end
end

contact.variables["freie Strassen"] = {}
contact.variables["zaehler"] = 0

local t = contact.variables["aktuell"]
for i, Wdh in ipairs(t) do
  if Wdh:canActivate() then
    contact.variables["zaehler"] = contact.variables["zaehler"] + 1
    contact.variables["freie Strassen"][contact.variables["zaehler"]] = Wdh
  end
end


if contact.variables["zaehler"] > 0 then
  local randomwert = math.random(1, contact.variables["zaehler"])
  contact.variables["aktuell"][randomwert].autoActivate = true
  contact.variables["aktuell"][ramdomwert].active = true
end                                                                                 

Viele Grüße,
    Wolfgang

P.S. nicht getestet, müsste aber so funktionieren.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Prinz,

ich probiere es gleich mal aus. Bin sehr gespannt.

Die Listen FS Nah, FS Fern und FS Güter hast Du im Einfahrsignal abgelegt, wenn ich das richtig sehe.
Ich habe sie als Modulvariable abgelegt, da ich sie auch von anderen Einfahrsignalen aus nutzen kann.
Habe die EV mal entsprechend geändert und ....... super es funktioniert toll

Ich glaube das Prinzip zum Füllen und auslesen der temporären List auch soweit verstanden zu haben.
 

Jetzt ist es eine Standartmöglichkeit die Einfahrten durch einfache, minimale Anpassung der drei Modul-FS Listen allgemeingültig einzusetzen.
Im Einfahrsignal drei Elemente (Zahlvariable FS ZÄHLER, Liste AKTUELL und Tabelle FREIE FS anlegen und ..... genießen.

Toll
Vielen Dank für Deine Mühen

Gruß Ralf


Ich mache mal einen Demo BHF und stelle das dann mal als DEMO-Modul in den Katalog.
Wenn es Dir recht ist.

Screenshot 2024-02-29 181618.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Ralf,

kannst Du gerne so machen. Nur noch eine Empfehlung:

In der letzten Aktion (Fahrstraße aktivieren) wird aus der einen Zeile 2 Lua-Aktionen (kannst Du erkennen, wenn Du kurz mal auf Skript umschaltest).
In der ersten wird autoActivate durchgeführt und im zweiten dann das eigentliche active. Da bei beiden die Fahrstraße über eine Random-Funktion ausgeführt wird, könnten das durchaus unterschiedliche Fahrstraßen sein. Also: Am besten erst die zufällig ermittelte Fahrstraße in einer lokalen Variable (FS zu aktivieren) ablegen und dann erst diese aktivieren.

Viel Spaß weiterhin
    Wolfgang

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deinen Hinweis muss ich mir nochmal anschauen. ......

Noch eine Frage zu den Fahrstraßen .......
 

wir suchen ja freie Fahrstraßen um daraus die freie oder bei mehreren freien, eine zufällige zu aktivieren.
Wenn ich jetzt auf den Gleis vor dem Endsignal eine Lok stehen habe, ist die Fahrstrasse dann anwählbar ?
Aktiviert oder reserviert ist sie ja nicht .......

Oder wäre es besser über freie Gleise zu gehen ?
Ich hatte anfangs mal überlegt, ob ich in jedem Gleis zwei Fahrstraßen (FS West und FS Ost) speichere.
Bei gefundenem freien Gleis wird dann vom Einfahrsignal West die FS West und vom Einfahrsignal Ost die FS Ost aktiviert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Goetz,

Ist nicht aktivierbar, okay
Ich habe da einen Bahnhof aufgebaut und anfangs nur die Einfahrt Ost getestet. lief gut.
Jetzt habe ich die Gegenrichtung dazu gemacht und hier wird von der ankommenden Lok eine FS ausgewählt bei der jedoch in Gegenrichtung eine Lok steht.
Das heißt doch, dass freie FS nur in fahrtrichtung der "fragenden Lok" erkannt werden - oder ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Goetz war schneller zu deiner ersten Frage

Wenn eine Lok vor dem Endsignal steht, kann keine Fahrstraße dorthin aktiviert werden!

vor 4 Minuten schrieb bigrala:

Oder wäre es besser über freie Gleise zu gehen ?

Fahrstraßen bieten mehr Komfort. Bei der Gleis-Alternativ musst Du die ganze Frei/Reserviert/Belegt/Blockiert-Geschichte selbst bauen.

Wenn ein Gleis oder eine Gleisstrecke aus verschiedenen Richtungen befahren werden kann (Bahnhofsgleis von Ost oder West), so sind das auch zwei Fahrstraßen.

Beim Einfahrtsignal Ost sind dann die Strecken zu den West-Signalen und vom Einfahrtsignal West die Strecken zu den Ost-Signalen zu verwenden.

Warum Du die Fahrstraße im Gleis speichern willst, hat sich mir noch nicht erschlossen. Die Fahrstraße "kennt" doch ihre Gleise.

Viele Grüße,
    Wolfgang

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab natürlich verschiedene Listen für Einfahrt Ost und Einfahrt West - sowie für Nebenbahnen N1 und N2.
Auch habe ich die Ereignisse der entsprechenden Signale entsprechend geändert.

 

Das mit dem FS in den Gleisen speichern war nur für die Gleis-Alternative gedacht - nicht für die FS-Variante

Screenshot 2024-02-29 195354.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb bigrala:

es ist so, dass die FS nicht als belegt erkannt wird, wenn eine Lok in Gegenrichtung auf einem Gleis steht.

Dann steht diese Lok außerhalb des Bereichs, der von der Fahrstraße abgedeckt wird. Mit der Fahrtrichtung hat das nichts zu tun!
Fahrstraßen sollten immer bis zum nächsten Signal führen, auch wenn ein Zug schon früher (= Bahnsteigmitte) anhalten soll.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Goetz,

ich glaube wir reden aneinander vorbei.

Habe mal einen Screenshot gemacht und darauf die FS markiert.

Die grüne FS 05 kommt vom Einfahrsignal rechts (Ost) und geht bis zum Haltesignal GL05.
Dir rote FS 05 kommt vom Einfahrsignal links (West) und geht bis zum Haltesignal GL05.
Obwohl die Lock von der grünen FS bereits am Haltesignal steht, bekommt die einfahrende von West Ihre FS 05 reserviert und keine der anderen freien.
(zugleich steht am Einfahrsignal Ost eine weitere Lok, die ebenfalls auf GL05 will - die hätte eigentlich auch eine andere freie wählen müssen.)

 

Screenshot 2024-03-01 194217.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)
Am 29.2.2024 um 19:48 schrieb prinz:

Wenn eine Lok vor dem Endsignal steht, kann keine Fahrstraße dorthin aktiviert werden!

Hallo Prinz,

In Deiner EV ist ein Fehler, daher das Problem, dass auch besetzte FS ausgewählt werden.
--> in der letzten Anweisung "Fahrstraße aktivieren" nimmst Du Bezug auf die Liste "aktuell" - richtig wäre die Liste "freie FS"

Habe es geändert und nun läuft es.
Danke Dir

Gruß Ralf

Bearbeitet von bigrala
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Prinz,
ich hab da nochmal eine Frage zu einer Erweiterung......

Es kommt ja ab und zu vor, dass alle Gleise belegt sind und am Einfahrsignal dann ein Zug hält.

Eine FS reservieren/vormerken kann er nicht, weil ja keine freie FS gefunden wird.
Ich wollte jetzt beim verlassen eines Ausfahrsignals die Gleisermittlung in einem Signal erneut abfragen, wenn an dem Signal ein Zug steht.
In dem Zusammenhang wollte jetzt die gesamte Gleisermittlung (Aktionen etc) aus dem Signal in ein Benutzerdefiniertes Ereignis auslagern.
Hintergrund ist, dass diese Gleisermittlung drei Mal je Einfahrseite aufgerufen wird (Vorsignal, Einfahrsignal und Ausfahrsignal).
Dazu müsste ich jedoch einge Parameter an das Benutzerdefinierte Ereignis übergeben - oder kann/sollte man das anders lösen ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das finde ich eine sehr gute Idee!

Ich würde so vorgehen:

Das Ereignis "Gleiskontakt BHF Sig Einfahrt Ost" kopieren und in z.B. "Gleisermittlung" umbenennen.
Das neue Ereignis vom Typ in "Benutzerdefiniert" ändern (Zahnrad)
Da dadurch die Referenzobjekte Fahrzeug und Gleiskontakt fehlen, müssen diese als Parameter ergänzt werden ("ohne Parameter" ändern in Objekt "Fahrzeug" und Objekt "Gleiskontakt".
Obwohl die Parameter (entsprechen den möglichen Auslösern) wieder gleich lauten, musst Du diese trotzdem bei allen Aktionen und Bedingungen nochmal neu auswählen.

Wenn du dann bei den entsprechenden Gleiskontakt-Ereignissen die alten Aktionen löscht und statt dessen das neue benutzerdefinierte Ereignis einbaust, erscheinen als notwendigen Parameter Gleiskontakt und Fahrzeug. Hier werden dann die "lokalen" Objekte eingetragen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @bigrala,

kennst Du die Anlage "Bahnhofsmodul-Anlage 20211026" (Content-ID 8DE83A85-E844-482C-AD3C-E2C18633EFCA)?

Auch dort wird zuerst geprüft, ob ein gewünschtes Zielgleis überhaupt frei ist, bevor die Fahrstaßen dorthin angefordert werden. Die Hauptfunktionalität wird hierbei ebenfalls über Benutzer-definierte Ereignisse bereitgestellt, denen beim Aufruf die jeweils benötigten Parameter mitgegeben werden. Die Beschreibung der einzelnen Funktionen ist in den Kommentarblöcken der Ereignisdefinitionen hinterlegt. Eine ausführliche Komplett-Beschreibung der Anlage ist hier abgelegt.

Alle Teilstrecken (sowohl innerhalb als auch außerhalb der Bahnhöfe) sind in beide Richtungen befahrbar. Deshalb gibt es hier auch jeweils für beide Richtungen separate Fahrstraßen-Definitionen.

In der Anlage ist der Vollautomatik-Modus voreingestellt. Zum Starten aller Züge muss in allen 3 Gleisbildstellpulten links oben die Start/Stop-Taste aktiviert werden. Den Rest macht die Ereignissteuerung. Vielleicht kannst Du aus diesen Ereignisdefinitionen etwas gebrauchen (eine Reservierung einzelner Gleise für bestimmte Zugtypen ist allerdings nicht dabei).

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

@prinz 
Das hatte ich mir auch so vorgestellt, wollte nur mal Feedback wie Ihr Profis das macht, ob es evtl. noch andere, bessere Lösungen gibt, bevor ich alles umbaue/ändere.
Habe jetzt nach der Änderung zwei Benutzerereignisse .... einmal Einfahrt West und einmal Einfahrt Ost, da dies ja unterschiedliche FS sind.

@BahnLand
Nein die kenne ich (noch) nicht, schaue sie mir aber gerne mal an.


Mein Bestreben ist es eine Bahnhofssteuerung hinzukriegen, die ich mit möglichst wenig Änderungen an viele Bahnhofsgrößen einfach anpassen kann UND ich das auch noch verstehe und kapiere  :D

Bearbeitet von bigrala
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb bigrala:

Habe jetzt nach der Änderung zwei Benutzerereignisse

Das könntest Du weiter auf ein Ereignis reduzieren. Es werden ja zwei Parameter übergeben: Fahrzeug und Gleiskontakt. Der Gleiskontakt (Signal) dient lediglich dazu, die Fahrstraßen in Abhängigkeit des Fahrzeugtyps (Fern, Nah, Güter) zu ermitteln. Du könntest als bei der Einfahrt West das Objekt mit den Fahrstraßen West->Ost und bei der Einfahrt Ost das Objekt mit den Fahrstraßen Ost->West als Parameter übergeben.

Das Ereignis kannst Du dann auch nutzen, wenn z.B. aus Richtung West zwei Einfahrmöglichkeiten gegeben sind.

Viele Grüße,
    Wolfgang

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Versuche gerade das BN aufzurufen bei verlassen des Ausfahrsignals ..... gibt mir allerdings Fehler im Ereignisprotokoll

Habe den Einfahrsignalen und den Ausfahrsignalen jeweils ein Schlagwort gegeben und das jeweilige BN als Ereignis/Modul abgelegt.
Frage nun beim verlassen des Ausfahrsignals ab, ob an einem der Einfahrsignale ein Zug steht, wenn ja, dann soll das zugehörige BN aufgerufen werden.

Es will aber nicht so wie ich will - bekomme nur eine Fehlermeldung.
Ich hänge mal Shots an


 

Screenshot 2024-03-07 172947.jpg

Screenshot 2024-03-07 173003.jpg

 

Shit,

beim schreiben ist es mir gekommen :$  ...... ich rufe ja jetzt das BN vom Ausfahrsignal aus auf. Das BN braucht aber die Parameter vom Einfahrsignal (Fahrzeug/Gleiskontakt).
Natürlich kann ich die Parameter Gleiskontakt auch aus dem Ausfahrsignal holen, muss ja nur Zähler, Liste etc auch in dem Signal ablegen. Aber was mache ich mit dem Fahrzeug ? Das ausfahrende ist ja ein anderes als das einfahrende/wartende.

Als erstes würde mir der Gedanke kommen generell den Fahrzeugtyp beim betreten des Einfahrsignals in einer Modulvariablen abzulegen, aus der sich das BN bedient.
Dann würde der erste Block mit der Tpyenermittlung komplett wegfallen.

Was meinst Du dazu ?

Bearbeitet von bigrala
Link zu diesem Kommentar
Auf anderen Seiten teilen

Am einfachsten ist es, wenn beim Betreten des Gleiskontakts des Einfahrtsignals das Fahrzeug als Variable beim Signal eingetragen wird (z.B. als "Fahrzeug aktuell").

Dann brauchst du beim benutzerdefinierten Event nur noch das Signal übergeben. Das Fahrzeug ist dann über die Variable "Fahrzeug aktuell" verfügbar.
Wenn über diesen Event eine Fahrstraße aktiviert wird, wird die Variable "Fahrzeug aktuell" auf [leer] gesetzt. Dann kannst Du beim Ausfahrsignal verlassen fragen, ob die Variable "Fahrzeug aktuell" nicht ein leeres Objekt ist und dann den Benutzerevent aufrufen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb prinz:

Es werden ja zwei Parameter übergeben: Fahrzeug und Gleiskontakt.

Fahrzeug brauen wir nicht mehr übergeben, ist jetzt als Variable im Signal.

 

vor 2 Stunden schrieb prinz:

Du könntest als bei der Einfahrt West das Objekt mit den Fahrstraßen West->Ost und bei der Einfahrt Ost das Objekt mit den Fahrstraßen Ost->West als Parameter übergeben.

Meinst Du die mit "Objekt" die FS Listen an das Einfahrsignal übergeben ?
Aktuell wird beim Betreten des "VorSignal Einfahrt" der Zugtyp als Variable an das Signal übergeben. Dann eine BN "Zugtyp" mit Parameter "Gleiskontakt" aufgerufen, in der die  FS Liste "aktuell" im Signal gefüllt wird. Anschließend eine weitere BN "Einfahrt West" / "Einfahrt Ost" mit Parameter "Gleiskontakt" aufgerufen. Hier wird eine Leere FS ermittelt und aktiviert.

Wurde keine frei FS gefunden, fährt der Zug weiter bis zum Eiinfahrsignal, welches auf Halt steht. Hier wird wieder Zugtyp ermittelt und die FS Liste "aktuell" gefüllt. Dann wird nochmal probiert ob inzwischen iine FS frei geworden ist, was in der Regel nicht der Fall ist. Mehr passiert hier erstmal nicht.

 

vor 1 Stunde schrieb prinz:

Dann kannst Du beim Ausfahrsignal verlassen fragen, ob die Variable "Fahrzeug aktuell" nicht ein leeres Objekt ist und dann den Benutzerevent aufrufen.

Also als Zugtyp wird jetzt als Text Variable an das Signal übergeben und nach aktivieren einer gefundenen FS auch wieder gelöscht. Soweit so gut.

Muss ich die Ausfahrsignale einzeln ansprechen oder kann ich das auch irgendwie verallgemeinern ?
Den Einfahrsignalen habe ich ein Schlagwort verpasst, über welches ich sie gemeinsam ansprechen könnte.

Wenn Ausfahrsignal mit Schlagwort verlassen wird, dann eine Bedingung ob Variable "Fahrzeug aktuell" in einem Signal mit Schlagwort NICHT LEER ist.
Dann müsste ich noch das BN mit Parameter aus dem Einfahrsignal aufrufen.
Vom Kopf her ist es ja klar, aber beim Umsetzen in der EV fehlt immer irgendwas. Hab da einiges probiert , jedoch ohne Erfolg.

 


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sorry, ist ein bisschen spät geworden.

1. Du brauchst nur noch einen Parameter.

2. Mit Objekt meine ich das Element, das die Liste mit den Fahrstraßen und dem aktuellem Fahrzeug enthält.

3. Wenn ein Ausfahrsignal verlassen wird, fragst Du, ob beim Einfahrsignal (Variable des Ausfahrsignals) ein Fahrzeug wartet und rufst dann die BN mit dem Einfahrsignal als Parameter auf.

Gute Nacht,

Wolfgang

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