[erledigt] Start-Ziel Tasten

Post Reply
skippa
Posts: 383
Joined: 28.02.2010, 19:03

[erledigt] Start-Ziel Tasten

Post by skippa » 30.11.2015, 20:14

Hallo,

ich bin total begeistert von den neuen Möglichkeiten, die sich durch xml-scripting ergeben. Das ist sicherlich die mächtigste Programmerweiterung der letzten Jahre. :rr_for_ever:

Wollte man auf meinem kleinen Bahnhof früher vollständig innerhalb des Rocrail-Konzepts Betrieb machen, war das doch recht kompliziert. Eine wilde Mischung aus (per Maus ausgelösten) gotoblocks, swap, Fahrplan ... man musste sich schon gut mit Rocrail und meinem Plan auskennen, um den Bahnhof sinnvoll bedienen zu können, vor allem, wenn man nicht nur Zugfahrten, sondern auch Rangierfahrten machen wollte. Beim letzen Fahrtreffen mit Freunden hat sich das dann auch gleich gerächt: in der der ersten Session bediente jemand den Bahnhof, der sich mit Rocrail nicht auskannte und ständig musste ich korrigierend eingreifen. In der zweiten Session dann jemand, der Rocrail kennt (nur meinen Bahnhof nicht), da ging es schon besser.

Das sollte so nicht sein. Ich habe deshalb für den Bahnhof (analog zum Vorbild) Start-Ziel-Tasten mittels xml implementiert. Also so etwas wie die manuellen Fahrstraßen http://wiki.rocrail.net/doku.php?id=manual-routes2-en, nur nicht mit Fahrstraßen, sondern komplett zur Steuerung eines automatischen/halbautomatischen Modus mit Blöcken/Fahrplänen/Zielen.
Abhängig von der gewählten Knopfkombination (firstButton/secondButton) werden nun die richtigen Fahrpläne bzw. Zielblocks der Lok im Block mit dem Startknopf zugewiesen. Etwas komplizierter wurde es dabei beim virtuellen Block, doch auch das ging. Um das script etwas fehlertolerant zu gestalten, werden nicht erlaubte Kombinationen bzw. Kombinationen ohne Funktion kurz, d.h. für eine Sekunde auf rot (co cmd="active") geschaltet. Außerdem wird für die im StartBlock befindliche Lok gleich in die richtige Richtung gedreht (mittels swap) und sicherheitshalber auf Vorwärts gedreht.
Jetzt müssen nur noch die Block- und Fahrstraßenberechtigungen stimmen, und der Benutzer muss sich um all diese Dinge keine Gedanken mehr machen.
Nur noch Startknopf drücken, Zielknopf drücken und den Rest macht rocrail. :beer:

Für wen's interessiert hänge ich die Scripte, die Plandatei sowie die svg's an.

Gruß,
Jens
Attachments
Start-Ziel-Tasten.zip
(15.36 KiB) Downloaded 34 times

StefanF.
Moderator
Posts: 2708
Joined: 27.10.2008, 21:40
Location: Hamburg/Germany

Re: [erledigt] Start-Ziel Tasten

Post by StefanF. » 30.11.2015, 20:38

Hallo Jens,
schaue ich mir Morgen mal an. Ich habe so was ja mal Anfang des Jahres ohne Skript, nur mit Aktionen gebastelt und ins Wiki gestellt.
http://wiki.rocrail.net/doku.php?id=stfmanroutes-en Als Beispielplan. Vielleicht können wir Deine Skripte ja benutzen, um diesen Beispielplan auch damit darzustellen.
Beste Grüße
Stefan

StefanF.
Moderator
Posts: 2708
Joined: 27.10.2008, 21:40
Location: Hamburg/Germany

Re: [erledigt] Start-Ziel Tasten

Post by StefanF. » 01.12.2015, 08:21

Moin Jens,
da habe ich wohl noch ein wenig zu lernen. Ich komme nach einer halben Stunde testen nicht zurecht. Der Plan und die Symbole werden angezeigt. Die Skriptpfade habe ich auf meine Testumgebung angepaßt, eine Lok habe ich angelegt, Lok in den Block SyG2bahnsteig gesetzt und StartZieltasten nach SysFlens gedrückt. Der Anzeigetext LabelStartZielSonneby wird entsprechend gefüllt, aber mehr auch nicht. Keine Weiche gestellt und keine Fahrstrasse ausgewählt. Ich mach jetzt erstmal eine Pause. Ach so, die Fahrpläne fehlen komplett (Modulplan?).
Daran wird es dann wohl liegen, dass der Test nicht klappt. Oder habe ich was übersehen.
Beste Grüße
Stefan

skippa
Posts: 383
Joined: 28.02.2010, 19:03

Re: [erledigt] Start-Ziel Tasten

Post by skippa » 01.12.2015, 09:33

Moin Stefan,

oh ja, Du hast Recht. Die Routen und Fahrpläne sind in der rt.xml, und die habe ich vergessen, beizulegen.
Ich dachte, ich beschränke die Dateien aufs nötigste. Da hab ich zu weit beschränkt. Soll ich die anderen Module auch noch dazu tun?

Zur Bedienung muss man dann noch verstehen, dass die Blöcke SyKi und SyFlens nur für Rangierfahrten sind. Züge von und zur Strecke benutzen die Blöcke auf den Nachbarmodulen. Die Routen dorthin haben die entsprechend als kreuzende Blöcke eingetragen.
Am deutlichsten lässt sich das an den beiden "We" Blöcken erkennen: WeAnst wird über SyKi geroutet und WeHp direkt von Gleis1 bzw Gleis2.
...wenn Mann denn die Routen und Fahrpläne nachvollziehen kann ;-)
Heute abend kommen sie

Jens

skippa
Posts: 383
Joined: 28.02.2010, 19:03

Re: [erledigt] Start-Ziel Tasten

Post by skippa » 01.12.2015, 17:55

Moin Stefan,

so, jetzt noch einmal anbei die kompletten Dateien incl. aller Module und rocrail.ini. So wie's jetzt im ZIP ist, läuft es bei mir komplett virtuell als Workspace. Du solltest also keine Anpassungsschwierigkeiten haben.
Die Start-Ziel Tasten funktionieren erst in Sonneby (oberstes Modul) durchgängig. In den anderen Modulen scripte ich noch ;-)

Viel Spaß beim ausprobieren!

Gruß,
Jens
Attachments
rocrail@SonnebyWorkDir2015-12-01.zip
(93.2 KiB) Downloaded 30 times

skippa
Posts: 383
Joined: 28.02.2010, 19:03

Re: [erledigt] Start-Ziel Tasten

Post by skippa » 02.12.2015, 22:02

Hallo zusammen,

ich habe das ganze jetzt noch einmal für ein einfacheres Beispiel, eine kleine Ausweich-Anschlussstelle, zusammengestellt.
Ich hoffe, ich habe die Dateien von jedem unnötigen Ballast befreit und gut genug kommentiert, so dass sie leicht zu verstehen sein sollten.
Einfach die zip irgendwohin entpacken und als workspace öffnen.
Eiderhafen-Layout.png
Eiderhafen-Layout.png (9.18 KiB) Viewed 279 times
Viel Spaß beim rangieren mit Start-Stop-Tasten!

Gruß,
Jens
Attachments
EiderhafenStartStop.zip
(21.64 KiB) Downloaded 46 times

Per
Posts: 688
Joined: 11.01.2012, 13:11
Location: FFM

Re: [erledigt] Start-Ziel Tasten

Post by Per » 03.12.2015, 14:22

Hi Jens,

ohne mich durch die ganzen Scripte zu wühlen ein Vorschlag zur leichteren Wartung.
Statt

Code: Select all

<!-- Zuweisung erster Schalter -->
<if condition="#firstButton = 0">
	<then> 
		<switch var="%callerid%">
			<case val="StartZielEhStrecke">
				<vr id="firstButton" text="%callerid%" value="1"/>
			</case>
			<case val="StartZielEhAbstell">
				<vr id="firstButton" text="%callerid%" value="2"/>
			</case>
			<case val="StartZielEhDurchgang">
				<vr id="firstButton" text="%callerid%" value="4"/>
			</case>
			<case val="StartZielEhUmfahrung">
				<vr id="firstButton" text="%callerid%" value="8"/>
			</case>
			<case val="StartZielEhHaltepunkt">
				<vr id="firstButton" text="%callerid%" value="16"/>
			</case>  
		</switch>
		<tx id="LabelStartZiel" format="gewählter Startknopf: @firstButton"/>	
	</then>
<!-- Zuweisung zweiter Schalter -->
	<else>
		<switch var="%callerid%">
			<case val="StartZielEhStrecke">
				<vr id="secondButton" text="%callerid%" value="1"/>
			</case>
			<case val="StartZielEhAbstell">
				<vr id="secondButton" text="%callerid%" value="2"/>
			</case>
			<case val="StartZielEhDurchgang">
				<vr id="secondButton" text="%callerid%" value="4"/>
			</case>
			<case val="StartZielEhUmfahrung">
				<vr id="secondButton" text="%callerid%" value="8"/>
			</case>
			<case val="StartZielEhHaltepunkt">
				<vr id="secondButton" text="%callerid%" value="16"/>
			</case>
		</switch>				
		<tx id="LabelStartZiel" format="gewählter Zielknopf: @secondButton"/>
	</else>
</if>
würde ich

Code: Select all

<!-- Zuweisung ID -->
<switch var="%callerid%">
	<case val="StartZielEhStrecke">
		<vr id="VButton" text="%callerid%" value="1"/>
	</case>
	<case val="StartZielEhAbstell">
		<vr id="VButton" text="%callerid%" value="2"/>
	</case>
	<case val="StartZielEhDurchgang">
		<vr id="VButton" text="%callerid%" value="4"/>
	</case>
	<case val="StartZielEhUmfahrung">
		<vr id="VButton" text="%callerid%" value="8"/>
	</case>
	<case val="StartZielEhHaltepunkt">
		<vr id="VButton" text="%callerid%" value="16"/>
	</case>  
</switch>
<if condition="#firstButton = 0">
<!-- Zuweisung erster Schalter -->
	<then> 
		<vr id="firstButton" text="@VButton" value="#VButton"/>
		<tx id="LabelStartZiel" format="gewählter Startknopf: @firstButton"/>	
	</then>
<!-- Zuweisung zweiter Schalter -->
	<else>
		<vr id="secondButton" text="@VButton" value="#VButton"/>
		<tx id="LabelStartZiel" format="gewählter Zielknopf: @secondButton"/>
	</else>
</if>
nehmen. Damit hast du das ganze Case-Construkt nur einmal und es ist leichter angepasst.

Benötigst du den Value noch an anderer Stelle als in Zeile 13 und 99 / ScriptStartZielEiderhafen.xml? Falls nicht (ich habe nix gefunden), kannst du es eh weglassen und nur auf Text abfragen (siehe unten) bzw. allen den gleichen, von 0 verschiedenen Value geben. Damit bist du den Case-Kunstrukt auch los.

Da ich die Buttons nicht testen kann, eine kleine "Aufgabe" für dich: was passiert, wenn ich zwei Zielknöpfe (gleichzeitig oder nacheinander innerhalb der Zeit) drücke?

Schau mal diese Lösung an:

Code: Select all

<if condition="@firstButton # x">
<!-- Zuweisung erster Schalter -->
	<then> 
		<vr id="firstButton" text="%callerid%" />
		<tx id="LabelStartZiel" format="gewählter Startknopf: @firstButton" />
	</then>
<!-- Zuweisung zweiter Schalter -->
	<else>
		<if condition="@secondButton # x">
			<vr id="secondButton" text="%callerid%" />
			<tx id="LabelStartZiel" format="gewählter Zielknopf: @secondButton" />
<!-- Zielauswahl wenn zwei Schalter aktiv-->
<!-- if condition="#firstButton > 0|#secondButton > 0" alltrue="true" fällt weg, weil schon im secondButton-Zweig-->
			<switch var="@firstButton">
				<!-- von Eh Strecke -->
				<case val="StartZielEhStrecke">
<!-- hier kommt das Case Konstrukt für die Fahrpläne hin, wollte nicht alles kopieren.
...
...
...
-->
				</case>				
				<!-- keine erlaubte Schalterkombination -->
				<default>
					<co id="@firstButton" cmd="active"/>
					<co id="@secondButton" cmd="active"/>
					<sleep time="1000"/>
				</default>
			</switch>
			<!-- switch off selection buttons and reset variables-->  	
			<co id="@firstButton" cmd="off"/>
			<co id="@secondButton" cmd="off"/>
			<vr id="firstButton" text="x" />
			<vr id="secondButton" text="x" />

<!--- hier geht der "alte" Teil weiter -->
		</if>
	</else>
</if>
Den unteren doppelten Case-Konstrukt kannst du auch auflösen, indem du Start- und Ziel-Variable addierst (tokeniser). Bringt hier aber nicht so viel.

Code: Select all

<vr id="VCase" text="@firstButton_@secondButton" tokeniser="_" />
<switch var="@VCase">
	<!-- von Eh Strecke -->
	<case val="StartZielEhStrecke_StartZielEhDurchgang"> 
		<!-- von Eh Strecke nach Eh Durchang -->
		<vr id="selectedBlock" text="EhStrecke"/>
		<vr id="travelDirection" text="minus"/>
		<vr id="selectedDestination" text="EhDurchgang"/>
		<call id="StartGotoblock"/>	
	</case>	
	<case val="StartZielEhStrecke_StartZielEhHaltepunkt">
		<!-- von Eh Strecke nach Eh Haltepunkt -->
		<vr id="selectedBlock" text="EhStrecke"/>
		<vr id="selectedSchedule" text="_Strecke-Haltepunkt"/>
		<vr id="travelDirection" text="minus"/>
		<call id="StartSchedule"/>	
	</case>							
...
Noch ein kleiner Tipp zur Lesbarkeit: Subs und Funtions bitte nicht mitten in den Code rein, sondern am Anfang oder Ende sammeln.

skippa
Posts: 383
Joined: 28.02.2010, 19:03

Re: [erledigt] Start-Ziel Tasten

Post by skippa » 04.12.2015, 22:33

Hallo Per,

danke für Dein Review. Die Idee, mittels der zusätzlichen Variable die Zuweisung erster/zweiter Schalter zu vereinfachen finde ich gut.

Den zweiten Vorschlag mit Tokeniser nicht so sehr. Das liegt nicht daran, dass ich tatsächlich nicht weiß, wie der Tokeniser funktioniert, sondern daran, dass ich es mit zwei verschachtelte Cases sehr schön übersichtlich finde. Aber so sind die Geschmäcker eben verschieden ;-)
Ich glaube nicht, dass das funktionell einen Unterschied macht.

Die Value-Zuweisung wird hier tatsächlich nicht gebraucht bzw. nur an der einen Stelle. Aber in einer anderen Anwendung könnte es wichtig sein, die Tastenkombination zu kennen. Und die lässt sich durch die bitweise Zuweisung erkennen. Außerdem bin ich noch nicht so firm mit den Text vergleichen :-)

Deine Hausaufgabe ist quasi schon beim schreiben des scripts gelöst. Das Script wird per design zweimal aufgerufen und damit per Definition in einer Reihenfolge. Gleichzeitig geht nicht.
Es funktioniert überhaupt nur, weil die Werte der Variablen systemweit verfügbar sind und zwischen zwei Aufrufen erhalten bleiben. Der erste Aufruf (aktiviert durch drücken eines Buttons) schreibt den "firstButton" und beendet das script nach der Prüfung, ob zwei Buttons aktiv sind. Der nächste gedrückte Schalter ruft das script ja komplett neu auf, erkennt dass es "firstButton" schon gibt und schreibt daraufhin "secondButton". Dann erkennt es auch, dass zwei Buttons gedrückt wurden und startet die Zielauswahlsequenz.

Gruß
Jens

Per
Posts: 688
Joined: 11.01.2012, 13:11
Location: FFM

Re: [erledigt] Start-Ziel Tasten

Post by Per » 05.12.2015, 22:59

Hi Jens,
skippa wrote:Den zweiten Vorschlag mit Tokeniser nicht so sehr.
Kein Problem, ist ja nur ein Vorschlag, und ich habe ja auch geschrieben, dass es HIER nicht viel bringt. Aber vllt. kannst du es mal in anderen Zus'hang gebrauchen.
skippa wrote:Ich glaube nicht, dass das funktionell einen Unterschied macht.
Nein, es sollte ja das gleiche Ergebnis heraus kommen. Natürlich führen (fast) immer mehrere Wege zum Ziel, und jeder hat andere Vorlieben.
skippa wrote:Deine Hausaufgabe ist quasi schon beim schreiben des scripts gelöst. Das Script wird per design zweimal aufgerufen und damit per Definition in einer Reihenfolge. Gleichzeitig geht nicht.
Es ging mir nicht um den ersten + zweiten Aufruf (Start + Ziel), sondern um einen zweiten + dritten (Ziel 1 + Ziel 2). Der wird bei dir nicht abgefangen, bei meinem Vorschlag schon. Die Scripte können nämlich beliebig oft gleichzeitig (naja, quasi, im Rahmen des Multitasking mehrfach halt, bevor das erste beendet ist) aufgerufen werden. Du kannst also auch zwei voneinander unabhängige Fahrstraßen innerhalb der einen Sekunde aufrufen (wenn du schnell genug bist ;)). Oder mit zwei Bedienstellen. Dann kann es aber passieren, dass aus dem zweiten Start das erste Ziel wird. Das wird mit meinem Vorschlag aber auch nicht abgefangen, da wäre der Aufwand größer (am einfachsten pro Bedienstelle ein eigenes Script mit eigenen Variablen "firstButtonXX" und "secondButtonXX").

Post Reply

Return to “XMLScripting (DE)”