Jump to content

Weichen über Objektvariablen schalten


fzonk

Empfohlene Beiträge

Hallo an Alle,

ich habe mal wieder ein sehr spezielles Problem. Ich arbeite gerade an einer sehr großen Anlage wo letztendlich über 100 Züge eingesetzt werden. Der Großteil der Steuerung funktioniert über Objektvariablen und der Trigger-Funktion. Damit spare ich mir sehr viele EV-Einträge. Jetzt bin ich auf ein Problem gestoßen. In den Bahnhöfen und bei der Gleiszuweisung wollte ich die „Weichenstraßen“ auch in Objektvariablen verpacken und über eine Trigger-Funktion abrufen, die Hinterlegung der Variablen soll in etwa so aussehen.

image.jpeg.9cc5597efecea7072a03413f2faabfc3.jpeg

 

Jetzt besteht aber das Problem dass ich die Weichenstellung, im Gegensatz zu dem entsprechenden Gleis, nicht abrufen kann, da die EV bei Position keine Benutzerdefinierte Eingabe zulässt (Optionen: „umschalten“; 0; 1; 2;...). Lasse ich jetzt nur „umschalten“ schalte zwar die entsprechenden Weichen aber eben nicht auf die gewünschte Position.

Ich habe ein Beispiel angehangen, in diesem sind bereits die Objektvariablen in den entsprechenden Schaltern hinterlegt (Erläuterung im Beispielanlage beschrieben). Desweiteren habe ich das Ganze als Beispiel auch mit Geschwindigkeiten setzen hinterlegt, denn dabei funktioniert es ohne Probleme, dass das entsprechende Gleis und die gewünschte Geschwindigkeit als Objektvariable hinterlegt wird.

Ein weiterer Gedanke war dass ich einfach eine Globale-Variable mit dem Gleisname und der Weichenstellung als Wert erstelle. Aber auch diese kann ich nicht über die Trigger-Funktion ansteuern. Wenn ich bei Aktion Variable setzen bei:

Name: $_Trigger1.Weiche01

Wert: $_Trigger1.Weichenstellung01

hinterlege, wird die Objektvariable die den Namen beinhaltet mit dem Wert aus der Stellung überschrieben, aber es wird nicht auf die Globale-Variable zugegriffen.

Ich hoffe es hat jemand eine Idee wie das Problem gelöst werden kann, ohne das ich jede „Weichenstraße“ als einzelnes Ereignis in der EV definieren muss. Vielleicht ist dies aber auch ein Thema was in „Feature-Wünsche“ gehört.

Gruß Frank

Weichen über Objektvariablen schalten.mbp

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schau mal in meiner Anlage. EV->Auftragsbehandlung->Auftragshandler
Aufträge findest Du in Massen, wenn Du die Ebene Auftragsplatten einschaltest (dort die bunten A .... - Schildchen sind).
Links der manuelle Auslöser, dann ein Bezeichnungsschild, die Statusanzeige und schließlich der Auftrag selbst.
Du mußt den Weichensollwert befragen und dann zwei Ereignisse, eins für 0 und eins für 1 machen, anders geht's nicht.

Noch ein Tipp: Ich habe da (siehst Du) bis zu 8 Weichen im Weg. Wenn es jetzt bedeutend mehr als 12 werden sollten, die aber immer nur in einer Richtung behandelt werden, dann splitte das in mehrere Datenbausteine auf. Und greife nacheinander auf die Bausteine zu. Der Grund hierfür ist folgender:
Jeder Zugriff auf Deinen Datenbaustein wird im Normalfall soviele Ereignisse auslösen, wie Du Zustände drin hast (bei Dir also 12). Das ist viel Zeug auf einmal. Genau das ist der Grund, warum dann die Züge irgendwann mal ruckeln. Es geht in der Tat so auf die Performance!
Ich habe z.B. auch meine Fahrpläne jetzt so organisiert, dass ich einen 0,1 sec-Ticker mitfahre, und in jeder Zehntelsekunde nur max. 2 Fahrpläne kontrolliere.

Noch viel spannender wird es, wenn derartige Aufträge 'frei' eintrudeln können, es also auch möglich ist, dass mehrere absolut gleichzeitig eintreffen können.
Wenn dem so ist, müssen wir in die PN.

Ist aber schon interessant, dass Du nun auch an dem Punkt angekommen bist. Das ist doch, was ich behaupte: dass man da früher oder später gar nicht dran vorbei kommt. Von wegen 'wofür braucht man das?'. Da gab's mal 'ne Werbung, da sagt der wichtigste Angestellte zu seinem Chef, 'wir müssen ins Internet'. Der fragt zurück 'warum?'. Der Andere guckt nur doof. Fertig. Und wie ist's gekommen? Aber so isses eben.

Gruß
  Andy

auftrag.jpg

Bearbeitet von Andy
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Andy

ich habe bis jetzt für die Anlage „erst“ zwei Schattenbahnhöfe komplett fertig (incl. Steuerung), diese beiden verwalten die über 100 Züge. Bei der Abfrage der belegten Gleise und Züge habe ich nur eine 1 sekündige Abfrage hinterlegt. Allein diese Steuerung braucht schon so viel Performance das bereits ein ruckeln bei genauen betrachten zu erkennen ist. Des Weiteren habe ich den ersten großen Bahnhof (10 Gleise, beidseitig befahrbar) fertig und sitze an der Steuerung, die Weichenstraße mit 12 Weichen ist die längste „am Stück“ Strecke. Die Objektvariablensteuerung schien mir dabei die einfachste Lösung, aber wie bereits im ersten post beschrieben leider aktuell nicht in einem Befehl umsetzbar. Ich habe da noch andere Ideen zur Steuerung, jedoch bedeuten diese mehr EV Einträge und Zeitaufwand. Na mal sehen wohin mich das Ganze führt. Wahrscheinlich werde ich an der Anlage noch einige Monate sitzen (bisher sind es bereits 3) bis ich sie fertig bekomme.

 

Gruß Frank

Link zu diesem Kommentar
Auf anderen Seiten teilen

Genauso geduldig mußt Du mit der Steuerung umgehen. Hangel Dich über Links an die richtigen Stellen. Lieber mehr kleine Päckchen von Ereignissen, aber diese geschickt verteilen. Jedes Fahrplanobjekt verfügt bei mir über nur 5 Aufträge, bzw. sogar spezielle Anweisungen. Wenn dann noch eine Variable 'next' da ist, gibt es ein weiteres Objekt, in dem die nächsten 5 liegen. So geht's. Die kleinen Leuchtwürfel auf dem Mini-Schaltpult vor jedem Zug melden gelb, wenn Aufträge aus zeitlichen Gründen in die Warteschleife müssen und rot, wenn sie zur Zeit gar nicht möglich sind. Da kann's schon mal ein 'Bing' geben. Wenn sie sich häufen, muß ich den Fahrplan anders setzen. Nur wenn alles perfekt verteilt ist, verspätet sich die Bahn nicht ;)

Gruß
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Frank und Andy

Ihr habt ein sehr interessantes Thema .

 

Für Frank :

Screenshot_1.jpg.27332595b4bf95e6c047e97cf4db4813.jpg

 

Screenshot_2.jpg.bd714b7da8a415b3193674ac2c1074a4.jpg

Frank deine Testanlage habe ich mir heruntergeladen und wollte sehen wie sie funktioniert .

Dabei ist mir aufgefallen das die Schalterstellung immer auf " Umschalten " eingetragen sind . Es gibt doch 24 Schalterstellungen " 0 bis 23 " .

Oder geht das dann nicht mehr , wie Du es vorhast . 

Im zweiten Bild hast Du die neuen Schalter ( von BahnLand ) genutzt , aber ich kann jetzt nicht erkennen welcher Schalter für WAS ist .

Wär es da nicht besser eine Ziffer einzutragen mit ( davor ) Unterstrich , so das man weisst welcher Schalter für WAS ist .

Ich möchte die Hintergründe der Steuerung erkennen und daraus lernen . 

 

Für Andy :

Deine Steuerpult sieht sehr aufwendig auf , wie man das in deinem Bild sehen kann

 

Was meinst du mit den Block/Blöcke in der EV und das es in der Verbindung kommt mit er dann springt ( Beispiel " NEXT " ) .

Dann müsste doch auch ein Rücksprung vorhanden sein , wenn die abgearbeitet ist .

Vorstellung einer verschachtelte Schleife in der Programmierung  .

Ich möchte den Vorgang verstehen , um nachzuvollziehen , wie das abläuft .

Bin ich auf den richtigen Weg , was Du hier meinst ?

 

Viele Grüße

H:xnS

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Hans @h.w.stein-info

vor 8 Stunden schrieb h.w.stein-info:

Dabei ist mir aufgefallen das die Schalterstellung immer auf " Umschalten " eingetragen sind . Es gibt doch 24 Schalterstellungen " 0 bis 23 " .

Zu deiner Frage, die Antwort lautet Ja und Nein. Ja man kann eine bestimmte Stellung definieren, aber genau darin liegt das Problem wenn man mit Objektvariablen und Trigger arbeitet. Die Trigger-Funktion ist nicht nur für ein Ereignis, sondern ein Allgemeingültiges (Dazu weiter unten mehr). Auf meiner Anlage möchte ich ja nicht dass die Weiche nur auf eine Position schaltet, sondern auf die individuell gewünschte Stellung. Je nach dem welchen Weg der Zug abfahren soll. Leider kann ich nicht in den Objektvariablen die Stellung hinterlegen und diese auslesen lassen.

vor 8 Stunden schrieb h.w.stein-info:

Im zweiten Bild hast Du die neuen Schalter ( von BahnLand ) genutzt , aber ich kann jetzt nicht erkennen welcher Schalter für WAS ist .

Das ist mehr oder weniger Absicht. Die Schalter stellen in dem Beispiel nur ein Ereignisauslöser dar, in einer fertigen Anlage gibt es diese Schalter nicht mehr sondern werden durch andere Auslöser ersetzt die dann beispielsweise „Zug betritt Gleis“,  „Variable wird gesetzt“ oder auch „Countdown läuft ab“ sind.

Um ein besseres Verständnis für diese „Bauweise“ zu bekommen habe ich das Beispiel vom Anfang etwas verkleinert und nur den Part mit dem Zug und der Geschwindigkeit übrig gelassen. Vielleicht versuchst du dich erst einmal daran (für den Fall das ich jetzt zu weit zurück gehe entschuldige bitte).

Bei diesem Beispiel gibt es in der EV nur einen Befehl.

Ereignis:

     Schalter wird betätigt

          Schalter: $_Trigger1._Name

          Position: Jede Position

Bedingung:

     Variable besitzt den Wert

          Name: $_Trigger1.Gleis

          Wert:          (kein Eintrag)

          Negieren: Häkchen setzen

Aktion:

     Fahrzeuggeschwindigkeit setzen

          Fahrzeug: [alle Fahrzeuge]

          Gleis/Straße: $_Trigger1.Gleis

          Geschwindigkeit: $_Trigger1.Speed

Dieser Eintrag in der EV ist nun für alle Schalter gültig, die die Objektvariable „Gleis“ beinhalten und sorgt dafür dass der Zug auf dem entsprechenden Gleis die gewünschte Geschwindigkeit bekommt. Das Gleis und die Geschwindigkeit wird nicht mehr in der EV als einzelner Befehl (Eintrag) hinterlegt, was sehr viele Eintragungen in der EV bedeuten würde, sondern werden nun in Objekten (in diesem Beispiel der Schalter) hinterlegt und es gibt nur noch den einen Befehl. Dies macht meiner Meinung nach die EV übersichtlicher. Bei dem Beispiel habe ich zu besseren Darstellung die zusammengehörigen Schalten und Gleise mit derselben Farbe eingefärbt. Die Objektvariablen sind in dem jeweiligen Schalter hinterlegt. Klick einfach einen Schalter an und öffne dann das Objektvariablenfenster (die drei Striche neben dem Verknüpfungs- und Sichtbarkeitssymbol). Dort kannst du sehen welches Gleis (sind Nummeriert) mit welcher Geschwindigkeit angesprochen werden soll, wenn der Schalter betätigt wird. Du kannst gern die Geschwindigkeiten (Speed) in den Schaltern ändern und beim nächsten Doppelklick wird diese an die Lok weiter gegeben. Du kannst auch gern noch mehr Gleise und Schalter auf die Anlage setzten. Dabei ist „nur“ zu beachten das jedes Gleis und jeder Schalter einen einzigartigen Namen haben muss (Namen müssen geändert werden). Wenn du nun einem Schalter ein Gleis zuordnen willst einfach das Objektvariablenfenster des Schalters öffnen und in diesem die zwei Variablen „Gleis“ und „Speed“ anlegen.

1. Anzulegende Variable:

     Name: Gleis

     Wert: (Name/Nummer des Gleises was du ansprechen willst)

2. Anzulegende Variable:

     Name: Speed

     Wert: (gewünschte Geschwindigkeit)

In der EV musst du gar nichts machen, da der vorhandene Befehl die Ereignisse mit verarbeitet. An der Stelle höre ich erst einmal auf, probier dich erst einmal daran. Wenn du möchtest kann ich gern das ganze Thema noch weiter erläutern und was zu beachten ist wenn man nicht mehr mit den Schaltern, sondern mit „Zug betritt Gleis“ oder ähnlichen Ereignissen arbeiten möchtest. Das Thema mit den Weichen würde ich dann ganz weit hinten anstellen, da dies mit der aktuellen Version nur eingeschränkt nutzbar ist.

Viel Spaß beim studieren und probieren

Gruß Frank

Arbeiten mit Objektvariablen Teil 1.mbp

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Stunden schrieb h.w.stein-info:

Dann müsste doch auch ein Rücksprung vorhanden sein

Hallo Hans,
mit Schleifen und Sprüngen ist das in der EV so eine Sache. Das geht nicht so, wie in richtigen Computersprachen.
Aber man kann sowas schon realisieren.

Was richtig Schwierigkeiten macht, ist die Tatsache, dass wir nicht mit Indizes arbeiten können.
Wir können also in ein Objekt keine n Weichen in einem Datenfeld Weiche[1...n] und Weichenstellung[1...n] unterbringen.
Ein Objekt Indirekt anzusprechen geht immer, aber seine Objektvariablen niemals.

Nehmen wir an, wir hinterlegen in den OV eines Objektes 5 Weichenstellungen.
Dann können wir Weiche1...5 mit den Weichenstellung w1...5 schalten. (wenn z.B. nur vier da sind, macht's nix, hat er einen leeren Vorgang).
Das kriegen wir in einem Zyklus der EV hin, aber das sind 5 Ereignisse.
Wie wir in dem anderen Thread gesehen haben, müssen wir auch da Kopfstände machen, weil ein direkter Variablenwert an eine Weiche nicht zuweisbar ist. Aber das macht jetzt mal nix.

Es geht mehr darum: wenn da jetzt 12 Weichenstellungen drin wären, müßten wir schon 12 Ereignisse schreiben.
Jetzt muß die EV in einem Zyklus schon mehr als doppelt so viel arbeiten.
Da mache ich lieber nur 5 rein und gegebenenfalls(!) noch eine Objektvariable 'next' mit dem Wert 'NächstesObjektMit5WeiterenWeichenstellungen'.
Ich kann also in eine Variable 'Weicheninformationen' den Namen eines Objekts hinterlegen, in dem diese 5 Weicheninfos drinstehen. Das kann sogar eine einfache Beschriftung sein. Der Zugriff erfolgt also mit ($Weicheninformation).Weiche1 etc. (WIKI hat im Bereich Variablen mehr Infos dazu).
Wenn jetzt ein ($Weicheninformation).next existiert (Bedingung: Variable besitzt den Wert  ($Weicheninformation).next, Wert leer, negieren)
dann setze nach dem Schalten der Weichen in einer Aktion
Variable setzen: Weicheninformation
Wert: $($Weicheninformation).next

Dadurch wird die Variable Weicheninformation wieder gesetzt, was im nächsten Zyklus das Setzen der dort beschriebenen Weichen auslöst. usw.
Bis kein 'next' mehr drin steht.
Deshalb braucht es auch keinen Rücksprung, hier geht's nur vorwärts, oder endet.
Aber wir haben die nächsten 5 Weichen auf den nächsten EV-Zyklus verschoben und die EV damit entlastet.

Gruß
  Andy

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was so fürchterlich kompliziert aussieht mit dem $_Trigger1._Name, ist total einfach zu verstehen.
Schau in der Wiki mal nach über Trigger/Auslöser (Kapitel 6.1 in der Seite link)

Da steht, dass bei Betreten/Verlassen eines Gleises _Trigger1 (bzw. Auslöser1) das Fahrzeug ist, und _Trigger2 das Gleis.
BahnLand hat halt den Kniff gefunden, dass wenn man dort bei Gleis $_Trigger2._Name einträgt, das wie ALLE Fahrzeuge ALLE Gleise wirkt.
Der Trick funktioniert auch mit Schaltern, Signalen, Weichen. Es ist einfach nur ein Synonym für ALLE, dass er tatsächlich so akzeptiert, denn ALLE direkt mag nicht. Naja, und dann geht's eigentlich herkömmlich weiter. Da ist nichts drin, dass nicht in der Wiki steht.
Gemeinsam mit dem indirekten Zugriff wird das jetzt zu einem mächtigen Werkzeug.
"das Signal, in dem Block, in dem die Lok steht, die den Auftrag behandelt, der gerade von diesem Fahrplan behandelt wird".
Sowas läßt sich ganz sauber programmieren. Ist nur nicht mehr so einfach lesbar. Und wenn ich sowas schreibe, muß ich auch ein paarmal nachkorrigieren, bis ich wirklich das habe, was ich haben wollte.
Hans, wenn das bei Dir richtig Klick macht, (und das ist wie Andocken), wirst Du da auch tolle Möglichkeiten entdecken.
Und nach dem, was Neo bereits geschrieben hat, werden wir uns in V5 dieses Hilfskonstrukt sparen können. Dann geht ALLE ALLE.

Gruß
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Hans und alle andren Interessierten an dem Thema,

vielen Dank für die „Gefällt mir“ und wenn du/ihr weitere Fragen habt helfe ich gern weiter und/oder baue das Thema gern noch weiter aus. Schritt für Schritt. Ich habe es auch nicht von jetzt auf gleich begriffen und konnte sofort alles (und kann auch noch immer nicht alles), ich habe mich auch immer mit kleinen Schritten weiter in dieses Thema vorgetastet. Für den Anfang sollte das obige Beispiel gut als Einstig geeignet sein.

Gruß Frank

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