User Tools

Site Tools


userpages:hermannk:departdelaychange-nl

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>

Installatie

Het testplan ziet er zo uit. (Directe sprong naar de werkruimte download)

De definitie van de actie

De actie heet "ac_departdelaySet" en roept een extern script "ac_departdelaySet.xml" aan.

De blokeigenschappen

Het blok zou "wait" = YES moeten hebben gedefinieerd.
De vertrekvertraging van het blok kan elke waarde hebben - hier wordt een waarde van "4" seconden gebruikt (zie Block - Vertrekvertraging).

De lijst met acties voor dit blok moet staan
- actie-ID "ac_departdelaySet" voor de staat "in"
- actie-ID "ac_departdelaySet" voor de staat "depart"
De andere items geven alleen de vertragingswaarde van het blok weer in een tekstveld van het plan. Ze zijn opgenomen in de testwerkruimte. Ze zijn niet vereist voor de functionaliteit van het vertragingsscript voor vertrek.

Wat is getoond voor blok "bk1" wordt ook geïnstalleerd voor blok "bk2" in de testwerkruimte.

De eigenschappen van de locomotief

De locomotief had "Gebruik vertrekvertraging" = JA moeten hebben ingesteld (zie Locomotieven - Gebruik vertrek vertraging).
De locomotief zou "Class" = "DELAY" moeten hebben ingesteld (zie Locomotieven - Klasse).

Testsequentie

- start de automatische modus,
- start elke locomotief (gebruik niet "Virtuele start"),
- simuleer de juiste sensoren en
- let op de vertraging die de locomotief een snelheidsopdracht krijgt die groter is dan nul.

Opmerking: de "vertrekvertraging" waarde wordt niet gebruikt door Rocrail bij gebruik van "Virtuele startlocomotief"!
Veel plezier.

De werkruimte

De werkruimte om het script te testen.

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