Table of Contents
Loco Starts Loco
Userpages - Hermann (hermannk) → Loco Starts Loco
Here you go directly to the Rocrail-Workspace-Download |
Foreword 1:
This documentation was created with this: Status 03.05.2024
Area | Details | Remarks |
---|---|---|
Control | Rocrail | Version 2.1.4545+ (macOS "Sonoma" on Apple M2 CPU) |
Computers | MacBook Pro (M2) | macOS 14.2.1 (Sonoma) |
Foreword 2:
- the use of this solution is at your own risk;
- regular backups of the Rocrail workspace are recommended.
A) Task
As soon as a loco arrives at a station the next loco should start.
The station consists of blocks bk01, bk11, bk21 and bk31.
The station blocks are configured: Block Properties / Details / Wait / Type = Stop
B) Solution Details
As soon as a locomotive has arrived in a block two things have to be done:
- a) if there is a saved command the command should be executed;
- b) the locomotive of the next block should start;
- b1) if the next block is empty the drive command for that block must be saved;
- b2) if the locomotive is already present in the next block the locomotive can start immediately.
Every block of the station will get an action "ac_Loco_Starts_Loco" triggered at the IN event.
The action "ac_Loco_Starts_Loco" starts the XMLScript "ac_Loco_Starts_Loco.xml".
Starting the action is done with the parameter "block ID of the next block".
The XMLScript
The scripts starts to display the calling parameters:
<trace text="ac_Loco_Starts_Loco: begin %callerid% %state% for %param1%"/>
Parameter | Explanation | Example value |
---|---|---|
%callerid% | the block ID of the calling block | bk01 |
%state% | the event state of the calling block | in |
%param1% | the first Parameter of the call | bk11 |
In othrer words: if a loco arrives in block "bk01" the loco in block "bk11" should start.
a) Execute a saved command
If there is a saved command the command should be executed.
The saved command is stored in the variable "vr_LSL_%callerid%_todo".
For the calling block "bk01" this variable will have the ID "vr_LSL_bk01_todo".
The command is stored as the value "1"; otherwise the value is "0".
<if condition="#vr_LSL_%callerid%_todo > 0" > <then> <trace text="- LSL: prepare late start loco in %callerid% "/> <sleep time="2000"/> <trace text="- LSL: late start loco in %callerid% "/> <lc bkid="%callerid%" cmd="govirtual"/> <vr id="vr_LSL_%callerid%_todo" value="0"/> </then> <else> <!-- do nothing here --> </else> </if>
If there is a saved command:
Statement | Explanation |
---|---|
<sleep time="2000"/> | wait a short amount of time - here 2 seconds. |
<lc bkid="%callerid%" … /> | the locomotive in block %callerid% - here "bk01" |
<lc … cmd="govirtual"/> | start the locomotive in virtual mode |
<lc … cmd="go"/> | start the locomotive in normal mode |
<vr id="vr_LSL_%callerid%_todo" value="0"/> | reset the variable |
b) Start next loco
If the next block is occupied:
- start the locomotive of the next block immediately;
otherwise:
- store a saved command for the next block.
<if state="bk %param1% = occupied" > <then> <!-- start next loco immediately --> <trace text="-LSL: start next loco in %param1% "/> <vr id="vr_LSL_%callerid%_todo" value="0"/> <vr id="vr_LSL_%param1%_todo" value="0"/> <lc bkid="%param1%" cmd="govirtual"/> </then> <else> <!-- prepare next start --> <trace text="@vr_LSL_%param1%_todo will soon start in %param1% "/> <vr id="vr_LSL_%param1%_todo" value="1"/> </else> </if>
b1) The next block is occupied
Statement | Explanation |
---|---|
<if state="bk %param1% = occupied" > | if the next block is occupied - here %param1% is "bk11" |
<vr id="vr_LSL_%callerid%_todo" value="0"/> | reset our saved command |
<vr id="vr_LSL_%param1%_todo" value="0"/> | reset the saved command for the next block |
<lc bkid="%param1%" … /> | start the locomotive of the next block %param1% - here "bk11" |
<lc … cmd="govirtual"/> | start the locomotive in virtual mode |
<lc … cmd="go"/> | start the locomotive in normal mode |
b2) The next block is not occupied
Statement | Explanation |
---|---|
<vr id="vr_LSL_%param1%_todo" value="1"/> | store the saved command for the next block %param1% - here "bk11" |
C) Rocrail workspace
The download workspace "loco_starts_loco.zip" contains the following files:
file | meaning |
---|---|
plan.xml | the Rocrail plan file |
ac_Loco_Starts_Loco.xml | the XML script |
back to the solution-details.
D) Outlook
You are welcome to implement your own ideas on the basis of this solution.
For example, a second parameter could be used to specify a schedule identifier with which the locomotive should be started in the next block.
Parameters | bk11,bk11_runaround | next block "bk11", schedule identifier "bk11_runaround" |
XMLScript | <vr id="vr_LSLs_%param1%_todo" value="1" text="%param2%"/> | save schedule identifier |
XMLScript | <lc bkid="%param1%" cmd="useschedule" scheduleid="%param2%"/> | apply schedule identifier |
Workspace | loco_starts_loco_schedule.zip |
Have fun and good luck.