Sceneria/Quark/Ruch 2016
Opis sterowania ruchem na scenerii Quark wg stanu na 2016 rok (z grubsza niezmienione od 2013). Dla większego porządku użyte jest nazewnictwo wprowadzone już w 2017 roku (zmiany nazewnictwa, mimo iż nie wpływają na funkcjonowanie scenerii, wprowadzane są pod kątem wypracowania automatycznego generowania skryptów sterujących stacjami). W związku z realizacją planów przebudowy scenerii, sterowanie ruchem od 2018 wygląda nieco inaczej (np. dodana łącznica z Dejaw do Koniewic, doklejone Psiary). Ta strona pozostaje jako archiwalna i będzie zawierać opis wczesnej wersji sterowania ruchem.
Przedstawiona jest zawartość pliku events-ra.ctr, który odpowiada za ruch na scenerii. Sterowanie ruchem dla całej scenerii można zmienić modyfikując tylko ten plik. Pliki sterujące ruchem dla stacji mają charakter uniwersalny i nie ma potrzeby w nie ingerować, chyba że potrzebne są dodatkowe operacje, które nie zostały dotychczas uwzględnione (np. odczepianie lokomotyw na innych stacjach i torach, niż to ma miejsce obecnie).
Spis treści
- 1 Ustawienie czasu symulacji
- 2 Włączenie łączenia eventów
- 3 Dołączenie sterowania ruchem na stacjach
- 4 Dołączenie blokad liniowych
- 5 Stacja Koniewice
- 6 Stacja Dejawy
- 7 Kopalnia w Dejawach
- 8 Stacja Wielki Kac
- 9 Lokomotywownia Wielki Kac (szopa)
- 10 Stacja Wielki Kac Dolny
- 11 Stacja Skwarki
- 12 Mijanka Zatyle
- 13 Stacja Mydelniczka
- 14 Mijanka Bruchniewo
- 15 Wyłączenie łączenia eventów
Ustawienie czasu symulacji
time 4:45 6:37 16:17 endtime
Jednym z pierwszych elementów sterowania ruchem jest ustawienie czasu. Wpisane zostały godziny wschodu i zachodu Słońca (informacyjnie, gdyż nie są używane) na dzień 31 października 2007. Rok 2007 jest ze względu na na wydzielenie z PKP spółki Przewozy Regionalne, które miało miejsce w 2008 roku i przełożyło się na zmiany w pociągach pośpiesznych. Ustalenie godziny początkowej miało na celu demonstrację rozwidniania się podczas symulacji.
Włączenie łączenia eventów
config joinduplicatedevents yes endconfig
Wpis powyższy powoduje, że eventy o tych samych nazwach wykonywane są jednocześnie (w kolejności podanej w pliku). Eventy o identycznych nazwach przed tym wpisem (np. dotyczące semaforów czy rozjazdów) są traktowane jako błędne. Można by sobie poradzić bez łączenia eventów o tych samych nazwach, jednak wymagałoby to dodania bardzo wielu eventów typu Mutiple, których działanie byłoby analogiczne do łączenia.
Dołączenie sterowania ruchem na stacjach
include quark\skwarki.ctr end include quark\zatyle.ctr end include quark\mydelniczka.ctr end include quark\wielki_kac.ctr end include quark\wielki_kac_dolny.ctr end include quark\szopa.ctr end include quark\dejawy.ctr end include quark\bruchniewo.ctr end include quark\koniewice.ctr end
Dla każdej stacji jest osobny plik sterowania ruchem (ze względu na ich rozmiary). Umieszczenie wszystkiego w jednym zmniejszyłoby przejrzystość. Również w przypadku pocięcia scenerii Quark na komórki i wykorzystania tylko niektórych nie będzie potrzeby dołączania wszystkich plików.
W przypadku scenerii realistycznych mogą funkcjonować różne wersje stacji, odzwierciedlające stan z różnych lat i dlatego pliki sterujące ruchem na stacji powinny zawierać rok w nazwie. Jednak w przypadku scenerii fikcyjnych różne wersje stacji nie mają uzasadnienia praktycznego i dodawanie roku do nazwy pliku nie jest konieczne.
Dołączenie blokad liniowych
include quark\quark.ctr end
Plik zawiera komórki pamięci dla pierwotnej konfiguracji scenerii Quark wraz dodanym Tarniowem. O ile nadmiarowe (nieużywane) blokady liniowe bardzo przeszkadzać nie będą, to łącząc scenerie należy uważać, aby blokady nie powtarzały się w różnych plikach.
Stacja Koniewice
Stacja końcowa dla linii dwutorowej oraz jednotorowej. Wyprawia i przyjmuje cyklicznie pociągi osobowe (EZT), pozwala na wyjazd towarowego, dla pośpiesznego zapewnia odstawienie wagonów na tory postojowe i zabranie innych. Ma troszkę niefunkcjonalny układ torowy (jedna krawędź peronowa dla linii jednotorowej, brak możliwości bezpośredniego zjazdu na tory postojowe).
Stacja Dejawy
Stacja na linii dwutorowej z SBL obsługuje przeloty pociągów osobowych (zatrzymanie przy peronie jest uzyskiwane informacją w rozkładzie), przeloty pociągów towarowych z Koniewic do Wielkiego Kaca oraz przyjmuje pociąg towarowe z Wielkiego Kaca na tor 3 (póki co tylko jeden). Dla tego ostatniego przewidziane jest odczepienie lokomotywy od składu i zabranie pełnych wagonów w stronę Wiekiego Kaca.
Przeloty z Koniewic
event Dej_Kon2_whois whois 0 Dej_Dej2-Kon2 1 endevent event Dej_Kon2_whois updatevalues 0 Dej_Dej2-Kon2 * 2 * endevent event Dej_Kon2_whois multiple 0 none Dej_Kon2_whois_o2 endevent event Dej_Kon2_whois_o2 multiple 5 Dej_It2 Dej_It2<Kon2 Dej_It2:loop Dej_It2>WKG2_next //przelot torem 2 else Dej_Kon2_whois_o2 condition memcompare * * 0 endevent
Rozpoznanie pociągu jadącego od Koniewic torem szlakowym 2 — wpisuje nazwę jego rozkładu (whois) oraz kierunek (updatevalues) do komórki blokady liniowej. Jazdy torem szlakowym 1 (lewym) nie są przewidziane do obsługi. Testowana jest zajętość toru stacyjnego 2 (odcinek izolowany Dej_It2) i jeśli jest wolny, zostanie ustawiony na nim przelot. Gdyby jednak tor 2 nie był wolny, zapętlenie będzie oczekiwać na jego zwolnienie. Oczywiście przelot będzie sprawdzać stan blokady liniowej na wyjeździe i poda wyjazd ze stacji dopiero, gdy będzie to możliwe.
event Dej_Kon2_whois_t4 multiple 5 Dej_It4 Dej_It4<Kon2 Dej_It4:loop Dej_It4>WKG2_next //przelot torem 4 endevent
Alternatywnym rozwiązaniem (obecnie nieużywanym) był przelot po torze 4 (niezależnie od jego zajętości, co w ogólnym przypadku jest błędem, jednak przy zakładanym na scenerii ruchu nie powinien się zdarzyć wjazd na tor 4). W łatwy sposób można by rozpoznać pociągi towarowe i kierować je na tor 4, gdyby tor 2 był zajęty.
Rozróżnianie pociągów z Wielkiego Kaca
Z Wielkiego Kaca mogą jechać dwa pociągi na raz (po SBL) i aby móc podać wjazd odpowiednio wcześniej, potrzebna jest dodatkowa komórka dla drugiego pociągu. Teoretycznie powinno być coś takiego przygotowane dla każdej stacji i każdego toru, ale przy zakładanym ruchu jest potrzebne tylko tutaj.
node -1 0 Dej_WKG1-Dej1. memcell 0 0 0 0 1 0 none endmemcell event Dej_WKG1_whois whois 0 Dej_WKG1-Dej1. 1 endevent event Dej_WKG1_whois updatevalues 0 Dej_WKG1-Dej1. * 1 * endevent event Dej_WKG1_whois multiple 0 Dej_WKG1-Dej1. Dej_WKG1_czekaj endevent event Dej_WKG1_czekaj multiple 5 Dej_WKG1-Dej1 Dej_WKG1_ustaw else Dej_WKG1_czekaj condition memcompare * * 0 endevent
Rozpoznawanie rozkładu z wpisaniem do komórki pomocniczej (z kropką w nazwie). Następnie testowana jest właściwa komórka obsługująca skład i jeśli nie jest wolna (zero jako trzecia wartość), event jest zapętlony w oczekiwaniu na jej zwolnienie.
event Dej_WKG1_ustaw copyvalues 0 Dej_WKG1-Dej1 Dej_WKG1-Dej1. endevent event Dej_WKG1_ustaw multiple 0 Dej_WKG1-Dej1 Dej_WKG1_tow.puste else Dej_WKG1_przelot condition memcompare T* * * endevent
Para eventów kopiuje nazwę składu z komórki pomocniczej do właściwej i zależnie od rozpoznanego rozkładu będzie kierować pociągi towarowe na tor 3, a pozostałym da przelot po torze 1.
Pociągi osobowe z Wielkiego Kaca
event Dej_WKG1_przelot multiple 10 Dej_ItA Dej_It1<WKG1 Dej_It1:loop Dej_It1>Kon1_next else Dej_WKG1_przelot condition memcompare * * 0 endevent
Przelot po torze 1 jest jeszcze uzależniony od zajętości toru za semaforem A, gdzie może znajdować się lokomotywa podczepiająca się do innego składu. W pierwszej kolejności ona musi zwolnić tor (docelowo manewry powinny przebiegać bez zajmowania szlaku — trzeba by przebudować układ torów).
Pociąg towarowy z Wielkiego Kaca
node 1000 0 radio27_wav sound -2244 2 8616 radio27.wav endsound event Dej_WKG1_tow.puste multiple 3 none Dej_It3<WKG1 Dej_It3:loop Dej_It3|It31_next endevent event Dej_L_sem_mem:sent sound 1.0 radio27_wav 1 endevent event Dej_It31:busy multiple 0 none Dej_It5<It31 Dej_It5:loop Dej_It5>ItA_next endevent
Pierwsze dwa eventy załatwiają odpinanie lokomotywy po zatrzymaniu na torze 3 oraz jej wyjazd na tor 31. Trzeci event reaguje na zajęcie toru 31 podaniem wjazdu na tor 5 oraz wyjazdu do W5 w stronę semafora wjazdowego A.
event Dej_It5:free multiple 0 none Dej_It5_free endevent event Dej_It5_free updatevalues 30 Dej_Tm6_sem_mem Shunt -2 -3 endevent event Dej_Tm6_sem_mem:sent multiple 0 none Dej_It7<ItA Dej_It7:loop Dej_It7_wyjazd endevent event Dej_It7_wyjazd multiple 300 Dej_It7 Dej_It7>WKG2 Dej_It7:loop else Dej_It7_wyjazd condition memcompare * * 2 endevent
Gdy lokomotywa przejedzie torem 5 na drugą stronę stacji, do tarczy manewrowej zostanie wpisana komenda podpinania (mogło by to przeniesione do skryptu sterującego stacją). Odebranie komendy podpinania z Tm uruchomi wjazd na tor 7. Ponieważ na tym torze stoją już wagony, użycie Dej_It7>WKG2_next nie zadziała. Dlatego podawanie wyjazdu z toru 7 do Wielkiego Kaca jest robione ostatnim z eventów — warunek na liczbę 2 w trzeciej wartości komórki jest oczekiwaniem na zakończenie programowania wjazdu lokomotywy na ten tor.
Kopalnia w Dejawach
Stacja Wielki Kac
Lokomotywownia Wielki Kac (szopa)
Stacja Wielki Kac Dolny
Stacja Skwarki
Stacja końcowa, z której na północ wychodzi linia dwutorowa z SBL oraz jednotorowa. Z południowej strony są tory postojowe. W planach jest przebudowa stacji na przelotową, z przesunięciem torów postojowych. Do przebudowy jest również wyjazd na linię jednotorową, który niepotrzebnie koliduje z linią dwutorową (trzeba by dodać dwa rozjazdy).
Mijanka Zatyle
Stacja Mydelniczka
Po przebudowie stacja węzłowa, łączy trzy linie jednotorowe. Sterowanie ruchem jest umiarkowanie skomplikowane. Co prawda nie dorównuje operacjom wykonywanym w Koniewicach oraz Skwarkach, ale losowany jest jeden z trzech wariantów jazdy pociągu roboczego, w tym jeden wariant wiąże się z oblotem składu.
Pociąg roboczy
event tar_onstart multiple 0 Myd_t101 tar_jedzie condition trackoccupied endevent event tar_jedzie updatevalues 0 Tar-Myd towarowy 1 1 endevent //zajęcie blokady
Eventy te ustawiają zajętość blokady liniowej, jeśli w scenerii wstawiony jest pociąg towarowy. Dzięki temu sceneria będzie działać prawidłowo również wtedy, gdy pociąg ten zostanie z niej usunięty. Rozwiązanie to było używane podczas testów, dla szybszego wczytania scenerii z mniejszą liczbą składów.
event Mydelniczka_SM42_onstart multiple 1.5 Myd_It2 else Mydelniczka_SM42_start condition memcompare * * 0 endevent event Mydelniczka_SM42_start multiple 1.5 none Mydelniczka_ST44_WKD Myd_It2>Tar Myd_It2:loop else Mydelniczka_SM42_Zatyle condition propability 0.3333 endevent event Mydelniczka_SM42_Zatyle multiple 0.5 none Mydelniczka_ST44_WKD Myd_It2>Zat Myd_It2:loop else Mydelniczka_SM42_WKD condition propability 0.5 endevent
Eventy losują jeden z trzech wariantów jazdy pociągu roboczego. Pierwotnie ten pociąg stał w Wielkim Kacu Dolnym i wjeżdżał na górę — teraz jest to jeden z wariantów (opisany poniżej). Obsługa pociągu roboczego jest również uzależniona od jego obecności podczas uruchomienia scenerii — pierwszy event testuje zajętość toru 2 (odcinek izolowany Myd_It2 powinien mieć niezerową trzecią wartość). Jeśli tor jest zajęty, z prawdopodobieństwem 1/3 zostanie wykonany przelot pociągu towarowego od Tarniowa (Mydelniczka_ST44_WKD) i wyjazd pociągu roboczego w stronę Tarniowa (przebieg z pętlą Myd_It2>Tar Myd_It2:loop będzie oczekiwać na zwolnienie blokady liniowej przez pociąg towarowy), albo z prawdopodobieństwem 2/3 wykona się drugie losowanie w trzecim evencie. Pociąg roboczy może być też wysłany przez Zatyle do Skwarek (Myd_It2>Zat Myd_It2:loop), a także może wykonać oblot (Mydelniczka_SM42_WKD).
event Mydelniczka_SM42_WKD multiple 0 none Myd_It2|ItA>It1 Myd_It2:loop endevent event Myd_It1:busy multiple 0 Myd_Ig11 Myd_It1>ItK&It2 Myd_It1:loop Myd_It2>WKD_next condition memcompare It1-ItA * * endevent
Eventy te obsługują oblot składu. Pierwszy powoduje odczepienie lokomotywy na torze 2, wyjazd w stronę semafora A oraz wjazd na tor 1. Cała operacja jest w pliku sterowania stacją i może być wywołana jako Myd_It2|ItA>It1 Myd_It2:loop. Drugi event aktywuje się w momencie, gdy lokomotywa pojawi się na torze 1 (Myd_It1:busy). Ponieważ tor ten może być używany przez inne pociągi, badana jest również nazwa przebiegu w głowicy (It1-ItA, czyli ruch pomiędzy torem 1 a wyjazdem w kierunku semafora A). Lepiej by było badać nazwę rozkładu pociągu, ale póki co pociągi towarowe jeżdżą bez rozkładów. Następną operacją jest wyjazd składu w stronę Wielkiego Kaca Dolnego (Myd_It2>WKD_next). Wariant ten nie przewiduje akcji dotyczącej pociągu towarowego czekającego na wjazd od strony Tarniowa. Kreską pionową | jest oznaczana operacja odłączania lokomotywy, natomiast ampresandem & łączenie jej ze składem.
Pociąg towarowy
event Mydelniczka_ST44_WKD multiple 12 none Myd_It1<Tar Myd_It1:loop Myd_It1>WKD_next endevent
Ustawienie wjazdu od Tarniowa na tor 1 (Myd_It1<Tar Myd_It1:loop) i następnie wyjazdu do Wielkiego Kaca Dolnego (Myd_It1>WKD_next). Opóźnienie eventu służy do tego, żeby pociąg roboczy z SM42 odjechał pierwszy.
Mijanie pociągów osobowych
Zgodnie z założeniami ruchu, do stacji Mydelniczka dojeżdżają tylko pociągi osobowe (od Zatyla oraz od Wielkiego Kaca Dolnego). Funkcjonuje ona dla nich jako mijanka. Gdyby stacja miała obsługiwać inne pociągi w inny sposób, należałoby uzależnić obsługę od rozpoznanego rozkładu. Przygotowaniem do tego są eventy whois, które odczytują nazwę rozkładu do komórki pamięci blokady liniowej. Jednak potem nic z tą nazwą nie jest robione.
event Myd_Ig12_whois whois 0 Zat1-Myd2 1 endevent event Myd_Ig12_whois multiple 0 Myd1-WKD1 Myd_Ig12_prze condition memcompare * 0 * endevent event Myd_Ig12_whois multiple 0 Myd1-WKD1 Myd_Ig12_tor2 condition memcompare * 1 * endevent event Myd_Ig12_whois multiple 0 Myd1-WKD1 Myd_Ig12_tor2 condition memcompare * 2 * endevent event Myd_Ig12_prze multiple 0 Myd_It2 Myd_Zat>WKD_przelot Myd_It2:loop else Myd_Ig12_tor4 condition memcompare * * 0 endevent event Myd_Ig12_tor4 multiple 5 Myd_It4 Myd_It4<Zat Myd_It4:loop Myd_It4>WKD_next else Myd_Ig13_tor2 condition memcompare * * 0 endevent event Myd_Ig12_tor2 multiple 5 Myd_It2 Myd_It2<Zat Myd_It2:loop Myd_It2>WKD_next else Myd_Ig12_tor4 condition memcompare * * 0 endevent
event Myd_Ig21_whois whois 0 Myd1-WKD1 1 endevent event Myd_Ig21_whois multiple 0 Zat1-Myd2 Myd_Ig21_prze condition memcompare * 0 * endevent event Myd_Ig21_whois multiple 0 Zat1-Myd2 Myd_Ig21_tor2 condition memcompare * 1 * endevent event Myd_Ig21_whois multiple 0 Zat1-Myd2 Myd_Ig21_tor4 condition memcompare * 2 * endevent event Myd_Ig21_prze multiple 0 Myd_It2 Myd_WKD>Zat_przelot Myd_It2:loop else Myd_Ig21_tor4 condition memcompare * * 0 endevent event Myd_Ig21_tor2 multiple 5 Myd_It2 Myd_It2<WKD Myd_It2:loop Myd_It2>Zat_next else Myd_Ig21_tor4 condition memcompare * * 0 endevent event Myd_Ig21_tor4 multiple 5 Myd_It4 Myd_It4<WKD Myd_It4:loop Myd_It4>Zat_next else Myd_Ig21_tor2 condition memcompare * * 0 endevent
Obsługa obu kierunków jest niemal symetryczna. Eventy Myd_Ig12_whois oraz Myd_Ig21_whois reagują na nadjeżdżające pociągi nieco przed tarczą ostrzegawczą semaforów wjazdowych i następnie testują stan blokady liniowej po przeciwnej stronie. Jeśli blokada nie ma ustawionego kierunku (druga wartość w komórce to 0), ustawiony będzie przelot torem 2, o ile ten jest wolny (testowanie odcinka izolowanego Myd_It2; przelot oczywiście będzie również testował blokadę liniową przed podaniem wyjazdu, gdyż jej stan się może zmienić). Jeśli jednak tor 2 będzie zajęty, wykonywana będzie próba zorganizowania wjazdu na tor 4 z wyjazdem w następnym kroku. Jeśli przeciwległa blokada liniowa ma ustawiony kierunek, uruchamiany jest wjazd na tor 2 albo na tor 4, z wyjazdem w następnym kroku.
Jeśli zarówno tor 2, jak i tor 4 byłyby zajęte, eventy będą się wykonywać cyklicznie co 5 sekund, aż do zwolnienia któregoś. Jest to wystarczające do realizacji zaplanowanego ruchu.
Mijanka Bruchniewo
Kiedyś przystanek osobowy z torem do ładowni, po przeorganizowaniu ruchu pojawiła się potrzeba uruchomienia mijanki.
event Bru_Ig11_whois whois 0 WKD1-Bru1 1 endevent event Bru_Ig11_whois multiple 0 Bru1-Kon5 Bru_Ig11_prze condition memcompare * 0 * endevent //wolna event Bru_Ig11_whois multiple 0 Bru1-Kon5 Bru_Ig11_tor1 condition memcompare * 1 * endevent //w tę samą event Bru_Ig11_whois multiple 0 Bru1-Kon5 Bru_Ig11_tor2 condition memcompare * 2 * endevent //w przeciwną event Bru_Ig11_prze multiple 0 Bru_It1 Bru_It1=WKD Bru_It1:loop else Bru_Ig11_tor2 condition memcompare * * 0 endevent event Bru_Ig11_tor1 multiple 5 Bru_It1 Bru_It1<WKD Bru_It1:loop Bru_It1>Kon_next else Bru_Ig11_tor2 condition memcompare * * 0 endevent event Bru_Ig11_tor2 multiple 5 Bru_It2 Bru_It2<WKD Bru_It2:loop Bru_It2>Kon_next else Bru_Ig11_tor1 condition memcompare * * 0 endevent
event Bru_Ig21_whois whois 0 Bru1-Kon5 1 endevent event Bru_Ig21_whois multiple 0 WKD1-Bru1 Bru_Ig21_prze condition memcompare * 0 * endevent //wolna event Bru_Ig21_whois multiple 0 WKD1-Bru1 Bru_Ig21_tor1 condition memcompare * 2 * endevent //w tę samą event Bru_Ig21_whois multiple 0 WKD1-Bru1 Bru_Ig21_tor2 condition memcompare * 1 * endevent //w przeciwną event Bru_Ig21_prze multiple 0 Bru_It1 Bru_It1=Kon Bru_It1:loop else Bru_Ig21_tor2 condition memcompare * * 0 endevent event Bru_Ig21_tor1 multiple 5 Bru_It1 Bru_It1<Kon Bru_It1:loop Bru_It1>WKD_next else Bru_Ig21_tor2 condition memcompare * * 0 endevent event Bru_Ig21_tor2 multiple 5 Bru_It2 Bru_It2<Kon Bru_It2:loop Bru_It2>WKD_next else Bru_Ig21_tor1 condition memcompare * * 0 endevent
Symetryczna obsługa obu kierunków. Pierwszy event odczytuje nazwę rozkładu zbliżającego się pociągu i jest to w zasadzie formalność, gdyż nie jest ona potem używana. Kolejne 3 eventy sprawdzają stan blokady po przeciwnej stronie.
Jeśli blokada jest wolna (0), ustawiany jest przelot. Przelot jeszcze sprawdza, czy tor jest wolny, bo jeśli nie jest, to musi być wybrany drugi z torów. Jeśli blokada jest w tę samą stronę, to można pociąg wprowadzić na prosto, gdyż będzie on oczekiwał na zwolnienie blokady przez poprzedni pociąg. Jeśli blokada jest ustawiona w przeciwną stronę, to znaczy że trzeba oczekiwać na pociąg z przeciwka — nieco szybciej będzie wyjechać, jeśli wjedzie on na wprost.
Wyłączenie łączenia eventów
config joinduplicatedevents no endconfig
Wpis powyższy powoduje, że kolejne eventy o tych samych nazwach będą traktowane jako błędne.