MASARYKOVA UNIVERZITA V BRNEˇ Prˇ´ırodoveˇdecka´ fakulta
Modernı´ meˇrˇicı´ syste´my Diplomova´ pra´ce
Vedoucı´ pra´ce RNDr. Zdeneˇk Bochnı´cˇek, Dr.
Brno 2003
Martin Cˇerma´k
LabVIEW je zkratkou pro Laboratory Virtual Instrument Engineering Workbench. Jedná se o moderní výkonný systém speciálně vhodný pro programování komunikace osobního počítače s různými periferními zařízeními, zejména s měřicími přístroji. Tato diplomová práce má být výukovým textem programování v LabVIEW. Jejím cílem je seznámit čtenáře se základy programování v grafickém programovacím jazyce G, pro nějž je LabVIEW vývojovým prostředím, a předvést některé praktické aplikace tohoto systému. Součástí práce je CD s ukázkovými programy.
Prohlášení Prohlašuji, že jsem diplomovou práci vypracoval samostatně s použitím uvedené literatury. V Brně 9. ledna 2003
Martin Čermák
Poděkování Rád bych poděkoval RNDr. Antonínu Brablecovi a doc. Zdeňku Ondráčkovi za možnost pracovat s periferními zařízeními o kterých práce pojednává, panu Koblížkovi a panu Pajerovi za výrobu některých mechanických součástí experimentálního zařízení, RNDr. Pavlu Konečnému za námět kapitoly o precesi setrvačníku a za poskytnutí mechanické součásti experimentálního zařízení, Mgr. Zdeňku Navrátilovi za jeho diplomovou práci, která pro mě byla odrazovým můstkem ve snaze porozumět programování periferií osobního počítače, a RNDr. Zdeňku Bochníčkovi za jeho motivující přístup k vedení mé diplomové práce.
Použité názvy programových produktů, firem apod. mohou být ochrannými známkami nebo registrovanými ochrannými známkami jejich vlastníků.
Obsah 1 Úvod do programování v LabVIEW 1.1 Úvodní představa . . . . . . . . . . . . . . . . . 1.2 Vývojové prostředí I . . . . . . . . . . . . . . . 1.3 První program . . . . . . . . . . . . . . . . . . 1.4 Vývojové prostředí II (Čelní panel) . . . . . . . 1.5 Vývojové prostředí III (Blokový diagram) . . . 1.5.1 Pojmy . . . . . . . . . . . . . . . . . . . 1.5.2 Princip . . . . . . . . . . . . . . . . . . 1.6 Druhý program . . . . . . . . . . . . . . . . . . 1.7 Vizualizace a sledování běhu VI . . . . . . . . . 1.8 Datové typy . . . . . . . . . . . . . . . . . . . . 1.9 Konstanty . . . . . . . . . . . . . . . . . . . . . 1.9.1 číselná konstanta . . . . . . . . . . . . . 1.9.2 řetězcová konstanta . . . . . . . . . . . 1.9.3 konstanta typu pole . . . . . . . . . . . 1.9.4 konstanta typu Cluster . . . . . . . . . . 1.9.5 logická konstanta . . . . . . . . . . . . . 1.10 Objekty typu Control a Indicator . . . . . . . . 1.11 Jak nejrychleji napsat program? . . . . . . . . . 1.12 Paleta Functions pod drobnohledem . . . . . . 1.12.1 Uzly s nastavitelným počtem terminálů 1.12.2 Polymorfní uzly . . . . . . . . . . . . . . 1.13 řídící struktury programu . . . . . . . . . . . . 1.13.1 cyklus FOR . . . . . . . . . . . . . . . . 1.13.2 cyklus WHILE . . . . . . . . . . . . . . 1.13.3 struktura CASE . . . . . . . . . . . . . 1.13.4 struktura SEQUENCE . . . . . . . . . . 1.14 Formula Node . . . . . . . . . . . . . . . . . . . 1.15 Podprogramy . . . . . . . . . . . . . . . . . . . 1.15.1 Tvorba Sub-VI . . . . . . . . . . . . . . 1.15.2 Použití Sub-VI . . . . . . . . . . . . . . 2 Příklady 2.0.3 2.0.4 2.0.5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 1 2 5 6 9 9 10 11 12 14 15 15 15 17 18 18 18 19 20 21 21 22 22 24 25 27 29 30 31 31
Příklad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Příklad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Příklad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33 33 34 34
vii
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.0.6 2.0.7 2.0.8 2.0.9 2.0.10 2.0.11
Příklad Příklad Příklad Příklad Příklad Příklad
4 5 6 7 8 9
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
3 Vybrané periferie PC 3.1 Zvuková karta . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Nejjednodušší VI pro čtení ze zvukové karty . . . . . 3.1.2 VI pro fourierovu transformaci akustického signálu . 3.2 Sériový port . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Základní pojmy . . . . . . . . . . . . . . . . . . . . . 3.2.2 Využití sériového portu . . . . . . . . . . . . . . . . 3.2.3 Ovládání sériového rozhraní z LabVIEW . . . . . . . 3.2.4 Multimetr M-3860D . . . . . . . . . . . . . . . . . . 3.3 Rozhraní GPIB . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Jednoduchý odečet z HP34401A . . . . . . . . . . . 3.3.2 Odkazy na další ukázková VI pro čtení z HP34401A 3.4 Univerzální měřicí karta PCI-6023E . . . . . . . . . . . . . 3.5 Univerzální měřicí karta PCL-818L . . . . . . . . . . . . . . 4 Precese setrvačníku 4.0.1 Teoretický základ . . . . . . . 4.0.2 Technická realizace . . . . . . 4.0.3 Zpracování vstupních signálů 4.0.4 Výsledky . . . . . . . . . . . 4.0.5 Závěr . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
. . . . . . . . . . . . .
. . . . .
. . . . . .
35 36 36 37 38 39
. . . . . . . . . . . . .
41 41 43 44 45 47 47 48 49 51 52 53 53 55
. . . . .
58 58 60 61 62 63
A Precese setrvačníku B Sériová myš jako univerzální senzor pohybu B.1 Komunikační protokol . . . . . . . . . . . . . . . . . B.1.1 – Dvoutlačítková myš (Microsoft Mouse) . . . B.1.2 – Třítlačítková myš (Mouse Systems Mouse) B.2 Programování . . . . . . . . . . . . . . . . . . . . . . B.3 Ukázkové programy . . . . . . . . . . . . . . . . . . . B.4 Zdroje informací . . . . . . . . . . . . . . . . . . . .
68
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
71 72 72 73 74 75 76
Kapitola 1
Úvod do programování v LabVIEW 1.1
Úvodní představa
Většina moderních vývojových prostředí pro programovací jazyky je typu RAD. Tato zkratka označuje Rapid Application Development a napovídá, že v daném vývojovém prostředí lze programy vyvíjet obzvláště rychle a efektivně. Zmíněná efektivnost spočívá zejména ve snadném navrhování uživatelského rozhraní programu. Stejně jako např. Delphi je vývojovým prostředím nad jazykem Object Pascal, lze také LabVIEW chápat jako vývojové prostředí nad jazykem G. Narozdíl od Object Pascalu, kde zdrojovým kódem programu je text, zdrojovým kódem programu v jazyce G je obrázek. Místo abychom programy psali, budeme je kreslit. G tedy značí grafický programovací jazyk. Grafické programování je technika neobvyklá a nová. Byla patentována společností National Instruments teprve v roce 1990. Pro jazyk G existuje kompilátor, který produkuje samostatné spustitelné programy. Tvůrci LabVIEW prohlašují, že programy vytvořené v jazyce G běží po přeložení srovnatelně rychle, jako programy napsané v jazyce C, který je obecně považován za velmi efektivní. V jazyce G má programátor k dispozici jak rychlé funkce nízké úrovně, tak i hotové komplikované podprogramy pro matematickou analýzu, statistiku, komunikaci se standardizovanými periferiemi a podobně. V současné době neexistuje česká lokalizace LabVIEW, pouze anglická, německá, španelská a japonská. Pokud je autorovi známo, neexistuje ani česká učebnice LabVIEW. Při tvorbě tohoto textu bylo nutno vytvořit nový pojmový aparát. Výrazy, které nemají v češtině zavedené ekvivalenty byly buďto počeštěny, nebo (častěji) ponechány v původní podobě. V následujícím textu se předpokládá základní znalost angličtiny, uživatelská znalost ovládání operačního systému a schopnost algoritmizace.
1
2
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
Naprostá většina akcí se během programování provádí myší. V celém textu se při tom předpokládá běžné nastavení myši „pro pravákyÿ. Výraz „zaostřit na oknoÿ znamená klepnout do prostoru tohoto okna myší, takže se okno stane aktivním. Menu pod pravým tlačítkem myši nad určitým objektem je nabídka, která se objeví, klepneme li na tento objekt pravým tlačítkem myši. Součástí tohoto textu je CD s ukázkovými programy. Odkazy do „archivu příkladůÿ jsou odkazy do adresáře APP tohoto CD.
1.2
Vývojové prostředí I
Uživatelská rozhraní programů v LabVIEW mívají často podobu skutečných měřicích přístrojů. Program v LabVIEW proto nazýváme virtuální přístroj. Anglický ekvivalent pro tento výraz zní Virtual Instrument a jeho akronym VI budeme pro onačení programu v LabVIEW používat v dalším textu i my. I nadále však budeme používat také obvyklé výrazy „programÿ a „aplikaceÿ pro označení téhož. Každé VI se skládá ze dvou částí: Z uživatelského rozhraní, kterému se v terminologii LabVIEW říká čelní panel VI a z blokového diagramu který je zdrojovým kódem VI. K vytváření VI slouží vývojové prostředí (Development Environment) LabVIEW. Z uživatelského hlediska je to soustava oken. Po spuštění LabVIEW se objeví první z nich. Je to nabídka kterou projdeme s tím, že chceme vytvářet nové VI. Stiskneme tedy tlačítko New VI a ocitneme se v prostředí z obrázku 1.1 Palety Controls a Functions nejsou ve skutečnosti nikdy viditelné současně. Paletu Controls lze zobrazit pouze je-li aktivní okno čelního panelu a paletu Functions lze zobrazit jen je-li aktivní okno blokového diagramu. Na obrázku 1.1 je aktivní okno Untitled1, tedy okno čelního panelu, takže paleta functions by ve skutečnosti zůstala skrytá.
• Okno čelního panelu Untitled1 slouží k tvorbě čelního panelu VI. Pokud chceme s VI manipulovat, tzn. spouštět je, nebo editovat, nesmíme toto okno zavřít. Okno čelního panelu můžeme samozřejmě kdykoliv minimalizovat. Všechna ostatní okna můžeme během manipulace s VI podle potřeby otvírat a zavírat. Mezi oknem čelního panelu a oknem blokového diagramu lze přepínat pomocí Ctrl-E. • Okno blokového diagramu Untitled 1 Diagram slouží k tvorbě blokového diagramu VI. Pokud nechceme editovat blokový diagram našeho VI, můžeme toto okno zavřít. Mezi oknem čelního panelu a oknem blokového diagramu lze přepínat pomocí Ctrl-E. • Paletu Tools lze zviditelnit volbou Window → Show Tools Palette hlavního menu, nebo zkrýt klepnutím na křížek v jejím pravém horním rohu. Umožňuje měnit funkci kurzoru myši a její funkce bude níže podrobněji popsána.
1.2. VÝVOJOVÉ PROSTŘEDÍ I
3
Obrázek 1.1: Vývojové prostředí LabVIEW
• Paleta Controls může být viditelná, jen je-li aktivní okno čelního panelu. Má stromovou strukturu a obsahuje všechny objekty které lze umístit do okna čelního panelu. Tuto paletu můžeme zobrazit zvolením položky Window → Show Controls Palette hlavního menu okna čelního panelu, nebo zkrýt klepnutím na křížek v jejím pravém horním rohu. Kromě toho lze tuto paletu dočasně zobrazit klepnutím pravého tlačítka myši do prostoru okna čelního panelu. • Paleta Functions může být viditelná, jen je-li aktivní okno blokového diagramu. Má taktéž stromovou strukturu a obsahuje všechny objekty které lze umístit do okna blokového diagramu. Tuto paletu můžeme zobrazit zvolením položky Window → Show Functions Palette hlavního menu okna blokového diagramu, nebo zkrýt klepnutím na křížek v jejím pravém horním rohu. Kromě toho lze tuto paletu dočasně zobrazit klepnutím pravého tlačítka myši do prostoru okna blokového diagramu. Téměř všechny akce, které nad VI budeme provádět se realizují myší. Myš, resp. kurzor myši funguje v několika různých režimech. V každém režimu lze myší provádět jen určité akce. Klepnutím na příslušné políčko palety Tools lze zvolit jeden z deseti režimů. Mezi čtyřmi nejčastěji používanými lze také elegantně přepínat klávesou tab. Zde je jejich popis: • režim positioning. Je signalizován kurzorem myši v podobě malé šipky ( ). V tomto
4
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW režimu lze zejména s objekty na pracovní ploše pohybovat. Kurzor příslušející režimu positioning budeme zkráceně nazývat „šipkaÿ. • režim wiring. Je signalizován kurzorem myši v podobě cívky s nití ( ). V tomto režimu lze jednotlivé objekty na pracovní ploše propojovat. O propojování se zmíníme později. Kurzor příslušející režimu wiring budeme zkráceně nazývat „cívka s nitíÿ. • režim operating. Je signalizován kurzorem v podobě malé ručičky ( ). Hodí se k úpravě hodnot tam, kde je více předdefinovaných voleb. Kurzor příslušející režimu operating budeme zkráceně nazývat „ručičkaÿ. • režim labelling. Je signalizován kurzorem v podobě obdélníčku a svislé čárky ( ). Hodí se k úpravě textů. Kurzor příslušející režimu labelling budeme zkráceně nazývat „popisovačÿ.
Akce provedené myší v příslušném režimu budeme popisovat jako akce provedené příslušným kurzorem. Řekneme-li, že „s objektem pohneme šipkouÿ, máme tím na mysli, že s objektem pohneme myší v režimu positioning. Popřípadě bude do textu vložena ikona příslušného kurzoru. Podrobný popis palety Tools i jednotlivých režimů kurzoru myši najde čtenář v nápovědě (Ctrl-?) v Indexu pod heslem tools palette. Každá paleta dočasně vyvolaná klepnutím pravého tlačítka myši je v levém horním rohu vybavena připínacím špendlíkem. Pokud na něj klepneme, paleta se zobrazí ve vlastním okně jako kdybychom ji zobrazili volbou Window → Show Palette. Jak již bylo řečeno, palety Controls a Functions mají stromovou strukturu. Jsou sice obrázkové, ale v horní části se zobrazuje i krátký textový popisek vybírané položky. Pokud se v dalším budeme odkazovat na nějaký objekt palety, popíšeme jeho polohu v paletě posloupností názvů jednotlivých úrovní palety oddělených šipkami, kde na konci této posloupnosti uvedeme pomlčku a název konkrétního objektu. Například odkaz na objekt ručkového měřicího přístroje Meter, který se nachází v „subpaletěÿ Numeric palety Controls bude vypadat takto: „Controls → Numeric-Meterÿ Každý VI lze uložit do samostatného souboru s příponou vi. Obvykle jsou všechny informace nutné ke spuštění VI obsaženy v tomto jediném souboru. Pouze v případě kdy uložený VI volá jiný VI jako svůj podprogram, je ke spuštění nutný i tento další VI. A v opravdu speciálním případě, kdy náš VI volá např. nějaké knihovní funkce, je k jeho spuštění nutná také přítomnost oné knihovny. 1 Uložení VI do souboru se provádí volbou File → Save v hlavním menu, nebo klávesovou zkratkou Ctrl-S, jak je obvyklé. 2 Otevření VI se provede buďto volbou File → Open v hlavním menu, nebo obvyklou klávesovou zkratkou Ctrl-O. Na tomto místě přerušíme náš stručný popis vývojového prostředí a všechny právě získané informace stoprocentně zužitkujeme. 1 LabVIEW umožňuje také uložit VI do tzv. knihovny virtuálních přístrojů (Virtual Instrument Library), což je binární soubor s příponou llb. S knihovnou VI zachází LabVIEW jako s běžným adresářem. 2 O pokročilých volbách při ukládání VI se čtenář dozví z nápovědy k LabVIEW.
1.3. PRVNÍ PROGRAM
1.3
5
První program
Proniknout do základů programování v LabVIEW je snadné. Aniž bychom o programování v LabVIEW cokoliv věděli, pokusíme se krok za krokem sestavit první funkční VI. Čelní panel našeho VI bude sestávat ze dvou objektů: Z tahového potenciometru a z ručkového měřicího přístroje. Náš VI nebude provádět nic jiného, než že hodnotu nastavenou na tahovém potenciometru zobrazí na měřicím přístroji. Jinými slovy, pohneme-li s jezdcem tahového potenciometru, pohne se i ručka měřicího přístroje. Postupujme podle následujícího návodu: 1. Klepneme pravým tlačítkem myši do prostoru okna čelního panelu Untitled 1. Objeví se paleta Controls. Paleta je obrázková, ale v horní části se zobrazuje i krátký textový popisek vybírané položky. Ve stromové struktuře palety zvolíme Controls → Numeric-Vertical Pointer Slide. Opětovným klepnutím do prostoru okna čelního panelu umístíme Vertical Pointer Slide do libovolné pozice v okně. Takto jsme umístili tahový potenciometr na čelní panel našeho VI. 2. Stejným způsobem umístíme na čelní panel objekt Meter. Má podobu ručkového měřicího přístroje a nachází se také v nabídce Numeric palety Controls, stejně jako tahový potenciometr. Odtud označení Controls → Numeric-Meter. Tím je návrh čelního panelu našeho VI ukončen a můžeme se pustit do tvorby vlastního programu, tedy do tvorby blokového diagramu. Bude to velmi snadné. Vzápětí totiž zjistíme, že celý blokový diagram je již v podstatě vytvořen. 3. V okně blokového diagramu Untitled 1 Diagram se objevily 2 nové objekty. Jak lze očekávat, objekt s popiskem Slide přísluší s tahovému potenciometru, druhý objekt s popiskem Meter ručkovému měřicímu přístroji. Objekt Slide odráží polohu jezdce potenciometru. objekt Meter určuje polohu ručky měřicího přístroje. Všimněme si, že při stisku klávesy tab se mění vzhled kurzoru. Klávesou tab tedy zvolíme kurzor tvaru cívky s nití ( ). 4. Intuitivně řečeno, nyní musíme spojit polohu jezdce potenciometru s polohou ručky přístroje. Když nyní klepneme myší postupně na objekty Slide a Meter, zjistíme, že se spojily červenou čarou.
Obrázek 1.2: První program
6
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
Tím je celý program hotov a nezbývá než jej vyzkoušet. VI spustíme tlačítkem Run Continuously ( ). Pokud program běží, můžeme pomocí myši pohybovat posuvným potenciometrem Slide. Zároveň se hýbe i ručka měřicího přístroje Meter. Běžící program zastavíme tlačítkem Abort Execution ( ). Nyní náš VI uložíme (Ctrl-S) do jediného souboru s příponou vi, jak je obvyklé, a zapamatujeme si jeho umístění, abychom s ním mohli později manipulovat.
1.4
Vývojové prostředí II (Čelní panel)
Již víme, že vytvořit VI znamená navrhnout čelní panel a blokový diagram a také v jednom konkrétním případě víme přesně jak to udělat. Náš první VI fungoval tak, že hodnota kterou jsme nastavili na tahovém potenciometru se zobrazila na ručkovém měřicím přístroji. Tahový potenciometr tedy vystupoval v roli „vstupního prvkuÿ a měřicí přístroj v roli „výstupního prvkuÿ. To pravděpodobně nikoho nepřekvapí. V reálném světě vystupuje potenciometr vždy jako „vstupní zařízeníÿ a analogový ručkový přístroj jako „výstupní zařízeníÿ. V LabVIEW si však tahový potenciometr a ručkový měřicí přístroj mohou svou roli vyměnit. Tahový potenciometr i ručkový měřicí přístroj jsou objekty s určitými vlastnostmi. Nepochybně se od sebe liší například vlastností „vzhledÿ. A vězme, že se od sebe liší i vlastností, kterou bychom mohli označit jako „roleÿ. Tahový potenciometr vystupuje v roli vstupního zařízení a měřicí přístroj v roli výstupního zařízení. Pokud nějaký objekt čelního panelu vystupuje v roli vstupního zařízení, jedná se o tzv. Control. A pokud nějaký objekt čelního panelu vystupuje v roli výstupního zařízení, jedná se o tzv. Indicator. Dále budeme říkat, že Indicator nějakou entitu zobrazuje a Control nějakou entitu generuje. Touto entitou může být například číslo, řetězec, disková cesta, pole a podobně. Výrazy „Controlÿ a „Indicatorÿ budeme v dalším textu používat aniž bychom pro ně hledali počeštěné ekvivalenty. Například tahový potenciometr Vertical Pointer Slide z prvního programu vzhledem k blokovému diagramu našeho VI generuje číselnou hodnotu, kterou do něj uživatel vepsal. Vystupuje tam totiž v roli Control. Naopak ručkový měřicí přístroj Meter který v našem prvním VI vystupuje v roli Indicator, zobrazuje číslo, které tahový potenciometr vygeneroval. Každý objekt čelního panelu je buďto Control nebo Indicator. Žádný objekt čelního panelu nemůže vystupovat v roli Control i Indicator současně. Tato skutečnost pravděpodobně programátora který je zvyklý používat Delphi nebo C++ Builder překvapí. Jak zaměnit našim objektům roli? Velmi snadno. Klepneme pravým tlačítkem myši na objekt tahového potenciometru. Objeví se menu v němž zvolíme možnost Change to Indicator. Nyní klepneme pravým tlačítkem myši na objekt ručkového měřicího přístroje a v menu, které se objeví zvolíme Change to Control. Takto změněný program spusťme. Nyní
1.4. VÝVOJOVÉ PROSTŘEDÍ II (ČELNÍ PANEL)
7
pokud pomocí myši hýbeme ručkou měřicího přístroje, hýbe se i jezdec potenciometru. Obecně tedy, do okna čelního panelu můžeme vložit jakýkoliv objekt z palety Controls. Téměř u každého z těchto objektů lze nastavit, zda má fungovat jako Control, nebo jako Indicator. Paleta Controls obsahuje velké množství různých objektů. Velmi často však budeme používat jen několik z nich, ostatní pravděpodobně jen zřídka. Některé velmi často používané objekty palety Controls shrnuje spolu s jejich stručným popisem tabulka 1.1. Kompletní přehledný a vyčerpávající popis objektů palety Controls obsahuje elektronická nápověda LabVIEW. Vyvoláme ji kombinací (Ctrl-?) a v Indexu vyhledáme heslo „controls paletteÿ. Pomocí šipky ( ) je možné určitý objekt na čelním panelu označit a následně smazat klávesou Del.
8
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW Controls → Numeric-Digital Control. . . Okénko pro vstup číselné hodnoty. Obdobně vypadá Controls → Numeric-Digital Indicator. Zobrazuje čísla. Controls → Numeric-Vertical Pointer Slide. . . Tahový potenciometr. Hodí se pro vstup číselné hodnoty v daném rozsahu. Ve variantě Indicator číselnou hodnotu zobrazuje. Controls → Numeric-Dial. . . Otočný knoflík. Funkčně naprosto shodný s tahovým potenciometrem. Controls → Numeric-Meter. . . Ručičkový měřicí přístroj. Existuje ve variantě Control i Indicator. Generuje nebo zobrazuje číslo v nastaveném rozsahu, stejně jako tahový potenciometr. Controls → Boolean-Vertical Toggle Switch. . . Přepínač. Ve variantě Control generuje logickou hodnotu a ve variantě Indicator logickou hodnotu zobrazuje. Obvykle se používá ve variantě Control. Controls → Boolean-Round LED. . . Kontrolka. Ve variantě Indicator zobrazuje logickou hodnotu logickou hodnotu, ve variantě Control logickou hodnotu generuje. Obvykle se používá ve variantě Indicator. Controls → Boolean-Push Button. . . Tlačítko. Funguje stejně jako Vertical Toggle Switch s tím, že u varianty Control lze navíc nastavit jeho mechanické vlastnosti (Mechanical Action). Nastavením mechanických vlastností určujeme, zda se má Push Button chovat jako spínač, či jako tlačítko a podobně. Mechanické vlastnosti se nastavují v menu pod pravým tlačítkem myši. Controls → String & Path-String Control . . . Okénko pro vstup řetězce ve variantě Control, nebo zobrazení řetězce ve variantě Indicator. Controls → String & Path-File Path Control . . . Okénko pro vstup diskové cesty ve variantě Control, nebo pro zobrazení diskové cesty ve variantě Indicator. Existuje i varianta s dialogovým oknem pro výběr diskové cesty. Jazyk G disponuje zvláštním datovým typem pro diskové cesty, který se liší od typu řetězec. Controls → Graph-Waveform Graph nebo Controls → Graph-Waveform Chart jsou objekty pro kreslení dvourozměrného kartézského grafu bez cejchované osy x (viz podrobný popis tohoto objektu v nápovědě k LabVIEW). Controls → Graph-XY Graph je objekt pro kreslení obecného kartézského grafu.
Tabulka 1.1: Vybrané objekty palety Controls
1.5. VÝVOJOVÉ PROSTŘEDÍ III (BLOKOVÝ DIAGRAM)
1.5 1.5.1
9
Vývojové prostředí III (Blokový diagram) Pojmy
Na následujícím obrázku 1.3 vidíme čelní panel a blokový diagram relativně komplikovaného VI.
Obrázek 1.3: Ukázka VI - čelní panel a blokový diagram
Pro zajímavost budiž řečeno, že uvedené VI nejdříve vygeneruje soubor dvojic čísel typu (X, X 1.6 + n) kde n je „maléÿ náhodné číslo. Vzniklý soubor dat se aproximuje polynomem 2. stupně s využitím metody nejmenších čtverců a na závěr se najde derivace aproximačního polynomu, což je samozřejmě přímka. Z obrázku by mělo být zřejmé, že blokový diagram se skládá z určitých objektů spojených barevnými čarami. V souladu s původní anglickou terminologií budeme tyto objekty nazývat uzly a spojovací čáry mezi nimi hrany. Uzly, které přísluší objektům čelního panelu mají s nimi shodný popisek. Všechny uzly, které můžeme do blokového diagramu vložit se nacházejí na Paletě Functions. Připomenňme, že pokud se budeme odkazovat na nějaký uzel této palety, popíšeme jeho po-
10
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
lohu v paletě posloupností názvů jednotlivých úrovní palety oddělených šipkami, kde na konci této posloupnosti uvedeme pomlčku a název uzlu. Například odkaz na uzel Add ( ), který se nachází v „subpaletěÿ Numeric palety Functions bude vypadat takto: „Functions→Numeric-Addÿ. Uzly mají obvykle jemnější strukturu. Dělí se na tzv. „Terminályÿ. Například uzel Functions → Array-Index Array je rozdělený do tří oblastí, jak je vidět na obrázku 1.4. To jsou právě Terminály uzlu Index Array.
Obrázek 1.4: Objekt blokového diagramu
Některé uzly jemnější strukturu nemají. Celá plocha jejich ikony představuje jeden jediný terminál. To je právě případ uzlů, které přísluší objektům čelního panelu. Například objekt Formule čelního panelu z obr. 1.3 přísluší objektu Formule blokového diagramu, jak napovídá obrázek 1.5.
←→ Obrázek 1.5: Dvě reprezentace téhož objektu
Pro jednoduchost budeme takové uzly nazývat přímo terminály, neboť graficky oba objekty splývají. Jednotlivé terminály je možno vzájemně propojovat hranami. Propojení se provede cívkou s nití ( ) postupným klepnutím na jeden a na druhý terminál. Pokud takto vytvořená hrana odporuje pravidlům pro propojování terminálů, zobrazí se jako tenká černá čárkovaná čára. V opačném případě bude hrana reprezentována jiným typem čáry. Hrana může být obecně lomená čára. Klepnutím myší hranu ukotvujeme k pracovní ploše blokového diagramu. VI z obrázku 1.3 najde čtenář v archivu příkladů pod názvem 2.vi.
1.5.2
Princip
Stejně jako objektům čelního panelu, přísluší i jednotlivým terminálům uzlů v blokovém diagramu role Control nebo Indicator. Pokud terminál přísluší objektu čelního panelu, má s ním shodnou roli. V ostatních případech je terminál typu Indicator takový terminál, který Data „přijímáÿ a terminál typu Control takový terminál, který data „generujeÿ.
1.6. DRUHÝ PROGRAM
11
Například Tahový potenciometr v roli Control generuje číslo. Toto číslo se v blokovém diagramu „objevíÿ na terminálu tahového potenciometru. Pokud je tento uzel spojený hranou s jiným terminálem, zkopíruje se toto číslo na onen terminál. Data tedy jakoby „tečouÿ z uzlu typu Control do všech uzlů typu Indicator které jsou s ním spojeny hranou. V blokovém diagramu je možné spojit jeden terminál typu Control s několika terminály typu Indicator. Není možné vzájemně propojit dva nebo více terminálů typu Control. Tato skutečnost je pravděpodobně v souladu s intuitivní představou čtenáře. Data „putujíÿ po hranách vždy směrem od terminálu typu Control k terminálům typu Indicator. Při tom nezáleží na vizuální orientaci hrany v blokovém diagramu. „Data mohou po hraně téci stejně dobře zleva doprava jako v jakémkoliv jiném směru.ÿ Uzel blokového diagramu je analogií k příkazu textově orientovaného programovacího jazyka. Uzel je „výkonná jednotkaÿ programu v LabVIEW. V běžném textově orientovaném programování se jednotlivé příkazy provádějí v pořadí ve kterém jsou uvedeny ve zdrojovém kódu programu. Běh VI se však řídí zvláštními pravidly. K provedení libovolného uzlu blokového diagramu dojde v okamžiku kdy na všech jeho vstupních terminálech jsou připravena data. Jakmile všechny interní operace daného uzlu zkončí, jsou výsledky těchto vnitřních operací vyslány na jeho výstupní terminály, odkud se šíří blokovým diagramem dále. Tento mechanizmus běhu programu, resp. spouštění jednotlivých uzlů VI se označuje jako Data Flow Execution System. Programování založené na tomto přístupu se nazývá Data Flow Programming. Blokové schéma VI může obsahovat několik autonomních částí, např. několik nezávislých výpočtů, které se za běhu VI vykonávají paralelně. Tento rys jazyka G však přímo nesouvisí s tzv. Multithreadingem. O vytváření vícevláknových aplikací se stručně zmíníme později. LabVIEW jejich tvorbu podporuje. Vše si ozřejmíme na následujícím příkladu:
1.6
Druhý program
Vytvoříme program, který bude vzájemně násobit dvě čísla. Otevřeme nové VI. Do čelního panelu vložíme dva objekty Controls → Numeric - Digital Control pro vkládání čísel a jeden Controls → Numeric - Digital Indicator, ve kterém zobrazíme výsledek. Šipkou ( ) objekty rozmístíme na ploše a popřípadě upravíme velikost okna. Popisovačem ( ) upravíme popisky objektů čelního panelu tak, aby první Digital Control měl popisek X, druhý Y a nakonec aby Digital Indicator, v němž chceme zobrazit výsledek, měl popisek Z. V okně blokového diagramu se již objevily tři nové uzly. Každý z nich přísluší jednomu z objektů čelního panelu. Odpovídající si objekty mají nejen shodný popisek, ale klepneme-li
12
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
dvakrát myší na některý, zvýrazní se jemu příslušný objekt. Tato funkce je zvláště výhodná, pracujeme-li s komplikovaným blokovým diagramem. Jak jsme si již dříve řekli, budeme uzly, které odpovídají některému z objektů čelního panelu, nazývat přímo terminály, neboť každý z těchto uzlů má jen jeden jediný terminál, který graficky pokrývá celou jeho plochu. Uzel od terminálu tedy stejně nelze v tomto případě opticky rozlišit. Dále jsme řekli, že nezáleží na směru, ve kterém se data po hranách „šíříÿ, tedy že nezáleží na konkrétním rozmístění uzlů v okně blokového diagramu. Přesto je vhodné rozmisťovat uzly postupně zleva doprava tak, jak jsme zvyklí číst. Zvýší se tím přehlednost diagramu. Navíc většina uzlů je koncipována tak, že jejich vstupní terminály se nachází obvykle na jejich levé straně a výstupní obvykle na pravé. Toto ovšem není pravidlem. Uzel Functions → Numeric - Multiply ( ) má jednotlivé terminály rozmístěny následovně: ( ). Vlevo pod sebou leží terminály vstupní pro jednotlivé součinitele a vpravo pak terminál výstupní pro výsledek. Nyní umístíme do blokového diagramu uzel Functions → Numeric - Multiply a pomocí cívky s nití ( ) vytvoříme blokový diagram podle obr. 1.6.
Obrázek 1.6: VI pro násobení dvou čísel
Program je hotový a můžeme jej spustit. Chceme, aby probíhal cyklicky, použijeme tedy tlačítko Run Continuously. ( ). Jakmile vložíme do okének X a Y nové číslo, hodnota výsledku v okénku Z se ihned změní.
1.7
Vizualizace a sledování běhu VI
Nechme nyní náš program běžet a zaostřeme na okno blokového diagramu. V jeho horní části vidíme tlačítko Highlight Execution. Má podobu malé žárovky ( ). Když na ni klepneme, rozsvítí se ( ) a po jednotlivých hranách diagramu se začnou „pohybovat dataÿ v podobě malých barevných terčíků. Navíc se u jednotlivých terminálů objevují okénka s aktuálními hodnotami, jak vidíme i na obr. 1.7.
Obrázek 1.7: Highlight Execution
1.7. VIZUALIZACE A SLEDOVÁNÍ BĚHU VI
13
Highlighting of Execution, tedy vizualizace běhu VI je výborná pomůcka pro pochopení principu běhu VI. Zároveň usnadňuje hledání chyb v programu. Zastavme nyní naše VI (např. kombinací Ctrl-.). Pomocí tlačítka Step Into ( ) můžeme nařídit provedení právě jednoho elementárního kroku VI. Při tom, pokud je to možné, sledujeme i vnitřní strukturu jednotlivých uzlů. Uzel multiply z našeho hlediska nemá žádnou jemnější strukturu, je „atomickýÿ. Instrukce Step Into má v tomto případě stejný efekt jako Step Over ( ), kteroužto instrukcí způsobíme provedení jednoho uzlu blokového diagramu. Při tom nás nezajímá případná vnitřní struktura tohoto uzlu. Pokud již nemáme v úmyslu sledovat běh VI po jednotlivých krocích, můžeme nařídit souvislé dokončení všech operací blokového diagramu zmáčknutím tlačítka Finish Block Diagram ( ). Běžící VI je možno pozastavit tlačítkem Pause (
).
Dále je možné do blokového diagramu umístit zarážku. Provedeme to speciálním kurzorem myši, Set/Clear Breakpoint ( ). Připomeňme, že tento kurzor lze nastavit např. pomocí palety Tools. Zarážka je pak v blokovém diagramu znázorněna červeným terčíkem ( ). Po spuštění VI budou provedeny všechny operace předcházející zarážce (Breakpoint). Na pozici zarážky se provádění VI pozastaví. Pozastavené VI lze opět „rozběhnoutÿ instrukcí Run ( ), nebo Run Continuously ( ). Pozastavené VI lze rovněž „krokovatÿ jak bylo výše popsáno. Zrušení zarážky provedeme opět kurzorem Set/Clear Breakpoint ( ). Pomocí speciálního kurzoru probe ( ) je možno v pozastaveném VI kontrolovat aktuální hodnoty na jednotlivých hranách. Nejvýstižnějším označením kurzoru probe bude patrně zkoušečka. Demonstraci použití zkoušečky ve spojení se zarážkou vidíme na obr. 1.8.
Obrázek 1.8: Demonstrace použití nástroje zkoušečka
Jakmile klepneme zkoušečkou do některého místa blokového diagramu, objeví se v tom místě číselná kóta a otevře se nové okénko. Hodnota kóty koresponduje s číslicí v záhlaví okénka. V okénku se zobrazuje aktuální data v místě kóty. Pokud zavřeme okénko klepnutím na křížek v jeho pravém horním rohu, zmizí i kóta.
14
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
1.8
Datové typy
Stejně jako je tomu v běžných textově orientovaných programovacích jazycích, existují i v LabVIEW, resp. v jazyce G datové typy. Datový typ lze názorně chápat jako vlastnost hrany diagramu a také jako vlastnost určitého terminálu. Hrana určitého datového typu „umí přenášetÿ pouze určitý typ dat. Výstupní terminál generuje určitý typ dat. Vstupní terminál akceptuje určitý typ dat. Dále tedy budeme mluvit o datovém typu hrany a o datovém typu terminálu. Kromě obvyklých datových typů na které jsme zvyklí z běžných textově orientovaných programovacích jazyků nabízí jazyk G i některé „netypickéÿ datové typy jako např. datový typ disková cesta, datový typ obrázek a další „podivnéÿ datové typy. V následujícím textu nebude uveden kompletní seznam všech datových typů jazyka G. Tento kompletní a přehledný seznam najde čtenář jak v elektronické nápovědě LabVIEW, tak i v [8]. Navíc, konkrétní implementace některých datových typů je částečně závislá na operačním systému pod kterým LabVIEW provozujeme. Datový typ hrany je v blokovém diagramu určen typem čáry, která hranu reprezentuje. Datový typ terminálu, který přísluší nějakému objektu čelního panelu je určen ikonou, která terminál reprezentuje. Datový typ terminálů obecného uzlu blokového diagramu není explicitně graficky vyjádřen. Vzájemně spojené uzly a hrany mají samozřejmě shodný datový typ. Vypovídací hodnota ) vidíme dva uzly propojené hranou. jejich grafického vyjádření však není stejná. Zde: ( Pravý uzel odpovídá nějakému objektu čelního panelu a graficky splývá se svým jediným terminálem, takže pravý uzel nazýváme přímo terminálem, jak již bylo dříve zavedeno. Výstupní terminál levého uzlu a pravý terminál mají shodný datový typ. Jde o Double-precision floating-point numeric. Výstupní terminál levého uzlu není vůbec graficky vyznačen, takže na jeho datový typ můžeme usuzovat jedině z typu čáry která reprezentuje z něj vycházející hranu, nebo z grafické reprezentace pravého uzlu. Tato hrana je reprezentovaná tenkou oranžovou čarou. Odtud lze zjistit, že datový typ této hrany je floating-point numeric. Mezi floating-point numeric se však řadí také např. Complex extended-precision floating-point numeric, což je datový typ komplexních čísel. A konečně z ikony pravého uzlu lze vyčíst kompletní informaci o jeho datovém typu. Následující tabulka 1.3 uvádí seznam datových typů pro vybrané hrany. Levý sloupec obsahuje grafickou reprezentaci hrany a v pravém sloupci je uveden výčet datových typů, které mohou hraně s danou grafickou reprezentací odpovídat. Mezi uzly blokového diagramu mají zvláštní postavení ty uzly, které odpovídají nějakému objektu čelního panelu. Tyto uzly jsou vybaveny pouze jediným terminálem, který pokrývá celou plochu jejich ikony. V následujícím textu budeme takové uzly nazývat Terminálními uzly. Z ikony která reprezentuje terminální uzel lze jednoznačně určit datový typ i skutečnost, zda je daný uzel vstupní (tedy typu Indicator), nebo výstupní (tedy typu Control). Tabulka 1.2 uvádí datové typy vybraných terminálních uzlů. Kompletní seznam najde
1.9. KONSTANTY
15
čtenář v [8] i v elektronické nápovědě LabVIEW pod heslem „data typesÿ.
1.9
Konstanty
Do blokového diagramu je možné vložit konstantu. Každé konstantě přísluší v jazyce G datový typ. Lze vytvořit konstantu libovolného datového typu jazyka G. Každá konstanta je výstupním uzlem. Konstanta bývá obvykle reprezentovaná ikonou obdélníkového tvaru, jejíž barva a vzhled závisí na datovém typu konstanty.
1.9.1
číselná konstanta
Pro vytvoření číselné konstanty vložíme do blokového diagramu uzel Functions → Numeric - Numeric Constant. Datový typ konstanty se automaticky upraví podle čísla, které do okénka v ikoně konstanty vepíšeme popisovačem ( ). Například vepíšeme-li do něj číslo 10, bude konstanta reprezentována modrým obdélníčkem ( ) a její datový typ bude celočíselný. Pokud do ikony vepíšeme např. říslo 1,23, bude ikona reprezentována obdélníčkem oranžové barvy ( ) a bude reálného datového typu. Datový typ konstanty můžeme přesněji specifikovat klepnutím pravým tlačítkem myši na ikonu konstanty a volbou položky Representation. Ve stejné nabídce se nachází i volba Format & precision. Pomocí ní můžeme určit způsob zobrazování hodnoty konstanty, ne však její „skutečnouÿ přesnost. Ta je dána datovým typem konstanty. V nabídce Functions → Numeric → Additional Numeric Constants najdeme množství předdefinovaných konstant, jako např. π ( ), elementární náboj e ( ), gravitační konstantu g ( ) a mnoho dalších.
1.9.2
řetězcová konstanta
Pro vytvoření řetězcové konstanty vložíme do blokového diagramu uzel Functions → String. Má podobu růžového obdélníčku ( ). Do něj můžeme vepsat hodnotu konstanty ( ). Pro vkládání speciálních znaků se používají tzv. backslash sekvence, což je řetězec složený ze zpětného lomítka a hexadecimálního čísla (Např. \FA). Hexadecimální číslo musí být v rozmezí 00. .FF a musí obsahovat pouze číslice a velká písmena. Hexadecimální číslo vyjadřuje ordinální hodnotu znaku v použitém kódování. 3 . Používání backslash sekvencí můžeme povolit nebo zakázat v menu pod pravým tlačítkem myši umístěné nad ikonou konstanty (položka ’\’ Codes Display). Pro správné zobrazení znaků české abecedy je nutné zvolit vhodný font. Volbu fontu pro blokový diagram provedeme v záhlaví okna blokového diagramu klepnutím na podlouhlé tlačítko s názvem aktuálně nastaveného fontu ( ). Standartní Application Font 3
Operační systémy Windows používají pro český jazyk kódování Windows 1250, operační systémy typu UNIX obvykle kódování ISO 8859-2 někdy též označované jako ISO Latin 2
16
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
Control
Indicator
Popis Single-precision floating-point numeric Datový typ reálných čísel. Číslo je v paměti uloženo binárně v 32 bitech. Nejmenší zobrazitelné kladné číslo: 1.40e-45, největší zobrazitelné kladné číslo: 3.40e+38, nejmenší zobrazitelné záporné číslo: -1.40e-45, největší zobrazitelné záporné číslo: -3.40e+38. Počet platných desetinných míst: 6.
Double-precision floating-point numeric Datový typ reálných čísel. Číslo je v paměti uloženo binárně v 64 bitech. Nejmenší zobrazitelné kladné číslo: 4.94e-324, největší zobrazitelné kladné číslo: 1.79e+308, nejmenší zobrazitelné záporné číslo: -4.94e-324, největší zobrazitelné záporné číslo: -1.79e+308, Počet platných desetinných míst: 15.
Extended-precision floating-point numeric Datový typ reálných čísel. Číslo je v paměti uloženo binárně v 128 bitech. Nejmenší zobrazitelné kladné číslo: 6.48e-4966, největší zobrazitelné kladné číslo: 1.19e+4932, nejmenší zobrazitelné záporné číslo: -6.48e-4966, největší zobrazitelné záporné číslo: -1.19e+4932. Počet platných desetinných míst je závislý na operačním systému pod kterým LabVIEW provozujeme a pohybuje se mezi 15 a 30.
Signed 8-bit integer numeric Celočíselný datový typ. Číslo je v paměti uloženo binárně v 8 bitech. Rozsah zobrazení: -128 . . 127.
Signed 16-bit integer numeric Celočíselný datový typ. Číslo je v paměti uloženo binárně v 16 bitech. Rozsah zobrazení: -32768 . . 32767.
Signed 32-bit integer numeric Celočíselný datový typ. Číslo je v paměti uloženo binárně v 32 bitech. Rozsah zobrazení: -2147483648 . . 2147483647.
Unsigned 8-bit integer numeric Celočíselný datový typ bez znaménka. Číslo je v paměti uloženo binárně v 8 bitech. Rozsah zobrazení: 0. .255.
Unsigned 16-bit integer numeric Celočíselný datový typ bez znaménka. Číslo je v paměti uloženo binárně v 16 bitech. Rozsah zobrazení: 0. .65535.
Unsigned 32-bit integer numeric Celočíselný datový typ bez znaménka. Číslo je v paměti uloženo binárně v 32 bitech. Rozsah zobrazení: 0. .4294967295.
Boolean Logický datový typ.
String Datový typ řetězec.
Array Datový typ pole. Barva ikony závisí na typu prvků pole.
Cluster Tento datový typ přibližně odpovídá typu Record známému z Pascalu nebo Delphi. Barva ikony závisí na typu prvků Clusteru. Pokud jsou všechny prvky clusteru stejného typu, barva ikony je hnědá, pokud různého typu, barva je růžová.
Path Disková cesta. Tento datový typ se liší od typu String.
Waveform Typ waveform je možné chápat jako specializaci typu Cluster s pevně danou strukturou. Obsahuje položky t0, dt a jednorozměrné číselné pole. Často se používá pro zpracování ekvidistantních dat. Jazyk G nabízí množství výkonných funkcí pracujících s tímto datovým typem.
Tabulka 1.2: Datové typy některých terminálních uzlů
1.9. KONSTANTY
17
floating-point numeric (Single-precision floating-point numeric, Double-precision floating-point numeric, Extended-precision floating-point numeric, Complex single-precision floating-point numeric, Complex double-precision floating-point numeric, Complex extended-precision floating-point numeric)
integer numeric (Signed 8-bit integer numeric, Signed 16-bit integer numeric, Signed 32-bit integer numeric, Unsigned 8-bit integer numeric, Unsigned 16-bit integer numeric, Unsigned 32-bit integer numeric, Enumerated type)
boolean string jednorozměrné pole s prvky typu integer numeric (tedy 6 možností, jak vyplývá z 1. řádku této tabulky)
dvourozměrné pole s prvky typu integer numeric (tedy 6 možností, jak vyplývá z 2. řádku této tabulky)
Cluster (Složený datový typ obdobný např typu pascalovskému typu record) Pokud jsou všechny prvky clusteru stejného typu, barva je hnědá, pokud různého typu, barva je růžová
Tabulka 1.3: Datové typy některých hran
je zpravidla nutné nahradit fontem, jehož název končí na „CEÿ, např. Arial CE. Poznamenejme, že pro každý textový prvek blokového diagramu lze nastavit jiný font. Také pro jednotlivé prvky čelního panelu lze nastavit font analogickým způsobem v okně čelního panelu. To znamená, že při nevhodném nastavení fontů může být tentýž řetězec v různých prvcích zobrazen různě. Na paletě Functions → String najdeme také několik předdefinovaných konstant, jako např. prázdný řetězec ( ), znak Carriage Return ( ) nebo znak End Of Line ( ).
1.9.3
konstanta typu pole
Dále můžeme nadefinovat konstantu typu pole (Array). Do blokového diagramu vložíme uzel Functions → Array - Array Constant. Tím však definice konstanty typu pole nezkončila. Nyní musíme určit typ prvků pole. To provedeme vložením konstanty příslušného typu do ikony konstanty pole. Je zřejmé že takto lze vytvářet komplikované datové struktury, např. pole jehož prvky jsou typu Cluster atd. Není však možné vytvořit pole, jehož jednotlivé prvky budou opět typu pole. Pokud chceme zvýšit dimenzi naší konstanty, klepneme na její ikonu pravým tlačítkem myši a v menu které se objeví vybereme AddDimension. Chceme-li například vytvořit vektor celých čísel, tedy pole dimenze 1 s prvky typu Integer, vložíme do blokového diagramu Functions → Array - Array Constant a do jeho ikony ještě vložíme Functions → Numeric - Numeric Constant. Šipkou ( ) uchopíme např. spodní pravý roh ikony konstanty pole a tažením zobrazíme určitý počet prvků. Tím jsme vytvořili „posunovací okénkoÿ které můžeme v rámci naší jediné dimenze „po konstantě posunovatÿ pomocí malých šipek, které jsou součástí ikony naší konstanty. Vzniklá konstanta bude se ). Nula v levém okénku ikony indikuje, že v prvním ze tří prvků bude podobat ( které v našem „posunovacím okénkuÿ vidíme, má index nula.
18
1.9.4
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
konstanta typu Cluster
Postup vytváření konstanty typu Cluster je analogický postupu vytváření konstanty typu pole. Do „základníÿ ikony postupně vložíme konstanty, ze kterých se skládá. Příklad: Vytvořme konstantu Typu Cluster, která bude obsahovat 3 položky: konstantu typu jednorozměrné pole celých čísel, konstantu typu Floating point a řetězcovou konstantu. Příslušné blokové schéma vidíme na následujícím obrázku 1.9. Na obrázku je navíc znázorněn i způsob pro přístup k jednotlivým položkám této složené konstanty. Jednotlivé položky se zpřístupní pomocí funkce Functions → Cluster - Unbundle. Na obrázku 1.9 jsou dále jednotlivé položky vyvedeny do terminálních uzlů které odpovídají prvkům čelního panelu, v nichž se zobrazí.
Obrázek 1.9: Konstanta typu Cluster
Bylo by samozřejmě možné nadefinovat tyto tři konstanty zvlášť, avšak potom by od každé z nich vedla samostatná hrana, a tím by se znepřehlednil blokový diagram. Nikoho snad nepřekvapí, že stejnou konstantu lze nadefinovat také způsobem z obrázku 1.10 s využitím funkce Functions → Cluster - Bundle.
Obrázek 1.10: Konstanta typu Cluster jinak
VI s blokovým diagramem z obrázků 1.9 a 1.10 je uloženo v archivu příkladů pod názvem 004.vi.
1.9.5
logická konstanta
Logickou konstantu reprezentuje v blokovém diagramu ikona v podobě zeleného obdélníčku Functions → Boolean - True Constant ( ) pro logickou hodnotu „Pravdaÿ a Functions → Boolean - False Constant ( ) pro logickou hodnotu „nepravdaÿ.
1.10
Objekty typu Control a Indicator
Nyní popíšeme souvislost mezi konstantou, objektem typu Control a objektem typu Indicator. Připomeňme, že konstanta je v podstatě výstupním terminálem. Také prvek typu Control je
1.11. JAK NEJRYCHLEJI NAPSAT PROGRAM?
19
v blokovém diagramu reprezentovaný výstupním terminálem. Objekt typu Indicator reprezentuje v blokovém diagramu vstupní terminál. Je zřejmé, že v blokovém diagramu nelze „beztrestněÿ zaměnit vstupní terminál za výstupní, neboť podle pravidel pro tvorbu blokového diagramu může jedna hrana spojovat pouze jeden terminál výstupní s jedním nebo s více terminály vstupními, jak již bylo řečeno. Každá záměna vstupního terminálu za výstupní v korektně utvořeném blokovém diagramu nutně způsobí porušení pravidel. Existuje elegantní způsob pro vzájemnou záměnu uzlů typu konstanta, Control a Indicator v blokovém diagramu. Technicky se provede tak, že na ikonu reprezentující příslušný uzel klepneme pravým tlačítkem myši a v menu, které se objeví zvolíme Change to Control popř. Change to Indicator popř. Change to Constant. „Původníÿ a „novýÿ uzel mají vždy shodný datový typ a shodnou hodnotu. Každou konstantu lze zaměnit za ekvivalentní4 uzel typu Control a opačně. V čelním panelu při tom vznikne, resp. zanikne ovládací prvek. Tato změna nenaruší funkčnost VI. Každou konstantu nebo prvek typu Control lze zaměnit za prvek typu Indicator a opačně. Tato změna vždy naruší funkčnost VI, takže je následně nutno provést další úpravy v blokovém diagramu. Možnost záměny konstanty za objekt typu Control je velmi výhodná v momentě, kdy ladíme VI a hledáme vhodnou hodnotu. Například pokud hledáme vhodný stupeň aproximačního polynomu pro metodu nejmenších čtverců víme-li, že vstupní data budou vždy stejného „charakteruÿ. Jakmile nalezneme vhodnou hodnotu, změníme daný Control na konstantu a tím nalezenou hodnotu zafixujeme. Souhrnně lze tedy říci že pro každý datový typ lze vytvořit Konstantu, Control i Indicator. Objekty typu Control a Indicator mají v čelním panelu svou reprezentaci, jejíž grafickou podobu lze všemožně upravovat k zajištění maximálního uživatelského pohodlí při interakci s programem.
1.11
Jak nejrychleji napsat program?
Pokud přistupujeme k tvorbě VI tak, že nejprve vložíme do čelního panelu potřebné ovládací prvky a teprve potom se věnujeme tvorbě blokového diagramu, postupujeme jistě správně. Musíme si ovšem předem rozmyslet jakého datového typu budou jednotlivé ovládací prvky. Jiný korektní způsob tvorby VI spočívá v opačném postupu: Nejprve zhruba vytvoříme blokový diagram, to znamená že do okna blokového diagramu naskládáme všechny, nebo alespoň většinu uzlů nutných pro správnou funkci VI a teprve poté přistoupíme k tvorbě čelního panelu. Na tomto místě nás však čeká příjemné překvapení: Chceme-li k určitému terminálu 4
ekvivalentní ve výše uvedeném smyslu
20
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
připojit ovládací prvek (tedy Control nebo Indicator) nebo konstantu, stačí na onen terminál klepnout pravým tlačítkem myši a v menu které se objeví zvolit Create Control, popř. Create Indicator, popř. Create Constant. Pokud toto provedeme, vytvoří se automaticky kýžený objekt vhodného datového typu. Na závěr pouze vhodným způsobem rozmístíme a upravíme ovládací prvky na čelním panelu a nastavíme velikost okna.
1.12
Paleta Functions pod drobnohledem
Připomeňme, že paleta Functions má stromovou strukturu. Podívejme se nyní podrobněji na některé „subpaletyÿ v hloubce jedna tohoto stromu.
Functions → Numeric obsahuje uzly pro práci s čísly. Patří sem aritmetické, trigonometrické, logaritmické a komplexní funkce. Najdeme zde také funkce pro typovou konverzi, uzel pro tvorbu číselné konstanty a několik předdefinovaných číselných konstant. Functions → Boolean obsahuje uzly pro logické operace. Patří sem zejména základní logické funkce, uzly pro aplikaci logických operací na prvky pole logických hodnot, funkce pro typovou kon verzi a 2 logické konstanty. Functions → String obsahuje uzly pro operace nad řetězci, jako např. spojení řetězců, nalezení podřetězce v řetězci, určení délky řetězce, konverzní funkce pro převod řetězce na číslo a opačně a podobně. Functions → Array obsahuje uzly pro práci s poli. Typickými akcemi nad polem jsou např. vytvoření pole, výběr prvků s určitou vlastností z pole, přidání prvků do pole, rozdělení pole na části atd. Functions → Cluster obsahuje uzly pro práci s Clustery. Patří sem funkce Bundle pro vytvoření Clusteru z jednotlivých složek a k ní opačná funkce Unbundle pro rozklad Clusteru na jednotlivé složky, dále analogické funkce Bundle by name a Unbundle by Name, které navíc umožňují jednotlivé složky Clusteru pojmenovat. Dále zde najdeme uzly pro konverzi typů a uzel pro tvorbu konstanty typu Cluster. Functions → Comparsion obsahuje uzly pro porovnávání logických a číselných hodnot, řetězců, clusterů a polí. Functions → Time & Dialog zde se nachází funkce pro zjištění aktuálního data a přesného času a funkce pro pozdržení činnosti VI. Do této subpalety byly též zařazeny uzly pro zobrazování dialogových oken a informačních oken. Functions → File I/O obsahuje uzly pro práci s textovými i speciálními soubory. Najdeme zde jak primitivní uzly provádějící elementární operace nad soubory, tak i komplexní uzel pro zformátování dat, zobrazení dialogového okna pro výběr diskové cesty a názvu souboru a uložení dat. Functions → Waveform obsahuje uzly pro manipulaci s daty typu Waveform.
1.12. PALETA FUNCTIONS POD DROBNOHLEDEM
21
Functions → Application Control obsahuje uzly pro řízení běhu VI. Patří mezi ně např. uzel pro zastavení běhu VI nebo uzel pro zastavení běhu VI a ukončení LabVIEW. Nyní je nezbytné, aby si čtenář paletu Functions sám důkladně prohlédl. Schopnost orientovat se v této paletě je naprosto nezbytná při programování. Elektronická nápověda LabVIEW obsahuje kompletní popis každého prvku palety Functions a to snad v nejnázornějším možném uspořádání - interaktivně. Otevřeme okno elektronické nápovědy (Ctrl-?). V Indexu vyhledáme heslo „palettesÿ. Objeví se paleta functions, kterou můžeme interaktivně procházet klepáním myší na její ikony. Ke zvolenému objektu palety bude zobrazen vyčerpávající popis.
1.12.1
Uzly s nastavitelným počtem terminálů
Některé uzly mají nastavitelný počet vstupních a nebo výstupních terminálů. Příkladem takového uzlu je Functions → Numeric - Compound Arithmetic. Viz obr. 1.11. Umí aplikovat některou z operací (+, *, AND, OR, XOR) na určitý počet operandů. Po vložení do blokového diagramu je Compound Arithmetic vybaven dvěma vstupními terminály a jedním výstupním. Tažením šipkou ( ) za roh ikony docílíme změny počtu (v tomto případě vstupních) terminálů. Analogickým způsobem se chovají i další uzly z palety Functions.
Obrázek 1.11: Compound Arithmetic s různým počtem vstupních terminálů
1.12.2
Polymorfní uzly
Některé uzly jsou schopny přijímat a produkovat data různých datových typů. Tak například uzel Functions → Numeric - Add, který provádí sčítání, lze aplikovat nejen na dvě čísla, nýbrž i na číslo a jednorozměrné pole, na dvě jednorozměrná pole a tak dále. 5 Následující obrázek 1.12 dokumentuje 3 vybrané případy aplikace uzlu Add na data různého datového typu.
Obrázek 1.12: Polymorfizmus uzlu Add 5
Výčet všech možností spolu s popisem chování uzlu Add nelezne čtenář v elektronické nápovědě.
22
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
VI s blokovým diagramem uvedeným na obr. 1.12 nalezne čtenář v archivu příkladů pod názvem 011.vi. Po spuštění se na terminálu A objeví hodnota 3,5, na terminálu B jednorozměrné pole 45678 a na terminálu C jednorozměrné pole 66666. Uzel Add je v blokovém diagramu vždy reprezentován stejnou ikonou ( ), přestože ve skutečnosti provádí pokaždé jinou činnost. Ve skutečnosti existuje několik různých implementací uzlu Add. Vhodná implementace se zvolí podle typu dat na která má být uzel aplikován. V tomto případě říkáme, že uzel Add je polymorfní. Téměř všechny uzly z palety functions jsou polymorfní. Zejména z tohoto důvodu je programování v LabVIEW tolik intuitivní. Velmi zřídka se během programování setkáme s typovou nekompatibilitou jednotlivých uzlů. Vhodnou implementaci polymorfních uzlů lze určit již v době překladu VI a proto tahle pozornost programátorovi není vyvážena žádným zpomalením běhu přeloženého VI.
1.13
řídící struktury programu
V tomto odstavci se zmíníme o cyklech FOR a WHILE, o struktuře pro větvení programu CASE a o struktuře, Sequence, která se programátorovi zvyklému používat klasický textově orientovaný jazyk, pravděpodobně zdá ze všech nejpodivnější. Řídící struktury programu jsou v blokovém diagramu reprezentovány rámečky, které obklopují tu část blokového diagramu, na kterou se vztahují.
1.13.1
cyklus FOR
Cyklus FOR slouží k N-násobnému provedení části blokového diagramu, kde N známe před vstupem o cyklu. Najdeme jej v Functions → Structures - For Loop. V blokovém diagramu je reprezentován ikonou z obr. 1.13.
Obrázek 1.13: Cyklus FOR
Velikost rámečeku ikony cyklu FOR lze měnit tažením šipkou ( ) za některý roh ikony. Ta část blokového diagramu, která má být cyklicky prováděna musí být uvnitř rámečku ikony cyklu FOR. Počet opakování je dán hodnotou přivedenou k terminálu ( ). Počet již vykonaných opakování lze číst z terminálu ( ). Počítání začíná od nuly, tedy během prvního průchodu cyklem je i = 0, během posledního průchodu cyklem je i = N − 1. Průchod cyklem
1.13. ŘÍDÍCÍ STRUKTURY PROGRAMU
23
nazýváme též iterací. Z venčí mohou do cyklu vcházet a vycházet hrany. Místu, kde hrana protíná rámeček ikony cyklu říkáme tunel. Hrany, po kterých do cyklu vcházejí data procházejí vstupním tunelem. Hrany po kterých data vycházejí z cyklu ven procházejí výstupním tunelem. Tunel je reprezentován barevným čtverečkem. Tunel není nutné samostatně vytvářet, vytváří se automaticky, jakmile vedeme nějakou hranu přes hranice ikony cyklu. Zajímavé jsou zejména výstupní tunely. Mají vlastnost Indexing6 , kterou lze zapnout nebo vypnout, klepneme-li na tunel pravým tlačítkem myši a zvolíme-li v menu které se objeví položku Enable Indexing, resp. Disable Indexing. Tunel se zakázaným indexováním má podobu vybarveného čtverečku ( ), uzel s povoleným indexováním má podobu nevybarveného čtverečku ( ). Prvotní představa: Cyklus FOR se během své činnosti chová tak, jako by na začátku každé iterace přečetl data na vstupních tunelech poté provedl onu iteraci a na jejím konci odeslal data do výstupních tunelů. Skutečnost: Ve skutečnosti se data ze vstupních tunelů čtou pouze na začátku první iterace a na výstupní tunely jsou data odeslána až po skončení poslední iterace. Pokud má výstupní tunel zakázáno indexování ( ), vychází z něj jediná hodnota, tak jak pravděpodobně čtenář předpokládá. Pokud má však výstupní tunel indexování povoleno ( ), vychází z něj jednorozměrné pole složené ze všech hodnot, které by na tento uzel dorazily během každé iterace podle Prvotní představy. Na závěr našeho povídání o cyklu FOR zmiňme ještě Posunovací registry (Shift registers). Posunovací registr přidáme do cykou FOR kliknutím na rámeček jeho cyklu a volbou Add Shift Register v menu, které se objeví. Posunovací registr z cyklu odstraníme tak, že alespoň jednu z jeho párových ikon označíme šipkou ( ) a smažeme klávesou Del. Posunonací registr umožňuje přenést nějakou hodnotu z přítomné iterace do následující, nebo chceme-li, z minulé do přítomné. Každý cyklus FOR můžeme „vybavitÿ libovolným počtem posunovacích registrů. Posunovací registr je reprezentován párovými ikonami na svislých stranách rámečku ikony cyklu. Odpovídající si ikony jednoho páru se vždy nacházejí ve stejné výšce. Pravá párová ikona představuje vstupní terminál pro hodnotu, kterou chceme „poslatÿ do následující iterace. Levá párová ikona představuje výstupní terminál, ze kterého můžeme v současné iteraci přečíst hodnotu. Na začátku provádění cyklu FOR lze z vnějšku ikony cyklu FOR přivést k levé párové ikoně posunovacího registru inicializační hodnotu. Po skončení poslední iterace cyklu FOR lze z pravé párové ikony posunovacího registru přečíst výstupní hodnotu. Vše ozřejmíme na následujícím obrázku 1.14. A a B jsou párové ikony jediného posunovacího registru, který na obr. 1.14 vidíme. F značí, že cyklus má mít 10 iterací. G značí, že posunovací registr bude před první iterací inicializován na hodnotu 0. E je jediným uzlem blokového diagramu, který má být opakovaně prováděn. Jde o Functions → Numeric - Increment, přičítá jedničku. C je výstupní tunel se zakázaným indexováním. D je výstupní tunel s povoleným indexováním. Po skončení cyklu 6
Vstupní tunely mají taktéž vlastnost Indexing. Pokud přivedeme na vstupní tunel cyklu jednorozměrné pole a zapneme indexování, máme možnost uvnitř cyklu pohodlně procházet jednotlivé prvky pole.
24
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
Obrázek 1.14: Příklad s cyklem FOR
se na terminálu H objeví číslo 10, na terminálu I číslo 9 a na terminálu J jednorozměrné pole celých čísel 0. .9. VI s blokovým diagramem z obrázku 1.14 najde čtenář v archivu příkladů pod názvem 005.vi.
1.13.2
cyklus WHILE
Cyklus WHILE slouží k opakovanému provádění části blokového diagramu. Opakování probíhá dokud má řídicí podmínka určitou logickou hodnotu. Testování platnosti řídicí podmínky se odehrává vždy po skončení iterace, takže první iterace se vykoná vždy. Cyklus WHILE najdeme v Functions → Structures - While loop. V blokovém diagramu jej reprezentuje ikona z obr. 1.15.
Obrázek 1.15: Cyklus WHILE
Stejně jako cyklus FOR, vztahuje se cyklus WHILE k té části blokového diagramu, kterou obklopuje rámečkem své ikony. Také v cyklu WHILE můžeme používat vstupní a výstupní tunely a posunovací registry. Vypadají stejně a chovají se také stejně tak, jak už bylo popsáno výše v odstavci o cyklu FOR. ( ) indikuje číslo iterace. Počítá se od nuly, tedy během prvního průchodu cyklem je i = 0. Ikona ( ) je standardním řídicím terminálem. Cyklus probíhá dokud na tento terminál přivádíme logickou hodnotu True. Na řídicí terminál však můžeme klepnout pravým tlačítkem myši a v menu, které se objeví vybrat položku Stop if True. Ikona řídicího terminálu pak změní podobu na ( ) a cyklus probíhá dokud na tento terminál přivádíme logickou hodnotu False. Samozřejmě, ikonu ( ) změníme zpět na ( ) volbou Continue if TRUE v tomtéž menu.
1.13. ŘÍDÍCÍ STRUKTURY PROGRAMU
25
Pokud k řídicímu terminálu cyklu WHILE přivádíme logickou hodnotu z nějakého vstupního tunelu, tedy „zvenčíÿ, cyklus buďto po první iteraci skončí, nebo bude probíhat donekonečna, což je pravděpodobně samozřejmé, protože k přečtení hodnot na vstupních tunelech dojde jen před první iterací. Pokud chceme zajistit, aby jednotlivé iterace probíhaly v určitých časových odstupech, vložíme do cyklu Functions → Time & Dialog - Wait Until Next ms Multiple k jehož vstupnímu terminálu připojíme konstantu. Hodnota této konstanty určí počet milisekund čekání. Pokud máme v blokovém diagramu více nezávislých cyklů, můžeme jim takto regulovat „priorituÿ. Během čekání navíc umožníme operačnímu systému, aby se věnoval i jiným běžícím procesům. To vede k „odlehčeníÿ systému.
Obrázek 1.16: Příklad s cyklem WHILE
Na obrázku 1.16 vidíme příklad s cyklem WHILE. Řídicí terminál je reprezentován ikonou ( ), takže cyklus probíhá dokud k němu přivádíme logickou hodnotu True. Functions → Numeric - Random Number (0-1) představuje generátor náhodných čísel z intervalu h0, 1i. Pokud je vygenerované náhodné číslo menší než 0,95, generuje Functions → Comparsion - Less? logickou hodnotu True. Mezi jednotlivými iteracemi je nastaven časový odstup 2 milisekundy 7 . Terminál Numeric, který je svázán s objektem Digital Indicator na čelním panelu čte pořadové číslo iterace a zobrazuje je na čelním panelu. Na čelním panelu by tedy bylo možné po jistou náhodně dlouhou dobu sledovat po jedničce se zvyšující číslice. VI s blokovým diagramem z obrázku 1.16 najde čtenář v archivu příkladů pod označením 006.vi.
1.13.3
struktura CASE
Předpokládejme, že za určitých okolností potřebujeme, aby byl vykonán program daný diagramem 1 a za jiných okolností program daný diagramem 2. V tom případě potřebujeme řídicí strukturu CASE. Vložíme do ní diagram 1 a diagram 2. Hodnota, kterou přivedeme na rozhodovací terminál struktury rozhodne o tom, který z diagramů bude vykonán. Strukturu CASE najdeme v Functions → Structures - Case. V blokovém diagramu je reprezentovaná ikonou z obrázku 1.17. Struktura CASE obsahuje dva nebo více diagramů. Jsou v ní uloženy „pod sebouÿ, takže v určitou chvíli je viditelný pouze jeden z nich. Každý z diagramů je umístěn v samostatném okénku. Mezi jednotlivými okénky lze přepínat pomocí šipek v horní části ikony struktury 7
Skutečně, časový odstup mezi jednotlivými iteracemi činí průměrně 2 milisekundy. Nastavené 2 milisekundy se nesčítají s časem potřebným na provedení zbytku těla cyklu.
26
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
Obrázek 1.17: Struktura CASE
CASE. Mezi těmito šipkami nalezneme políčko pro vložení řídicí konstanty pro aktuální (tedy právě viditelný) diagram. Na obrázku 1.17 je v tomto políčku uvedena logická hodnota True. Za běhu programu pak bude hodnota přivedená na rozhodovací terminál ( ) porovnána s řídicími konstantami všech políček struktury CASE a diagram v odpovídajícím políčku bude spuštěn. Na rozhodovací terminál lze přivést např. logickou nebo celočíselnou hodnotu, nebo hodnotu typu řetězec. Bezprostředně po vložení struktury case z palety Functions do blokového diagramu je rozhodovací terminál připraven pro příjem logické hodnoty a struktura CASE je vybavena dvěma prázdnými okénky pro vložení dvou diagramů. Přidání dalšího prázdného okénka provedeme klepnutím pravým tlačítkem myši na rámeček ikony struktury CASE a zvolením Add Case After, nebo Add Case Before. Odebrání aktuálního okénka provedeme volbou Delete This Case v tomtéž menu. Na obrázku 1.18 vidíme ukázkový blokový diagram. Struktura CASE je zde vložena do cyklu FOR.
Obrázek 1.18: Příklad se strukturou CASE
Na obrázku 1.19 vidíme zvlášť obě okénka struktury CASE z obrázku 1.18. VI s blokovým diagramem z obrázku 1.18 nalezne čtenář v archivu příkladů pod názvem 007.vi. Funguje následovně: Cyklus FOR má proběhnout desetkrát. Functions → Numeric Quotient & Reminder vrací zbytek po celočíselném dělení pořadového čísla iterace i dvojkou. 8 Functions → Comparsion - Equal to 0? tedy vrací logickou hodnotu True v případě, že i je sudé. V opačném případě vrací False. Struktura CASE způsobí, že je-li i sudé, je při8
Druhý výstupní terminál, který vrací výsledek celočíselného dělení není zapojen.
1.13. ŘÍDÍCÍ STRUKTURY PROGRAMU
27
Obrázek 1.19: jednotlivá okénka struktury CASE
vedeno na terminál A zatímco na terminál B se přivede nula. Pokud i je liché, přivede se na terminál B a na terminál A je přivedena nula. Terminály C a D mají zapnuto indexování, takže se na nich hodnoty „seřazujíÿ do jednorozměrných polí. Po skončení poslední iterace cyklu FOR obsahuje terminál Array pole „0020406080ÿ a terminál Array1 pole „0103050709ÿ. Pole Array tedy obsahuje pouze nuly a sudá čísla ∈ h0..9i, zatímco pole Array1 obsahuje nuly a lichá čísla ∈ h0..9i. Všimněme si, že všechny výstupní tunely struktury Case musí být spojeny s nějakým výstupním uzlem. Proto se na pozicích s indexem 1 až 9 ve výsledných polích Array a Array1 objevují nuly.
1.13.4
struktura SEQUENCE
Poslední řídicí strukturou jazyka G je SEQUENCE. Rozdíl mezi grafickým a textově orientovaným programováním, jsme již popsali v odstavci „Principÿ na straně 10. Řekli jsme, že v programu napsaném v textově orientovaném jazyce dochází k exekuci jednotlivých příkazů v pořadí, ve kterém jsou tyto příkazy uvedeny ve zdrojovém kódu programu. Exekuce jednotlivých uzlů blokového diagramu se řídí pravidly Data Flow Execution Systemu. K zajištění postupného provádění určitých částí blokového diagramu v určitém pořadí slouží v jazyce G řídicí struktura SEQUENCE. Najdeme ji v Functions → Structures Sequence. V blokovém diagramu je opět reprezentovaná ikonou v podobě rámečku, viz obr. 1.20. Připomíná políčko fotografického filmu.
Obrázek 1.20: struktura SEQUENCE
Podobně jako ikona struktury CASE, je také ikona struktury SEQUENCE vybavena ve své horní části malými šipkami pro přepínání mezi jednotlivými políčky ze kterých se skládá.9 9
Ikona struktury SEQUENCE právě vložená do diagramu z palety FUNCTIONS těmito šipkami vybavená není, neboť obsahuje pouze jediné políčko a není tedy mezi čím přepínat.
28
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
Nové políčko přidáme klepnutím na rámeček ikony a zvolením Add Frame After, nebo Add Frame Before v menu, které se objeví. Aktuální políčko smažeme zvolením Delete this Frame v tomtéž menu. Jednotlivá políčka jsou ve své horní části očíslována od nuly. V tomto pořadí, nulou počínaje, budou diagramy umístěné v rámečcích postupně vykonány. Příklad použití SEQUENCE Vidíme na obr. 1.21
Obrázek 1.21: Příklad použití struktury SEQUENCE
Funkce VI z obr. 1.21 je následující: Uzel Functions → Time & Dialog - Two Button Dialog zobrazí dialogové okno se dvěma tlačítky. Tři řetězcové konstanty v levé části rámečku určují po řadě obsah sdělení dialogového okna, popisek 1. tlačítka a popisek 2. tlačítka. Pokud uživatel zvolí 1. tlačítko, vrátí Two Button Dialog logickou hodnotu True, jinak vrátí False. Uzel Functions → Application Control - Stop zareaguje na hodnotu TRUE přivedenou na jeho vstupní terminál zastavením běhu VI. Na hodnotu FALSE nereaguje nijak. Jakmile je blokový diagram z prvního políčka proveden, spustí se diagram z políčka následujícího. Zobrazí se jiné dialogové okno Functions → Time & Dialog - One Button Dialog tentokráte s jediným tlačítkem. Jakmile toto tlačítko uživatel zvolí, celý program zkončí, neboť žádné další rámečky v tomto příkladě SEQUENCE nemá. Pokud potřebujeme předat nějakou hodnotu z jednoho rámečku do následujících rámečků, nepoužijeme k tomu posunovací registr, jako tomu bylo u cyklů, nýbrž vytvoříme tzv. místní proměnnou. To se technicky provede klepnutím pravým tlačítkem myši na rámeček ikony SEQUENCE a volbou Add Sequence Local v menu, které se objeví. V aktuálním rámečku ρ přibude nová ikona ( ). Pokud k ní přivedeme hranu od nějakého výstupního terminálu, změní tato ikona podobu na ( ), stane se z ní vstupní terminál. V rámečcích následujících po ρ má tato ikona podobu ( ), je výstupním terminálem. Ve všech rámečcích předcházejících rámečku ρ je nače místní proměnná reprezentovaná ikonou ( ). Její hodnota zde není definovaná, takže tato ikona není (ani vstupním ani výstupním) terminálem. Následující příklad z obr. 1.22 demonstruje použití místní proměnné.
Obrázek 1.22: Příklad použití struktury SEQUENCE
VI s blokovým diagramem z obrázku 1.22 vrací po postupném provedení všech tří dia-
1.14. FORMULA NODE
29
gramů na výstupním terminálu Numeric hodnotu 4. Jednotlivá políčka na obrázcích 1.20 a 1.21 se ve skutečnosti samozřejmě překrývají. Oba ukázkové programy nalezne čtenář v archivu příkladů pod názvy 009.vi a 010.vi. Smysluplnější využití má struktura SEQUENCE zejména při komunikaci s některými periferními zařízeními PC.
1.14
Formula Node
Pro snadné pochopení následujícího textu je nutná alespoň základní znalost některého textově orientovaného programovacího jazyka, nejlépe C, nebo Pascalu. Functions → Structures - Formula Node je uzel v podobě rámečku se vstupními a výstupními tunely, který slouží k vepsání kódu v textově orientovaném programovacím jazyce. Syntaxe kódu vepsaného do Formula Node se podobá syntaxi jazyka C. Následující obrázek demonstruje použití Formula Node.
Obrázek 1.23: Příklad použití Formula Node
Formula Node VI z obrázku 1.23 produkuje jednorozměrné pole náhodných čísel. Konstanta n určí, ža pole má mít 450 prvků. Deklarace P ole uvnitř Formula Node pak shora omezuje počet prvků Pole na 500. Uvedený příklad nalezne čtenář v archivu příkladů pod názvem 132.vi. Vstupní nebo výstupní tunel se vytvoří klepnutím pravým tlačítkem myši na rám Formula Node a volbou Add Input pro vstupní tunel, resp Add Output pro výstupní tunel. Popisek, který do tunelu vložíme popisovačem ( ) představuje ve Formula Node proměnnou. Typ proměnné je dán typem hrany přivedené ke vstupnímu tunelu. Proměnná, která neodpovídá žádnému vstupnímu tunelu, jako i, nebo P ole na obr. 1.23 musí být deklarována. Neexistuje formální omezení na počet proměnných ve Formula Node. Žádné dva vstupní tunely nesmí mít stejné jméno. Také žádné dva výstupní tunely nesmí mít stejné jméno. Avšak jméno vstupního tunelu se může shodovat se jménem výstupního tunelu. Všechny vstupní tunely musí být zapojeny, tzn. ke každému vstupnímu tunelu musí být připojena platná hrana. Stejně jako v jazyce C, = je přiřazovací příkaz, operátory +, -, *, /, ^ mají běžný význam. Komentáře se ohraničují mezi symboly /* a */. Seznam funkcí použitelných uvnitř Formula Node: abs(x), acos(x), acosh(x), asin(x),
30
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
asinh(x), atan(x), atanh(x), ceil(x), cos(x), cosh(x), cot(x), csc(x), exp(x), expm1(x), floor(x), getexp(x), getman(x), int(x), intrz(x), ln(x), lnp1(x), log(x), log2(x), max(x,y), min(x,y), mod(x,y), pow(x,y), rand( ), rem(x,y), sec(x), sign(x), sin(x), sinc(x), sinh(x), sqrt(x), tan(x), tanh(x). Jazyk G nabízí obdobné uzly pro vkládání kódů jiného jazyka, jako např C-Node pro vkládání kódu v jazyce C, nebo MatLab Script pro vkládání skriptů MatLab. Obdobou Formula Node je Expression Node pro vyhodnocení rovnice o jedné neznámé. Podrobný popis Formula Node najde čtenář např. v elektronické nápovědě LabVIEW. Tamtéž je podrobně popsána syntaxe jazyka Formula Node a výčet funkcí, které lze uvnitř Formula Node použít.
1.15
Podprogramy
Každé VI, které v LabVIEW vytvoříme, může vystupovat jako samostatná aplikace, samozřejmě. Existuje však také možnost „vnořovatÿ jednotlivé VI „do sebeÿ. VI, které je součástí jiného VI, vystupuje v roli „podprogramuÿ, Sub-VI. V blokovém diagramu vystupuje Sub-VI jako samostatný uzel. Je reprezentován ikonou a může být vybavený vstupními a výstupními terminály. Tvorbu Sub-VI si přiblížíme na konkrétním příkladě. Vytvoříme VI, které ze vstupního pole koeficientů polynomu vytvoří řetězec, který bude reprezentovat tento polynom v běžném algebraickém tvaru zápisu. Blokový diagram VI, které realizuje tuto úlohu vidíme na obr. 1.24.
Obrázek 1.24: Tvorba Sub-VI
Jádrem VI je FOR cyklus, který proběhne právě tolikrát, koik má vstupní pole Polynomial Fit Coefficients prvků. V každé iteraci cyklu se pak k i- tému prvku zleva připojí levá závorka ( a zprava řetězec )*x^i+. Tímto způsobem se zpracuje každý jednotlivý prvek vstupního pole a FOR cyklus zkončí. Takto vzniklý řetězec je však nutné zkrátit o poslední znak +, nebo na konec řetězce připojit nulu, jinak by zápis polynomu nebyl korektní. Využijeme prvního řešení. Uzel String Subset v kombinaci s String Length a Decrement (-1) provede zkrácení vstupního pole o jeden znak. VI s blokovým diagramem z obrázku 1.24 je uloženo v archivu příkladů pod
1.15. PODPROGRAMY
31
názvem 118.vi
1.15.1
Tvorba Sub-VI
Aby mohlo VI 118.vi fungovat jako Sub-VI, je nutné přidělit mu ikonu a vstupní a výstupní terminály. Zaostříme na okno čelního panelu (viz obr. 1.25) v němž vidíme příslušné vstupní a výstupní ovládací prvky, jak jsme zvyklí. Nyní klepneme na čtvercovou ikonu v pravém horním rohu okna pravým tlačítkem myši a v menu které se objeví zvolíme Show Connector.
Obrázek 1.25: Tvorba Connectoru
Connector je ikona rozdělená do oblastí, které budou reprezentovat vstupní a výstupní terminály našeho VI. Z menu pod pravým tlačítkem myši nad čtvercovou ikonou Connectoru můžeme vybrat pro Connector vhodnou podobu s potřebným počtem terminálů. Nyní přepneme kurzor myši do podoby cívky s nití ( ) a propojíme postupně jednotlivá políčka v ikoně s příslušnými objekty čelního panelu. Správně zapojený terminál Connectoru změní barvu. Jakmile jsou všechny terminály řádně propojeny, klepneme na Connector pravým tlačítkem myši a v menu, které se objeví zvolíme Show Icon. Ze stejného menu můžeme spustit editor obrázků volbou Edit Icon pro navržení vizuální podoby ikony našeho VI, viz obr. 1.26. Na ikonu je vhodné umístit např. nápis charakterizující činnost Sub-VI, zde např „Coef 2 Polyÿ. 118.vi je nyní připraveno pro použití v jiném VI jako Sub-VI. I nadále je samozřejmě možné spouštět 118.vi jako samostatnou aplikaci.
1.15.2
Použití Sub-VI
V následující aplikaci 133.vi bude 118.vi vystupovat jako podprogram. Blokový diagram 133.VI je zobrazen na následujícím obrázku 1.27.
32
KAPITOLA 1. ÚVOD DO PROGRAMOVÁNÍ V LABVIEW
Obrázek 1.26: Návrh Ikony VI
Obrázek 1.27: Použití Sub-VI
V cyklu FOR se vytvoří dvě jednorozměrná pole ozn. X a Y. Pole X obsahuje 700 celých čísel v rozmezí 0. .699. Pole Y obsahuje odpovídající funkční hodnoty polynomu y = x2 + 2 ∗ x3 . Výpočet funkčních hodnot polynomy probíhá ve Formula Node. Takto vzniklým datovým souborem je pomocí Functions → Mathematics → Curve Fitting - General Polynomial Fit.vi proložen polynom 2. stupně s využitím metody nejmenších čtverců. Výstupem General Polynomial Fit.vi je pole koeficientů aproximačního polynomu. Nyní je třeba do blokového diagramu vložit 118.vi. To provedeme volbou Functions → Select a VI... v paletě Functions. 118.vi se v blokovém diagramu chová jako obyčejný uzel. Na jeho vstupní terminál Polynomial Fit Coefficients přivedeme pole koeficientů aproximačního polynomu. Konstantou Precision (6) změníme implicitní počet desetinných míst u koeficientů z 6 na 3. Výstupem 118.vi je pak aproximační polynom v obvyklém algebraickém tvaru zápisu, který se zobrazí na čelním panelu.
Kapitola 2
Příklady Následující kapitola je sestavena z devíti příkladů, které mají demonstrovat základní techniky programování v jazyce G. LabVIEW je dodáváno spolu s velkým množstvím řešených příkladů, resp. ukázkových VI, které lze vyhledávat například v elektronické nápovědě LabVIEW. Příklady uvedené v této kapitole jsou však narozdíl od výše zmíněných opatřeny podrobným komentářem, který má začátečníkovi usnadnit pochopení jejich funkce.
2.0.3
Příklad 1
VI které nyní uvedeme vykreslí v grafu na čelním panelu jednu periodu funkce sin x. Na následujícím obrázku 2.1 vidíme jeho blokový diagram.
Obrázek 2.1: VI pro vykreslení jedné periody funkce sin x Uzly, které realizují výpočet jsou uzavřeny v cyklu FOR. Tělo cyklu má být provedeno tisíckrát. Uzel Functions → Numeric → Trigonometric - Sine vrátí v průběhu cyklu tisíc funkčních hodnot yi = sin(xi ) pro xi ∈ h0, 2πi. Prvky xi rovnoměrně pokrývají interval h0, 2πi. Aby se vstupní hrany uzlu Functions → Numeric - Divide nekřížily, je použit uzel Functions → Numeric - Reciprocal. Vypočtené funkční hodnoty se na výstupním tunelu cyklu FOR seřazují do jednorozměrného pole. Toto pole opustí výstupní tunel po skončení poslední iterace cyklu jako celek. Do čelního panelu VI byl umístěn Controls → Graph Waveform Graph. Ten v blokovém diagramu reprezentuje stejnojmenný terminál. V závěru běhu VI je obsah pole vykreslen v grafu. Při tom objekt Waveform Graph je implicitně nastaven tak. že automaticky nastaví minimální a maximální hodnoty na příslušných osách. Popsané VI se nachází v archivu příkladů pod názvem 121.vi.
33
34
KAPITOLA 2. PŘÍKLADY
2.0.4
Příklad 2
Tento příklad je jen dalším řešením zadání z prvního příkladu, vykresluje jednu periodu funkce sin x.
Obrázek 2.2: VI pro vykreslení jedné periody funkce sin x V prvním FOR cyklu se vygeneruje pole celých čísel h0, 999i, výstupní tunel má totiž povoleno indexování. Kdyby indexování povoleno nebylo, vystoupila by z cyklu po poslední iteraci pouze hodnota 999. Dále je využito polymorfizmu uzlu Functions → Numeric - Multiply, který každý jednotlivý prvek v poli vynásobí konstantou 2π. Výstupem je opět pole, tentokráte však reálných čísel. Dále jsou analogicky všechny prvky tohoto pole vyděleny konstantou 1000, takže výstupní pole obsahuje tisíc hodnot rovnoměrně pokrývajících interval h0, 2πi. V druhém FOR cyklu je na každý jednotlivý prvek pole aplikován uzel Sine pro výpočet funkční hodnoty sin x. Oba tunely, vstupní i výstupní, mají zapnuto indexování. Počet iterací druhého FOR cyklu je dán počtem prvků ve vstupním poli. Počet prvků vstupního pole vrací uzel Functions → Array - Array Size. Výsledné pole se vykreslí. Uzel Sine je však také polymorfní, takže blokový diagram z obrázku 2.2 lze zredukovat na diagram uvedený na obrázku 2.3.
Obrázek 2.3: Modifikace VI pro vykreslení jedné periody funkce sin x Popsané VI se nachází v archivu příkladů pod názvem 123.vi.
2.0.5
Příklad 3
Následující VI Vykresluje do čelního panelu binární reprezentaci náhodného čísla z intervalu h0, 10i. Uzel Functions → Numeric - Random Number (0-1) generuje náhodné číslo x z intervalu h0, 1i typu Double Precision Floating Point Numeric. Vynásobením čísla x desítkou a následným převodem na typ Unsigned 8-bit integer obdržíme celé číslo z intervalu h0, 10i. Typovou konverzi realizuje uzel Functions → Numeric → Conversion - To
35
Obrázek 2.4: 122.vi Unsigned Byte Integer. Toto číslo je přivedeno na vstup dalšího převodního uzlu Functions → Boolean - Number to Boolean Array. Jeho výstupem je jednorozměrné pole logických hodnot. Do čelního panelu byl umístěn Indicator tohoto pole volbou Create Indicator v menu pod pravým tlačítkem myši nad konverzní funkcí. Indikátor imituje řadu luminiscenčních diod. Grafickou reprezentaci tohoto Indicatoru lze měnit. Popsané VI se nachází v archivu příkladů pod názvem 122.vi.
2.0.6
Příklad 4
Následující příklad demonstruje práci s řetězcem. Ze vstupního řetězce „Manna-Hataÿ vznikne po několika úpravách „MANHATTANÿ. Blokové schéma této aplikace znázorňuje obrázek 2.5
Obrázek 2.5: Demonstrace práce s řetězci Všechny uzly které zmíníme v následujícím odstavci se nacházejí na paletě Functions → String1 . Hodnota vstupní řetězcové konstanty „Manna-Hataÿ je přivedena na vstup uzlu To Upper Case, který všechna malá písmena změní na velká. Uzel String Length určuje délku vstupního řetězce. Ve spojení s String Subset a Decrement způsobí jeho zkrácení o poslední znak. Začátek podřetězce je určen hodnotou na terminálu Offset. Ten je nezapojen a neznázorněn. Jeho implicitní hodnota je nula, s výběrem se tedy začíná od začátku řetězce. Na výstupu String Subset je nyní „MANNA-HATÿ. K tomuto řetězci připojíme sufix „TANÿ. Tuto operaci realizuje uzel Concatenace strings. Má nastavitelný počet vstupních terminálů, 2 takže jím lze obecně spojovat více řetězců. Jeho výstupem je řetězec MANNAHATTAN. Poslední úpravou je nahrazení části vstupního řetězce „NA-ÿ prázdným řetězcem. Realizuje se uzlem Search And Replace String, který nalezne daný podřetězec vstupního řetězce a nahradí jej jiným, zde prázdným řetězcem. Výstupem je tedy řetězec „MANHATTANÿ, který se vypíše v čelním panelu. Popsané VI se nachází v archivu příkladů pod názvem 126.vi. 1 2
kromě uzlu Decrement (-1) z Functions → Numeric Viz odstavec 1.12.1 na str. 21 o uzlech s nastavitelným počtem terminálů
36
KAPITOLA 2. PŘÍKLADY
2.0.7
Příklad 5
Demonstrace práce s poli.
Obrázek 2.6: Demonstrace práce s poli VI s blokovým schématem z následujícího obrázku provádí následující činnost: Ve dvou pod sebou umístěných FOR cyklech se vygenerují dvě pole náhodných čísel, každé se dvěma prvky. Obě pole jsou vzápětí zobrazena na čelním panelu. Příslušné Indicatory pro výpis obsahu polí byly vytvořeny klepnutím pravým tlačítkem myši na výstupní tunely cyklů a volbou Create Indicator v menu. které se objevilo. Alternativně lze do čelního panelu vožit Controls → Array & Cluster - Array a do jeho ikony dále vložit Controls → Numeric - Digital Indicator. Uzel Functions → Array - Build Array spojí zmíněná dvě jednorozměrná pole pole do jediného dvourozměrného. Uzel Build Array má nastavitelný počet terminálů. Dále se v diagramu nachází uzel Transpose 2D Array, který transponuje vstupní dvourozměrné pole podle hlavní diagonály. Takto jsme obdrželi dvěrůzná pole. Uzel Functions → Numeric - Multiply je polymorfní, jak jsme si již mohli všimnout. Lze ho aplikavat i na dvě dvourozměrná pole. Výsledkem je pak jejich součin, pokud jej lze spočítat. Popsané VI se nachází v archivu příkladů pod názvem 127.vi.
2.0.8
Příklad 6
VI s blokovým diagramem z obr. 2.7 má demonstrovat realizaci základních statistických výpočtů nad jednorozměrným polem.
Obrázek 2.7: Demonstrace práce s poli V cyklu FOR se vytvoří pole 200 náhodných čísel v intervalu h0, 1i. Od každé jednotlivé hodnoty tohoto pole ja odečteno číslo 0, 5. Uzel Functions → Mathematics → Probbability & Statistics - Mean určuje průměrnou hodnotu čísel ve vstupním poli. Ta se pochopitelně
37 pohybuje kolem nuly. Uzel Functions → Mathematics → Probbability & Statistics Histogram produkuje pole rozložení četností výskytu hodnot ležících v příslušných třídicích intervalech. Jejich počet je na obr. 2.7 určen konstantou intervals, která je nastavena na 100. Histogram produkuje dvě jednorozměrná pole. První z nich, histogram, obsahuje hodnoty příslušné třídicím intervalům, jejichž středy jsou obsahem druhého pole x-Values. Popsané VI se nachází v archivu příkladů pod názvem 129.vi a 130.vi.
2.0.9
Příklad 7
Zde předvedeme základní způsob ukládání dat do textového souboru.
Obrázek 2.8: Uložení dat do textového souboru VI 129.vi s blokovým diagramem z obr. 2.9 demonstruje nejběžnější způsob ukládání dat do textového souboru. Ve FOR cyklu jsou vygenerována dvě pole čísel. První pole obsahuje přirozená čísla 0..49, tedy 50 čísel. Druhé pole obsahuje 50 náhodných čísel. Tato dvě jednorozměrná pole jsou dále spojena do jediného dvourozměrného pole pomocí Functions → Array - Build Array. Výsledné pole má tedy 50 sloupců a dva řádky. Toto pole je přivedeno na vstup uzlu Functions → File I/O - Write To Spreadsheet File.vi, který provede uložení dat do textového souboru. Tento uzel umožňuje různě ovlivňovat formát zápisu dat, jako např. zvolit znak oddělovače (implicitně znak tabulátoru), znak konce řádku (obvykle CR v Linuxu a CR,LF pod Windows) atd. Hodnota přivedená na terminál transpose? rozhoduje o tom, zda mají být data ve vstupním dvourozměrném poli před uložením transponována. Pokud chceme aby bylo možné tato data snadno otevřít pomocí standardních aplikací (Origin, Excel,. . .), musíme tato dvě pole uložit jako dva sloupce, tedy vstupní pole transponovat. K terminálu transpose? tedy připojíme konstantu True, jak je na obr. 2.9 vidět.
Obrázek 2.9: Načtení dat z textového souboru Analogicky, načtení dat z textového souboru zrealizujeme uzlem Functions → File I/O - Read Spreadsheet File. Protože jsme prve uložili data transponovaná, musíme i nyní přivést k terminálu transpose? pravdivou konstantu. Využijeme výstupní terminál pro dvou-
38
KAPITOLA 2. PŘÍKLADY
rozměrné pole a přivedeme jej na vstup dvěma uzlům Index Array, které vybírají část pole přivedeného jim na vstup. Konstanty Index nastavíme v prvním případě na 0, ve druhém na 1. První Index Array vrátí první sloupec, druhý uzel Index Array pak druhý sloupec načtený ze soubru. Jména souborů jsou v obou případech určena dialogovým oknem, které se automaticky objeví. Pokud chceme potlačit zobrazení dialogového okna a soubor určit před spuštěním VI, připojíme k terminálům file path uzlů Write To Spreadsheet File a Read From Spreadsheet File konstantu typu file path kliknutím pravým tlačítkem myši na terminál file path a volbou Create Constant v objevivším se menu. V popsaném případě pracujeme s textovým souborem, jehož každý řádek obsahuje číslo, znak tabulátoru, číslo a znak konce řádku. Některé běžné aplikace produkující datové soubory produkují místo znaku tabulátoru pro oddělení sloupců jiný znak, např. čárku. Podle toho je nutno nastavit konstantu delimiter. LabVIEW nabízí pro práci se soubory také množství jiných funkcí. Popsané VI se nachází v archivu příkladů pod názvem 129.vi a 130.vi.
2.0.10
Příklad 8
Kreslení grafů. V paletě Controls → Graph se nacházejí 3 základní objekty pro kreslení grafů: Waveform Chart, Waveform Graph a XY Graph. Zde uvedeme jejich základní použití.
Obrázek 2.10: Kreslení grafů Controls → Graph - Waveform Chart slouží k vykreslování číselných hodnot. Číslo, které přicestuje na tento terminál se zobrazí v grafu jako bod. Všechny body, které reprezentují již dříve „vykreslenáÿ čísla jsou odsunuty směrem doleva. Jak je vidět, Waveform Chart není v tomto případě klasickým kartézským grafem. V některých případech je jeho použití velice názorné. V příkladu z obrázku 2.10 jsou k terminálu Waveform Chart cyklicky přiváděny funkční hodnoty funkce sin x. Uzel Functions → Time & Dialog - Wait Until Next ms Multiple s vhodně nastavenou dobou čekání, zpomaluje průběh FOR cyklu, takže vykreslování hodnot v Waveform Chartu je tím zpomaleno a lépe znázorněno. Controls → Graph - Waveform Graph slouží zejména k jednorázovému vykreslení hodnot v jednorozměrném poli.
39
Controls → Graph - XY Graph je objekt pro vykreslování kartézského grafu. Jedním ze způsobů jak XY Graph použít je přivést k jeho terminálu Cluster obsahující dvě jednorozměrná pole. Výsledný graf se pak skládá z bodů. Prvky vstupních polí se shodným indexem určují právě dvojice čísel, které reprezentují jednotlivé body v grafu. Všechny tři zmíněné objekty jsou polymorfní, takže k jejich vstupním terminálům lze přivést data různého datového typu. Podle typu dat přivedených na vstupní terminál volí objekt grafu své chování. Popsaná použití jsou tedy jen typická, nikoliv však jediná. Chování všech objektů lze obecně ovlivňovat nastavením parametrů v menu, které se objeví po klepnutí pravým tlačítkem myši na tento objekt. Nejinak je tomu i u objektů pro kreslení grafů. Jedním z nejdůležitějších nastavení je volba Autoscale Axis X/Y, která zpíná/vypíná automatické přizpůsobování rozsahu os vstupním datům tak, aby všechna byla viditelná. Pokud je automatická volba rozsahu os vypnutá, lze rozsah nastavit popisovačem ( ). Popsané VI se nachází v archivu příkladů pod názvem 131.vi.
2.0.11
Příklad 9
Pojďme se na závěr vrátit k příkladu VI, ze stránky 10. Tehdy si měl čtenář povšimnout, že „blokový diagram se skládá z určitých objektů spojených barevnými čáramiÿ. Na obrázku vidíme opět jeho blokový diagram.
Obrázek 2.11: Ukázkové VI Po spuštění proběhne tělo cyklu FOR a to stopadesátkrát. Na jeho výstupních tunelech se „seřazujíÿ dvě pole. Horní pole X obsahuje celá čísla mezi 0 a 149. Ve spodním poli Y reálných čísel jsou obsaženy funkční hodnoty odpovídající X 1.6 + n kde n je „maléÿ náhodné číslo. Tato část VI má simulovat načítání experimentálních dat. Obdržená závislost je vykreslena v grafu Vstupní data.
40
KAPITOLA 2. PŘÍKLADY
Nyní se těmito vstupními daty proloží aproximační polynom 2. stupně. Tuto funkci plní Functions → Mathematics → Curve fitting - General Polynomial Fit. Jeho výstupem je také pole, avšak pole koeficientů nalezeného aproximačního polynomu. Při tom koeficient na pozici nula tohoto pole odpovídá nulté mocnině proměnné aproximačního polynomu a tak analogicky dále. Nyní je třeba převést toto pole koeficientů do běžného algebraického způsobu zápisu polynomu. To prakticky znamená ke všem koeficientům zleva přidat levou závorku „( ÿa zprava přidat řetězec „)$\rightarrow$x^n+ ÿ, kde n odpovídá indexu koeficientu v poli koeficientů. Tak vznikne polynom proměnné x. Ten se jednak vypíše na čelním panelu v objektu Controls → String & Path - String Indicator, kterému odpovídá v blokovém diagramu terminál Formule, jednak je předán na vstup uzlu Functions → Mathematics → Calculus Differentiation.vi. Differentiation.vi provede zderivování vstupního polynomu (napsat vlastní VI pro derivaci polynomu je jistě vhodný námět k samostatnému experimentování čtenáře) a spočte 100 funkčních hodnot původního i zderivovaného polynomu. Těchto 100 hodnot je rovnoměrně rozloženo v intervalu daném rozsahem původního datového souboru. Interval daný rozsahem původního datového souboru je určen jako interval mezi minimální a maximální hodnotou v poli X. Výpočet minimální a maximální hodnoty v poli provádí uzel Functions → Array → Array Max & Min. Obě pole výstupních hodnot uzlu Differentiation.vi jsou na závěr vyneseny do grafů Funkce F a Funkce G. Popsané VI se nachází v archivu příkladů pod názvem 002.vi.
Kapitola 3
Vybrané periferie PC 3.1
Zvuková karta
Zvuková karta je v podstatě zařízení pro zpracování signálu jehož charakteristikou je proměnlivá hodnota elektrického napětí v čase. Zvukové karty, kterými se dnes běžně osazují osobní počítače, mají velmi podobné vlastnosti. Příkladem dnes běžně používané zvukové karty je Sound Blaster Live! Player 1024 firmy Creative. V následující tabulce 3.1 uvedeme technické parametry této zvukové karty převzaté z [?], které lze považovat za přibližně platné pro všechny běžně používané zvukové karty. Pro měření lze využít vstup Line-In, nebo mikrofonní vstup Microphone-In, který je osazen předzesilovačem. Oba vstupy jsou stereofonní. Karta má tedy v podstatě 4 nezávislé vstupy. Maximální amplituda vstupního signálu pro jednotlivé vstupy je uvedena v tabulce 3.1. Minimální frekvence vstupního signálu je dána horní pásmovou propustí, která je realizována kondenzátorem. Kondenzátor je sériově předřazen vstupnímu zesilovači. Zabraňuje průniku stejnosměrné složky signálu na vstup zesilovače a „nízkéÿ frekvence potlačuje (viz např. [10], kap. 9). Maximální frekvence signálu zpracovatelného zvukovou kartou je dána maximální vzorkovací frekvencí karty a platností tzv. Nyquistova teorému 1 (viz např. [11], str. 114., nebo [7], str. 11-4.), podle něhož musí být vzorkovací frekvence alespoň dvakrát vyšší, než nejvyšší harmonická složka zastoupená v měřeném signálu. Zvuková karta se velmi dobře hodí ke zpracování signálu jehož nejnižší harmonická složka má frekvenci alespoň 10 Hz a jehož nejvyšší harmonická složka má frekvenci nižší, než 22 kHz.
Obrázek 3.1: Konektor Jack 3,5 mm.
Vstupy Line-IN a Microphone-IN i výstup Line-OUT jsou osazeny zdířkami pro konektor Jack o průměru 3,5 mm (tzv. „malýÿ Jack) viz obr. 3.1. Konektor lze schematicky znázornit jako „====#####|G|R|L>ÿ. Aktivní plošky konektoru jsou tvořeny kovovými prstenci které 1
Někdy též Shannonův - Kotělnikovův teorém.
41
42
KAPITOLA 3. VYBRANÉ PERIFERIE PC
Karta je vybavena 16 bitovým AD/DA převodníkem. Vstupní vzorkovací frekvence je volitelná. Přípustné hodnoty jsou: 8,0 kHz, 11,025 kHz, 16,0 kHz, 22,05 kHz, 24,0 kHz, 32,0 kHz a 44,1 kHz. Výstupní vzorkovací frekvence je plynule nastavitelná v intervalu 8 kHz - 48 kHz. Pokud není aktivní interní předzesilovač, činí maximální amplituda vstupního signálu pro mikrofonní vstup 0,2 V. Vstupní impedance mikrofonního vstupu: 5,0 kΩ. Maximální amplituda vstupního signálu pro vstup Line-In: 2 V. Vstupní impedance vstupu Line-In: 10,0 kΩ. Maximální amplituda výstupního signálu: 2 V. Odstup signálu od šumu: 94 dB. Celkové harmonické zkreslení 0.006%. Tabulka 3.1: Technické parametry zvukové karty Sound Blaster Live! Player 1024
ve schematickém znázornění odpovídají písmenům G, R a L. Ploška G představuje společnou zem pro pravý kanál (R) a levý kanál (L). Monofonní varianta tohoto konektoru má oblasti G a R spojeny v jedinou, která pak vystupuje v roli země a k prstenci L je přiveden jediný signálový vodič. Vstup pravého kanálu je takto zkratován. Pro čtení ze zvukové karty v LabVIEW slouží uzly z palety Functions → Graphics & Sound → Sound. Stejně jako při práci s jinými prostředky operačního systému, probíhá komunikace se zvukovou kartou ve třech fázích: Nejprve je nutno zvukovou kartu „otevřítÿ, to znamená vyhradit si ji pro použití ve své aplikaci a nastavit některé parametry. S „otevřenouÿ zvukovou kartou lze dále pracovat, tedy z ní číst, nebo do ní zapisovat data. Třetí fáze spočívá v „uzavřeníÿ karty. Tehdy se zřekneme práva práce s kartou a uvolníme ji pro použití ostatním aplikacím2 . Pro otevření zvukové karty slouží uzel Functions → Graphics & Sound → Sound → Sound Input - SI Config. K terminálu Device (0) je nutno přivést pořadové číslo zvukové karty v systému. Pokud je počítač vybaven jedinou zvukovou kartou, odpovídá jí hodnota 0. Tato hodnota je implicitní, takže terminál Device může v tomto případě zůstat nezapojen. Pořadové číslo zvukové karty generuje LabVIEW. Obvykle nebývá v PC tolik zvukových karet, aby nebylo možné správnou hodnotu určit zkoušením. K terminálu Sound Format je nutno přivést Cluster obsahující nastavení vzorkovací frekvence, nastavení provozního režimu (mono/stereo) a počet bitů využitelných pro AD/DA převod (8/16). Pokud chceme tyto hodnoty nastavovat během VI na čelním panelu aplikace, připojíme k terminálu Sound Format ovládací prvek typu Control (V menu pod pravým tlačítkem myši zvolíme Create Control), jinak stačí obdobným způsobem vytvořit konstantu. Pokud aktuální nastavení překračuje možnosti konkrétní zvukové karty, objeví se během VI na terminálu Error Out Chybové hlášení, odkud snadno určíme o jakou chybu se jedná. Během ladění VI je tedy vhodné mít k terminálu Error Out připojen Indicator. Uzel SI Config produkuje referenční číslo (Refnum) pomocí kterého se na zvukovou kartu budeme v dalším odkazovat. Nakonec je vhodné nastavit Buffer Size, což je délka pole které bude v rámci jednoho čtení vyprodukováno uzlem 2
Obvykle může číst ze zvukové karty více aplikací zároveň
3.1. ZVUKOVÁ KARTA
43
SI Read. Implicitní hodnotu 8192 však obvykle není nutno měnit. Čtení ze zvukové karty realizujeme uzly SI Start, SI Read a SI Stop. Všechny nalezneme na paletě Functions → Graphics & Sound → Sound → Sound Input.Uzlem SI Start odstartujeme čtení. Stačí k němu přivést RefNum od SI Config. Uzel SI Read zajišťuje vlastní čtení. Má 4 výstupní terminály pro data. Jen jeden z nich je však aktivní v závislosti na nastavení parametrů čtení uzlem SI Config. Například pokud chceme číst v režimu mono a k AD převodu využít 8 bitů, musíme přečtená data odebírat z terminálu mono 8-bit. Takto obdržíme pole čísel Unsigned Byte délky Buffer Size, tedy implicitně 8192 čísel. Po skončení čtení uzlem SI Read musí být proveden uzel SI Stop, který ukončí čtení. Pro uzavření zvukové karty použijeme uzel SI Clear. Jediným „povinnýmÿ vstupem pro tento uzel je RefNum odkazující na zvukovou kartu, s níž jsme pracovali. Pokud chceme ze zvukové karty číst průběžně a cyklicky, uzavřeme uzel SI Read do cyklu. Pokud chceme ze zvukové karty číst sice cyklicky, avšak spokojíme se např. s jedním vzorkem délky Buffer Size za N sekund, uzavřeme do cyklu uzly SI Start, SI Read a SI Stop a dále do cyklu vložíme uzel Functions → Time & Dialog - Wait Until Next ms Multiple u něhož nastavíme příslušný počet milisekund čekání. Zápis do zvukové karty probíhá naprosto analogicky ke čtení, pouze využíváme uzly z palety Functions → Graphics & Sound → Sound → Sound Output. Příklad zápisu do zvukové karty je uveden mezi ukázkovými programy dodávanými s LabVIEW. Současné čtení a zápis umožňují pouze zvukové karty schopné pracovat v tzv. Full Duplex režimu. Zvuková karta Sound Blaster Live! Player 1024 je schopná v tomto režimu pracovat. Na čtení ze zvukové karty má vliv nastavení hlasitosti nahrávání v systému. V OS Windows ji lze nastavit např. aplikací Play Control, která je v oddílu System Tray lišty Windows dostupná klepnutím na ikonu ( ). Nastavení hlasitosti nahrávání se provede volbou Možnosti → Vlastnosti v hlavním menu a dále zaškrtnutím políčka Záznam. V sekci Mikrofon je dále možno zapnout nebo vypnout předzesilovač na mikrofonním vstupu, pokud zvuková karta umožňuje toto nastavení. Při 8 bitovém AD převodu lze úroveň vstupního signálu zakódovat do 28 čísel, tj. do 256 . různých čísel. Citlivost zvukové karty tedy v tomto případě činí 1, 5/28 = 5mV . Při tom předpokládáme, že amplituda vstupního signálu činí 1,5 V. Amplituda vstupního signálu sice podle tabulky 3.1 může na vstupu Line-IN činit až 2 V, avšak hodnota již o málo vyšší způsobí přebuzení vstupního zesilovače a proto je vhodné počítat s jistou rezervou. Maximální amplituda bude tedy při osmibitovém AD převodu kódována číslem 255, při šestnáctibitovém AD převodu číslem 65535.
3.1.1
Nejjednodušší VI pro čtení ze zvukové karty
Nejjednodušší VI pro přečtení jednoho vzorku ze zvukové karty má přesně strukturu popsanou v předchozím textu. Všechny uzly přistupující ke zvukové kartě jsou propojeny hranou RefNum, která přenáší identifikátor odkazující na zvukovou kartu se kterou pracujeme. K ter-
44
KAPITOLA 3. VYBRANÉ PERIFERIE PC
minálu Error OUT uzlu SI Config je připojen Indicator, ve kterém se na čelním panelu objeví popis eventuální chyby. Samozřejmě, bylo by možné propojit všechny uzly pracující se zvukovou kartou hranou Error a indikátor chybového hlášení připojit až nakonec. Vznik chyby mino inicializační část VI však nebudeme předpokládat. Vzorkovací frekvence je v tomto případě nastavena na 11025 Hz, číst se bude v režimu mono, tedy jen z levého kanálu a pro AD převod bude využito 8 bitů. Buffer Size je nastavena na implicitních 8192, takže . doba odběru vzorku bude činit (1/11025) · 8192 = 0, 7s. Výstupem uzlu SI Read je jednorozměrné pole s prvky typu Unsigned Byte, které odebíráme z terminálu mono 8-bit uzlu SI Read. Terminálu mono 8-bit ( ) můžeme dát v blokovém diagramu podobu grafu Controls → Graph - Waveform Graph a ve výsledku pak uvidíme časový průběh vstupního signálu. Samozřejmě, jednotkou na ose x bude jeden z 8192 odečtů. Uvedené nastavení klade nejmenší nároky na zvukovou kartu, takže toto VI by mělo fungovat prakticky s libovolnou zvukovou kartou.
Obrázek 3.2: Nejjednodušší VI pro čtení ze zvukové karty
Blokový diagram popsaného VI je uveden na obr. 3.2, kompletní VI nalezne čtenář v archivu příkladů pod názvem 012.vi.
3.1.2
VI pro fourierovu transformaci akustického signálu
Následující VI čte signál přivedený na vstup zvukové karty např. z mikrofonu, provádí jeho rychlou fourierovu transformaci (FFT) a výsledek vykresluje do grafu. Výpočet FFT je natolik rychlý, že vykreslování probíhá v reálném čase. Výsledný graf je tedy „animovanýÿ. V podstatě jde jen o drobnou modifikaci předchozího příkladu. Čtení ze zvukové karty však probíhá opakovaně. Uzel SI Read je spolu s dalšími funkcemi uzavřen v cyklu WHILE, který má probíhat neustále. VI lze tedy ukončit jedině tlačítkem Abort Execution ( ) nebo ekvivalentní klávesovou zkratkou (Ctrl-.). Uzel Functions → Waveform - Build Waveform přidá k jednorozměrnému poli čísel které je výstupem z SI Read informaci o časové prodlevě dt mezi jednotlivými měřeními ze kterých se vzorek skládá. Prodleva dt je reciprokou hodnotou vzorkovací frekvence. Počáteční čas měření je nepodstatný, proto t0 = 0. Vzniklá data typu Waveform představují závislost elektrického napětí na čase. Tato závislost je vykreslena v grafu „Vstupní signálÿ na čelním panelu VI. Tento graf je v blokovém diagramu reprezentován uzlem Vstupní signál. Výpočet FFT zajišťuje uzel Functions → Waveform → Waveform Measurements - FFT Spectrum (Mag-Phase).vi. Jeho výstupem jsou data reprezentující závislost amplitudy na frekvenci vstupního signálu. Tato závislost je vykreslena v grafu „FFTÿ na čelním panelu. Tomuto
3.2. SÉRIOVÝ PORT
45
Obrázek 3.3: VI pro FFT signálu ze zvukové karty
grafu odpovídá v blokovém diagramu uzel FFT. Zbývající uzly A, B, C, D, E a uzel Negate slouží ve spojení s příslušnými objekty čelního panelu k nastavení os v grafech na čelním panelu. Na funkci VI nemají v principu žádný vliv. Bez problému je lze z blokového diagramu smazat. Mechanizmem nastavení os u grafů se zde nebudeme podrobněji zabývat, nicméně čtenář si VI s blokovým diagramem z obrázku 3.3 může vyzkoušet a jejich funkci jistě rychle pochopí. VI je uloženo v adresáři zvuk_FFT archivu příkladů pod názvem analyza_zvuku.vi. Soubory graf1.ctl a graf2.ctl nacházející se taktéž ve zmíněném adresáři definují vzhled grafů na čelním panelu VI.
3.2
Sériový port
Každý osobní počítač je zpravidla vybaven alespoň dvěma sériovými porty RS-2323 . Původně byl sériový port (SP) navržen pro komunikaci PC s modemem. V současné době se hojně využívá také pro komunikaci PC s růrnými periferními zařízeními, jako je např. sériová myš nebo různé laboratorní měřicí přístroje. Jde o relativně jednoduché, levné a spolehlivé zařízení. Nevýhodou je poměrně nízká rychlost komunikace přes SP. Data jsou přenášena po jednotlivých znacích sekvenčně po datové lince. Představme si dvě zařízení komunikující přes SP, např. dva počítače. Tato zařízení jsou vzájemně propojena dvěma sériovými datovými linkami, pro každý směr jednou a společnou signálovou zemí. Kromě toho mohou být tato zařízení propojena až čtyřmi dalšími řídicími linkami, dvěma v každém směru pro potvrzování správnosti probíhající komunikace, resp. pro její řízení. V podstatě však lze realizovat sériovou komunikaci i bez využití těchto řídicích linek. Pro vzájemnou obousměrnou komunikaci dvou zařízení po sériové lince je tedy třeba propojit je alespoň třemi vodiči. Pro jednosměrnou komunikaci postačí dva vodiče. Délka vedení mezi dvěma zařízeními komunikujícími po sériové lince by neměla přesáhnout 15 m. SP je odolný proti zkratu na jednotlivých linkách. Zařízení připojená přes SP lze připojo3
Recommended Standard
46
KAPITOLA 3. VYBRANÉ PERIFERIE PC
vat a odpojovat za chodu počítače. SP je schopen dodat do připojeného zařízení proud až 10 mA, který lze odebírat z některé řídicí linky. Tímto způsobem je napájena např. elektronika sériové myši.
Obrázek 3.4: Konektory Cannon
Fyzicky je SP realizován konektorem Cannon s 25 kontakty, nebo týmž typem konektoru s 9 kontakty, viz obr. 3.4. Jednotlivé linky jsou vyvedeny na kontakty konektoru. Kontakty jsou očíslovány. Čísla bývají na většině konektorů skutečně viditelná. Oba konektory existují v provedení s kolíky a s dutinkami. Tato dvě provedení jsou vzájemnými protikusy. SP je na PC realizován konektorem v provedení s kolíky. Následující tabulka 3.2 uvádí význam kontaktů s příslušným číslem u konektoru s 9 i 25 kontakty. K25 2 4 20 3 5 6 8 22 7
K9 3 7 4 2 8 6 1 9 5
I/O Výstup Výstup Výstup Vstup Vstup Vstup Vstup Vstup -
Označení TxD RTS DTR RxD CTS DSR DCD RI GND
Název Transmit Data Request to Send Data Terminal Ready Receive Data Clear to Send Data Set Ready Data Carrier Detect Ring Indicator Ground
Funkce Datová linka Řídicí linka Řídicí linka Datová linka Řídicí linka Řidicí linka Řídicí linka Řídicí linka Signálová zem
Tabulka 3.2: Význam jednotlivých linek sériového rozhraní
Symboly v záhlaví tabulky 3.2 mají následující význam: K25 vyjadřuje číslo kontaktu na konektoru Cannon s 25 kontakty. K9 vyjadřuje číslo kontaktu na konektoru Cannon s 9 kontakty. I/O vyjadřuje, zda jde o vstupní, nebo o výstupní linku. Název obvykle vychází ze specifické funkce, kterou má daná linka při komunikaci s modemem. První dva sloupce tabulky 3.2 lze také chápat jako popis redukce mezi oběma konektory. Logická úroveň 1 je reprezentována napětím i1 ∈ (−3V, −15V ), logická úroveň 0 pak napětím i0 ∈ (+3V, +15V ). Napětí i ∈ (−3V, +3V ) nepřísluší žádné logické hodnotě. Vstupní
3.2. SÉRIOVÝ PORT
47
odpor vstupů činí přibližně 10kΩ.
3.2.1
Základní pojmy
Pro pochopení funkce SP je nutné seznámit se alespoň s následujícími základními pojmy: Character Frame: Data jsou posílána v tzv. rámcích (Character frames). Každý rámec obsahuje datové bity a řídicí bity. Uvnitř jednoho rámce se zpravidla přenáší jeden znak. Znak je zakódován v určitém počtu datových bitů, Data bits. Start Bit uvozuje začátek rámce. Je to řídicí bit reprezentovaný hodnotou log. 0. Klidový stav datové linky TxD je log. 1, tedy záporná hodnota napětí. Rámec je tedy uvozen kladným napěťovým pulzem. Baud Rate je rychlost přenosu dat mezi komunikujícími zařízeními. Baud rate odpovídá celkovému počtu bitů přenesených za 1 sekundu, datových i řídicích. Baud rate lze obvykle nastavit na hodnotu 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 14400, 19200, 28800, 38400 a 57600. Některé adaptéry umožňují nastavit i vyšší hodnotu. 9600 je nejobvyklejší hodnota pro většinu přístrojů. Data Bits: Počet datových bitů uvnitř jednoho rámce. Datové bity jsou uvnitř rámce přenášeny ihned po start bitu. Jsou kódovány „obráceněÿ4 a přenášeny „pozpátkuÿ. Jako první je přenesen nejméně významný bit (Least Significant Bit), totiž ten, který odpovídá nulté mocnině dvou v binární reprezentaci přenášeného znaku. Jako poslední je přenesen nejvýznamnější bit (Most Significant Bit). Parity Bit může ale nemusí následovat po Datových bitech. Je to řídicí bit. Má kontrolní význam. Vysílající i přijímající zařízení jsou předem „dohodnutaÿ, zda parita bude „sudáÿ (EVEN parity), nebo „licháÿ (ODD parity). Vysílající zařízení pak nastavuje paritní bit tak, aby celkový počet logických jedniček v datových bitech a v paritním bitu byl sudý, resp. lichý. přijímající zařízení paritu kontroluje. Stop bits: Počet stop bitů. Jsou to řídicí bity. Uvnitř rámce bezprostředně následují po datových bitech nebo po paritním bitu, pokud je přítomen. Počet stop bitů je nastavitelný na hodnotu 1; 1,5 a 2. Stop bity jsou vždy reprezentovány zápornou hodnotou napětí, tedy logickou jedničkou.
3.2.2
Využití sériového portu
Sériový port lze využít několika způsoby: V nejjednodušším případě vystačíme s výstupními linkamu DTR a RTS, kterými budeme ovládat nějaké velmi jednoduché zařízení. Mezi tyto linky a signálovou zem lze např. připojit luminiscenční diody (LED) s předřadným odporem (cca 1kΩ). Ovládáním těchto linek lze diody rozsvěcet a zhasínat. Analogicky lze použít vstupní řídicí linky pro čtení. Dále lze pomocí sériového portu realizovat datovou komunikaci s nějakým kompatibilním zařízením. K potvrzování správnosti průběhu komunikace (Handshaking) lze využít i řídicí 4
viz kódování logických hodnot
48
KAPITOLA 3. VYBRANÉ PERIFERIE PC
linky. Buďto je lze přímo ovládat, nebo lze jejich ovládání přenechat na obvodu UART, který SP řídí. V druhém případě je pro programátora ovládání řídicích linek skryto, funguje „na pozadíÿ.
3.2.3
Ovládání sériového rozhraní z LabVIEW
V LabVIEW existuje několik různých cest jak realizovat sériovou komunikaci. V paletě Functions → Instrument I/O → Serial nalezneme uzly pro komunikaci se sériovým portem. Jde o tzv. old fashion uzly. Jejich používání se v současné době již nedoporučuje. V paletě jsou přítomny pro zajištění kompatibility se staršími aplikacemi. Autor měl potíže s ovládáním řídicích linek sériového portu pomocí těchto funkcí. Druhou možností je využít k ovládání portu např. knihovnu dll, která příslušné funkce exportuje. Příklad komunikace multimetru Metex přes sériový port s využitím dll knihovny vytvořené v Delphi najde čtenář v archivu příkladů v souboru metex_dll.zip. Soubor obsahuje i zdrojový kód knihovny. Zmíněný postup však nebude v tomto textu podrobněji popsán. Společnost National Instruments vyvíjí komplexní rozhraní vyšší úrovně pro ovládání periferií. Jmenuje se NI-VISA5 . V podstatě jde o sadu tzv. API6 funkcí, které lze volat obecně téměř z libovolného programovacího jazyka a které umějí pracovat s širokou škálou různých zařízení, tedy zdaleka ne jen se sériovým portem. Existuje i rozhraní VISA pro LabVIEW, resp. pro jazyk G. Společnost National Instruments doporučuje používat toto rozhraní v nových aplikacích. Specifikaci VISA pro LabVIEW najde čtenář např. v [7], nebo v [17]. V následujícím textu se s VISA, přesněji řečeno s rozhraním VISA pro LabVIEW, seznámíme v míře postačující k realizaci komunikace s multimetrem Metex M-3680D. Sériový port je systémovým prostředkem. Abychom s ním mohli pracovat, musíme si jej vyhradit pro použití ve své aplikaci. Této fázi práce s portem říkáme „otevření portuÿ a v blokovém schématu ji bude realizovat uzel Functions → Instrument I/O → VISA → VISA Advanced - Visa Open. VISA Open produkuje RefNum, odkaz na otevřený sériový port, který budeme předávat dalším uzlům pro práci s portem. Dále je nutno nastavit parametry komunikace, tedy rychlost komunikace Baud Rate, počet datových bitů Data Bits, počet stop bitů Stop Bits a nastavit úroveň řídicí linky RTS RTS State. K nastavení parametrů komunikace se používá uzel Functions → Instrument I/O → VISA → VISA Advanced Property Node. Následně můžeme do portu zapisovat znaky pomocí uzlu Functions → Instrument I/O → VISA - VISA Read a číst pomocí uzlu Functions → Instrument I/O → VISA - VISA Write. Tyto uzly je popř. vhodné uzavřít do cyklu. Nakonec práce s portem je vhodné jej uzavřít, aby k němu mohly získat přístup ostatní aplikace, pokud si to vyžádají. Uzavření portu provedeme uzlem Functions → Instrument I/O → VISA → VISA Advanced - Visa Close.
5 6
National Instruments - Virtual Instruments Standard Architecture Application Programming Interface
3.2. SÉRIOVÝ PORT
3.2.4
49
Multimetr M-3860D
Multimetr Metex M-3860D je univerzální digitální měřicí přístroj schopný odeslat právě změřenou veličinu přes RS-232 do PC.
Obrázek 3.5: Metex M-3860D
Komunikační protokol multimetru je velice jednoduchý. V podstatě jediná činnost, kterou multimetr umí přes SP provádět je poslat typ měřené veličiny, její hodnotu a jednotku. To vše v jediném čtrnáctiznakovém řetězci. Multimetr využívá při komunikaci 5 linek sériového rozhraní PC: TxD, RxD, SG, DTR a RTS. Linka TxD je využita k posílání příkazů do multimetru. Linka RxD slouží pro příjem dat z multimetru. SG je signálová zem, vůči níž jsou napětí na ostatních linkách vztažena. Zbývající řídicí linky DTR a RTS nemají žádný praktický význam, avšak linka DTR musí být během komunikace nastavena na úroveň log. 1 a linka RTS na log. úroveň log. 0, jinak sériové rozhraní multimetru nepracuje. Multimetr rozumí třem příkazům: Na příkaz „Dÿ pošle právě změřenou hodnotu. Na příkaz „Mÿ pošle obsah vnitřní paměti. Na příkaz „Cÿ vymaže obsah vnitřní paměti. Chceme-li tedy získat právě změřenou hodnotu pošleme do multimetru příkaz „CDÿ. Multimetr vzápětí odešle čtrnáctiznakový řetězec, jehož první dva znaky identifikují měřenou veličinu, v následujících 7 znacích je zakódována hodnota měřené veličiny, předposlední 4 znaky identifikují její jednotku a poslední znak je vždy znak konce řádku. Význam jednotlivých kódů uvnitř přijatého řetězce uvádí následující tabulka 3.3. Ve sloupci „Veličinaÿ jsou uvedeny všechny kódy, které se mohou vyskytnout na prvních dvou místech řetězce. Sloupec „Jednotkaÿ obsahuje seznam všech kódů, které se mohou objevit na 10. až 13. pozici v řetězci. Multimetr vyžaduje nastavení parametrů portu uvedené v tabulce 3.4. Blokový diagram velmi jednoduchého VI, které realizuje čtení popsaného čtrnáctimístného řetězce z multimetru, je uveden na následujícím obrázku 3.6. Uzel Functions → Instrument I/O → VISA → VISA Advanced - VISA Open otevře sériový port. K jeho terminálu VISA Resource Name je připojena stejnojmenná konstanta. Lze ji vytvořit klepnutím na uzel pravým tlačítkem myši a volbou Create Constant v menu, které se objeví. Hodnotu konstanty pak určíme ručičkou ( ). Budeme mít možnost vybrat si z několika voleb, podle toho která
50
KAPITOLA 3. VYBRANÉ PERIFERIE PC Veličina DC-AC DC-AC OH CA FR hF DI TM LO
Jednotka mV, V mA, A Ohm, KOhm, MOhm nF,uF KHz, MHz mV C -
Význam stejnosměrné-střídavé elektrické napětí stejnosměrný-střídavý elektrický proud elektrický odpor kapacita kondenzátoru frekvence střídavého signálu test tranzistoru test diody Celsiova teplota logická úroveň napětí
Tabulka 3.3: Kódování v řetězci odeslaném multimetrem Metex M-3860D přenosová rychlost (Baud Rate) počet datových bitů (Data Bits) počet stop bitů (Stop Bits) parita
1200 bps 7 2 žádná
Tabulka 3.4: Parametry sériového přenosu
Obrázek 3.6: VI pro čtení z multimetru Metex přes RS-232
rozhraní jsou v systému právě nainstalována. ASRL1::INSTR je kód pro první sériový port, obdobně ASRL2::INSTR kóduje druhý sériový port. 3.4. Parametry otevřeného portu nastavíme s využitím uzlu Functions → Instrument I/O → VISA → VISA Advanced - Property Node. Tento uzel má nastavitelný počet vstupních a výstupních terminálů, viz odstavec 1.12.1 na straně 21. Ručičkou ( ) lze v jednotlivých políčcích Property Node nastavit požadovanou vlastnost. Každé políčko je určeno buďto pro čtení, nebo pro zápis. Tuto vlastnost nastavíme v menu pod pravým tlačítkem myši (položka Change to Read, resp. Change to Write). Vybereme tedy potřebné vlastnosti nastavíme je k zápisu a pomocí konstant jim přisoudíme hodnoty podle tabulky 3.4. V následujícím cyklu WHILE opakovaně provádíme zápis příkazu CD do portu a čtení čtrnáctiznakového řetězce z portu. K zápisu je využitý uzel Functions → Instrument I/O → VISA - VISA Read a ke čtení uzel Functions → Instrument I/O → VISA - VISA Write. Cyklus skončí jakmile uživatel klepne na tlačítko stop, jež je reprezentací stejnojmenného terminálu v blokovém diagramu. Uzlu D odpovídá v čelním panelu Controls → String & Path - String Indicator, ve kterém se zobrazuje přijatý řetězec.
3.3. ROZHRANÍ GPIB
51
Na závěr sériový port uzavřeme uzlem Functions → Instrument I/O → VISA → VISA Advanced - VISA Close. Připomeňme, že všechny uzly pracující s portem jsou propojeny hranou RefNum, která přenáší identifikátor sériového portu, se kterým pracujeme. VI s blokovým diagramem z obr. 3.6 je uloženo v archivu příkladů pod názvem 013.vi.
3.3
Rozhraní GPIB
Rozhraní GPIB7 je osmibitové paralelní rozhraní s přenosovou rychlostí až 1 MB/s. Umožňuje připojit až 15 zařízení. Mezi nimi mohou být i počítače. Rozhraní GPIB pro PC bývá realizováno jako zásuvná karta do rozšiřující sběrnice, obvykle do PCI, výjimečně ještě i do ISA. Propojovací kabely jsou zakončeny masivními oboustrannými konektory s 24 kontakty. Viz obr. 3.7.
Obrázek 3.7: GPIB karta pro sběrnici ISA s oboustranným konektorem Problematika sběrnice GPIB je rozsáhlá a k pochopení principu její činnosti je třeba prostudovat vhodnou odbornou literaturu. V následujícím textu se omezíme na velmi speciální případ kdy je sběrnice využita k propojení PC a jednoho měřicího přístroje. V PC je přitom instalována pouze jediná GPIB karta. Všechna zařízení propojená sběrnicí GPIB mají přidělenu jedinečnou adresu. Adresa se skládá ze dvou částí - povinné primární adresy a volitelné sekundární adresy. Primární adresou je číslo v rozmezí 0. .31, přičemž adresa 31 je určena pro speciální účel a běžně se nevyužívá. Primární adresa zařízení se kterým budeme komunikovat je jedinou informací technického 7
General Purpose Interface Bus
52
KAPITOLA 3. VYBRANÉ PERIFERIE PC
charakteru, jejíž znalost je pro realizaci komunikace nezbytná. V LabBIEW lze realizovat komunikaci přes GPIB několika různými způsoby. Lze využít funkcí z palety Functions → Instrument I/O → GPIB, funkcí z palety Functions → Instrument I/O → GPIB → GPIB 488.2, nebo funkcí VISA které již byly zmíněny v souvislosti s komunikací přes sériový port.8 Další možností je použít originální firemní VI pro ovládání multimetru. Jsou dostupná z Functions * Instrument I/O * Instrument Drivers * HP 34401A Multimeter. Způsob použití těchto uzlů je podrobně popsán v [14] a v elektronické nápovědě LabVIEW, kde také čtenář najde demonstrační příklady. V tomto textu bude popsáno použití funkcí VISA. Navíc budou uvedeny odkazy na příklady použití i ostatních zmíněných funkcí, avšak bez komentáře. Rozhraním GPIB je vybavený například multimetr Hewlett Packard 34401A. V dalším uvedeme příklad komunikace s tímto zařízením. Po zapnutí multimetr krátce zobrazí svou primární adresu. Tu lze eventuálně změnit postupem popsaným v [4] Multimetr lze ovládat tzv. příkazy SCPI 9 . Ty jsou podrobněji popsány např. v [4]. Stejně jako při komunikaci přes sériové rozhraní s využitím NI-VISA je i zde nutné zachovat popsaný postup pro manipulaci se systémovými prostředky. Rozhraní je nutno nejprve „otevřítÿ, tedy vyhradit jej pro použití ve své aplikaci. Tuto funkci plní uzel Functions → Instrument IO → VISA → VISA Advanced - VISA Open. Tomuto uzlu je nutno předat identifikaci zařízení se kterým se má pracovat. To provedeme připojením konstanty k terminálu VISA Resource. Konstanta má v tomto případě tvar GPIB0::7::INSTR, kde 7 představuje konkrétní bázovou adresu multimetru. Uzel Functions → Instrument IO → VISA - VISA Clear realizuje vyprázdnění vyrovnávací paměti rozhraní. Zápis do rozhraní se provede uzlem Functions → Instrument IO → VISA - VISA Write, čtení z rozhraní uzlem Functions → Instrument IO → VISA - VISA Read. Tyto uzly je podle potřeby možno uzavřít do cyklu. Po skončení práce je vhodné rozhraní zavřít funkcí Functions → Instrument IO → VISA → VISA Advanced - VISA Close. Mezi všemi uzly VISA je nutno předávat odkaz RefNum na konkrétní rozhraní se kterým pracujeme.
3.3.1
Jednoduchý odečet z HP34401A
Zde uvedeme nejjednodušší VI které zabezpečí jednorázový odečet z multimetru HP34401A s využitím funkcí VISA. Blokový diagram VI které tento úkol zrealizuje vidíme na následujícím obrázku 3.8. Uzel VISA Open otevře GPIB rozhraní pro komunikaci s přístrojem s primární adresou 7, což je dáno konstantou přivedenou na terminál VISA Resource Name tohoto uzlu. VISA Open vyprodukuje Resource Name, které budeme předávat následujícím uzlům VISA. Uzlu VISA Write předáme jako vstupní parametr SCPI příkaz READ? a znak konce řádku, který 8 9
Také je samozřejmě možné přistupovat k GPIB přes procedury exportované nějakou knihovnou DLL. Standard Commands for Programmable Instruments
3.4. UNIVERZÁLNÍ MĚŘICÍ KARTA PCI-6023E
53
Obrázek 3.8: VI pro jednorázový odečet z multimetru HP34401A vynutí poslání řetězce s právě změřenou hodnotou, příslušnou veličinou a jednotkou. Tento řetězec má délku 16 znaků. Zjistíme jej dotazem na rozhraní pomocí uzlu VISA Read. Zjištěnou hodnotu zobrazíme a ukončíme práci s rozhraním pomocí uzlu VISA Close.
3.3.2
Odkazy na další ukázková VI pro čtení z HP34401A
Popsané VI najde čtenář v archivu příkladů pod názvem 110.vi. Tamtéž jsou dostupná následující ukázková VI: Jednorázový odečet z HP34401A s využitím funkcí Functions → Instrument I/O → GPIB v souboru 111.vi. Jednorázový odečet z HP34401A s využitím funkcí Functions → Instrument I/O → GPIB → GPIB 488.2 v souboru 112.vi. VI pro opakovaný odečet několika hodnot v přesně daných časových odstupech s následným vykreslením změřených hodnot v grafu v souborech 108.vi a 109.vi.
3.4
Univerzální měřicí karta PCI-6023E
PCI-6023E je univerzální měřicí karta, která se v současnosti standardně dodává spolu se softwarovým balíkem LabVIEW Starter Kit. Měřicí karta je určena pro rozšiřující sběrnici PCI. Je vybavena kabelem a tzv. dceřinnou deskou se svorkovnicí. Technickou specifikaci karty najde čtenář v [1]. V podstatě jde o univerzální měřicí kartu s 16 analogovými vstupy a osmi digitálními vstupy a výstupy. Karta PCI-6023E není vybavena analogovými výstupy. Je osazena 12 bitovým AD převodníkem. Maximální vzorkovací frekvence činí 200 kHz na analogových vstupech. Citlivost závisí na nastaveném rozsahu. V nejlepším případě pak činí 24, 41µV . Dále bude stručně popsán jeden ze způsobů přístupu k této kartě z LabVIEW pod OS Windows. Ovladač ke kartě je mezi jinými nainstalován při instalaci LabVIEW. V programu Measurement & Automation Explorer (MAX) provedeme následující nastavení: V oddíle Data Neighbourhood se vytvoří tzv. virtuální kanál. Tím se určí veličina, která má být měřena (např. elektrické napětí, elektrický odpor a pod.), rozsah měřené veličiny atd. Na tomto místě jsou také vybrány konkrétní svorky dceřinné desky na kterých bude měření provedeno. Bohužel označení svorek neodpovídá značení na dceřinné desce. Převodní tabulka mezi oběma značeními je uvedena v [1]. Nakonec se kanálu přidělí jméno pomocí něhož se na něj budeme z LabVIEW odkazovat. Přístup z LabVIEW předvedeme přímo na konkrétních příkladech. Předpokládejme, že
54
KAPITOLA 3. VYBRANÉ PERIFERIE PC
Obrázek 3.9: PCI-6023E s kabelem a dceřinnou deskou máme vytvořen kanál Napeti v Measurement & Automation Exploreru. Z tohoto kanálu je pak možno číst s využitím uzlu Functions → Data Acquistion → Analog Input Al Sample Channel.vi. Kanál zvolíme nastavením konstanty Channel kterou vytvoříme volbou Create Constant pod pravým tlačítkem nad terminálem Channel uzlu Al Sample Channel.vi. Číslo, které je výstupem tohoto uzlu je možno dále zpracovat. Na následujícím obrázku 3.10 je blokový diagram velmi jednoduchého VI pro přečtení jediné hodnoty z kanálu Napeti.
Obrázek 3.10: PCI-6023E Odečet hodnoty z kanálu Napeti VI s blokovým diagramem z obrázku 3.10 je uloženo v archivu příkladů pod názvem 102.vi. Druhé ukázkové VI realizuje načtení vzorku ze zvolených dvou kanálů kanálu. Blokový diagram tohoto VI znázorňuje obrázek 3.11. Předpokládejme, že existují pojmenované kanály Napeti a Napeti2 na nichž lze měřit elektrické napětí. Všechny uzly, které budeme pro práci s kanály potřebovat se nacházejí na paletě Functions → Data Acquistion → Analog Input. Nastavení vzorkovací frekvence a počtu jednotlivých měření, ze kterých se budou vzorky skládat se realizuje vhodným nastavením konstant scan rate a number of scans to acquire, které jsou připojeny k odpovídajícím terminálům uzlu Al Start.vi. Samotný odečet pak vykoná uzel Al Read.vi,
3.5. UNIVERZÁLNÍ MĚŘICÍ KARTA PCL-818L
55
Obrázek 3.11: PCI-6023E Odečet vzorku z více kanálů který vyprodukuje pole složené z položek typu waveform. Jejich počet je dán počtem kanálů na kterých se měří. VI s blokovým diagramem z obr. 3.11 dále určí frekvenci převažující v jednotlivých vzorcích a nakonec vykreslí graf, kde na souřadnicové osy vynese data z jednoho a druhéh kanálu. VI je původně určeno ke kreslení Lissajoussových obrazců. VI s blokovým diagramem z obrázku 3.11 se nachází v archivu příkladů pod názvem 101.vi.
3.5
Univerzální měřicí karta PCL-818L
Na základě této univerzální měřicí karty je postavena známá měřicí souprava ISES Professional.10 Souprava ISES se však dodává i s jinými měřicími deskami, zejména firmy Axiom. Dále bude popsán případ soupravy ISES Professional založené na měřicí kartě Advantech PCL 818L. Standardní dceřinná deska je nahrazena komfortní svorkovnicí ke které lze navíc připojovat různé měřicí moduly, jako např. voltmetr, ampérmetr, optickou závoru, mikrofon a další. Měřicí karta PCL 818L je vybavena 16 analogovými vstupy, z nichž 8 je vyvedeno na svorkovnici soupravy ISES Professional a stejným počtem analogových výstupů. Maximální vzorkovací frekvence činí 40 kHz. Karta je vybavena 12 bitovým AD převodníkem. Technická specifikace měřicí karty je dostupná na webových stránkách firmy Advantech. Pro přístup k PCL 818 z LabVIEW je nutno nejdříve nainstalovat tzv. DLL Driver pro tuto měřicí kartu a poté rozhraní pro LabVIEW, tzv. LabVIEW Driver. Oba ovladače jsou zdarma dostupné na webových stránkách firmy Advantech. Postup instalace driverů je popsán v návodu který je k ovladačům přiložen a také v [15]. Po korektní instalaci ovladačů se v paletě Functions objeví nová položka User Libraries → Advance. Zde se nacházejí uzly pro práci s měřicí deskou. Nejjednodušší aplikace pro jednorázový odečet z jednoho kanálu soupravy ISES realizuje VI, jehož blokový diagram je uveden na obrázku 3.13. 10
Intelligent School Experimental System
56
KAPITOLA 3. VYBRANÉ PERIFERIE PC
Obrázek 3.12: ISES Professional - měřicí karta, svorkovnice a některé měřicí moduly
Obrázek 3.13: VI pro jednorázový odečet hodnoty z jednoho kanálu soupravy ISES Professional Společně s ovladačem pro LabVIEW se dodává dokumentace, kde je použití jednotlivých uzlů pracujících s kartou podrobně popsáno. V této dokumentaci je popsáno jakým způsobem mají být konkrétní uzly řazeny aby se dosáhlo kýženého cíle. Podrobný popis funkce jednotlivých uzlů však v této dokumentaci obsažen není. V příkladu z obr. 3.13 se odečet provádí cyklicky, avšak časová prodleva mezi jednotlivými měřeními závisí na výkonu systému a není konstantní. Pro využití vyšších vzorkovacích frekvencí je třeba využít přístupu DMA, nebo IRQ. Použití těchto technik je v dokumentaci k ovladači taktéž popsáno. VI s blokovým diagramem z obrázku eikutrhmfce je uloženo v archivu příkladů pod názvem 104.vi. V archivu příkladů je dále dostupné VI pro jednorázový odečet z více analogových vstupů pod názvem 107.vi a VI pro načtení vzorku s danými parametry s využitím přístupu DMA pod názvem 105.vi. Posledně zmíněné VI však nelze použít v OS typu Windows NT.
3.5. UNIVERZÁLNÍ MĚŘICÍ KARTA PCL-818L
57
Kapitola 4
Precese setrvačníku V této kapitole se budeme zabývat konkrétním měřením s využitím dříve popsaných postupů. Zrealizujeme přípravu k demonstraci precesního pohybu těžkého setrvačníku.
4.0.1
Teoretický základ
Setrvačníkem rozumějme osově symetrické homogenní tuhé tělěso, které má v laboratorní vztažné soustavě zafixován právě jeden bod. Tento bod leží na ose symetrie setrvačníku, avšak mimo jeho hmotný střed. Laboratorní vztažnou soustavu považujme za inerciální. Moment setrvačnosti J vzhledem k ose symetrie setrvačníku je výrazně větší, než moment setrvačnosti vzhledem k osám kolmým k ose symetrie. Takový setrvačník pohybující se v homogenním tíhovém poli se obvykle v literatuře označuje za těžký setrvačník.
Obrázek 4.1: Těžký setrvačník (nákres převzat z [3]) Pokud setrvačník roztočený kolem své osy upevníme v bodě O tak, že osa setrvačníku svírá se svislicí úhel α (viz obr. 4.1), pak tíha setrvačníku spolu s reakcí závěsu v bodě O 58
59 ~ je kolmý k ose rotace, leží ve vodorovné rovině procházející dává dvojici sil, jejíž moment M bodem O a snaží se osu rotace setrvačníku sklonit dolů. Analytický výpočet reakce těžkého setrvačníku na toto vnější působení je značně obtížný a lze jej provést pouze ve speciálním případě (setrvačník S. Kovalevské, viz např. [2], str. 87). V následujícím textu bude odvozeno zjednodušené řešení vycházející z předpokladu, že ~ je slabá. V tomto případě vlastní rotace setrvačníku je velmi rychlá a že dvojice vnějších sil M se směr osy rotace setrvačníku mění přibližně stejně, jako směr vektoru momentu hybnosti setrvačníku. ~ 0 tuhého tělesa Podle druhé impulzové věty (4.1) je časová změna momentu hybnosti L ~ 0 které na těvzhledem k určitému pevnému bodu rovna úhrnnému momentu vnějších sil M leso působí vzhledem k témuž bodu. ~0 dL ~0 =M dt
(4.1)
Setrvačník se otáčí kolem volné osy úhlovou rychlostí ω ~ a proto mu přísluší moment setr~ ~ mění směr vektoru vačnosti L = J~ ω . Podle druhé impulzové věty (4.1) se vlivem momentu M ~ v prostoru. Se zřetelem k výše uvedenému zjednodušujícímu předpokladu platí (4.2) L ω . d~ ~ = M J dt
(4.2)
~ , kolmý ke svislé rovině proložené okamžitou Vektor d~ ω má shodný směr s vektorem M polohou osy rotace setrvačníku. Tato rovina se tedy za čas dt pootočí o elementární úhel dϕ kolem svislé osy závěsu setrvačníku OV , viz obr. 4.1. Zároveň se však o stejný úhel pootočí ~ dvojice vnějších sil. Osa setrvačníku se tedy nepoddá působení silové dvojice také vektor M ~ M a nesklopí se dolů, jak bychom snad očekávali, nýbrž opisuje tzv. precesní kužel. Z obrázku je vidět, že dω = rdϕ = ω sin α dϕ, vektorově d~ ω = d~ ϕ×ω ~ . Odtud plyne vztah 4.3 ϕ×ω ~ . d~ ~ = ~ ×ω M J = J(Ω ~) dt
(4.3)
~ = d~ neboť Ω ϕ/dt. Označíme-li l vzdálenost hmotného středu setrvačníku T od bodu O v ~ následující vztah 4.4. němž je osa setrvačníku fixovaná, platí pro velikost vektoru M
M = mgl sin α
(4.4)
60
KAPITOLA 4. PRECESE SETRVAČNÍKU
. Z rovnice 4.3 plyne, že M = JΩω sin α. Odtud srovnáním s 4.4 obdržíme vzájemnou závislost velikosti úhlové rychlosti precese Ω a velikosti úhlové rychlosti setrvačníku ω (4.5), kde nevystupuje úhel α sklonění osy rotace setrvačníku vůči svislici.
. mgl Ω= Jω
(4.5)
Podle 4.5 s klesající velikostí úhlové rychlost setrvačníku ω roste velikost úhlové rychlosti precese Ω. Zlogaritmováním vztahu 4.5 obdržíme rovnici přímky v proměné ln ω.
mgl . ln Ω = − ln ω + ln J
4.0.2
(4.6)
Technická realizace
Naším cílem nyní bude kvalitativně vyšetřit precesní pohyb setrvačníku. Provedeme měření, jehož výstupem bude časový průběh rychlosti vlastních otáček setrvačníku ω(t) a časový průběh rychlosti precesního pohybu Ω(t) a ukážeme, že obě veličiny jsou svázány vztahem (4.5), resp. (4.6). Následující obrázek 4.2 znázorňuje uspořádání experimentálního zařízení. Precesní pohyb je v tomto uspořádání velmi pomalý, jedna otáčka za několik sekund. Naprotitomu vlastní rotace setrvačníku je poměrně rychlá, stovky otáček za sekundu. Snímání precesního pohybu se realizuje upravenou sériovou myší. Závěs setrvačníku je upevněn v ložisku a mechanicky spojen s jedním ze dvou otáčivých senzorů. kterými je myš vybavena. Vlastní rotace setrvačníku je snímána nepřímo. Na setrvačníku je upevněn magnet, resp. dva souhlasně orientované magnety1 , takže setrvačník ve svém okolí vytváří během rotace časově proměnné magnetické pole. V blízkosti setrvačníku je umístěna cívka (cca 600 závitů, . φ = 15cm) v jejichž závitech vzniká podle zákona elektromagnetické indukce časově proměnné elektrické napětí. Časový průběh napětí indukovaného v závitech cívky je periodický s periodou rovnající se době jedné otáčky setrvačníku. Amplituda výstupního signálu závisí na úhlu α sklonění osy setrvačníku vůči svislici pouze nepatrně, což je výhodné. Signál z cívky je přivedený na mikrofonní vstup zvukové karty a dále zpracován. Počítačové zpracování obou signálů je realizováno jedinou aplikací vytvořenou v LabVIEW.
1 Jsou použity obyčejné magnety pro upevňování listů papíru na magnetickou tabuli. Ty jsou navíc opatřeny plastovými kryty, které brání úniku střepin v případě, že by magnety vlivem značných odstředivých sil praskly. Otvory v magnetech byly vyvrtány dentálním vrtáčkem s kulatou hlavou.
61
4.0.3
Zpracování vstupních signálů
Ke snímání rychlosti precesního pohybu je použita upravená sériová myš typu Mouse Systems Mouse. Taková myš odešle při vzniku události, jako je pohyb, nebo stisk tlačítka, pětici znaků. V prvním znaku je vždy obsažena informace o stavu jednotlivých tlačítek myši, druhý znak reprezentuje informaci o změně polohy myši v pravo-levém směru a třetí znak z pětice reprezentuje informaci o změně polohy myši ve směru shora dolů. Podrobnější informace a odkazy na další zdroje nalezne čtenář v odstavci B na straně 71. První z pětice znaků odeslaných sériovou myší má ordinální hodnotu 80, 81, 82, 83, 84, 85, nebo 86 pokud je stisknuto některé ze tří tlačítek myši, nebo jejich kombinace, nebo ordinální hodnotu 87, pokud žádné tlačítko stisknuto není. Ordinální hodnota 2. a 3. znaku určuje počet jednotek posunutí v příslušném směru od posledního odeslání dat. Citlivost otáčivého senzoru sériové myši byla určena experimentálně. Zjištěná hodnota činí (71958 ± 8) · 10−3 jednotek na jednu otočku. 2 K sériové myši se v tomto případě přistupuje jako k obecnému sériovému perifernímu zařízení, tedy bez využití ovladače myši, který je součástí OS. Myš je vhodné k PC připojit až po proběhnutí automatické detekce nového hardwaru, tedy až k běžícímu počítači, neboť jinak bude systém myš považovat za standardní vstupní zařízení, naváže na ni svůj ovladač a znemožní k ní přímý přístup uživatelským aplikacím3 . Signál ze zvukové karty je zpracován standardním postupem popsaným v oddíle 3.1 na straně 41. Blokový diagram VI pro načítání experimentálních dat je uveden na obrázku 4.3. Na první pohled je rozdělený na dvě autonomní části reprezentované WHILE cykly. Horní cyklus slouží k načítání úhlu precesního pootočení (označme jej ϕ), nikoliv přímo velikosti úhlové rychlosti precese Ω, přes sériové rozhraní. Ve spodním cyklu je pak realizováno načítání dat ze zvukové karty a určování rychlosti vlastních otáček setrvačníku ω. Protože je získání vzorku ze zvukové karty a následný výpočet frekvence, která ve vzorku převažuje, náročný na kapacitu procesoru, je odečet realizován pouze jednou za 2 sekundy. Snížení této hodnoty se výrazně projeví formou „skokůÿ v grafu ϕ(t). Po spuštění VI se čeká na signál pro start měření. Čekání realizuje uzel Start, v rámci kterého dojde i k nastavení parametrů komunikace. Uzel Start je samostatným VI, jehož popis a blokový diagram bude pro úplnost uveden v závěru kapitoly. Signálem pro start měření je stisk libovolného tlačítka myši upravené pro snímání precesního pohybu. Jakmile tento signál vznikne začnou probíhat oba WHILE cykly. 2
Ve víceúlohovém OS nelze zajistit přečtení všech odeslaných dat v určitém čase. Měření bylo realizováno na i686 Celeron / 333 Mhz, 32 MB RAM, OS Windows 98. 3 Pokud jsou k PC připojeny 2 myši před automatickou detekcí nového hardwaru, chovají se systémy typu Windows tak, že na obě myši naváží standardní ovladač. Ve výsledku si pak obě myši konkurují a lze se jimi „přetahovat o kurzorÿ. Vzniklou situaci pak lze řešit zakázánim použití jedné z myší ve správci zařízení.
62
KAPITOLA 4. PRECESE SETRVAČNÍKU
V horním cyklu jsou průběžně vytvářena dvě pole. V horním poli (A) jsou shromažďovány časové údaje ti1 [s] jednotlivých měření a ve spodním poli (B) pak odpovídající hodnoty úhlu precesního pootočení ϕ(ti1 ) [rad]. Během načítání dat se průběžně vykresluje graf ϕ(t). (v diagramu na obr. 4.3 reprezentován terminálem PRECESE). Ve spodním cyklu dojde jednou za 2 sekundy k odebrání vzorku ze zvukové karty. Tento vzorek je následně filtrován uzlem Functions → Analyze → Signal Processing → Filters - Elliptic Filter k odstranění rušivých frekvencí. Konkrétně jsou ve vstupním signálu potlačeny frekvence převyšující 130 Hz a frekvence nižší, než 20 Hz. Tyto rušivé frekvence se indukují ve snímací cívce vlivem rušivého magnetického pole, které je v laboratoři přítomno, jednak vznikají nedokonalostí elektroniky zvukové karty. Frekvence 50 Hz síťového elektrického rozvodu však kupodivu nepřispívá ke zhoršení kvality vstupního signálu příliš výrazně. Následně se realizuje určení nejvýraznější frekvenční složky přefiltrovaného signálu. Podobně jako v horním cyklu blokového diagramu VI, kde se shromažďují informace o úhlu precesního pootočení ϕ(ti1 ), vytváří se i v dolním cyklu dvě pole. V horním poli (C) shromažďujeme časy jednotlivých měření ti2 [s] a ve spodním poli příslušné hodnoty rychlosti vlastních otáček setrvačníku ω(ti2 ) [rad/s]. Během načítání dat se přůběžně vykresluje graf ω(t) (v diagramu na obr. 4.3 reprezentován terminálem VLASTNÍ ROTACE). Načítání vstupních hodnot je ukončeno stiskem tlačítka KONEC & ULOŽIT, které je v blokovém diagramu reprezentováno terminálem STOP. Nakonec jsou získaná data uložena do souborů, které určíme v dialogových oknech. Dialogy pro uložení do souborů jsou vyvolány v pořadí daném strukturou SEQUENCE v pravé části diagramu. Výsledkem jsou tedy dva datové soubory v nichž jsou data uspořádána v řádcích, kde na jednom řádku je vždy naměřená veličina, znak tabulátoru, příslušný čas měření a znak konce řádku. VI pro načítání vstupních dat s blokovým diagramem z obrázku 4.3 najde čtenář v archivu příkladů pod názvem 113.vi. Právě tam čtenář nalezne i nezobrazené rámy struktur SEQUENCE v blokových diagramech na výše zmíněných obrázcích.
4.0.4
Výsledky
Ve VI z obr. 4.3 jsme načetli data popisující časovou závislost úhlu precesního pootočení ϕ(t) a úhlovou rychlost setrvačníku ω(t). Grafy těchto závislostí jsou pro přehlednost uvedeny v příloze A na straně 68. Výstupem zmíněné aplikace jsou dva textové soubory s daty, které lze zpracovat libovolným způsobem. Právě k tomuto účelu však byla vytvořena další aplikace LabVIEW, kterou čtenář nalezne v archivu příkladů pod názvem 115.vi. Tato aplikace umožňuje otevřít soubory s naměřenými daty, provést jejich zpracování a výsledky uložit do dalšího datového souboru. Výstupem 115.vi jsou data popisující závislost velikosti úhlové rychlosti precese Ω(t) na velikosti úhlové rychlosti setrvačníku ω(t) Blokový diagram 115.vi je uveden taktéž v příloze A. Zpracování s využitím 115.vi probíhá následujícím způsobem: Grafem časové závislosti
63 ϕ(t) se proloží aproximační polynom f metodou nejmenších čtverců. Vhodný stupeň aproximačního polynomu lze zvolit interaktivně. Graf aproximačního polynomu se průběžně překresluje přes graf výchozí závislosti. Současně se zobrazuje příslušná střední kvadratická odchylka, která klesá s rostoucí „dokonalostíÿ fitu. Časovou závislost velikosti úhlové rychlosti precese Ω(t) určíme zderivováním polynomu f . Nakonec se spočte 100 funkčních hodnot polynomu f 0 , které představují velikost úhlové rychlosti precese Ω v přesně daných časech {ti3 }. Abychom získali hodnoty velikosti úhlové rychlosti setrvačníku příslušné časům {ti3 }, proložíme také grafem ω(t) aproximační polynom g analogickým způsobem. Na závěr taktéž určíme 100 funkčních hodnot polynomu g, které přísluší právě časům {ti3 }. Tím jsme obdrželi dostatečně rozsáhlý datový soubor pro vykreslení závislosti velikosti úhlové rychlosti precese na velikosti úhlové rychlosti Ω(ω). Podle teoretického modelu popsaného rovnicí 4.5 na straně 60 by měla být grafem této závislosti hyperbola, v logaritmických škálách obou os pak přímka podle rovnice 4.6. Na následujícím obrázku 4.4 vidíme graf závislosti velikosti úhlové rychlosti precese Ω na velikosti úhlové rychlosti vlastních otáček setrvačníku ω. Vykresleno je oněch 100 bodů, které přísluší časům {ti3 }.
4.0.5
Závěr
Z grafu na obr. 4.4 je patrné, že setrvačník se opravdu chová podle teoretického předpokladu. Velikost úhlové rychlosti vlastních otáček setrvačníku ω klesá vlivem tření setrvačníku o vzduch a vlivem tření v ložiscích setrvačníku. Současně vzrůstá velikost úhlové rychlosti precesního pohybu Ω. Zbývá vyložit poslední jev, který je během demonstrace pokusu naprosto zjevný - osa setrvačníku se během pokusu sklápí dolů. Je třeba si uvědomit, že ložisko závěsu setrvačníku klade precesnímu pohybu nezanedbatelný odpor. Vlivem třecích sil v tomto ~ 0 , která v podstatě způsobuje jeho preložisku působí na osu setrvačníku další silová dvojice M cesní pohyb ve směru kolmém ke svislici směrem dolů. Sklápění osy setrvačníku dolů je tedy taktéž precesním pohybem. V důsledku této skutečnosti lze bržděním nebo urychlováním osy závěsu setrvačníku ovlivňovat úhel α sklonu osy setrvačníku vůči svislici a tím demonstraci oživit.
64
KAPITOLA 4. PRECESE SETRVAČNÍKU
Obrázek 4.2: Uspořádání experimentálního zařízení
65
Obrázek 4.3: Blokový diagram VI pro čtení experimentálních dat
66
KAPITOLA 4. PRECESE SETRVAČNÍKU
Obrázek 4.4: Graf závislosti Ω(ω), logaritmické osy
Literatura [1] 6023E User Manual: [On-line] 2002. Dostupné z http://www.ni.com/. [2] Czudková, L.: Dizertační práce, Vybrané problémy mechaniky soustav hmotných bodů a tuhého tělesa. PřF MU Brno 2002. [3] Horák, Z., Krupka, F.: Fyzika. 3. vyd. Praha: SNTL, 1976. [4] HP 34401A Multimeter, User’s Guide: Hewlett Packard 1996. [5] Kainka, B., Berndt, H.: Využití rozhraní PC pod Windows: Nakladatelství HEL Ostrava, 2000. [6] Navrátil, Z.: Diplomová práce, Programové vybavení pro výuku moderních fyzikálních metod měření. PřF MU Brno 2001. Dostupné také On-line z ftp://ftp.muni.cz/pub/muni.cz/physics/education/diploma/navratil/. [7] NI-LabVIEW Measurements Manual: [On-line] 2002. Dostupné z http://www.ni.com/. [8] NI-LabVIEW User Manual: [On-line] 2002. Dostupné z http://www.ni.com/. [9] NI-VISA Programmer Reference Manual: [On-line] Dostupné z http://www.ni.com/. [10] Ondráček, Z.:Elektronika pro fyziky. MU Brno, 1998. [11] Pavelek, M., Štětina, J.: Experimentální metody v technice prostředí. VUTIUM Brno, 1997. [12] Poinsett D.: Serial Communication with Borland C++ Builder. [On-line] 2002. Dostupné z http://www.traverse.com/people/poinsett/bcbcomm.html. [13] Simandl P.: Myš PC. [On-line] 2002. Dostupné z http://www.hw.cz/. [14] Šťastný, F.: Multimetr Hewlett Packard 34401A ftp://ftp.muni.cz/pub/muni.cz/physics/education/.
[On-line]
Dostupné
z
[15] Šťastný, F.: Ovládání ISESu Profesionál z prostředí LabVIEW. [On-line] Dostupné z ftp://ftp.muni.cz/pub/muni.cz/physics/education/. [16] Virius, M.: C++ Builder 4.0. Praha, Grada Publishing 1999. [17] VPP-4.3.3: VISA Implementation Specification for the G Language. [On-line] 2002. Dostupné z http://www.ni.com/. [18] Walz S.: mouse.how (zveřejněný email). Dostupné na přiloženém CD (/txt/mouse.how).
67
Příloha A
Precese setrvačníku V této příloze jsou uvedeny některé grafy a blokové diagramy aplikací, které nebyly z důvodu přehlednosti začleněny do textu kapitoly o precesi setrvačníku. Následující grafy A.1 a A.2 znázorňují přímo naměřené veličiny ϕ(t) a ω(t).
Obrázek A.1: Graf závislosti velikosti úhlu precesního pootočení na čase
Obrázek A.2: Graf závislosti velikosti úhlové rychlosti setrvačníku na čase 68
69 Následující graf je odpovídá grafu 4.4 na straně 66 s tím, že jeho osy jsou lineární. Zobrazená závislost Ω(ω) by se měla teoreticky blížit hyperbole popsané rovnicí 4.5 na straně 60.
Obrázek A.3: Graf závislosti Ω(ω), lineární osy Dále bude uveden blokový diagram 115.vi pro zpracování výstupních dat z 113.vi. a stručně popsána jeho funkce.
Obrázek A.4: Blokový diagram VI pro zpracování naměřených dat VI se skládá z několika podprogramů, které v diagramu vystupují jako samostatné uzly. Uzel READ DATA, ve skutečnosti samostatné VI uložené v souboru 116.vi, slouží k načtení datových souborů, které byly vyprodukovány 113.vi. Uzel CUT (117.vi) pak z těchto dat odebere prvních pět měření, které z technických důvodů vnášejí do datového souboru chyby. Následně
70
PŘÍLOHA A. PRECESE SETRVAČNÍKU
začne probíhat tělo WHILE cyklu v němž opakovaně probíhá zpracování naměřených dat. Uzly General Polynomial Fit prokládají oběma vstupními závislostmi aproximační polynom. Jeho výstupem je jednorozměrné pole koeficientů aproximačních polynomů. Stupně aproximačních polynomů jsou určeny terminály Stupeň polynomu 1 a Stupeň polynomu 2, které mají v čelním panelu podobu tahových potenciometrů. Uzly Coef 2 Poly převádějí pole koeficientů aproximačních polynomů na řetězce znaků, které reprezentují příslušné polynomy při obvyklé formě zápisu. Oba polynomy jsou vypsány na čelním panelu. Polynom reprezentující časovou závislost úhlu precesního pootočení je zderivován uzlem Differentiation.vi a výsledek je vykreslen v grafu Rychlost precese (Derivace fitu na úhel precesního pootočení). Následně se spočte 100 funkčních hodnot tohoto polynomum které rovnoměrně pokrývají interval naměřených hodnot. Počet funkčních hodnot je nastaven konstantou Pocet bodu. Pro polynom aproximující časovou závislost velikosti úhlové rychlosti setrvačníku ω je taktéž určeno 100 funkčních hodnot. Vzniknou dvě jednorozměrná pole s funkčními hodnotami aproximačních polynomů. Funkční hodnoty se shodným indexem v obou polích jsou vždy spočteny ze společné hodnoty (reprezentující čas). Hodnoty z obou polí jsou nakonec vyneseny na osy grafu. Tak vznikne graf hledané závislosti Ω(ω) který je vykreslen na čelním panelu ve dvou exemplářích. Poprvé s lineárními osami, podruhé s osami logaritmickými. Měnit stupně aproximačních polynomů je průběžně možné. Všechny grafy se automaticky překreslují podle aktuálního nastavení. Jakmile najdeme vhodné stupně aproximačních polynomů, ukončíme WHILE cyklus, uložíme výstupní data do textového souboru klepnutím na tlačítko SAVE & EXIT, nebo prostě VI ukončíme klepnutím na EXIT. Všechny VI zmíněné v tomto textu jsou pod uvedenými jmény dostupné v archivu příkladů.
Příloha B
Sériová myš jako univerzální senzor pohybu Myš patří do běžné výbavy prakticky každého osobního počítače. Po drobných úpravách a eventuálně i bez nich ji lze použít také jako víceúčelový snímač posuvného a otáčivého pohybu. To může být užitečné například při demonstraci různých fyzikálních pokusů, zejména z mechaniky. Jde o levné a snadno dostupné zařízení. Optickou myš lze použít k bezdotykovému snímání posuvného pohybu. Pomocí mechanické myši lze navíc po drobné úpravě snímat pohyb otáčivý. Široké pole působnosti se nám otevírá při použití bezdrátové myši.
Obrázek B.1: Senzor otáčivého pohybu 71
72
PŘÍLOHA B. SÉRIOVÁ MYŠ JAKO UNIVERZÁLNÍ SENZOR POHYBU
Z hlediska připojení k PC je lze myši rozdělit na sériové a ”speciální”. Speciální myši se zpravidla připojují přímo k rozšířené sběrnici počítače (PCI, ISA a pod.) pomocí speciálních karet. Nejsou tak rozšířené jako myši sériové a v následujícím textu se jimi nebudeme zabývat. Sériové myši bývají k počítači připojeny přes sériový port, tedy konektorem Canon s 25 kontakty, nebo (dnes téměř výhradně) konektorem Canon s 9 kontakty. Kromě toho lze mezi sériové myši počítat i myši vybavené konektorem PS/2. Všechny 3 posledně zmíněné typy jsou funkčně prakticky shodné a s použitím vhodné redukce je můžeme zaměňovat. Elektrická schémata redukcí obsahuje např. [13]. Myš reaguje na události, jako např. zmáčknutí tlačítka, pohyb nebo uvolnění tlačítka. Popis dotyčné události odešle do portu počítače. Tato informace se dále zpravidla zpracovává speciálním programem, tzv. driverem, který pracuje z hlediska operačního systému na nízké úrovni. Driver shromažďuje informace o stavu myši a nabízí je ostatním aplikacím. Postupy jak získat informace z driveru myši jsou obecně známé. V operačním systému Windows se k tomuto účelu obvykle využívá rozhraní API (Application Programming Interface). Funkce API jsou v různých programovacích jazycích různě zapouzdřeny. Běžné operační systémy dnešních PC jsou navrženy pro spolupráci s jednou myší, takže její speciální použití vylučuje normální funkci. Na myš můžeme ale také nahlížet jako na obecné zařízení komunikující po sériové lince a obslužný program si vytvořit sami. Většina moderních operačních systémů je vybavena mechanizmem Plug and play. Po startu OS jsou automaticky detekována nová zařízení a zaváděny vhodné ovladače. Je zajímavé, že dvě myši si pod OS Windows mohou konkurovat. Pokud jsou obě aktivní, můžeme se jimi doslova přetahovat o kurzor. Abychom tomuto chování zabránili, je nutné použití jedné z myší zakázat. Druhou možností je připojit pokusnou myš k počítači až po detekci nového hardwaru, tj. až k běžícímu počítači se zavedeným OS. Tímto postupem nemůže dojít ke zničení RS 232. V zásadě existují 2 typy sériových myší: Microsoft Mouse a Mouse Systems Mouse. Microsoft Mouse má dvě tlačítka, Mouse Systems Mouse zpravidla tři. Některé třítlačítkové myši jsou vybaveny přepínačem, kterým lze nastavit zda se má myš chovat jako dvoutlačítková, či nikoliv. Zmíněné dva typy myší se odlišují nejen počtem tlačítek, ale i komunikačním protokolem. A to velmi zásadně.
B.1
Komunikační protokol
V následujícím textu se předpokládá znalost základních pojmů z oblasti sériové komunikace.
B.1.1
– Dvoutlačítková myš (Microsoft Mouse)
Microsoft Mouse, tedy myš se dvěma tlačítky, vyžaduje toto nastavení RS 232:
B.1. KOMUNIKAČNÍ PROTOKOL
73
Rychlost přenosu: Délka slova: Počet stop-bitů: Parita:
1200 bps 7 bitů 1 žádná
Myš začne pracovat až po inicializaci signálem RTS. Úroveň RTS se musí z počáteční hodnoty log. 1 (-12 V) změnit na log. 0 (+12 V). Poté myš vyšle posloupnost znaků $CD a následně začne normálně fungovat. Pomocí $CD lze identifikovat dvoutlačítkovou myš (třítlačítková nevyšle nic). Na vzniklou událost reaguje tato myš odesláním tří slov. V prvním je obsažena informace o stavu tlačítek a část informace o změně polohy myši, druhé slovo obsahuje zbytek informace o změně polohy myši v horizontálním směru. Poslední z trojice slov obsahuje zbytek informace o změně polohy myši ve směru vertikálním. Část informace o změně polohy obsaženou v prvním slově lze také interpretovat jako pouze informaci o směru pohybu. V prvním slově jsou totiž obsaženy jen nejvyšší dva bity osmice (osmice bitů která jako celek určuje změnu polohy myši). Rychlost pohybu myši obvykle nebývá tak vysoká, aby bylo k určení změny polohy nutné využít i sedmý bit (x6, resp. y6 viz níže) a protože jsou čísla posílána ve dvojkovém doplňkovém kódu 1 , určuje osmý bit (x7) znaménko čísla. Kladné znaménko indikuje pohyb doprava resp. dolů, záporné doleva, resp. nahoru. K úspěšné interpretaci události myši je tedy nutné ”posbírat odpovídající bity dohromady” podle následujícího schématu:
bit: 1. slovo: 2. slovo: 3. slovo:
6 1 0 0
5 L x5 y5
4 R x4 y4
3 y7 x3 y3
2 y6 x2 y2
1 x7 x1 y1
0 x6 x0 y0
Bity L a R informují o stavu levého a pravého tlačítka přičemž 1 značí zmáčknuté tlačítko a 0 uvolněné (u třítlačítkové myši je to naopak). Bit 0 je nejméně významný, bit 7 nejvýznamnější. Osa x běží zleva doprava a osa y shora dolů.
B.1.2
– Třítlačítková myš (Mouse Systems Mouse)
Mouse Systems Mouse, tedy myš se třemi tlačítky, vyžaduje toto nastavení RS232:
Rychlost přenosu: Délka slova: Počet stop-bitů: Parita: 1
1200 bps 8 bitů 1 žádná
Dvojkový doplňkový kód (two’s complement binary code) viz např. [18]
74
PŘÍLOHA B. SÉRIOVÁ MYŠ JAKO UNIVERZÁLNÍ SENZOR POHYBU
Myš začne pracovat až po inicializaci signálem RTS. Úroveň RTS se musí z počáteční hodnoty log. 1 (-12 V) změnit na log. 0 (+12 V). Následně začne myš normálně fungovat. Třítlačítková myš nevysílá žádný identifikační kód. Na vzniklou událost reaguje tato myš odesláním pěti slov. Jejich význam je následující: 1. 2. 3. 4. 5.
slovo: slovo: slovo: slovo: slovo:
Stav tlačítek Změna polohy ve směru zleva doprava od posledního vyslání dat Změna polohy ve směru shora dolů od posledního vyslání dat (*) (*)
(*) Interpretace významu 5. a 6. slova je v různých materiálech různá. Podle [18] jde o změnu polohy během posledního vyslání dat, podle [13] jde o rychlost změny polohy v jednotlivých směrech. Autor se domnívá, že první interpretace není správná. Struktura dat vysílaných třítlačítkovou myší je přehlednější nežli je tomu v případě myši dvoutlačítkové. Schéma prvního slova je následující: bit: 1. slovo:
7 1
6 0
5 0
4 0
3 0
2 L
1 M
0 R
Symboly L, M a R reprezentují bity s informací o stavu tlačítek (levé, střední a pravé), přičemž 0 značí zmáčknuté tlačítko a 1 uvolněné (u dvoutlačítkové myši je tomu naopak). Jednotlivé bity ve druhém až pátém slově jsou uvedeny ve správném pořadí. Není tedy nutné žádné ”sbírání odpovídajících bitů dohromady” jako u dvoutlačítkové myši, nýbrž čísla můžeme ihned přečíst. Pro úplnost, tabulka analogická těm předchozím bude pro 2. - 5. slovo vypadat takto:
2. 3. 4. 5.
B.2
bit: slovo: slovo: slovo: slovo:
7 x7 y7 X7 Y7
6 x6 y6 X6 Y6
5 x5 y5 X5 Y5
4 x4 y4 X4 Y4
3 x3 y3 X3 Y3
2 x2 y2 X2 Y2
1 x1 y1 X1 Y1
0 x0 y0 X0 Y0
Programování
Pro přístup k RS 232 se v různých operačních systémech používá různých technik. V MSDOSu se k portu přistupovalo přímo. Zápis a čtení se prováděl přímým přístupem do registrů obvodu UART který RS 232 řídí. Operační systémy Windows založené na technologii NT (Windows NT, Windows 2000 a Windows XP) tuto techniku zakazují z bezpečnostních důvodů a k ovládání RS 232 nabízejí funkce API (Aplication Programming Interface). Operační systémy typu Windows 95 umožňují obě techniky přístupu. Dnes se v každém případě preferuje volání funkcí API před přímým přístupem k registrům UART. V systémech typu UNIX jsou porty interně reprezentovány speciálními soubory, se kterými se pracuje podobně jako s
B.3. UKÁZKOVÉ PROGRAMY
75
běžnými textovými soubory. Např. v Linuxu je první sériový port (v DOSu a Windows COM1) obvykle reprezentován souborem ttyS0, druhý souborem ttyS1 atd. Stačí připojit pokusnou myš k prvnímu sériovému portu a na příkazové řádce shellu zadat např. cat /dev/ttyS0. Jakmile myší pohneme, zaplní se obrazovka množstvím myší odeslaných znaků. Existují i softwarová rozhraní vyšší úrovně, která poskytují funkce pro přístup k periferiím nezávisle na platformě (nezávisle na operačním systému). Takové rozhraní spolupracuje s periferiemi vhodnou technikou hostitelského operačního systému a programátorovi nabízí standardizované funkce. Příkladem takového rozhraní je NI-VISA. Jedná se o komerční produkt společnosti National Instruments. Vzhledem k tomu, že operační systémy zmíněných typů (mimo MS-DOS) jsou víceúlohové, není možné, aby náš program pro čtení z portu vlastnil veškerý strojový čas. Tím vzniká problém se synchronizací. Není problém poslat na port relativně veliký blok dat jednorázově, ale průběžné pravidelné čtení z portu je striktně vzato nemožné. To je v našem případě nevýhoda. Nicméně pro jisté účely může být toto řešení použitelné. Většina současných operačních systémů je navržena pro provoz vícevláknových aplikací. To znamená, že programy se mohou skládat z několika nezávislých současně běžících částí, resp. vláken (vlákno = angl. thread). Jedná se o tzv. multithreading. V ideálním případě běží každé vlákno na vlastním procesoru. Jedno vlákno může například obsluhovat uživatelské rozhraní, tedy vykreslovat dialogová okna a pod. a jiné vlákno může obstarávat náročný výpočet nebo např. čtení z RS 232. Tím se běh programu z pohledu uživatele urychlí. Z pohledu programátora však přináší psaní vícevláknových aplikací určité nesnáze zejména pokud jednotlivá vlákna přistupují ke společným prostředkům (např. ke globálním proměnným, nebo např. k sériovému portu). Základní Informace o Multithreadingu nalezne čtenář v [16] a zejména z [12] pro porostředí C++ Builder a [8] a [9] pro prostředí LabVIEW.
B.3
Ukázkové programy
K dispozici jsou 2 ukázkové programy pro čtení z pokusné sériové myši včetně zdrojového kódu. První program je napsán v Borland C++ Builderu 5. Jedná se o dvouvláknovou aplikaci která vypisuje na obrazovku x-ovou souřadnici třítlačítkové myši. Zdrojový text je opatřen komentáři, k dispozici je i přeložená aplikace. Téměř identický program lze napsat i v Borland Delphi. Příklady sériové komunikace v prostředí Borland Delphi nalezne čtenář např. v [6]. Tato ukázka se nachází v archivu příkladů v souboru s názvem c++.zip. Obsahuje projekt Borland C++ Builderu 5 včetně přeložené aplikace. Druhý program byl vytvořen v prostředí National Instruments LabVIEW. Aplikace sestává z jediného vlákna a narozdíl od předchozího příkladu je jejím výstupem graf závislosti x-ové souřadnice polohy třítlačítkové myši na čase. Program využívá rozhraní VISA. K dispozici je pouze zdrojový kód. Tato ukázka se nachází v archivu příkladů v souboru s názvem LabVIEW.zip. Obsahuje zdrojový kód programu.
76
B.4
PŘÍLOHA B. SÉRIOVÁ MYŠ JAKO UNIVERZÁLNÍ SENZOR POHYBU
Zdroje informací
Originální dokumentaci komunikačního protokolu sériových myší se autorovi nepodařilo získat. V tomto textu se vychází z [6], [8], [9], [12], [13], [16] a [18].
Martin Čermák DIPLOMOVÁ PRÁCE Sázeno systémem LATEX Brno 2003