Nieuws:

Voor onze Stichting 3rail Wiki zoeken wij schrijvers! Wil je helpen? Lees in de oproep hoe dat kan!

Rocrail, bijkomende automatisatie

Gestart door GoethalsA zondag 25 januari 2026, 18:27:36

0 leden en 1 gast bekijken dit board.
Rocrail, bijkomende automatisatie
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.
Plan met blokIDs.jpg
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)
stoplocs.jpg

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
Re: Rocrail, bijkomende automatisatie
Rob zal niet graag horen dat je zijn automatisch rijden aan het "verkrachten" bent  B)

De groene pijltjes op je rails geven aan dat ENKEL in die richting kan gereden worden op die rails, correct?
Indien ja, dan vraag ik mij af wat het nut in van sw24 & sw25 ?
Je kan daar toch niet overgaan van binnen- naar buiten ring?
Idem dito voor sw15 & sw16.

Heb je rijwegen automatisch laten genereren?
Dan heb je een lijst van ALLE mogelijke automatische rijwegen.
Wil je iets anders, dan zal je manueel moeten rijden, ofwel een dienstrooster tussen verschillende opeenvolgende blokken maken.
Dat dienstrooster zal enkel maar werken wanneer er geen tegenstrijdigheden zijn, bijvoorbeeld van "Rangeerroute 3" + naar "Blok_11" - ; je komt daar namelijk een groene pijl tegen in tegengestelde richting.
Treinen die mogelijks in correct lopend dienstrooster traject zouden komen, zullen we tijdig gestopt worden.

Zou het niet mogeljk zijn dat je al die hocus pocus moet doen omdat er tegenstrijdigheden zijn op uw lay-out?
Re: Rocrail, bijkomende automatisatie
Hoi Alain,
Om te beginnen mijn complimenten voor dit knap stukje denkwerk. Daar zit ongetwijfeld veel tijd in. Ik schroom dan ook wel een beetje om wat opmerkingen te maken omdat ik je werk niet teniet wil doen.
Ik zou het ongeveer zo oplossen:

Stap 1: Stel treinen samen. Een trein bestaat uit een aantal wagonnen met een locomotief.
Stap 2: Koppel de loc in blok 07 los van de trein, de wagonnen blijven dus achter in het blok en dat zie je terug in Rocrail.
Stap 3: Laat de loc in blok 07 naar de opstellocatie rijden via een dienstrooster.
Stap 4: Laat de loc in blok 13 via een dienstrooster naar blok 07 rijden.
Stap 5: Koppel de loc in blok 07 aan de wagonnen waardoor je weer een complete trein krijgt. Dit kan Rocrail automatisch voor je doen.

Een opmerking over je baanplan:
De groene richtingpijlen zorgen er voor dat Rocrail alleen rijwegen genereert in die richting. Er zal dus geen rijweg komen naar blok 06 waardoor je in Automodus niet naar dit blok kunt rijden.

Kijk maar of je hier wat mee kunt.

In deze video leg ik uit hoe ik dat doe op mijn baan Den Akker:
https://youtu.be/1mvA4gKcdPk?si=93i6ocOPABoYOTzv
Re: Rocrail, bijkomende automatisatie
Citaat van: AlbertG op dinsdag 10 maart 2026, 16:55:29Een opmerking over je baanplan:
De groene richtingpijlen zorgen er voor dat Rocrail alleen rijwegen genereert in die richting. Er zal dus geen rijweg komen naar blok 06 waardoor je in Automodus niet naar dit blok kunt rijden.
Bedankt Albert om dit te bevestigen.
Véél van die pijltjes beletten dan toch dat Rocrail rijwegen kan aanmaken  :important: 
Re: Rocrail, bijkomende automatisatie
Oei!
Eerste en vooral, sorry voor de late reactie.  Ik wist totaal niet dat er in maart gereageerd werd op mijn bericht. Ik had verwacht dat er eventueel een email zou binnenkomen indien er een reactie kwam maar ik merk nu dat mijn notificaties niet opstond  :?

Bedankt voor je reactie mcs.

CiteerRob zal niet graag horen dat je zijn automatisch rijden aan het "verkrachten" bent
Ik hoop dat de brave man er niet ziek van gaat worden 😉.  Ik zie trouwens niet echt een probleem.  Er wordt hier niets verkracht. De treinen rijden perfect in aquarium mode tot ik een trein wissel uitvoer, Eénmaal de wissel uitgevoerd, gaan ze gewoon terug in aquarium mode rijden.  Ik gebruik hier een techniek dat in Rocrail bestaat, namelijk Commando Recorder scripts, maar mijn programma maakt ze dynamisch aan en vraagt Rocrail om ze uit te voeren.  Dit zou ook kunnen via XML maar ik heb er mij niet in verdiept.

CiteerDe groene pijltjes op je rails geven aan dat ENKEL in die richting kan gereden worden op die rails, correct?
Niet echt, het geeft wel de logische richting aan dat in aquarium mode kan gebruikt worden. Om het duidelijker te maken voor mijn kleinzoon heb ik zelf de richtingen een kleur gegeven, westwaarts zijn de blokken Blauw en oostwaarts zijn ze Roos.

Citeernut in van sw24 & sw25
Je hebt gelijk voor Sw24/25 en Sw22/23 (en Sw08/09), die gebruik ik effectief niet.  Die wissels waren aanwezig vóór de automatisatie en zijn inderdaad overbodig.
Maar Sw15/16 zijn wel belangrijk en worden gebruikt om oostwaartse treinen te laten keren op de keerlus, dus oostwaartse treinen die vertrekken van blok 1, 2, 3 of 6 gaan via blok 8 (in tegengestelde rijrichting) naar blok 12 en keren daar via de lus om bvb dan terug de hoofdbaan op te rijden naar blok 4 of 5 via blok 8 in de juiste westwaartse richting.

CiteerHeb je rijwegen automatisch laten genereren?
Gedeeltelijk, ook een aantal routes manueel bijgevoegd.

CiteerWil je iets anders, dan zal je manueel moeten rijden
Ja, dat is juist hetgeen ik niet meer doe, ik hoef niet meer alles te stoppen en manueel 17 stappen uit te voeren om bvb de twee treinen tussen blok 5 en blok 1 te wisselen. Het programma analyseert elk scenario (posities van treinen op de hoofdbaan en posities (en richting) van de treinen op de keerlus) en berekend dan elke stap om de 'swap' te behandelen. En voert ze dan stap per stap uit en controleert ook of het effectief of de stap correct uitgevoerd is om dan pas de volgende stap uit te voeren.

Via een dropdown selecteer ik de treinen, de treinlengtes worden nagekeken, indien de wissel mogelijk is dan wordt die uitgevoerd.
dropdown.png

Het voorbeeld hieronder is 16 stappen lang en wordt stap per stap uitgevoerd.
V200_020 staat in de weg en wordt gerangeerd, BR_184 staat in de verkeerde richting en wordt gekeerd, wacht dan in blok 18.
Stap 5, 6 en 7 gaan via Sw 15/16. Slagbomen worden ook aangestuurd waar nodig, bij vertrek vanaf Blok 8 naar 12 sluiten de slagbomen.

Ik rij standaard zonder geluid, maar voor een 'swap' maak ik een uitzondering, BR_230 heeft een geluidsdecoder en die zet het programma op, aan het einde zet die het weer uit. BR_184 heeft geen sound decoder, dus daar geen geluid.
Swap BR_230 (Blok_06) en BR_184 (Blok_14)

Step 1 of 16 :
sys,?,go
pause,1
auto,?,on
pause,1
fn,BR_230,1,true,19
lc,V200_020,gotoblock,Blok_13
lc,V200_020,go

Step 2 of 16 :
#### turn loc in the reversing loop
lc,BR_184,gotoblock,Blok_12
lc,BR_184,go

Step 3 of 16 :
lc,BR_184,gotoblock,Blok_18
lc,BR_184,go
#### end turn loc in the reversing loop

Step 4 of 16 :
lc,BR_230,gotoblock,Blok_02
lc,BR_230,go

Step 5 of 16 :
lc,BR_230,gotoblock,Blok_08
lc,BR_230,go

Step 6 of 16 :
co,Slagbomen_open,on
co,Slagbomen_open,off
lc,BR_230,gotoblock,Blok_12
lc,BR_230,go

Step 7 of 16 :
lc,BR_230,gotoblock,Blok_14
lc,BR_230,go

Step 8 of 16 :
lc,BR_184,gotoblock,Blok_12
lc,BR_184,go

Step 9 of 16 :
lc,BR_184,gotoblock,Blok_08
lc,BR_184,go

Step 10 of 16 :
lc,BR_184,V10,true

Step 11 of 16 :
lc,BR_184,V0,true

Step 12 of 16 :
lc,BR_184,swap
pause,1

Step 13 of 16 :
lc,BR_184,gotoblock,Blok_02
lc,BR_184,go

Step 14 of 16 :
lc,BR_184,swap
pause,1

Step 15 of 16 :
lc,E_93_07,softreset
lc,E_93_07,go

Step 16 of 16 :
lc,CE_6/8_14308,softreset
lc,CE_6/8_14308,go
lc,BR_184,gotoblock,Blok_06
lc,BR_184,go
co,Slagbomen_open,on
co,Slagbomen_open,off
lc,BR_03,softreset
lc,BR_03,go
fn,BR_230,1,false,19

CiteerRangeerroute 3" + naar "Blok_11" -
Inderdaad, ik heb geen route Blok-03+ naar Blok_11- maar enkel van Blok_03- naar Blok_11+

Citeertegenstrijdigheden zijn op uw lay-out?
juist, dat leg ik ook uit in mijn eerste bericht. Ik kan geen trein keren behalve via de Keerlus die letterlijk buiten het standard traject zit.

Ik ga me nu verdiepen op Albert zijn video en bekijken of dit allemaal mogelijk is via rijwegen en acties, daar zal tijd aan besteed moeten worden...

Mvg, Alain
Re: Rocrail, bijkomende automatisatie
Bedankt Albert,

Het uitvoeren van het concept heeft enkele weken in beslag genomen, 5000 lijn programeercode, maar wel veel recuperatie van andere code snippets, dus het viel wel mee.

Je video deel 70 is indrukwekkend!
Zoals Paulgijsberts reageerde zal ik ook nog wel een aantal keer deze uitleg moeten bekijken vooraleer ik alles begrijp...

Maar denk je dat je in één dienstrooster kan rekening houden met alle mogelijke scenario's of bvb een trein 2 x laten keren zoals in stap 12 en 14 van het voorbeeld hierboven?
(note: de stappen 10 en 11 in het voorbeeld zijn niet standaard, ze zijn een kleine push die nodig is voor de oude locomotief om iets verder naar het midden van de blok omdat die telkens blokkeert op een stukje helling na het swappen, dus met die enkel centimeters kan die voldoende snelheid krijgen om niet meer te blokkeren, dus vergelijkbaar met je 2 seconden actie om je wagons te te koppelen aan de trein in je video)

Ik ga je voorstel eens uitwerken op mijn testbaan.

Warme groetjes,
Alain