Jump to content

Blockstrecke


Empfohlene Beiträge

vor einer Stunde schrieb Magnetilo:

Ich wollte mir vorher noch die Fahrstraßen anschauen

Hallo Magnetilo,
diese beiden Videos geben dir einen ersten Einblick in ihre Funktionsweise:

Fahrstraßen
und
Fahrstraße am Beispiel "Kehrschleife"

Du wirst feststellen, dass diese Fahrstraßen einiges besser machen als ihr EEP Pendant.

Viele Grüße
Götz

Bearbeitet von Goetz
Links getauscht
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Goetz,

durch die Fahrstraßen vereinfacht sich mein Problem drastisch. Das Ganze lässt sich nun mit ein paar Zeilen Code realisieren.

Unschlüssig bin ich noch beim Aktivieren von Fahrstraßen. Ist dies so guter Code?

function setRouteActive(name)
  local fs=layout:getRoutesByKeyword("Route")-- Fahrstraßen mit Schlagwort "Route" einlesen
  for k,f in ipairs(fs) do -- Für alle Fahrstraßen...
    if f.name==name then
      f.active = true
    end
  end
end

Ich spreche die Fahrstraßen über den Namen an.

Wann würde man ein Schlagwort und wann eine Kategorie setzen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Magnetilo,

Schlagworte nutzt du am Besten dann, wenn du auf mehrere Objekte denselben Code anwenden willst.
Über das Schlagwort kannst du diese Objekte generisch ansprechen.

Das heißt, dass Schlagworte vor allem in der Definition deiner Auslöser hilfreich sind. Beispiel:

  • Schlagwort.jpg.e26b127ed30c59a57792374210fee7e1.jpg
     
  • ein Kontakt mit dem Schlagwort "Einfahrt" wird betreten
  • eine Fahrstraße mit dem Schlagwort "Blockabschnitt" schaltet
  • Ein Fahrzeug mit dem Schlagwort "LKW" verlässt ein Depot
  • ...

Darüber hinaus kannst du Schlagworte in Wiederholungen verwenden.
Damit kannst du innerhalb dieser Wiederholung alle Objekte mit dem angegebenen Schlagwort ansprechen, als stünden sie in einer Liste.

Die Kategorien bei den Fahrstraßen sind für deine Organisation hilfreich.
Sie sollen dir helfen, dich ein einer Liste mit sehr vielen Fahrstraßen schneller zurecht zu finden.

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Magnetilo:

Ist dies so guter Code?

Nein, leider nicht. Viel zu umständlich.

Wenn du den Namen der Fahrstraße doch schon weißt, dann musst du nur noch prüfen, ob diese Fahrstraße das Schlagwort enthält.
Du durchsuchst unnötig alle Fahrstraßen mit einem bestimmten Schlagwort und vergleichst, ob der Name übereinstimmt. 

Um zu überprüfen, ob die FS das erforderliche Schlagwort hat, schreib es zunächst mit der grafischen EV und lass es dann übersetzen.
Das erspart dir viel Rätselraten:

1093220002_BedingungSchlagwortgrafisch.jpg.913e6e521d14a2c3e46a0df7a25be682.jpg

 

 

if $("meinTest").variables["Blockstrecke"] == keyword then
  -- tu hier, was zu tun ist
end

 

Viele Grüße
Götz

 

Nachtrag:
in deinem Fall sähe das so aus

function setRouteActive(name)
  local f = $(name)
  if f.variables["Blockstrecke"] == keyword then
    f.active = true
  end
end

 

aber besser wäre es, wenn du nicht den Namen, sondern das Objekt (= die Fahrstraße) an die Funktion übergibst:

function setRouteActive(f)
  if f.variables["Blockstrecke"] == keyword then
    f.active = true
  end
end

 

Bearbeitet von Goetz
Ergänzungen
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Goetz,

vielen Dank für Deine Hilfe.

Dein erstes Skript würde gut passen, erzeugt aber leider eine Fehlermeldung:

unexpected symbol near "$"

Soweit ich verstehe, funktioniert $ nicht mit Variablen.

PS: Das Schlagwort benutze ich momentan nur, weil es anders nicht geht. Brauche ich aber eigentlich nicht.

Bearbeitet von Magnetilo
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Magnetilo:

Soweit ich verstehe, funktioniert $ nicht mit Variablen.

Doch, tut es.

Das Dollarzeichen bewirkt, dass ein Objekt mit dem Namen gesucht wird, der in den Klammern angegeben ist. 
Ich hatte in meinem Versuchsaufbau der Fahrstraße fest den Namen "meinTest" gegeben. Drum steht der so explizit in der Klammer.

Im ersten Beispiel für dich habe ich dann den Inhalt der Variablen name in die Klammern gesetzt, weil du schriebst, dass du den Namen der Fahrstraße an diese Variable übergibst. Wenn du da etwas anderes an die Variable übergibst als den Namen, dann meldet die Prozedur einen Fehler.

Leider kann ich nicht sehen, was du tust. 
Warum halten alle ständig mit ihrem Zeug hinter'm Berg und lassen mich rätseln??? 9_9

Zeig mir, was du tust und ich kann dir sagen, warum es nicht klappt!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Goetz,

... wenn ich versuche...

function setRouteActive(name)
  local f = $(name)
  if f.variables["Blockstrecke"] == keyword then
    f.active = true
  end
end

... per copy & paste im MBS einzugeben ergibt sich folgendes...
91838714_SkriptBild1.thumb.jpg.9cf806c315ab50a9f9ffeb2679d66d68.jpg

...worin liegt dein Trick, daß es funktioniert?

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aaahhh - danke EASY
Jetzt erkenne ich das Problem.

vor 1 Stunde schrieb EASY:

...worin liegt dein Trick ..?

Der war einfach: Ich habe geschummelt :$
Will sagen: Ich habe es mir zu einfach gemacht und nicht ausprobiert, ob es so geht.

Sorry!

Jetzt verstehe ich auch @Magnetilos Einwand:

vor 3 Stunden schrieb Magnetilo:

Soweit ich verstehe, funktioniert $ nicht mit Variablen.

Den hatte ich falsch interpretiert.

Sorry!

@Magnetilo

Und jetzt kapier ich auch eeendlich den ganzen Umstand, den du treibst um letztlich eine Fahrstraße per Namen anzusprechen.

Erklär mir bitte, warum du sie namentlich ansprechen willst? Kannst du sie nicht als Objekt an die Funktion übergeben? Das würde die Sache viel einfacher machen. Zumal Namen eine sehr unzuverlässige Art der Adressierung sind. Wo bekommst du den Namen der Fahrstraße?

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Goetz,

das Ansprechen der Fahrstraße mit ihrem Namen war für mich einfach der intuitive Ansatz.
Genauso mache ich das ja auch mit Gleisen, Signalen, Gleiskontakten usw.

Das konkrete Problem war:

Ausfahrt von einem Schattenbahnhof von einem zufälligem Gleis

1. Definiere Fahrstraßen mit Schlagwort "Route" von jedem Gleis im Schattenbahnhof bis zum ersten Signal

2. Aktionen im Trigger (hier für 3 Gleise)

local items = {
        {["gleis"]="2_Sgl_lks_1", ["route"]="N1-S1" },
        {["gleis"]="2_Sgl_lks_2", ["route"]="N2-S1" },
        {["gleis"]="2_Sgl_lks_3", ["route"]="N3-S1" },
}

ausfahrt(items)

3. Code im Modul

function ausfahrt(arr)
  local routes = { }

  for k,v in pairs(arr) do
    if #layout:getVehiclesOn(layout:getEntityByName(v.gleis)) > 0 then table.insert(routes, v.route) end -- Gleis belegt?
  end

  local random_number = math.random(#routes)
  local random_route = routes[random_number]

  setRouteActive(random_route)
  print("Funktion Ausfahrt hat Fahrstraße "..random_route.." aktiviert")
end

function setRouteActive(name)
  local fs=layout:getRoutesByKeyword("Route")-- Fahrstraßen mit Schlagwort "Route" einlesen
  for k,f in ipairs(fs) do -- Für alle Fahrstraßen...
    if f.name==name then
      f.active = true
    end
  end
end

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Und noch eine zweite Lösung mit einem etwas anderem Ansatz:

1. Definiere Fahrstraßen mit Schlagwort "2_Ausf_lks" von jedem Gleis im Schattenbahnhof bis zum ersten Signal

2. Aktionen im Trigger (hier für 3 Gleise)

ausfahrt("2_Ausf_lks")

3. Code im Modul

function ausfahrt(fskeyword)
  local routes = { }

  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)
    if #layout:getVehiclesOn(f.tracks[1]) > 0 then table.insert(routes, f) end -- Gleis belegt?
  end

  local random_number = math.random(#routes)
  local random_route = routes[random_number]
  random_route.active = true

  print("Funktion Ausfahrt hat Fahrstraße "..random_route.name.." aktiviert")
end

Vielleicht sogar einfacher und eleganter?!

Trotzdem komisch, dass man Fahrstraßen nicht mit dem Namen ansprechen kann.

Und warum über Schlagwort und nicht über Kategorie?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Magnetilo,

vor 24 Minuten schrieb Magnetilo:

Genauso mache ich das ja auch mit Gleisen, Signalen, Gleiskontakten usw.

Eigentlich nicht.
Eigentlich sprichst du Objekte über ihre Objektadressen an.
Weil diese kryptisch und unleserlich sind, hat Neo diese spezielle Schreibweise mit dem vorangestellten $ Zeichen entworfen.

Ändere mal bei einem Objekt, welches du so in der EV ansprichst, anschließend den Namen.
Du wirst sehen, dass sich dieser Name dann automatisch auch in der EV ändert.

In deinem Beispiel enthält deine Liste f.tracks die Objektadressen der Gleise, über die diese Fahrstraße führt. Deshalb kannst du mit f.tracks[1] direkt das erste Gleis aus dieser Liste ansprechen. Den Namen des Gleises benötigst du nur für deine print Ausgabe

 

vor 24 Minuten schrieb Magnetilo:

warum über Schlagwort und nicht über Kategorie?

Weil beides für unterschiedliche Zwecke gedacht ist.

Schlagworte kannst du bei allen Dingen benutzen, die du generisch ansprechen möchtest.
Dieses System war schon gut etabliert, bevor die Fahrstraßen hinzu kamen.

Kategorien sind hingegen nur eine optische Sortierhilfe für die Fahrstraßen.

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

vor 33 Minuten schrieb Magnetilo:

Und warum über Schlagwort und nicht über Kategorie

... das habe ich mich auch schon gefragt.

Noch als Fragestellung hinterhergeschoben: Hat die Kategorie noch eine andere Funktion als die farbliche Differenzierung?

Gruß
EASY

@Goetz hat mich überholt...

Bearbeitet von EASY
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Stunden schrieb Magnetilo:

Das konkrete Problem war:

Ausfahrt von einem Schattenbahnhof von einem zufälligem Gleis

Probiere mal bitte, ob das hier funktioniert:

local liste = layout:getRoutesByKeyword("SBF Ausfahrt")
local freie = {}
for i, FS in ipairs(liste) do
  if FS:canActivate() then
    table.insert(freie, FS)
  end
end

if #freie > 0 then
  local zufall = math.random(#freie)
  freie[zufall].active = true
end

 

Ich habe jetzt gesehen, dass du prüfst, ob im Sbf an dieser Stelle überhaupt ein Zug wartet.
Diese Prüfung hatte ich missverstanden als "ist der Weg frei?" und deshalb (nur) geprüft, ob die FS aktiviert werden kann.

Mein Skript ist also (bis auf das Missverständnis) mit deinem identisch.
Ich war wohl noch nicht richtig wach ...   :$

 

Hier ist eine Beispielanlage nach dem oben beschriebenen Prinzip: Sbf with random exit.mbp
In diesem Beispiel nutze ich Magnetilos Prinzip um zu schauen, ob ein Zug für die Ausfahrt bereit steht.

Bearbeitet von Goetz
Ergänzungen
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

vor 6 Stunden schrieb Magnetilo:

Trotzdem komisch, dass man Fahrstraßen nicht mit dem Namen ansprechen kann.

technisch spricht nichts gegen eine Adressierung über den Namen oder auch sogar über die Kategorie, aber wenn immer ein Textbezeichner zum Einsatz kommt, muss sich der Nutzer mit den immer gleichen Problemen auseinandersetzen:

  • Was passiert, wenn es mehr als eine Fahrstraße mit dem gleichen Namen gibt?
  • Was passiert, wenn nachträglich neue Fahrstraßen mit identischem Namen dazukommen?
  • Was passiert, wenn der Name nachträglich geändert wird?

Um diese Probleme zu umgehen gibt es im Studio den eigens entwickelten $-Operator, um ein Objekt unabhängig seines Namens eindeutig zu adressieren (Objekte besitzen intern eindeutige IDs, die sich nicht mehr ändern). Dadurch wird es auch möglich, Objektreferenzen direkt in Variablen zu speichern.

Will man nicht mit einer konkreten Fahrstraße, sondern mit beliebig vielen Fahrstraßen arbeiten, die alle der selben Logik folgen, kommen die Schlagworte ins Spiel. Zwar könnte man hier auch über den Namen oder die Kategorie geben, aber da die Schlagworte ein sehr zentrales Element der Ereignisverwaltung sind und z.B. auch nativ als Auslöser für Ereignisse dienen können, ist es für den Nutzer nicht vom Vorteil, mehrere Möglichkeiten zu besitzen, um letztendlich das gleiche zu erreichen.

So viel als kleine Hintergrundinformation, warum die namensbasierte Adressierung im Studio keine hohe Priorität besitzt.

Viele Grüße,

Neo

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Minuten schrieb EASY:

Warum ergibt dieses Ereignis [...] eine doppelte "if" Abfrage ..?

Weil (wie ich durch deine Frage gerade selbst entdeckt habe), die Aktion "Zug von einem virtuellen Depot starten" schon die Prüfung enthält, ob das Depot überhaupt besetzt ist. Das wusste ich nicht. Meine eigene Prüfung ist damit überflüssig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

In der Beispielanlage von Götz wird für die Ausfahrt geprüft ob sich ein Fahrzeug auf dem ersten Gleis der Fahrstraße befindet...
 

local routeList = layout:getRoutesByKeyword("Sbf Ausfahrt")
local candidateList = {}

for _, route in ipairs(routeList) do
  local track = route.tracks[1] -- erstes Gleis der Fahrstraße...
  local waitList = layout:getVehiclesOn(track)
  if #waitList > 0 then -- ... mit einem Fahrzeug belegt?
    table.insert(candidateList, route)
  end
end

... wenn ich nun für die Einfahrt wissen möchte ob sich schon ein Fahrzeug am Ende der Fahrstraße befindet würde sich dei Abfrage auf das letze Gleis beziehen...

local track = route.tracks[#route.tracks]

... nun stellt sich mir die Frage ob die Gleise bei  route.tracks immer in der "richtigen" Reihenfolge (route.tracks[1]=Anfang FS, route.tracks[#route.tracks] = Ende FS) eingelesen werden oder ob die Liste auch "wild durcheinander" sein kann? (Gleiche Fragestellung für route.waypoints)

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo EASY,

die Wegpunkte und Gleise der Fahrstraßen werden nicht wild durcheinander aufgelistet, sondern in der Reihenfolge, die der Nutzer bei der Erstellung der Fahrstraße angibt (bzw. die der Wegfindealgorithmus vorgibt). Das erste Gleise ist daher immer der Anfang der Fahrstraße und das letzte Gleis immer das Ende.

Viele Grüße,

Neo

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Bei der Beispielanlage von Götz gibt es noch etwas was ich noch nicht so ganz verstehe...
Ausgangssituation...
261520694_AusfahrtBild001.thumb.jpg.f41af08dacbade3c037ac315c399d14d.jpg

... ich betätige den blauen Taster, das Signal schaltet auf "1" und der Zug fährt los...
1791396471_AusfahrtBild002.thumb.jpg.406d866e12065f0fbde7a48bd49e5c09.jpg

... hier schaltet das Signal wieder auf "0"...
1160883061_AusfahrtBild003.thumb.jpg.a7992f2bc15b9dd2f14c5c27a9d55e9a.jpg

... nach dieser Definition soll das Signal auf "0" schalten, wenn die Fahrstraße aufgelöst wird...
1587659563_AusfahrtBild004.jpg.29805b0df80c0c79a4a72527361e34f9.jpg

... die Fahrstraße ist aber noch gar nicht aufgelöst...
194665658_AusfahrtBild005.thumb.jpg.44c2974182c8de155741f1455650d6ec.jpg

Verstehe ich etwas falsch oder habe ich etwas übersehen oder...?

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb EASY:

... die Fahrstraße ist aber noch gar nicht aufgelöst...

Sie ist in Teilen aufgelöst, EASY, aber nicht vollständig.

Die Auflösung am Signal findet schon in dem Augenblick statt, wenn die Zugmitte das Signal passiert.
Jede Weiche innerhalb der Fahrstraße wird befreit, wenn der Zug sie verlässt.

Du musst erstens die Tür gleich hinter dem Zug zumachen und ihn so vor Nachfolgern schützen.
Und du willst zweitens zurückgelegte Abschnitte nicht länger reservieren.
Aber den Restabschnitt vor dem Zug musst du unbedingt weiterhin beanspruchen, bis er am Ziel ist.

Viele Grüße
Götz

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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