Jump to content

Gleis besetzt Status abfragen?


Empfohlene Beiträge

Hier ist eine kleine Beispielanlage zum Thema: Besetzt Abfrage Demo.mbp

1703943201_BesetztAbfrage.thumb.jpg.19124d0fe82d73ce05a10eb0cad61af9.jpg

Die eigentliche Besetzt-Prüfung findet in einem benutzerdefinierten Ereignis statt.
Das ist ein Ereignis, welches durch eine Aktion in der EV ausgelöst wird und nicht durch ein Ereignis auf der Anlage.

Der Vorteil besteht darin, dass drei verschiedene Ereignisse auf der Anlage dieselbe Aktion starten können.
In meinem Fall sind das

  1. ein Klick auf den roten Knopf 
  2. das Betreten eines bunten Gleises
  3. das Verlassen eines bunten Gleises
Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe das mit den Gleisen noch nicht ganz kapiert.
Die haben ja alle den gleichen Namen "1610" (Bezeichnug des Herstellers) oder so.
Wie kann man die denn unterscheiden?

Und kann man auch erkennen, ob ein Gleis eine Weiche ist?
Und kann man die Weiche irgendwie flankenschützen/sperren?

Achja: Kann ich eine Aktion in einer Endlosschleife aufrufen, bis ein bestimmtes Ereignis eintritt?
Gibt es da programmintern einen Scheduler, der die Prozessorzeiten für die Aktionen verwaltet?

Wenn ich mit Fragen zu viel nerve, einfach sagen! ;-)

Bearbeitet von HaNNoveraNer
Link zu diesem Kommentar
Auf anderen Seiten teilen

Namen spielen überhaupt keine Rolle wenn du (in Variablen, Listen etc.) Objekte speicherst.

Ein Objekt wird dir zwar (zur Identifizierung) mit seinem Namen angezeigt. Aber gespeichert wird die Objekt-ID. Du erkennst es daran, dass sich Namensänderungen am Objekt selber sofort auch in deiner EV widerspiegeln. Die Objekt-ID wird dir nicht angezeigt. Aber das Objekt wird auf der Anlage durch Rahmen und Gismo hervorgehoben.

Die Schreibweise mit dem $-Zeichen vorweg ist die Objektreferenz in Lua Schreibweise. Lua selbst kennt diese Schreibweise natürlich nicht. Aber Lua ist nur der Übermittler. Und wenn du nur das $-Zeichen schreibst und dann ein Objekt aus der Liste auswählst, dann steht (versteckt) im Code auch die richtige ID zum Objekt.

 

Für wiederholte Aktionen gibt es den Timer. Der Ablauf eines Timers wird als Ereignis gewertet. Und ein Timer kann sich selbst neu starten. Das entspricht in etwa der EEPMain(), ist aber vielseitiger. Erstens bestimmst du selbst den Takt. Zweitens kannst du mehrere Timer parallel betreiben. Drittens kann jeder dieser Timer individuell gestartet und gestoppt werden. Und viertens kann man einen gestoppten Timer zu einem späteren Zeitpunkt wieder starten.

Ein Beispiel findest du in meiner Anlage BremsProbe 02. Da frage ich mittels Timer im Abstand von 2 Sekunden nach, ob der Zug schon steht. Wenn die Bedingung erfüllt ist, dann gebe ich die Position der Lok aus und halte den Timer an. Und die Anlage enthält noch weitere nützliche Tricks, wie die Übertragung von Texten an Beschriftungsfelder.

 

Ein Gleis ist eine Weiche, wenn die Eigenschaft "Weichenstellung" existiert. Die Existenz einer Variable oder Eigenschaft kannst du als Bedingung angeben.

 

Weichen sperren kannst du nicht. Aber du kannst das Aufschneiden verhindern. Und auf ein Umstellen der Weiche kannst du reagieren (und z.B. die Weiche bei Nichterfüllung deiner Bedingungen wieder zurück schalten.) 

Bearbeitet von Goetz
Schreibfehler korrigiert
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 28 Minuten schrieb HaNNoveraNer:

Dabei ist Gleis doch der Name des Gleisobjekts und nicht die ID?

Nein, weder noch.

Gleis ist nur eine Variable. Entscheidend ist, was du an diese Variable übergibst.

In meinem Beispiel sind das die Objekte aus der Liste t.

local t = {$("Gleis 1"), $("Gleis 2"), $("Gleis 3")}
for i, Gleis in ipairs(t) do
  if #layout:getVehiclesOnTrack(Gleis) > 0 then
    Gleis.variables["GBS"].state = 2
  else
    Gleis.variables["GBS"].state = 0
  end
end                   

 

Bearbeitet von Goetz
Codebeispiel hinzugefügt
Link zu diesem Kommentar
Auf anderen Seiten teilen

Jaja, aber Du hast die Objekte MANUELL umbenannt:

("Gleis 1"), $("Gleis 2"), $("Gleis 3")

Normal heißen die Gleise nach dem Einsetzen alle gleich.
Dann würde das stehen ("5201","5201","5201"). Das wäre unübersichtlich.

Meine Frage bezog sich aber auf die direkte Abfrage EINES Gleises, ohne umbenennen mit dem Lua Befehl.

 

Bearbeitet von HaNNoveraNer
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Minuten schrieb HaNNoveraNer:

Normal heißen die Gleise nach dem Einsetzen alle gleich.
Dann würde das stehen ("5201","5201","5201"). Das wäre unübersichtlich.

Unübersichtlich nur für dich, nicht fürs Programm. Wie Götz bereits ausführte wird das Objekt im Code (für dich nicht sichtbar) referenziert. Wenn du Lua-Code eingibst und das $-Zeichen setzt, bringt der Editor direkt ein Auswahlfenster auf den Schirm, das alle Objekte enthält. Daraus kannst du das richtige auswählen. Da alle Gleise zunächst mal denselben Namen haben, musst du dein Gleis entweder vorher umbenennen oder du musst genau hinsehen, bei welchem Gleis der Gismo auf dem Gleis steht, welches du auswählen willst. Um mehr musst du dich nicht kümmern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Wichtigste hat Timba alles schon exzellent beantwortet.

Deshalb habe ich nur noch eine Anmerkung hierzu;

vor 21 Minuten schrieb HaNNoveraNer:

Meine Frage bezog sich aber auf die direkte Abfrage EINES Gleises

Wenn du dieses eine Gleis nicht mit einem Namen versiehst, der es eindeutig identifiziert, dann musst du es trotzdem irgendwie deinem Code zuweisen. 

Für deine eigene Anlage triffst du diese Zuweisung, indem du das Gleis entweder direkt oder in einer Auswahlliste anklickst. Damit ist es eindeutig benannt, auch wenn der Name dir diese Eindeutigkeit nicht zeigt. Fertig

Willst du einen generischen Code schreiben, dann musst du irgendwelche Faktoren haben, anhand derer du das richtige Gleis erkennen kannst. Diese Merkmale können alles mögliche sein: Eine Objektvariable, ein Schlagwort oder eine andere Eigenschaft (Position, Drehung ...) die du per Skript prüfen kannst. Mit diesem Merkmal kannst du zu Beginn alle Gleise abklappern und Objekte, welche deine Kriterien erfüllen, in eine Liste übertragen. Diese Liste wird die Objektadressen enthalten, nicht die Objektnamen. Jetzt hast du auf einer beliebigen Anlage die Gleise identifiziert, für die deine Aktion ausgeführt werden soll. 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Für weitere Funktionen in dem Fahrstrassenmodul, daß ich gerade baue, benötige ich folgendes:

s="FSSig0001"

local s2=$(s).variables["fahrstrassen"]

Das gibt aber einen Fehler. Wie kann ich eine Variable im Objekt ansprechen, wenn ich den Objektnamen nur als string habe?

P.S. Habs gerade gefunden:

local signal=layout:getEntityByName(s)
local s2=signal.variables["fahrstrassen"]

Bearbeitet von HaNNoveraNer
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...