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.
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
As soon as a locomotive has arrived in a block two things have to be done:
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 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.
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 |
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>
| 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 |
| Statement | Explanation |
|---|---|
| <vr id="vr_LSL_%param1%_todo" value="1"/> | store the saved command for the next block %param1% - here "bk11" |
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.
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.