User Tools

Site Tools


wiki:user:minou65:skriptfragmente-de

Skriptfragmente

Auf dieser Seite möchte ich euch einzelne Funktionen, ganze Skripte oder nur Fragmente von Skripten vorstellen.

Skripte erstellen

Viele erstellen ihre Skripte mit Notepad++. Eine gute und professionelle alternative zu Notepad++ ist Visual Code. Visual Code läuft praktisch unter allen Betriebssystemen und ist beliebig erweiterbar mit Addons. Der grosse Vorteil ist das Git direkt integriert ist und damit jederzeit eine Versionskontrolle möglich ist.

https://code.visualstudio.com/Download

IntelliSense gibt es für alle gängigen Sprachen, inkl. XML

https://code.visualstudio.com/docs/languages/html

Write-Trace

Wenn man XMLSkripte schreibt, kommt man nicht drum herum mit dem Befehl trace zu arbeiten. Nur so ist ein effizientes debuggen der Skripte möglich. Ist das Skript dann produktiv möchte man vielleicht nicht immer alle trace Befehle aus kommentieren. Später ist man dann vielleicht wieder froh wenn man die trace Zeilen verwenden kann. Meine Funktion Write-Trace verfolgt den Ansatz das via ein Variable relativ einfach und während dem Betrieb definiert werden kann ob und wieviel ins Log geschrieben wird.

Die nachfolgende Funktion jeweils am Anfang eines Skripts einfügen und im Menü Tabellen\Variablen eine Variable XML_TraceLevel wie folgt erstellen

Nun die nachfolgende Funktion in dein Skript einfügen

    <function id="Write-Trace">
        <!--
            Diese Funktion schreibt einen trace ins ServerLog von Rocrail wenn der entsprechende Tracelevel gesetzt ist.
            Im der Tabelle Variablen von Rocrail muss eine Variable xml_Tracelevel manuell erstellt werden. Der Wert muss
            auf einen der nachfolgenden Werte gesetzt sein.
 
            Wenn xml_TraceLevel  
                0 = keine Meldungen
                1 = Errors
                2 = Warnungen
                3 = Infos
                4 = Debug Infos
 
            Version 1.0
 
            History:	
            25.02.2018 andy		Inital Version
 
        -->
        <if condition="#xml_TraceMessage < #xml_TraceLevel|#xml_TraceMessage = #xml_TraceLevel" alltrue="false">
        <then>
            <trace text="@xml_TraceMessage"/>
        </then>
        </if>
 
    </function>

Dein Skript sollte wie folgt aussehen. Durch verändern der Variable xml_TraceLevel werden mehr oder weniger Informationen im Server Log ausgegeben

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript>
 
    <function id="Write-Trace">
        <!--
            Diese Funktion schreibt einen trace ins ServerLog von Rocrail wenn der entsprechende Tracelevel gesetzt ist.
            Im der Tabelle Variablen von Rocrail muss eine Variable xml_Tracelevel manuell erstellt werden. Der Wert muss
            auf einen der nachfolgenden Werte gesetzt sein.
 
            Wenn xml_TraceLevel  
                0 = keine Meldungen
                1 = Errors
                2 = Warnungen
                3 = Infos
                4 = Debug Infos
 
            Version 1.0
 
            History:	
            25.02.2018 andy		Inital Version
 
        -->
        <if condition="#xml_TraceMessage < #xml_TraceLevel|#xml_TraceMessage = #xml_TraceLevel" alltrue="false">
        <then>
            <trace text="@xml_TraceMessage"/>
        </then>
        </if>
 
    </function>
 
    <vr id="xml_TraceMessage" value="4" text="Welcom from Script XY." generated="true" />
    <call id="Write-Trace"/>
 
    <vr id="xml_TraceMessage" value="3" text="Das ist eine Info" generated="true" />
    <call id="Write-Trace"/>
 
    <vr id="xml_TraceMessage" value="2" text="Das ist eine Warnung" generated="true" />
    <call id="Write-Trace"/>
 
    <vr id="xml_TraceMessage" value="1" text="Das ist ein Fehler" generated="true" />
    <call id="Write-Trace"/>    
 
    <vr id="xml_TraceMessage" value="4" text="Good by from Xy" generated="true" />
    <call id="Write-Trace"/>
</xmlscript>

Weichen durchschalten

In Rocrail gibt es die Funktion Betriebsbegin. Trotzdem kann es manchmal notwendig sein alle Weichen mal durchzuschalten. Mit einem einfachen Skript ist dies möglich.

	<!-- Alle Weichen zweimal schalten -->
	<trace text="Startup.xml: Weichen initialisieren"/>
	<foreach table="swlist">
		<sw id="%oid%" cmd="flip"/>
	</foreach>
 
	<foreach table="swlist">
		<sw id="%oid%" cmd="flip"/>
	</foreach>

Das selbe um alle Signale auf Halt zu stellen

	<!-- Alle Signale auf Rot -->
	<trace text="Startup.xml: Signale auf Rot initialisieren"/>
	<foreach table="sglist">
		<sg id="%oid%" cmd="red"/>
	</foreach>

Ein und ausschalten von Lokfunktionen bei der Ein- oder Ausfahrt aus dem Schattenbahnhof

Oftmals möchte man bei der Ein- oder Ausfahrt aus einem Schattenbahnhof Funktion der Lok schalten. Einzige Bedingung für dieses Skript ist das bei allen Loks die selben Funktionsbezeichnungen verwendet werden.

<?xml version="1.0" encoding="UTF-8"?>
<xmlscript>
<!-- 
	Dieses Script schaltet Lokfunktionen ein oder aus
	Dieses Script kann per Aktion in einem block aufgerufen werden um z.b. Funktionen die in einem Schattenbahnhof nicht verwendet werden auszuschalten..
	Im Feld Beschreibung des Aktionsaufrufes ist können folgende Funktionen verwendet werden
			SB_On
			SB_Off
 
	Version 1.1
 
	History:	
	04.09.2016 andy		Inital Version
	08.09.2017 andy     if / then umgestellt auf switch
-->
 
	<switch var="%desc%">
		<case val="SB_On">  
 
			<!-- ABV ausschalten -->
			<fn id="%lcid%" fndesc="ABV" fncmd="on"/>
			<!-- Rangiergang einschalten -->
			<fn id="%lcid%" fndesc="Rangierfahrt" fncmd="on"/>
			<!--trace text="Set-Funktionen.xml: Schattenbahnhofmodus für Lok %lcid% eingeschaltet"/-->
 
		</case>
 
		<case val="SB_Off">  
 
			<!-- ABV einschalten -->
			<fn id="%lcid%" fndesc="ABV" fncmd="off"/>
			<!-- Rangiergang ausschalten -->
			<fn id="%lcid%" fndesc="Rangierfahrt" fncmd="off"/>
			<!--trace text="Set-Funktionen.xml: Schattenbahnhofmodus für Lok %lcid% ausgeschaltet"/-->
 
		</case>
 
	</switch>
 
</xmlscript>

Konfiguration der Aktion inklusive deren Bedingungen im Block

Gleisspannung via Skript ausschalten

Mit folgender Zeile kann die Gleisspannung via Skript ausgeschaltet werden. Dabei ist iid die Zentrale, an welche ein Stopsignal gesendet wird

<sys cmd="stop" iid="dcc-1"/> 

mit diesem Befehl wird an alle Zentralen ein stop gesendet.

<sys cmd="stop" informall="true"/>
wiki/user/minou65/skriptfragmente-de.txt · Last modified: 2018/11/12 08:56 by 127.0.0.1