HaNNoveraNer Geschrieben 27. Januar 2020 Geschrieben 27. Januar 2020 Hi Ich kann Gleis befahren und Gleis verlassen abfragen als Ereignis. WIe kann ich aber den Status Gleis besetzt abfragen? Muß ich mir das aus den beiden Ereignissen oben selber irgendwo merken?
Andy Geschrieben 28. Januar 2020 Geschrieben 28. Januar 2020 Es ist kein Ereignis, aber die Information gibt's bei den Bedingungen: Fahrzeug steht auf Gleis/Straße. Als Fahrzeug kannst Du 'Alle' wählen, dann gibt das Gleis Auskunft, ob es besetzt ist. Gruß Andy
Timba Geschrieben 28. Januar 2020 Geschrieben 28. Januar 2020 Moin @HaNNoveraNer, da du dich ja ohnehin bereits intensiv mit Lua auseinandersetzt kannst du alternativ auch per Lua die Methode layout:getVehiclesOnTrack(name) anwenden. Dann hast du auch gleich die Information, welches Fahrzeug bzw. welche Fahrzeuge auf deinem Gleis stehen. Gruß Timba
Goetz Geschrieben 28. Januar 2020 Geschrieben 28. Januar 2020 (bearbeitet) Hier ist eine kleine Beispielanlage zum Thema: Besetzt Abfrage Demo.mbp 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 ein Klick auf den roten Knopf das Betreten eines bunten Gleises das Verlassen eines bunten Gleises Bearbeitet 28. Januar 2020 von Goetz
HaNNoveraNer Geschrieben 28. Januar 2020 Autor Geschrieben 28. Januar 2020 (bearbeitet) 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 28. Januar 2020 von HaNNoveraNer
Goetz Geschrieben 28. Januar 2020 Geschrieben 28. Januar 2020 (bearbeitet) 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 28. Januar 2020 von Goetz Schreibfehler korrigiert
HaNNoveraNer Geschrieben 28. Januar 2020 Autor Geschrieben 28. Januar 2020 getVehiclesOnTrack(Gleis) Dabei ist Gleis doch der Name des Gleisobjekts und nicht die ID? Wenn ich nun ein Gleis abfragen möchte, was genau den gleichen Namen hat wie 5 andere?
Goetz Geschrieben 28. Januar 2020 Geschrieben 28. Januar 2020 (bearbeitet) 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 28. Januar 2020 von Goetz Codebeispiel hinzugefügt
HaNNoveraNer Geschrieben 28. Januar 2020 Autor Geschrieben 28. Januar 2020 (bearbeitet) 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 28. Januar 2020 von HaNNoveraNer
Timba Geschrieben 28. Januar 2020 Geschrieben 28. Januar 2020 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.
Goetz Geschrieben 28. Januar 2020 Geschrieben 28. Januar 2020 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.
HaNNoveraNer Geschrieben 29. Januar 2020 Autor Geschrieben 29. Januar 2020 (bearbeitet) 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 29. Januar 2020 von HaNNoveraNer
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