Jindra Fučík

Automatický robot pro XpressNet

Motivací pro toto zařízení byla potřeba vytvářet různé automatizace a sekvence v digitálně řízeném modelovém kolejišti. Původně jsem měl tendence používat automatizace na úrovni elektrotechniky - tedy detektor obsazení sepne relé a tím se vyvolá příslušná akce. Tato metoda z počátku vypadala dobře, ale (stejně jako každé analogové řízení) postupem času přerůstala nade všechny meze, narážela na své limity a neumožňovala další rozvoj.
Proto jsem vytvořil relativně jednoduchého "robota", který se chová jako běžný ovladač, poslouchá na XpressNet sběrnici informace o přehození výhybky (změně příslušenství) a informace o změně na zpětném ohlasu (detekce obsazení). Na základě těchto informací pak dokáže vytvářet a přehrávat sekvence příkazů pro komplexnější příslušenství.
Příklady úloh, které je schopný robot řešit:
  • Ovládání závor (přejezdu) v závislosti na obsazení úseku (několika úseků)
  • Nastavit optimální cestu pro průjezd stanicí stiskem jednoho tlačítka
  • Zcela autonomně řešit průjezdy vlaků úseky jednodušších skrytých nádraží
  • Zcela autonomně řešit průjezdy vlaků bublinovou vratnou smyčkou
Pochopitelně pro všechny tyto akce je nutné, aby příslušenství bylo řízeno čistě digitálním způsobem.

XpressNet automatic robot

The motivation for this device was need for creation various automations and sequences in digitally controlled model train layout. Originally I have tendency to use automations on electro-technical level. It mean occupancy detector turn relay and it activate requested action. This method looks good at the begin, but (same as any analogue control) grow above all limits and fits all its borders and block next advancement.
That's why I created relatively simple "robot". Robot acts as usual controller, listen information on XpressNet bus information about turnout switch (change on accessory) and information about change of feedback (occupancy detector). It can create and play sequences of commands to control complex accessory based on those information.
Examples of tasks, can be solved by robot:
  • Control of barriers (road cross) based on occupancy detection(s)
  • Configure optimal pass through station by pressing one button
  • Autonomously solve passing trains through hidden yards
  • Autonomously solve passing trains through balloon reverse loop
Of course it is mandatory for all those actions, to have accessory controlled only by digital.

Princip fungování

Robot využívá procesor, který disponuje 128 řádky SAF (Storage Area Flash) paměti. Do této paměti je možné nahrát předpis pro robota. Předpis se vytváří pomocí programu v PC. Robot se k PC připojuje pomocí USB-serial převodníku. Převodníku je k dispozici velké množství zejména jako příslušenství k deskám Arduino Mini. Prodejní cena těchto modulů je menší, než cena součástek na nich, proto nemá cenu nějak řešit jejich výrobu.
Pro připojení k PC je na pravé straně modulu robota konektor označený "Prog". Robota propojíme s převodníkem a zasuneme do USB portu počítače.

Functional principle

Robot use processor, that utilise 128 lines of SAF (Storage Area Flash) memory. It is possible to upload instructions to this piece of memory. Instructions are created using PC program. Robot is connected to PC using USB-Serial converter. Here is available lot of those converters, especially as Arduino Mini board accessory. Sales price of those converters is smaller, than price of electronic components used on them. Then it make no sense to solve own production.
For connection to PC is on right hand side of robot header marked as "Prog". Connect robot to converter and then to computer USB port (yellow LED light).
Pro ovládání na straně počítače existuje aplikace XRobot. Tato jednoúčelová aplikace slouží pro vytvoření a nahrání předpisu (programu) pro robota.
Po nahrání předpisu je možné robota odpojit od USB portu a připojit ke kolejišti jako běžný XpressNet ovladač. Robot nejprve zkontroluje stav výhybek a obsazení (bliká zelená LED). Po přečtení začne normálně pracovat (zelená LED svítí).
To control on PC side application XRobot exist. This single-purpose application is designed to create and upload instructions (program) to robot.
When instructions are uploaded, robot can be unplugged from USB port and connected to layout as usual XpressNet controller. First of all robot will check status of turnouts and feedbacks (green LED blinking). When finished, robot will start working normally (green LED light).
Významná informace pro fungování je, že robot reaguje pouze na změny. To je podstatné a mohlo by to některé uživatele překvapit.
Robot má na první řádce definované události, na které reaguje. Událost může být přehození výhybky do daného směru (rovně/do odbočky), nebo obsazení/uvolnění úseku. Událost je definovaná samostatně a nikoli párově. Pokud tedy definujeme, že se událost spouští přehozením výhybky "do odbočky" a nedefinujeme událost pro přehození výhybky "rovně", bude robot přehození "rovně" ignorovat. To je podstatné zejména, pokud chceme používat ovládání jedním tlačítkem.
Vyhodnocování probíhá tak, že robot sleduje všechny události a pro každou se pokouší jí vyhledat v prvním řádku. Pokud jí najde, vykoná skok, který je definovaný za událostí. Vykonávání pak dále pokračuje podle předpisu v cílovém místě.
Robot rozeznává následující příkazy:
  • Přehodit výhybku (změna stavu příslušenství) do odbočky nebo rovně
  • Podmínka, je-li výhybka (příslušenství) ve stavu do odbočky nebo rovně
  • Podmínka, je-li ohlas ve stavu obsazeno nebo volno
  • Skok na adresu
  • Ukončit vykonávání programu
  • Konec předpisu (obsahuje parametry pro běh robota)
Každý příkaz má parametry pro identifikaci výhybky, nebo detektoru. Počet parametrů je pro různé příkazy různý (výhybky mají jednu adresu, detekce obsazení má adresu a číslo vstupu, ...).
Trochu záludný je příkaz "Konec předpisu", který má parametry pro běh robota. Tedy zejména XpressNet adresu a pak čas, jak dlouho se odesílá příkaz pro přehození výhybky (jak dlouho robot drží stisklé tlačítko) a jak dlouho se po ukončení čeká, než se zahájí další příkaz (jak dlouho trvá přehmátnutí na jiné tlačítko).

Pokud chceme změnit některý příkaz v tabulce se sekvencí příkazů pro robota, jednoduše stačí kliknout na zvolený příkaz v horním menu. Trochu pozor na to, že při změně mezi příkazem pro výhybku a pro detekci obsazení dochází ke změně počtu parametrů, takže se použije výchozí hodnota. Podobně při změně na příkaz skoku se mění význam parametrů. Proto je dobré si po každé změně kontrolovat, jestli parametry odpovídají očekávání.

V předpisu má každý prvek pod sebou několik čísel.
It is mandatory to know, that robot reacts only for changes. It is crucial and it can negative surprise some users.
On first line robot have defined events, robot react to them. Event can be switch of turnout to opposite direction (straight/turn), or change free/occupied on feedback. Events are defined as single, not in pairs. It mean, once we define event for change turnout "to turn", but not define event for turn "to straight", robot will ignore changes "to straight". That is interesting especially for some cases like control by one button.
Evaluation working that robot listen all events on XpressNet. For each event it try to find it in first row. Once found, execute jump next to event. Execution then continue based on instructions on target place.
Robot recognize following commands:
  • Switch turnout (change accessory state) to turn or to straight
  • Condition, once turnout (accessory) is in turn or in straight state
  • Condition, once feedback is in state occupied or free
  • Jump to address
  • End of execution
  • End of instruction script (that command contains parameters for robot run)
Each command have parameters for identification of turnout or feedback detector. Number of parameters vary for different commands (turnouts have single address, feedbacks have address and input number, ...).
Little tricky is "end of instruction script", that contain parameters for robot run. It mean XpressNet address and then time how long command for change of turnout is send (how long time holds turnout button pressed) and how long after change is waiting before next command starts (how long time change the grip to another button take).

Once you would like to change some command in table with sequence, simply click to selected command in top menu. Be a little careful, that change of command between turnout and feedback change number of parameters, then default value is used. Same as change to command for jump the parameter meaning is changed. Then it is good practice to check every change, that parameters are as expected.

In script each parameter have few numbers.
Čísla na první řádce jsou parametry příkazu. Na našem příkladu "přehoď výhybku číslo 1234 do odbočky". Druhé číslo je prostě pořadové číslo příkazu. Na našem příkladu se jedná o 128 příkaz v pořadí. To je důležité zejména pro skoky. Pokud chceme vytvořit skok, který směřuje na tento příkaz, pak to bude skok na adresu 128.

Jak vlastně fungují podmínky. Podmínky se vyhodnocují tak, že pokud je podmínka splněná, vykoná se následující příkaz. Pokud splněná není, následující příkaz se přeskočí a vykonávání pokračuje až od dalšího příkazu. Je celkem jedno, jaký je ten následující příkaz. Ve většině případů se bude jednat o příkaz skoku, ale není to bezpodmínečně nutné.

Význam první řádky. První řádka je takzvaně spouštěcí. Musí obsahovat pouze podmínky, následované skokem na adresu, kde dochází k vykonávání předpisu pro danou podmínku. Adresa skoku nemusí být unikátní. Pokud má například výhybka reagovat na obsazení jedné, nebo druhé koleje stejně, je možné vytvořit pouze jeden předpis, na který budou ukazovat skoky ze dvou míst. Je dobré vědět, že nejprve dojde k aktualizaci stavu výhybky, nebo detekce obsazení, a teprve potom dochází k vyhledávání vhodného předpisu. Ještě markantnější je tato situace v případě, že máme delší předpis, který se vykonává delší dobu. Pokud během vykonávání přijde informace o změně obsazení, je možné, že polovina předpisu uvidí úsek jako volný a druhá polovina jako obsazený. Předpisy se vykonávají po jednom. Trvá-li tedy vykonávání jednoho předpisu delší dobu, a mezitím přijde změna, která vede k vykonání dalšího předpisu, zařadí se do fronty a začne se vykonávat až po ukončení předchozího. Fronta má kapacitu pouze na tři záznamy. Pokud tedy přijde čtvrtý požadavek během vykonávání předchozích, není možné jej zařadit a informace o něm se definitivně ztratí. Také je důležité si uvědomit, že je možné vytvořit předpisy, které se budou volat navzájem. V takovém případě bude skutečně jejich vyhodnocování probíhat neustále dokola a bude docházet k nechtěnému přetížení centrály. Je potřeba si na tyto situace dávat pozor.

Nová řádka za příkazem konce vyhodnocování . Jedná se pouze o grafickou reprezentaci, která ve většině případů zjednodušuje čtení. Mohou však existovat případy, kdy příkaz konce vyhodnocování nemusí nutně znamenat konec předpisu. Klasickým příkladem je podmíněný konec vyhodnocování. Tedy situace, která se normální řečí řekne například: "Pokud je úsek obsazený, ukonči vyhodnocování, jinak přehoď výhybku...". Ideální by bylo udržet tento zápis na jedné řádce, například takto: . Bohužel za příkazem konce vyhodnocování dochází vždy k ukončení řádky, takže i zde dojde k tomu, že bude část předpisu pokračovat na další řádce.

Začátky předpisu na začátku řádky a skoky na začátek řádky. Není nutné vytvářet skoky vždy na první příkaz na řádce. Někdy může být užitečné část předpisu vynechat a skočit až do poloviny. To je zcela legitimní a podporovaná funkcionalita.

Vykonávání pouze jedné funkce pomocí jednoho robota. To v žádném případě není nutné. Robot je připraven vykonávat celou řadu různorodých funkcí a předpisů. Je možné obsluhovat několik přejezdů, hlídat několik výhybek a vratných smyček na různých stranách kolejiště. Platí, že je nutné dbát na to, aby nedošlo k vytvoření nekonečných smyček, nebo příliš dlouhým předpisům, které by znemožňovali vykonávání dalších akcí.

Omezení počtů. Robot je vytvořen v souladu s požadavky a doporučeními XpressNet 3.0 respektive 3.6. Udržuje proto informace o stavu výhybek 1-256 (jiné adresy XpressNet neumožňuje), nicméně lze přehodit výhybky 1-999. Stejně tak udržuje informace o stavu detekce obsazení pro adresy 65-128 pro osmi-vstupové detektory (šestnácti-vstupový detektor se chová jako dva osmi za sebou). Tato verze má k dispozici 128 příkazů (políček) pro předpis, délka řádky je jen grafická reprezentace, není nijak omezená (do limitu 128 příkazů).

Adresa. Robot je běžný XpressNet ovladač. Proto potřebuje unikátní XpressNet adresu (podobně jako například Roco MultiMaus v menu [3] Nastavení - [3] X-Bus - [1] Adresa). XpressNet umožňuje používat adresy 1-31, je tedy teoreticky možné připojit maximálně 31 robotů, ale pouze na úkor ostatních ovladačů. Adresa se nastavuje v parametrech příkazu konce předpisu .

Několik příkladů

Jeden z jednodušších příkladů je ovládání závor v závislosti na obsazení úseku.
Řekněme, že pokud je obsazen detektor 65.1, požadujeme stažení závor na adrese 6 (přehodit výhybku číslo 6 do stavu rovně). Při uvolnění úseku pak zvednout závory (přehodit výhybku číslo 6 do odbočky).
Numbers on first line are command parameters. In our case "switch turnout 1234 to turn". Second row number is simply sequence number. On our example that is 129 command in row. That is interesting especially for jumps. Once we would like to create jump to this command, it will be jump to address 128 then.

How conditions really works. Once condition is true, then following command is executed. Once is false, following command is skipped and execution script continue on next next command. It does not matter, what the following command is. In majority cases it will be command for jump, but it is not mandatory, any other command can be used.

Meaning of first line. First line is called starter line. It must contain only conditions, followed by jump to some address, where execution instructions for particular condition follows. Jump address don't have to be unique. For example when turnout have to react to occupancy of one section same as another section, we can create only one script and point to it jumps from two places. It is good to know, that first of all status of turnout or feedback is updated, and after that search for relevant starter condition starts. It is more significant, once you have longer script, that execute for some time. In case that for example new occupancy changes during script execution, it is possible, that first half of script will see block as empty and second will see same block as occupied. Scripts are executed one by one. It mean, once execution of one script take more time and during that time occurs new change, that result in execution of next script, this execution is stored into queue and will be executed, when the previous one ends. Queue capacity is three scripts only. Once fourth event occurs during execution of previous, here is no place to store, and information become lost. It is crucial to understand, that it is possible to create scripts, that can call each other. In reality they will be executed in infinite loop and will unnecessary flood command station by requests. It is necessary to keep those situations on mind.

New line after end of execution command . It is graphical representation only. That representation in majority of cases make reading more easy. Here can exist some special cases, vhen end of execution command does not mean end of script. Usual example is conditional end of execution. For example situations, that can be put in human language like: "Once section is occupied by train, stop execution, otherwise switch the turnout ...". In ideal case the script will remain in one line like: . Unfortunately end of execution command always end the line, then here as well and part of script will continue on next line.

Start of script at the begin of line and jumps to begin of line. It is not mandatory to have all jumps to begin of line only. It can be useful to ship some part of script and jump to some part. It is very legitimate and supported functionality.

Execute only one functionality by one robot. This is no way necessary. Robot is ready to execute whole series and wide variety of functions and scripts. It is possible to control lot of rail crossings, watch lot of turnouts and reverse loops on various sides of layout. You have to keep on mind to avoid infinite loops in scripts, to have not so long scripts that blocks execution of other actions.

Limits in numbers. Robot is build based on requirements and recommendation of XpressNet 3.0 respective 3.6. Then it keep information about turnouts 1-256 (XpressNet not allow other addresses), but it is possible to switch turnouts 1-999. Same way robot holds information about feedbacks for address 65-128 for eight-input detectors (once you have sixteen-input modules, they act as two eight-input in a row). This version have available 128 commands (fields) for script, row is graphical representation only, here does not exist any limit for row length (up to 128 commands limit).

Address. Robot working as standard XpressNet controller/throttle. Then it need unique XpressNet address (same as for example Roco MultiMaus in menu [3] Settings - [3] X-Bus - [1] Address). XpressNet allow address range 1-31. In the theory it is possible to connect up 31 robots. But that is valid only when no other controller is connected. Address is set in parameters of command end of script .

Few examples

One of simplest example is cross road barriers control based on section occupancy
Let us have occupancy detector 65.1. Once section is occupied, we need barriers on accessory address 6 go down (switch turnout 6 to straight direction). When it section free, barriers have to go up (change turnout 6 to divert direction).
První řádka tedy obsahuje reakci na uvolnění a obsazení úseku 65.1. První políčko je podmínka, v případě uvolnění úseku 65.1, vykonej předpis od adresy 5 (druhé políčko). Podobně třetí políčko je podmínka - pokud je obsazen úsek 65.1, vykonej předpis od adresy 7 (čtvrté políčko). Na pátém políčku je pak konec první řádky. Nic dalšího nevyhodnocujeme.
První políčko je na druhé řádce (adresa 5) obsahuje příkaz pro přehození výhybky 6 do odbočky (spouští se při uvolnění úseku, závory jdou tedy nahoru). Nic dalšího nepotřebujeme vykonávat, takže další políčko zase obsahuje pouze konec vykonávání předpisu. Políčko číslo 7 je začátek druhého předpisu, který se spouští při obsazení úseku 65.1. Zde je příkaz pro přehození výhybky 6 do směru rovně. Osmé políčko zase obsahuje konec předpisu.

Další jednoduchý příklad se hodí například pro Autonomní ovládání vratné smyčky, nebo jako prevence "říznutí" výhybky.
Tento příklad slouží jako náhrada za modul autonomní vratné smyčky. Různá kolejová schémata a metody přepínání polarity popsané u modulu autonomní vratné smyčky jsou platné i pro použití robota, nemá cenu je zde opakovat. Snad jen s drobnou poznámkou - pro přepínání polarity lze úspěšně použít DCC dekodér pro dvě relé s tím, že relé přidělíme stejnou adresu jako je adresa řídící výhybky.
Pro náš případ tedy použijeme následující schéma.
First line then contain reaction to free and occupancy of section 65.1. First field is condition, in case section 65.1 become free, execute script starting at address 5 (second field). Similar third field is condition - in case section 65.1 become occupied, execute script starting at address 7 (fourth field). On fifth field is end of first line; nothing more is evaluated.
First field on second row (have address 5) contain command for switch turnout number 6 to turn (it is executed once section is free, barriers go up). Nothing else needs to be executed, then next command is end of execution again. Field number 7 is begin of second script. This script is executed on occupancy of section 65.1. Here is command for switch of turnout 6 to straight direction. Field number eight is again end of execution.

Next simple example is useful for example as Autonomous control of reverse loop, or as prevention of cut the turnout.
This example work as replacement of autonomous reverse loop module. Variety of track layouts and methods of switching of polarity described with autonomous reverse loop module are valid with robot as well, then it make no sense to describe all of them. Small note only - for switching of polarity can be successfully used DCC two relay decoder, that have same turnout address as controlling turnout.
Let us have following track schema for our example.
Může se jednat o část bublinové vratné smyčky, nebo jen výhybku, u které chceme předejít průjezdu při nesprávném přehození (říznutí). Výhybka má adresu 8 a k ní přilehlé koleje mají detekované úseky 66.1 pro jízdu do odbočky a 66.2 pro jízdu rovně.

První řádka tedy obsahuje na prvním políčku reakci na obsazení úseku 66.1 a provádí skok na předpis od adresy 5 (druhé políčko), následně na třetím políčku reakci na obsazení úseku 66.2 a provádí skok na předpis od adresy 7 (čtvrté políčko). Poslední políčko je konec první řádky, nic dalšího vyhodnocovat nepotřebujeme.
Na druhé řádce je pouze příkaz pro přehození výhybky číslo 8 do odbočky a konec řádky. Stejně tak třetí řádka obsahuje pouze přehození výhybky číslo 8 do směru rovně a konec řádky.
It can be part of balloon reverse loop, or turnout, where we would like to avoid travel from incorrect side (cut). Turnout have address 8. Connected tracks have section detectors 66.1 for travel to turn and 66.2for travel to straight.

First row then contain in first field reaction for occupancy of section 66.1 and doing jump to script starting at address 5 (second field). Then on third field is reaction to occupancy of section 66.2 and jump to script starting on address 7 (fourth field). Last field is end of first line, we do not need anything else.
On second row is only command for switch of turnout number 8 to turn and end of line. Similar third line contain only switch of turnout number 8 to straight direction and end of line.
V předpisu nikde není reakce na uvolnění úseku. Pro předpis není důležitá, neexistuje žádná úloha, kterou by spouštěla.
Zvídaví čtenáři jistě správně tuší, že robot je schopný řešit i komplikovanější situace vratných smyček a komplikovanější metody přepínání polarity. Tyto situace jsou však značně individuální, proto je těžké je zde uvádět.


Je užitečné vědět jak vyřešit ovládání výhybky jedním tlačítkem
Tato úloha vyžaduje trochu upřesnění. Předpokládejme, že máme na ovládacím panelu jedno tlačítko, které například nastavuje výhybku číslo 3 do odbočky. Tímto tlačítkem chceme zařídit, aby se přehazovala výhybka střídavě "rovně" / "do odbočky". Tlačítko ovládá výhybku číslo 3, opravdová výhybka by měla být na jiné adrese, dejme tomu na adrese 6.
Pro vyhodnocování je podstatné, že robot reaguje pouze na změny, takže je nutné, aby se po stisku tlačítka následovalo něco, co vrátí výhybku do polohy "rovně". Vzhledem k tomu, že polohu "rovně" nepotřebujeme vyhodnocovat, je možné, aby to udělal sám robot.
První řádka tedy obsahuje jen reakci na přehození výhybky číslo 3 do odbočky, následovanou skokem na začátek předpisu. Pak je je konec první řádky.
Vlastní předpis začíná podmínkou, která se rozhoduje, jaký je stav výhybky číslo 6. Pokud směřuje rovně, provede se skok na další řádek, jinak předpis pokračuje. V tomto případě tedy výhybka 6 směřuje do odbočky a je čas jí přehodit rovně. Po vykonání tohoto příkazu ještě musíme vrátit výhybku číslo 3 do rovně, aby další stisk tlačítka znamenal změnu. Nyní je možné předpis ukončit. Na třetí řádek dojde vykonávání v případě, že je výhybka číslo 6 směřuje rovně. Je tedy čas jí přehodit do odbočky. I zde je nutné vrátit výhybku číslo 3 do rovně. Zde předpis končí.
Here is no reaction for free of sections. They have no value for scripts, here is not exist any task that has to be started by this event.
Inquisitive readers can recognize, that robot is able to solve more complex situations of reverse loops and more complex methods of switching of polarity. These situations are more individual, then it is hard to present them here.


It is useful to know, how to solve turnout control by one button
This task need more detailed description. Imagine, we have one button in control panel, that for example setting turnout number 3 to turn. This button has to arrange, that turnout will change between "straight" / "turn" direction. Button control turnout number 3, real turnout has to have different address, for example 6.
It is mandatory to know, that robot reacts only for changes. It is mandatory to manage, here is something, that will return turnout to "straight" position. Because we do not need to evaluate this direction, it can be switched by robot itself.
First line then contain reaction to switch of turnout 3 to turn, followed by jump to start of script. Last is end of first line.
Script itself starts with condition, that decide, what is status of turnout 6. Once it is straight, jump to next line is executed, otherwise script continue. In this case turnout number 6 pointing to turn and it is time to switch it to straight. When this command is executed, it is time to return turnout 3 to straight, then next push of button mean change. Now is possible to end the script. Third line is executed only when turnout 6 pointing to straight. It is time to set it to turn then. Here as well is mandatory to return turnout 3 to straight. Script ends here.
Mohlo by se zdát, že je možné předpis vyřešit pomocí dvou podmínek na jedné řádce, tedy například takto . Pokud je výhybka číslo 6 přehozená do odbočky, přehoď jí do směru rovně. Pokud je výhybka číslo 6 přehozená rovně, přehoď jí do odbočky. To ale není možné. Jde o to, že se stav výhybky aktualizuje vždy při změně. Takže přehození do směru rovně vede k aktualizaci stavu, takže druhá podmínka bude vždy splněná a výhybka vždy skončí ve směru do odbočky. It seems like, it is possible to solve script using two conditions at one line. For example like this . Once turnout 6 pointing to turn, switch it to straight, once turnout 6 pointing to straight, switch it to turn. But that is not possible. The problem is, that turnout status is updated directly when changed. It mean, that switch to straight mean update the state. Then second condition will be valid at any time and turnout will end up in turn direction.

Když už jsme zvládli ovládání jedním tlačítkem, můžeme si vyzkoušet ovládání průjezdu stanice jedním tlačítkem. Předpokládejme například následující kolejové schéma stanice o třech kolejích. Každá kolej má svůj detektor obsazení s adresou 65.1 - 65.3. Číslo koleje ve stanici odpovídá poslední číslici detektoru. Každá výhybka má své číslo 4 - 7 vyznačené nad výhybkou. Ovládací tlačítko odesílá příkaz pro přestavení výhybky 10 do odbočky.
We already mastered how to control by one button, we can try how to control pass through station by one button. Imagine we have for example following layout schematic of railway station with three tracks. Each track have own occupancy detector with address 65.1 - 65.3. Number of track in station is same as last digit of occupancy. Each turnout have own number 4 - 7 marked above the turnout. Control button send command for switch turnout 10 to turn.
Průjezd nádraží znamená postavení vlakové cesty s použitím nejvhodnější volné koleje. Ideální je kolej číslo 1 (65.1), která prochází nádražím rovně. Pokud je obsazená, pak je vhodná kolej číslo 2 (65.2) a pokud je i ta obsazená, je možné použít kolej číslo 3 (65.3). Na schématu není signalizace, jen by přidávala další opakování stejných příkazů. Bohužel tím pádem nelze použít omezení vjezdu jako reakci v případě, že je i třetí kolej obsazená. Musíme tedy předpokládat, že alespoň jedna kolej je volná.
Stejně jako v minulém příkladu první řádka obsahuje pouze reakci na přehození výhybky číslo 10 do odbočky, následovanou skokem na začátek předpisu. Pak je jen konec první řádky. Vlastní předpis pak začíná kontrolou, jestli není první kolej (65.1) obsazená. Pokud ano, následuje skok na předpis na následující řádce. Pokud není obsazená, pokračuje předpis na další krok, což je přehození výhybky 4 do polohy rovně, pak přehození výhybky 5 rovně, přehození výhybky 6 rovně a přehození výhybky 7 rovně (všechny výhybky rovně). Nakonec musíme přehodit výhybku 10 rovně, aby mohlo dojít k další aktivaci. Pak následuje konec řádky.
Další řádka předpisu je velice podobná jako předchozí. Začíná kontrolou, jestli je druhá kolej (65.2) obsazená. Pokud ano, následuje skok na předpis na následující řádce. Pokud není obsazená, pokračuje předpis na další krok, což je přehození výhybky 4 do odbočky a pak přehození výhybky 7 do odbočky (výhybky 5 a 6 nejsou pro vlakovou cestu podstatné). Zase ukončení výhybkou 10 rovně. Pak jen konec řádky.
Předpis na posledním řádku nemá žádnou další alternativu. Předpokládá, že když vyhodnocování došlo až sem, není jiná možnost a cesta musí být postavena s použitím třetí (65.3) koleje. Obsahuje tedy příkazy pro přestavení výhybky 4 rovně, výhybky 5 do odbočky, výhybky 6 do odbočky a výhybky 7 rovně. Pochopitelně ukončení výhybky 10 rovně. Pak jen konec předpisu.
Pass through station mean build of way with using best possible free track. Ideal one is track 1 (65.1), that passing through station in straight direction. Once is occupied, then second optimal is track 2 (65.2) and once it is occupied, we can use track number 3 (65.3). We have no signalling lights on schematic. It will only add repeating of still same commands. Unfortunately we can't use limit of entrance as universal reaction for cases, that third track is occupied. We have to assume, that at minimum one track is free.
Same as previous example, first line contain only reaction to switch of turnout 10 to turn, followed by jump to begin of script. And then end of line. Script itself start with check, if first track (65.1) is occupied. If yes, follow jump to script on next line. If track is free, script continue to next field. Next field is switch turnout 4 to straight, next is switch turnout 5 to straight, next is switch turnout 6 to straight and switch turnout 7 to straight (all turnouts straight). At the end we have to switch turnout 10 to straight, to be able receive next activation. That is last command, then end of line follows.
Next script line is very similar as previous. It start with check if second track (65.2) is occupied. If is occupied, then jump to next line follows. If track is free, script continue to next field, that field is switch turnout 4 to turn position and then switch turnout 7 to turn position (turnouts 5 and 6 are not used). Again finish with switch turnout 10 to straight, to be able receive next activation. That is last command, then end of line follows.
Script on last line have no other alternative. It assume, that once evaluation end up here, we have no other option and way has to be done using third (65.3) track. It contains command to switch turnout 4 straight, turnout 5 to divert, turnout 6 to divert and turnout 7 to divert. Of course last command is switch turnout 10 to straight. Then end of script.
Takto zapsaný předpis je trochu hrubý v tom, že se pokouší přestavovat výhybky bez ohledu na to, jestli jsou a nebo nejsou přestavěné. Technicky to ničemu nevadí, snad jen tomu, že to zpomaluje vykonávání předpisu. Je možné před každý příkaz pro přehození výhybky doplnit podmínku, zda již není výhybka ve správném směru. V takovém případě se nám poněkud prodlouží předpis, jeho vykonávání však bude efektivnější. V tomto případě se jedná o zvážení otázky, jestli nás víc omezuje možná délka předpisu, nebo čas přestavění výhybek. Script defined like this is little rough, that it try to switch turnouts to position, without checking they are in position already. That is no issue technically, only it increase script execution time. It is possible to add condition, if turnout is in correct direction already and switch them only if it is not. In that case we will have little longer script, but execution time will be more effective. In this case we have to solve question, we are more focused to script length, or to execution time.



Download: XRobot.zip - X-Robot Loader