Jump to content

Recommended Posts

Posted

Moin zusammen,

ich habe mal wieder ein Problem und komme trotz Forumsbeiträge nicht weiter. Bei der Fülle der Informationen habe ich eventuell den entsprechenden Tipp/Beitrag auch übersehen. 

Ich möchte bei meinen Bahnhöfen die Geschwindigkeit nach Verlassen des Bahnhofs schlagwortgesteuert einstellen. Die Geschwindigkeit der Ausfahrsignale sind alle wie folgt eingestellt: Hp0 = verzögern auf 0 km/h, Hp1 = beschleunigen auf 80 km/h, Hp2 = verzögern auf 40 km/h und beschleunigen auf 40 km/h. 

Jetzt zum Problem: Nach dem Verlassen des Bahnhofbereiches (bzw. eines Blocksignals auf der Strecke)  soll die durch die Signale vorgegebene Geschwindigkeit geändert werden. So lange der gesamte Zug das Signal nicht passiert hat ist diese Änderung nur teilweise möglich. Beispielsweise soll der vor dem Signal 2_1 stehende Zug nach Betätigung auf Hp1 zuerst auf 80 km/h beschleunigt werden und kurze Zeit später  auf 160 km/h beschleunigen (Schaltkontakt Signal 2_1).  Das funktioniert leider nicht und der Zug fährt konstant mit 80 km/h weiter. Ähnlich verhält es sich auch bei Hp2 mit 40 km/h. 

Bei einer anderen Situation gibt es unterschiedliches Verhalten. Kommt ein Zug mit 160 km/h zum auf Hp1 stehenden Signal, so wird er korrekt ungebremst am Signal vorbeifahren. Steht das Signal auf Hp2, so wird der Zug korrekt auf 40 km/h abgebremst und nach dem Passieren des Signals korrekt auf 160 km/h beschleunigt. 

Ich verstehe nicht, warum bei einem zuvor stehenden Zug die Endgeschwindigkeit nicht erreicht wird. Der Schaltkontakt hat scheinbar keinen Einfluss. 

Es macht auch keinen Unterschied, ob ich mit einem Gleiskontakt oder mit einem Schaltkontakt die Endgeschwindigkeit (v_max) einstelle (siehe Kontakte Signal 1_x). 

Nachdem ich jetzt mehrere Tage keine Lösung gefunden habe, wende ich mich jetzt an die Spezialisten hier im Forum. 

Ach ja, der Aufwand in der EV soll klein wie möglich sein, da es bei meiner großen Anlage über 100 Signale betrifft.  Mit LUA kenne ich mich leider noch nicht aus. 

Liebe Grüße 

Spurwechsel

 

Signaltestanlage_5-Signal2_1.thumb.jpg.69b5a5a3704b2a2e660cad48d16eb12b.jpg

Signaltestanlage_5.mbp

Posted

Eine erste kurze Analyse:
Zug wartet bei Hp0/Signal 2_1, schalten auf HP1: beschleunigen auf 80 (gem. Signal-Wert), Zug erreicht Schalkontakt (die 80 ist noch nicht erreicht!),

Geschwindigkeit zuckt kurz auf 160, da er aber auch noch auf dem Signal-Kontakt steht, und er die 80 noch NICHT erreicht hat, bekommt das nun wieder Prio und er beschleunigt weiter bis auf 80.  Stelle ich zB beim Signal 20 statt 80 ein, so hat der Zug beim Erreichen des Schaltkontakts die 20 schon erreicht, und die 160 wird voll wirksam.

Gruß Eggu

Posted

Moin @Eggu,

vielen Dank für den Tipp. Problem gelöst. Ich hatte gehofft, dass die neue Geschwindigkeit (160) einfach den alten Wert (80) überschreibt.

Da bei mir alle Bahnantriebe den gleichen Beschleunigungswert  haben, muss ich die unterschiedlichen Beschleunigungsstrecken glücklicherweise nicht berücksichtigen. 

Lieben Gruß 

Spurwechsel

Posted
vor 11 Stunden schrieb Spurwechsel:

Ach ja, der Aufwand in der EV soll klein wie möglich sein, da es bei meiner großen Anlage über 100 Signale betrifft

Noch ein Tipp zum Aufwand:
Ich versuche inzwischen zu vermeiden, für jeden Kontakt und/oder jedes Signal einen eignen Eintrag in der EV zu erzeugen, da ja meistens "ähnliche" Aktionen durchgeführt werden sollen. Meistens gelingt es, mit einigen Schlagworten Gruppen von Signalen/Kontakten zu unterscheiden, und dann nur pro Schlagwort ein Event zu formulieren. Spezifische Unterschiede kann man auch weiterhin berücksichtigen, indem man in dem Signal/Kontakt Objekt-Variablen (so genannte Parameter) anlegt, und diese dann im Event verwendet (gemäß dem Schema Auslöser.Parameter). 

Deine v_max Variable ist ja zB solch ein Parameter, diesen fragst du in einer Bedingungskette ab, und setzt dann entsprechend die Lok-Geschwindigkeit.
Ich würde es vorziehen, einfach nur die Existenz dieser Variablen abzufragen, und wenn vorhanden, die Lokgeschwindigkeit direkt auf diesen Variablenwert zu setzten.
Dann müsstest du im Event auch nichts ändern, falls 'mal  weitere v_max-Werte hinzu kommen.

Aber das ist letztendlich eine Frage des persönlichen Stils und Geschmack.

Gruß Eggu

Posted (edited)
vor 13 Minuten schrieb Eggu:

Ich würde es vorziehen, einfach nur die Existenz dieser Variablen abzufragen, und wenn vorhanden, die Lokgeschwindigkeit direkt auf diesen Variablenwert zu setzten.
Dann müsstest du im Event auch nichts ändern, falls 'mal  weitere v_max-Werte hinzu kommen.

Moin Eggu,

würde ich gerne machen. Gewusst wie. Und da fehlt mir das Wissen. Wo kann ich das nachschlagen/-lesen? Das Forum ist groß. Gibt es Beispiele?

Lieben Gruß 

Spurwechsel

Edited by Spurwechsel
Frage nach Beispielen eingefügt
Posted

Hallo @Spurwechsel,

du müsstest einfach allen betroffenen Signalen ein gemeinsames Schlagwort verpassen. Wie dieses Schlagwort heißt, spielt keine Rolle.

Dann legst du ein Ereignis beim Verlassen eines Gleiskontakts mit diesem Schlagwort an. Dort kannst du dem auslösenden Fahrzeug entweder eine fest definierte Geschwindigkeit zuweisen oder die Geschwindigkeit aus einer Variablen innerhalb des auslösenden Fahrzeugs. Es sind dann keine zusätzlichen Gleiskontakte nötig.

HG
Brummi

Posted
vor 37 Minuten schrieb Phrontistes:

nur weil es mir auffiel - das geht auch einfacher:

... das hatte ich in meinem "Tipp" gemeint und beschrieben, aber danke für die direkte Veranschaulichung mit Lösung.

Aber ich würde zumindest die Existenz dieser Objekt-Variablen (v_max) abfragen und einen Default-Zweig einführen (entweder dann gar nichts tun oder default-Geschwindigkeit setzen).

Gruß Eggu

Posted
vor einer Stunde schrieb Eggu:

Aber ich würde zumindenst die Existenz dieser Objekt-Variablen (v_max) abfragen

Logo, das mache ich in meinen EVen immer nachdem die Kastratensprache Lua es noch nicht einmal verlangt, dass man Variablen deklariert bevor man sie benutzt.

Aber hier wollte ich nur ergebnisgleich (aber kürzer) umformulieren, was ich vorgefunden habe, weil ich es nicht sehen konnte, wie sich @Spurwechsel mit 3 if-Bedingungen und sechs festen Werten einen abbricht, obwohl es mit einem Einzeiler (und ohne feste Werte) genauso geht. Und ganz nebenbei spreche ich das Fahrzeug und nicht den Gleiskontakt an, weil mir das intuitiver erscheint - auch wenn es eigentlich egal ist.

Beste Grüße

Phrontistes

Posted
vor 3 Stunden schrieb Eggu:

Aber ich würde zumindest die Existenz dieser Objekt-Variablen (v_max) abfragen und einen Default-Zweig einführen (entweder dann gar nichts tun oder default-Geschwindigkeit setzen).

vor 1 Stunde schrieb Phrontistes:

Logo, das mache ich in meinen EVen immer

Das ist meiner Meinung nach nicht nötig, denn wenn die Variable nicht existiert, wird das Ereignis auch nicht ausgelöst. In dem Fall ist die am Signal eingestellte Geschwindigkeit automatisch der Default-Wert, oder um es ohne denglisch zu sagen, der vor-eingestellte Wert. So soll es ja eigentlich auch sein.

HG
Brummi

Posted
vor 1 Minute schrieb Roter Brummer:

wenn die Variable nicht existiert, wird das Ereignis auch nicht ausgelöst

Sorry Brummi, aber da irrst du dich.

Du vertauscht da gedanklich das Schlagwort mit der Objektvariablen für die Maximalgeschwindigkeit.
Wenn letztere nicht existiert, bekommt das Fahrzeug die Geschwindigkeit 0 zugewiesen.

Viele Grüße
Götz

 

Posted
vor 2 Stunden schrieb Phrontistes:

auch wenn es eigentlich egal ist

Der interne Aufwand unterscheidet sich aber bei den beiden logisch gleichwertigen Varianten, also

Screenshot2024-05-22185227.jpg.eba24313914417e804423d20d96f6ffa.jpg

Den Unterschied sieht man in der Übersetzung.  Während das Fahrzeug (erste Variante) direkt zur Verfügung steht

local v = vehicle
if v:hasEngine() then
  v.engine.active = true
  v.targetSpeedAbs = vehicle.variables["v_max"]
end

muss es erst mal in einer Schleife ermittelt werden wenn man den Gleiskontakt (zweite Variante) nimmt:

local vehicles = layout:getVehiclesOn(contact)
for _, vehicle in pairs(vehicles) do
  if vehicle:hasEngine() then
    vehicle.engine.active = true
    vehicle.targetSpeedAbs = vehicle.variables["v_max"]
  end
end

Also besser auch aus diesem Grund das Fahrzeug ansprechen.

Posted

Moin zusammen und vielen Dank für die vielen Tipps. 

Das Programm nach dem ersten Tipp von Eggu funktionierte schon prächtig. 

Der zweite Tipp von Roter Brummer verringert die Anzahl der Einträge in der EV enorm. Außerdem beschleunigen die Züge unabhängig von der Länge erst sobald der Bahnhofsbereich verlassen wird (ist nicht ganz präzise, aber damit kann ich gut leben). 

Dank auch an Phrontistes und Götz für die zusätzliche Tipps. 

Das Problem, dass ein Fahrzeug anhält wenn es kein Schlagwort für die Geschwindigkeit hat konnte ich leider nicht lösen. Wenn die Lösung zu viele EV-Einträge oder LUA benötigt, werde ich alle Fahrzeuge mit einem entsprechenden Schlagwort versehen  (die meisten Fahrzeuge haben aber eh schon ein Geschwindigkeitsschlagwort).

Anbei meine Testanlage für ggf. weitere Kommentare und Tipps. 

Liebe Grüße 

Spurwechsel

 

Signaltestanlage nach Roter Brummer.mbp

Posted
vor 4 Stunden schrieb Eggu:

... das hatte ich in meinem "Tipp" gemeint und beschrieben, aber danke für die direkte Veranschaulichung mit Lösung.

Aber ich würde zumindest die Existenz dieser Objekt-Variablen (v_max) abfragen und einen Default-Zweig einführen (entweder dann gar nichts tun oder default-Geschwindigkeit setzen).

Gruß Eggu

Hallo zusammen und Gruß an@Eggu

sorry wenn ich mich da jetzt auch noch dazu melde aber das ist ein perfektes Beispiel für meinen Zugang zur Vermeidung von solchen Konflikten. Also ich nenne das für mich ab  jetzt "Dual-Security". Also eine Zwei Faktor Abfrage. Klingt am Anfang vielleicht etwas übertrieben, steigert aber das Benutzen von Variablen enorm finde ich.

Also z.B. beim Betreten eines Kontaktes frage ich ab, ob die Variable, die in der Lok hinterlegt ist, einen gewissen Wert besitzt. 

image.thumb.jpeg.6396d07c9722944de2573f69e1e8352a.jpeg

image.thumb.jpeg.cb8eb13b43cb6df4fcf9ebefd11eea4c.jpeg

Um aber möglichen Konflikten aus dem Weg zu gehen, gibt es immer noch eine zweite Abfrage über den Zustand einer anderen Variable. Also z.B. den Lade Status eines bestimmten Wagons, der im Zusammenhang mit dem jeweiligen Ereignis relevant ist. In diesem Fall "Empty"

image.thumb.jpeg.5969ba716b2193bcc0a37e61fb6b729d.jpeg

Und nur wenn diese beiden Faktoren zutreffen, wird das Ereignis ausgeführt. Da die möglichen Zustände der jeweiligen Variablen aber ein enormes Potential an Varianten haben können wie z. B. "Leer" "Benzin" "Holz" "Rangieren" "Lokfahrt" und viele mehr, dürfen sich die, pro Ereignis halt nur nicht "dual" überschneiden, dann ist alles gut.

Ich habe da im Laufe der Jahre und natürlich mit Hilfe des Forums so ziemlich alles mögliche ausprobiert aber das ist für mich am Einfachsten. Die enorme Anzahl an möglichen Bedingungen haben mich am Anfang sehr verwirrt. Aber bei der Einschränkung auf zwei Faktoren finde ich das voll simple. Ist gerade für den Rangierbereich oder einfach für Weichen oder Signale die vom selben Zug oder Lok mehrmals befahren werden ideal. Auch beim Auslösen unterschiedlicher Fahrstraßen, die aber im gleichen Signal hinterlegt sind usw. 

Das ist vielen von euch sicher schon seit Langem klar aber ich habe das erst so eben wirklich kapiert. Und vielleicht hilft es ja manchen, die erst neu bei uns sind. In diesem Sinne, weiterhin viel Spaß im MBS, I'm loving it...

LG  Atrus

Posted

Noch ein weiteres Beispiel dazu wäre, das mit "Dual-Faktor"ein und das selbe Signal sechs Mal betreten wird...

image.thumb.jpeg.35a285408b574b4b0e567c86f354f8cd.jpeg

Dieses Signal aber nur vier mögliche Fahrstraßen hinterlegt hat...

image.thumb.jpeg.8d3889be8cb4c0bf7c089d02e9fdde8f.jpeg

Es werden hier also die selben Fahrstraßen sogar mehrmals ausgelöst, die aber am Ende verschiedene Ziele erreichen. Nur mit jeweils unterschiedlichem "Dual-Faktor".

Ohne Konflikte. Ist wirklich nicht schwer. Nur so als Beispiel. Noch einmal

LG  Atrus

Posted (edited)
vor 1 Stunde schrieb Spurwechsel:

Das Problem, dass ein Fahrzeug anhält wenn es kein Schlagwort keine Variable für die Geschwindigkeit hat konnte ich leider nicht lösen.

Da kann ich dir helfen:

vmaxexistiert.jpg.e0136d052f666914cc7a7d665ac2704d.jpg

Viele Grüße
Götz

Edited by Goetz
Posted
vor 11 Minuten schrieb Spurwechsel:

was passiert wenn zwei Züge gleichzeitig einen Signalkontakt verlassen? 

.. dann wird für jeden Zug (bzw. für jeden ausgelösten Event) eine eigene Instanz dieses Events ausgeführt, das ist kein Problem.

Gruß Eggu

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
×
×
  • Create New...