Z´ apadoˇ cesk´ a univerzita v Plzni Fakulta aplikovan´ ych vˇ ed Katedra kybernetiky
´ PRACE ´ DIPLOMOVA
Mˇeˇric´ı a poradn´ı syst´em pro vˇetr´an´ı v historick´ych budov´ach
Plzeˇ n, 2010
ˇ Michal Sirok´ y
´ SEN ˇ ´I PROHLA Pˇredkl´ad´am k posouzen´ı a obhajobˇe diplomovou pr´aci zpracovanou na z´avˇer studia na Fakultˇe aplikovan´ ych vˇed Z´apadoˇcesk´e univerzity v Plzni. Prohlaˇsuji, ˇze jsem diplomovou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım odborn´e literatury a pramen˚ u, jejichˇz u ´pln´ y seznam je jej´ı souˇca´st´ı.
V Plzni dne 21. kvˇetna 2010
Anotace Tato diplomov´a pr´ace se zab´ yv´a n´avrhem a realizac´ı mˇeˇric´ıho a poradn´ıho syst´emu pro udrˇzov´an´ı pˇr´ızniv´eho klimatu v historick´ ych budov´ach pomoc´ı monitorov´an´ı parametr˚ u ´ vzduchu a doporuˇcov´an´ı spr´avn´eho zp˚ usobu vˇetr´an´ı. Uloha je ˇreˇsena na konkr´etn´ım pˇr´ıpadˇe budovy konventu b´ yval´eho cisterci´ack´eho kl´aˇstera v Plas´ıch. Pr´ace se vˇenuje popisu probl´em˚ u pam´atkov´ ych budov s vysokou vzduˇsnou vlhkost´ı a pˇrich´az´ı s moˇznost´ı jejich ˇreˇsen´ı. Je zde pops´an n´avrh bezdr´atov´eho mˇeˇric´ıho syst´emu ˇ a speci´alnˇe vyvs pouˇzit´ım hardware M-Board vyvinut´eho na Katedˇre kybernetiky ZCU inut´eho software v jazyce Java. Realizovan´ y mˇeˇric´ı syst´em je um´ıstˇen a u ´spˇeˇsnˇe provozov´an v budovˇe konventu NKP Kl´aˇster Plasy. V´ ysledky jsou uvedeny v z´avˇeru t´eto pr´ace. Kl´ıˇcov´a slova: kl´aˇster Plasy, konvent, vlhkost, teplota, rosn´ y bod, voda, vzduch, vˇetr´an´ı, M-Board, Microlog, Java, ZigBee, XML-RPC, PDF, SVG, XML, bezdr´atov´ y mˇeˇric´ı syst´em, NetBeans, Eclipse, IAR.
Annotation This diploma thesis concerns the design and realization of measurement and expert system to keep favourable climatic conditions inside of historical buildings by monitoring parametres of air and recommending the correct manners of ventilation. This problem is being solved on the example of the convent building of the former Cistercian monastery in Plasy. The work describes the problem of high air humidity which is common in most of historical buildings and comes with a solution. It describes design of wireles measurement system which uses a hardware device called M-Board – developed in the Department of Cybernetics of the University of West Bohemia – and custom-made software in Java language. Implemented measurement system has been sucessfully installed and run in convent of the Plasy Monastery. The results are presented in the conclusion of this thesis. Key words: Plasy monastery, convent, humidity, temperature, dew point, water, air, ventilation, M-Board, Microlog, Java, ZigBee, XML-RPC, PDF, SVG, XML, wireless measurement system, NetBeans, Eclipse, IAR.
Na tomto m´ıstˇe dˇekuji vedouc´ımu t´eto pr´ace, panu Doc. Ing Eduardu Janeˇckovi, CSc ˇ se kter´ a d´ale pak Ing. Ondˇreji Jeˇzkovi a Ing. Tom´aˇsi Pern´emu z KKY FAV ZCU, ymi jsem konzultoval nˇekter´e postupy ve sv´e pr´aci a tak´e zamˇestnanc˚ um NKP Kl´aˇster Plasy: Mgr. Pavlu Duchoˇ novi, Mgr. Sylvˇe Kroˇc´akov´e, Zdeˇ nku Formanovi a Martinˇe Hoˇskov´e, kteˇr´ı dopomohli u ´spˇeˇsn´emu zprovoznˇen´ı vyvinut´eho mˇeˇric´ıho syst´emu v budovˇe konventu ˇ akovi z firmy SPELEO. plask´eho kl´aˇstera a tak´e Josefu Reh´
Obsah ´ 1 Uvod 1.1 C´ıle pr´ace . . . . . . . . . . . . . . . . . . . 1.2 Probl´emy klimatu v pam´atkov´ ych budov´ach 1.3 Kl´aˇster Plasy . . . . . . . . . . . . . . . . . 1.4 Pˇredchoz´ı ˇreˇsen´ı probl´emu . . . . . . . . . . 1.4.1 Shrnut´ı pˇredchoz´ıch v´ ysledk˚ u . . . . 1.5 Nov´ y mˇeˇric´ı syst´em . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
2 Pˇ r´ıprava ˇ reˇ sen´ı 2.1 V´ yvojov´e n´astroje . . . . . . . . . . . . . . . . . . 2.1.1 Programov´an´ı M-Boardu . . . . . . . . . . 2.1.2 Tvorba aplikace pro PC . . . . . . . . . . 2.2 Dalˇs´ı hardwarov´e prvky syst´emu . . . . . . . . . . ˇ 2.2.1 Cidla teploty a relativn´ı vlhkosti vzduchu . 2.2.2 Moduly bezdr´atov´e komunikace . . . . . . 2.2.3 Nap´ajen´ı syst´emu . . . . . . . . . . . . . . 2.3 Pouˇzit´e softwarov´e knihovny tˇret´ıch stran . . . . . 2.3.1 Vizualizace dat . . . . . . . . . . . . . . . 2.3.2 Export graf˚ u do vektorov´ ych form´at˚ u . . . 2.3.3 Pr´ace s XML soubory . . . . . . . . . . . 2.3.4 Komunikace pˇres s´eriovou linku . . . . . . 2.3.5 Komunikace pomoc´ı XML-RPC . . . . . . 2.3.6 Nejmenˇs´ı ˇctverce . . . . . . . . . . . . . . 2.3.7 Ikony . . . . . . . . . . . . . . . . . . . . . 3 V´ yvoj Software pro PC 3.1 Reprezentace dat . . . . . . . . . . 3.2 Reprezentace ˇcasu . . . . . . . . . . 3.2.1 Operace s ˇcasem . . . . . . 3.2.2 Intervaly . . . . . . . . . . . 3.3 Uchov´av´an´ı dat v operaˇcn´ı pamˇeti . 3.4 Zpracov´an´ı dat . . . . . . . . . . . 3.4.1 Zlomek . . . . . . . . . . . . 3.4.2 Rosn´ y bod . . . . . . . . . . 3.5 Export dat . . . . . . . . . . . . . . 3.6 Vizualizace dat . . . . . . . . . . . 3.7 Editor vizualizaˇcn´ıch profil˚ u . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
4 Mˇ eˇ ric´ı aplikace 4.1 Server . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Ovl´ad´an´ı mˇeˇric´ıho zaˇr´ızen´ı . . . . . . . . 4.2 Klient . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Automatick´a komunikace se serverem . . 4.2.2 Sledov´an´ı hodnot a informov´an´ı uˇzivatele
5
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . .
. . . . . .
7 7 7 7 9 9 13
. . . . . . . . . . . . . . .
15 15 15 15 17 17 17 17 17 18 18 19 19 19 19 19
. . . . . . . . . . .
19 20 20 20 24 25 27 30 32 33 35 38
. . . . .
38 39 42 42 43 46
5 V´ yvoj software pro M-Board 5.1 Uchov´av´an´ı dat v operaˇcn´ı pamˇeti . ˇ ızen´ı bˇehu programu . . . . . . . 5.2 R´ 5.3 Mˇeˇren´ı . . . . . . . . . . . . . . . . 5.4 Komunikace . . . . . . . . . . . . . 5.5 Zas´ıl´an´ı dat . . . . . . . . . . . . .
. . . . .
47 47 48 49 49 50
. . . . .
50 50 52 53 54 54
7 Instalace mˇ eˇ ric´ıho syst´ emu 7.1 Instalace hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Instalace software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Uk´azka namˇeˇren´ ych dat . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55 55 57 59
8 Z´ avˇ er
61
. . . . .
. . . . .
. . . . .
. . . . .
6 Pˇ r´ıprava hardware ´ 6.1 Uprava mˇeˇric´ı karty . . . . . . . . . . . . . 6.2 Zapojen´ı a nap´ajen´ı ˇcidel . . . . . . . . . . 6.3 Nastaven´ı modul˚ u bezdr´atov´e komunikace 6.4 Kalibrace ˇcidel . . . . . . . . . . . . . . . 6.5 Drˇz´ak a kryt venkovn´ıho ˇcidla . . . . . . .
6
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
´ Uvod
1 1.1
C´ıle pr´ ace
C´ılem t´eto diplomov´e pr´ace je navrhnout a realizovat mˇeˇric´ı a poradn´ı syst´em, kter´ y usnadn´ı udrˇzov´an´ı pˇr´ızniv´eho klimatu v historick´ ych a pam´atkov´ ych budov´ach pomoc´ı monitorov´an´ı parametr˚ u vzduchu a doporuˇcov´an´ı spr´avn´eho zp˚ usobu vˇetr´an´ı.
1.2
Probl´ emy klimatu v pam´ atkov´ ych budov´ ach
V t´eto ˇca´sti je tˇreba upˇresnit, pro jak´ y typ budov je syst´em zam´ yˇslen. Pam´atkovou, ˇci historickou budovou, je myˇslena starˇs´ı stavba zaˇrazen´a do pam´atkov´e ochrany. S takov´ ymi budovami se zpravidla poj´ı n´asleduj´ıc´ı vlastnosti: • Stavba m´a siln´e obvodov´e zdivo, vˇetˇsinou kamenn´e, nebo cihlov´e. Chyb´ı tepeln´a izolace. • S ohledem na finanˇcn´ı n´aroˇcnost u ´drˇzby takov´e stavby, nejsou vˇetˇsinou interi´ery pˇres zimu vyt´apˇeny. • V budovˇe je velmi ˇcasto zanedban´e vˇetr´an´ı. • V minulosti byly na budovˇe prov´adˇeny konstrukˇcn´ı u ´pravy, kter´e mohly pˇrispˇet k vˇetˇs´ımu nas´ak´an´ı zdiva vodou, ˇci zhorˇsen´ı moˇznost´ı ventilace interi´eru. • P˚ uvodn´ı znalosti o zp˚ usobu u ´drˇzby budovy bud’ chyb´ı, nebo nen´ı moˇzn´e je pˇri souˇcasn´em stavu budovy aplikovat. Jako konkr´etn´ı pˇr´ıpad takov´e budovy m˚ uˇze slouˇzit konvent b´ yval´eho cisterci´ack´eho kl´aˇstera v Plas´ıch.
1.3
Kl´ aˇ ster Plasy
Kl´aˇster v Plas´ıch (cca 25 km severnˇe od Plznˇe) byl zaloˇzen roku 1144 kn´ıˇzetem Vladislavem II. Cisterci´aˇct´ı mniˇsi, kteˇr´ı n´aslednˇe do Plas pˇriˇsli, zaloˇzili, v duchu stavebn´ı tradice sv´eho ˇra´du, kl´aˇstern´ı budovy v u ´doln´ı nivˇe ˇreky Stˇrely. P˚ uvodn´ı budovy byly dˇrevˇen´e, od poˇca´tku 13. stolet´ı jiˇz kamenn´e. Souˇcasn´a podoba kl´aˇstera poch´az´ı z nejvˇetˇs´ı ˇc´asti z 18. stolet´ı. Budova konventu, kter´a je pˇredmˇetem z´ajmu t´eto pr´ace, byla vystavˇena v barokn´ım slohu v 1. polovinˇe 18. stolet´ı a jej´ımi architekty byli Jan Blaˇzej Santini a Kili´an Ign´ac Dientzenhoffer. Konvent je zaloˇzen na baˇzinat´em podloˇz´ı. Pod traktov´ ymi zdmi budovy je zatluˇceno zhruba 5100 dubov´ ych pilot a na nich je poloˇzen´ y dubov´ y roˇst. Teprve na tomto roˇstu stoj´ı veˇsker´a v´aha zdiva. Dˇrevˇen´ y roˇst je chr´anˇen pˇred hnit´ım tak, ˇze je neust´ale potopen pod vodou, kter´a je pod budovu pˇriv´adˇena pomoc´ı d˚ umysln´eho syst´emu kan´al˚ u. Pro sledov´an´ı stavu vody v z´akladech slouˇz´ı dva baz´eny um´ıstˇen´e v rizalitech jiˇzn´ıho a severn´ıho schodiˇstˇe. Tyto baz´eny se naz´ yvaj´ı vodn´ı zrcadla. Pˇr´ıtomnost pomalu proud´ıc´ı vody pod budovou a otevˇren´e vodn´ı hladiny uvnitˇr budovy s sebou nese nˇekolik probl´em˚ u. Jedn´ım z nich je trvale n´ızk´a (avˇsak pomˇernˇe st´al´a) teplota v pˇr´ızemn´ım patˇre konventu. Teplota v pˇr´ızem´ı je z velk´e ˇca´sti urˇcov´ana teplotou vody, kter´a se podle roˇcn´ıho obdob´ı 7
pohybuje v rozmez´ı 5 a 15◦ C. Teplota vzduchu v pˇr´ızem´ı m˚ uˇze vystoupat aˇz na 18◦ C. Voda ze zrcadel se odpaˇruje do vzduchu a zvyˇsuje jeho vlhkost. Vzduch, kter´ y do budovy pˇrich´az´ı z venˇc´ı a dostane se do styku se zdmi v pˇr´ızem´ı se ochlad´ı a pokud pˇredt´ım obsahoval pˇr´ıliˇs mnoho vodn´ı p´ary, vlhkost z tohoto schlazen´eho vzduchu na stˇen´ach zkondenzuje. Kondenzace vody na stˇen´ach a ve dˇrevˇen´e konstrukci hlavn´ıho schodiˇstˇe je velmi neˇza´douc´ı. V t´eto pr´aci se budu zab´ yvat metodou, kter´a umoˇzn´ı minimalizovat riziko kondenzace vlhkosti v budovˇe.
Obr´azek 1: P˚ udorys budovy konventu Na obr´azku 1 je zn´azornˇena budova konventu z vyznaˇcen´ım jej´ıch hlavn´ıch ˇca´st´ı: 1. Nemocniˇcn´ı kˇr´ıdlo 2. Kapituln´ı s´ıˇ n 3. Rizalit severn´ıho schodiˇstˇe a severn´ı vodn´ı zrcadlo 4. Rajsk´ y dv˚ ur – Povrch rajsk´eho dvora je oproti vnˇejˇs´ımu ter´enu u ´myslnˇe nav´ yˇsen o cca 3 metry. Hmota navezen´e zeminy slouˇz´ı mimo jin´e k akumulaci tepla v letn´ıch mˇes´ıc´ıch. 5. Rizalit jiˇzn´ıho schodiˇstˇe a jiˇzn´ı vodn´ı zrcadlo 6. Rizalit zimn´ı a letn´ı j´ıdelny Svˇetle ˇsed´a plocha na p˚ udorysu vyznaˇcuje tzv ambitov´e chodby a ˇsachty hlavn´ıch schodiˇst’, kter´e jsou hlavn´ımi cestami proudˇen´ı vzduchu v budovˇe. Na chodb´ach se nach´az´ı celkem zhruba 150 oken, kter´a je moˇzn´e vyuˇz´ıvat k vˇetr´an´ı. Manipulace s okny je plnˇe manu´aln´ı a pˇri otev´ır´an´ı ˇci zav´ır´an´ı vˇsech oken v 1. a 2. patˇre je v budovˇe nutn´e uj´ıt cca 600m.
8
Obr´azek 2: Pohled na jihoz´apadn´ı kˇr´ıdlo konventu pˇres rajsk´ y dv˚ ur
1.4
Pˇ redchoz´ı ˇ reˇ sen´ı probl´ emu
Ve sv´e bakal´aˇrsk´e pr´aci z roku 2008 jsem se zab´ yval n´avrhem a realizac´ı prototypov´eho technick´eho zaˇr´ızen´ı, kter´e bylo n´aslednˇe od 13. dubna do 5. ˇcervna um´ıstˇeno v konventu a nepˇretrˇzitˇe zaznamen´avalo teplotu a relativn´ı vlhkost vzduchu v pˇetiminutov´em intervalu. Z´akladem tohoto zaˇr´ızen´ı byl pr˚ umyslov´ y poˇc´ıtaˇc WinCon-8731 vybaven´ y dvˇema ˇcidly relativn´ı vlhkosti a teploty vzduchu Humirel HTM1735. Pomoc´ı WinConu byly mˇeˇreny vlastnosti vzduchu na chodbˇe v 1. nadzemn´ım podlaˇz´ı a u jihov´ ychodn´ı stˇeny ve v´ yˇsce cca 10m nad zem´ı. Soustava WinConu a ˇcidel byla d´ale doplnˇena dvˇema dataloggery relativn´ı vlhkosti a teploty vzduchu Microlog, kter´e jsou v majetku NKP Kl´aˇster Plasy. Pomoc´ı tˇechto pˇr´ıstroj˚ u bylo moˇzn´e z´ıskat dostateˇcn´e mnoˇzstv´ı dat vypov´ıdaj´ıc´ıch o chov´an´ı vzduchu v budovˇe a reakc´ıch budovy na r˚ uzn´e zp˚ usoby vˇetr´an´ı. 1.4.1
Shrnut´ı pˇ redchoz´ıch v´ ysledk˚ u
Podrobnˇejˇs´ı informace o budovˇe konventu, pouˇzit´ ych zaˇr´ızen´ıch a z´ıskan´ ych v´ ysledc´ıch v roce 2008 lze nal´ezt ve zmiˇ novan´e bakal´aˇrsk´e pr´aci [1]. Zde se budu vˇenovat jen struˇcn´emu shrnut´ı z´ıskan´ ych v´ ysledk˚ u. Pro usnadnˇen´ı pochopen´ı dalˇs´ıho textu je jeˇstˇe nutn´e uv´est a vysvˇetlit nˇekter´e pojmy, kter´e se t´ ykaj´ı kvality vzduchu a se kter´ ymi se bude d´ale pracovat. Znalosti t´ ykaj´ıc´ı se problematiky vlhkosti vzduchu jsem z´ıskal v [5]. V´ıce je tato problematika rozvedena v m´e bakal´aˇrsk´e pr´aci [1]. • Absolutn´ı vlhkost (%p ) – Hmotnost vodn´ı p´ary obsaˇzen´e v 1m3 vlhk´eho vzduchu • Relativn´ı vlhkost (ϕ, RH ) – Pomˇer mnoˇzstv´ı par aktu´alnˇe obsaˇzen´ ych ve vzduchu k maxim´aln´ımu mnoˇzstv´ı par, kter´e m˚ uˇze b´ yt ve vzduchu obsaˇzeno pˇri dan´e teplotˇe. • Rosn´y bod – Stav, pˇri kter´em je vzduch nasycen vodn´ımi parami. Pod pojmem rosn´y bod se rozum´ı i teplota, pˇri kter´e tento stav nastane. C´ılem pˇredchoz´ı bakal´aˇrsk´e pr´ace bylo vytvoˇrit pravidla pro spr´avn´e vˇetr´an´ı v konventu tak, aby se bˇehem jarn´ıch a letn´ıch mˇes´ıc˚ u podaˇrilo budovu vnˇejˇs´ım vzduchem 9
co nejv´ıce vyhˇr´at a souˇcasnˇe zamezit kondenzaci vzduˇsn´e vlhkosti v pˇr´ızemn´ım patˇre budovy. Pravidla formulovan´a v z´avˇeru bakal´aˇrsk´e pr´ace byla n´asleduj´ıc´ı: 1. Aby se probl´em s vlhkost´ı vzduchu v pˇr´ızem´ı nezvyˇsoval, je moˇzn´e vˇetrat pouze tehdy, kdyˇz je rosn´ y bod vnˇejˇs´ıho (tedy vstupn´ıho) vzduchu niˇzˇs´ı, neˇz je teplota vzduchu pˇr´ıpadnˇe stˇen u vodn´ıch zrcadel, coˇz jsou nejstudenˇejˇs´ı m´ısta v budovˇe. 2. Aby doˇslo k ˇza´douc´ımu vyhˇr´at´ı budovy, mˇelo by se vˇetrat tehdy, kdyˇz je teplota vnˇejˇs´ıho vzduchu vyˇsˇs´ı, neˇz teplota vzduchu ve druh´em patˇre, coˇz je nejteplejˇs´ı m´ısto v budovˇe. Ide´aln´ı je vˇetrat tehdy, pokud jsou obˇe v´ yˇse uveden´a krit´eria splnˇena. Zat´ımco splnˇen´ı druh´eho z nich je moˇzn´e ovˇeˇrit i bez mˇeˇric´ıch pˇr´ıstroj˚ u, ovˇeˇren´ı prvn´ı podm´ınky jiˇz vyˇzaduje pouˇz´ıt technick´e vybaven´ı. Měření - Konvent, jaro 2008 22,5 100,0 20,0 97,5 17,5
95,0 92,5
15,0
90,0 87,5
10,0
85,0 82,5
7,5
80,0 5,0
77,5 75,0
2,5
72,5
0,0
70,0 -2,5
67,5 65,0
-5,0
62,5
-7,5
60,0
Okna / dveře
1,00 0,75 0,50 0,25
Srážky - kumulace (mm)
30
125
25 100 20 75 15 50
10
25
5
0
0 14-IV
21-IV
28-IV
5-V
12-V
19-V
26-V
2-VI
Čas jižní zrcadlo - teplota (°C) 1. p uvnitř - rosný bod(°C)
jižní zrcadlo - relativní vlhkost (%) okna 1. p
okna 2. p
jižní zrcadlo - rosný bod (°C)
mříž - refektář
vydatnost srážek (mm/h)
1. p venku - rosný bod(°C) srážkový úhrn (mm)
Obr´azek 3: Shrnut´ı mˇeˇren´ı z jara 2008, pouze vybran´e veliˇciny
10
Srážky - vydatnost (mm / h)
0,00
Relativní vlhkost (%)
Teplota (°C)
12,5
Na obr´azku 3 na stranˇe 10 je graf, kter´ y shrnuje data namˇeˇren´a na jaˇre roku 2008. V grafu jsou zn´azornˇeny jen ty veliˇciny, kter´e jsou v´ yznamn´e pro zjiˇst’ov´an´ı chov´an´ı vzduchu v budovˇe a reakc´ı budovy na vˇetr´an´ı. Ve spodn´ı ˇc´asti grafu jsou nav´ıc zn´azornˇeny ˇ ak deˇst’ov´e sr´aˇzky, kter´e byly ve sledovan´em obdob´ı namˇeˇreny meteostanic´ı firmy Josef Reh´ – SPELEO, um´ıstˇenou na rajsk´em dvoˇre. Mˇeˇren´ı deˇst’ov´ ych sr´aˇzek jsou v t´eto pr´aci zveˇrejnˇena se souhlasem firmy SPELEO. Tato firma se v konventu zab´ yv´a v´ yzkumem au ´drˇzbou vodn´ıho z´akladov´eho syst´emu. Pro usnadnˇen´ı vizualizace namˇeˇren´ ych dat a synt´ezu pohledu na data z r˚ uzn´ ych zdroj˚ u jsem v pr˚ ubˇehu t´eto diplomov´e pr´ace vyvinul softwarovou aplikaci, kter´a tyto u ´kony v´ yraznˇe urychluje a usnadˇ nuje. Aplikaci samotn´e se budeme vˇenovat pozdˇeji. Ve sledovan´em obdob´ı byla budova provˇetr´av´ana pouze na z´akladˇe porovn´av´an´ı teploty vnˇejˇs´ıho a vnitˇrn´ıho vzduchu bez ohledu na jeho vlhkost. D´ıky tomu m˚ uˇzeme na grafu pozorovat situace, kdy se pˇri vˇetr´an´ı nevˇedomky poruˇsovala prvn´ı podm´ınka, do budovy se dost´aval vlhk´ y vzduch, kter´ y se v pˇr´ızem´ı ochladil a voda z nˇej zkondenzovala na stˇen´ach a ve schodiˇsti u jiˇzn´ıho (a zˇrejmˇe i severn´ıho zrcadla, kde ale jiˇz nen´ı schodiˇstˇe). Zv´ yˇsen´a vlhkost vnˇejˇs´ıho vzduchu byla napˇr´ıklad 29. dubna, 5. aˇz 6. kvˇetna a 15. aˇz 18. kvˇetna. V tˇechto pˇr´ıpadech vˇsak byla vysok´a vzduˇsn´a vlhkost doprov´azena deˇst’ov´ ymi sr´aˇzkami a v takov´ ych pˇr´ıpadech se podle zvyklosti nevˇetr´a. Vlhk´ y vzduch tak byl udrˇzen mimo budovu a na grafu je vidˇet, ˇze se rosn´ y bod (kter´ y tak´e vyjadˇruje absolutn´ı vlhkost vzduchu) uvnitˇr budovy nezv´ yˇsil. Ve sledovan´em obdob´ı se ale tak´e nach´az´ı u ´sek od květen 2008 15
97
14
96
13
95
12
94
Teplota (°C)
92
10
91
9
90 8 89 7 88
Relativní vlhkost (%)
93
11
6 87 5
86
4
85
3 14-V
15-V
16-V
17-V
18-V
19-V
20-V
Datum jižní zrcadlo - teplota (°C) 1. p venku - rosný bod(°C)
jižní zrcadlo - relativní vlhkost (%)
jižní zrcadlo - rosný bod (°C)
1. p uvnitř - rosný bod(°C)
Obr´azek 4: D´ıky tomu, ˇze okna z˚ ustala zavˇren´a, vlhk´ y vzduch se do konventu nedostal. 27. kvˇetna do 5. ˇcervna, kdy zv´ yˇsen´ y obsah vodn´ı p´ary ve vzduchu nebyl doprov´azen deˇst’ov´ ymi sr´aˇzkami. Naopak bylo sluneˇcn´e a tepl´e poˇcas´ı. D´eˇst’ pˇriˇsel aˇz 3. ˇcervna odpoledne. Do t´e doby v konventu prob´ıhalo t´emˇeˇr kaˇzd´ y den vˇetr´an´ı okny a nav´ıc (od 30. kvˇetna) 11
tak´e 24 hodin dennˇe mˇr´ıˇz´ı nade dveˇrmi zimn´ı j´ıdelny, kter´a je v bl´ızkosti jiˇzn´ıho zrcadla. Vlhk´ y vzduch se tak dost´aval do budovy nepˇretrˇzitˇe a po nˇekolik dn´ı doch´azelo ke kondenzaci vodn´ı p´ary v prostoru u jiˇzn´ıho zrcadla. Tento stav je zachycen na obr´azku 5. Mˇeˇric´ı syst´em, kter´ y byl pouˇzit v roce 2008 mohl sice podobn´e kritick´e situace zaznamekvěten až červen 2008 21
100,0
20
97,5
19
95,0
18 92,5 16
90,0
15
87,5
14
85,0
13 82,5 12 80,0
11
Relativní vlhkost (%)
Teplota (°C)
17
77,5
10 9
75,0
8 72,5 7 70,0
Okna / dveře
1,00 0,75 0,50 0,25 0,00 25-V
26-V
27-V
28-V
29-V
30-V
31-V
1-VI
2-VI
3-VI
4-VI
5-VI
6-VI
Datum jižní zrcadlo - teplota (°C) 1. p venku - rosný bod(°C)
jižní zrcadlo - relativní vlhkost (%) 1. p uvnitř - rosný bod(°C)
jižní zrcadlo - rosný bod (°C)
okna 1. p
okna 2. p
mříž - refektář
Obr´azek 5: Kv˚ uli neregulovan´emu vˇetr´an´ı se dostal vlhk´ y vzduch do budovy nat, nemohl jim vˇsak u ´ˇcinnˇe zabr´anit, protoˇze mˇeˇren´a data nebyla person´alu dostupn´a v re´aln´em ˇcase. Nejvˇetˇs´ı dostupnost mˇeˇren´ ych dat poskytovala mˇeˇric´ı soustava s poˇc´ıtaˇcem WinCon, kter´a mˇela vlastn´ı display, na kter´em byl zobrazov´an pr˚ ubˇeh mˇeˇren´ ych veliˇcin, avˇsak toto zaˇr´ızen´ı bylo (z d˚ uvod˚ u a omezen´ı uveden´ ych v [1] um´ıstˇeno v m´ıstnosti cca 100 metr˚ u vzd´alen´e od kancel´aˇre spr´avy objektu, kde se nach´az´ı person´al schopn´ y okna zav´ırat a otev´ırat. Dostupnost dat v re´aln´em ˇcase je jednou z hlavn´ıch vlastnost´ı nov´eho mˇeˇric´ıho syst´emu, jehoˇz n´avrh a realizace je pˇredmˇetem z´ajmu t´eto diplomov´e pr´ace.
12
1.5
Nov´ y mˇ eˇ ric´ı syst´ em
Nov´ y mˇeˇric´ı syst´em by mˇel splˇ novat tyto poˇzadavky: 1. Syst´em by mˇel b´ yt schopen v konventu pracovat kaˇzdoroˇcnˇe od dubna do z´aˇr´ı bez u ´drˇzby. 2. Syst´em by mˇel b´ yt schopen mˇeˇrit teplotu a relativn´ı vlhkost vzduchu na rajsk´em dvoˇre a u jiˇzn´ıho vodn´ıho zrcadla. 3. Namˇeˇren´a data by mˇela b´ yt dostupn´a person´alu v kancel´aˇri spr´avy objektu v re´aln´em ˇcase, pˇr´ıpadnˇe se zpoˇzdˇen´ım do 10 minut. Pˇrenos dat bude vyˇzadovat vyuˇzit´ı bezdr´atov´ ych technologi´ı. 4. Nov´ y syst´em by mˇel b´ yt levnˇejˇs´ı neˇz prototyp z roku 2008, jehoˇz celkov´a cena (vˇcetnˇe datalogger˚ u p˚ ujˇcen´ ych od kl´aˇstera) byla cca 70 tis´ıc Kˇc. Jako velmi dobr´ y z´aklad nov´eho mˇeˇric´ıho syst´emu se uk´azalo b´ yt zaˇr´ızen´ı vyvinut´e ve druh´e polovinˇe roku 2008 ve spolupr´aci mezi Katedrou kybernetiky a Fakultou elektrotechnickou (viz [3]). T´ımto zaˇr´ızen´ım je univerz´aln´ı mˇeˇric´ı a ˇr´ıdic´ı karta RCB-02, naz´ yvan´a tak´e M-Board M-Board je vybaven procesorem typu ARM, analogov´ ymi a digit´aln´ımi vstupy a v´ ystupy a m´a velk´e moˇznosti konektivity (USB, RS232, ZigBee, Ethernet..) Pˇrednost´ı tohoto zaˇr´ızen´ı jsou jeho mal´e rozmˇery a pˇr´ızniv´a cena (kolem 12 tis´ıc Kˇc). karta je schopna pracovat samostatnˇe, nebo jako rozhran´ı mezi PC a mˇeˇren´ ym/ˇr´ızen´ ym procesem. Na jaˇre roku 2009 bylo ke kartˇe M-Board uvolnˇeno SDK, kter´e umoˇzn ˇuje pro kartu ps´at programy v jazyce C. Z´akladn´ı rysy mˇeˇric´ıho syst´emu postaven´eho kolem M-Boardu by tedy byly n´asleduj´ıc´ı: 1. M-Board by byl um´ıstˇen u okna u jiˇzn´ıho schodiˇstˇe, kde je moˇzn´e jednoduˇse zajistit nap´ajen´ı ze s´ıtˇe. 2. Pro mˇeˇren´ı vzduchu by byla pouˇzita ˇcidla z pˇredchoz´ı bakal´aˇrsk´e pr´ace, kter´a by byla pˇripojena k napˇet’ov´ ym vstup˚ um M-Boardu. 3. Na jednom ze dvou PC v kancel´aˇri spr´avy objektu by byl nainstalov´an program, kter´ y by z M-Boardu stahoval namˇeˇren´a data a slouˇzil by jako poradn´ı syst´em pro doporuˇcov´an´ı vˇetr´an´ı. Komunikace mezi kartou a PC by byla zajiˇstˇena pomoc´ı ZigBee, kter´e by teoreticky mˇelo b´ yt schopn´e fungovat za dan´ ych podm´ınek na danou vzd´alenost. 4. Mˇeˇric´ı syst´em by mˇel vyˇzadovat pouze minim´aln´ı u ´drˇzbu a mˇel by b´ yt maxim´alnˇe robustn´ı. Aplikace na stoln´ım PC by mˇela fungovat samostatnˇe a prov´adˇet stahov´an´ı, vyhodnocov´an´ı a archivaci dat i bez z´asahu uˇzivatele. N´aˇcrt zm´ınˇen´e situace se nach´az´ı na obr´azku 6 na stranˇe 14. Vzd´alenost mezi komunikuj´ıc´ımi zaˇr´ızen´ımi je vzduˇsnou ˇcarou cca 30 metr˚ u.
13
Obr´azek 6: Um´ıstˇen´ı hlavn´ıch prvk˚ u mˇeˇric´ıho syst´emu a zn´azornˇen´ı bezdr´atov´e komunikace mezi M-Boardem (zelen´ y obd´eln´ık) u jiˇzn´ıho zrcadla a PC (ˇzlut´ y monitor) v kancel´aˇri.
Obr´azek 7: Univerz´aln´ı mˇeˇric´ı a ˇr´ıdic´ı karta M-Board.
14
2
Pˇ r´ıprava ˇ reˇ sen´ı
2.1 2.1.1
V´ yvojov´ e n´ astroje Programov´ an´ı M-Boardu
Ke psan´ı mˇeˇric´ı aplikace pro M-Board jsem vyuˇz´ıval v´ yvojov´e prostˇred´ı Eclipse [24] s pluginem M-SDK, vyvinut´ ym na Katedˇre kybernetiky (KKY). Jedn´a se o sadu ovladaˇc˚ u pro hardware M-Boardu. M-Board se n´aslednˇe programuje v jazyce C. K z´av´adˇen´ı programu do M-Boardu a odlad’ov´an´ı jsem vyuˇz´ıval IAR Embedded Workbench for ARM [23] nainstalovan´ y na poˇc´ıtaˇci v laboratoˇri UL509. Sv´e postupy t´ ykaj´ıc´ı se pr´ace na M-Boardu jsem konzultoval s Ing. Ondˇrejem Jeˇzkem a Ing. Tom´aˇsem Pern´ ym z KKY. Podrobnˇejˇs´ı a aktu´aln´ı informace o v´ yvojov´ ych n´astroj´ıch pro vytv´aˇren´ı aplikac´ı pro M-Board m˚ uˇzete nal´ezt na adrese http://www.rexcontrols.cz/devzone. Plugin M-SDK jsem obdrˇzel pˇr´ımo od Ing. Jeˇzka. 2.1.2
Tvorba aplikace pro PC
V´ ybˇer programovac´ıho jazyka a v´ yvojov´ ych prostˇredk˚ u se odv´ıj´ı od poˇzadavk˚ u na tuto aplikaci: 1. Dostateˇcn´e schopnosti vizualizace mˇeˇren´ ych dat (jak v re´aln´em ˇcase, tak i dat z archiv˚ u). 2. Moˇznost exportu grafu do bitmapov´ ych i vektorov´ ych form´at˚ u (nejl´epe PNG, PDF a SVG) 3. Schopnost aplikace komunikovat se s´eriovou linkou 4. Snadn´a instalace, nezab´ıraj´ıc´ı mnoho diskov´eho prostoru, maxim´aln´ı robustnost a stabilita 5. Dlouh´a ˇzivotnost aplikace napˇr´ıˇc verzemi operaˇcn´ıch syst´em˚ u 6. Preferov´ana multiplatformita (schopnost fungovat na r˚ uzn´ ych operaˇcn´ıch syst´emech (kromˇe Windows zejm´ena na Linuxu) Zvolen´ y programovac´ı jazyk by mˇel umoˇznit rychl´ y a jednoduch´ y v´ yvoj aplikace a vˇsechny softwarov´e v´ yvojov´e prostˇredky by mˇely b´ yt dostupn´e zdarma bez omezen´ı i pro komerˇcn´ı vyuˇzit´ı (nejen napˇr´ıklad pro studenty). V´ ybˇer programovac´ıho jazyka a v´ yvojov´ ych n´astroj˚ u jsem prov´adˇel na pˇrelomu roku 2008 a 2009 a do uˇzˇs´ıho v´ ybˇeru se dostaly Java od firmy Sun a jazyk C# od firmy Microsoft. Probl´emem varianty od Microsoftu vˇsak bylo, ˇze i lehk´a a bezplatn´a verze v´ yvojov´eho prostˇred´ı - Visual Studio Express 1 vyˇzaduje kolem 1GB instalaˇcn´ıho prostoru a i pro bˇeh v´ ysledn´e aplikace na uˇzivatelsk´em2 PC je nutn´e nainstalovat .NET Framework v pˇr´ısluˇsn´e verzi a ve v´ ysledku je velikost instalace na uˇzivatelsk´em PC vˇetˇs´ı, neˇz v pˇr´ıpadˇe jazyka Java. 1
http://www.microsoft.com/express/Windows/ jak´ ykoliv poˇc´ıtaˇc, na kter´em m´ a b´ yt aplikace fin´alnˇe vyuˇz´ıv´ana, ne poˇc´ıtaˇc na kter´em prob´ıh´a v´ yvoj aplikace 2
15
Multiplatformita program˚ u napsan´ ych v jazyce Java je jiˇz l´ety provˇeˇren´a, zat´ımco zajiˇst’ov´an´ı bˇehu aplikac´ı napsan´ ych pro platformu .NET napˇr´ıklad na jiˇz zmiˇ novan´em Linuxu je nyn´ı jeˇstˇe v zaˇca´tc´ıch, nicm´enˇe rychle se rozv´ıjej´ıc´ı d´ıky projektu Mono 3 . Z d˚ uvodu zajiˇstˇen´ı dlouhodob´e udrˇzovatelnosti programu, menˇs´ıch syst´emov´ ych n´arok˚ u a vˇetˇs´ıch moˇznost´ı nasazen´ı v´ ysledn´e aplikace na r˚ uzn´ ych operaˇcn´ıch syst´emech jsem se rozhodl pro jazyk Java. D˚ uvody, pro kter´e jsem tento jazyk zvolil nepˇrestaly existovat ani ve chv´ıli, kdy na jaˇre roku 2009 byla firma Sun koupena firmou Oracle. Pro Javu lze vyuˇz´ıt tˇri hlavn´ı volnˇe ˇsiˇriteln´a v´ yvojov´a prostˇred´ı: 1. NetBeans (komunitou vyv´ıjen´e prostˇred´ı pod z´aˇstitou firmy Sun, dnes Oracle), [22] NetBeans je pˇrehledn´e a jednoduˇse pouˇziteln´e v´ yvojov´e prostˇred´ı podporuj´ıc´ı ˇradu jazyk˚ u (Java (prim´arnˇe), C, C++, xml, html, css a dalˇs´ı). Disponuje vysoce kvalitn´ım integrovan´ ym editorem grafick´eho uˇzivatelsk´eho rozhran´ı (GUI4 ) pro grafickou knihovnu Swing. Do verze 6.7.5 byl pro NetBeans poskytov´an jako plugin UML editor umoˇzn ˇuj´ıc´ı reverse engineering a generov´an´ı k´odu pro jazyk Java. Tento plugin vˇsak jiˇz nen´ı komunitou d´ale udrˇzov´an a od verze NetBeans 6.8 (vyˇsla 10. prosince 2009) nen´ı moˇzn´e jej do prostˇred´ı nainstalovat z d˚ uvodu nekompatibility. Instalace NetBeans pro v´ yvoj v jazyce Java potˇrebuje cca 250 MB diskov´eho prostoru. NetBeans bez probl´em˚ u pracuje i na mal´ ych obrazovk´ach s mal´ ym rozliˇsen´ım (napˇr´ıklad u netbook˚ u obvykl´ ych 1024 x 600 bod˚ u). NetBeans nav´ıc disponuj´ı skvˇel´ ym profilerem, kter´ y umoˇzn ˇuje optimalizovat rychlost vyv´ıjen´e aplikace a jej´ı syst´emov´e n´aroky. 2. Eclipse (komunitou vyv´ıjen´e prostˇred´ı pod z´aˇstitou IBM), [24] Eclipse, podobnˇe jako NetBeans je v´ yvojov´e prostˇred´ı podporuj´ıc´ı v´ıce jazyk˚ u. Existuje pro nˇej obrovsk´e mnoˇzstv´ı plugin˚ u, mezi kter´ ymi jsou napˇr´ıklad UML a GUI editory. Eclipse disponuje vˇetˇs´ım mnoˇzstv´ım funkc´ı a vˇetˇs´ı rozˇsiˇritelnost´ı neˇz NetBeans. Mnoˇzstv´ı funkc´ı v tomto pˇr´ıpadˇe b´ yv´a na u ´kor pˇrehlednosti. Poˇzadavky na diskov´ y prostor jsou obdobn´e jako u NetBeans. Probl´em nast´av´a tehdy, pokud chceme GUI editor, kter´ y je spolehliv´ y a zdarma bez omezen´ı. V souˇcasn´e dobˇe takov´ y nen´ı pro Eclipse k dispozici. Velk´e mnoˇzstv´ı dialogov´ ych oken v Eclipse potˇrebuje obrazovku vyˇsˇs´ı neˇz 600 bod˚ u a nelze je zmenˇsit. tato vlastnost ˇcin´ı pr´aci s Eclipse na netbooku nepohodlnou ˇci nemoˇznou. Pro Eclipse existuje volnˇe ˇsiˇriteln´ y profiler, avˇsak nedosahuje moˇznost´ı profileru v NetBeans. 3. JDeveloper od firmy Oracle, [25] JDeveloper je prim´arnˇe zamˇeˇren na jazyk Java a v´ yvoj enterprise aplikac´ı urˇcen´ ych pro aplikaˇcn´ı servery. Podle pˇr´ısluˇsn´e edice disponuje i UML a GUI editorem. Na mal´ ych obrazovk´ach nem´a probl´emy. Pln´a edice JDeveloperu s GUI a UML editorem vˇsak vyˇzaduje cca 1GB diskov´eho prostoru a i n´aroky na operaˇcn´ı pamˇet’ jsou vyˇsˇs´ı neˇz u NetBeans a Eclipse. Po odzkouˇsen´ı v´ yvojov´ ych prostˇred´ı jsem se rozhodl pro NetBeans, kter´e poskytuje vysokou stabilitu a uˇzivatelsk´ y komfort, m´a integrovan´e vˇsechny potˇrebn´e n´astroje a je moˇzn´e jej 3 4
http://www.mono-project.com Graphical User Interface
16
bez probl´em˚ u provozovat i na netbooku a tak prov´adˇet testov´an´ı a u ´pravy vyv´ıjen´eho software jak v laboratoˇri, tak pˇr´ımo v ter´enu. GUI editor v NetBeans podporuje knihovny AWT a Swing, ale ne SWT, coˇz vˇsak v tomto pˇr´ıpadˇe nen´ı probl´em. UML diagramy ilustruj´ıc´ı strukturu vytvoˇren´eho software byly vytvoˇreny v editoru UMLet [21].
2.2 2.2.1
Dalˇ s´ı hardwarov´ e prvky syst´ emu ˇ Cidla teploty a relativn´ı vlhkosti vzduchu
Pro detekci teploty a relativn´ı vlhkosti vzduchu byla vyuˇzita obˇe ˇcidla Humirel HTM1735 pouˇz´ıvan´a jiˇz v pˇredchoz´ı bakal´aˇrsk´e pr´aci. Napˇet’ov´ y v´ ystup z ˇcidel byl mˇeˇren napˇet’ov´ ymi vstupy univerz´aln´ı karty M-Board. 2.2.2
Moduly bezdr´ atov´ e komunikace
Bezdr´atov´a komunikace mezi M-Board a PC s archivaˇcn´ı a vyhodnocovac´ı aplikac´ı byla zajiˇstˇena pomoc´ı dvou modul˚ u bezdr´atov´e komunikace XBee XB24ASI, kter´e umoˇzn ˇuj´ı mont´aˇz extern´ı ant´eny s konektorem RP-SMA. K propojen´ı PC se ZigBee modulem byl vyuˇzit interface XBeeU zakoupen´ y od firmy Snail Instruments [34] , kter´ y slouˇz´ı jako pˇrevodn´ık z USB na s´eriovou linku a nap´ajen´ı ZigBee modulu XBee. Toto zaˇr´ızen´ı bylo vybr´ano na z´akladˇe konzultace s Ing. Jeˇzkem. Pro spr´avnou pr´aci interface s PC je nutn´e nainstalovat ovladaˇc obvodu FT232R ze str´anek jeho v´ yrobce http://www.ftdichip.com. Dokumentaci k XBee modulu a konfiguraˇcn´ı aplikaci X-CTU lze z´ıskat na str´ank´ach v´ yrobce tohoto modulu http://www.digi.com. K XBee modulu na stranˇe Mˇeˇric´ı karty byla pˇripojena ant´ena TP-LINK TL-ANT2405C. Jedn´a se o ant´enu se ziskem 5dB a kabelem o d´elce cca 1m. XBee modul na stranˇe PC je vybaven ant´enou z dom´ac´ıho WiFi AP od firmy D-Link. 2.2.3
Nap´ ajen´ı syst´ emu
Pro nap´ajen´ı ˇcidel a M-Boardu byl vyuˇzit stabilizovan´ y s´ıt’ov´ y zdroj s v´ ystupn´ım napˇet´ım 5V a maxim´aln´ım dod´avan´ ym proudem 1, 2A. Mˇeˇren´ım jsem zjistil, ˇze M-Board i s ˇcidly m´a pr˚ umˇern´ y odbˇer kolem 0, 2A, takˇze v´ ykon zm´ınˇen´eho zdroje je v´ıce neˇz dostaˇcuj´ıc´ı. Mˇeˇren´ı ovˇsem tak´e uk´azalo, ˇze zdroj pˇri zm´ınˇen´e z´atˇeˇzi 0, 2 A m´a v´ ystupn´ı napˇet´ı 5, 36V. Tato hodnota jiˇz m˚ uˇze negativnˇe ovlivnit, ˇci poˇskodit pouˇzit´a ˇcidla. Bylo proto nutn´e um´ıstit do obvodu do s´erie s nap´ajen´ ymi zaˇr´ızen´ımi Schottkyho diodu. Napˇet´ı na zdroji (mˇeˇren´e za diodou) pˇri z´atˇeˇzi je potom 4, 92V. Toto napˇet´ı je jiˇz vhodn´e pro nap´ajen´ı ˇcidel i mˇeˇric´ı karty (pˇres USB konektor). Detaily zapojen´ı a um´ıstˇen´ı ˇcidel, ant´en a dalˇs´ıch prvk˚ u syst´emu budou zm´ınˇeny pozdˇeji.
2.3
Pouˇ zit´ e softwarov´ e knihovny tˇ ret´ıch stran
Pro jazyk Java existuje mnoho bez omezen´ı volnˇe ˇsiˇriteln´ ych softwarov´ ych knihoven, jejichˇz funkce je moˇzn´e pouˇz´ıvat v dalˇs´ıch Java aplikac´ıch. Pokud pro ˇreˇsen´ı nˇejak´eho u ´kolu potˇrebn´a knihovna existuje a jej´ı funkˇcnost je vyhovuj´ıc´ı, nen´ı zpravidla nutn´e se zab´ yvat v´ yvojem stejn´e funkce znovu.5 5
Pokud se ovˇsem cel´ y projekt net´ yk´ a v´ yvoje knihovny s poˇzadovanou funkˇcnost´ı.
17
Pro u ´ˇcely sv´eho projektu jsem vyuˇzil knihovny tˇret´ıch stran pro zajiˇstˇen´ı funkc´ı v n´ıˇze uveden´ ych oblastech. Pouˇzit´ı jiˇz hotov´ ych knihoven nijak nesniˇzuje m˚ uj vlastn´ı pˇr´ınos. Mnou vytvoˇren´ y vlastn´ı k´od ˇc´ıt´a pˇres 200 tˇr´ıd a tvoˇr´ı dalˇs´ı samostatnou knihovnu, kterou je moˇzn´e vyuˇz´ıvat v dalˇs´ıch aplikac´ıch podobn´eho typu, jako je tato. 2.3.1
Vizualizace dat
Pro zobrazov´an´ı graf˚ u jsem zvolil knihovnu JFreeChart [18], kter´a poskytuje velk´e mnoˇzstv´ı funkc´ı a moˇznost´ı vizu´aln´ı reprezentace dat. Mimo jin´e je moˇzn´e zobrazovat jak ˇcasov´e ˇrady (Vzorky maj´ı konkr´etn´ı ˇcasovou znaˇcku) tak i ˇrady ˇc´ıseln´e (Vzorky jsou ˇc´ıslov´any a m˚ uˇze se jednat o poˇradov´e ˇc´ıslo vzorku, nebo ˇcas, kter´ y uplynul od zaˇca´tku mˇeˇren´ı). Knihovna samotn´a pak umoˇzn ˇuje export grafu do bitmapov´ ych form´at˚ u PNG nebo JPG. Pro export do vektorov´ ych form´at˚ u je moˇzn´e pouˇz´ıt dalˇs´ı knihovny zm´ınˇen´e n´ıˇze. K pouˇzit´ı JFreeChart je moˇzn´e na internetu naj´ıt celou ˇradu pˇr´ıklad˚ u (napˇr. [14]) nahrazuj´ıc´ıch ofici´aln´ı dokumentaci, kter´a na rozd´ıl od knihovny samotn´e nen´ı dostupn´a zdarma. 2.3.2
Export graf˚ u do vektorov´ ych form´ at˚ u
Bitmapov´e form´aty jsou vhodn´e k prezentaci dat napˇr´ıklad na internetov´ ych str´ank´ach, pokud vˇsak potˇrebujeme prezentovat grafy v tiˇstˇen´ ych dokumentech, je lepˇs´ı vyuˇz´ıt form´aty vektorov´e. 1. Export do SVG (Scalable Vector Graphics) Form´at SVG je zaloˇzen na popisu objekt˚ u a ˇcar uloˇzen´em v textov´em XML souboru. Existuj´ı pro nˇej volnˇe ˇsiˇriteln´e editory (napˇr´ıklad Inkscape) a jeho zobrazov´an´ı podporuj´ı napˇr´ıklad i souˇcasn´e verze webov´ ych prohl´ıˇzeˇc˚ u Internet Explorer, Opera a Firefox. Pro export graf˚ u z JFreeChart do SVG vyuˇz´ıv´am knihovnu Batik [19]. Batik je ˇs´ıˇren pod licenc´ı Apache verze 2.0 [27]. Samotn´ y proces exportu graf˚ u z JFreeChart pomoc´ı Batiku do SVG s sebou nese jistou nev´ yhodu, kter´a spoˇc´ıv´a ve velk´ ych n´aroc´ıch na operaˇcn´ı pamˇet’ a dobu exportu. Experiment´alnˇe jsem zjistil, ˇze pokud je v grafu kolem 200 tis´ıc vzork˚ u, export m˚ uˇze trvat aˇz nˇekolik minut, zabrat nˇekolik stovek MB RAM a v´ ysledn´ y soubor m´a (podle zvolen´eho rozliˇsen´ı) aˇz nˇekolik des´ıtek MB. Pˇr´ıpadn´e dalˇs´ı u ´pravy takto velk´ ych soubor˚ u (napˇr´ıklad v Inkscape) jsou velmi zdlouhav´e. 2. Export do PDF (Portable Document Format) PDF je v dneˇsn´ı dobˇe velmi rozˇs´ıˇren´ y form´at pro dokumenty vˇseho druhu. Pokud chceme graf exportovat do vektorov´eho form´atu a nepoˇc´ıt´ame s dalˇs´ımi u ´pravami obr´azku, je v´ yhodn´e prov´est export do PDF. K tomuto u ´ˇcelu vyuˇz´ıv´am knihovnu iText verze 2.1.5. Do verze 2.1.7 byl iText distribuov´an pod licenc´ı LGPL [28]. Od prosince 2009 distribuce prob´ıh´a pod licenc´ı AGPL [29], kter´a neumoˇzn ˇuje vyuˇz´ıv´an´ı knihovny v projektech s neveˇrejn´ ym (uzavˇren´ ym) zdrojov´ ym k´odem. Pro takov´e projekty nicm´enˇe existuje komerˇcn´ı licence.
18
2.3.3
Pr´ ace s XML soubory
Soubory ve form´atu XML vyuˇz´ıv´am k ukl´ad´an´ı konfigurac´ı aplikac´ı. Pro ˇcten´ı a z´apis tˇechto soubor˚ u vyuˇz´ıv´am knihovnu Jdom [15]. 2.3.4
Komunikace pˇ res s´ eriovou linku
Kl´ıˇcovou schopnost´ı mˇeˇric´ı aplikace je komunikace s mˇeˇric´ım zaˇr´ızen´ım pˇres s´eriovou linku (pˇres RS232 nebo USB). Java na rozd´ıl od v´ yˇse zmiˇ novan´e platformy Microsoft .NET nedisponuje vestavˇen´ ymi tˇr´ıdami pro komunikaci pˇres s´eriovou linku. Tento nedostatek je moˇzn´e ˇreˇsit vyuˇzit´ım knihovny RXTX [26]. 2.3.5
Komunikace pomoc´ı XML-RPC
Komunikaci mezi klientskou viditelnou ˇc´ast´ı aplikace a ˇca´st´ı pracuj´ıc´ı s daty a mˇeˇric´ım zaˇr´ızen´ım jsem se rozhodl ˇreˇsit pomoc´ı protokolu XML-RPC. Dva programy pak mezi sebou budou komunikovat jako XML-RPC server a klient. Pro realizaci komunikace pomoc´ı XML-RPC jsem zvolil implementaci Apache XML-RPC [16]. 2.3.6
ˇ sen´ı soustav rovnic pomoc´ı metody nejmenˇ Reˇ s´ıch ˇ ctverc˚ u
Pro ˇreˇsen´ı soustav rovnic vyuˇz´ıv´am tˇr´ıdy (a metody) z knihovny Apache Commons Mathematics Library [17]. 2.3.7
Ikony
Grafick´e rozhran´ı aplikace jsem vybavil volnˇe ˇsiˇriteln´ ymi ikonami Crystal Icons [30] a nˇekter´ ymi ikonami vlastn´ımi.
3
V´ yvoj Software pro PC
Pˇri mˇeˇren´ı bude vznikat velk´e mnoˇzstv´ı dat, kter´e bude nutn´e spolehliv´ ym a uˇzivatelsky pˇr´ıvˇetiv´ ym zp˚ usobem zpracov´avat, archivovat a vizualizovat. V projektu nalezne uplatnˇen´ı jak aplikace, kter´a bude zpracov´avat mˇeˇren´ı pr˚ ubˇeˇznˇe, tak i aplikace pro offline vyhodnocov´an´ı a vizualizaci archivovan´ ych dat. Posledn´ı zm´ınˇen´a aplikace najde vyuˇzit´ı i pˇri publikaci z´ıskan´ ych v´ ysledk˚ u. Z d˚ uvod˚ u zv´ yˇsen´e stability by mˇela b´ yt mˇeˇric´ı aplikace na PC rozdˇelena na dva samostatn´e programy, kter´e mezi sebou budou komunikovat. Prvn´ı z nich, kter´ y jehoˇz ˇcinnost bude bˇeˇzn´emu uˇzivateli skryta, bude obstar´avat komunikaci s mˇeˇric´ım zaˇr´ızen´ım, vyhodnocov´an´ı a archivaci. Druh´a ˇca´st potom bude pracovat v grafick´em reˇzimu a bude slouˇzit ke komunikaci uˇzivatele se zbytkem mˇeˇric´ıho syst´emu. Pˇres tuto aplikaci bude moˇzn´e ovl´adat mˇeˇren´ı, a zobrazovat z´ısk´avan´a data. Tˇr´ıdy, kter´e jsem vytvoˇril pro zajiˇstˇen´ı obecn´ ych funkc´ı mˇeˇric´ı aplikace, jsou um´ıstˇeny v knihovnˇe libdev, jej´ıˇz souˇca´sti jsou pops´any zde:
19
3.1
Reprezentace dat
Snaˇzil jsem se, aby knihovna umˇela pracovat jak s ˇcasov´ ymi, tak i ˇc´ıseln´ ymi ˇradami. Pro mˇeˇren´ı bude prim´arnˇe vyuˇz´ıv´ana reprezentace dat jako ˇcasov´ ych ˇrad, ale moˇznost pr´ace s ˇc´ıseln´ ymi ˇradami se vyuˇzije napˇr´ıklad pˇri kalibraci ˇcidel, kdy namˇeˇren´e hodnoty nemus´ı b´ yt nutnˇe opatˇreny ˇcasovou znaˇckou, ale poˇradov´ ym ˇc´ıslem mˇeˇren´ı. Stejnˇe tak bude moˇzn´e pouˇz´ıt aplikaci ke zpracov´an´ı a zobrazov´an´ı dat z jin´ ych zdroj˚ u, napˇr´ıklad ze ˇ ˇr´ıdic´ıho a mˇeˇric´ıho syst´emu REX vyv´ıjen´eho na Katedˇre kybernetiky ZCU. S ohledem na univerz´alnost reprezentace je v knihovnˇe v hojn´e m´ıˇre vyuˇz´ıv´an polymorfismus. Z´akladn´ı jednotkou reprezentuj´ıc´ı data je tˇr´ıda GeneralFloatingSample, kter´a pˇredstavuje obecn´ y plovouc´ı vzorek. Plovouc´ı proto, ˇze je schopen existovat a b´ yt zpracov´av´an samostatnˇe a nese vˇsechny informace, kter´e jej zaˇrazuj´ı do pˇr´ısluˇsn´e datov´e ˇrady a urˇcuj´ı hodnotu pˇredstavovan´e veliˇciny. Hodnota veliˇciny je desetinn´e ˇc´ıslo ve form´atu double. Vlastnosti obecn´eho plovouc´ıho vzorku jsou d´ale vyuˇz´ıv´any a konkretizov´any dalˇs´ımi dvˇema tˇr´ıdami: 1. TimeStampedFloatingSample – pro reprezentaci dat s ˇcasovou znaˇckou ˇ Casov´ a znaˇcka ve vzorku je ve formˇe odkazu na pˇr´ısluˇsnou instanci tˇr´ıdy Instant, kter´a uchov´av´a informaci o ˇcasov´em okamˇziku v rozsahu tis´ıc˚ u (pˇr´ıpadnˇe i v´ıce) let s pˇresnost´ı na tis´ıciny vteˇriny. Na jednu instanci tˇr´ıdy Instant m˚ uˇze odkazovat v´ıce vzork˚ u souˇcasnˇe. 2. NumberedFloatingSample – pro reprezentaci dat s poˇradov´ ym ˇc´ıslem Poˇradov´e ˇc´ıslo je ve form´atu double a m˚ uˇze se tedy jednat i o ˇc´ıslo desetinn´e. UML diagram zn´azorˇ nuj´ıc´ı zm´ınˇen´e tˇr´ıdy se nach´az´ı na obr´azku 8 na stranˇe 21.
3.2
Reprezentace ˇ casu
ˇ Casov´ a znaˇcka je reprezentov´ana instanc´ı tˇr´ıdy Instant. Instant m´a pak v sobˇe odkazy na objekty tˇr´ıd Date (ne java.util.Date) a Time. UML diagram tˇr´ıd pro reprezentaci ˇcasu je na obr´azku 9 na stranˇe 22. Objekt Date uchov´av´a informace o datu v poloˇzk´ach year, month a day (rok, mˇes´ıc a den), kter´e jsou ve form´atu cel´eho ˇc´ısla int. Objekt Time pak uchov´av´a informace o ˇcase v poloˇzk´ach hours (int), minutes (int), seconds (double), a milliseconds (int). Poˇcet sekund v poloˇzce seconds odpov´ıd´a poˇctu milisekund v poloˇzce milliseconds. Pˇri nastaven´ı hodnoty jedn´e z nich se pˇrepoˇcet a nastaven´ı druh´e provede automaticky. 3.2.1
Operace s ˇ casem
Pro dalˇs´ı pr´aci s daty bylo nutn´e implementovat metody pro pˇriˇc´ıt´an´ı a odeˇc´ıt´an´ı ˇcasu a rozhodov´an´ı, zda dan´ y ˇcasov´ y okamˇzik patˇr´ı do nˇejak´eho ˇcasov´eho intervalu, nebo nikoli. Jazyk Java poskytuje pro pr´aci s ˇcasem vestavˇenou tˇr´ıdu java.util.Calendar. Tato tˇr´ıda je v m´e knihovnˇe vyuˇz´ıv´ana pˇri dek´odov´an´ı ˇcasov´ ych znaˇcek z textov´ ych ˇretˇezc˚ ua v´ ypisu ˇcasov´ ych znaˇcek do textov´ ych ˇretˇezc˚ u. 20
NumberedFloatingSample -number: double +isInInterval(fSample: NumberedFloatingSample, interval: NumberInterval): boolean ... (gettery a settery pro atributy)
GeneralFloatingSample -label: String -value: double -newSourceStart: boolean -saved: boolean +setOrderer(orderer: Orderer) +getOrderer(): Orderer ... (gettery a settery pro atributy)
TimeStampedFloatingSample -instant: Instant TimeStampedFloatingSample() TimeStampedFloatingSample(seralizedSample: org.jdom.Element) toXMLElement(): org.jdom.Element +isInInterval(fSample: NumberedFloatingSample, interval: TimeInterval): boolean ... (gettery a settery pro atributy)
Obr´azek 8: UML diagram tˇr´ıd pro reprezentaci datov´ ych vzork˚ u. V diagramu jsou uvedeny jen nˇekter´e v´ yznamn´e atributy a metody. Vyuˇzit´ı metod tˇr´ıdy Calendar pro pr´aci s ˇcasov´ ymi znaˇckami u vzork˚ u vˇsak nen´ı zcela vhodn´e z n´asleduj´ıc´ıho d˚ uvodu: Calendar pracuje s re´aln´ ym kalend´aˇrem. To znamen´a, ˇze zohledˇ nuje pˇrestupn´e roky a letn´ı/zimn´ı ˇcas. Pokud napˇr´ıklad zjiˇst’ujeme rozd´ıl ˇcas˚ u mezi daty, z nichˇz pro jedno plat´ı zimn´ı a pro druh´e letn´ı ˇcas6 , je k rozd´ılu automaticky pˇriˇctena, nebo naopak odeˇctena 1 hodina. Pˇri prov´adˇen´ı dlouhodob´eho mˇeˇren´ı je vˇsak zvyklost´ı pouˇz´ıvat po cel´ y rok stejn´ y ˇcas (nejl´epe zimn´ı). Tento pˇr´ıstup je vyuˇz´ıv´an napˇr´ıklad na registraˇcn´ıch stanic´ıch firmy Fiedler-M´agr 7 . Metody, kter´e prov´adˇej´ı ˇcasov´e operace poˇzadovan´ ym zp˚ usobem jsem implementoval ve tˇr´ıd´ach InstantUtils, TimeInterval a v jiˇz zm´ınˇen´ı tˇr´ıdˇe Instant v bal´ıku com.msiroky.chronology.time. Tˇr´ıda InstantUtils obsahuje metody, kter´e poˇc´ıtaj´ı rozd´ıl a souˇcet ˇcas˚ u bez ohledu na pˇrechod mezi zimn´ım a letn´ım ˇcasem, pˇriˇcemˇz vstupn´ımi parametry jsou vˇzdy ˇcasy z´akladn´ı (nˇejak´e skuteˇcn´e datum a ˇcas) a potom ˇcasy pˇriˇc´ıtan´e nebo odeˇc´ıtan´e. V tˇechto metod´ach je moˇzn´e pracovat s pˇriˇc´ıt´an´ım nebo odeˇc´ıt´an´ım interval˚ u do d´elky 28 dn´ı, coˇz 6 7
Podle pravidel platn´ ych pro danou zemi/lokalizaci; Tato pravidla jsou vestavˇena do Javy. http://www.fiedler-magr.cz
21
Orderer isBefote(anotherOrderer: Orderer): boolean isAfter(anotherOrderer: Orderer): boolean isequals(anotherOrderer: Orderer): boolean
Instant +fromXMLElement(element: org.jdom.Element): Instant +parseInstant(timeString: String, formatString: String): Instant +isBefore(anotherInstant: Instant): boolean +isAfter(anotherInstant: Instant): boolean +equals(anotherInstant: Instant): boolean +isInInterval(fSample: NumberedFloatingSample, interval: TimeInterval): boolean +toJavaUtilDate(): java.util.Date +toString(formatString: String): String ... (gettery a settery pro atributy) 0..n
0..n
0..1
0..1 Date
Time -hours: Integer -minutes: Integer -milliseconds: Integer -seconds: Double -dst: Boolean +isBefore(anotherTime: Time): boolean +isAfter(anotherTime: Time): boolean +equals(anotherTime: Time): boolean ... (gettery a settery pro atributy)
-year: int -month: int -day: int +isBefore(anotherDate: Date): boolean +isAfter(anotherDate: Date): boolean +equals(anotherDate: Date): boolean ... (gettery a settery pro atributy)
InstantUtils +difference(instant1: Instant, instant2: Instant) +subtract(from: Instant, what: Instant) +addAsRealTime(base: Instant, timelength: Instant)
Obr´azek 9: UML diagram tˇr´ıd pro reprezentaci ˇcasov´ ych u ´daj˚ u a prov´adˇen´ı operac´ı s nimi. V diagramu jsou uvedeny jen nˇekter´e v´ yznamn´e atributy a metody.
22
je pro dan´ y u ´ˇcel postaˇcuj´ıc´ı. Delˇs´ı intervaly by pak znamenaly d´elku 1 mˇes´ıc ˇci delˇs´ı. Vzhledem k tomu, ˇze mˇes´ıce jsou r˚ uznˇe dlouh´e, pˇri pˇriˇc´ıt´an´ı napˇr´ıklad 3 mˇes´ıc˚ u by nebylo explicitnˇe zˇrejm´e, kter´e kalend´aˇrn´ı mˇes´ıce a tedy kolik dn´ı se vlastnˇe bude pˇriˇc´ıtat ˇci odeˇc´ıtat. V´ ypoˇcetn´ı operace by pak nemˇela pro uˇzivatele pˇredv´ıdateln´ y v´ ysledek. Nav´ıc pro v´ ypoˇcty takov´eho typu je moˇzn´e pouˇz´ıt tˇr´ıdu Calendar. Pokud by vˇsak bylo nutn´e rozˇs´ıˇrit rozsah zpracov´avan´ ych ˇcasov´ ych interval˚ u, pˇr´ısluˇsn´a u ´prava st´avaj´ıc´ıho zdrojov´eho k´odu metod ve tˇr´ıdˇe InstantUtils by trvala cca 15 minut. Pˇri v´ ypoˇcetn´ıch operac´ıch se zohledˇ nuje pˇrenos v´ ysledk˚ u do vyˇsˇs´ıch ˇra´d˚ u. Tˇr´ıda Instant obsahuje metody, kter´e ˇcasov´ y interval do d´elky 28 dn´ı pˇrevedou do jeho d´elky v milisekund´ach a obr´acenˇe (toMilliseconds(), millisecondsToInstant()). D´ale jsou zde metody pro porovn´av´an´ı ˇcasov´ ych okamˇzik˚ u: 1. isBefore(anotherInstant: Instant): boolean – Vrac´ı true, pokud je dan´ y ˇcasov´ y okamˇzik pˇ red jin´ ym ˇcasov´ ym okamˇzikem anotherInstant. Nejprve se provede porovn´an´ı hodnot v atributu Date. Pokud je datum u dan´eho ˇcasov´eho okamˇziku pˇred datem u anotherInstant, metoda vrac´ı true ihned. Pokud jsou hodnoty data stejn´e, pokraˇcuje se porovn´an´ım atribut˚ u Time. Pokud je ˇcas dan´eho okamˇziku pˇred ˇcasem v anotherInstant, metoda vrac´ı true. Porovn´av´an´ı dvou instanc´ı tˇr´ıd Date a Time se prov´ad´ı pomoc´ı metod v tˇechto tˇr´ıd´ach. 2. isAfter(anotherInstant: Instant): boolean – Vrac´ı true, pokud je dan´ y ˇcasov´ y okamˇzik za jin´ ym ˇcasov´ ym okamˇzikem anotherInstant. Postup porovn´av´an´ı je obdobn´ y jako v pˇredchoz´ı metodˇe, jen s obr´acen´ ym krit´eriem. 3. equals(anotherInstant: Instant): boolean – Vrac´ı true, pokud jsou ˇcasov´e okamˇziky shodn´e. Zde mus´ı b´ yt souˇcasn´a shoda v atributech Date i Time. Pro ilustraci je zde uveden zdrojov´ y k´od metody isBefore(anotherDate: Date): boolean ve tˇr´ıdˇe Date a metody isBefore(anotherTime: Time): boolean ve tˇr´ıdˇe Time: public boolean isBefore(Date anotherDate) { if (this.year < anotherDate.getYear()) { return true; } else if ((this.year == anotherDate.getYear()) && (this.month < anotherDate.getMonth())) { return true; } else if ((this.year == anotherDate.getYear()) && (this.month == anotherDate.getMonth()) && (this.day < anotherDate.getDay())) { return true; } return false; } public boolean isBefore(Time anotherTime) { if (this.hours < anotherTime.getHours()) { return true; } else if ((this.hours == anotherTime.getHours()) && (this.minutes < anotherTime.getMinutes())) { 23
return true; } else if ((this.hours == anotherTime.getHours()) && (this.minutes == anotherTime.getMinutes()) && (this.milliseconds < anotherTime.getMilliseconds())) { return true; } return false; } 3.2.2
Intervaly
Z´akladem pr´ace s intervaly (ˇcasov´ ymi i ˇc´ıseln´ ymi) je tˇr´ıda GeneralInterval. Od n´ı jsou oddˇedˇeny tˇr´ıdy NumberInterval a TimeInterval. Vztahy mezi tˇemito tˇr´ıdami jsou zn´azornˇeny na obr´azku 10 na stranˇe 25. Zde se budu bl´ıˇze vˇenovat intervalu ˇcasov´emu. ˇ Casov´ y interval m´a atributy zaˇc´atek (start) a konec (end), coˇz jsou odkazy na objekty tˇr´ıdy Instant. Interval m˚ uˇze b´ yt zprava i zleva jak uzavˇren´ y, tak otevˇren´ y. Metody pro porovn´av´an´ı interval˚ u pracuj´ı n´asledovnˇe: 1. startsAfter(interval: TimeInterval): boolean – Vrac´ı true, pokud dan´ y interval zaˇc´ın´a aˇz po konci jin´eho intervalu, kter´ y je parametrem t´eto metody. V souˇcasn´e implementaci t´eto metody se uvaˇzuje, ˇze jsou oba intervaly uzavˇren´e. 2. endsBefore(interval: TimeInterval): boolean – Vrac´ı true, pokud dan´ y interval konˇc´ı pˇred zaˇc´atkem jin´eho intervalu. Pˇredpoklady jsou stejn´e jako v pˇredchoz´ım pˇr´ıpadˇe. 3. contains(instant: Instant): boolean – Vrac´ı true, pokud je ˇcasov´ y okamˇzik instant v dan´em intervalu obsaˇzen. Zde se jiˇz bere ohled na uzavˇrenost, ˇci otevˇrenost intervalu. Vnitˇrnˇe tato metoda vol´a metodu isInInterval(fSample: NumberedFloatingSample, interval: TimeInterval): boolean v objektu instant. Zjiˇstˇen´ı, zda se instant v intervalu nach´az´ı lze zjistit i pˇr´ımo vol´an´ım t´eto metody. Zdrojov´ y k´od metody isInInterval() ve tˇr´ıdˇe Instant: public boolean isInInterval(TimeInterval interval) { if (interval == null) { return true; } boolean isAterStart = false; boolean isBeforeEnd = false; boolean equalsStart = false; boolean equalsEnd = false; if (interval.isLeftClosed()) { equalsStart = equals(interval.getStart()); } if (interval.isRightClosed()) { equalsEnd = equals(interval.getEnd()); } if (equalsStart || isAfter(interval.getStart())) { isAterStart = true; } if (equalsEnd || isBefore(interval.getEnd())) { isBeforeEnd = true; } return (isAterStart && isBeforeEnd); }
24
GeneralInterval -leftClosed: boolean -rightClosed: boolean +contains(orderer: Orderer): boolean ... (gettery a settery pro atributy)
NumberInterval -start: double -end: double +startsAfter(interval: NumberInterval): boolean +endsBefore(interval: NumberInterval): boolean +contains(number: double): boolean ... (gettery a settery pro atributy)
TimeInterval -start: Instant -end: Instant +startsAfter(interval: TimeInterval): boolean +endsBefore(interval: TimeInterval): boolean +contains(instant: Instant): boolean ... (gettery a settery pro atributy)
Obr´azek 10: UML diagram tˇr´ıd pro reprezentaci interval˚ u. V diagramu jsou uvedeny jen nˇekter´e v´ yznamn´e atributy a metody.
3.3
Uchov´ av´ an´ı dat v operaˇ cn´ı pamˇ eti
K uchov´av´an´ı a organizaci datov´ ych vzork˚ u v operaˇcn´ı pamˇeti slouˇz´ı tˇr´ıdy DataPool a DataDrawer. DataDrawer je moˇzn´e si pˇredstavit jako ˇsupl´ık kartot´eky, ve kter´em jsou uloˇzena data vztahuj´ıc´ı se k jedn´e mˇeˇren´e veliˇcinˇe / kan´alu a jsou chronologicky seˇrazena. DataPool (n´adrˇz na data) je potom jakousi skˇr´ın´ı plnou takov´ ych ˇsupl´ık˚ u. V knihovnˇe nen´ı ˇza´dn´e omezen´ı na poˇcet uloˇzen´ ych dat ani datov´ ych kan´al˚ u. Ve zdrojov´ ych k´odech je pro kan´al vyuˇz´ıv´an pojem datov´e vl´akno (data thread ). DataDrawer je vytvoˇren k uchov´av´an´ı obecn´ ych datov´ ych vzork˚ u, takˇze je moˇzn´e jej pouˇz´ıt jak s ˇc´ıseln´ ymi, tak ˇcasov´ ymi datov´ ymi ˇradami. Ilustraci vztahu mezi tˇr´ıdami DataDrawer a DataPool je moˇzn´e vidˇet na obr´azku 11 na stranˇe 26. DataDrawer je schopn´ y pracovat jak v dynamick´em, tak statick´em reˇzimu. Statick´ ym reˇzimem je myˇsleno, ˇze vˇsechna data z pˇr´ısluˇsn´eho vl´akna jsou do pamˇeti naˇctena najednou v jednom kroku, nebo vzniknou (tak´e najednou) jako v´ ysledek nˇejak´e v´ ypoˇcetn´ı operace. Dynamick´ y reˇzim potom znamen´a, ˇze data vznikaj´ı a jsou ukl´ad´ana postupnˇe. Toto je napˇr´ıklad situace pˇri mˇeˇren´ı. Pro uchov´av´an´ı odkaz˚ u na objekty tˇr´ıdy DataDrawer ve tˇr´ıdˇe DataPool a na objekty tˇr´ıdy GeneralFloatingSample ve tˇr´ıdˇe DataPool je vyuˇzita knihovn´ı tˇr´ıda Javy ArrayList. Vzorek je moˇzn´e vkl´adat bud’ pomoc´ı metod tˇr´ıdy DataPool, nebo pˇr´ımo pomoc´ı metod tˇr´ıdy DataDrawer, pokud si pˇredt´ım nech´ame podle n´azvu datov´eho vl´akna vr´atit objektem Pool“ odkaz na pˇr´ısluˇsn´ y Drawer“. Pokud data vkl´ad´ame pˇres Pool, je pˇr´ısluˇsn´a ” ” Drawer vyhled´an automaticky a pokud pro dan´e datov´e vl´akno dosud neexistuje, je takt´eˇz automaticky vytvoˇren. Pˇri vkl´ad´an´ı do Draweru jsou pak vzorky chronologicky ˇrazeny n´asleduj´ıc´ım zp˚ usobem: 1. Pokud je Drawer pr´azdn´ y, vloˇz´ı se vzorek ihned bez dalˇs´ıch operac´ı. 2. Pokud jiˇz v Draweru nˇejak´e vzorky jsou, pˇredpokl´ad´a se nejprve, ˇze vkl´adan´ y vzorek 25
DataPool -dataType: PlotType -dynamic: boolean +addData(newFSample: GeneralFloatingSample) +addData(data: ArrayList
) +getOrCreateDataDrawer(label: String): DataDrawer +getData(interval: GeneralInterval, fillGaps: boolean): ArrayList +getLastNSamples(n: int): ArrayList ... (gettery a settery pro atributy)
data 0..n DataDrawer -label: String -maxNoOfSamples: int -data: ArrayList +addData(newFSample: GeneralFloatingSample) +getData(interval: GeneralInterval, fillGaps: boolean): ArrayList +getData( label: String, outLabel: String, range: Range, fill: boolean): ArrayList ... (gettery a settery pro atributy)
Obr´azek 11: UML diagram tˇr´ıd pro uchov´av´an´ı a organizaci dat v operaˇcn´ı pamˇeti. V diagramu jsou uvedeny jen nˇekter´e v´ yznamn´e atributy a metody. je novˇejˇs´ı, neˇz ostatn´ı. Dojde tedy k porovn´an´ı poˇrad´ı posledn´ıho vzorku v seznamu a vzorku vkl´adan´eho podle jejich indik´ator˚ u poˇrad´ı (obecnˇe instance tˇr´ıdy Orderer). Pokud se pˇredpoklad potvrd´ı, je vzorek vloˇzen na konec seznamu. 3. Pokud nenastane ani jedna v´ yˇse zm´ınˇen´a varianta, je pomoc´ı algoritmu bin´arn´ıho vyhled´av´an´ı implementovan´eho v knihovn´ach Javy nalezeno m´ısto v chronologick´em seznamu, do kter´eho dan´ y vzorek patˇr´ı. Aby mˇel algoritmus bin´arn´ıho vyhled´av´an´ı informaci o poˇrad´ı dvojic vzork˚ u, kter´e porovn´av´a, m´a k dispozici GeneralSampleOrderComparator, kter´ y implementuje rozhran´ı Comparator a vnitˇrnˇe pracuje s metodami pro porovn´av´an´ı, zm´ınˇen´ ymi v odd´ıle 3.2.1. M´ısto, do kter´eho vkl´adan´ y vzorek patˇr´ı, m˚ uˇze b´ yt pr´azdn´e (a pak je do nˇej rovnou vloˇzen) nebo m˚ uˇze jiˇz b´ yt obsazen´e jinou hodnotou, kter´a patˇr´ı ke stejn´emu indik´atoru poˇrad´ı. V takov´em pˇr´ıpadˇe je star´a hodnota vzorku pˇreps´ana hodnotou novou. Pokud pracujeme v dynamick´em reˇzimu, je moˇzn´e nastavit, kolik vzork˚ u z kaˇzd´eho vl´akna m´a b´ yt uchov´av´ano v pamˇeti. Pokud je v Draweru vzork˚ u v´ıce, star´a data se z pamˇeti automaticky odstraˇ nuj´ı. Limit je moˇzn´e nastavit pro kaˇzd´ y drawer zvl´aˇst’, nebo pro vˇsechny najednou.
26
3.4
Zpracov´ an´ı dat
jak jiˇz bylo uvedeno v´ yˇse, knihovna libdev umoˇzn ˇuje data tak´e zpracov´avat. Zpracov´an´ı je moˇzn´e jak v dynamick´em, tak statick´em reˇzimu. V knihovnˇe jsou v souˇcasn´e dobˇe v bal´ıku com.msiroky.dataprocessing.operations.implemented operations implementovan´e operace uveden´e n´ıˇze. Rozsah p˚ usobnosti operac´ı lze upravit specifikac´ı intervalu, na kter´em pracuj´ı. 1. Zlomek (Fraction) – jedn´a se o v´ ypoˇcet pod´ıl˚ u dvou polynom˚ u, kdy kaˇzd´ y z obou polynom˚ u m˚ uˇze b´ yt ve tvaru ! m X ai · xni i + a0 (1) i=1
kde xi m˚ uˇze b´ yt hodnota vzorku z jak´ehokoliv datov´eho vl´akna a ni ai , a0 mohou b´ yt jak´akoliv desetinn´a ˇc´ısla. Vstupn´ı vzorky musej´ı m´ıt stejn´ y indik´ator poˇrad´ı (ˇcas nebo poˇradov´e ˇc´ıslo). Na stejn´ y indik´ator potom ukazuje i vzorek, kter´ y je v´ ysledkem operace. 2. V´ ypoˇcet rosn´eho bodu (Dewpoint) – Rosn´ y bod je poˇc´ıt´an z hodnoty vzork˚ u v datov´ ych vl´aknech pˇredstavuj´ıc´ıch relativn´ı vlhkost v procentech a teplotu ve ◦ C. Indik´atory poˇrad´ı se shoduj´ı stejnˇe, jako u pˇredchoz´ıho pˇr´ıpadu. 3. Suma (Sum) – Vstupem sumy jsou vzorky pouze jednoho datov´eho vl´akna. V´ ystupem je pak dalˇs´ı datov´e vl´akno. Podle zvolen´eho rozsahu m˚ uˇze suma naˇc´ıtat hodnoty vzork˚ u neust´ale a pro kaˇzd´e pˇriˇcten´ı vytvoˇrit vzorek nesouc´ı v´ ysledek, nebo seˇc´ıst hodnotu vˇzdy nˇekolika vzork˚ u a pro tento souˇcet vytvoˇrit jeden v´ ystupn´ı vzorek s indik´atorem poˇrad´ı posledn´ıho pˇriˇc´ıtan´eho vzorku. Pot´e se hodnota sumy vynuluje a v´ ypoˇcet pokraˇcuje sˇc´ıt´an´ım hodnot v dalˇs´ım bloku vzork˚ u. 4. Klouzav´ y pr˚ umˇer (MovingAverage) je moˇzn´e vyuˇz´ıt k z´akladn´ımu vyhlazov´an´ı dat. Je moˇzn´e nastavit nˇekolik parametr˚ u v´ ypoˇctu: ˇıˇrku ok´enka (poˇcet vzork˚ • S´ u), ze kter´eho se pr˚ umˇer poˇc´ıt´a • Krok (poˇcet vzork˚ u), o jak´ y se ok´enko mezi v´ ypoˇcty posouv´a • V´ ystupn´ı pozici, kter´a ud´av´a, jak´ y indik´ator poˇrad´ı bude pˇriˇrazen ke vzorku nesouc´ımu hodnotu v´ ypoˇctu z dan´eho ok´enka. 5. Vizu´aln´ı spojov´an´ı (VisualConnection) slouˇz´ı k odstraˇ nov´an´ı vzork˚ u s hodnotami NaN (Not a Number). Pokud je totiˇz datov´e vl´akno, ve kter´em jsou vzorky s touto hodnotou, vizualizov´ano pomoc´ı JFreeChart, je na m´ıstˇe, kde je hodnota NaN, ˇca´ra grafu rozpojena. Tento jev je nˇekdy ˇza´douc´ı, pokud chceme zd˚ uraznit, ˇze v dan´em m´ıstˇe data nejsou, i kdyˇz by tam b´ yt mˇela. Pokud ale chceme tento jev odstranit, m˚ uˇzeme vyuˇz´ıt operaci VisualConnection, kter´a vytvoˇr´ı nov´e datov´e vl´akno a do nˇej pˇrekop´ıruje pouze vzorky, kter´e maj´ı ne-NaN hodnotu. 6. Porovn´an´ı (Comparison) porovn´av´a hodnotu referenˇcn´ıho a porovn´avan´eho datov´eho vl´akna v identick´ ych ˇcasov´ ych okamˇzic´ıch (nebo poˇradov´ ych ˇc´ıslech). V´ ysledek porovn´an´ı, kter´ y je bud’ 1 nebo 0, je ukl´ad´an do jednoho v´ ystupn´ıho vl´akna. Referenˇcn´ı 27
hodnotu m˚ uˇze pˇredstavovat i pevnˇe zadan´e desetinn´e ˇc´ıslo. Kolem referenˇcn´ı hodnoty je moˇzn´e nastavit p´asmo o zvolen´e ˇs´ıˇrce, kdy p´asmo pˇresahuje referenˇcn´ı hodnotu na obˇe strany pr´avˇe o tuto ˇs´ıˇrku. P´asmo lze oznaˇcit za zak´azan´e, nebo lze naopak zak´azat fiktivn´ı plochu mimo p´asmo. D´ale je moˇzno nastavit, zda m´a b´ yt hl´ıd´ana horn´ı ˇci spodn´ı hranice p´asma, ˇci oboje. • P´asmo je zak´azan´e: Pokud je hl´ıd´ana pouze spodn´ı hranice p´asma, je v´ ystupn´ı hodnota nastavena na 1, pokud je porovn´avan´a hodnota vˇ etˇ s´ı neˇz spodn´ı hranice p´asma. Pokud je hl´ıd´ana pouze horn´ı hranice, pak je v´ ystupn´ı hodnota rovna 1, pokud je porovn´avan´a hodnota menˇs´ı, neˇz horn´ı hranice p´asma. Pokud jsou hl´ıd´any obˇe hranice, je na v´ ystupu operace jedniˇcka, pokud je porovn´avan´a hodnota uvnitˇ r p´asma. • P´asmo je povolen´e: Pokud je hl´ıd´ana pouze spodn´ı hranice p´asma, je v´ ystupn´ı hodnota nastavena na 1, pokud je porovn´avan´a hodnota menˇ s´ı neˇz spodn´ı hranice p´asma. Pokud je hl´ıd´ana pouze horn´ı hranice, pak je v´ ystupn´ı hodnota rovna 1, pokud je porovn´avan´a hodnota vˇ etˇ s´ı, neˇz horn´ı hranice p´asma. Pokud jsou hl´ıd´any obˇe hranice, je na v´ ystupu operace jedniˇcka, pokud je porovn´avan´a hodnota mimo p´asmo. 7. Nejmenˇs´ı ˇctverce (LeastSquares) – Metodu ˇreˇsen´ı soustavy rovnic pomoc´ı metody nejmenˇs´ıch ˇctverc˚ u nejˇcastˇeji vyuˇzijeme pˇri aproximaci nˇejak´e kˇrivky polynomem – ’ napˇr´ıklad pˇri zjiˇst ov´an´ı statick´e charakteristiky ˇcidel. Pro ˇreˇsen´ı soustavy rovnic je vyuˇz´ıv´ana knihovna commons-math-2.1. Nyn´ı bude n´asledovat popis vztah˚ u tˇr´ıd, kter´e implementuj´ı v´ yˇse zm´ınˇen´e operace a detailnˇejˇs´ı popis implementace operac´ı Zlomek a Rosn´y bod. UML diagram tˇr´ıd se nach´az´ı na obr´azku 12 na stranˇe 29. Na obr´azku 12 je vidˇet tˇr´ıda Operations, kter´a slouˇz´ı ke spr´avˇe a spouˇstˇen´ı vˇsech operac´ı v bˇeˇz´ıc´ı aplikaci. Pˇres objekt Operations je moˇzn´e hromadnˇe nastavovat objekt vyuˇz´ıvan´ y pro manipulaci s datov´ ymi vzorky – jejich naˇc´ıt´an´ı a ukl´ad´an´ı v r´amci operaˇcn´ı pamˇeti. Ve starˇs´ıch verz´ıch knihovny bylo toto rozhran´ı implementov´ano jednou tˇr´ıdou pro pr´aci ve statick´em a druhou tˇr´ıdou pro pr´aci v dynamick´em reˇzimu. V souˇcasn´e verzi aplikace se k tˇemto u ´ˇcel˚ um vyuˇz´ıv´a DataPool, kter´ y implementuje potˇrebn´e rozhran´ı OperationDataHandler a je schopn´ y pracovat jak ve statick´em, tak dynamick´em reˇzimu. V dalˇs´ıch verz´ıch knihovny bude moˇzn´e odstranit zp˚ usob pˇristupov´an´ı k dat˚ um pˇres interface a pracovat rovnou s datov´ ym typem DataPool. V diagramu na obr´azku je vidˇet, ˇze vˇsechny zn´azornˇen´e operace jsou odvozeny od abstraktn´ı tˇr´ıdy Operation. Dceˇrin´e tˇr´ıdy pak implementuj´ı abstraktn´ı metody ze tˇr´ıdy Operation, vˇcetnˇe metody perform(). Tato generalizace umoˇzn ˇuje tˇr´ıdˇe Operations pracovat se vˇsemi typy operac´ı jednotnˇe. Pˇri vol´an´ı metody perform() (proveden´ı v´ ypoˇctu) ve tˇr´ıdˇe Operations se spust´ı postupnˇe metody perform() ve vˇsech spravovan´ ych operac´ıch (Operation) v poˇrad´ı dan´em odkazy na tyto objekty v ArrayListu operations v objektu Operations. Rozsah p˚ usobnosti kaˇzd´e operace je urˇcen odkazem na pˇr´ısluˇsn´ y objekt tˇr´ıdy Range. Tˇr´ıdu com.msiroky.dataprocessing.operations.Range m˚ uˇzete vidˇet na UML diagramu 12. Samotn´a tˇr´ıda Range je abstraktn´ı a je implementov´ana a konkretizov´ana dalˇs´ımi tˇremi. V´ yznam rozsahu se liˇs´ı podle toho, zda pracujeme s daty v dynamick´em, nebo statick´em reˇzimu. 28
Operations -dataHandler: OperationDataHandler +perform(); ... (gettery a settery pro atributy)
Fraction
LeastSquares -x: String -y: String -showCoefficients: boolean -validate: boolean -polynomDegree: int +perform() ... (gettery a settery pro atributy)
operations
0..n Operation #dataHandler: OperationDataHandler #outLabel: String #fillGaps: boolean #note: String +perform() +toXMLElement(): Element getType(): OperationType ... (gettery a settery pro atributy)
Comparison -referanceLabel: String -comparedLabel: String -margin: double -upperBoundary: boolean -lowerBoundary: boolean -bandForbidden: boolean -useConstant: boolean +perform() ... (gettery a settery pro atributy)
AllSamplesRecursiveRange
range
Range getType(): RangeType
TimeRange
NSamplesRange
Dewpoint temperatureLabel: String relativeHumidityLabel: String +perform() ... (gettery a settery pro atributy)
Obr´azek 12: UML diagram tˇr´ıd pro prov´adˇen´ı operac´ı nad datov´ ymi vzorky.
29
1. AllSamplesRecursiveRange V dynamick´em reˇzimu dojde k naˇcten´ı posledn´ıho vzorku, kter´ y byl do dan´eho datov´eho vl´akna uloˇzen. Poˇc´ıt´a se zde totiˇz s t´ım, ˇze operace bude prov´adˇena po kaˇzd´em vloˇzen´ı a vzorky budou pˇrib´ yvat po jednom. Ve statick´em reˇzimu ze z DataPoolu vr´at´ı cel´e datov´e vl´akno. 2. TimeRange Jak ve statick´em, tak v dynamick´em reˇzimu budou naˇcteny z datov´eho vl´akna vzorky, kter´e maj´ı ˇcasovou znaˇcku v rozsahu Intervalu, kter´ y je v pˇr´ısluˇsn´em objektu TimeRange uloˇzen. V knihovnˇe zat´ım chyb´ı implementace ˇc´ıseln´eho rozsahu NumberRange, kter´ y by fungoval obdobn´ ym zp˚ usobem pro ˇc´ıseln´e ˇrady. 3. NSamplesRange V dynamick´em reˇzimu bude do operace naˇcteno N posledn´ıch vzork˚ u z dan´eho datov´eho vl´akna. V reˇzimu statick´em pak bude naˇcten´e datov´e vl´akno cel´e a bude zpracov´av´ano po ok´enk´ach velikosti N. Pouˇzit´ı tohoto rozsahu bylo v´ yˇse zm´ınˇeno u operace Suma. Instance operac´ı lze v bˇeˇz´ıc´ım programu vytv´aˇret, programovˇe pomoc´ı napevno napsan´eho zdrojov´eho k´odu, interakc´ı s uˇzivatelem pomoc´ı grafick´eho rozhran´ı, anebo na z´akladˇe informac´ı uloˇzen´ ych v XML konfiguraˇcn´ım souboru. Naˇc´ıt´an´ı souboru samotn´eho se budeme vˇenovat pozdˇeji. Jak jiˇz ale bylo zm´ınˇeno v kapitole 2.3, pro pr´aci s XML soubory je vyuˇz´ıv´ana knihovna Jdom, pomoc´ı kter´e je moˇzn´e konfiguraˇcn´ı soubor pˇreˇc´ıst a v operaˇcn´ı pamˇeti reprezentovat v objektov´e formˇe. Hlavn´ım stavebn´ım prvkem takto reprezentovan´eho dokumentu (org.jdom.Document) je XML element (org.jdom.Element). Nejprve si pop´ıˇseme ukl´ad´an´ı parametr˚ u operac´ı do XML elementu. Kaˇzd´a operace implementuje abstraktn´ı metodu toXMLElement(). Tato metoda vrac´ı objekt tˇr´ıdy org.jdom.Element, ve kter´em jsou ve formˇe XML atribut˚ u (org.jdom.Attribute) uloˇzeny informace o n´azvu vstupn´ıho (pˇr´ıpadnˇe v´ıce vstupn´ıch) a v´ ystupn´ıho vl´akna operace a tak´e pˇr´ıpadn´e dalˇs´ı parametry z´avisej´ıc´ı na typu operace. Tento XML element, pˇredstavuj´ıc´ı v podstatˇe serializovanou operaci, v sobˇe obsahuje tak´e dalˇs´ı vnoˇren´ y element kter´ y je serializovanou“ instanci tˇr´ıdy Range. Operace pro v´ ypoˇcet rosn´eho bodu s rozsahem ” p˚ usobnosti pro vˇsechny vzorky pak po zaps´an´ı do XML elementu a uloˇzen´ı do souboru m˚ uˇze vypadat n´asleduj´ıc´ım zp˚ usobem: <parametres temperature="t1" humidity="rh1" outlabel="rb1" fill_gaps="true" /> 3.4.1
Zlomek
Nyn´ı se budeme bl´ıˇze vˇenovat operaci Zlomek (Fraction). Aby u zlomku bylo moˇzn´e dos´ahnout v´ yˇse zm´ınˇen´ ych vlastnost´ı a umoˇznit libovoln´ y poˇcet ˇclen˚ u v ˇcitateli a jmenovateli, pˇriˇcemˇz kaˇzd´ y ˇclen m˚ uˇze b´ yt libovoln´ ym n´asobkem libovoln´e mocniny vzorku z libovoln´eho datov´eho vl´akna, bylo nutn´e vytvoˇrit dostateˇcnˇe pruˇznou a dynamickou strukturu a prov´adˇet v´ ypoˇcty decentralizovan´ ym a hierarchick´ ym zp˚ usobem. S popisem procesu v´ ypoˇctu zlomku zaˇcneme u jeho jednotliv´ ych ˇclen˚ u, objekt˚ u tˇr´ıdy Term. Kaˇzd´ y ˇclen v sobˇe nese informaci o n´azvu vstupn´ıho datov´eho vl´akna inputDataLabel, hodnotˇe n´asobku a mocniny (coefficient a power) a nakonec tak´e hodnotu zpracov´avan´eho 30
Fraction +perform() ... (gettery a settery pro atributy)
numerator, denominator 2
fans 0..n
Polynomial -absolute: double +evaluate(): double ... (gettery a settery pro atributy)
DataFan dataLabel: String data: ArrayList distibuteData(indexOfSample: int) ... (gettery a settery pro atributy)
terms 0..n
subscribers
Term -inputDataLabel: String -power: double -coefficient: double -data: double +evaluate(): double ... (gettery a settery pro atributy)
0..n DataSubscriber +setData (data: double) +getWantedLabel(): String
Obr´azek 13: UML diagram tˇr´ıd souvisej´ıc´ıch s v´ ypoˇcetn´ı operac´ı Zlomek vzorku data. Vyhodnocen´ı ˇclenu se provede vol´an´ım metody evaluate(). Jak je zˇrejm´e z popisu, ve ˇclenu se vyhodnocuje vˇzdy jen jeden vzorek. Pokud chceme vyhodnocovat cel´e datov´e vl´akno, potˇrebujeme nˇejak´ y mechanizmus distribuce vstupn´ıch dat do ˇclen˚ u. T´ımto mechanismem jsou objekty tˇr´ıdy DataFan (vˇej´ıˇre dat). Pokud je operace Fraction generov´ana na z´akladˇe XML Elementu, jsou nejprve vytvoˇreny polynomy v ˇcitateli a jmenovateli i s jejich ˇcleny. N´aslednˇe se proch´az´ı vˇsechny ˇcleny, v obou polynomech a podle n´azv˚ u jejich vstupn´ıch vl´aken se pˇrid´avaj´ı do seznamu pˇr´ıjemc˚ u dat v pˇr´ısluˇsn´em objektu tˇr´ıdy DataFan, kter´ y m´a shodn´ y n´azev poskytovan´eho datov´eho vl´akna s t´ım poˇzadovan´ ym. Pokud zat´ım neexistuje pˇr´ısluˇsn´ y DataFan, vytvoˇr´ı se. Z UML diagramu na obr´azku 13 je vidˇet, ˇze za t´ımto u ´ˇcelem tˇr´ıda Term implementuje rozhran´ı DataSubscriber – tedy objekt, kter´ y se up´ıˇse“ ke pˇrij´ım´an´ı dat. ” Pˇri vol´an´ı metody perform() v objektu Fraction se nejprve naˇctou data ze vˇsech vstupn´ıch datov´ ych vl´aken a tyto datov´e ˇrady se vyrovnaj´ı pomoc´ı objektu ExportPool.8 Vyrovn´an´ı datov´ ych ˇrad znamen´a, ˇze se vzorky uspoˇra´daj´ı podle jejich poˇradov´ ych znaˇcek tak, aby pro kaˇzdou datovou znaˇcku existoval vzorek ve vˇsech datov´ ych vl´aknech. Pokud z nˇejak´eho d˚ uvodu v nˇekter´em vstupn´ım vl´aknˇe vzorek s takovou poˇradovou znaˇckou chyb´ı, je vytvoˇren a jeho hodnota je nastavena na NaN. V´ ysledek zlomku je pak pro takovou poˇradovou znaˇcku tak´e NaN. Takto vyrovnan´a datov´a vl´akna se n´aslednˇe vloˇz´ı do pˇr´ısluˇsn´ ych datov´ ych vˇej´ıˇr˚ u (DataFan). V´ ypoˇcet zlomku pak prob´ıh´a tak, ˇze pro kaˇzd´ y index v datov´ ych vl´aknech probˇehne distribuce hodnoty vzorku na tomto indexu do ˇclen˚ u (Term), kter´e se zareg8
Tˇr´ıdˇe ExportPool se bl´ıˇze vˇenuje kapitola 3.5
31
istrovaly ke pˇr´ıjmu dat. Jakmile je u vˇsech ˇclen˚ u nastavena hodnota atributu data, jsou z objektu Fraction vol´any metody evaluate() v ˇcitateli a jmenovateli. Tyto metody vracej´ı souˇcet v´ ysledk˚ u ˇclen˚ u polynomu a absolutn´ıho ˇclenu podle vzorce 1 na stranˇe 27. Zpˇet v metodˇe perform() je v´ ysledek vyhodnocen´ı ˇcitatele vydˇelen v´ ysledkem vyhodnocen´ı jmenovatele. Pokud je jmenovatel rovn´ y nule, je v´ ysledek zlomku nastaven na NaN. Je vytvoˇren nov´ y objekt datov´eho vzorku (podle typu vstupn´ıch dat bud’ Numbered- nebo TimeStamped- FloatingSample), je do nˇej uloˇzen v´ ysledek a pˇriˇrazena pˇr´ısluˇsn´a poˇradov´a znaˇcka. V´ ystupn´ı vzorek je zaˇrazen do seznamu v objektu Fraction. V´ yˇse zm´ınˇen´ y postup distribuce dat a v´ ypoˇct˚ u se opakuje pro vˇsechny indexy vstupn´ ych datov´ ych vl´aken a po zpracov´an´ı posledn´ıho indexu jsou v´ ystupn´ı data zaˇrazena mezi ostatn´ı datov´a vl´akna v operaˇcn´ı pamˇeti pomoc´ı objektu DataPool. Ilustrace operace Fraction uloˇzen´e do XML: <parametres outlabel="rh2" fill_gaps="true" /> <polynomial absolute="0.0"> <polynomial absolute="1.0" /> <note> 3.4.2
Rosn´ y bod
pro v´ ypoˇcet rosn´eho bodu vzduchu pouˇz´ıv´a tˇr´ıda Dewpoint vnitˇrnˇe objekt tˇr´ıdy Air, kter´ y je vyuˇz´ıv´an k reprezentaci vzduchu. Pomoc´ı metod ve tˇr´ıdˇe Air je moˇzn´e z´ısk´avat informace o teplotˇe rosn´eho bodu, absolutn´ı a relativn´ı vlhkosti vzduchu. V m´e bakal´aˇrsk´e pr´aci [1] byl k v´ ypoˇct˚ um rosn´eho bodu pouˇz´ıv´an program Octave. V´ ypoˇcet byl zaloˇzen na aproximaci vztahu mezi teplotou vzduchu a jeho maxim´aln´ı absolutn´ı vlhkost´ı pomoc´ı polynomu 3. stupnˇe. V´ ypoˇcet rosn´eho bodu vzduchu ze znalosti relativn´ı vlhkosti a teploty pak spoˇc´ıv´a v nalezen´ı hodnoty maxim´aln´ı absolutn´ı vlhkosti pro danou teplotu, vydˇelen´ım t´eto hodnoty velikost´ı relativn´ı vlhkosti (dostaneme aktu´aln´ı absolutn´ı vlhkost) a nalezen´ı koˇrene (hodnota teploty) polynomu pro zjiˇstˇenou hodnotu absolutn´ı vlhkosti. Vzhledem k tomu, ˇze polynom je na pracovn´ım rozsahu −10 aˇz +40 circ C monot´onn´ı, dostaneme pouze jedno re´aln´e ˇreˇsen´ı. Hled´an´ı koˇrene polynomu nen´ı vˇsak v´ ypoˇcetnˇe rychl´a operace a na rozd´ıl od Octave nen´ı ve standardn´ıch knihovn´ach jazyka Java implementov´ana. K ˇreˇsen´ı jsem se nechal inspirovat znalostmi z pˇredmˇetu Numerick´e metody (KMA/NM). Pˇri inicializaci objektu tˇr´ıdy Air je vytvoˇrena vyhled´avac´ı tabulka a jej´ı lev´ y sloupec je vyplnˇen hodnotami teploty v rozsahu od lowerBoundTemp do upperBoundTemp s krokem tempAccuracy. Pro kaˇzdou hodnotu teploty je souˇcasnˇe vyˇc´ıslen polynom a z´ıskan´a hodnota maxim´aln´ı absolutn´ı vlhkosti je uloˇzena do prav´eho sloupce. Pˇri hled´an´ı teploty rosn´eho bodu pak objekt Air opˇet vyˇc´ısl´ı polynom a zjist´ı hodnotu maxim´aln´ı absolutn´ı vlhkosti. Tuto hodnotu vydˇel´ı relativn´ı vlhkost´ı (Rozsah 0 aˇz 100% se mapuje na 0 aˇz 1.) ˇc´ımˇz z´ısk´a aktu´aln´ı absolutn´ı vlhkost. Pro tuto hodnotu absolutn´ı 32
Air -tempAccuracy: double -lowerBoundTemp: int -upperBoundTemp: int +dewPoint(temperature: double, percent_rh: double): double +dewPoint(absoluteHumidity: double): double +maxAbsHumidity(temperature: double): double +percentRH(temperature: double, abs_humidity: double): double ... (gettery a settery pro atributy)
lookupTable
DoubleLookupTable -length: int -right: double[] -left: double[] +getLeftTo(right: double): double +getRightTo(left: double): double +getNearer(value: double, array: double[], index_a: int, index_b: int): int ... (gettery a settery pro atributy)
Obr´azek 14: Tˇr´ıda Air a vyhled´avac´ı tabulka vlhkosti je ve vyhled´avac´ı tabulce metodou getLeftTo() nalezena koresponduj´ıc´ı teplota. Nejprve v tabulce prob´ıh´a vyhled´av´an´ı co nejbliˇzˇs´ı hodnoty absolutn´ı vlhkosti metodou p˚ ulen´ı intervalu. Kdyˇz hledan´a hodnota absolutn´ı vlhkosti spad´a mezi dva sousedn´ı indexy v tabulce, je vybr´an index na kter´em je hodnota bliˇzˇs´ı t´e hledan´e. Pokud porovn´an´ı vyjde nerozhodnˇe, je upˇrednostnˇen vyˇsˇs´ı index. Jako teplota rosn´eho bodu je n´aslednˇe vr´acena hodnota na pˇr´ısluˇsn´em indexu z lev´e poloviny tabulky.
3.5
Export dat
Export dat a ukl´ad´an´ı dat do textov´ ych soubor˚ u je velmi d˚ uleˇzitou funkc´ı mˇeˇric´ı aplikace a metody, kter´e ji umoˇzn ˇuj´ı jsou dostateˇcnˇe implementov´any v knihovnˇe libdev. Hlavn´ı tˇr´ıdy urˇcen´e pro export dat do soubor˚ u m˚ uˇzeme vidˇet na obr´azku 15. Tˇr´ıda ExportPool byla zm´ınˇena jiˇz dˇr´ıve a proto by bylo dobr´e zaˇc´ıt v´ yklad u n´ı. ExportPool je v podstatˇe tabulka s pevn´ ym poˇctem sloupc˚ u, kter´e se vytvoˇr´ı v konstruktoru instance a odpov´ıdaj´ı poˇctu datov´ ych vl´aken, kter´a budeme ukl´adat. Poˇcet ˇra´dk˚ u tabulky je promˇenn´ y. V pˇredchoz´ım textu bylo zm´ınˇeno, ˇze ExportPool se vyuˇz´ıv´a k vyrovn´av´an´ı datov´ ych ˇrad. tato jeho funkce m´a p˚ uvod ve skuteˇcnosti, ˇze m˚ uˇze nastat situace, kdy budeme cht´ıt do jednoho CSV souboru uloˇzit data z r˚ uzn´ ych datov´ ych vl´aken, pˇriˇcemˇz pro urˇcit´e poˇradov´e znaˇcky nebude hodnota pˇr´ıtomna ve vˇsech vl´aknech. V nˇekter´ ych vl´aknech budou zkr´atka mezery. Pˇri vkl´ad´an´ı vzorku do ExportPoolu dojde k rozdˇelen´ı sloˇzek vzorku na hodnotu a poˇradovou znaˇcku. Poˇradov´e znaˇcky se ukl´adaj´ı v samostatn´em sloupci pro vˇsechna da33
ExportPool -noOfDatacols: int -orderers: ArrayList -data: ArrayList<double[]> -labels: ArrayList<String> +ExportPool(labels: ArrayList<String>): ExportPool +getSamples(label: String): ArrayList +addSamples(samples: ArrayList) +getData(index: int): double[] ... (gettery a settery pro atributy)
exportPool
exportPool
GeneralDataExporter -outputFile: OutputTextFile +writeToFile() ... (gettery a settery pro atributy)
Thread
StaticDataExporter -outputFile: OutputTextFile -profile: VisualProfile +export() ... (gettery a settery pro atributy)
exportSettings
exportSettings
ExportSettings -oredererFormatString: String -colSeparator: String -stringSeparator: String -textEncoding: String +getInstance(xmlElement: Element): ExportSettings +toXMLElement(): Element ... (gettery a settery pro atributy)
Obr´azek 15: Tˇr´ıdy pro export dat
34
tov´a vl´akna, nikoliv pro samostatn´e vzorky. Pokud jiˇz v tabulce existuje ˇra´dka s pˇr´ısluˇsnou poˇradovou znaˇckou, je hodnota vloˇzena do sloupce t´eto ˇra´dky, kter´ y odpov´ıd´a n´azvu daˇ adky jsou automattov´eho vl´akna. Pokud zat´ım takov´a ˇr´adka neexistuje, je vytvoˇrena. R´ icky ˇrazeny a vkl´ad´any podle poˇradov´ ych znaˇcek podobnˇe, jako se to dˇeje s plovouc´ımi vzorky v DataDraweru. Pokud tedy dojde k tomu, ˇze sloupce v nˇekter´ ych ˇra´dk´ach jsou neobsazen´e, povaˇzuje se pˇri exportu hodnota na tˇechto pozic´ıch za NaN. Pˇri exportu m´a tedy kaˇzd´a ˇra´dka pln´ y poˇcet sloupc˚ u, pˇriˇcemˇz na nˇekter´ ych pozic´ıch je hodnota NaN. Pro uchov´av´an´ı nastaven´ı exportu slouˇz´ı tˇr´ıda ExportSettings. Objekty t´eto tˇr´ıdy je moˇzn´e ukl´adat do XML, nebo je zpˇet naˇc´ıtat. Uloˇzen´e parametry souvis´ı s vlastnostmi CSV soubor˚ u, jako je oddˇelovaˇc sloupc˚ u a oddˇelovaˇc ˇretˇezc˚ u. Nastavit lze tak´e k´odov´an´ı textu a form´atovac´ı ˇretˇezec pro poˇradovou znaˇcku ˇra´dku souboru. U ˇc´ıseln´ ych ˇrad nem´a form´atovac´ı ˇretˇezec vliv a slouˇz´ı jen jako titulek prvn´ıho sloupce souboru. U ˇrad ˇcasov´ ych m´a vliv na zp˚ usob v´ ypisu data a ˇcasu. Pro form´atovan´ y v´ ystup data a ˇcasu je pouˇz´ıv´ana tˇr´ıda java.text.SimpleDateFormat. Informace o pouˇz´ıv´an´ı form´atovac´ıho ˇretˇezce lze nal´ezt v dokumentaci k t´eto tˇr´ıdˇe. Obdobnˇe jako u ˇc´ıseln´ ych ˇrad je i zde form´atovac´ı ˇretˇezec titulkem 1. sloupce. Nadpisy dalˇs´ıch sloupc˚ u odpov´ıdaj´ı n´azv˚ um pˇr´ısluˇsn´ ych datov´ ych vl´aken. Poˇrad´ı sloupc˚ u je stejn´e jako poˇrad´ı n´azv˚ u datov´ ych vl´aken zadan´e pˇri vytv´aˇren´ı ExportPoolu. Pro export v dynamick´em a statick´em reˇzimu se v knihovnˇe pouˇz´ıvaj´ı dva r˚ uzn´e mechanismy, kter´e mohou b´ yt v dalˇs´ı verzi knihovny slouˇceny do jednoho. V souˇcasn´e dobˇe slouˇz´ı pro export postupnˇe pˇrib´ yvaj´ıc´ıch dat tˇr´ıda GeneralDataExporter a pro data statick´a pak tˇr´ıda StaticDataExporter. Jak je patrn´e z UML diagramu na obr´azku 15, StaticDataExporter dˇed´ı od tˇr´ıdy Thread (Je to programov´e vl´akno). Tento pˇr´ıstup vych´az´ı z toho, ˇze v pˇr´ıpadˇe statick´ ych dat, je objem najednou ukl´adan´ ych dat vˇetˇs´ı neˇz v dynamick´em pˇr´ıpadˇe a s vˇetˇs´ı pravdˇepodobnost´ı se bude i jednat o aplikaci, kter´a m´a grafick´e rozhran´ı a komunikuje s uˇzivatelem. Z tohoto d˚ uvodu je vhodnˇejˇs´ı, aby proces ukl´ad´an´ı prob´ıhal na pozad´ı a aplikace mohla i nad´ale reagovat na akce uˇzivatele. Proces pr˚ ubˇeˇzn´eho ukl´ad´an´ı dat v mˇeˇric´ı aplikaci je ˇr´ızen tˇr´ıdou DynamicMemory. Tato tˇr´ıda zajiˇst’uje periodick´e ukl´ad´an´ı a generuje n´azvy a cesty c´ılov´ ych CSV soubor˚ u. UML diagram t´eto tˇr´ıdy se nach´az´ı na obr´azku 16 na stranˇe 36. Do DynamicMemory pˇrich´azej´ı namˇeˇren´a data a jsou ukl´ad´ana do DataPoolu. V mˇeˇric´ı aplikaci se vyuˇz´ıv´a vkl´ad´an´ı dat po ˇr´adc´ıch, pˇriˇcemˇz se po vloˇzen´ı ˇr´adku automaticky spust´ı proveden´ı v´ ypoˇcetn´ıch operac´ı. Objekt outputFolder uchov´av´a informaci o z´akladn´ı cestˇe k ukl´ad´an´ı dat. Ukl´ad´an´ı se spouˇst´ı periodicky pomoc´ı ˇcasovac´ıho vl´akna timingThread. Data se ukl´adaj´ı do souboru podle kalend´aˇrn´ıho data. Cesta k exportn´ımu souboru je odvozena od cesty z´akladn´ı a d´ale je vytvoˇrena sloˇzka podle roku (ve form´atu yyyy) a podsloˇzka podle mˇes´ıce (ve form´atu MM). Exportn´ı soubory jsou pojmenov´av´any ve form´atu yyyy MM dd. Pokud je tˇreba pracovat se soubory s exportovan´ ymi daty, je moˇzn´e periodick´e ukl´ad´an´ı pozastavit na poˇzadovanou dobu pomoc´ı metody disableExport(interval: int), kde interval ud´av´a poˇcet milisekund.
3.6
Vizualizace dat
Jak jiˇz bylo uvedeno v´ yˇse, pro samotn´e vykreslov´an´ı dat je vyuˇz´ıv´ana knihovna JFreeChart. Proces mezi z´ısk´an´ım dat a jejich vykreslen´ım na obrazovku je pak ˇr´ızen tˇr´ıdami z ˇ ızen´ı prob´ıh´a pomoc´ı tzv. vizu´aln´ıch probal´ıku com.msiroky.charting.profiles. R´ 35
DynamicMemory -pool: DataPool -operations: Operations -exportDisabler: ExportDisabler -timingThread: PeriodicTimingThread -exportedLabels: ArrayList<String> -outputFolder: ExtendedPath -exportSettings: ExportSettings -exportEnabled: boolean +export() +disableExport(interval: int) +enableExport(enable: boolean) +addData(sample: GeneralFloatingSample) +addDataRow(samples: ArrayList) +performOperations() ... (gettery a settery pro atributy)
Obr´azek 16: Tˇr´ıda DynamicMemory fil˚ u. Vizu´aln´ı profil je pˇredstavov´an tˇr´ıdou VisualProfile a od n´ı jsou odvozen´e tˇr´ıdy PresentationProfile a MonitoringProfile. UML diagram tˇechto tˇr´ıd se nach´az´ı na obr´azku 17 na str´ance 37. Profily tˇr´ıdy MonitoringProfile slouˇz´ı k ˇr´ızen´ı zobrazov´an´ı dynamick´ ych dat a profily tˇr´ıdy PresentationProfile pro ˇr´ızen´ı zobrazov´an´ı dat statick´ ych. Jak je vidˇet z diagramu, profily jsou odvozeny od v pamˇeti uloˇzen´eho textov´eho souboru“ 9 . To jim ” umoˇzn ˇuje, aby mohly b´ yt snadno uloˇzeny na disk ve formˇe textov´eho XML souboru, nebo opˇet z disku naˇcteny. Jak z obr´azku vid´ıme, VisualProfile obsahuje odkaz na objekt tˇr´ıdy Plot a ten pak seznam odkaz˚ u na objekty tˇr´ıdy Subplot. Tyto tˇr´ıdy uchov´avaj´ı informace o vzhledu grafu a podgraf˚ u a v pˇr´ıpadˇe vykreslov´an´ı statick´ ych dat se staraj´ı o naˇcten´ı dat ze soubor˚ u do operaˇcn´ı pamˇeti (do dataPoolu). V pˇr´ıpadˇe dynamick´ ych dat a monitorov´an´ı se pouˇz´ıvaj´ı rozˇs´ıˇren´e tˇr´ıdy MonitoringPlot a MonitoringSubplot. Monitorovac´ı graf (plot) se vytv´aˇr´ı s pr´azdn´ ymi podgrafy (subploty) a rozˇs´ıˇren´a tˇr´ıda 10 umoˇzn ˇuje exponovat odkazy na datov´e ˇrady vykreslovan´e do panelu knihovnou JFreeChart. D´ıky tomu je moˇzn´e do dynamick´eho grafu vkl´adat vykreslovan´a data z objekt˚ u mimo strukturu vizu´aln´ıch profil˚ u. Zobrazov´an´ı statick´ ych dat se od zobrazov´an´ı tˇech dynamick´ ych liˇs´ı t´ım, ˇze umoˇzn ˇuje 11 prov´adˇet nad naˇcten´ ymi daty v´ ypoˇcetn´ı operace. Prov´adˇen´ı operac´ı nad daty vkl´adan´ ymi do dynamick´eho grafu nen´ı podporov´ano. Zde se poˇc´ıt´a s t´ım, ˇze data jsou upravena jiˇz pˇred vloˇzen´ım do grafu. V architektuˇre mˇeˇric´ı aplikace se o zpracov´an´ı dat star´a serverov´a ” ˇca´st“, zat´ımco ˇc´ast klientsk´a a vizualizaˇcn´ı operace nad daty jiˇz neprov´ad´ı. Zde se dost´av´ame k dalˇs´ımu rozd´ılu v pouˇzit´ı dynamick´eho a statick´eho zobrazov´an´ı 9
InMemoryTextFile tˇr´ıda org.jfree.data.general.Series 11 Mechanismu v´ ypoˇcetn´ıch operac´ı se vˇenuje odd´ıl 3.4. 10
36
Plot -title: String -subtitle: String -dataPool: DataPool -dataSources: DataSource -domainLabel:String -interval: GeneralInterval -operations: Operations -plotType: PlotType +bloom() +getJFreeChart(): JFreeChart ... (gettery a settery pro atributy)
subPlots 0..n parentPLot
plot
MonitoringSubplot
MonitoringPlot -seriesList: ArrayList<Series> -seriesLabels: ArrayList<String> -seriesAliases: ArrayList<String> --+getSeriesByLabel(label: String): Series ... (gettery a settery pro atributy)
MonitoringProfile ... (gettery a settery pro atributy)
Subplot -active: boolean #alpha: float #dataThreads: ArrayList #graphicType: GraphicType #name: String #rangeAxisLabels: ArrayList<String> #weight: int getXYSubplot(): XYPLot ... (gettery a settery pro atributy)
getXYSubplot(): XYPLot ... (gettery a settery pro atributy)
VisualProfile -plot: Plot +setOrderer(orderer: Orderer) +getOrderer(): Orderer #listSubplots(root: Element) #listFiles(root: Element) #loadSubplot(subplot: Subplot, subplotElement: Element) ... (gettery a settery pro atributy)
PresentationProfile -listOperations(contextElement: Element) ... (gettery a settery pro atributy)
Profile
InMemoryTextFile -file: String +load() +save() ... (gettery a settery pro atributy)
Obr´azek 17: Tˇr´ıdy pro vizualizaci dat
37
dat. Zat´ımco pˇr´ıstup dynamick´ y se uplatn´ı u mˇeˇric´ı aplikace, kter´a se nastavuje na m´ıru konkr´etn´ı situaci a mˇeˇric´ımu zaˇr´ızen´ı a po zprovoznˇen´ı nen´ı jiˇz nutn´e toto nastaven´ı mˇenit, uplatnˇen´ı vizualizace statick´ ych dat vyˇzaduje mnohem ˇcastˇejˇs´ı zmˇeny konfigurace. Tento fakt vych´az´ı ze situace, ˇze vizualizace statick´ ych dat nen´ı v´azan´a na konkr´etn´ı mˇeˇren´ y proces a konkr´etn´ı obsluhu, ale je moˇzn´e vizualizaˇcn´ı aplikaci vyuˇz´ıvat pro zobrazov´an´ı dat r˚ uzn´eho p˚ uvodu a z r˚ uzn´ ych zdroj˚ u (soubor˚ u r˚ uzn´eho form´atu). Aplikace pro vizualizaci statick´ ych dat je urˇcena ˇsirˇs´ımu okruhu uˇzivatel˚ u a je ˇza´douc´ı, aby bylo moˇzn´e jednoduˇse nastavit, z jak´ ych zdroj˚ u data naˇc´ıst, jak´e operace nad nimi prov´est a jak je vykreslit. Z tohoto d˚ uvodu jsem vytvoˇril pro editov´an´ı profil˚ u pro zobrazov´an´ı statick´ ych dat grafick´ y editor, kter´ y je souˇc´ast´ı knihovny libdev. V dalˇs´ı verzi knihovny m˚ uˇze b´ yt tento editor rozˇs´ıˇren i na profily dynamick´e.
3.7
Editor vizualizaˇ cn´ıch profil˚ u
ProfileEditor -tree: JTree -profile: Profile ... +createNewProfile() +openProfile(file: String) ... (gettery a settery pro atributy)
«Interface» EditorElement +getNode(): DefaultMutableTreeNode +setNodenode: (DefaultMutableTreeNode) +getMasterEditor(): ProfileEditor +setMasterEditor(masterEditor: ProfileEditor) +reload() +confirm() +refresh() +remove() ...
javax.swing.JPanel
SubplotEditor
DataThreadEditor
Obr´azek 18: Tˇr´ıdy pro editov´an´ı vizualizaˇcn´ıch profil˚ u Na obr´azku 18 jsou zn´azornˇeny tˇr´ıdy grafick´eho editoru vizu´aln´ıch profil˚ u. Hlavn´ı tˇr´ıdou je ProfileEditor. Editovac´ı elementy (tˇr´ıdy implementuj´ıc´ı rozhran´ı EditorElement jsou pak organizov´any pomoc´ı objektu JTree, kter´ y tyto jednotliv´e elementy zobrazuje v hierarchick´e stromov´e struktuˇre. Z diagramu je vidˇet, ˇze elementy jsou rozˇs´ıˇren´ımi tˇr´ıdy JPanel, coˇz umoˇzn ˇuje jejich zobrazov´an´ı na monitoru. Kaˇzd´ y element umoˇzn ˇuje prov´adˇen´ı u ´prav nad urˇcitou ˇca´st´ı profilu. Napˇr´ıklad jeden element slouˇz´ı k vytv´aˇren´ı a maz´an´ı podgraf˚ u a jin´e elementy pak umoˇzn ˇuj´ı upravovat vlastnosti konkr´etn´ıho podgrafu. Popis grafick´eho editoru a jeho ovl´ad´an´ı bude uveden v n´avodu k obsluze vizualizaˇcn´ı aplikace.
4
Mˇ eˇ ric´ı aplikace
N´asleduj´ıc´ı ˇc´ast se bude vˇenovat popisu architektury mˇeˇric´ı aplikace. Z d˚ uvodu robustnosti je aplikace rozdˇelena na dvˇe ˇca´sti: Server a Klient. Komunikace mezi serverem a klientem 38
prob´ıh´a v protokolu XML-RPC. V´ yvoj mˇeˇric´ı aplikace jsem prov´adˇel v NetBeans v r´amci jednoho projektu typu y Java Application nazvan´eho airflow server. Po kompilaci projektu je vytvoˇren spustiteln´ bin´arn´ı soubor typu JAR. Zp˚ usob bˇehu aplikace (server / klient) je urˇcen parametry zadan´ ymi do Java VM 12 pˇri spouˇstˇen´ı aplikace.
4.1
Server
Pro bˇeh v reˇzimu serveru je aplikace spouˇstˇena metodou main() ve tˇr´ıdˇe Server v bal´ıku y ud´av´a cestu ke airflow server.server. Metoda main() akceptuje jeden parametr, kter´ XML souboru s nastaven´ım. Pokud nen´ı zad´an ˇza´dn´ y parametr, program se ukonˇc´ı. Pokud cesta k souboru zad´ana je, n´asleduje vytvoˇren´ı instance tˇr´ıdy Server. V konstruktoru tˇr´ıdy Server je spuˇstˇeno naˇcten´ı souboru s nastaven´ım. Obsah souboru je naˇcten do objektu tˇr´ıdy JdomXml.13 Odkazy na objekty JdomXml jsou udrˇzov´any statickou tˇr´ıdou JdomInterchangeBeacon14 a kaˇzd´ y objekt v r´amci bˇeˇz´ıc´ı aplikace m˚ uˇze k tˇemto objekt˚ um pˇristupovat. V objektu JdomInterchangeBeacon jsou vˇzdy uloˇzeny dvojice n´azev a odkaz na objekt (kl´ıˇc a hodnota). Odkaz na pˇr´ısluˇsn´ y JdomXml je z´ısk´an na z´akladˇe jeho n´azvu. D´ale je spuˇstˇen mˇeˇric´ı server. Nejdˇr´ıve vytvoˇrena instance tˇr´ıdy PersistentServer.15 Tento objekt je centr´aln´ı ˇca´st´ı cel´e serverov´e aplikace. Existuje pouze v jedn´e instanci a obstar´av´a ˇcasov´an´ı komunikace s mˇeˇric´ım zaˇr´ızen´ım a zpracov´av´a poˇzadavky z klientsk´ ych aplikac´ı. PersistentServer tak´e zaˇrizuje automatick´e nastaven´ı M-Boardu. D´ale se odkaz na instanci PersistentServer vloˇz´ı do statick´e promˇenn´e tˇr´ıdy DataServerImpl.16 Pokud je v konfiguraˇcn´ım souboru serveru aktivov´an vizu´aln´ı m´od, vytvoˇr´ı se grafick´a interaktivn´ı konzole (objekt tˇr´ıdy IConsole), do kter´e se vypisuj´ı textov´e ˇretˇezce kter´e pˇrich´azej´ı z mˇeˇric´ıho zaˇr´ızen´ı a pomoc´ı konzole je tak´e moˇzn´e mˇeˇric´ımu zaˇr´ızen´ı pos´ılat pˇr´ıkazy pˇr´ımo. D´ale je vytvoˇrena instance tˇr´ıdy MySerialPortImpl17 , kter´a pomoc´ı knihovny RXTX zajiˇst’uje komunikaci se s´eriovou linkou. Podle u ´daj˚ u v konfiguraˇcn´ım souboru je nastaven n´azev portu a pˇrenosov´a rychlost. V´ ystup z CommandControlleru 18 v PersistentServeru je nasmˇerov´an na s´eriovou linku. Pˇr´ıkazy z CommandControlleru jsou odes´ıl´any po s´eriov´e lince a ˇretˇezce, kter´e s´eriov´a linka pˇrijme jsou smˇerov´any do CommandControlleru. D´ale je nastartov´an webov´ y XML-RPC server: Nejprve se vytvoˇr´ı instance webov´eho serveru WebServer19 , kter´ y pracuje na portu zadan´em v konfiguraˇcn´ım souboru. Z instance webov´eho serveru je pak z´ısk´an odkaz na objekt tˇr´ıdy XmlRpcServer, kter´emu jsou nastaveny handlery podle informac´ı v souboru MyHandlers.properties v bal´ıku airflow server/server. Na z´akladˇe instrukc´ı v tomto souboru je xmlRpcServeru pˇridˇeleno rozhran´ı DataServer a je zad´ana informace, ˇze metody tohoto rozhran´ı implementuje tˇr´ıda DataServerImpl.20 12
Java Virtual Machine: virtu´ aln´ı stroj, kter´y interpretuje kompilovan´y k´ od z bal´ıku com.msiroky.filesystem.files.xml 14 z bal´ıku com.msiroky.parallels 15 z bal´ıku airflow server.server 16 z bal´ıku airflow server.handlers 17 z bal´ıku com.msiroky.hw.serial 18 objekt, kter´ y ˇr´ıd´ı tok pˇr´ıkaz˚ u mˇeˇric´ımu zaˇr´ızen´ı a zpracov´av´a odpovˇedi, kter´e ze zaˇr´ızen´ı pˇrich´azej´ı 19 v bal´ıku org.apache.xmlrpc.webserver, z knihovny Apache XML-RPC 20 oboje v bal´ıku airflow server.handlers 13
39
PersistentServer -dynamicMemory: DynamicMemory -firstDownload: boolean -controller: CommandController -dwnTimer: DownloaderThread -mbParams: BMoardParams -serverParams: ServerParams -trigger: AutoDownloadTrigger -commLag: int +addData(data: List) +addData(fSample: TimeStampedFloatingSample) +downloadData(fromTime: Instant) +autosetMB() ... (gettery a settery pro atributy)
«Interface» DataServer +getData(String label, Date from, Date to): List +getMBParams(): Map +getServerParams(): Map +downloadMBParams(): int +downloadData(from: Date): int +downloadAllData(): int +startAutoDownload(seconds: int): int +stopAutoDownload(): int +addData(data: List): int +disableExport(interval: int): int +forceExport(): int +shutDownServer(password String): int +setMBoardTime(instant: Date): int +setMBMeasurementEnabled(enabled: boolean) +measureNow(): int +clearcommands(): int +setMBoardInterval(interval: int, delay: int): int +setMBoardCyclic(cyclic: boolean): int +autoSetMBoard(): int +deleteMBMemory(): int
DataServerImpl -persistentServer: persistentServer ... (gettery a settery pro atributy)
Obr´azek 19: Z´akladn´ı tˇr´ıdy mˇeˇric´ıho serveru UML diagramy popisovan´ ych tˇr´ıd jsou uvedeny na obr´azc´ıch 19 a 20. Princip vol´an´ı vzd´alen´ ych metod na serveru funguje na z´akladˇe faktu, ˇze rozhran´ı se signaturami metod zn´a jak server, tak klient. Metody, kter´e chceme z klienta volat musej´ı m´ıt n´avratovou hodnotu. Metody, kter´e vracej´ı void nejsou podporov´any. Pˇri vol´an´ı metody serveru z klienta je (v bˇeˇzn´em reˇzimu, kter´ y je uplatnˇen i zde) vytvoˇrena vˇzdy nov´a instance implementuj´ıc´ı tˇr´ıdy. V tomto pˇr´ıpadˇe se jedn´a o tˇr´ıdu DataServerImpl. Tak n´aslednˇe vol´a metody z v´ yˇse zm´ınˇen´eho objektu tˇr´ıdy PersistentServer. Proces odesl´an´ı v´ ysledku klientu jiˇz obstar´avaj´ı tˇr´ıdy z knihovny Apache XML-RPC. Na obr´azku 20 na stranˇe 41 jsou zn´azornˇeny tˇr´ıdy, kter´e zajiˇst’uj´ı ˇr´ızen´ı komunikace s mˇeˇric´ım zaˇr´ızen´ım a vyhodnocov´an´ı odpovˇed´ı z nˇej. Jak jiˇz bylo zm´ınˇeno v´ yˇse, komunikace mezi mˇeˇric´ı aplikac´ı a mˇeˇric´ım zaˇr´ızen´ım prob´ıh´a znakovˇe po s´eriov´e lince, pˇriˇcemˇz pˇr´ıkazy pro zaˇr´ızen´ı a odpovˇed´ı ze zaˇr´ızen´ı maj´ı formu XML element˚ u. Ovl´ad´an´ı mˇeˇric´ıho zaˇr´ızen´ı M-Board se dˇeje pˇres vol´an´ı metod ve tˇr´ıdˇe CommandController , kter´e vygeneruj´ı potˇrebn´ y textov´ y pˇr´ıkaz pro odesl´an´ı MBoardu. Vygenerovan´ y ˇretˇezec se vloˇz´ı do nov´e instance tˇr´ıdy Command, kter´a se vloˇz´ı do fronty pˇr´ıkaz˚ u v objektu tˇr´ıdy CommandQueue. Zas´ıl´an´ı pˇr´ıkaz˚ u M-Boardu je ˇr´ızeno objektem tˇr´ıdy Broadcaster, kter´ y rozˇsiˇruje tˇr´ıdu Thread. Pokud ve frontˇe jsou pˇr´ıtomn´e pˇr´ıkazy, Broadcaster odeˇsle ˇretˇezec prvn´ıho pˇr´ıkazu ve frontˇe po s´eriov´e lince. Odkaz na pˇr´ısluˇsnou instanci Commandu je vloˇzen do TimeoutWatcheru. Kdyˇz je serverem (CommandControllerem) zachycena odpovˇed’ z mˇeˇric´ıho zaˇr´ızen´ı, dojde nejprve k pˇrevodu ˇretˇezce na XML element (tˇr´ıda Element), ˇc´ımˇz je provedena i kontrola integrity pˇr´ıchoz´ı zpr´avy. Pokud pˇrijat´a odpovˇed’ koresponduje s poslednˇe odeslan´ ym pˇr´ıkazem, je pˇr´ıkaz z fronty odstranˇen, TimeoutWatcher vynulov´an a je odesl´an nov´ y pˇr´ıkaz.
40
CommandController -memory: DynamicMemory -server: PersistentServer -broadcaster: Broadcaster -uplink: incommingStringReceiver -incommingBuffer: String -outputConsole: StringReceiver -waitingForData: boolean -fromTime: Instant -downloadMode: String +addIncomming(string: String) +clearCommands() -parseAndSaveSamples(root: Element) -processIncommnagMessage() +setMeasurementInterval(interval: int, delay: int) +setCyclic(cyclic: boolean) +setAutoMeasurement(auto: boolean) +downloadData(fromTime: Instant) +downloadMBParams() +deleteSamples() +getSampleNow() ... (gettery a settery pro atributy)
Command -command: String -commnadElement: Element -maxRepeats: int +repeat(): boolean ... (gettery a settery pro atributy)
0..n commnads
CommandsQueue +showOldest(): Command +removeOldest() +addCommand(command Command) +processReceived(receivedElement) +isEmpty(): boolean +clear() +notifyBroadcaster() ... (gettery a settery pro atributy)
queue
broadcaster
Broadcaster «Interface» StringReceiver +push(string: String)
receiver
+run() ... (gettery a settery pro atributy) watcher
«Interface» TimingThreadHolder +onTimerStart() +onTimerStop()
TimeoutWatcher -command: Command -timingThread: TimingThread -commandsQueue: CommandsQueue -timeout: int -iddle: boolean +setCommand(command: Command) ... (gettery a settery pro atributy)
Obr´azek 20: Tˇr´ıdy ˇr´ıd´ıc´ı komunikaci s mˇeˇric´ım zaˇr´ızen´ım (bal´ık airflow server.server.communications)
41
Thread
Pokud vˇsak po uplynut´ı zvolen´eho ˇcasu (timeout) je ve frontˇe st´ale tent´ yˇz pˇr´ıkaz, TimeoutWatcher pˇr´ıkaz odeˇsle znovu a opakuje se ˇcek´an´ı na pˇr´ıchod odpovˇedi. Kaˇzd´ y pˇr´ıkaz m˚ uˇze m´ıt individu´alnˇe nastaven´ y poˇcet opakov´an´ı (V´ ychoz´ı nastaven´ı je 3) a pokud ani po maxim´aln´ım poˇctu opakov´an´ı nepˇrijde z mˇeˇric´ıho zaˇr´ızen´ı odpovˇed’, je fronta pˇr´ıkaz˚ u vymaz´ana. Informace o nedoruˇcitelnosti pˇr´ıkazu je uvedena v souhrnu o stavu mˇeˇric´ıho zaˇr´ızen´ı, kter´ y server m˚ uˇze klientsk´e aplikaci zas´ılat a tak´e je zaps´ana do logov´eho souboru. 4.1.1
Ovl´ ad´ an´ı mˇ eˇ ric´ıho zaˇ r´ızen´ı
Server je schopn´ y ovl´adat M-Board v tˇechto oblastech: 1. Nastaven´ı ˇcasu na mˇeˇric´ı kartˇe 2. Povolen´ı / zak´az´an´ı automatick´eho mˇeˇren´ı 3. Nastaven´ı mˇeˇric´ıho intervalu a zpoˇzdˇen´ı pˇred sejmut´ım prvn´ıho vzorku 4. Pˇrepnut´ı mezi kruhovou pamˇet´ı (kdy se nejstarˇs´ı vzorky pˇrepisuj´ı nov´ ymi) a pamˇet´ı line´arn´ı (kdy se po zaplnˇen´ı pamˇeti z´aznam ukonˇc´ı) 5. Staˇzen´ı dat od urˇcit´eho ˇcasu 6. Staˇzen´ı dat od urˇcit´eho ˇcasu s n´asledn´ ym smaz´an´ım tˇechto dat z mˇeˇric´ıho zaˇr´ızen´ı 7. Smaz´an´ı vˇsech dat ze zaˇr´ızen´ı 8. Zjiˇstˇen´ı stavu zaˇr´ızen´ı (ˇcas, poˇcet vzork˚ u v pamˇeti, nastaven´ı pamˇeti, mˇeˇric´ı interval) Pˇri stahov´an´ı dat z mˇeˇric´ıho zaˇr´ızen´ı prob´ıh´a pˇrevod zpr´avy do XML elementu po ˇc´astech (po jednotliv´ ych vzorc´ıch). V pˇr´ıpadˇe, ˇze je ˇca´st zpr´avy (vzorek) poˇskozena, vylouˇc´ı se ze zpracov´an´ı pouze tato ˇca´st, kter´a se uloˇz´ı do logov´eho souboru a zpracov´an´ı dalˇs´ıch vzork˚ u pokraˇcuje. Bliˇzˇs´ı informace o komunikaci a vyhodnocov´an´ı pˇr´ıchoz´ıch zpr´av je moˇzn´e z´ıskat prostudov´an´ım zdrojov´ ych k´od˚ u v elektronick´e pˇr´ıloze. Zdrojov´e k´ody jsou opatˇreny koment´aˇri, kter´e usnadˇ nuj´ı pochopen´ı jednotliv´ ych funkc´ı. Pro u ´ˇcely testov´an´ı serveru a klienta je zde moˇznost server spouˇstˇet v simulaˇcn´ım reˇzimu, kdy v r´amci serveru bˇeˇz´ı modelov´e mˇeˇric´ı zaˇr´ızen´ı.21 Pˇrep´ın´an´ı mezi simulaˇcn´ım a provozn´ım reˇzimem se prov´ad´ı v konfiguraˇcn´ım souboru. Konfiguraˇcn´ı soubory jsou rovnˇeˇz souˇc´ast´ı elektronick´e pˇr´ılohy.
4.2
Klient
Klient byl vytv´aˇren ve stejn´em Java projektu jako server. V budoucnu by vˇsak bylo v´ yhodnˇejˇs´ı m´ıt pro klient vyˇclenˇen´ y samostatn´ y projekt tak, aby spolu s klientem nebyly distribuov´any i tˇr´ıdy serveru. UML diagram hlavn´ıch tˇr´ıd, kter´e tvoˇr´ı klientskou aplikaci je zn´azornˇen na obr´azku 21 na stranˇe 44. Klient je spouˇstˇen metodou main() ve tˇr´ıdˇe ClientStarter.22 ClientStarter m´a obdobnou funkci, jako tˇr´ıda Server. Nejprve je naˇcten konfiguraˇcn´ı soubor a odkaz na 21 22
Modelov´e zaˇr´ızen´ı je reprezentov´ ano tˇr´ıdami z bal´ıku airflow server.server.model. v bal´ıku airflow server.client
42
nˇej je um´ıstˇen do JdomInterchangeBeacon. D´ale je vytvoˇrena ikona v notifikaˇcn´ı oblasti pracovn´ı plochy (v syst´emu Windows obvykle na prav´e stranˇe hlavn´ıho panelu). Ikona indikuje bˇeh klientsk´e aplikace a disponuje kontextov´ ym menu pro zobrazov´an´ı kontroln´ıho panelu klienta a ukonˇcov´an´ı aplikace. D´ale je vytvoˇrena instance tˇr´ıdy ControlPanelImpl, kter´a implementuje rozhran´ı kontroln´ıho panelu ControlPanel. Pouˇzit´ı rozhran´ı umoˇzn ˇuje vytv´aˇret a pouˇz´ıvat r˚ uzn´e verze vizu´aln´ı podoby panelu, pˇrizp˚ usoben´e na m´ıru konkr´etn´ım podm´ınk´am a poˇzadavk˚ um, bez nutnosti vˇetˇs´ıch z´asah˚ u do zdrojov´eho k´odu ostatn´ıch tˇr´ıd. N´aslednˇe je naˇcten zobrazovac´ı profil pro graf v dynamick´em reˇzimu. Po proveden´ı tˇechto operac´ı je vol´ana metoda run() objektu Client, ˇc´ımˇz se spust´ı automatick´a ˇca´st klientsk´e aplikace. Jak je patrn´e z diagramu 21, Client rozˇsiˇruje Thread. V tˇele pˇrekryt´e metody run() prob´ıh´a cyklus, kter´ y v intervalu specifikovan´em v konfiguraˇcn´ım souboru kontaktuje pomoc´ı protokolu XML-RPC server a z´ısk´av´a od nˇej data staˇzen´a z mˇeˇric´ıho zaˇr´ızen´ı a informace o stavu serveru a zaˇr´ızen´ı. Aby bylo moˇzn´e volat vzd´alen´e metody serveru, je nutn´e ve zdrojov´em k´odu pouˇz´ıt n´asleduj´ıc´ı ˇr´adky: //Vytvoˇ ren´ ı konfigurace s adresou serveru XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL(host + ":" + port + "/" + serviceName)); //Vytvoˇ ren´ ı a nastaven´ ı objektu client: XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); //Vytvoˇ ren´ ı napojen´ ı na server: ClientFactory factory = new ClientFactory(client); DataServer server = (DataServer) factory.newInstance(DataServer.class); Tˇr´ıdy ClientFactory a XmlRpcClient poch´az´ı z knihovny Apache XML-RPC a tˇr´ıda (rozhran´ı) DataServer byla pops´ana jiˇz dˇr´ıve. Nyn´ı m˚ uˇzeme ze zdrojov´eho k´odu volat vzd´alen´e metody serveru (definovan´e rozhran´ım DataServer) stejnˇe, jako bychom volali metody lok´aln´ı. 4.2.1
Automatick´ a komunikace se serverem
V r´amci automatick´e komunikace klienta se serverem jsou prov´adˇeny n´asleduj´ıc´ı ˇcinnosti: Z´ısk´ av´ an´ı informace o stavu serveru: Je prov´adˇeno vol´an´ım vzd´alen´e metody getServerParams(), kter´a vrac´ı objekt tˇr´ıdy java.util.Map, ve kter´em jsou uloˇzeny dvojice kl´ıˇc ; hodnota. Pˇri pˇrijet´ı objektu tˇr´ıdy Map je obsah tohoto objektu pˇreveden do instance tˇr´ıdy ServerParams. UML diagram tˇr´ıdy ServerParams se nach´az´ı na obr´azku 22. V ServerParams jsou n´asleduj´ıc´ı promˇenn´e: • overallStatus sdˇeluje, zda je server v poˇr´adku a zda bˇeˇz´ı bez chyb. • exportStatus informuje o tom, zda je povolen´e automatick´e ukl´ad´an´ı staˇzen´ ych dat do souboru, ˇci nikoliv, pˇr´ıpadnˇe zda je pouze pozastaveno • downloadInterval ud´av´a interval automatick´eho stahov´an´ı dat z MBoard v ms 43
ThreadWatchers +addSample(sample: GeneralFloatingSample) +perform() ... (gettery a settery pro atributy)
ThreadWatcher -type: ThreadWatcher:Type -watchedThread: String -description_p1: String -description_p2: String -sample: GeneralFloatingSample +perform() ... (gettery a settery pro atributy)
report
client
watchers report
0..n
Client -host: String -port: int -serviceName: String -checkInterval: long -client: XmlRpcClient -server: DataServer -lastCheckingtime: Instant -onButton: boolean -plot: MonitoringPlot -inputDataLabels: ArrayList<String> -chManager: ChartingManager -windowsForm: WindowsForm -timesOfLastReceive: HashMap -mbParams: MBoardparams -mbParamsEditor: MBParamsEditor -serverParams: ServerParams -threadWatchers: ThreadWatchers +showWindowsForm() +shutDownServer() +getMBoardParams(): MBoardParams +archiveNow() +measureNow() +delayArchivation() +showChartWindow(startDate: Date) +showMBParamsEditor() +sendDataToServer(samples: ArrayList) +autoSetMBoard() ... (gettery a settery pro atributy)
ThreadsReport -reports: ArrayList<String> -ventilation: Ventilation -timeStamp: Instant +addItem(item: String) +toString() ... (gettery a settery pro atributy)
Thread
controlPanel
«Interface» ControlPanel +setMeasurementReport(report ThreadsReport) +setClient(client: Client) +setServerparams(params: ServerParams) +displayDevicesStatus(status: String, level: Logger.Loglevel) +setVisible(isVisible: boolean) +recommendVentilation(ventilation: Ventilation) +isPopupEnabled(): boolean
Obr´azek 21: Hlavn´ı tˇr´ıdy klientsk´e aplikace
44
AirflowControlPanelImpl
• autoDownload m´a hodnotu true, pokud je automatick´e stahov´an´ı dat ze zaˇr´ızen´ı serveru povoleno, false pokud nen´ı. • serverError – Pokud komunikace se serverem funguje, m´a hodnotu false, pokud server na vol´an´ı metod neodpov´ıd´a, je true.
MBoardParams -isDummy: boolean -isSet: boolean -ticks: long -t0Str: String -t0: Instant -timeObtained: Instant -mBoardTime: Instant -cyclic: boolean -interval: int -measurementEnabled: boolean +MBoardParams(map: Map) +toHashMap(): HashMap +ticksToInstant(t0: String, additionalMs: long): Instant ... (gettery a settery pro atributy)
ServerParams -overallStatus: String -exportStatus: String -autoDownload: boolean -downloadInterval: int -serverError: boolean +ServerParams(map: Map) +toHashMap(): HashMap ... (gettery a settery pro atributy)
Obr´azek 22: Tˇr´ıdy pro reprezentaci stavu a parametr˚ u serveru a mˇeˇric´ıho zaˇr´ızen´ı
Z´ısk´ av´ an´ı informac´ı o stavu mˇ eˇ ric´ıho zaˇ r´ızen´ı: Je prov´adˇeno vol´an´ım vzd´alen´e metody getMBParams(). Informace vr´acen´e opˇet ve formˇe objektu tˇr´ıdy Map jsou pˇrevedeny do instance tˇr´ıdy MBoardParams. V klientu jsou zuˇzitkov´any a pˇr´ıpadnˇe zobrazeny n´asleduj´ıc´ı informace z MBoardParams: • Aktu´aln´ı parametry byly staˇzeny z mˇeˇric´ıho zaˇr´ızen´ı, ˇci se zat´ım jedn´a o v´ ychoz´ı hodnoty: isDummy ˇ na M-Boardu byl, nebo nebyl nastaven: isSet • Cas • Souˇcasn´ y ˇcas na M-Boardu: mBoardTime • Cyklick´a / line´arn´ı pamˇet’: cyclic • Povoleno automatick´e mˇeˇren´ı: measurementEnabled • Interval automatick´eho mˇeˇren´ı ve vteˇrin´ach: interval Stahov´ an´ı dat: Je prov´adˇeno vol´an´ım vzd´alen´e metody getData(String label, Date from, Date to), kter´a vrac´ı data s ˇcasov´ ymi znaˇckami spadaj´ıc´ımi do intervalu vymezen´eho from a to z vl´akna s dan´ ym n´azvem label. Data ze serveru jsou vr´acena jako seznam (java.utilList) objekt˚ u tˇr´ıdy Map, jejichˇz obsah je n´aslednˇe pˇreveden na seznam objekt˚ u tˇr´ıdy GeneralFloatingSample. Klient ukl´ad´a u kaˇzd´eho datov´eho vl´akna ˇcasovou znaˇcku posledn´ıho pˇrijat´eho vzorku. Tato ˇcasov´a znaˇcka je pak poˇca´tkem intervalu pro dalˇs´ı stahov´an´ı. Koncem intervalu je pak ˇcas, ve kter´em je stahov´an´ı zah´ajeno. Pokud je okno pro graf spuˇstˇeno, jsou staˇzen´a data do grafu pˇrid´ana a zobrazena. 45
4.2.2
Sledov´ an´ı hodnot a informov´ an´ı uˇ zivatele
Data jsou zpracov´av´ana pomoc´ı operac´ı v serveru. Na nastaven´ı klientsk´e aplikace vˇsak z´aleˇz´ı zp˚ usob, jak´ ym budou pˇr´ıchoz´ı hodnoty uˇzivateli prezentov´any. Moˇznost prezentace dat je dvoj´ı. Jak jiˇz bylo zm´ınˇeno, vzorky je moˇzn´e zobrazovat v grafu, nebo je moˇzn´e pouze vypisovat souhrn mˇeˇren´ı do kontroln´ıho panelu. Okno kontroln´ıho panelu je na obr´azku 23.
Obr´azek 23: Okno kontroln´ıho panelu klientsk´e aplikace bˇeˇz´ıc´ı v plask´em kl´aˇsteˇre; V horn´ı ˇca´sti okna jsou ovl´adac´ı prvky, pod nimi jsou textov´a pole se souhrnem mˇeˇren´ı, popisem stavu serveru a popisem stavu mˇeˇric´ıho zaˇr´ızen´ı. Vid´ıme, ˇze textov´e pole se souhrnem mˇeˇren´ı je zelen´e. Zelen´a barva v poli znamen´a, ˇze venkovn´ı vzduch je dostateˇcnˇe such´ y, aby se dalo vˇetrat bez rizika. Vzduch venku je vˇsak pˇr´ıliˇs studen´ y a pˇri vˇetr´an´ı by se ochlazovala horn´ı patra budovy. Z tohoto d˚ uvodu ´ vˇetr´an´ı pˇri tomto stavu prob´ıhat nebude. Uvaha o rozd´ılu teploty venku a uvnitˇr budovy ve vyˇsˇs´ıch patrech z˚ ust´av´a na obsluze, protoˇze mˇeˇric´ı zaˇr´ızen´ı nem´a z d˚ uvodu omezen´eho poˇctu vstup˚ u tato data k dispozici. Odhad teploty je vˇsak snazˇs´ı, neˇz odhad vlhkosti a tak tento nedostatek nen´ı pˇr´ıliˇs z´avaˇzn´ y. Form´at souhrnu mˇeˇren´ı a barva okna je v´ ysledkem ˇcinnosti objekt˚ u tˇr´ıdy ThreadWatcher, hromadnˇe spravovan´ ych objektem tˇr´ıdy ThreadWatchers. Vztah mezi tˇemito tˇr´ıdami m˚ uˇzeme vidˇet na UML diagramu 21 na stranˇe 44. ThreadWatchers v metodˇe perform() generuje zpr´avu o mˇeˇren´ı ThreadsReport, kter´a je pˇred´ana objektu tˇr´ıdy Client ke zobrazen´ı. Kaˇzd´a jednotka ThreadWatcher sleduje hodnotu jednoho datov´eho vl´akna zadan´eho v konfiguraˇcn´ım souboru a m˚ uˇze pracovat ve tˇrech reˇzimech: 1. Informativn´ı: Hodnota vl´akna je uvedena mezi dvˇema textov´ ymi ˇretˇezci, kter´e je moˇzn´e nastavit v konfiguraci a tento cel´ y ˇretˇezec je uloˇzen jako jedna poloˇzka zpr´avy o mˇeˇren´ı. Takov´a poloˇzka pak m˚ uˇze b´ yt napˇr. Relativn´ı vlhkost venku je 66.5 %“ ” 2. Dobr´ y alarm: Jedn´a se prim´arnˇe o sledov´an´ı v´ ystupn´ıho vl´akna z funkce typu porovn´an´ı. Pokud je watcher v tomto reˇzimu, a hodnota sledovan´eho vl´akna je 1, je do souhrnu pˇrid´ana ˇretˇezcov´a poloˇzka popisuj´ıc´ı vznikl´ y stav (napˇr. Je moˇzn´e ” 46
vˇetrat.“ a v pˇr´ısluˇsn´e instanci tˇr´ıdy ThreadsReport je nastaven doporuˇcen´ y stav vˇetr´an´ı na otevˇreno“. ” ˇ 3. Spatn´ y alarm: Funkce je obdobn´a, jen v pˇr´ıpadˇe, ˇze sledovan´a hodnota je 1, doporuˇcen´ y stav vˇetr´an´ı je nastaven na zavˇreno“. V souhrnu mˇeˇren´ı se pak v tomto ” pˇr´ıpadˇe objev´ı ˇra´dka Nevˇetrat!“. ” Pˇred kaˇzd´ ym vyhodnocen´ım datov´ ych vl´aken se ThreadsReport nuluje a doporuˇcen´e vˇetr´an´ı je nastaveno na neurˇcito“. Vyhodnocov´an´ı se spouˇst´ı centr´alnˇe pˇri pˇr´ıchodu dat, ” pˇriˇcemˇz se t´ yk´a pouze nejmladˇs´ıch vzork˚ u. Po vyhodnocen´ı je vol´ana metoda client.setMeasurementReport(report). N´aslednˇe je obsah souhrnu zobrazen v panelu. Pokud je vˇetr´an´ı moˇzn´e, je textov´e pole v ovl´adac´ım panelu zelen´e s b´ıl´ ym textem, pokud je stav nerozhodn´ y, je pole b´ıl´e s ˇcern´ ym textem a pokud je vˇetr´an´ı z hlediska vlhkosti nevhodn´e, je pole ˇcerven´e, opˇet s b´ıl´ ym textem.
5
V´ yvoj software pro M-Board
N´astroje vyuˇz´ıvan´e pro psan´ı a odlad’ov´an´ı programu pro M-Board jsou zm´ınˇeny v ˇc´asti 2.1.1. Cel´ y Eclipse projekt se zdrojov´ ymi k´ody je souˇca´st´ı elektronick´e pˇr´ılohy k t´eto pr´aci. Program pro M-Board jsem vytvoˇril ve dvou verz´ıch. Prvn´ı verze vyuˇz´ıvala pro mˇeˇren´ı a komunikaci dvˇe samostatn´e u ´lohy (tasky). Toto ˇreˇsen´ı umoˇzn ˇovalo pˇresnˇejˇs´ı ˇcasov´an´ı mˇeˇren´ı, avˇsak po nainstalov´an´ı mˇeˇric´ıho zaˇr´ızen´ı do konventu plask´eho kl´aˇstera se st´avalo, ˇze se takto vytvoˇren´ y program nedeterministicky (jen v nˇekter´ ych pˇr´ıpadech) zasek´aval pˇri zas´ıl´an´ı vzork˚ u na server. Tato chyba se objevovala nez´avisle na tom, zda bˇeˇzely obˇe dvˇe u ´lohy, ˇci zda bˇeˇzela pouze u ´loha komunikaˇcn´ı a u ´loha mˇeˇric´ı byla zruˇsena. Zm´ınˇenou chybu se podaˇrilo reprodukovat i v laboratorn´ıch podm´ınk´ach na jin´em exempl´aˇri mˇeˇric´ı karty a tak jsem zaˇr´ızen´ı z konventu odvezl zpˇet do laboratoˇre a nahr´al do nˇej program, kter´ y tasky nevyuˇz´ıv´a. V okamˇziku psan´ı tˇechto ˇr´adek zaˇr´ızen´ı s novou verz´ı programu pracuje v konventu bez probl´em˚ u jiˇz pˇres dva t´ ydny. V elektronick´e pˇr´ıloze pr´ace je tak´e p˚ uvodn´ı verze programu. Popisov´ana zde bude vˇsak pouze druh´a – funkˇcn´ı – verze. Rozd´ıl se t´ yk´a vˇsak jen ˇr´ızen´ı bˇehu programu, ne uchov´av´an´ı namˇeˇren´ ych dat, samotn´eho procesu mˇeˇren´ı, ˇci komunikace.
5.1
Uchov´ av´ an´ı dat v operaˇ cn´ı pamˇ eti
Funkce pro spr´avu vzork˚ u jsou v souboru msring.c s hlaviˇckov´ ym souborem msring.h. Data z´ıskan´a pˇri jednom mˇeˇren´ı jsou uchov´av´ana ve struktuˇre data: typedef struct data { unsigned long int ticks; int ch1; int ch2; int ch3; int ch4; } DATA;
47
Poloˇzka ticks slouˇz´ı k ukl´ad´an´ı strojov´eho ˇcasu, ve kter´em bylo mˇeˇren´ı provedeno. D´ale jsou zde ˇctyˇri poloˇzky pro samotn´e namˇeˇren´e hodnoty. Tato data jsou n´aslednˇe uchov´av´ana ve struktuˇre msring: typedef struct msring { int cycle; int over_the_top; int write_index; int oldest; int newest; int size; DATA **p_data; } MSRING; Poloˇzka p data je polem struktur data. Poloˇzka cycle ud´av´a, zda je dan´a struktura pamˇet´ı kruhovou (cycle != 0), nebo line´arn´ı (cycle == 0). T´eto vlastnosti se t´ yk´a ’ i poloˇzka over the top, kter´a nab´ yv´a nenulov´e hodnoty, pokud je pamˇet kruhov´a a bylo uloˇzeno jiˇz tolik vzork˚ u, ˇze doch´az´ı k ukl´ad´an´ı nov´ ych vzork˚ u m´ısto vzork˚ u nejstarˇs´ıch. Poloˇzka oldest uchov´av´a index nejstarˇs´ıho vzorku, newest pak index vzorku ˇ ıslo size pak vyjadˇruje alokovanou velikost pole ukazatel˚ nejnovˇejˇs´ıho. C´ u na vzorky. V souboru msring.h se nach´azej´ı signatury n´asleduj´ıc´ıch funkc´ı: • MSRING *createmsring(int size): Vytvoˇr´ı pamˇet’ na size vzork˚ u • void printmsring(MSRING *p msring, long unsigned int fromTicks): Spust´ı v´ ypis dat z´ıskan´ ych po ˇcase fromTicks na s´eriovou linku ˇci jin´ y definovan´ y v´ ystup. • DATA *create data(unsigned long int ticks, float ch1, float ch2, float ch3, float ch4): Alokuje pamˇet’ pro nov´ y vzorek a uloˇz´ı do nˇej ˇcas a mˇeˇren´e hodnoty. V aplikaci prob´ıh´a mˇeˇren´ı napˇet´ı ze 4 vstup˚ u ve voltech reprezentovan´ ych jako desetinn´a ˇc´ısla. Po uloˇzen´ı do vzorku jsou tyto hodnoty vyn´asobeny 1000 a jsou pˇrevedeny na cel´a ˇc´ısla, tedy milivolty. • int freedata(DATA **p data): Vymaˇze vzorek (uvoln´ı pamˇet’). • void printdata(DATA *p data): Vyp´ıˇse vzorek na definovan´ y v´ ystup. • int add(MSRING *p msring, DATA *p data): Vloˇz´ı ukazatel na vzorek do pole ve struktuˇre msring. Vnitˇrnˇe se zohledˇ nuje cykliˇcnost, nebo linearita pamˇeti. Pˇri pˇrepisu je uvolˇ nov´ana pamˇet’ zab´ıran´a star´ ymi vzorky. • int is empty(MSRING *p msring): Vrac´ı 1, pokud je pamˇet’ pr´azdn´a, 0 pokud obsahuje alespoˇ n jeden vzorek.
5.2
ˇ ızen´ı bˇ R´ ehu programu
Hlavn´ım zdrojov´ ym souborem programu je newsdk test.c. V tomto souboru se nach´az´ı funkce main(). Ve funkci main() nejprve probˇehne vytvoˇren´ı pamˇeti na 115 vzork˚ u.23 23
Na pouˇzit´e kartˇe ˇc´ıslo 8 se podaˇrilo alokovat a vyuˇz´ıt pamˇet’ pro pˇribliˇznˇe 120 vzork˚ u. Alokov´ an´ı pamˇeti se t´ yk´ a jen vytvoˇren´ı m´ısta na pole pointer˚ u na vzorky. Pamˇet’ pro jednotliv´e vzorky je alokov´ ana aˇz pˇri jejich vytv´ aˇren´ı.
48
D´ale je otevˇrena s´eriov´a linka (nastaven´ı bud’ na RS232, nebo na ZigBee) a nastavena pˇrenosov´a rychlost a timeout. N´aslednˇe je na s´eriovou linku vyps´an ˇretˇezec a je vol´ana funkce cycle(). Ve funkci cycle() je nekoneˇcn´a smyˇcka, kterou program mˇeˇric´ı karty neust´ale vykon´av´a. Smyˇcka se skl´ad´a ze dvou ˇc´ast´ı: 1. Komunikaˇcn´ı ˇca´st: Kontroluje, zda pˇres s´eriovou linku nepˇriˇsel nˇejak´ y pˇr´ıkaz. Pokud ano, je vykon´am. 2. Mˇeˇric´ı ˇc´ast: Kontroluje, zda v dan´em ˇcase (podle tik˚ u procesoru) m´a b´ yt provedeno mˇeˇren´ı. Pokud ano, mˇeˇren´ı se provede a vzorek uloˇz´ı.
5.3
Mˇ eˇ ren´ı
Samotn´e mˇeˇren´ı prov´ad´ı funkce take sample(). Tˇelo t´eto funkce vypad´a n´asledovnˇe: void take_sample(void) { float data1, data2, data3, data4; BOOL singleEnded = TRUE; data1 = adRead(adcDev, singleEnded, 6); //mˇ er ˇen´ ı z data2 = adRead(adcDev, singleEnded, 7); //mˇ er ˇen´ ı z data3 = adRead(adcDev, singleEnded, 4); //mˇ er ˇen´ ı z data4 = adRead(adcDev, singleEnded, 2); //mˇ er ˇen´ ı z DATA *p_data; //Vytvoˇ ren´ ı vzorku a line´ arn´ ı korekce hodnot na z´ akladˇ e kalibrace napˇ et’ov´ ych vstup˚ u: p_data = create_data(rtcGetTime(), (data1 * 2.4926 * 2.4957 + 0.0843), (data3 * 0.5029 + 0.0018), if (p_data == NULL) { } else {add(p_msring, p_data);}
kan´ alu kan´ alu kan´ alu kan´ alu
6 7 4 2
+ 0.0399), (data2 (data4 * 0.5015));
}
5.4
Komunikace
Jak jiˇz bylo zm´ınˇeno v´ yˇse, komunikaˇcn´ı ˇca´st ˇcte ˇretˇezce, kter´e pˇrijdou pˇres s´eriovou linku. ˇ Cte se 120 znak˚ u z linky a ukl´adaj´ı se do znakov´eho bufferu n´asleduj´ıc´ım vol´an´ım knihovn´ı funkce: read(hSerial, (void*) buffer, 120). D´ale je porovn´av´an zaˇc´atek ˇretˇezce v bufferu s moˇzn´ ymi pˇr´ıkazov´ ymi ˇretˇezci, na kter´e je M-Board schopen reagovat. Zpracov´an´ı pˇr´ıkazu si uk´aˇzeme na pˇr´ıkladu nastaven´ı ˇcasu mˇeˇric´ıho zaˇr´ızen´ı. M-Board nem´a obvod re´aln´eho ˇcasu,24 pouze naˇc´ıt´a tiky krystalu na kartˇe, kter´e ubˇehly od spuˇstˇen´ı programu, pˇr´ıpadnˇe od vynulov´an´ı ˇc´ıtaˇce rtc.25 Nastaven´ı z´akladn´ıho ˇcasu, od kter´eho se budou poˇc´ıtat tiky ukl´adan´e jako ˇcasov´e znaˇcky vzork˚ u spoˇc´ıv´a v tom, ˇze v pˇr´ıkazu pro nastaven´ı ˇcasu je ve formˇe ˇretˇezce uloˇzena ˇcasov´a znaˇcka ve form´atu YY.MM.DD HH.MM.SS, kter´a se vztahuje k ˇcasu, ve kter´em byl 24
Takov´ y, kter´ y by udrˇzoval a aktualizoval informace o kalend´aˇrn´ım datu a ˇcasu i kdyˇz je zaˇr´ızen´ı odpojen´e od nap´ ajen´ı 25 Real Time Counter
49
ˇ ezec se uloˇz´ı do znakov´eho bufferu timestamp, vynuluje tento pˇr´ıkaz ze serveru odesl´an. Retˇ se hodnota rtc a vymaˇze se pamˇet’ se vzorky. Maz´an´ı se prov´ad´ı proto, ˇze ˇcasov´e znaˇcky u vzork˚ u pˇrestanou b´ yt po vynulov´an´ı rtc platn´e. Proto server pˇri nastavov´an´ı ˇcasu na mˇeˇric´ım zaˇr´ızen´ı nejprve st´ahne vˇsechny nestaˇzen´e vzorky a teprve pro pˇrijet´ı tˇechto dat je provedeno nastaven´ı ˇcasu. Pˇri tomto procesu je nutn´e br´at v u ´vahu komunikaˇcn´ı zpoˇzdˇen´ı. Vzhledem k povaze mˇeˇric´ı u ´lohy ˇreˇsen´e v t´eto pr´aci ale nehraje zpoˇzdˇen´ı26 tak velkou roli. Nastaven´ı ˇcasu je indikov´ano hodnotou promˇenn´e isSet = 1. V´ yˇse popsan´a ˇca´st zdrojov´eho k´odu je uvedena zde: else if (strncmp(buffer, "<st t=", 6) == 0) { rtcSetTime((long unsigned int) 0); // Vynulov´ an´ ı rtc for (int it = 0; it < 17; it++) { // Pˇ rekop´ ırov´ an´ ı c ˇasov´ e znaˇ cky timestamp[it] = buffer[7 + it]; } make_empty(p_msring); // Vymaz´ an´ ı pamˇ eti n = sprintf(buffer, "<st r=\"ok\" t=\"%s\"/>\n", timestamp); write(hSerial, buffer, n); // Odesl´ an´ ı odpovˇ edi "<st r="ok" t="CASOVA_ZNACKA"/>" serveru isSet = 1; }
5.5
Zas´ıl´ an´ı dat
Vzhledem k tomu, ˇze pˇri testech s bezdr´atov´ ym pˇrenosem dat27 pˇres ZigBee doch´azelo pˇri odes´ıl´an´ı vˇetˇs´ıho poˇctu vzork˚ u k poˇskozov´an´ı zpr´avy, kter´e se projevovalo z´amˇenou poˇrad´ı nˇekter´ ych znak˚ u, bylo nutn´e vytvoˇrit bezpeˇcnostn´ı opatˇren´ı, kter´e spoˇc´ıv´a v ˇcek´an´ı mezi odes´ıl´an´ım blok˚ u vzork˚ u. V kaˇzd´em bloku je 5 vzork˚ u a karta mezi odes´ıl´an´ım blok˚ u ˇcek´a 400 milisekund. Skuteˇcnost ˇze toto opatˇren´ı je funkˇcn´ı ukazuje, ˇze zdroj tˇechto poruch se pravdˇepodobnˇe nach´az´ı v komunikaci mezi kartou a ZigBee modulem. Pˇri slabˇs´ım sign´alu nen´ı patrnˇe modul schopen odes´ılat znaky tak rychle, jak jsou z karty do modulu zapisov´any a doch´az´ı k pˇreteˇcen´ı bufferu v modulu. Toto je vˇsak moje vlastn´ı spekulace. Bliˇzˇs´ı informace o fungov´an´ı programu pro M-Board lze z´ıskat prostudov´an´ım zm´ınˇen´ ych zdrojov´ ych k´od˚ u, kter´e jsou opatˇreny koment´aˇri.
6
Pˇ r´ıprava hardware
Tato ˇca´st se bude vˇenovat pˇr´ıpravˇe a seˇr´ızen´ı jednotliv´ ych hardwarov´ ych souˇc´ast´ı mˇeˇric´ıho syst´emu.
6.1
´ Uprava mˇ eˇ ric´ı karty
Popis souˇc´ast´ı karty na obr´azc´ıch uveden´ ych n´ıˇze vych´az´ı z diplomov´e pr´ace pana Ing. Ondˇreje Jeˇzka (viz [3]). Nˇekter´e parametry vyroben´ ych zaˇr´ızen´ı M-Board se vˇsak od 26
Pˇri testech v budovˇe konventu bylo zjiˇstˇeno, ˇze zpoˇzdˇen´ı zp˚ usoben´e odbavov´an´ım dat je nejv´ yˇse 20 vteˇrin. 27 Pˇri komunikaci pˇres RS232 se tato chyba neobjevuje
50
specifikac´ı uveden´ ych v [3] liˇs´ı. V t´eto pr´aci uv´ad´ım aktu´aln´ı stav konkr´etn´ı desky MBoard ˇc´ıslo 8. Aby bylo moˇzn´e pouˇzit exempl´aˇr ˇc´ıslo 8 karty M-Board, bylo nutn´e na t´eto kartˇe prov´est n´asleduj´ıc´ı u ´pravy elektrick´ ych obvod˚ u: 1. Pˇ rip´ ajet nulov´ y odpor na m´ısto, kter´e je zn´azornˇeno na obr´azku 24 na stranˇe 51. Tato u ´prava je nutn´a ke zprovoznˇen´ı mˇeˇren´ı z AD pˇrevodn´ıku karty. (Provedl jsem na z´akladˇe konzultace s Ing. Tom´aˇsem Pern´ ym.) 2. Pˇ rep´ ajet nulov´ y odpor v oblasti zn´azornˇen´e na obr´azku 25 na stranˇe 52. Na zvˇetˇsen´em obr´azku je vidˇet propojuj´ıc´ı nulov´ y odpor spr´avnˇe pˇrip´ajen´ y na prav´e stranˇe ohraniˇcuj´ıc´ıho ˇctverce. Pokud by toto propojen´ı bylo na lev´e stranˇe ohraniˇcuj´ıc´ıho ˇctverce, na vstupn´ım kan´alu 2 by byl mˇeˇren termoˇcl´anek, a ne potˇrebn´ y napˇet’ov´ y vstup. Zde se nejedn´a o chybu, ale o zmˇenu nastaven´ı karty. (Provedl jsem na z´akladˇe konzultace s Ing. Ondˇrejem Jeˇzkem.) 3. D´ale bylo nutn´e vymˇenit souˇc´astku v obvodu AD pˇrevodn´ıku pro kan´al 4. Pˇri testech, kter´e jsem prov´adˇel, ukazoval pˇrevodn´ık i pˇri pˇripojen´ı minim´aln´ıho napˇet´ı hodnotu odpov´ıdaj´ıc´ı horn´ı hranici jeho rozsahu. Zdroj t´eto chyby nalezl a opravil Ing. Ondˇrej Jeˇzek. Chyba byla zp˚ usobena pˇri v´ yrobˇe t´eto konkr´etn´ı karty z´amˇenou odporu za kondenz´ator. Pˇri t´eto pˇr´ıleˇzitosti tak´e Ing. Jeˇzek nastavil rozsah AD pˇrevodn´ık˚ u na hodnoty vhodn´e pro spolupr´aci s pouˇzit´ ymi ˇcidly. Velikosti rozsah˚ u jsou uvedeny u obr´azku 24.
(a) Celkov´ y pohled
(b) Pˇrip´ajen´ y nulov´ y odpor
Obr´azek 24: M-Board ze strany oznaˇcen´e na desce ploˇsn´ ych spoj˚ u jako BOTTOM. Vstupn´ı rozsah kan´al˚ u 4 a 2 je 0 aˇz 1V. Pro kan´aly 6 a 7 je rozsah 0 aˇz 5V
51
(a) Celkov´ y pohled
(b) Pˇrep´ajen´ y nulov´ y odpor
Obr´azek 25: M-Board ze strany oznaˇcen´e na desce ploˇsn´ ych spoj˚ u jako TOP
6.2
Zapojen´ı a nap´ ajen´ı ˇ cidel
Pro mˇeˇren´ı teploty a vlhkosti byla pouˇzita dvˇe ˇcidla Humirel HTM1735. Tato ˇcidla ˇ byla pouˇzita jiˇz pˇri pˇredchoz´ı bakal´aˇrsk´e pr´aci, kde se osvˇedˇcila. Cidla vyˇzaduj´ı nap´ajen´ı napˇet´ım v rozsahu 4.75 aˇz 5.25 V. Odbˇer je v ˇr´adech mA. Na velikosti vstupn´ıho napˇet´ı z´avis´ı i velikost napˇet´ı v´ ystupn´ıho. Pro mˇeˇren´ı nap´ajec´ıho napˇet´ı ˇcidel vˇsak jiˇz nebyl na 28 kartˇe voln´ y vstup. Proto bylo nutn´e pouˇz´ıt takov´ y stejnosmˇern´ y zdroj, jehoˇz napˇet´ı nebude kol´ısat. Zakoupil jsem zdroj s nomin´aln´ım v´ ystupn´ım napˇet´ım 5V pro odbˇer aˇz 1.2A. Pˇri mˇeˇren´ı se uk´azalo, ˇze i pˇri odbˇeru 0.2A je napˇet´ı na zdroji 5.36V. Proto byla na z´akladˇe rady od Ing. Jeˇzka do obvodu um´ıstˇena Schottkyho dioda, kter´a napˇet´ı pˇri t´eto z´atˇeˇzi sniˇzuje na 4.92 V. S vyhled´an´ım diody se spr´avn´ ymi parametry v z´asob´ach souˇc´astek v laboratoˇri UL509 mi pomohl Ing. Libor Jel´ınek Ph.D., kter´ y m´a vybaven´ı t´eto laboratoˇre na starosti. Na obr´azku 26 je zn´azornˇeno zapojen´ı jednoho ˇcidla HTM1735 a zapojen´ı nap´ajen´ı karty. Ze stejn´eho zdroje je pˇres USB konektor nap´ajena i mˇeˇric´ı karta. USB konektor pro nap´ajen´ı byl zvolen z toho d˚ uvodu, ˇze t´ımto zp˚ usobem je moˇzn´e kartu nap´ajet i zm´ınˇen´ ym napˇet´ım 4.92V, coˇz bylo zjiˇstˇeno na z´akladˇe konzultace s Ing. Jeˇzkem. Zem zdroje, karty a ˇcidel je propojen´a. Kol´ıs´an´ı napˇet´ı se projevuje v ˇra´du max 0.01V, coˇz je velmi uspokojiv´a hodnota. • Napˇet´ı na termistoru venkovn´ıho ˇcidla je mˇeˇreno na kan´alu 4. • Napˇet´ı na termistoru vnitˇrn´ıho ˇcidla je mˇeˇreno na kan´alu 2. • Napˇet´ı na venkovn´ım ˇcidle relativn´ı vlhkosti je mˇeˇreno na kan´alu 6. • Napˇet´ı na vnitˇrn´ım ˇcidle relativn´ı vlhkosti je mˇeˇreno na kan´alu 7. 28
Karta m˚ uˇze mˇeˇrit vlastn´ı nap´ ajec´ı napˇet´ı. Podle Ing. Jeˇzka je ale tato funkce nepˇresn´a.
52
Mˇeˇric´ı kartu a ˇcidla jsem vybavil ˇctyˇrpinov´ ymi nez´amˇenn´ ymi konektory, kter´e usnadˇ nuj´ı pˇripojov´an´ı a odpojov´an´ı ˇcidel. Prodluˇzovac´ı vodiˇce, kter´ ymi jsou pˇripojena ˇcidla v konventu jsou vybaveny takt´eˇz tˇemito konektory. Stejn´ ym zp˚ usobem je pˇripojov´ano i nap´ajen´ı cel´eho mˇeˇric´ıho syst´emu.
Obr´azek 26: Sch´ema pˇripojen´ı modulu. 1 – NTC: v´ yvod z jedn´e svorky termistoru; druh´a svorka termistoru je napojena na zem (GND); 2 – GND: zem modulu; 3 – Vcc: svorka pro nap´ajen´ı vlhkostn´ıho ˇcidla; 4 – Vout: svorka v´ ystupu vlhkostn´ıho ˇcidla; 5 – 220kΩ rezistor; 6 – napˇet´ı na termistoru; 7 – nap´ajec´ı napˇet´ı obvodu s rezistorem (5) a termistorem; 8 – v´ ystupn´ı napˇet´ı odpov´ıdaj´ıc´ı relativn´ı vlhkosti; 9 – nap´ajec´ı napˇet´ı vlhkostn´ıho ˇcidla
6.3
Nastaven´ı modul˚ u bezdr´ atov´ e komunikace
Pro zajiˇstˇen´ı bezdr´atov´e komunikace mezi PC a M-Boardem je nutn´e spr´avnˇe nastavit bezdr´atov´e ZigBee moduly. Vzhledem k tomu, ˇze v naˇsem pˇr´ıpadˇe budou mezi sebou komunikovat pouze dva moduly, bude nastaven´ı pomˇernˇe snadn´e. Nejprve nainstalujeme ovladaˇce adapt´eru mezi USB a ZigBee modulem (XBeeU). Ovladaˇce je moˇzn´e st´ahnout z adresy zm´ınˇen´e v ˇc´asti 2.2.2. Program pro automatickou instalaci ovladaˇc˚ u je tak´e souˇc´ast´ı elektronick´e pˇr´ılohy t´eto pr´ace. Po nainstalov´an´ı ovladaˇc˚ u pˇripoj´ıme adapt´er s jedn´ım ZibBee modulem k PC. Tento prvn´ı modul nastav´ıme jako koncov´e zaˇr´ızen´ı / router. Pro nastavov´an´ı modul˚ u vyuˇzijeme aplikaci X-CTU (zm´ınˇenou rovnˇeˇz v ˇc´asti 2.2.2). Dokumentace k X-CTU od jej´ıho v´ yrobce je souˇc´ast´ı elektronick´e pˇr´ılohy. Nainstalujeme a spust´ıme aplikaci X-CTU. Objev´ı se okno se ˇctyˇrmi z´aloˇzkami. Prvn´ı z nich je nazvan´a PC Settings. Zde vybereme COM port, na kter´em je pˇripojen´ y adapt´er a nastav´ıme pˇrenosovou rychlost (standardnˇe 9600 bit/s). Pˇrejdeme na z´aloˇzku Modem Configuration (zn´azornˇeno na obr´azku 27 na stranˇe 55) a zm´aˇckneme tlaˇc´ıtko Read. Naˇcte se souˇcasn´e nastaven´ı ZigBee modulu. V seznamu nadepsan´em Modems vybereme poloˇzkuXB24-ZB a v seznamu Function Set pak poloˇzku ZIGBEE ROUTER AT. V seznamu Version vybereme nejvyˇsˇs´ı ˇc´ıslo (nejnovˇejˇs´ı verzi firmware). Pod tˇemito ovl´adac´ımi prvky se nach´az´ı pole pro nastaven´ı parametr˚ u modulu. 53
1. PAN ID nastav´ıme na 234.
29
2. BaudRate nastav´ıme na 4800 bit/s 3. Node Identifier nastav´ıme na MB“ (jako M-Board) ” Stiskneme tlaˇc´ıtko Write. Nastaven´ı se zap´ıˇse do ZigBee modulu. Je tak´e dobr´e proveden´e nastaven´ı uloˇzit do poˇc´ıtaˇce tlaˇc´ıtkem Save. Nastaven´ı (profil) je tak moˇzn´e znovu pouˇz´ıt. V elektronick´e pˇr´ıloze jsou pˇrednastaven´e profily pro oba pouˇzit´e ZigBee moduly. Nyn´ı odpoj´ıme adapt´er od PC, vyjmeme ZigBee modul a pˇripoj´ıme jej k M-Boardu. Do adapt´eru d´ame druh´ y modul a adapt´er pˇripoj´ıme k PC. Opakujeme postup s naˇcten´ım nastaven´ı tlaˇc´ıtkem Read. V seznamu nadepsan´em Modems vybereme poloˇzkuXB24-ZB a v seznamu Function Set pak poloˇzku ZIGBEE COORDINATOR AT. V seznamu Version vybereme nejvyˇsˇs´ı ˇc´ıslo (nejnovˇejˇs´ı verzi firmware). 1. PAN ID nastav´ıme na 234. 2. BaudRate nastav´ıme na 4800 bit/s 3. Node Identifier nastav´ıme na PC“ ” Nastaven´ı opˇet nech´ame zapsat do modulu tlaˇc´ıtkem Write. Pˇrepneme se do z´aloˇzky PC Settings, kde nastav´ıme novou pˇrenosovou rychlost 480 bit/s. Nyn´ı se pˇredpokl´ad´a se, ˇze je M-Board pˇripojen k nap´ajen´ı oba moduly mohou nav´azat bezdr´atov´e spojen´ı. V X-CTU pˇrejdeme na z´aloˇzku Terminal. Do termin´alov´eho okna nap´ıˇseme +++, znaky by mˇely b´ yt automaticky odesl´any do modulu v adapt´eru a pˇrepnout jej do pˇr´ıkazov´eho m´odu. V termin´alu by mˇela b´ yt vidˇet odpovˇed’ modulu OK. Potom do Pˇeti vteˇrin nap´ıˇseme ATNDMB a potvrd´ıme Enterem. Odpovˇed’ modulu by mˇela b´ yt opˇet OK. Pokud ano, nap´ıˇseme do termin´alu jeˇstˇe pˇr´ıkaz ATWR a opˇet Enter. T´ım je nastaven´ı uloˇzeno do nevolatiln´ı pamˇeti modulu. Nyn´ı m´ame malou ZigBee s´ıt’.
6.4
Kalibrace ˇ cidel
Hodnota napˇet´ı mˇeˇren´a na ˇcidlech je pˇrev´adˇena na teplotu a relativn´ı vlhkost na z´akladˇe vzorc˚ u odvozen´ ych z katalogov´eho listu ˇcidel a uveden´ ych v bakal´aˇrsk´e pr´aci. Po dvou letech nepouˇz´ıv´an´ı vˇsak ˇcidla jevila m´ırnou zmˇenu parametr˚ u, kter´a se projevovala nadhodnocen´ım mˇeˇren´e teploty o cca 5◦ C a podhodnocen´ım relativn´ı vlhkosti o cca 5%. V´ ysledky z ˇcidel byly konfrontov´any s dom´ac´ı meteostanic´ı, dataloggerem Microlog v majetku NKP Kl´aˇster Plasy a meteorologick´ ym mˇeˇren´ım na str´ank´ach Wolfram Alpha.30 Korekce hodnot z ˇcidel na spr´avn´e hodnoty je prov´adˇena v serverov´e ˇc´asti mˇeˇric´ı aplikace. Z´aznamy z kalibrace a konfiguraˇcn´ı soubor serveru se zadan´ ymi v´ ypoˇcty jsou souˇc´ast´ı elektronick´e pˇr´ılohy.
6.5
Drˇ z´ ak a kryt venkovn´ıho ˇ cidla
Jako vhodn´e m´ısto pro uchycen´ı venkovn´ıho ˇcidla byl vybr´an st´avaj´ıc´ı stojan meteostanice na rajsk´em dvoˇre konventu. Vˇsechna venkovn´ı zaˇr´ızen´ı jsou tak pohromadˇe. Pˇri sek´an´ı 29 30
M˚ uˇze b´ yt i jin´e ˇc´ıslo. Mus´ı ale b´ yt na obou modulech nastaven´e stejnˇe. adresa www.wolframalpha.com a zadan´e dotazy relative humidity in plasy“ a temperature in plasy“ ” ”
54
Obr´azek 27: Okno programu X-CTU a aktivn´ı z´aloˇzkou Modem Configuration na operaˇcn´ım syst´emu Windows XP tr´avy na dvoˇre tak person´al mus´ı d´avat pozor jak na jeden stojan a kabely, kter´e vedou jedn´ım smˇerem.31 Relativnˇe n´ızk´a vzd´alenost ˇcidla od zemˇe nen´ı na ˇskodu mˇeˇren´ı. Aby bylo ˇcidlo chr´anˇeno pˇred povˇetrnostn´ımi vlivy, vyrobil jsem pro nˇej kryt, tentokr´at ze dvou b´ıl´ ych plastov´ ych kvˇetin´aˇc˚ u32 Kryt je ke stojanu meteostanice uchycen konstrukc´ı ze dˇrevˇen´ ych ˇspal´ık˚ u a kovov´eho profilu ve tvaru L. Kryt s drˇza´kem je zn´azornˇen na obr´azku 28 na stranˇe 56. V konstrukci jsou pouˇzity ˇsrouby M5 d´elky 50mm. Po obvodu menˇs´ıho (vnitˇrn´ıho) kvˇetin´aˇce jsou vyvrt´any otvory pro proudˇen´ı vzduchu. Vetˇs´ı kvˇetin´aˇc je zajiˇstˇen dr´atem proti odfouknut´ı vˇetrem. V dobˇe psan´ı t´eto pr´ace kryt u ´spˇeˇsnˇe ochr´anil ˇcidlo jiˇz bˇehem dvou siln´ ych bouˇrek. Podrobn´a fotografick´a dokumentace konstrukce je v elektronick´e pˇr´ıloze.
7 7.1
Instalace mˇ eˇ ric´ıho syst´ emu Instalace hardware
Mˇeˇr´ıc´ı syst´em byl do konventu nainstalov´an 23. dubna 2010. Bˇehem zkuˇsebn´ıho provozu se ale projevovala chyba v komunikaci popsan´a v ˇc´asti 5. Mˇeˇric´ı syst´em byl proto z konventu odmontov´an, pˇreprogramov´an a v sobotu 1. kvˇetna do konventu opˇet vr´acen. V prvn´ım 31
Je pl´ anov´ ano zakop´ an´ı kabel˚ u patˇr´ıc´ıch k meteostanici i k ˇcidlu poradn´ıho syst´emu cca 5 cm pod zem. 32 Pˇri mˇeˇren´ı bˇehem bakal´ aˇrsk´e pr´ ace byly vyuˇzity jogurtov´e kel´ımky.
55
Obr´azek 28: Kryt a drˇza´k venkovn´ıho ˇcidla. Rozmˇery jsou znaˇceny v mm. t´ ydnu provozu se objevily chyby v komunikaci mezi PC a M-Boardem zp˚ usoben´e ˇspatn´ ym pˇr´ıjmem sign´alu. Tento probl´em byl vyˇreˇsen posunut´ım ant´eny u M-Boardu na okenn´ı ˇr´ımse.33 a instalac´ı vylepˇsen´e serverov´e aplikace (viz 7.2). M-Board je um´ıstˇen v ochrann´e plastov´e krabici nabarven´e z estetick´ ych d˚ uvod˚ u na b´ılo. Na povrchu krabice je kol´ık, pod kter´ ym je resetovac´ı tlaˇc´ıtko karty. Stisknut´ım kol´ıku se M-Board resetuje, tj. zapomene nastaven´ı a namˇeˇren´a data, ne mˇeˇric´ı program. Na krabici kastel´an kl´aˇstera, Mgr. Pavel Duchoˇ n um´ıstil popisek, kter´ y n´avˇstˇevn´ık˚ um sdˇeluje, jak´ y je smysl tohoto vybaven´ı. Vnˇejˇs´ı ˇcidlo je um´ıstˇeno v krytu na stojanu meteostanice, vnitˇrn´ı ˇcidlo je spuˇstˇeno vzduˇsn´ıkovou ˇstˇerbinou pod oknem pod schodiˇstˇe a vis´ı na kabelu cca 2.5m nad podlahou u jiˇzn´ıho vodn´ıho zrcadla. K propojen´ı ˇcidel s M-Boardem byl vyuˇzit kabel vˇenovan´ y ˇ ak – SPELEO. Jedn´a se o pˇetiˇzilov´ firmou Josef Reh´ y (vyuˇz´ıv´any jsou ale pouze 4) st´ınˇen´ y kabel, konstrukˇcnˇe podobn´ y USB kabelu. Kabel k vnˇejˇs´ımu ˇcidlu m´a d´elku cca 10m, k vnitˇrn´ımu pak cca 4m. 33
Posun o cca 0.5m k severov´ ychodu – z vnˇejˇs´ı strany okna smˇerem vlevo
56
(a) Stojan meteostanice
(b) M-Board v krytu
Obr´azek 29: Kryt vnˇejˇs´ıho ˇcidla uchycen na stojanu meteostanice firmy Josef Reh´ak – SPELEO a kryt mˇeˇric´ı karty um´ıstˇen´e u jiˇzn´ıho schodiˇstˇe. Na krytu je logo projektu (Airflow ) a loga univerzity, katedry, kl´aˇstera a pam´atkov´eho u ´stavu. Na prav´e stranˇe krabice s mˇeˇric´ı kartou je ve spodn´ı polovinˇe patrn´ y v´ yvod resetovac´ıho tlaˇc´ıtka. Ke kastel´anovu PC v kancel´aˇri spr´avy objektu je pˇripojen adapt´er XBeeU s XBee modulem nastaven´ ym jako koordin´ator. Adapt´er s modulem je um´ıstˇen na skˇr´ıni v polovinˇe severoz´apadn´ı stˇeny kancel´aˇre. Adapt´er je k PC pˇripojen pomoc´ı 5 m dlouh´e aktivn´ı USB prodluˇzovaˇcky (s repeaterem) a cca 1.2 m dlouh´eho kabelu slouˇz´ıc´ıho tak´e jako redukce z konektoru USB A na USB B. Pˇred pˇripojen´ım adapt´eru k PC byly nainstalov´any ovladaˇce adapt´eru.
7.2
Instalace software
Pro bˇeh mˇeˇric´ı aplikace je nutn´e, aby na PC byl nainstalov´an Java Runtime Environment. Na nˇekter´ ych stoj´ıch (jako kastel´an˚ uv sluˇzebn´ı) b´ yv´a jiˇz nainstalov´an, v opaˇcn´em pˇr´ıpadˇe je moˇzn´e instalaci st´ahnout z http://www.java.com. (Nyn´ı budeme pˇredpokl´adat, ˇze Java Runtime Environment je nainstalov´an v adres´aˇri C:\Program\Files\Java\jre1.6.0. Po instalaci Javy nakop´ırujeme do sloˇzky jre1.6.0\bin soubory rxtxParallel.dll (tento jen pro u ´plnost) a rxtxSerial.dll (tento nezbytnˇe) z knihovny RXTX.34 Tyto DLL knihovny umoˇzn´ı virtu´aln´ımu stroji Java pˇristupovat k paraleln´ı a hlavnˇ e s´ eriov´ e lince. N´aslednˇe vezmeme sestaven´ y netBeans projekt mˇeˇric´ı aplikace a nakop´ırujeme jej 35 do libovoln´e sloˇzky. V t´eto sloˇzce tedy bude soubor airflow server.jar a potom sloˇzka lib, ve kter´e se nach´azej´ı dalˇs´ı JAR knihovny tˇret´ıch stran zm´ınˇen´e na zaˇca´tku pr´ace a knihovna libdev. D´ale v t´eto sloˇzce vytvoˇr´ıme podsloˇzku airflow client, ve kter´e budou um´ıstˇeny konfiguraˇcn´ı soubory klienta a airflow server pro konfiguraˇcn´ı soubory serveru. D´ale vytvoˇr´ıme podsloˇzku export pro archivaci dat a grafy pro ukl´ad´an´ı graf˚ u. 34 35
Lze st´ ahnout z http://www.rxtx.org a je souˇc´ast´ı elektronick´e pˇr´ılohy. V pˇr´ıpadˇe PC v kl´ aˇsteˇre se jedn´ a o C:\Program Files\airflow measurement.
57
Popsan´a struktura sloˇzek i s potˇrebn´ ymi konfiguraˇcn´ımi soubory vytvoˇren´ ymi pro pouˇzit´ı v konventu je souˇc´ast´ı elektronick´e pˇr´ılohy. Abychom doc´ılili spouˇstˇen´ı serveru a klienta spolu se spuˇstˇen´ım poˇc´ıtaˇce, je nejjednoduˇsˇs´ı vyuˇz´ıt mechanismus poskytovan´ y operaˇcn´ım syst´emem a (v pˇr´ıpadˇe OS Windows) vytvoˇrit z´astupce pro spouˇstˇen´ı serveru a klienta v poloˇzce Po spuˇstˇen´ı v nab´ıdce Start. Jak jiˇz bylo uvedeno dˇr´ıve, server i klient se spouˇstˇej´ı ze stejn´eho bin´arn´ıho souboru. Liˇs´ı se jen parametr pro virtu´aln´ı stroj ud´avaj´ıc´ı spouˇstˇec´ı tˇr´ıdu. Z´astupce pro spouˇstˇen´ı serveru m´a n´asleduj´ıc´ı parametry: C´ıl: C:\WINDOWS\system32\javaw.exe -cp "C:\Program Files\airflow_measurement \airflow_server.jar" airflow_server.server.Server "C:\Program Files \airflow_measurement\airflow_server\server_settings.xml" Spustit v: "C:\Program Files\airflow_measurement" V pˇr´ıpadˇe klienta jsou parametry n´asleduj´ıc´ı: C´ıl: C:\WINDOWS\system32\javaw.exe -cp "C:\Program Files\airflow_measurement \airflow_server.jar" airflow_server.client.ClientSatrter "C:\Program Files \airflow_measurement\airflow_client\client_settings.xml" Spustit v: "C:\Program Files\airflow_measurement" Dne 9. kvˇetna byla klientsk´a monitorovac´ı aplikace nainstalov´ana tak´e na PC, kter´e vyuˇz´ıv´a z´astupkynˇe kastel´ana, Sylva Kroˇc´akov´a. V pˇr´ıpadˇe, ˇze je spuˇstˇen kastel´an˚ uv PC, ’ je moˇzn´e se pˇres lok´aln´ı s´ıt pˇripojit k mˇeˇric´ımu serveru a zobrazovat doporuˇcen´ y zp˚ usob vˇetr´an´ı a mˇeˇren´a data i na tomto druh´em poˇc´ıtaˇci. Jako souˇc´ast t´eto pr´ace vznikl tak´e uˇzivatelsk´ y n´avod pro mˇeˇric´ı software. Tento n´avod je samostatnou pˇr´ılohou, kter´a byla pˇred´ana person´alu NKP Kl´aˇster Plasy a v elektronick´e podobˇe m˚ uˇze b´ yt nalezena na internetov´ ych str´ank´ach tohoto projektu [2].
58
Obr´azek 30: Okno zobrazuj´ıc´ı mˇeˇren´a data (kastel´an˚ uv PC, 15. kvˇetna 2010)
7.3
Uk´ azka namˇ eˇ ren´ ych dat
Na obr´azku 31 na stranˇe 60 m˚ uˇzeme vidˇet z´aznam mˇeˇren´ı z obdob´ı od 1. do 15. kvˇetna 2010. Bˇehem tohoto obdob´ı bylo moˇzn´e vˇetrat (a tak´e vˇetr´ano bylo) pouze 1. kvˇetna a proto nen´ı nutn´e v tomto grafu zobrazovat z´aznam stavu oken a dveˇr´ı. V´ ypadek mˇeˇren´ı v obdob´ı od 7. do 9. kvˇetna byl zp˚ usoben nekvalitn´ım pˇr´ıjmem komunikaˇcn´ıho sign´alu, v´ ypadek v noci mezi 9. a 10. kvˇetnem byl zp˚ usoben bouˇrkou a ztr´atou nap´ajen´ı na cca 2 hodiny. Pamˇet’ zaˇr´ızen´ı se tedy vymazala a mˇeˇren´ı zaˇcalo aˇz 10. kvˇetna r´ano po automatick´em nastaven´ı zaˇr´ızen´ı serverem. 14. kvˇetna nebyl zapnut poˇc´ıtaˇc, na kter´em bˇeˇz´ı server a nebyla staˇzena data. Do pamˇeti zaˇr´ızen´ı nastaven´e na line´arn´ı reˇzim tedy po jej´ım zaplnˇen´ı nebyly ukl´ad´any dalˇs´ı vzorky a ukl´ad´an´ı pokraˇcovalo aˇz po kontaktov´an´ı serverem 15. kvˇetna r´ano a staˇzen´ı dat. Na obr´azku 31 m˚ uˇzeme na spodn´ım podgrafu vidˇet sign´al zn´azorˇ nuj´ıc´ı doporuˇcen´ y reˇzim vˇetr´an´ı. Doporuˇcen´ y reˇzim m´a v dan´em ˇcase hodnotu 1. Jak jiˇz bylo uvedeno dˇr´ıve, mˇeˇric´ı syst´em nem´a k dispozici u ´daje o teplotˇe ve druh´em patˇre budovy, kde je nejtepleji. Doporuˇcen´ı syst´emu se vztahuje pouze na zabr´anˇen´ı kondenzace vodn´ı p´ary v pˇr´ızem´ı. Z´akaz vˇetr´an´ı je platn´ y vˇzdy. Pokud vˇsak syst´em vˇetr´an´ı doporuˇc´ı, mus´ı obsluha posoudit, zda je teplota vnˇejˇs´ıho vzduchu vyˇsˇs´ı, neˇz teplota ve druh´em patˇre, aby se budova neochlazovala. Uˇcinˇen´ı odhadu t´ ykaj´ıc´ıho se teploty je vˇsak mnohem jednoduˇsˇs´ı, neˇz uˇcinˇen´ı podobn´eho odhadu t´ ykaj´ıc´ıho se vzduˇsn´e vlhkosti. Ten je tedy ˇreˇsen mˇeˇric´ım syst´emem.
59
Květen 2010 Měření z M-Boardu, konvent 20,0
Teplota (°C)
17,5 15,0 12,5 10,0 7,5 5,0 2,5
Teplota (°C)
7,5
5,0
2,5
0,0
-2,5 110
Relativní vlhkost (%)
100 90 80 70 60 50 40 30
alarm
1,0 0,5 0,0 1-V
2-V
3-V
4-V
5-V
6-V
7-V
8-V
9-V
10-V
11-V
12-V
13-V
14-V
15-V
Čas (středoevropský letní) Teplota venku
Teplota uvnitř
Relativní vlhkost uvnitř
Rosný bod venku
Větrání nevhodné
Rosný bod uvnitř
Relativní vlhkost venku
Větrání možné
Obr´azek 31: Souhrn dat namˇeˇren´ ych za obdob´ı od 1. do 15. kvˇetna 2010
60
16-V
8
Z´ avˇ er
C´ılem t´eto pr´ace bylo vytvoˇren´ı bezdr´atov´eho mˇeˇric´ıho a poradn´ıho syst´emu pro sn´ıˇzen´ı vlhkosti a zv´ yˇsen´ı teploty vzduchu v pam´atkov´ ych budov´ach pomoc´ı spr´avn´eho zp˚ usobu vˇetr´an´ı. Tato u ´loha byla ˇreˇsena na konkr´etn´ım pˇr´ıkladu budovy konventu b´ yval´eho cisterci´ack´eho kl´aˇstera v Plas´ıch. V pˇredchoz´ı (bakal´aˇrsk´e) pr´aci [1] byly urˇceny veliˇciny, kter´e je nutn´e mˇeˇric´ım syst´emem sledovat a m´ısta v konventu, kter´a jsou pro um´ıstˇen´ı ˇcidel vhodn´a. V t´eto pr´aci je uveden n´avrh mˇeˇric´ıho syst´emu vyuˇz´ıvaj´ıc´ıho univerz´aln´ı mˇeˇric´ı a ˇr´ıdic´ı desku zvanou M-Board, kter´a byla v pˇredchoz´ıch letech vyvinuta ve spolupr´aci ˇ (viz [3]). Toto zaˇr´ızen´ı je velmi Katedry kybernetiky a Fakulty elektrotechnick´e ZCU vhodn´e d´ıky mal´ ym rozmˇer˚ um, moˇznosti vyuˇzit´ı bezdr´atov´e komunikace pomoc´ı modul˚ u ZigBee (v´ yrobce Digi International ) a moˇznosti pˇripojen´ı ˇcidel vlhkosti a teploty Humirel HTM1735, kter´a se jiˇz osvˇedˇcila v pr˚ ubˇehu bakal´aˇrsk´e pr´ace. Pro zaˇr´ızen´ı M-Board jsem vytvoˇril program v jazyce C, kter´ y zajiˇst’uje periodick´e mˇeˇren´ı hodnot na napˇet’ov´ ych vstupech, ukl´ad´a data do vnitˇrn´ı pamˇeti M-Boardu a pomoc´ı ZigBee ˇci RS232 tato data odes´ıl´a na PC vybaven´e softwarem pro vyhodnocov´an´ı dat. Mˇeˇric´ı aplikace pro PC, kterou jsem vytvoˇril v jazyce Java je rozdˇelena na dvˇe samostatn´e ˇca´sti. Prvn´ı ˇc´ast´ı je server, kter´ y komunikuje pˇr´ımo s mˇeˇric´ım zaˇr´ızen´ım. Server automaticky stahuje data ze zaˇr´ızen´ı a umoˇzn ˇuje nastavovat parametry mˇeˇren´ı. D´ale potom prov´ad´ı vyhodnocov´an´ı a archivaci dat. Budovu je moˇzn´e provˇetr´avat tehdy, kdyˇz rosn´ y bod vnˇejˇs´ıho vzduchu je niˇzˇs´ı, neˇz teplota nejstudenˇejˇs´ıho m´ısta uvnitˇr budovy. V opaˇcn´em pˇr´ıpadˇe je vˇetr´an´ı zak´az´ano. T´ım se pˇredejde kondenzaci vodn´ı p´ary v interi´erech. Druhou ˇca´st´ı aplikace je klient, kter´ y se se serverem spojuje pomoc´ı protokolu XMLRPC. Klient v grafick´em rozhran´ı zobrazuje person´alu data, kter´a z´ıskal od serveru. D´ale potom klient sdˇeluje person´alu vizu´aln´ım sign´alem vhodnost ˇci nevhodnost vˇetr´an´ı. Od kvˇetna 2010 je vyvinut´ y mˇeˇric´ı syst´em nainstalov´an a provozov´an v budovˇe konventu. M-Board je um´ıstˇen v krabici s logem projektu Airflow a katedry kybernetiky v rizalitu jiˇzn´ıho schodiˇstˇe budovy. Jedno ˇcidlo vlhkosti a teploty je um´ıstˇeno na stojanu ˇ ak - SPELEO na rajsk´em dvoˇre konventu (mˇeˇren´ı meteostanice patˇr´ıc´ı firmˇe Josef Reh´ vnˇejˇs´ıho vzduchu), druh´e ˇcidlo je spuˇstˇeno pod schodiˇstˇe cca 2, 5m nad podlahu u jiˇzn´ıho vodn´ıho zrcadla (Mˇeˇr´ı teplotu a vlhkost na nejstudenˇejˇs´ım m´ıstˇe). Mˇeˇric´ı syst´em je vytvoˇren tak, aby zamezil kondenzaci vzduˇsn´e vlhkosti v budovˇe. Pokud syst´em zak´aˇze vˇetr´an´ı, je tento z´akaz platn´ y vˇzdy. Pokud ale vˇetr´an´ı doporuˇc´ı, mus´ı obsluha pˇred otevˇren´ım oken jeˇstˇe uv´aˇzit, zda je teplota vnˇejˇs´ıho vzduchu vyˇsˇs´ı, neˇz teplota ve druh´em patˇre budovy, aby se konvent neochlazoval. Toto omezen´ı je d´ano t´ım, ˇze nebylo moˇzn´e k M-Boardu pˇripojit tˇret´ı ˇcidlo a um´ıstit jej v rizalitu o cca 12 metr˚ u v´ yˇse, neˇz je tato mˇeˇric´ı karta. Porovn´an´ı teplot venku a uvnitˇr lze vˇsak dobˇre prov´est odhadem, na rozd´ıl od porovn´an´ı vlhkost´ı. Serverov´a aplikace je nainstalov´ana na sluˇzebn´ım PC kastel´ana v kancel´aˇri spr´avy objektu. Komunikace s mˇeˇric´ım zaˇr´ızen´ım v rizalitu prob´ıh´a pˇres ZigBee na vzduˇsnou vzd´alenost cca 30 metr˚ u. Klientsk´a aplikace je pak nainstalov´ana jak na kastel´anovˇe poˇc´ıtaˇci, tak na sluˇzebn´ım poˇc´ıtaˇci z´astupkynˇe kastel´ana. Program pro M-Board byl vyv´ıjen v jazyce C v prostˇred´ıch Eclipse a IAR Embedded Workbench for ARM. Software pro PC byl vyv´ıjen v jazyce Java v prostˇred´ı NetBeans s 61
pouˇzit´ım softwarov´ ych knihoven tˇret´ıch stran pro pr´aci se s´eriovou linkou PC, pr´aci s XML soubory, kreslen´ı a ukl´ad´an´ı graf˚ u do PNG, SVG a PDF, pro prov´adˇen´ı nˇekter´ ych matematick´ ych operac´ı a komunikaci pomoc´ı XML-RPC. Tyto knihovny jsou bl´ıˇze pops´any v ˇca´sti 2.3 t´eto pr´ace. Postupy t´ ykaj´ıc´ı se hardware jsem konzultoval s Ing. Ondˇrejem Jeˇzkem a Ing. Tom´aˇsem Pern´ ym z KKY. V dobˇe psan´ı tˇechto ˇr´adek bˇeˇz´ı mˇeˇric´ı syst´em v konventu jiˇz v´ıce neˇz dva t´ ydny. Bˇehem t´eto doby se vyskytl pouze probl´em s malou silou komunikaˇcn´ıho sign´alu, kter´ y byl vyˇreˇsen posunut´ım ant´eny pˇripojen´e k M-Boardu. Tak´e doˇslo k v´ ypadku nap´ajen´ı elektˇrinou bˇehem bouˇrky v noci z 9. na 10. kvˇetna a vymaz´an´ı vzork˚ u uloˇzen´ ych v pamˇeti mˇeˇric´ıho zaˇr´ızen´ı za posledn´ıch cca 6 hodin, avˇsak po spuˇstˇen´ı PC se serverovou aplikac´ı n´asleduj´ıc´ı den r´ano bylo mˇeˇric´ı zaˇr´ızen´ı serverem opˇet automaticky nastaveno a pokraˇcovalo v ˇcinnosti. Data namˇeˇren´a pˇres noc jsou nav´ıc jak´ ymsi bonusem a pom´ahaj´ı k pochopen´ı reakc´ı budovy na r˚ uzn´e klimatick´e podm´ınky. Kl´ıˇcov´e je, aby bylo mˇeˇren´ı dostupn´e pˇres den, kdy je v budovˇe person´al a m˚ uˇze ovlivˇ novat proudˇen´ı vzduchu manu´aln´ım zav´ır´an´ım a otev´ır´an´ım oken. Tento poˇzadavek mˇeˇric´ı syst´em splˇ nuje a poskytuje obsluze spr´avn´e informace v okamˇzic´ıch, kdy je to potˇreba a naopak ji zbyteˇcnˇe nezatˇeˇzuje, kdyˇz to potˇreba nen´ı. Aktu´aln´ı informace o tomto projektu (nazvan´em Airflow) je moˇzn´e sledovat na m´ ych internetov´ ych str´ank´ach http://www.michalsiroky.com/airflow a na internetov´ ych str´ank´ach plask´eho kl´aˇstera http://www.klaster-plasy.cz.
62
Reference ˇ [1] Michal Sirok´ y, N´avrh prototypu pro stabilizaci klimatick´ych podm´ınek v konventu ˇ v Plzni (2008) plask´eho kl´aˇstera, bakal´aˇrsk´a pr´ace na Katedˇre kybernetiky ZCU ˇ [2] Michal Sirok´ y, Internetov´e str´anky projektu Airflow, [online]. [2010] Dostupn´ y z WWW: http://www.michalsiroky.com/airflow ˇ [3] Ondˇrej Jeˇzek, Univerz´aln´ı ˇr´ıdic´ı deska, diplomov´a pr´ace na Katedˇre kybernetiky ZCU v Plzni (2008) [4] Doc. Dr. Ing. Vjaˇceslav Georgiev, Obvodov´e sch´ema mˇeˇric´ı a ˇr´ıdic´ı desky M-Board (neofici´aln´ı n´azev, intern´ı dokument univerzity / katedry) [5] Josef Kalˇc´ık, Karel S´ ykora: Technick´a termomechanika, Academia Praha (1973) [6] REX Controls – Developers Zone [online]. [2010] Dostupn´ y z WWW: http://www.rexcontrols.cz/devzone [7] Wolfram Alpha [online]. [2010] Dostupn´ y z WWW: http://www.wolframalpha.com ˇ (UL518, [8] Konzultace s Ing. Ondˇrejem Jeˇzkem z Katedry kybernetiky FAV ZCU ˇ [email protected]) a Ing. Tom´aˇsem Pern´ ym z Katedry kybernetiky FAV ZCU (UK511, [email protected]) [9] Doc. Ing. Pavel Herout Ph.D., Uˇcebnice jazyka Java, Kopp 2005 [10] Doc. Ing. Pavel Herout Ph.D., Uˇcebnice jazyka C – 1. d´ıl, Kopp 2006 [11] Doc. Ing. Pavel Herout Ph.D., Uˇcebnice jazyka C – 2. d´ıl, Kopp 2006 [12] The Java Tutorials [online]. [2010] Tutori´aly jazyka Java. Dostupn´ y z WWW: http://java.sun.com/docs/books/tutorial [13] Elliotte Rusty Harold, Processing XML with Java [online]. [2003] Dostupn´ y z WWW: http://www.cafeconleche.org/books/xmljava [14] Tutori´aly pro kreslen´ı graf˚ u v jazyce Java [online]. [2010] Dostupn´ y z WWW: http://www.java2s.com/Code/Java/Chart/CatalogChart.htm [15] Internetov´e str´anky projektu JDOM pro pr´aci s XML soubory v jazyce Java. [2010] Dostupn´ y z WWW: http://www.jdom.org [16] Internetov´e str´anky projektu Apache XML-RPC [2010] Dostupn´ y z WWW: http://ws.apache.org/xmlrpc [17] Internetov´e str´anky projektu Apache Commons - Math [2010] Dostupn´ y z WWW: http://commons.apache.org/math [18] Projekt JFreeChart – knihovna pro kreslen´ı graf˚ u v jazyce Java [2010] Dostupn´ yz WWW: http://www.jfree.org/jfreechart
63
[19] Internetov´e str´anky projektu Batik SVG Toolkit pro pr´aci s SVG soubory v jazyce Java [2010] Dostupn´ y z WWW: http://xmlgraphics.apache.org/batik [20] Internetov´e str´anky projektu iText – knihovna pro pr´aci s PDF soubory v jazyce Java [2010] Dostupn´ y z WWW: http://itextpdf.com [21] UML editor UMLet UMLet [2010] Dostupn´ y z WWW: http://www.umlet.com [22] V´ yvojov´e prostˇred´ı NetBeans [2010] Dostupn´ y z WWW: http://netbeans.org [23] Internetov´e str´anky v´ yvojov´eho prostˇred´ı IAR Embedded Workbench for ARM [2010] Dostupn´ y z WWW: http://iar.com/website1/1.0.1.0/68/1 [24] V´ yvojov´e prostˇred´ı Eclipse [2010] Dostupn´ y z WWW: http://www.eclipse.org [25] Internetov´e str´anky firmy Oracle [2010] Dostupn´ y z WWW: http://www.oracle.com/us/index.html [26] Internetov´e str´anky projektu RXTX – knihovna pro pr´aci se s´eriovou a paraleln´ı linkou v jazyce Java [2010] Dostupn´ y z WWW: http://www.rxtx.org/ [27] Licence Apache v. 2.0 [2004] Dostupn´ y z WWW: http://www.apache.org/licenses/LICENSE-2.0 [28] Licence LGPL [2007] Dostupn´ y z WWW: http://www.gnu.org/copyleft/lesser.html [29] GNU Affero General Public License [2007] Dostupn´ y z WWW: http://www.gnu.org/licenses/agpl-3.0.html [30] Everaldo Coelho, Ikony Crystal Icons, http://everaldo.com/crystal [31] Pr˚ uvodcovsk´e texty a intern´ı dokumenty plask´eho kl´aˇstera ˇ ak sen., Josef Reh´ ˇ ak jun. Nov´e poznatky o vodn´ım syst´emu kl´aˇstera v [32] Josef Reh´ Plas´ıch. v Plask´y kl´aˇster a jeho minul´y i souˇcasn´y pˇr´ınos pro kulturn´ı dˇejiny. 1. vyd. [s.l.] : [s.n.], [2005]. s. 39-48. [33] Digi International [online]. [2010] Internetov´e str´anky v´ yrobce pouˇzit´ ych modul˚ u bezdr´atov´e komunikace XBee. Dostupn´ y z WWW: http://www.digi.com [34] Snail Instruments [online]. [2010] Internetov´e str´anky prodejce elektronick´ ych souˇc´astek, zdroj katalogov´eho listu k adapt´eru Bbee/USB. Dostupn´ y z WWW: http://www.snailinstruments.com [35] Katalogov´y list produktu XBeeU http://www.snailinstruments.com
[online].
[2010]
Dostupn´ y
z
WWW:
[36] Katalogov´y list produktu Humirel HTM1735 [online]. [2010] Dostupn´ y z WWW: http://www.meas-spec.com [37] Manu´al k XBee modulu – Product Manual: XBee / XBee-PRO ZB OEM RF Modules [online]. [2010] Dostupn´ y z WWW: http://www.digi.com/products/wireless/ zigbee-mesh/xbee-zb-module.jsp#docs [38] FreeRTOS [online]. [2010] Dostupn´ y z WWW: http://www.freertos.org 64