Řízení provozu vlaků na nádraží
Nabízím zde popis řízení provozu na nádraží, což můžete realizovat jako semestrálku. Zadání není závazné; můžete něco vynechat, něco přidat.
Podstatné součásti nádraží:
- koleje a segmenty trati – mohou být volné, nebo obsazené
- výhybky
- semafory
Vstupní signály:
- obsazení segmentu (přijíždí vlak), uvolnění segmentu (vlak který jsme pustili na trať už odjel)
- vlak vjel na nádraží (budou různé signály pro příjezd na první nebo na druhou kolej; rovněž bude signalizováno, zda vlak směřuje doprava nebo doleva)
- vlak odjel z nádraží (kolej je volná; různé signály jako výše)
- vlak chce odjet z nádraží
Výstupní signály:
- rozsvěcení světel na semaforech
- překlápění výhybek
- obsazení segmentu (když na něj pustíme vlak), uvolnění segmentu (když vlak vjede na nádraží)
Rozmyslete si, co budete reprezentovat jako stavy (vlak stojí na koleji) a na co použijete pomocné stavové proměnné (obsazení segmentů).
Jednoduchý příklad provozu by pak vypadal takto:
- dostaneme signál, že segment Seg1 je obsazen (přijíždí vlak)
- za chvíli přijede vlak a vjede na kolej K1
- buď na semaforu S1 rozsvítíme červenou, nebo přehodíme výhybku V1 dolů
- nastavíme, že segment Seg1 je volný
- nějakou dobu se nic neděje
- vlak z koleje K1 chce odjet (pamatujeme si, že přijel zleva, takže odjede doprava)
- vlak můžeme poslat jen na volný segment – ve stavovém automatu nemáme if, ale můžeme to elegantně obejít:
- nechť true znamená, že segment je volný, respektive na semaforu svítí zelená, respektive výhybka je nastavena rovně; false samozřejmě obráceně
- výhybku V2 nastavíme podle toho, jestli je segment Seg2 volný; tedy V2 = Seg2
- na semaforu S2 rozsvítíme zelenou, pokud je alespoň jeden ze segmentů volný; tedy S2 = Seg2 or Seg3
- segment označíme jako obsazený:
- segment Seg2 bude obsazený v každém případě (buď už obsazený byl, nebo jsme tam poslali vlak); tedy Seg2 = 0
- segment Seg3 byl možná volný a možná také volný zůstal; tedy Seg3 = Seg3 and V2
- vlak odjede
- nějakou dobu se nic neděje
- dostaneme signál, že segment kam vlak odjel je volný
Snažte se zabránit situaci, kdy například na obou kolejích stojí vlaky směřující doleva a na segment Seg1 přijede vlak. Vlak může před nádražím čekat, ale vlaky na nádraží by vždy měly mít kudy odjet.
Úlohu si můžete zjednodušit: Když vlak požádá o odjezd z nádraží, ale to zrovna není možné, nemusíte si jeho žádost pamatovat. Prostě vlak budete ignorovat a on po chvíli požádá znovu.