Beste Rocrail gebruikers,
Ik heb een tamelijk kleine baan 260 x200 cm in L vorm, iets minder dan 3.5 m². Een dubbele acht spoorweg met viaduct en hoge steigingsgraad, een niet geïntegreerde keercirkel dat via een zijspoor moet bereikt worden. Niet echt optimaal maar toch wel leuk om naar te kijken, volgepropt met treinen en locomotieven zoals je op het spoorschema kan zien.

Om op deze spoorbaan een trein te wisselen, bvb van spoor links naar spoor rechts, is het een hele opgave. Treinen moeten van logische richting wijzigen, keren, achteruit rijden, weer keren, andere treinen moeten gestopt worden, etc, dus niet te doen in auto mode.
Maar in Rocrail bestaat de mogelijkheid om scripten te maken, heel goed om kleinen zaken te verbeteren, zoals treinen die te vroeg stoppen bij een enterin melder, deze dan via een script verder laten rijden tot de juiste positie. Nadeel, een script is iets statisch, een opname van een sequentie van bewegingen, voor specifieke Locs. Je kan daar verder niet echt iets mee doen... denk je.
Het is mij gelukt om met wat extern programmeerwerk de scripts dynamisch aan te maken, en dat opent wat mogelijkheden.
Stel nu dat ik de Nohab op Blok_13 wil wisselen met BR_184 op Blok_07 dan kan ik dat doen in (7 + 24 + 2 = ) 33 stappen.
Met een script ziet dit er zo uit:
Stap 1 - selectief stoppen van alle treinen op de in stap 2 betrokken rijwegen, andere rijwegen blijven dus in gebruik en treinen rijden dus gewoon verder (7 stappen):
Noteer dat het met Rocrail, in Auto Mode, niet mogelijk is om exact te weten welke Locs effectief bewegen (gestart zijn) . De enige info dat in real-time kan bekregen (occ.xml) worden is wanneer een trein een in-melder activeert (dan zie je te trein in de vertrek blok en ook in de aankomst blok) en daarna wanneer de enter melder wordt geactiveerd, dan verdwijnt het beeld van de Loc uit de vertrek blok, en is zodoende de bewegingstransactie geëindigd.
Omdat je dus niet kan weten of een trein nog zou 'kunnen' vertrekken uit een blok, moet nog even gewacht worden om zeker te weten dat alle treinen niet meer bewegen. We hebben immers de juiste positie nodig van elke trein om de betrokken rijwegen om de volgende stap correct te verwezenlijken.
Een lange pauze van 45 seconden (bij mij zijn het relatief korte rijwegen, dus mogelijk zelf iets langer) is dus nodig op het einde om zeker te zijn dat alle treinen effectief zijn gestopt.
lc,CE_6/8_14308,stop
pause,1
lc,BR_184,stop
pause,1
lc,HLE-18,stop
pause,1
lc,DHG-700,stop
pause,1
lc,S52_Nohab,stop
pause,1
lc,S26.028,stop
pause,1
lc,BR_03,stop
pause,45
De screenshot hierboven is gemaakt na het stoppen van de treinen.
Stap 2 - treinen wisselen: [S52_Nohab] op [Blok_13] naar [Blok_07] en [BR_184] op [Blok_07] naar [Blok_13], 24 stappen en nog 2 stappen om de locs op spoor zuid te herstarten.
Noteer weer de lange wachttijden. De script wordt sequentieel door Rocrail uitgevoerd en rocrail houdt zich niet bezig met te monitoren of de opdracht wel lukt. Lukt een stap niet, dan verloopt het vervolg chaotisch.
pause,1
auto,?,on
pause,1
lc,HLE-18,gotoblock,Blok_04
lc,HLE-18,go
pause,45
lc,CE_6/8_14308,gotoblock,Blok_09
lc,CE_6/8_14308,go
pause,45
lc,DHG-700,gotoblock,Blok_14
lc,DHG-700,go
pause,45
lc,BR_03,gotoblock,Blok_12
lc,BR_03,go
pause,45
lc,BR_03,gotoblock,Blok_16
lc,BR_03,go
pause,45
lc,BR_184,gotoblock,Blok_05
lc,BR_184,go
pause,45
lc,BR_184,gotoblock,Blok_08
lc,BR_184,go
pause,45
; #### turn loc in the reversing loop
lc,S52_Nohab,gotoblock,Blok_12
lc,S52_Nohab,go
pause,45
lc,S52_Nohab,gotoblock,Blok_18
lc,S52_Nohab,go
pause,45
lc,S52_Nohab,gotoblock,Blok_12
lc,S52_Nohab,go
pause,45
lc,S52_Nohab,gotoblock,Blok_13
lc,S52_Nohab,go
; #### end turn loc in the reversing loop
pause,45
lc,BR_184,swap
pause,1
lc,BR_184,gotoblock,Blok_12
lc,BR_184,go
pause,45
lc,BR_184,gotoblock,Blok_18
lc,BR_184,go
pause,45
lc,CE_6/8_14308,gotoblock,Blok_05
lc,CE_6/8_14308,go
pause,45
lc,S52_Nohab,gotoblock,Blok_12
lc,S52_Nohab,go
pause,45
lc,S52_Nohab,gotoblock,Blok_08
lc,S52_Nohab,go
pause,45
lc,BR_184,gotoblock,Blok_12
lc,BR_184,go
pause,45
lc,BR_184,gotoblock,Blok_13
lc,BR_184,go
pause,45
lc,S52_Nohab,gotoblock,Blok_09
lc,S52_Nohab,go
pause,45
lc,CE_6/8_14308,gotoblock,Blok_08
lc,CE_6/8_14308,go
pause,45
lc,S52_Nohab,gotoblock,Blok_05
lc,S52_Nohab,go
pause,45
lc,S52_Nohab,swap
pause,1
lc,HLE-18,go
pause,45
lc,CE_6/8_14308,go
pause,45
lc,S52_Nohab,gotoblock,Blok_07
lc,S52_Nohab,go
Dit is dus een hypothetisch voorbeeld want eigenlijk niet echt bruikbaar. Ik heb het zelf ondervonden, slaagt een stap niet (bvb omdat een Loc blijft happeren op een wissel of iets anders), dan krijg je chaos.
Dus heb ik vrij snel de aanpak veranderd, het extern programma gaat de 24 stappen stuk per stuk uitvoeren, monitoren dat de 'in' melder is geactiveerd, of in geval van een swap dat de Loc effectief van rijrichting veranderd is. Stap per stap, gaat het proces dan verder, de wachttijd van 45 seconden is nog nodig (in geval van probleem dient dit als een time-out trigger voor een fout melding) , maar eigenlijk gaat het een stuk sneller, want zodra in melder geactiveerd werd, gaat het proces door met de volgende stap, die 45 seconden zijn dus theoretische wachttijden geworden.
Hoe interageert het extern programma met Rocrail? Via een knop (linksonder dat ik voor het gemak 'Command' heb genoemd) dat verder geen functie heeft, klik je erop dan klik je naar niets want zodra het scriptdeel wordt doorgegeven aan Rocrail, zal het extern programma het scriptje deleten. Je krijgt dan dit resultaat in het server monitor paneel:
16:45:12 9999W record file [F:\PortableApps\RocRail\Hoofd baanplan\scripts\Command.txt] not found
Je kan dus geen twee keer dezelfde opdracht doorgeven.
Achter de knop zit een actie (dat ik ook 'Command' heb genoemd dat verwijst naar een tijdelijke script:
F:\\RocRail\Hoofd baanplan\scripts\Command.txt
De knop wordt telkens ingedrukt door het extern programma (de juiste locatie van de klik wordt berekend aan de hand van de coördinaten van de 'Command' knop die in plan.xml te vinden zijn. De muis wordt razendsnel verplaatst, geklikt en dan wordt de cursor terug geplaatst waar die ervoor zat, je merkt dus niets tenzij je echt de focus op de knop hebt...
Voer ik de loc wissel zoals hierboven aangegeven, dan wordt die nu in deelscripts stapsgewijs uitgevoerd als volgt (dit komt van een handige debugpaneel)

Loc swap scripts, zoals vermeld is er geen wachttijd meer, omdat het programma de beweging nakijkt in Rocrail, de gemiddelde uitvoeringstijd per stap (of deelscript) is hier 15 seconden:
[ButtonID: Command][X: 29][Y: 20]
[actionctrl id: Command]
[actionctrl cmd: Command.txt]
Loc to swap: [S52_Nohab] on [Blok_13]
with Loc in Hangar: [BR_184] on [Blok_07]
Loc S52_Nohab will first reverse!
Start of script :
Step 1 of 26 (17:14:37, 40 sec to execute):
sys,?,go
pause,1
auto,?,on
pause,1
lc,HLE-18,gotoblock,Blok_04
lc,HLE-18,go
Step 2 of 26 (17:14:59, 40 sec to execute):
lc,CE_6/8_14308,gotoblock,Blok_09
lc,CE_6/8_14308,go
Step 3 of 26 (17:15:27, 40 sec to execute):
lc,DHG-700,gotoblock,Blok_14
lc,DHG-700,go
Step 4 of 26 (17:15:47, 40 sec to execute):
lc,BR_03,gotoblock,Blok_12
lc,BR_03,go
Step 5 of 26 (17:16:05, 40 sec to execute):
lc,BR_03,gotoblock,Blok_16
lc,BR_03,go
Step 6 of 26 (17:16:24, 40 sec to execute):
lc,BR_184,gotoblock,Blok_05
lc,BR_184,go
Step 7 of 26 (17:16:36, 40 sec to execute):
lc,BR_184,gotoblock,Blok_08
lc,BR_184,go
Step 8 of 26 (17:16:50, 40 sec to execute):
; #### turn loc in the reversing loop
lc,S52_Nohab,gotoblock,Blok_12
lc,S52_Nohab,go
Step 9 of 26 (17:17:02, 40 sec to execute):
lc,S52_Nohab,gotoblock,Blok_18
lc,S52_Nohab,go
Step 10 of 26 (17:17:19, 40 sec to execute):
lc,S52_Nohab,gotoblock,Blok_12
lc,S52_Nohab,go
Step 11 of 26 (17:17:31, 40 sec to execute):
lc,S52_Nohab,gotoblock,Blok_13
lc,S52_Nohab,go
; #### end turn loc in the reversing loop
Step 12 of 26 (17:17:50, 5 sec to execute):
lc,BR_184,swap
pause,1
Step 13 of 26 (17:18:01, 40 sec to execute):
lc,BR_184,gotoblock,Blok_12
lc,BR_184,go
Step 14 of 26 (17:18:22, 40 sec to execute):
lc,BR_184,gotoblock,Blok_18
lc,BR_184,go
Step 15 of 26 (17:18:43, 40 sec to execute):
lc,CE_6/8_14308,gotoblock,Blok_05
lc,CE_6/8_14308,go
Step 16 of 26 (17:18:55, 40 sec to execute):
lc,S52_Nohab,gotoblock,Blok_12
lc,S52_Nohab,go
Step 17 of 26 (17:19:07, 40 sec to execute):
lc,S52_Nohab,gotoblock,Blok_08
lc,S52_Nohab,go
Step 18 of 26 (17:19:20, 40 sec to execute):
lc,BR_184,gotoblock,Blok_12
lc,BR_184,go
Step 19 of 26 (17:19:36, 40 sec to execute):
lc,BR_184,gotoblock,Blok_13
lc,BR_184,go
Step 20 of 26 (17:19:57, 40 sec to execute):
lc,S52_Nohab,gotoblock,Blok_09
lc,S52_Nohab,go
Step 21 of 26 (17:20:08, 40 sec to execute):
lc,CE_6/8_14308,gotoblock,Blok_08
lc,CE_6/8_14308,go
Step 22 of 26 (17:20:24, 40 sec to execute):
lc,S52_Nohab,gotoblock,Blok_05
lc,S52_Nohab,go
Step 23 of 26 (17:20:36, 5 sec to execute):
lc,S52_Nohab,swap
pause,1
Step 24 of 26 (17:20:48, 5 sec to execute):
lc,HLE-18,go
Step 25 of 26 (17:20:58, 5 sec to execute):
lc,CE_6/8_14308,go
Step 26 of 26 (17:21:09, 40 sec to execute):
lc,S52_Nohab,gotoblock,Blok_07
lc,S52_Nohab,go
End of Script: 17:21:21
Je zal merken dat van stap 8 tem 11 (#### turn loc in the reversing loop), de trein in de juiste richting gedraaid wordt indien nodig. (de richting kan ook gehaald worden in occ.xml)
Ik heb deze versie al 3 weken getest, en het loopt allemaal prima. Soms blijft er wel eens een treintje happeren (een duwtje in de rug van de Loc en die gaat dan verder), het programma wacht gewoon tot het opgelost wordt om verder te gaan met de volgend stap.
Twee deelprogramma's zijn zo bruikbaar voor iedereen:
StartLocs, om treinen te starten die op welbepaalde blocks staan(alternatief voor mijn configuratie onbruikbare "start alle Loc's":
StopLocs (of eerder return to blocks) , het tegenovergestelde, brengt de Locs terug naar deze startblokken.
Swaps zijn iets complexer (scenario opbouw, etc, en momenteel zit er ward g-hardcode in mijn programma's
Als iemand interesse heeft, of als dit van enig nut zijn voor iemand? Laat maar weten.
Dan wil ik graag meer in detail gaan, ook de source van mijn programma delen, geen probleem, het is geschreven in AutoIt.
Alain