Jump to content

Objektvariablen auslesen


fzonk

Empfohlene Beiträge

Hallo an Alle,

Ich habe eine sehr spezielle Frage. Ich habe Gleisen Objektvariablen vergeben und möchte dass die darauf fahrenden Züge diese Variable auslesen und dem Wert entsprechend reagieren. Soweit kein Problem.

Jetzt zu meinem Problem. Bei Ereignis habe ich: „ Zug/Fahrzeug betritt ein Gleis/ einen Straße“ Bei Fahrzeug das entsprechende Fahrzeug und nun die große Frage, was muss ich bei Gleis/Straße als Benutzerdefiniert eingeben, damit das Fahrzeug jedes Gleis auf die entsprechende Variable prüft. Lasse ich Gleis/Straße einfach auf „[leer]“ funktioniert es nicht, gebe ich ein entsprechendes Gleis (mit hinterlegter Variable) ein funktioniert es, aber ich will ja nicht jedes Gleis einzeln benennen, sondern dass jedes Gleis überprüft wird.

Ich hoffe es gibt eine Möglichkeit und mir kann jemand helfen.

Vielen Dank Frank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @fzonk

Ich habe da schon so viel durchgespielt, aber offensichtlich gibt es leider absolut keine Möglichkeit irgendetwas Indirektes oder komplett Allgemeines im Ereignisteil unterzubringen. ALLE Fahrzeug *und* ALLE Gleise, das geht bei Geschwindigkeit setzen, aber sonst ?!?
Wenn überhaupt, mußt Du versuchen im Ereignis einen kurzlebigen Countdown unterbringen und alles andere in die Bedingung verlagern. Den Countdown ('Abklapperticker") setzt Du dann beim initialen Anfangsereignis nach Starten der Anlage (ich vermisse da eine Systemvariable, die besagt, dass das Programm soeben geladen wurde...) und zwar gleich auf Restart. Wie auch immer, das Ding wird einiges an Performance kosten. Da müssen wir brav auf V5 warten, dann kriegen wir wohl auch Loops und Indizes. Solange müssen wir wirklich alles einzeln überprüfen. Ich habe da auch zig riesige Listen drin.
Wäre niemand glücklicher als ich, wenn da doch noch eine Lösung eintrudelt.

Gruß Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Andy,

Ich arbeite gerade an zwei Möglichkeiten, dazu habe ich ein Beispiel angehangen. Bei diesem soll (als Beispiel) der Blinker an Kreuzungen gesetzt werden und danach wieder ausgeschaltet werden.

Bei Möglichkeit 1 habe ich den Fahrzeugen eine Objektvariable „Fahrtrichtungsanzeiger“ gegeben, wenn „LKW 01“ oder „LKW 02“ das Gleis „002“ betritt fragen die Fahrzeuge die Weichenstellung (Gleis „001“) ab, je nachdem welche Stellung diese hat wird die Objektvariable gesetzt. Das (ggf.) Ändern der Objektvariable (Links/Rechts) startet dann die Animation (Fahrzeug blinkt). Nach der „Kreuzung“ (betreten von Gleis „102“ oder „202“) wird die Variable auf „Aus“ gesetzt und die Animation gestoppt. Diese Möglichkeit funktioniert ohne Probleme.

Als alternative Variante habe ich dann Möglichkeit 2 versucht. Bei dieser hat das Gleis „002“ eine Objektvariable („Blinker“) durch das schalten der Weiche wird dieser (dem Gleis) ein neuer Wert zugeordnet (Rechts/Links/Aus). Durch das betreten des „LKW 03“ soll der Variablenzustand des Gleises abgefragt werden und damit die entsprechende Animation starten/stoppen. Dies funktioniert aber eben nur wenn bei betreten Fahrzeug und Gleis definiert sind. Mein Ziel ist aber nur das Fahrzeug zu definieren. In dem angehangenen Beispiel habe ich das Gleis in der EV noch definiert („002“) gelassen. Theoretisch sollte bei „LKW 03“ mit betreten der Gleise „102“ oder „202“ die Animation getoppt werden, da diese auch die Variable „Blinker“ besitzen.

Wenn sich jetzt jemand Fragt warum ich das Ganze mache. Ich suche einen Weg wie ich Aktionen auslösen kann mit wenig EV aufwand. Bei Möglichkeit 1 muss jedes aktionsauslösende Gleis in der EV definiert werden, was viele Zeilen in der EV bedeutet. Bei Möglichkeit 2 müssen „nur“ die entsprechenden Gleise mit einer Objektvariable versehen werden.

Vielleicht findet ja noch jemand eine Lösung wie ich bei Möglichkeit 2 nicht jedes Gleis in der EV definieren muss. Einfach die Fahrzeuge in Fahrtrichtung auf die Straße setzen und eine Geschwindigkeit setzen (ich empfehle nicht schneller als 50 km/h).

Gruß Frank

Objektvariablen.mbp

Bearbeitet von fzonk
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Frank,

ich hätte es zwar nicht gedacht - aber es geht:
Man kann auch bereits beim Auslöser eine Referenz angeben, die sich auf die Trigger-Werte des Ereignisses beziehen.

Laut Wiki referenziert beim Ereignis "Lok betritt Gleis" (gilt natürlich auch für Straßen) "_Trigger1" die Lok des einfahrenden Zuges und "_Trigger2" das befahrene Gleis.

Ereignis.jpg.aaa509ae17f2c54b771bb5a5739ef349.jpg

Wenn man nun beim "Ereignis" als "Gleis" den benutzerdefinierten Wert "$_Trigger2._Name" spezifiziert, bezieht sich dieses Ereignis bei der Auslösung immer genau auf jenes Gleis, das gerade vom Zug betreten wird. Man kann also - ohne das Gleis explizit zu benennen - diese Ereignisdefintion für beliebig viele Gleise anwenden (genau genommem wird sie für jedes betretene Gleis ausgeführt).

Aktion.jpg.baff048a7690617ef7792f14d1202817.jpg

Damit ist es dann natürlich auch möglich, im Aktionen-Teil über "_Trigger2" auf diesem Gleis zugeordnete Objektvariablen zuzugreifen.

Bedingung.jpg.f18fc206a3cca540b2d30314f915ecc5.jpg

Da dieses Ereignis wirklich bei jedem Gleis, das "betreten" wird, ausgelöst wird, sollte man sicherheitshalber die damit verbundenen Aktionen dahingehend absichern, dass man ihre Ausführung von der Bedingung abhängig macht, ob die auszuwertende Objektvariable für das auslösende Gleis überhaupt exstiert. Das macht man mit obiger Bedingung, wobei man die Objektvariable auf die "leere Zeichenkette" (die Variable enthält keinen Text) abfragt.

Im obigen Beispiel habe ich auch eine Aktion definiert, wenn die Variable nicht existiert (Bedingung erfüllt). Deshalb wird die Variable im zweiten Bild im Fenster für die alternativen Aktionen (Bedingung nicht erfüllt) ausgewertet.

Anbei noch die kleine Demo-Anlage, mit der ich das obige Verhalten verifiziert habe:

Variables Gleis als Auslöser.mbp

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @BahnLand,

auch ich kann mich @Andy nur anschließen, ganz ganz großer Respekt (y)(y)(y)

Ich habe auch versucht mit Trigger etwas hinzubekommen, aber auf die Idee „_Name“ bin ich nicht mal im Ansatz gekommen. Wo zauberst du nur immer wieder die Ideen und das Wissen her??? Denn genau dies Vervollständigt meine Idee der Steuerung.

Hochachtungsvoll

Frank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,
das eröffnet nun tolle Möglichkeiten, da wir nun anstelle von sich immer wiederholenden Ereignissen in der EV diese in Objektvariablen hinterlegen können. Das ist ein Meilenstein für die Programmierung und nimmt Druck von Neo! Man wird sehen, ob die Performance darunter leidet, was nicht zwangsläufig sein muß.

Die gesamte Menge der Variablen wird sich damit aber erhöhen - was im Prinzip nicht tragisch ist. Aber: Mit ziemlicher Sicherheit wird nun der Wunsch kommen: "Zeige mir alle Gleise, die die Objektvariable 'istBremsgleis' besitzen". Da hierfür die Selektionsbox nichts taugt, könnte eine farbliche Überlagerung einer solchen Auswahl nötig werden.
Ich denke, da müssen wir uns auch frühzeitig Gedanken drüber machen.

Nachtrag:
Was jetzt schön ist, ist folgende Situation:
In den Tutorials können kleine 'Anlagen' eingestellt werden, die bei Bedarf einkopiert werden können und bei denen der Anlagenbauer nur noch bei den  Objekten seiner Wahl eine Objektvariable einfügen muß, um die Funktion dort auszulösen. Er muß diese nicht mehr direkt in der EV programmieren.

Grüße
  Andy

Bearbeitet von Andy
Nachtrag
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo an Alle,

ich habe mal noch etwas weiter mit den Objektvariablen gespielt. Mir ist so in den Sinn gekommen, warum jede Geschwindigkeitsänderung in der EV als extra Befehl schreiben. Also habe ich mir gedacht dass die Lok die entsprechende Geschwindigkeit aus dem jeweiligen Gleis, was sie betritt, auslesen soll und somit die vorgegebene Geschwindigkeit umsetzen soll.

Nach dem @BahnLand mir die Lösung mit dem X-beliebigen Gleisauslesen gegeben hat habe ich etwas weiter „herumgespielt“. Unterm Strich bin ich in der EV auf drei Befehle gekommen, die jeder beliebigen Lok ihre Geschwindigkeit gibt. Die größte Herausforderung war die Lok wieder in Bewegung zu setzten wenn sie einmal gestoppt wurde, aber auch dafür habe ich eine Lösung gefunden, sie hat nur noch ein Harken, sie ist mit einem selbständigen endlosen Countdown verbunden, solang die Variable 0 besitzt, öffnet man die EV und schließt sie wieder mit „OK“ verliert sich leider der Countdown, warum auch immer dies so ist. Schaut man in die EV und schließt sie mit „abbrechen“ läuft er weiter.

Ich habe ein kleines Beispiel angehangen:

Zur Erklärung: Beim betreten der grünen Gleise soll die Lok auf 100km/h beschleunigen, beim betreten der gelben Gleise auf 50km/h drosseln. Beim betreten des roten Gleises kommt es auf die Schalterstellung an. Ist dieser geschlossen hält die Lok an wird dieser geöffnet (oder ist geöffnet) bekommt die Lok eine Geschwindigkeit von 100 km/h vorgegeben.

Ihr könnt nun jede beliebige Lok aus dem Katalog auf die Anlage setzen und sie wird dasselbe Verhalten wiedergeben (nachdem man ihr einmalig manuell eine Geschwindigkeit gegeben hat). Ihr könnt auch jedem Gleis eine Objektvariable namens „Speed“ geben und eine individuelle Geschwindigkeit hinterlegen. Auch die Geschwindigkeit „0“ könnt ihr jedem beliebigen Gleis geben. Die EV erstellt selbständig einen entsprechenden Countdown zur Überwachung wann die Geschwindigkeit wieder geändert wurde (idealer weiße auf das Gleis gehen und dort die Objektvariable ändern, da über die EV besagtes Problem mit dem Abbruch des Countdowns besteht).

 

Unterm Strich, drei Befehle in der EV und ganz viele Möglichkeiten…

Gruß Frank

Geschwindigkeiten mit Objektvariablen.mbp

Bearbeitet von fzonk
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

das mit dem Setzen von Geschwindigkeiten ist wirklich eine riesige Erleichterung jetzt! Und soviele andere Dinge sind jetzt möglich. Verlinkte Blöcke etc.

Ich hab z.B. was: (angehängtes Beispiel)

Die Lok besitzt jetzt eine 'globale' Fahrtrichtung FR. 1 = links 2 = rechts. Ist in der Lok hinterlegt.
Die grünen Wendegleise in de Schleifen schalten diese globale Fahrtrichtung um.

Dann haben wir einen kleinen Bahnhof. Das blaue Gleis ist die linksseitige Ein- und Ausfahrt, das gelbe Gleis die rechtsseitige.
Im blauen Gleis ist der Blockname hinterlegt und die FR 2 (Einfahrt mit globaler(!) Fahrtrichtung rechts!). Im gelben Gleis der Blockname und die FR 1.
Nun brauchen wir für die Datenspeicherung keine Variable mehr, sondern brauchen auch ein Objekt.
Nehmen wir den kleinen Lummerland-Bahnhof als Blockobjekt, in dem das 'belegt'-Resultat hinterlegt wird!

Alles, was der Anlagenbauer nun tun müßte, wäre einfach das Beispiel in seine Anlage einzukopieren. Wobei die EV sowieso gleich reinkommt und den Rest kann er weglassen (sofern es überhaupt einen Rest gibt). Und dann müßte er nur noch Gleise, Loks und das Blockobjekt mit Daten füttern, aber gar nicht mehr 'programmieren'.
Und so ein 'EV-Modul' bräuchte nicht viel Beschreibung.

Was wir 'Modul'-übergreifend machen müßten, wäre das Festlegen einiger Konstanten und Bezeichnungen, in diesem Fall wohl 1 für globales Links, 2 für globales Rechts, (man könnte für die belegt-Meldung dann auch noch "3 = Waggons ohne Loks" festlegen. Oder eben "FR" für die globale Fahrtrichtung.

Grüße Andy

belegt und Wende-Beispiel.mbp

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die eigentliche Blocksteuerung meiner Anlage ist dank diesen Erkenntnissen von 3580 auf 200 XML-Auswerterzeilen geschrumpft!
Und diese Komponenten sind nun wiederverwendbar, da unabhängig von real existierenden Gleisen und Signalen!

Grüße
  Andy

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