User Tools

Site Tools


userpages:hermannk:departdelaychange-nl

This is an old revision of the document!


Vertrekvertraging - Verandering

Userpages - Hermann (hermannk)

Deze XML-script oplossing werd aangevraagd door een gebruiker die wat extra tijd nodig had voor de ingebouwde "Vertrekvertraging" van een blok.​

Directe sprong naar de werkruimte download.

Invoering

De waarde "Vertrekvertraging" (in seconden) maakt deel uit van de eigenschappen van een blok. Als de locomotief het "start" -commando krijgt, wordt het snelheidscommando vertraagd met de "Vertrekvertraging"
- waarde (zie Blok - Vertrekvertraging).​

Om speciale redenen moet deze waarde voor bepaalde locomotieven tijdens de looptijd worden verhoogd.
Daarvoor moet de "vertrekvertraging" -waarde van een blok worden aangepast.

<bk id="bk1" departdelay="10"/> \\

De timing is belangrijk! Het zal te laat zijn op het DEPART-event van het blok! Op dat moment wordt de oude "vertrekvertraging" - waarde gebruikt voor uitvoering.
Dus deze oplossing gebruikt
- het IN-event om de nieuwe "vertrekvertraging" -waarde van het blok voor te bereiden en
- de DEPART-event om de "vertrekvertraging" -waarde van het blok terug te zetten naar zijn oorspronkelijke waarde.
Daarmee wordt de nieuwe "vertrekvertraging" -waarde gebruikt voor uitvoering op het moment van het snelheidscommando voor de locomotief.

Om het compleet te maken wordt het XML-script alleen uitgevoerd voor die locomotieven die tot de klasse "DELAY" behoren.

<query vr="vr_ddS_class" table="lclist" id="mylocomotive" get="class"/>
<if condition="@vr_ddS_class = DELAY"> \\
Directe sprong naar de werkruimte download.

Het script uitleggen

- Voorbereidende werkzaamheden
- State IN
- State DEPART
- De waarde van de vertrekvertraging wijzigen

Voorbereidende werkzaamheden

Eerst wordt een oplossing voor een blok met de naam "bk1" getoond. Aan het einde is de algemene oplossing te zien.
Het XML-script krijgt de naam "ac_departdelaySet.xml".
De ID van alle variabelen van dit script begint met de tekenreeks "vr_ddS _".

De nieuwe alternatieve "departdelay" -waarde wordt opgeslagen in de variabele "vr_ddS_delayValue" helemaal aan het begin van het script om het voor een gebruiker gemakkelijker te maken om die waarde te wijzigen. In deze oplossing is er slechts één alternatieve waarde.

<vr id="vr_ddS_delayValue" text="" value="10" generated="true"/>

Omdat dit script op twee verschillende evenementen wordt aangeroepen, wordt het daadwerkelijke evenement opgeslagen in "vr_ddS_state".

<vr id="vr_ddS_state" text="%state%" generated="true"/>

Omdat dit script alleen mag worden uitgevoerd voor locomotieven van de klasse "DELAY", vragen we naar de locomotief-ID en voor de klasse van die locomotief en slaan de waarden op in "vr_ddS_locid" en "vr_ddS_class".

<vr id="vr_ddS_locid" text="" generated="true"/>
<query vr="vr_ddS_locid" table="bklist" id="%callerid%" get="locid"/>
<vr id="vr_ddS_class" text="" generated="true"/>
<query vr="vr_ddS_class" table="lclist" id="@vr_ddS_locid" get="class"/>

Aan het einde van de voorbereiding wordt de variabele voor de nieuwe waarde "vr_ddS_newValue" gewist.

<vr id="vr_ddS_newValue" text="0" value="0" generated="true"/>
<trace text="ac_departdelaySet: begin %callerid% @vr_ddS_state @vr_ddS_locid @vr_ddS_class " />

State IN

Aangenomen wordt nu dat een locomotief van de klasse "DELAY" IN dit blok staat.
De oorspronkelijke waarde wordt opgeslagen in "vr_ddS_orgValue".

    <vr id="vr_ddS_orgValue" text="-1" value="-1" generated="false"/>
    <query vr="vr_ddS_orgValue" table="bklist" id="%callerid%" get="departdelay"/>

De nieuwe waarde wordt voorbereid in "vr_ddS_newValue".

    <vr id="vr_ddS_newValue" value="#vr_ddS_delayValue"/>

State DEPART

Aangenomen wordt nu dat een locomotief van de klasse "DELAY" dit blok VERTREKT.
De oorspronkelijke waarde wordt op dit moment voorbereid in "vr_ddS_newValue".

    <vr id="vr_ddS_newValue" value="#vr_ddS_orgValue"/>

De waarde van de vertrekvertraging wijzigen

Er wordt nog steeds aangenomen dat een locomotief van de klasse "DELAY" dit blok gebruikt.
Het model van het aanroepende blok (%callerid%) moet worden gewijzigd door de nieuwe waarde "#vr_ddS_newValue":

  <model cmd="change">
    <bk id="%callerid%" departdelay="#vr_ddS_newValue"/>
  </model>

Zoals te zien is, wordt het waardekenmerk ("#") gebruikt met "#vr_ddS_newValue" - niet het tekstkenmerk ("@").

Het script (voor een enkel blok)

In eerste instantie werkt deze variant van het script maar voor één blok.
Alle opmerkingen en alle traceerlijnen worden verwijderd:

<xmlscript>
<vr id="vr_ddS_delayValue" text="" value="10" generated="true"/>
<vr id="vr_ddS_state" text="%state%" generated="true"/>
<vr id="vr_ddS_locid" text="" generated="true"/>
<query vr="vr_ddS_locid" table="bklist" id="%callerid%" get="locid"/>
<vr id="vr_ddS_class" text="" generated="true"/>
<query vr="vr_ddS_class" table="lclist" id="@vr_ddS_locid" get="class"/>
<vr id="vr_ddS_newValue" text="0" value="0" generated="true"/>
<if condition="@vr_ddS_class = DELAY">
<then>
  <if condition="@vr_ddS_state = in">
  <then>
    <vr id="vr_ddS_orgValue" text="-1" value="-1" generated="false"/>
    <query vr="vr_ddS_orgValue" table="bklist" id="%callerid%" get="departdelay"/>
    <vr id="vr_ddS_newValue" value="#vr_ddS_delayValue"/>
  </then>
  </if>
  <if condition="@vr_ddS_state = depart">
  <then>
    <vr id="vr_ddS_newValue" value="#vr_ddS_orgValue"/>
  </then>
  </if>
  <model cmd="change">
    <bk id="%callerid%" departdelay="#vr_ddS_newValue"/>
  </model>
</then>
</if>
</xmlscript>

Het script (voor meerdere blokken)

Deze variant van het script werkt voor meer dan één blok.
Daarom moet elke variabele worden gedefinieerd voor elk blok dat dit script zou moeten aanroepen.
Dit wordt gedaan door de passer-ID "%callerid%" toe te voegen aan elke gebruikte variabele ID.
De variabele "vr_ddS_state" krijgt de naam "vr_ddS_%callerid% _state" (wat resulteert in "vr_ddS_bk1_state" voor blok "bk1") enzovoort.
:!: Dit vereist dat alle corresponderende blokken "goed gevormde" ID's hebben (geen spaties, geen speciale tekens, nee …).
lle opmerkingen en alle traceerlijnen worden verwijderd:

<xmlscript>
<vr id="vr_ddS_delayValue" text="" value="10" generated="true"/>
<vr id="vr_ddS_%callerid%_state" text="%state%" generated="true"/>
<vr id="vr_ddS_%callerid%_locid" text="" generated="true"/>
<query vr="vr_ddS_%callerid%_locid" table="bklist" id="%callerid%" get="locid"/>
<vr id="vr_ddS_%callerid%_class" text="" generated="true"/>
<query vr="vr_ddS_%callerid%_class" table="lclist" id="@vr_ddS_%callerid%_locid" get="class"/>
<vr id="vr_ddS_%callerid%_newValue" text="0" value="0" generated="true"/>

<if condition="@vr_ddS_%callerid%_class = DELAY">
<then>
  <if condition="@vr_ddS_%callerid%_state = in">
  <then>
    <vr id="vr_ddS_%callerid%_orgValue" text="-1" value="-1" generated="false"/>
    <query vr="vr_ddS_%callerid%_orgValue" table="bklist" id="%callerid%" get="departdelay"/>
    <vr id="vr_ddS_%callerid%_newValue" value="#vr_ddS_delayValue"/>
  </then>
  </if>

  <if condition="@vr_ddS_%callerid%_state = depart">
  <then>
    <vr id="vr_ddS_%callerid%_newValue" value="#vr_ddS_%callerid%_orgValue"/>
  </then>
  </if>

  <model cmd="change">
    <bk id="%callerid%" departdelay="#vr_ddS_%callerid%_newValue"/>
  </model>
</then>
</if>
</xmlscript>

Installation

The test plan looks like this. (Directe sprong naar de werkruimte download)

The action definition

The action is named "ac_departdelaySet" and is calling an external script "ac_departdelaySet.xml".

The block properties

The block should have defined "wait" = YES.
The depart delay of the block may be of any value - here a value of "4" seconds is used (see Block - Depart Delay).

The list of actions for this block must hold
- action ID "ac_departdelaySet" for the state "in"
- action ID "ac_departdelaySet" for the state "depart"
The other entries just display the depart delay value of the block in a text field of the plan. They are included in the test workspace. They are not required for the functionality of the depart delay script.

What has been shown for block "bk1" is also installed for block "bk2" in the test workspace.

The locomotive properties

The locomotive should have set "Use depart delay" = YES (see Locomotives - Use depart delay).
The locomotive should have set "Class" = "DELAY" (see Locomotives - Class).

Test sequence

- start the Automatic Mode,
- start each locomotive (do not use "Virtual start"),
- simulate the appropriate sensors and
- watch the delay the locomotive gets a velocity command larger than zero.

Remark: the "departdelay" value is not used by Rocrail in case of using "Virtual start locomotive"!
Have fun.

De werkruimte

The werkruimte to test the script.

userpages/hermannk/departdelaychange-nl.1614497754.txt.gz · Last modified: 2021/02/28 08:35 by hermannk