EASY Geschrieben 17. Februar Autor Teilen Geschrieben 17. Februar Hallo, vor 4 Stunden schrieb Hawkeye: 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. vor 4 Stunden schrieb Hawkeye: Hast du nicht Lust, dich auch mal mit solchen Aufgabestellungen zu beschäftigen? ... habe ich mal aus Spaß an der Freude gemacht... --[[ * -> in die Klammer entsprechende Referenzspur eintragen ** Verknüpfte Objekte mit Referenzspur: (Gleiskontakte und Fahrzeuge werden mit der Referenzspur automalisch verknüpft!) Gleiskontakt "GKe" mit Schlagwort "GKref" sehr nahe am Ende der Referenzspur (nicht am Übergang) plazieren, so daß die Zuordnung zu Referenzspur eindeutig gegeben ist. *** wenn zu stark abgebremst werden müßte -> durchfahren --]] local blink=layout:getEntitiesLinkedTo($("Bremsspur 1"))-- * ; ** local ref=0 -- Dummyeintrag local auto=0 -- Dummyeintrag for i,v in ipairs(blink) do -- verknüpfte Objekte if v.variables["GKref"]==keyword then -- Referenzkontakt? ref=v end local res=false res,auto=pcall(function(x) x:hasEngine() return x end,v)-- Fahrzeug mit Antrieb? end if auto~=0 and ref~=0 then auto.currentSpeed=auto.currentSpeed -- evtl. Beschleunigung abbrechen -- Bremsweg berechnen (Vorderkante Auto -> Ende Spur) local pos1=ref.transformation.position local pos2=auto.transformation.position local dx=pos1.x-pos2.x local dy=pos1.y-pos2.y local la=auto.length/2 local l=math.sqrt(dx^2+dy^2)-la -- benötigte Verzögerung berechnen... local v=auto.currentSpeedAbs v=v/3.6 local a=(v^2)/(2*l) vehicle.deceleration=a if a<20 then -- *** vehicle.targetSpeed=0 end end Bremsversuch 01.mbp Gruß EASY Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hawkeye Geschrieben 17. Februar Teilen Geschrieben 17. Februar (bearbeitet) vor 31 Minuten schrieb EASY: habe ich mal aus Spaß an der Freude gemacht... 😁👍 @Neo Die Berechnung des Bremsweges über die Position könnte man sich sparen, wenn es die Möglichkeit gäbe, den Abstand eines Fahrzeuges zu einem Gleiskontakt per Lua abzufragen. Dann könnten auch in Kurven tatsächliche Spurlängen ausgelesen werden und nicht nur der lineare Abstand zweier Punkte. Dieser Punkt wurde schon häufig gewünscht und trotz verschiedener Ansätze dieses auf anderem Wege zu lösen komme ich immer wieder auf die Notwendigkeit einer solchen Funktion zurück. Läßt sich das nicht doch realisieren? VG, Hawkeye Bearbeitet 17. Februar von Hawkeye Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
BahnLand Geschrieben 17. Februar Teilen Geschrieben 17. Februar Hallo zusammen, ich habe zu dem Bremsproblem am Gleis-Ende ein kleines Demo-Beispiel gemacht: Weiches Abbremsen am Gleisende.mbp Die Demo besteht aus 3 identischen Gleisabschnitten, die jeweils mit derselben Lok bestückt sind. Für eine weiche Verzögerung habe ich 0,4 m/s² eingestellt. Mit dem Taster im Vordergrund werden die Loks simultan vorwärts (Taster an) oder rückwärts (Taster aus) gestartet und auf 50 km/h beschleunigt. Der Unterschied zwischen den 3 Anordnungen besteht nun darin, dass beim der hinteren Lok die automatische Verzögerung eingeschaltet ist. Deshalb hält sie vor dem Prellbock (rechts) oder dem offenen Gleis-Ende (links) jeweils mt etwas Abstand an. Bei der mittlere Lok ist die automatische Verzögerung ausgeschaltet, weshalb sie mit unverminderter Geschwindigkeit auf den Prellbock auffährt und auch am anderen Gleis-Ende abrupt angehalten wird. Auch bei der vorderen Lok ist die automatische Verzögerung ausgeschaltet. Dort befinden sich aber unter dem Prellbock und auch am anderen Ende des Gleises jeweils ein Bremskontakt (gut sichtbar, wenn das Bild durch Anklicken vergrößert wird). Dieser bewirkt ein sanftes Abbremsen der Lok auch dann, wenn dort keine automatische Verzögerung eingestellt ist. Die Lok kommt dann mit dem Puffer genau in der Mitte des Bremskontakts sanft zum Stehen. Ich vermute, dass genau dies in der vorangehenden Diskussion angestrebt wurde. Viele Grüße BahnLand Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
EASY Geschrieben 17. Februar Autor Teilen Geschrieben 17. Februar Hallo an alle, ich wollte hier spezielle Lösungsansätze in lua vorstellen. Wenn es alternative Lösungsansätze gibt, macht das bitte in einem eigenen Thema, sonst wird dieses Thema aus dem Zusammenhang gerissen, wie leider schon viele Themen in diesem Forum. Gruß EASY Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hawkeye Geschrieben 18. Februar Teilen Geschrieben 18. Februar (bearbeitet) vor 20 Stunden schrieb EASY: ich wollte hier spezielle Lösungsansätze in lua vorstellen Hallo Easy, nimmst du denn Aufträge an? 😉 Ich versuche es einfach mal 😂 Eine nützliche Funktion wäre die Neusortierung einer Liste ab einem bestimmten Platz in der Liste. Beispiel: Ein Kreisverkehr oder eine Kreuzung gleichberechtigter Straßen (Rechts vor Links-Regel) hat an jeder Ein- und Ausfahrt Gleiskontakte die in Listen die Vorfahrtsregeln (Objekte sind Gleiskontakte) enthalten. In den Listen der Gleiskontakte sind die gleichen Objekte vorhanden. Die Listen unterscheiden sich nur in einer Reihenfolge, wie die Objekte in den Listen stehen müssen. Damit nicht in jedem Gleiskontakt eine Liste gespeichert werden muß, wäre ein Funktion nützlich, die anhand eines Parameters der vom Gleiskontakt gesetzt wird, nur auf eine Liste zurückgreift und die Liste in der gewünschten Reihenfolge sortiert zurückgibt. So das die Liste in der Kreuzung existiert und die Gleiskontakte über diese Funktion anhand ihres Parameters die Liste neu sortiert erhalten. Liste (gespeichert in der Kreuzung) mit den Objekten: 1 = GK-01 ; 2 = GK-02 ; 3 = GK-03 ; 4 = GK-04 Wird die Funktion vom jeweiligen Gleiskontakt aufgerufen, soll das folgende Ergebnis zurückgegebenen werden. Bei Aufruf von GK-1: Rückgabe (der Liste) in der Reihenfolge 2; 3; 4; 1 GK-2: Rückgabe in der Reihenfolge 3; 4; 1; 2 GK-3: Rückgabe in der Reihenfolge 4; 3; 2; 1 GK-4: Rückgabe in der Reihenfolge 1; 2; 3; 4 Wäre das was für dich? VG, Hawkeye Bearbeitet 18. Februar von Hawkeye Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
EASY Geschrieben 18. Februar Autor Teilen Geschrieben 18. Februar Hallo @Hawkeye, Ich könnte Dir folgende (logische) Reihe anbieten: [16:54:04] Gleiskontakt wird ausgelöst -> GK-1, Golf 1, 1 [16:54:04] Gleiskontakt wird ausgelöst [16:54:04] Gleiskontakt: GK-1 hat ausgelöst [16:54:04] Liste: [16:54:04] GK-2 [16:54:04] GK-3 [16:54:04] GK-4 [16:54:04] GK-1 [16:54:16] Gleiskontakt wird ausgelöst -> GK-2, Golf 1, 1 [16:54:16] Gleiskontakt wird ausgelöst [16:54:16] Gleiskontakt: GK-2 hat ausgelöst [16:54:16] Liste: [16:54:16] GK-3 [16:54:16] GK-4 [16:54:16] GK-1 [16:54:16] GK-2 [16:54:24] Gleiskontakt wird ausgelöst -> GK-3, Golf 1, 1 [16:54:24] Gleiskontakt wird ausgelöst [16:54:24] Gleiskontakt: GK-3 hat ausgelöst [16:54:24] Liste: [16:54:24] GK-4 [16:54:24] GK-1 [16:54:24] GK-2 [16:54:24] GK-3 [16:54:31] Gleiskontakt wird ausgelöst -> GK-4, Golf 1, 1 [16:54:31] Gleiskontakt wird ausgelöst [16:54:31] Gleiskontakt: GK-4 hat ausgelöst [16:54:31] Liste: [16:54:31] GK-1 [16:54:31] GK-2 [16:54:31] GK-3 [16:54:31] GK-4 ... dies wäre allerdings eine andere Reihenfolge bei GK-3 als Du angegeben hast. vor 3 Stunden schrieb Hawkeye: GK-3: Rückgabe in der Reihenfolge 4; 3; 2; 1 Hast Du Dich da vertippt oder muß es die von Dir angegebene Reihenfolge sein? Gruß EASY Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hawkeye Geschrieben 18. Februar Teilen Geschrieben 18. Februar vor 19 Minuten schrieb EASY: ... dies wäre allerdings eine andere Reihenfolge bei GK-3 als Du angegeben hast. vor 3 Stunden schrieb Hawkeye: GK-3: Rückgabe in der Reihenfolge 4; 3; 2; 1 Hast Du Dich da vertippt oder muß es die von Dir angegebene Reihenfolge sein? Hallo Easy, Du hast natürlich recht, da habe ich mich verschrieben. 🙄 Bei GK- 3 ist die Folge 4,1,2,3 das richtige Ergebnis. Aber genau um solche Fehler geht es auch. Wie schnell baut man beim stupiden Kopieren der Listen und Ändern der Reihenfolge logische Fehler ein, die man dann nur sehr schwer identifizieren kann. 😊 Super gemacht, danke. 👍👍👍😃 Ich finde, das solche kleinen Funktionen für Listen sehr hilfreich sein können. @Goetz hatte mal eine ähnliche Funktion zum Umkehren einer Liste geschrieben die aus 1,2,3,4 dann 4,3,2,1 macht. Diese ist auch sehr hilfreich. VG, Hawkeye Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
EASY Geschrieben 18. Februar Autor Teilen Geschrieben 18. Februar Hallo @Hawkeye, ... eine kleine Demoanlage zu Deinem Anliegen... Gleiskontakt wird betreten sieht so aus... * Die Funktion teilt einen String am Seperator in Teilstrings auf Beispiel: Gleiskuntaktname: "GK-1" -> Seperator="-" ergibt die beiden Teilstrings "GK" (a[1]) und "1" (a[2]) a[2] dient als Zahlengrundlage für das zyklische Anlegen der Ausgabeliste Achtung: Mit diesem Verfahren liegt die Referenzzahl im Namen des Gleiskontaktes! -> der Name darf im MBS Projekt nur einmal vorkommen! ** alternativ kann auch eine Zahlenvariable im Gleiskontakt verwendet werden die Zeile **(a) entfällt und bei **(b) a[2] durch die Variable ersetzen. --]] local ausgabe={}-- Ausgabeliste local a={}-- teporäre Liste für GK-x Namen zerlegen local gk=contact.name -- Name des Gleiskontaktes print("Gleiskontakt: "..gk.." hat ausgelöst") gk:gsub("[^-]+",function(c) table.insert(a,c) end)--* / **(a) local gkx=$("Kreuzung 1").variables["GK x"]--Liste in der Kreuzung n=#gkx --Anzahl der Einträge in der Liste print("Liste:") for i=1+a[2],n+a[2]do --Liste vom Anfangswert her zyklisch erstellen **(b) local x=math.tointeger((i % n))-- Ergibt den Rest einer Division if x==0 then -- Rest=0 table.insert(ausgabe,gkx[n])-- maximalen Wert nehmen else -- Rest>0 table.insert(ausgabe,gkx[x])-- Restwert nehmen end end for i,v in ipairs(ausgabe)do --Ausgabetabelle print(v.name) end Anmerkung: Ich habe das Ereignis allen 4 Gleiskontakten zugeordnet (sinnvoll wäre evtl. mit Schlagworten zu arbeiten)... 2024-02-18-Zyklische Liste erstellen 01.mbp Gruß EASY2024-02-18-Zyklische Liste erstellen 01.mbp2024-02-18-Zyklische Liste erstellen 01.mbp2024-02-18-Zyklische Liste erstellen 01.mbp2024-02-18-Zyklische Liste erstellen 01.mbp Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hawkeye Geschrieben 18. Februar Teilen Geschrieben 18. Februar Hallo Easy, vor 18 Minuten schrieb EASY: .. eine kleine Demoanlage zu Deinem Anliegen... super, vielen Dank. Perfektes Ergebnis vor 19 Minuten schrieb EASY: Anmerkung: Ich habe das Ereignis allen 4 Gleiskontakten zugeordnet (sinnvoll wäre evtl. mit Schlagworten zu arbeiten)... Ich baue es mir als function() für ein Skript-Ereignis um, dann kann ich es beliebig einsetzten. VG, Hawkeye Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hawkeye Geschrieben 19. Februar Teilen Geschrieben 19. Februar (bearbeitet) Hallo Easy, vor 14 Stunden schrieb EASY: gk:gsub("[^-]+",function(c) table.insert(a,c) end)--* / **(a) Wow, das geht über meinen Horizont und übersteigt meine Kenntnisse in Lua! vor 14 Stunden schrieb EASY: Achtung: Mit diesem Verfahren liegt die Referenzzahl im Namen des Gleiskontaktes! -> der Name darf im MBS Projekt nur einmal vorkommen! Danke für den Hinweis, deshalb ist mir diese Variante zu unsicher. Dann kann man die Kreuzung mit den Gleiskontakten nicht kopieren, ohne alle Bezeichnungen zu überarbeiten. Ich favorisiere deshalb deine zweite Variante mit Übergabe einer Nummer. Funktioniert super. Wieder was dazu gelernt. Nochmals danke. Damit lässt sich doch was anfangen. VG, Hawkeye Bearbeitet 19. Februar von Hawkeye Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
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