Jump to content

Spezielle Lösungen in lua


Empfohlene Beiträge

Hallo,

ich mache hier mal ein neues Thema auf, das sich mit speziellen Lösungen in lua beschäftigt.
Damit möchte ich versuchen das Thema etwas zu bündeln, damit es nicht im ganzen Forun verstreut ist.

Für mein immer wieder verwendetes Testprojekt, habe ich mich damit beschäftigt, wie man in aneinander folgenden Fahrstraßen die nachfolgende Fahrstraße als Variable ablegen kann.

Die Ausgangssituation ist ein in sich geschlossenes Kreissystem (nicht erschrecken über die Portale, sie sind fest verbunden und vereinfachen nur den Aufbau)...
Bild001.thumb.jpg.d33716bd6505522c42f7b39dde94f08b.jpg

Bild002.thumb.jpg.4ff575ce6e0a6993838dbb53bad1a3d1.jpg

Bild003.thumb.jpg.aa557a10ae6185a8956cefdb65f3518e.jpg

Das lua Skript für Schalter wird betätigt sieht so aus...

-- Anschlußfahrstraßen finden
-- FS1key = Schlagwort FS1 (Ausgangs-FS in die die Liste eingetragen wird)
-- FS2key = Schlagwort FS2 (mögliche Anschluss-FS)
-- routelist = Name der Liste für Anschluss-FS
-- sort = Tabelle nach Namen sortieren (Namen müssen eindeutig [nicht doppelt] sein!)

local function FindNextRoute(FS1key,FS2key,routelist,sort)
  local fs1a=layout:getRoutesByKeyword(FS1key) -- FS1 einlesen
  local fs2a=layout:getRoutesByKeyword(FS2key) -- FS2 einlesen
  for _,fs1 in ipairs(fs1a) do -- Schleife FS1
    local Liste={} -- Ausgabeliste
    for _,fs2 in ipairs(fs2a) do -- Schleife FS2
      local wp1=fs1.waypoints -- Wegpunkte FS1
      local wp2=fs2.waypoints -- Wegpunkte FS2
      if wp1[#wp1]==wp2[1] then -- letzter Wegpunkt FS1 = erster Wegpunkt FS2?
        table.insert(Liste,fs2) -- wenn ja, FS2 in Liste eintragen
      end
    end
    if #Liste>0 then -- Einträge in Liste vorhanden?
      if sort and #Liste>1 then -- sortieren und Einträge in Liste mindestens 2
        local function sortfunction(a,b) return a.name < b.name end -- Sortierfunktion
        table.sort(Liste,sortfunction) -- Sortieren ausführen
      end
      fs1.variables[routelist]=Liste -- Liste als variable in FS1 schreiben
    end
  end
end
--==========================================
FindNextRoute("Ausfahrt HFS","Fahrstrecken","Strecken",false)
FindNextRoute("Fahrstrecken","Ausfahrt Strecken","Ausfahrten",false)
FindNextRoute("Ausfahrt Strecken","HFS","Einfahrten",true)
FindNextRoute("HFS","Ausfahrt HFS","Ausfahrten",false)

... die Auswertung in der Funktion "FindNextRoute" basiert darauf, daß der letzte Wegpunkt einer Fahrstraße der erste Wegpunkt einer direkt nachfolgenden Fahrstraße ist (Das Skript funktioniert nur unter dieser Voraussetzung!)

Das Ergebnis sieht dann (exemplarisch für jede Fahrstraßengruppe) so aus...
Bild004.thumb.jpg.85a8437881c053fed1f59541ff2a63a1.jpg

Bild005.thumb.jpg.041c2e706bc3afe5bc1a3241e0c3578e.jpg

...Anmerkung sort=false
Bild006.thumb.jpg.220d1c207f85e45e45f9e36fbdcaba24.jpg

... sort=true
Bild008.thumb.jpg.e7d8c0946e3a449bd484909428fc86b5.jpg

Bild007.thumb.jpg.49f0238d1f6e3d471c5d12014584ff32.jpg

_____________________________________________________________________________________________________________________________________

Prinzipiell kann man auch ein benutzerdefiniertes Ereignis daraus machen...

-- Anschlußfahrstraßen finden
-- P1_Schlagwort_FS1 = Schlagwort FS1 (Ausgangs-FS)
-- P2_Schlagwort_FS2 = Schlagwort FS2 (mögliche Anschluss-FS)
-- P3_Listenname = Name der Liste für Anschluss-FS
-- P4_sortiert = Tabelle nach Namen sortieren

local fs1a=layout:getRoutesByKeyword(P1_Schlagwort_FS1) -- FS1 einlesen
local fs2a=layout:getRoutesByKeyword(P2_Schlagwort_FS2) -- FS2 einlesen
for _,fs1 in ipairs(fs1a) do -- Schleife FS1
  local Liste={} -- Ausgabeliste
  for _,fs2 in ipairs(fs2a) do -- Schleife FS2
    local wp1=fs1.waypoints -- Wegpunkte FS1
    local wp2=fs2.waypoints -- Wegpunkte FS2
    if wp1[#wp1]==wp2[1] then -- letzter Wegpunkt FS1 = erster Wegpunkt FS2?
      table.insert(Liste,fs2) -- wenn ja, FS2 in Liste eintragen
    end
  end
  if #Liste>0 then -- Einträge in Liste vorhanden?
    if P4_sortiert and #Liste>1 then -- sortieren und Einträge in Liste mindestens 2
      local function sortfunction(a,b) return a.name < b.name end -- Sortierfunktion
      table.sort(Liste,sortfunction) -- Sortieren ausführen
    end
    fs1.variables[P3_Listenname]=Liste -- Liste als variable in FS1 schreiben
  end
end

mit diesen Parametern..
Bild009.thumb.jpg.06584fc3c71fd83363a367b060aba4eb.jpg

Anmerkung: den Prefix "Px" habe ich gesetzt damit die Variablen in dieser Reihenfolge aufgelistet werden (das MBS sortiert alphabetisch)

Damit können die Parameter auch in der grafischen EV eingetragen werden...
Bild010.thumb.jpg.b081ba0d4fdacebc1a5a806bf4e49661.jpg

Der Vollständigkeit halber noch das Projekt...
2025-01-23-Anschlußverbindungen suchen.mbp

... mit extra 2 Schaltern
Bild011.jpg.ae8156cbec77023692378b00da00663d.jpg

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Hallo,

aus einer PN-Unterhaltung ergab sich, daß es praktisch wäre die Spurlängen von Gleisen auszulesen.
(In diesem Fall Längensynchronisation mit TrainController)
So ist bei mir die Idee entstanden, wie man das (nach meiner Meinung) einfach gestalten könnte...

Meine Lösung ist mit einem Signal....
Bild001.jpg.8d46ed4f3624aaf50e2cf10a3f229372.jpg

... das Signal muß einen Gleiskontakt haben (was bei den meisten Signalen der Fall ist). Außerdem sollte es kein Signal (langer) Animation sein (z.B. die Formsignale), da das Ereignis "Signal schaltet" erst nach Ablauf der Animation im Ereignisprotokoll erscheint (quasi eine Zeitverzögerung). Gut geeignet sind Lichtsignale.

Beim Signal habe ich in den Einstellungen die Kontaktabstände so gewählt, daß das Signal und der Gleiskontakt übereinander liegen...
Bild002.jpg.bc1a537f46b9f2bbae4c53a86c91f296.jpg

... muß nicht sein, aber ich finde es praktischer um zu sehen, wo man sich gerade befindet.

Wenn das Signal an einem Gleis einrastet, wird automatisch eine Verknüpfung zu dem Gleis erstellt...
Bild000.thumb.jpg.cf658963e5ae978b330eff99f25b07b6.jpg

Wenn man nun diese Verknüpfung beim Signal abfragt, hat man das Gleis und kann dessen Paramater abfragen...

In der EV ist die Aktion "Signal schaltet" -> Skript ausführen...
Bild004.thumb.jpg.0cf7825619458bc7a1abc80627f63816.jpg

--[[
Spurlängen von Gleisen auslesen.
Das Meßsignal ist ein beliebiges Signal mit Gleiskontakt.
Wenn das Signal (Gleiskontakt) an einem Gleis einrastet
wird eine Verknüpfung zum Gleis erstellt.
--]]

local gleis=signal.link -- verknüpftes Gleis abfragen.
if gleis~=nil then -- Verknüpfung vorhanden?
  print(gleis.name.." Spurlängen")
  for i=0,gleis.routeCount-1 do -- Für alle Spuren (Zählung beginnt bei 0!)
    print("Spur "..i,gleis.routes[i].length)
  end
  print("==============================")
end

... und so sieht dann das Ergebnis aus, wenn man das Signal auf ein Gleis setzt und umschaltet (Doppelklick)...
Bild003.jpg.f2e2475d9b7d86e902b076a06e213660.jpg

Zum ausprobieren oder als Vorlage...
Spurlänge messen 01.mbp

Gruß
EASY

Bearbeitet von EASY
Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Hallo,

ich habe mich (als spontane Idee) noch etwas mit dem Thema Zuganzeiger und Kupplungen beschäftigt...
Bild001.thumb.jpg.4fc1612287e39fb07d49d50cbcbdadf2.jpg

... so sieht es aus wenn der Zug von links nach rechts eingefahren ist... (gelb=Fahrzeug mit Antrieb)
Bild002.thumb.jpg.ee31a6d2859f54f4d7faa330adcc4ee9.jpg

... und so von rechts nach links...
Bild003.thumb.jpg.0ff348cc5e9c4d63c65b6377c1af7916.jpg

... alle (jeweils hinteren) Kupplungen sind ein...
Bild004.thumb.jpg.93e09d3c53541541f76d5be408e14385.jpg

Kupplung über entsprechenden Anzeiger aus...
Bild005.jpg.57df641354d78ee333ad534eb1be8c76.jpg

Solange die Anzeigeleiste nicht überschrieben wird und der Zug existiert, kann über die Anzeigeleiste an jedem beliebigen Punkt auf der Strecke auf die Kupplungen zugegriffen werden...
Bild006.thumb.jpg.5aed35253a2408110288ab5598a717b8.jpg

... dies war der Grundgedanke des Projektes.

2025-01-26-Zuganzeiger + Kupplungsfunktion.mbp

Gruß
EASY

Bearbeitet von EASY
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

eine PN Anfrage war, ob sich auch die Länge einer Fahrstraße ermitteln läßt.

Als Aktion auf das Ereignis "Fahrstraße wird aktiviert/deaktiviert" -> Skript ausführen...

--[[
Länge einer Fahrstraße ermitteln.
Ausgewertet wird die Aktivierung der Fahrstraße,
da dann alle Weichen richtig gestellt sind.

Hinweis: Die Länge bezieht sich auf ganze Gleise!
        (es wird nicht berücksichtigt, wenn z.B. das Anfangssignal in der
         Mitte eines Gleises liegt und deshalb nur die halbe Länge gültig ist)

* Index Spur beginnt bei 0

** Kreuzungen oder Kreuzbögen können mehr als eine aktive Spur haben,
  (da sie nicht als Weichen definiert sind).
  Da in der Regel beide Spuren gleich lang sind, wird nur eine gewertet.

*** für realen Betrieb Zeile löschen!
--]]

if state then -- Fahrstraße wird aktiviert
  print("Fahrstraße: "..route.name) -- Fahrstraße ausgeben
    local l=0 -- Gleislänge
    local n=0 -- Anzahl der Gleise
    local Gleise=route.tracks -- alle zugehörigen Gleise auslesen
    for _,g in ipairs(Gleise) do
      for i=1,g.routeCount do -- alle Spuren
        if g.routes[i-1].active then -- aktive Spur (z.B. bei Weichen)*
          l=l+g.routes[i-1].length -- Länge der Spur addieren
          n=n+1
          break --**
        end
      end
    end
  print("Länge:        "..l)
  print("Gleise:        "..n)
  print("==============================")
  route.active=false -- Fahrstraße wieder deaktivieren. ***
end

ergibt folgendes Ergebnis im Ereignisprotokoll...
Bild020.jpg.7992c6e08d1988907b84a90b3ff505e6.jpg

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @EASY

nettes Skript. 

vor 12 Stunden schrieb EASY:
Hinweis: Die Länge bezieht sich auf ganze Gleise!
        (es wird nicht berücksichtigt, wenn z.B. das Anfangssignal in der
         Mitte eines Gleises liegt und deshalb nur die halbe Länge gültig ist)

Um das mal zu verdeutlichen. 

Ermittelt wird die Länge der markierten Gleise. 

Screenshot2024-01-29090157.thumb.jpg.c1d17ce559c68718807daf72e59b7219.jpg

Die Fahrstraße geht aber nur von Gleiskontakt zu Gleiskontakt der Signale. 

Screenshot2024-01-29090230.thumb.jpg.87c3df5daf522989b830ff03a26df393.jpg

Da ist dann doch eine erhebliche Abweichung von der rechnerischen Ermittlung der Länge einer Fahrstraße zum tatsächlichen Ist-Wert vorhanden. Es macht sich sicherlich keiner Gedanken darüber, an welcher Stelle auf einem Gleis der Gleiskontakt eines Signals steht.   

 Die Länge einer Fahrstraße, bzw. interessanter wäre der Fahrweg bei Straßen, existiert im Programm. Wir können nur nicht darauf zugreifen. 

 VG, 

Hawkeye 

Bearbeitet von Hawkeye
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Hawkeye

ich nehme das was (derzeit) geht...

vor 8 Stunden schrieb Hawkeye:

Ermittelt wird die Länge der markierten Gleise.

... träume von den was ideal wäre...

vor 8 Stunden schrieb Hawkeye:

 Die Länge einer Fahrstraße, bzw. interessanter wäre der Fahrweg bei Straßen...

... und hoffe auf Veränderung.

vor 8 Stunden schrieb Hawkeye:

... existiert im Programm. Wir können nur nicht darauf zugreifen.

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

aus Neugier habe ich mich mit der Ansteuerung der GBS0 Bausteine beschäftigt...
Bild000.thumb.jpg.1fb33e586ed776cf04943aad319d7a37.jpg

Bei der 3-Wegeweiche hatte ich mich schon gefreut, daß es einen direkten Zusammenhang zwischen Weichenstellung und Signalstellung GBS0 gibt...
Bild001.jpg.3ae105f8cf405dfe60212cbfa016aee1.jpg

... 2*WS+1 für reserviert und 2*WS+2 für belegt (WS=Weichenstellung)

... bei der 2-Wegeweiche funktionierte die Formel leider schon wieder nicht mehr...
Bild002.jpg.26b78d61a4d6051a00415842de58bbfa.jpg

Da ich die Formel beibehalten wollte, habe ich dem GBS0 Baustein eine Tabelle mit auf den Weg gegeben...
Bild003.jpg.d8914c8ab531209081049b7bf213d9de.jpg
... die das Ergebnis der Weichenstellung entsprechend anpasst...
Bild004.jpg.6a405635df8a8dd8d8ff41edcb65edc2.jpg

Damit es einen Zusammenhang von GBS0 und Weiche gibt (zum Auslesen der Weichenstellung) habe ich im GBS0 eine Verknüpfung zur Weiche gesetzt...
Bild005.jpg.c226149f03d4b582d874126b3df7b246.jpg

Die entsprechenden GBS0 Bausteine für eine Fahrstraße...
Bild007.thumb.jpg.ad1d5f23a40d90617ba8ac7883db8cc9.jpg

... habe ich in einer Variablen "GBS0" in der Fahrstraße in einer Liste hinterlegt...
Bild006.thumb.jpg.02007b5ed3414644dddea285d2f55daa.jpg


Das benutzerdefinierte Ereignis für die GBS0 Ansteuerung sieht dann so aus...

--[[
Ansteuerung GBS0 Bausteine
--]]

local gba=FS.variables["GBS0"] -- GBS0 Bausteine in der FS-Variablen "GBS0"
local st=Anzeige -- 1=reserviert, 2=belegt
if FS.state==0 then  -- FS wurde aufgelöst?
 for _,gb in ipairs(gba) do -- alle GBS0 der FS Bausteine..
  gb.state=0 -- ..Anzeige 0=frei
 end
else
 for _,gb in ipairs(gba) do -- alle GBS0 der FS Bausteine
  local l=gb.link -- Verknüpfung GBS0 Baustein
  if l~=nil then -- Verknüpfung vorhanden (Weiche)?
    local s1=l.state -- Weichenstellung auslesen
    if gb.variables["cs"]~=nil then -- Variable cs für Korrektur Weichenstellung vorhanden?
     s1=gb.variables["cs"][s1] -- Weichenstellung korrigieren
    end
    gb.state=2*s1+st -- Anzeige GBS0 Baustein in Abhängigkeit von Weichenstellung setzen
  else -- -- Verknüpfung nicht vorhanden (keine Weiche)!
    gb.state=st -- Anzeige GBS0 Baustein setzen
  end
 end
end

... und der Aufruf für Fahrstraße wird aktiviert/deaktiviert sieht so aus...
Bild008.jpg.23011827e38bb01c0d5efb29c009f188.jpg

--[[
Fahrstraße Ausfahrt HFS
Anzeige=1 -> reserviert
Anzeige=2 -> belegt
--]]

$("FS GBS0 (B)"):invoke(2,route)

Der Vollständigkeit halber noch die Versuchsanlage.
2024-02-04-Ansteuerung GBS0-Bausteine.mbp

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @EASY,

hab mich auch schon daran versucht und fand, das der einfachste Weg die FS im GBS darzustellen über Variablen in den Gleisen führt, die die GBS-Bausteine enthalten. Dadurch entfällt die aufwendige Erstellung der Listen in den Fahrstraßen. Die Gleise einer Fahrstraße können per Route.tracks eingelesen werden.

Aber viele Wege führen nach Rom, deshalb bin ich mal auf deine Lösung für eine DKW gespannt. :D
 

VG,

Hawkeye

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Hawkeye,

dein Lösungsansatz bietet natürlich mehr die Möglichkeit der Anzeige im Detail und ich werde mich (da neugierig) auch mal mit diesem Lösungsansatz beschäftigen.
( Immerhin eine "Übersetzungstabelle" habe ich in deinen Weichen auch gefunden...)

Gruß
EASY
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Hallo,

Beim Umgang mit GBS Bausteinen gibt es das Problem, daß man sehr schnell viele Objekte hat, die den gleichen Namen haben.

Auf der Suche nach Lösungen bin ich auf diese Anlage (12FBFA21-6D56-444E-A59B-E7A4655EFE2D) von @Goetz gestoßen in der eine prinzipielle Lösung des Problems steckt. Ich habe mir die Idee also nur abgeschaut und mir überlegt was man noch etwas verbessern könnte.

Die Ausgangslage...
Bild001.thumb.jpg.2ec8fdef4adeb5fc089e1cbf46f41e89.jpg

... und viele gleiche Namen...
Bild002.jpg.82406413886addfcb444cf0719665b73.jpg

In der beigefügten Beispielanlage:
...zuerst werden zwei Listen angelegt...
Bild003.thumb.jpg.7d893cbbeb48ab77cb78c8d6f8b76047.jpg

... zum Ausfüllen der Liste (z.B. Bahnhof unten)...
... alle entsprechenden GBS Bausteine markieren...
Bild004.thumb.jpg.3d3a3c8a76c5f65c8ca98d9333989b03.jpg

und Strg+c (kopieren).

Die Liste "GBS Bahnhof unten" -> "Bearbeiten" und mit Strg+v (Einfügen).
Bild006.thumb.jpg.be31d07ec964bad7f8579e1c53b8202b.jpg

Bild007.thumb.jpg.ac563ef109c2619fd0a06fd8be38eb89.jpg

... desgleichen für "GBS Bahnhof oben"

Bild008.thumb.jpg.007263d396f8805c937d0539f65b3ed7.jpg

Das Benutzerdefinierte Ereignis "Namen setzen (B)" legt ein Raster an...
Bild010.thumb.jpg.011ef52ea2b2b4664801ce7428ff2068.jpg

...und vergibt die Namen nach Zeilen und Spalten (und der Anzahl der Spuren...)
Bild011.jpg.1602776315b35de608433fc07125fe8e.jpg

Ich habe das Skript dahingehend erweitert, daß es auch für andere Objektreihen anwendbar ist, bei denen die Grundform nicht quadratisch ist,
z.B. die "Abstellfläche" 4EBBA477-BB3F-4C8F-9AAF-2CC7AB6E19EF...
Bild012.jpg.33977c63cb9fbaa5bd9f6ea73c543ae2.jpg

So sieht der Aufruf von "Namen setzen (B)" aus (mit Beschreibung der Parameter)...
Bild013.thumb.jpg.06f9cb6f684299b8ca8fc25f46266214.jpg

... ergibt für die Abstellflächen...
Bild014.jpg.5a22f2c8d0c932b4de14a00098aa7273.jpg

Die Anlage mit dem Skript...
Objektreihen Namen 01.mbp

Gruß
EASY

Bearbeitet von EASY
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Hallo,

der Ursprung dieses Versuches liegt hier.
@bigrala wollte Loks aus einem Ringlokschuppen entlassen, die entweder das Schlagwort "Dampf" oder "Diesel" haben, und es sollte die Möglichkeit bestehen die Lok entweder in den Schuppen zurück zu fahren oder sie im Kreis fahren zu lassen...
Bild001.thumb.jpg.e556f62bcdba1de7bfd08a7d185600dd.jpg

Die bisherigen Lösungsansätze arbeiten ohne Fahrstraßen, weshalb ich mich für eine (Teil-) Lösung mit Fahrstraßen entschieden habe.
Eine weitere Problemstellung war, wie man eine Lok in der Mitte der Drehscheibe anhalten kann. Bei einer einzelnen Lok ist es kein Problem, da man mit einem Gleiskontakt arbeiten kann, der auf "Mitte" reagiert. Bei einer Lok mit Tender, funktioniert dies aber nicht, da für das MBS die Mitte der Lok gültig ist.
Ich bin es mathematisch angegangen: Wenn die Lok (oder Lok+Tender) den Gleiskontakt betritt, muß noch um eine halbe Zuglänge weiter gefahren werden damit der Zug mittig zum stehen kommt. Bei bekannter Geschwindigkeit, kann die Bremszeit berechnet werden...

--[[
* -> sonst Probleme, wenn Loklänge knapp auf Drehscheibe passt,
     Lok hält zu früh an!
--]]

if not deferredCall then
  local s=layout:getVehicleGroupLength(vehicle)/2 -- Halbe Länge Zugverband (evtl. Lok+Tender)
  local v=vehicle.currentSpeedAbs -- Lokgeschwindigkeit
  local t=s*3.6/v -- Bremszeit ermitteln für halbe Länge Zugverband
  vehicle.autoDeceleration=false -- Automatisches Bremsen deaktivieren (siehe oben)*
  defer(t,"vz1") -- Verzögerung mit Bremszeit

elseif deferredCall=="vz1" then -- Lok in der Mitte der Drehscheibe anhalten
  vehicle.currentSpeed=0
  vehicle.autoDeceleration=true -- Automatisches Bremsen wieder aktivieren

Hinweis: Da der Versuchsaufbau nicht weiter abgesichert ist, werden die Auswahltaster ausgeblendet, wenn 2 Züge aus dem Schuppen angefordert wurden (2 Strecken, 2 Einfahrten)...

Anmerkung: Da die Steuerung in lua geschrieben ist, wollte ich den Thread von @bigrala damit nicht "belasten"...

Ringlokschuppen 1c.mbp

Gruß
EASY

Bearbeitet von EASY
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 18 Minuten schrieb EASY:

Ich bin es mathematisch angegangen: Wenn die Lok (oder Lok+Tender) den Gleiskontakt betritt, muß noch um eine halbe Zuglänge weiter gefahren werden damit der Zug mittig zum stehen kommt. Bei bekannter Geschwindigkeit, kann die Bremszeit berechnet werden...

Hallo Easy, 

schöner Ansatz. :)

Solche Ansätze versuche ich schon eine ganze Weile im virtuellen Straßenverkehr anzuwenden. Da ist das Problem noch etwas komplexer. 

Screenshot2024-02-17102514.thumb.jpg.6f6fa32d655a3ca5477ea64889ca25ca.jpg

An einer Ampel z.B. muss jeder "virtuelle" Fahrer eines Fahrzeuges beim Umschalten von Grün auf Gelb eine Entscheidung in Abhängigkeit seiner Geschwindigkeit und dem aktuellen Abstand zur Ampel treffen. Soller er bremsen, um noch rechtzeitig an der Haltelinie der Ampel zum Stehen zu kommen oder soll er beschleunigen, um vor dem Umschalten der Ampelphase von Gelb auf Rot noch über die Ampel zu huschen. ;)  

Dies ist allein mit Gleiskontakten und den mehrspurigen Straßen im virtuellen Straßenverkehr nicht realisierbar. Über deinen Ansatz in Verbindung mit separaten "Bremsspuren" (im Bild: rot) auf die in der EV zugegriffen werden kann, schon.

Hast du nicht Lust, dich auch mal mit solchen Aufgabestellungen zu beschäftigen? 

VG,

Hawkeye

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 49 Minuten schrieb EASY:
local v=vehicle.currentSpeedAbs -- Lokgeschwindigkeit

Hallo Easy, 

in deinem Skript fehlt aus meiner Sicht eine Anweisung. Das Skript dürfte nur richtig ausgeführt werden, wenn der Zug eine konstante Geschwindigkeit hat. Befindet er sich jedoch noch in einem Beschleunigungsvorgang wird er bei einer zeitverzögerten Ausführung nicht an der geplanten Stelle zum Stehen kommen. Ich unterbreche deshalb immer vor der Zeitverzögerung den Beschleunigungsvorgang mit der Anweisung.   

Screenshot2024-02-17110340.jpg.3eb9aa219ebaf1fa01a01adaed16f7e0.jpg

 

VG,

Hawkeye

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Stunden schrieb EASY:

Bei einer Lok mit Tender, funktioniert dies aber nicht, da für das MBS die Mitte der Lok gültig ist.

Hallo @EASY ,

Nicht ganz richtig. Als Mittelpunkt eines Zugverbandes gilt immer die Zugmitte, also bei Lok mit Tender die Mitte der Gesamtlänge.
Haltmittig1.thumb.jpg.caaf9377ba2544bc563ed9c7a80d1381.jpg

Haltmittig2.thumb.jpg.ff3175e4d7e5be7fc6acf53e05dd8a0b.jpg

Die leichte Verschiebung nach rechts ergibt sich aus den Verzögerungswerten der Lok.
Das Problem in bigralas BW ergibt sich durch das automatische Bremsen der Lok, da auf der gegenüberliegenden Seite von z.B. Gleis45 kein Gleis an der Drehscheibe angeschlossen ist und so die Lok mit Abstand zum Gleisende stehen bleibt (und somit nicht den Gleiskontakt erreicht).

Aber trotzdem: Schöne Lösung, die man vielleicht in anderem Kontext gebrauchen kann.

Viele Grüße,
    Wolfgang

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo zusammen,

vor 44 Minuten schrieb prinz:

Die leichte Verschiebung nach rechts ergibt sich aus den Verzögerungswerten der Lok.

Diese tritt nicht mehr auf, wenn man in der EV die Geschwindigkeitsregulierung auf den "Ist"-Wert einstellt.

vor 44 Minuten schrieb prinz:

und so die Lok mit Abstand zum Gleisende stehen bleibt (und somit nicht den Gleiskontakt erreicht).

Das kann umgangen werden, wenn in der Lok die automatische Verzögerung abgeschaltet wird. Dann fährt die Lok bis ans Gleisende.

Das sieht in der grafischen EV dann so aus:

1380.thumb.JPG.ecc5fef8e0e7007558ef70ac262b9e68.JPG

Im Lua Script steht das:

vehicle.autoDeceleration = false

local v = vehicle
if v:hasEngine() then
  v.currentSpeed = 0
end

HG
Brummi 

Bearbeitet von Roter Brummer
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 52 Minuten schrieb Roter Brummer:

Diese tritt nicht mehr auf, wenn man in der EV die Geschwindigkeitsregulierung auf den "Ist"-Wert einstellt.

V.currentSpeed = 0  ??


🤔 Als „sanftes“ Abbremsen kann man das aber nicht bezeichnen. Widerspricht irgendwie den Gesetzen der Massenträgheit.😂

VG,

Hawkeye

Bearbeitet von Hawkeye
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

vor 1 Stunde schrieb prinz:

Nicht ganz richtig. Als Mittelpunkt eines Zugverbandes gilt immer die Zugmitte, also bei Lok mit Tender die Mitte der Gesamtlänge.

... oh:$... hatte ich erst gar nicht ausprobiert. Danke für den Hinweis.

Gruß
 

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