AMiTsys Expert
Střední průmyslová škola elektrotechnická, Havířov 2007/2008
ŘÍZENÍ KŘIŽOVATKY Havířov 2008
Ing. Václav Sedlák Vedoucí pedagog
Martin Čala Vypracoval
Děkuji firmě AMiT za možnost zúčastnit se soutěže AMiTsys Expert a také za vybavení učebny, ve které tento projekt vznikal. Děkuji také panu Ing. Václavu Sedlákovi za jeho obětavé a odborné vedení.
1
OBSAH 1. Úvod ...........................................................................................................................3 2. Zadání .........................................................................................................................4 3. Cíle..............................................................................................................................5 3.1. Projekt řeší .........................................................................................................5 3.2. Projekt neřeší .....................................................................................................5 4. Metodika.....................................................................................................................6 4.1. Rozvržení prostředků ..........................................................................................6 4.2. Realizace cyklického opakování .........................................................................6 5. Výsledky.....................................................................................................................8 5.1. Proměnné.............................................................................................................8 5.2. Aliasy proměnných..............................................................................................9 5.3. Procesy ................................................................................................................9 5.3.1. Stanice č. 4..............................................................................................10 5.3.2. Stanice č. 5..............................................................................................10 5.4. Obrazovky .........................................................................................................11 5.5. Hardwarové nastavení .......................................................................................11 6. Splnění cílů ...............................................................................................................12 7. Závěr .........................................................................................................................13 8. Odkazy......................................................................................................................14
2
1. Úvod Od školního roku 2005/2006 jsem studentem oboru Automatizační technika na Střední průmyslové škole elektrotechnické v Havířově. V druhém ročníku jsem začal navštěvovat kroužek Automatizace pod vedením učitele Ing. Václava Sedláka a dozvěděl jsem se o Vaší soutěži AMiTsys Expert. Doprava na pozemních komunikacích roste stále větším tempem, a zákonitě musí růst i počet uzlů, např. ve formě křižovatek. Tyto uzly je ale třeba nějakým způsobem ovládat. Proto jsem se rozhodl pro projekt, který bude ovládat křižovatku.
3
2. Zadání Sestavit program pro ovládání křižovatky. Program bude ovládat semafory pro auta a chodce. V obou směrech budou pro dopravní prostředky semafory pro jízdu rovně, doleva a doprava. Pro směr rovně a doleva budou semafory s červeným, oranžovým a zeleným světlem. Směr doprava bude signalizován pouze zeleným světlem. Pro chodce budou ovládány vždy semafory se zelenou a červenou. Křižovatka bude pro zjednodušení symetrická, takže když přijede dopravní prostředek z jakékoli větve křižovatky, bude mít stejné podmínky jako dopravní prostředek přijíždějící z jakéhokoli jiného směru. Křižovatka bude rozlišovat pracovní dny od víkendů. V pracovní dny budou nastávat tři stavy. První z nich bude „Noční režim“, jehož trvání bude od 22:00 do 6:00 hodin. Druhý bude „Normální režim“, který bude aktivován od 6:00 do 22:00 hodin, ale od 12:00 do 16:00 hodin bude rozšířen na třetí režim – „Dopravní špičku“. V tomto stavu bude muset chodec zmáčknout tlačítko, aby se mu na semaforu rozsvítila zelená. Jinak bude mít stále červenou. O víkendech nebude stav „Dopravní špička“ aktivní, ostatní bude identické s chováním v pracovní dny. Přihlášený uživatel bude moci měnit provozní parametry a to přímo na stanici pomocí displeje a klávesnice. Přihlašovací údaje budou nastaveny v programu.
4
3. Cíle Budu se snažit udělat takovou křižovatku, která bude částečně modifikovatelná uživatelem, čímž se zvýší její flexibilita. Obrazovky budu tvořit tak, aby jejich ovládání bylo pro obsluhu intuitivní a přehledné. Chtěl bych také minimalizovat potřebné finanční náklady na realizaci tohoto projektu. Tvořit budu s ohledem na jednoduchost a účelnost.
3.1. Projekt řeší Tento projekt řeší pouze vytvoření programu a realizaci propojení řídících systémů k zajištění jejich správné komunikace.
3.2. Projekt neřeší Projekt neřeší fyzické zapojení vstupů a výstupů. Dále v něm není uvažována žádná kabeláž ani stavební úpravy a zásahy potřebné pro realizaci.
5
4. Metodika Ve škole mám k dispozici řídící systém AMiNi2D firmy AMiT. Je to kompaktní řídící systém s displejem a klávesnicí s osmi tlačítky.
4.1. Rozvržení prostředků Nejprve jsem si rozvrhnul rozestavení semaforů (příloha č. 1). Zjistil jsem, že v každé větvi křižovatky bude potřeba sedm digitálních výstupů pro auta – po třech pro směr rovně a doleva a jeden výstup pro směr doprava. U chodců jsou to dva výstupy na každou větev. Pro jeden směr je tedy potřeba celkem 9 výstupů, celkem je to tedy 36 digitálních výstupů. Protilehlé větve křižovatky budou ale ovládány symetricky, takže se počet výstupů omezí na polovinu, tedy 18. Tolik výstupů na řídícím systému ale není, dospěl jsem tedy k závěru, že budu muset počet digitálních výstupů zvětšit spojením více řídících systémů. Nechtěl jsem totiž používat žádný externí obvod chovající se jako dekodér, kterým by se tato situace dala řešit. K pokrytí všech výstupů by bylo třeba třech stanic, protože AMiNi2D má 8 digitálních výstupů. Já si ale vystačím pouze s dvěma stanicemi. Na každé z nich využiji 8 digitálních výstupů a zbývající jeden zobrazím pomocí na analogového výstupu, jehož hodnoty napětí v log. 0 a log. 1 budou externě upraveny na hodnoty stejné jako mají výstupy digitální, tj. od 0 do 24 V. Tato možnost bude finančně úspornější oproti použití třech stanic. Posílání dat do druhé stanice jsem zařídil pomocí linky RS485. Oproti Ethernetu je jednodušší v aplikaci i samotném nastavení, a k danému účelu mi poslouží přibližně stejně. Takto budu posílat proměnné z hlavní stanice do druhé, která bude hodnoty zobrazovat na fyzických výstupech. Hlavní stanice bude přijímat veškeré vstupy (i z obrazovek) a bude v ní celý řídící algoritmus. K propojení obou stanic jsem použil kroucenou dvojlinku, třetí vodič jsem nezapojoval. Není to sice úplně správné řešení, ale propojení jsem zkoušel v laboratorních podmínkách, kde je riziko rušení malé. Komunikace při testu fungovala.
4.2. Realizace cyklického opakování Když jsem se rozhodoval, jak realizovat přechod z jednoho stavu křižovatky do druhého a zařídit tak cyklické opakování, nejdříve mě napadlo klasické řešení pomocí čítače, který by postupně inkrementoval vnitřní hodnotu a na výstupu by se podle ní zobrazovala určitá kombinace rozsvícených nebo zhasnutých světel na semaforech. Po uplynutí všech cyklů by se výstup resetoval na nulu a čítání by probíhalo od začátku.
6
Já jsem ale chtěl mít možnost měnit délky průběhu jednotlivých stavů bez nutnosti zásahu do programu, takže jsem byl nucen tuto metodu opustit. Nakonec jsem nalezl jiný způsob, ve kterém využiji zpožďovací modul TON. Ten zpozdí vstupní signál IN o čas trvání celé periody křižovatky (signál PT). Z tohoto modulu použiji výstup ET, ve kterém je ukládán průběžný čas od začátku zpožďování vstupního signálu, a jeho hodnotu budu porovnávat s nastavenými konstantami. Podle toho budou nastavovány hodnoty na výstupu. V okamžiku zobrazení log. 1 na výstupu Q bude hodnota na vstupu resetována a čítání bude probíhat znovu od začátku. Bude ale nutné splnit podmínku, aby součet jednotlivých časových konstant byl roven délce celé jedné periody, jinak by se program choval nepředvídatelně. Podmínka bude hlídána v programu. Hodnoty jednotlivých konstant bude moci měnit uživatel na obrazovkách po platném přihlášení. Rozsvěcování jednotlivých semaforů jsem navrhnul tak, aby se při dodržení světelné signalizace nemohly střetnout auta ani chodci jedoucí nebo jdoucí různými směry. Podrobné rozkreslení všech stavů jednotlivých semaforů je v příloze č. 2.
7
5. Výsledky 5.1. Proměnné Výpis proměnných je v příloze č. 3. •
DI0 – proměnná pro uchování veškerých fyzických vstupů na ŘS, do které jsou ukládány bitové informace zapnutí a vypnutí křižovatky a také tlačítka chodců,
•
DO00 – uchování hodnot pro rozsvěcování světel semaforů na hlavní větvi křižovatky (stanice 4),
•
DO10 – uchování hodnot pro rozsvěcování světel semaforů na vedlejší větvi křižovatky (uchována ve stanici 5),
•
A1Z – rozšíření proměnné „DO00“ o devátý bit – hodnota je analogová,
•
A2Z – obdoba proměnné „A1Z“ pro proměnnou „DO10“, je umístěna ve stanici 5,
•
stav – uchování informace o režimu křižovatky (rozlišení normálního stavu, dopravní špičky a nočního režimu) a rozlišení všedních dnů od víkendových,
•
stavx – obdoba proměnné „stav“, ve které jsou hodnoty upraveny pro obrazovky,
•
tk1 – úložiště hodnot časových konstant pro stav noční režim,
•
tk2 – obdoba proměnné „tk1“ pro normální režim a dopravní špičku,
•
prubeh1 – průbežný čas od začátku jedné periody v nočním režimu,
•
prubeh2 – průběžný čas od začátku jedné periody v normálním režimu a dopravní špičce,
•
komb1 – proměnná, používaná v nočním režimu, určující jednotlivý stav křižovatky, podle kterého se rozsvěcují požadované světla na semaforech,
•
komb21 – obdoba proměnné „komb1“ pro normální stav a dopravní špičku,
•
komb22 – rozšíření 16 bitů z proměnné „komb21“ na 20,
•
ch_tl – uložení informace o zmáčknutí tlačítek pro chodce po celou dobu trvání jedné periody, ve stavu noční režim není používaná,
•
cas – uložení času ve stanici, používán je formát DB-Net,
•
cas_hodn – aktuální čas rozdělený do položek, podle kterých je určován režim křižovatky,
•
cas_zmena – signalizace změny času,
•
prihlasen – proměnná používaná pouze v rámci obrazovek, signalizuje zda je uživatel přihlášen nebo ne,
8
5.2. Aliasy proměnných Seznam aliasů proměnných lze nalézt v příloze č. 4. •
@zapnout – bit, kterým se zapne běh křižovatky,
•
@vypnout – bit, kterým se vypne běh křižovatky,
•
@A1RZ – zelené světlo v hlavním směru pro auta rovně,
•
@A1RO – oranžové světlo v hlavním směru pro auta rovně,
•
@A1RC – červené světlo v hlavním směru pro auta rovně,
•
@A1LZ – zelené světlo v hlavním směru pro auta doleva,
•
@A1LO – oranžové světlo v hlavním směru pro auta doleva,
•
@A1LC – červené světlo v hlavním směru pro auta doleva,
•
@Ch1Z – červené světlo v hlavním směru pro chodce,
•
@Ch1C – zelené světlo v hlavním směru pro chodce,
•
@A2RZ – zelené světlo ve vedlejším směru pro auta rovně,
•
@A2RO – oranžové světlo ve vedlejším směru pro auta rovně,
•
@A2RC – červené světlo ve vedlejším směru pro auta rovně,
•
@A2LZ – zelené světlo ve vedlejším směru pro auta doleva,
•
@A2LO – oranžové světlo ve vedlejším směru pro auta doleva,
•
@A2LC – červené světlo ve vedlejším směru pro auta doleva,
•
@Ch2Z – červené světlo ve vedlejším směru pro chodce,
•
@Ch2C – zelené světlo ve vedlejším směru pro chodce,
•
@beh – signalizace běhu křižovatky,
•
@Ch1Tl – tlačítko pro chodce v hlavním směru,
•
@Ch2Tl – tlačítko pro chodce ve vedlejším směru,
•
@znovu1 – bit pro resetování náběhu jedné periody pro noční režim,
•
@znovu2 – bit pro resetování náběhu jedné periody pro normální režim a dopravní špičku.
5.3. Procesy Zdrojové kódy procesů jsou v příloze č. 5.
9
5.3.1. Stanice č. 4 proces0 Definice vazeb na analogové vstupy a digitální vstupy a výstupy. proces1 V tomto procesu je realizováno zapnutí a vypnutí běhu křižovatky. Dále je zde podle konkrétního stavu pomocí modulu TON navyšována hodnota proměnné „prubeh1“ nebo „prubeh2“ a tato hodnota je dále zpracována v procesu „proces2“. Překročení povolené délky periody je zde ošetřeno pomocí aliasu @znovu1 resp. @znovu2, který modul při překročení hodnoty prvku proměnné „tk1[0,0]“ resp. „tk2[0,0]“ TON vynuluje a náběh probíhá opět od začátku. Proces také řeší vstupy z tlačítek chodců, kde alias @Ch1Tl resp. @Ch2Tl je vstup z tlačítek. Při zmáčknutí tlačítka klopný obvod RS aktivuje výstup (0., resp. 1. bit proměnné „ch_tl“) nutný pro zapamatování. Pomocí 5. a 6. bitů proměnné „ch_tl“ lze výstup RS klopného obvodu deaktivovat. proces2 Tento proces je nejobsáhlejší. Nejdříve jsou v něm sečteny dílčí časy pro jednotlivé stavy v hlavní, podle kterého je řízena délka celé jedné periody. Poté je zpracován čas ve stanici do položek reprezentujících jednotlivé údaje. Podle jedné z nich – dne v týdnu – je určeno, zda se jedná o všední den či o víkend. Pak je podle aktuální hodiny určen jeden ze tří stavů, které mohou nastat. O víkendech jsou pouze dva (bez dopravní špičky). Podle stavu jsou nastaveny hodnoty proměnné „stav“. Je nastavována také hodnota proměnné „stavx“ kvůli zobrazení aktivního stavu i na obrazovkách. Podle stavu a aktuálního času jsou nastaveny proměnné „komb1“ resp. „komb21“ („komb22“). Nakonec je těmto stavům přiřazena odpovídající kombinace výstupů. Nakonec je ještě upravena signalizace při stavu dopravní špička, kdy si musí chodec zmáčknout tlačítko, aby mohl přejít na zelenou. proces3 Proces pro zajištění vazby s obrazovkami.
5.3.2. Stanice č. 5 proces0 Vazba na digitální a analogové výstupy.
10
proces1 Obdoba procesu „proces3“ ve stanici č. 4 pro zajištění vazby na obrazovky.
5.4. Obrazovky Soupis obrazovek a jejich náhled je ke zhlédnutí příloze č. 6. Úvodní obrazovka zobrazuje informace o dni v týdnu, stavu křižovatky (noční režim, normální režim a dopravní špička) a aktuálním času na stanici, podle kterého se stavy určují. Na další obrazovce je dialog pro přihlášení uživatele. Nadefinoval jsem 3 uživatele, každý má své uživatelské jméno, heslo a skupinu: •
Martin (heslo 9008) – můj testovací účet,
•
AMiT (6592) – tento účet může používat skupina vývojářů,
•
DP (3920) – účet pro dopravní podnik, který může křižovatku používat.
Uživatelské skupiny zde nemají velký význam, mají totiž stejná oprávnění. Po platném přihlášení je uživateli zpřístupněna další sada obrazovek, ve kterých může nastavovat časové konstanty nebo odhlásit se. Mezi obrazovkami se pohybuje pomocí tlačítek doleva ← a doprava →. Na stanici č. 5 je pouze jedna obrazovka, která odkazuje uživatele ke stanici č. 4.
5.5. Hardwarové nastavení Pro komunikaci přes rozhraní RS485 je nutné jej správně zapojit. Stačí vzájemně spojit kroucenými stíněnými vodiči vývody A a B na stanicích. Spojení vývodů GND není nutné, ale doporučuje se. Vhodné je pro spojení použít stínění kabelu a omezit tak potenciální rušení. Proti odrazům signálů ve vedení se musí zapojit zakončovací odpory a definice klidových stavů. Takto je už ale AMiNi2D zapojeno z výroby, takže není třeba jej měnit. Pro aktivaci rozhraní RS485 je nutné nadefinovat DIP přepínače pro softwarovou konfiguraci. Nutné je nastavit pro obě stanice stejnou přenosovou rychlost (přepínače 6 a 7) a po nahrání programů do obou stanic nastavit přepínačům 8 hodnotu zapnuto (tento bit přepíná mezi rozhraním RS232 a RS485). Přepínače 1 až 5 určují binárně číslo stanice, na první (hlavní) je to číslo 4, na druhé číslo 5. Po změně nastavení přepínačů je nutné resetovat napájení, aby se projevily provedené změny. Poté už může být zahájen provoz. Nastavovat lze i jiné přepínače, ale ty přímo nesouvisí s nastavením komunikace. 11
6. Splnění cílů Podařilo se mi vytvořit program, který bude daný problém ovládat. Domnívám se, že po ekonomické stránce je můj projekt poměrně úsporný. Mohl by být ale ještě levnější, kdybych místo dvou stanic použil rozšiřující moduly pro digitální výstupy, ale realizace komunikace pro mně byla zajímavou zkušeností, kterou budu moci v budoucnu dobře využít. Kvůli malému počtu řádků na displeji jsem v obrazovkách pro nastavení časových konstant pro normální režim a dopravní špičku odstranil kontrastní horní pásek s nadpisem. Namísto něj jsem umístil do pravého dolního rohu označení obrazovek skládající se z písmene a čísla, které by mělo pásek nahradit a pomoci tak identifikovat konkrétní obrazovku obsluze.
12
7. Závěr Tvorba tohoto projektu pro mne byla novou a zajímavou zkušeností. Mnou provedený projekt by našel asi jen malé využití, protože je navrhnut pro jeden konkrétní typ křižovatky. Program by ale šlo modifikovat na více typů křižovatek při zachování stejného principu. Nové dovednosti, které jsem si osvojil, jistě využiji v dalším studiu a budu se je snažit dále rozšiřovat.
13
8. Odkazy •
www.amit.cz – technická podpora
•
projektantská příručka firmy AMiT
•
manuál k ŘS AMiNi2D
14
Příloha č. 1 - Rozmístění jednotlivých semaforů
Z
Č
Č
Z Č
Z
Z O Č
Z
Z O Č
Z Č
Z
Z
O
Č
Z
O
Č
Č
O
Z
Č
O
Z
Z Č O Z
Č Z
Č O Z
Č Z
Z
Svisle - hlavní směr Vodorovně - vedlejší směr
Z
Č
Č
Z
Příloha č. 2 - Stavy 1. Normální provoz 2. Dopravní špička - chodec si musí zmáčknout tlačítko, aby mohl přejít, jinak má červenou 3. Noční režim - chodci mají semafory vypnuté, autům bliká oranžová.
Normální provoz Vlevo Č O Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Hlavní směr Rovně Vpravo Č O Z Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Pěší Č Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Vlevo Č O Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Vedlejší směr Rovně Vpravo Č O Z Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Pěší Č Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Pěší Č Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Vlevo Č O Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Vedlejší směr Rovně Vpravo Č O Z Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Pěší Č Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Dopravní špička Vlevo Č O Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Hlavní směr Rovně Vpravo Č O Z Z 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Noční režim Hlavní směr Vlevo Rovně Vpravo Pěší Č O Z Č O Z Z Č Z 1 1
Vedlejší směr Vlevo Rovně Vpravo Pěší Č O Z Č O Z Z Č Z 1 1
Příloha č. 3 - Seznam proměnných Hlavní stanice Jméno DI0 DO00 stavx prihlasen tk1 tk2 cas cas_hodn cas_zmena ch_tl stav prubeh1 komb1 komb21 komb22 A1Z prubeh2 DO10 A2Z
WID 4000 4001 4002 4003 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4018 5001 5002
Typ dbtInt dbtInt dbtIntMtx dbtInt dbtLongMtx dbtLongMtx dbtLong dbtIntMtx dbtInt dbtInt dbtInt dbtLong dbtInt dbtInt dbtInt dbtFloat dbtLong dbtInt dbtFloat
Stanice 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5
Komentář hlavni zap/vyp + tlacitka chodci hl. smer semafory auta prom. `stav` pro obrazovky prihlasen-prihlaseni na obrazovce cas. konst. nocni rezim cas. konst. normal+dopr. spicka aktualni cas na stanici cas v jednotlivych polozkach indikace zmeny nejake polozky tl. chodci + stav kriz. konkretni stav prubezny cas nocni rezim kombinace vystupu nocni rezim vystupy norm. stav+spicka #1 vystupy norm. stav+spicka #2 auta zelena doprava hl. smer prubezny cas norm+dopr. spicka vedl. smer semafory auta auta zelena doprava vedl. smer
Vedlejší stanice Jméno DO10 A2Z
WID Typ 5001 dbtInt 5002 dbtFloat
Stanice Komentář 5 semafory auta hl. smer+doleva, chodci 5 auta doprava vedl. smer
Příloha č. 4 - Seznam aliasů Hlavní stanice Alias @zapnout @vypnout @A1RZ @A1RO @A1RC @A1LZ @A1LO @A1LC @Ch1Z @Ch1C @A2RZ @A2RO @A2RC @A2LZ @A2LO @A2LC @Ch2Z @Ch2C @beh @Ch1Tl @Ch2Tl @znovu1 @znovu2
Proměnná DI0.2 DI0.3 DO00.0 DO00.1 DO00.2 DO00.3 DO00.4 DO00.5 DO00.6 DO00.7 DO10.0 DO10.1 DO10.2 DO10.3 DO10.4 DO10.5 DO10.6 DO10.7 ch_tl.2 DI0.0 DI0.1 ch_tl.3 ch_tl.4
Komentář zapnuti krizovatky vypnuti krizovatky 1 auta rovne zelena 1 auta rovne oranzova 1 auta rovne cervena 1 auta leva zelena 1 auta leva oranzova 1 auta leva cervena 1 chodci zelena 1 chodci cervena 2 auta rovne zelena 2 auta rovne oranzova 2 auta rovne cervena 2 auta leva zelena 2 auta leva oranzova 2 auta leva cervena 2 chodci zelena 2 chodci cervena indikace behu krizovatky 1 chodci tlacitko 2 chodci tlacitko reset nabehu nocni rezim reset nabehu norm.+dopr. spicka
Vedlejší stanice Ve vedlejší stanici nejsou použity žádné aliasy proměnných.
Příloha č. 5 - Seznam procesů Hlavní stanice Proces proces0 proces1 proces2 proces3
Typ Pse RS Pse Pse
Perioda 100 100 200 1000
Ofs/Hrana 0 0 0 0
Komentář definice I/O promennych hlavni vypinac + tlacitka chodci nastaveni vystupu podle stavu vazba na obrazovky
proces0 // vazba na digitalni vstup (tl. chodci, hl. vyp.) DigIn #0, DI0, 0x0000 // vazba na digitalni vystup (hl. smer) DigOut DO00, #0, 0x0000 // nahrazka dig. vystupu (hl. smer) AnOut #0.0, A1Z, 10.000, 0.000, 10.000, 0.000, 10.000
proces1
proces2 // soucet celkoveho casu pro 1 periodu (nocni rezim) let tk1[0,0] = tk1[1,0]+tk1[2,0] // soucet celk. casu pro 1 periodu (dopr. spicka + normal. provoz) let tk2[0,0] = tk2[1,0]+tk2[2,0]+tk2[3,0]+tk2[4,0]+tk2[5,0]+tk2[6,0]+tk2[7,0]+tk2[8,0]+tk2[9,0]+t k2[10,0] let tk2[0,0] = tk2[0,0]+tk2[11,0]+tk2[12,0]+tk2[13,0]+tk2[14,0]+tk2[15,0]+tk2[16,0]+tk2[17,0]+tk2 [18,0]+tk2[19,0]+tk2[20,0] // zpracovani casu do polozek gettime cas, cas_hodn, cas_zmena // NASTAVENI PRAC. STAVU PODLE DNE V TYDNU A HODINY // stav.3 urcuje pracovni den let stav.3 = if((cas_hodn[6,0]==0)or or(cas_hodn[6,0]==6), false, if or false true) true if stav.3, :NONE // pracovni dny (stavx[y,z] je pro obrazovky) // dopravni spicka let stavx[0,0] = if((cas_hodn[2,0]>=12)and and(cas_hodn[2,0]<=15), 1, 0) if and // nocni rezim let stavx[1,0] = if((cas_hodn[2,0]>5)and and(cas_hodn[2,0]<22), 0, 1) if and // normalni provoz let stavx[2,0] = if(stavx[1,0]==1, 0, 1) if // nocni rezim and(cas_hodn[2,0]<22), false, let stav.0 = if((cas_hodn[2,0]>5)and if and false true) true // dopravni spicka let stav.1 = if((cas_hodn[2,0]>=12)and and(cas_hodn[2,0]<=15), true, if and true false) false // normalni provoz let stav.2 = if(stav.0==false false, if false true, true false) false else :NONE // soboty a nedele (pouze nocni rezim a normalni provoz) // dopravni spicka let stavx[0,0] = 0 // nocni rezim let stavx[1,0] = if((cas_hodn[2,0]>5)and and(cas_hodn[2,0]<22), 0, 1) if and // normalni provoz let stavx[2,0] = if(stavx[1,0]==1, 0, 1) if // nocni rezim and(cas_hodn[2,0]<22), false, let stav.0 = if((cas_hodn[2,0]>5)and if and false true) true // dopravni spicka let stav.1 = false // normalni provoz let stav.2 = if(stav.0==false false, if false true, true false) false endif // NASTAVOVANI JEDNOTLIVYCH STAVU ------------------------------------------if stav.0, :NONE // nocni rezim Let komb1.0 = if((prubeh1<=tk1[1,0])and and(prubeh1>0), true, if and true false) false Let komb1.1 = if((prubeh1<=tk1[2,0])and and(prubeh1>tk1[1,0]), true, if and true false) false endif // zkontrolovat, zda bude fungovat u obou if stav.2, :NONE // normalni provoz a dopravni spicka Let komb21.0 = if((prubeh2<=tk2[1,0])and and(prubeh2>0), true, if and true false) false Let komb21.1 = if((prubeh2<=tk2[2,0])and and(prubeh2>tk2[1,0]), true, if and true false) false Let komb21.2 = if((prubeh2<=tk2[3,0])and and(prubeh2>tk2[2,0]), true, if and true false) false Let komb21.3 = if((prubeh2<=tk2[4,0])and and(prubeh2>tk2[3,0]), true, if and true false) false Let komb21.4 = if((prubeh2<=tk2[5,0])and and(prubeh2>tk2[4,0]), true, if and true false) false Let komb21.5 = if((prubeh2<=tk2[6,0])and and(prubeh2>tk2[5,0]), true, if and true false) false Let komb21.6 = if((prubeh2<=tk2[7,0])and and(prubeh2>tk2[6,0]), true, if and true false) false Let komb21.7 = if((prubeh2<=tk2[8,0])and and(prubeh2>tk2[7,0]), true, if and true false) false Let komb21.8 = if((prubeh2<=tk2[9,0])and and(prubeh2>tk2[8,0]), true, if and true false) false Let komb21.9 = if((prubeh2<=tk2[10,0])and and(prubeh2>tk2[9,0]), true, if and true false) false Let Let Let Let
komb21.10 komb21.11 komb21.12 komb21.13
= = = =
if((prubeh2<=tk2[11,0])and and(prubeh2>tk2[10,0]), if and if((prubeh2<=tk2[12,0])and and(prubeh2>tk2[11,0]), if and if((prubeh2<=tk2[13,0])and and(prubeh2>tk2[12,0]), if and if((prubeh2<=tk2[14,0])and and(prubeh2>tk2[13,0]), if and
true, true true, true true, true true, true
false) false false) false false) false false) false
Let Let Let Let Let Let endif
komb21.14 = if((prubeh2<=tk2[15,0])and and(prubeh2>tk2[14,0]), true, if and true false) false komb21.15 = if((prubeh2<=tk2[16,0])and and(prubeh2>tk2[15,0]), true, if and true false) false komb22.0 = if((prubeh2<=tk2[17,0])and if and(prubeh2>tk2[16,0]), true, true false) false and komb22.1 = if((prubeh2<=tk2[18,0])and and(prubeh2>tk2[17,0]), true, if and true false) false komb22.2 = if((prubeh2<=tk2[19,0])and and(prubeh2>tk2[18,0]), true, if and true false) false komb22.3 = if((prubeh2<=tk2[20,0])and and(prubeh2>tk2[19,0]), true, if and true false) false
// SAMOTNE ROZSVECOVANI SEMAFORU // rozsviceni semaforu nocni rezim if komb1.0, :NONE let @A1RC = false let @A1RO = true let @A1RZ = false let @A1LC = false let @A1LO = true let @A1LZ = false let @Ch1C = false let @Ch1Z = false let A1Z = 0.0 let let let let let let let let let endif
@A2RC @A2RO @A2RZ @A2LC @A2LO @A2LZ @Ch2C @Ch2Z A2Z =
= false = true = false = false = true = false = false = false 0.0
if komb1.1, let @A1RO let @A1LO let @A2RO let @A2LO endif
:NONE = false = false = false = false
// rozsviceni semaforu normalni provoz + dopravni spicka if stav.2, :NONE if komb21.0, :NONE let @A1RC = true let @A1RO = false let @A1RZ = false let @A1LC = true let @A1LO = false let @A1LZ = false let @Ch1C = true let @Ch1Z = false let A1Z = 0.0 let @A2RC = true let @A2RO = false let @A2RZ = false let @A2LC = true let @A2LO = false let @A2LZ = false let @Ch2C = true let @Ch2Z = false let A2Z = 0.0 endif if komb21.1, :NONE let @A1RO = true let @Ch2C = false let @Ch2Z = true endif if komb21.2, :NONE let @A1RC = false let @A1RO = false let @A1RZ = true endif if komb21.3, :NONE let @Ch2C = true
let @Ch2Z = false endif if komb21.4, :NONE let A1Z = 10.0 endif if komb21.5, :NONE let @A1RO = true let @A1RZ = false let A1Z = 0.0 endif if komb21.6, :NONE let @A1RC = true let @A1RO = false endif if komb21.7, :NONE let @A1LO = true endif if komb21.8, :NONE let @A1LC = false let @A1LO = false let @A1LZ = true endif if komb21.9, :NONE let @A1LO = true let @A1LZ = false endif if komb21.10, :NONE let @A1LC = true let @A1LO = false endif if komb21.11, :NONE let @Ch1C = false let @Ch1Z = true let @A2RO = true endif if komb21.12, :NONE let @A2RC = false let @A2RO = false let @A2RZ = true endif if komb21.13, :NONE let @Ch1C = true let @Ch1Z = false endif if komb21.14, :NONE let A2Z = 10.0 endif if komb21.15, :NONE let @A2RO = true let @A2RZ = false let A2Z = 0.0 endif if komb22.0, :NONE let @A2RC = true let @A2RO = false endif if komb22.1, :NONE let @A2LO = true endif if komb22.2, :NONE let @A2LC = false let @A2LO = false let @A2LZ = true endif if komb22.3, :NONE let @A2LO = true let @A2LZ = false // reset tlacitek chodci let ch_tl.5 = true let ch_tl.6 = true endif // uprava semaforu pro chodce pri zmacknuti tlacitka // je-li aktivni stav `dopravni spicka`
if stav.1, :NONE // tl. hlavni smer if ch_tl.0, :NONE else :NONE // neni zmacknute let @Ch1C = true let @Ch1Z = false endif // tl. vedlejsi smer if ch_tl.1, :NONE else :NONE // neni zmacknute let @Ch2C = true let @Ch2Z = false endif endif endif
proces3 Lcw3Idle NONE
Vedlejší stanice Proces proces0 proces1
Typ Pse Pse
Perioda Ofs/Hrana Komentář 100 0 vazba na vystupy 1000 0 vazba na obrazovky
proces0 // semafory auta rovne, doleva vedl. smer + chodci DigOut DO10, #0, 0x0000 // semafor zelena auta doprava AnOut #0.0, A2Z, 10.000, 0.000, 10.000, 0.000, 10.000
proces1 Lcw3Idle NONE
Příloha č. 6 - Seznam obrazovek Hlavní stanice Obrazovka Screen1 Screen2 Screen3 Screen4 Screen5 Screen6 Screen7
Počet prvků 17 4 11 12 12 10 6
Komentář uvodni informace (stav, den, cas) prihlaseni uzivatele editace cas. konst. nocni rezim editace cas. konst. normal.+dopr. spicka #1 editace cas. konst. normal.+dopr. spicka #2 editace cas. konst. normal.+dopr. spicka #3 odhlaseni uzivatele
Screen1
event Screen1_OnOpen() Screen1.FocusFirstControl(); // labely 5 (nocni), 6 (normalni), 7 (dopr. spicka) Label5.Visible = false; false Label6.Visible = false; false Label7.Visible = false; false if(stavx[0,0] == 1) then if Label7.Visible = true; true endif; endif if(stavx[1,0] == 1) then if Label5.Visible = true; true endif; endif if(stavx[2,0] == 1) then if Label6.Visible = true; true endif; endif // dny v týdnu (Label8..Label14) Label8.Visible = false; false Label9.Visible = false; false Label10.Visible = false; false Label11.Visible = false; false Label12.Visible = false; false Label13.Visible = false; false Label14.Visible = false; false if(cas_hodn[6,0] == 1) then if // pondeli Label8.Visible = true; true else if(cas_hodn[6,0] == 2) then if // utery Label9.Visible = true; true else if(cas_hodn[6,0] == 3) then if // streda Label10.Visible = true; true else if(cas_hodn[6,0] == 4) then if // ctvrtek Label11.Visible = true; true else if(cas_hodn[6,0] == 5) then if // patek Label12.Visible = true; true else
if(cas_hodn[6,0] == 6) if // sobota Label13.Visible = else // nedele Label14.Visible = endif; endif endif; endif endif; endif endif; endif endif; endif endif; endif
then true; true true; true
end; end // tl. doleva event Key1_OnKeyPress() if(prihlasen.0 == true) if true then Screen7.Show(); else // prihlaseni Screen2.Show(); endif; endif end; end // tl. doprava event Key2_OnKeyPress() if(prihlasen.0 if == true) true then Screen3.Show(); else // prihlaseni Screen2.Show(); endif; endif end; end
Screen2
event Screen2_OnOpen() Screen2.FocusFirstControl(); // muze delat problemy prihlasen.0 = false; false end; end // zadal-li spravne uziv. jm. a heslo, je prihlasen event Login1_OnAccessGrant() prihlasen.0 = true; true Screen3.Show(); end; end // tl. doleva event Key1_OnKeyPress() Screen1.Show(); end; end // tl. doprava event Key2_OnKeyPress() if(prihlasen.0 == true) if true then // mozna ani nemusi byt Screen3.Show(); else Screen1.Show(); endif; endif end; end
Screen3
event Screen3_OnOpen() Screen3.FocusFirstControl(); end; end // tl. doleva event Key1_OnKeyPress() Screen1.Show(); end; end // tl. doprava event Key2_OnKeyPress() Screen4.Show(); end; end // tl. dolu event Key3_OnKeyPress() Screen3.NextFocus(); end; end
Screen4
event Screen4_OnOpen() Screen4.FocusFirstControl(); end; end // tl. doleva event Key1_OnKeyPress() Screen3.Show(); end; end // tl. doprava event Key2_OnKeyPress() Screen5.Show(); end; end // tl. dolu event Key3_OnKeyPress() Screen4.NextFocus(); end; end
Screen5
event Screen5_OnOpen() Screen5.FocusFirstControl(); end; end // tl. doleva event Key1_OnKeyPress() Screen4.Show();
end; end // tl. doprava event Key2_OnKeyPress() Screen6.Show(); end; end // tl. dolu event Key3_OnKeyPress() Screen5.NextFocus(); end; end
Screen6
event Screen6_OnOpen() Screen6.FocusFirstControl(); end; end // tl. doleva event Key1_OnKeyPress() Screen5.Show(); end; end // tl. doprava event Key2_OnKeyPress() Screen7.Show(); end; end // tl. dolu event Key3_OnKeyPress() Screen6.NextFocus(); end; end
Screen7
event Screen7_OnOpen() Screen7.FocusFirstControl(); end; end // tl. doleva event Key1_OnKeyPress() Screen6.Show(); end; end // tl. doprava event Key2_OnKeyPress() Screen1.Show(); end; end // odhlaseni event Key3_OnKeyPress() prihlasen.0 = false; false Screen1.Show(); end; end
Vedlejší stanice Obrazovka Screen1
Počet prvků 3
Komentář odkazani na druhou stanici
Screen1
event Screen1_OnOpen() Screen1.FocusFirstControl(); end; end
Řízení křižovatky Návod k obsluze
Martin Čala
Ovládací panel Ovládací panel (obr. 1) je umístěn na čelní straně AMiNi2D. Je překryt průhledným plastovým dvířkem, které umožňuje vidět hodnoty na displeji, ale pro ovládání tlačítek je nutné kryt odklopit.
Obr. 1 – pohled na displej s klávesnicí AMiNi2D
Hlavní stanice (stanice č. 4)
Obr. 2 – úvodní obrazovka na první stanici
Na hlavní obrazovce (obr. 2) lze vidět stav, ve kterém se křižovatka nachází. Ten je zobrazen na druhém řádku. Na dalším řádku je den v týdnu, který je závislý na času ve stanici. Na obrazovce není chyba, jednotlivé položky jsou totiž navrstveny na sobě a přebývající písmeno „k“ je ze dne čtvrtek. Na posledním řádku je zobrazen čas, který je také závislý na interním času stanice. Položka „Stav“ a „Den“ se změní pouze při opětovném zobrazení této obrazovky. Může se tedy stát, že budou tyto informace zobrazeny nesprávně, ale při přechodu na jinou obrazovku a návratu zpět se už zobrazí správné údaje.
Přihlášení
Obr. 3 – přihlašovací dialog
1
Přihlašovací formulář je na další obrazovce (obr. 3). Šipkami nahoru ↑ a dolů ↓ se v položce „Jméno“ mění jeden ze tří nastavených uživatelů (Martin, AMiT nebo DP). Po vybrání se tlačítkem Enter přenese kurzor na položku „Heslo“. Nastavení čtyřmístného hesla se provádí po jednotlivých cifrách. Po zadání údajů se stiskne opět tlačítko Enter. Při správnosti zadaných údajů je uživatel přihlášen a je mu zpřístupněna sekce s nastavováním časových konstant.
Obr. 4 – nastavování časových konstant pro noční režim
Po přihlášení je aktivní další obrazovka, ve které se nastavují časové konstanty pro noční režim (obr. 4). Tlačítkem dolů se posouvá aktivní prvek, na kterém je možné měnit hodnotu určité konstanty. Nastavování číselných hodnot se opět provádí postupně po jednotlivých cifrách. Celkový čas (položka „Celkem“) se po nastavení dílčích časů přepočítá automaticky. Tato obrazovka má označení „A1“, které v následujících obrazovkách nahrazuje horní kontrastní pásek a zlepšuje tak přehlednost.
Obr. 5-7 – nastavování časových konstant pro normální stav a dopravní špičku
Obrazovky pro nastavování ostatních časových konstant (obr. 5-7) jsou velice podobné té předcházející. Pořadí prvků jde po sloupcích, při stisku tlačítka dolů je aktivován následující prvek. Protože je hodnot pro nastavení 20, byly rozloženy celkem na 3 obrazovky. 2
Na té poslední (obr. 7) je i celkový čas trvání periody, který se přepočítává opět automaticky. Orientaci mezi obrazovkami usnadňuje označení v pravém dolním rohu (B1 - B3).
Obr. 8 – odhlášení uživatele
Při přechodu na poslední obrazovku se objeví obrazovka, na které je možné uživatele odhlásit. Po odhlášení je přepnuto na první obrazovku se zobrazením stavu křižovatky. Pak je uživateli povolen přístup pouze k prvním dvěma obrazovkám.
Vedlejší stanice (stanice č. 5)
Obr. 9 – vedlejší stanice
Druhá stanice má pouze jednu obrazovku (obr. 9), která nemá žádný vliv na funkčnost procesu. Pouze odvolává uživatele k displeji hlavní stanice.
3