ýESKÉ VYSOKÉ UýENÍ TECHNICKÉ v PRAZE FAKULTA ELEKTROTECHNICKÁ KATEDRA MċěENÍ
BakaláĜská práce Obor: Kybernetika a mČĜení
Výpoþetní modul pro Digister 3
Vedoucí práce: Ing. Petr ýesák Autor: Petr Hlaváþ
Praha 2007
Prohlášení Prohlašuji, že jsem svou bakaláĜskou práci vypracoval samostatnČ a použil jsem pouze podklady (literaturu, projekty, SW atd.) uvedené v pĜiloženém seznamu. Nemám závažný dĤvod proti užití tohoto školního díla ve smyslu § 60 Zákona þ.121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o zmČnČ nČkterých zákonĤ (autorský zákon).
V Praze dne ……………………….
……………………………………. podpis
-2-
PodČkování Úvodem bych velmi rád podČkoval svému vedoucímu bakaláĜské práce Ing. Petru ýesákovi, dále Ing. Petru Suchánkovi a Ing. Davidu Slepiþkovi, Ph.D. za cenné rady a podporu. Též je mou milou povinností podČkovat tČm, kteĜí mČ v prĤbČhu studia podporovali, zejména své rodinČ.
-3-
ýeské vysoké uþení technické v Praze
Fakulta elektrotechnická
Katedra mČĜení K13138
Školní rok
2006/2007
ZADÁNÍ BAKALÁěSKÉ PRÁCE
Student
Petr Hlaváþ
Obor
Kybernetika a mČĜení
Název tématu:
Grafický modul pro DIGESTER 3
Zásady pro vypracování: Na základČ existující knihovny DIGAPI provećte vývoj modulu pro obecné zpracování dat v rámci vývoje programového vybavení pro mČĜení dynamických parametrĤ Aý pĜevodníkĤ, DIGESTER 3. Nejprve navrhnČte postup pro vývoj tohoto modulu. Na základČ navrženého postupu vytvoĜte demonstraþní modul, na kterém bude pĜedvedena funkþnost návrhu. Modul navrhnČte tak, aby jej bylo možné ovládát z jiné aplikace.
Vedoucí bakaláĜské práce:
Ing. Petr ýesák
Datum zadání bakaláĜské práce:
12.1.2007
Termín odevzdání bakaláĜské práce:
24.8.2007
-4-
Anotace Cílem této bakaláĜské práce je seznámit þtenáĜe s vývojem modulu pro obecné zpracování dat. Vývoj je souþástí rozsáhlého projektu Digister 3 pro mČĜení dynamických parametrĤ Aý pĜevodníkĤ, kterým se zabývá katedra mČĜení. Modul je vyvíjen na základČ existující knihovny DIGAPI. Navržený postup je demonstrován na praktickém pĜíkladu.
Annotation The aim of my bachelor thesis is to introduce the process of software developement for a data processing application. This process is part of a broad project called Digister 3 for measurement of dynamic parameters of analog-to-digital converters. The developed module interfaces an already made library called DIGAPI that provides access to files stored on a hard drive. Also, a general procedure is mentioned to provide a template of such a module for next developers. The proposed template is used in a Window generating module as an example demonstrating usage of the template.
-5-
Obsah 1 Úvod ……………………………………………………………………………………………………… 7 2 Rozbor aplikace ………………………………………………………………………... 2.1 Popis þinnosti ……………………………………………………………………. 2.1.1 Obecné schéma aplikace ………………………………………………… 2.1.2 Popis þástí aplikace ……………………………………………………… 2.2 Moduly …………………………………………………………………………… 2.2.1 ZpĤsob þlenČní modulu …………………………………………………. 2.2.2 Popis þástí modulu ………………………………………………………. 2.3 Knihovna DIGAPI ………………………………………………………………. 2.3.1 Základní funkce …………………………………………………………. 2.3.2 Další funkce ………………………………………………………………
8 8 9 9 9 10 10 10 11 11
3 Návrh výpoþetního modulu …………………………………………………………… 3.1 Požadavky na modul ……………………………………………………………. 3.1.1 SpouštČní z hlavního programu ………………………………………… 3.1.2 Komunikace mezi hlavním aplikací a modulem ………………………. 3.1.3 SpouštČní modulu v rĤzných režimech ………………………………… 3.2 Realizace požadavkĤ ……………………………………………………………. 3.2.1 Aplikace pro spouštČní programĤ ……………………………………… 3.2.1.1 Testované funkce ………………………………………………. 3.2.1.2 Ukázka funkce testovací aplikace …………………………….. 3.2.2 DoplnČní modulĤ a další zpĤsoby Ĝízení ……………………………….. 3.2.3 Implementace modulĤ v rĤzných režimech ………………………….…
12 12 12 12 12 12 12 13 15 16 17
4 Vzorový výpoþetní modul ……………………………………………………………... 4.1 Využití vzorového výpoþetního modulu ……………………………………….. 4.2 Popis þlenČní výpoþetního modulu ……………………………………………... 4.3 Dokumentace výpoþetního modulu ……………………………………………..
18 20 21 21
5 PĜíklad vzorového výpoþetního modulu ……………………………………………... 5.1 Okénka …………………………………………………………………………... 5.2 VstupnČ výstupní rozhraní modulu ……………………………………………. 5.2.1 ýlenČní modulu Okno ………………………………………………….... 5.2.2 Popis þástí modulu ………………………………………………………. 5.2.3 PĜehled datových typĤ …………………………………………………... 5.3 NaplnČní jednotlivých funkcí vzorového výpoþetního modulu ......................... 5.4 Ukázka funkþnosti ………………………………………………………………. 5.4.1 GUI ……………………………………………………………………….. 5.4.2 PĜíkazová Ĝádka …………………………………………………………. 5.4.3 Použití souborĤ ………………………………………………………….. 5.5 Další možnosti rozšíĜení modulu ………………………………………………..
22 22 22 23 23 23 24 28 28 29 30 31
6 ZávČr ……………………………………………………………………………………. 32 Literatura …………………………………………………………………………………. 33 Obsah pĜiloženého CD …………………………………..……………………….………. 38 -6-
1 Úvod Na katedĜe mČĜení FEL ýVUT je vyvíjena aplikace Digister 3. Slouží k testování dynamických parametrĤ Aý pĜevodníkĤ. Jedná se o velmi rozsáhlý projekt, na jehož vývoji se podílí mnoho lidí. Aplikace se skládá z nČkolika þástí (hlavní program, výpoþetní moduly, grafické moduly). Cílem práce je navrhnout postup pro vývoj vzorového výpoþetního modulu. K tomu bude zapotĜebí otestovat mnoho funkcí.
-7-
2 Rozbor aplikace V dalších þástech práce se používá Ĝada termínĤ, které je zapotĜebí vysvČtlit. ýtenáĜ pak má lepší pĜehled o dané problematice: • • • •
Program – spustitelný soubor. Aplikace – nadĜazený program, který spouští další programy. Modul – dílþí program. Hlavní aplikace – pracuje s moduly navrhovaného projektu Digister 3.
2.1 Popis þinnosti Hlavní aplikace je þlenČna do menších celkĤ, které budou obsahovat jednotlivé moduly. Tento zpĤsob rozdČlení má nČkolik výhod: • • • •
Je pĜehledný. Moduly mohou pracovat samostatnČ. ýinnost modulĤ je snadnČji pochopitelná. Moduly se nechají v pĜípadČ potĜeby jednoduše inovovat.
Moduly je možné spouštČt samostatnČ, bez závislosti na hlavní aplikaci. Moduly mohou být využívány i jinými aplikacemi.
Hlavní aplikace má za úkol obsluhovat všechny procesy, které jsou vyžadovány. Zahrnuje: • • • •
Získávání dat. Zpracování dat jednotlivými moduly. Prezentaci výsledkĤ uživateli. Archivaci dat.
Hlavní aplikace by mČla splĖovat základní požadavky mezi které patĜí: 1. Aby ji bylo možné používat jako moduly, musí být splnČna podmínka komunikace. 2. Musí být uvedeno, který vstup lze použít na daný vstup. PĜi pojmenování vstupĤ a výstupĤ, zejména z hlediska návaznosti modulĤ se naskytují dvČ varianty Ĝešení: 1. Shodné názvy souvisejících vstupĤ a výstupĤ pojmenovat stejným jménem. 2. Návaznost vstupĤ a výstupĤ lze Ĝešit pomocí pĜevodní tabulky. Teoreticky by mČlo staþit dodržet držet stejné názvy patĜiþných vstupĤ a výstupĤ. Ovšem je potĜeba tuto možnost peþlivČ vyĜešit.
-8-
2.1.1 Obecné schéma aplikace
Aý pĜevodník
Soubor
Vstupní blok
Funkce_1
Funkce_2
Funkce_3
Výpoþetní blok
Zobrazení výsledkĤ
Soubor
Výstupní blok Obr. 2.1 Obecné schéma aplikace
2.1.2 Popis þástí aplikace 1. Vstupní blok Úkolem vstupního bloku je získat data a pĜedat je k dalšímu zpracování. Modul Aý získává data pĜímo z Aý pĜevodníku a pomocí datových souborĤ je poskytuje dále. Data mohou být také naþtena z uložených datových souborĤ. Toho je využito pĜi vlastní realizaci demonstraþního modulu. k tomuto úþelu je zvolen oddČlený datový výstup od konfigurace. 2. Výpoþetní blok Výpoþetní blok tvoĜí hlavní þást, která se skládá z jednotlivých výpoþetních modulĤ. Každý modul je charakterizován svou funkcí, vstupy a výstupy. Jeden z výpoþetních modulĤ bude prakticky realizován. 3. Výstupní blok Výstupní blok slouží k zobrazení získaných výsledkĤ uživateli.
2.2 Moduly Moduly jsou malé programy, které zajišĢují zpracování urþité þásti dat v celé aplikaci. Lze je rozdČlit do dvou skupin, na moduly výpoþetní a moduly grafické. Návrh se dále bude vČnovat jen výpoþetním modulĤm. Zjednodušením velké aplikace na jednotlivé moduly se podstatnČ zjednodušuje vývoj a následná závislost na jednom programátorovi. Výhodou tohoto þlenČní je, že každý modul mĤže psát jiný programátor a v jiném programovacím jazyce. -9-
2.2.1 ZpĤsob þlenČní modulu Logy
Vstupy
Komunikace
Modul
Výstupy
PromČnné Obr. 2.2 ZpĤsob þlenČní modulu
2.2.2 Popis þástí modulu 1. Vstupy Vstupními daty jsou externí soubory, na které je odkazováno z konfiguraþního souboru. Tato metoda byla zvolena jako výhodnČjší než kombinace dat a konfigurace v jednom konfiguraþním souboru. 2. PromČnné PromČnné se dají rozdČlit do dvou oblastí. Na lokální promČnné a globální promČnné. Mezi lokální promČnné patĜí ty, které jsou využívány výhradnČ v daném modulu. Globální promČnné jsou pak využívány v rámci celé aplikace. 3. Logy Logy zahrnují informace o pĜípadných chybách, které mohou nastat. Modul s nimi dále nepracuje, slouží k zjištČní stavu modulu. 4. Komunikace Komunikace slouží k ovládání modulu pomocí souborĤ. 5. Výstupy Výstupními daty jsou externí soubory, na které je odkázáno z konfiguraþního souboru. Tato metoda byla zvolena jako výhodnČjší než kombinovat ukládaná data s konfigurací ve spoleþném konfiguraþním souboru.
2.3 Knihovna DIGAPI Moduly mají mnoho spoleþného. PĜedevším obsluhu konfiguraþního souboru a komunikaci s hlavní aplikací. To vedlo ke vzniku knihovny DIGAPI. Knihovna DIGAPI funguje jako abstraktní vrstva pro naþítání a ukládání dat modulem. Též slouží ke zpracování konfigurace.
- 10 -
Navenek se jednotlivé moduly budou chovat jednotnČ. Pokud je potĜeba provést zmČnu, staþí nahradit v modulech pouze tuto knihovnu. Hlavní aplikace by mČla mít možnost ovládat konfiguraci modulĤ. k tomu lze použít DIGAPI. Hlavní aplikace bude ovládat moduly a komunikovat s nimy pomocí abstraktní vrstvy v DIGAPI. Knihovna DIGAPI byla vytvoĜena již dĜíve. Pouze dochází k úpravám a doplĖování funkcí této knihovny.
2.3.1 Základní funkce PĜed používáním DIGAPI je nutné inicializovat konfiguraci. To lze provést dvČma zpĤsoby: 1. VytvoĜením prázdné konfigurace. 2. Naþtením existující konfigurace. Po úspČšné inicializaci se získá pointer na tuto konfiguraci, pomocí kterého je možné využívat další funkce DIGAPI. Též je možné ukládat aktuální konfiguraci pĜímo do souboru. PĜed ukonþením práce s konfigurací je nutné uvolnit pointer na tuto konfiguraci. Základní funkce DIGAPI jsou: int int int int
Funkce digapi_config_new nebo digapi_config_load slouží k inicializaci konfigurace (vytvoĜením nebo naþtením existující konfigurace). Po inicializaci je možné kdykoliv konfiguraci uložit do souboru pomocí funkce digapi_config_save. PĜed ukonþením práce s konfigurací je nutné pointer na konfiguraci uvolnit pomocí funkce digapi_config_free.
2.3.2 Další funkce ObecnČ každá funkce v DIGAPI vrací hodnotu 0 (typ integer), pokud funkce probČhla v poĜádku. ýísla rĤzná od nuly znamenají chybu a jejich význam závisí na konkrétní funkci. Další spoleþnou charakteristikou funkcí je posloupnost pĜedávání dat pĜes parametry funkce. Nejprve se zadávají vstupní data, poté následují výstupní data. Prvním parametrem je vždy ukazatel na konfiguraci. Struþný popis funkcí, rozdČlených podle jednotlivých oblastí pĤsobnosti viz. PĜíloha A.
- 11 -
3 Návrh výpoþetního modulu 3.1 Požadavky na modul PĜi návrhu výpoþetního modulu je zapotĜebí dĤkladnČ zhodnotit požadavky, které by mČl modul splĖovat.
3.1.1 SpouštČní z hlavního aplikace Hlavní aplikace bude spouštČt jednotlivé moduly. Proto je nutné vyzkoušet spouštČní programĤ a otestovat, co lze s moduly provádČt a co lze zjišĢovat o spuštČném modulu.
3.1.2 Komunikace mezi hlavní aplikací a modulem Komunikace mezi hlavní aplikací a modulem musí umČt následující: -
zjišĢovat informace o prĤbČhu výpoþtu pozastavit výpoþet ukonþit výpoþetní modul prĤbČžnČ zobrazovat stav výpoþtu
3.1.3 SpouštČní modulu v rĤzných režimech Modul umožĖuje spuštČní v grafickém režimu þi v režimu pĜíkazové Ĝádky. •
Grafický režim umožĖuje uživateli snadné ovládání programu. Nevyžaduje od uživatele pĜíliš mnoho znalostí o daném modulu. PĜed použitím není zapotĜebí studovat manuál, ovládání je zcela intuitivní.
•
Režim pĜíkazové Ĝádky se uplatní pĜedevším tam, kde je zapotĜebí neustále opakovat stejnou þinnost. Uživatel se tak vyhne chybám zaneseným lidským faktorem. Použití režimu pĜíkazové Ĝádky mĤže být v ĜadČ pĜípadech rychlejší a efektivnČjší.
3.2 Realizace požadavkĤ V této kapitole se prakticky otestují požadavky na spouštČní modulĤ.
3.2.1 Aplikace pro spouštČní programĤ Hlavní aplikace bude spouštČt jednotlivé moduly. Proto je nutné zjistit, jaké funkce pro tuto potĜebu existují a co dČlají. Co všechno hlavní aplikace mĤže s modulem pomocí operaþního systému dČlat. k tomuto úþelu byla vytvoĜena cviþná aplikace - Aplikace pro spuštČní programu.
- 12 -
3.2.1.1 Testované funkce Následující þást se zabývá popisem funkcí pro spouštČní programĤ, které poskytuje NI CVI. •
Funkce LaunchExecutableEx
int LaunchExecutableEx (char *fileName, int windowState, int *handle);
-
zjistí informaci o úspČšnosti spuštČní programu a vrátí þíslo handleru spuštČného programu
Vstupní parametry Název souboru Režim spuštČní ýíslo handleru Tab. 3.1 Vstupní parametry funkce LaunchExecutableEx
Návratová hodnota (status) 0 -1 -3 -12 -15 -19 -20
Význam SpuštČní probČhlo v poĜádku Nedostatek pamČti, soubor je poškozen Soubor nebyl nalezen Neplatný formát soubor Neznámý typ vykonávatelného souboru Systém vrátil neznámou chybu Soubor je komprimovaný
Tab. 3.2 Návratové hodnoty funkce LaunchExecutableEx
Funkce vrací hodnoty v intervalu <-22, 0>. Zbytek hodnot je k dispozici v helpu NI CVI.
Parametr windowState: Hodnota LE_HIDE LE_SHOWNORMAL LE_SHOWMINIMIZED LE_SHOWMAXIMIZED LE_SHOWNA LE_SHOWMINNOACTIVE
Režim okna spouštČné aplikace Skrytý Normální, aktivní Minimalizovaný, aktivní Maximalizovaný, aktivní Normální, neaktivní Minimalizovaný, neaktivní
Tab. 3.3 Parametr windowState
•
Funkce ExecutableHasTerminated
int ExecutableHasTerminated (int executableHandle);
-
zjistí, zda program bČží nebo byl ukonþen þíslo handleru se získá funkcí LaunchExecutebleEx
- 13 -
Vstupní parametry ýíslo handleru Tab. 3.4 Vstupní parametry funkce ExecutableExecutableHasTerminated
Návratová hodnota (status) -1 0 1
Význam Neexistující þíslo handleru BČžící proces Ukonþený proces
Tab. 3.5 Návratové hodnoty funkce ExecutableExecutableHasTerminated
•
TerminateExecutable
int TerminateExecutable (int executableHandle);
-
ukonþí program s daným þíslem handleru þíslo handleru se získá funkcí LaunchExecutebleEx Vstupní parametry ýíslo handleru Tab. 3.6 Vstupní parametry funkce TerminateExecutable
Návratová hodnota (status) -1 0
Význam Neplatná operace Proces úspČšnČ uzavĜen
Tab. 3.7 Návratové hodnoty funkce TerminateExecutable
•
RetireExecutableHandle
int RetireExecutableHandle (int executableHandle);
-
uvolní þíslo handleru z pamČti þíslo handleru se získá funkcí LaunchExecutebleEx Vstupní parametry ýíslo handleru Tab. 3.8 Vstupní parametry funkce RetireExecutableHandle
Návratová hodnota (status) -1 0
Význam Neplatná operace ÚspČšné odebrání
Tab. 3.9 Návratové hodnoty funkce RetireExecutableHandle
- 14 -
3.2.1.2 Ukázka funkce testovací aplikace Pro otestování funkcí vytvoĜené Aplikace pro spuštČní programu byla vyzkoušena Ĝada modelových situací, které mohou pĜi spouštČní programu nastat: •
SpuštČní programu pĜíkazové Ĝádky v minimalizovaném režimu. Programu bylo pĜídČleno þíslo handleru 0. Návratová hodnota 0 v result signalizuje, že vše probČhlo v poĜádku.
Obr. 3.1 SpuštČní programu a vrácení handleru
•
Program byl uzavĜen. Zadání jeho handleru vede na status 1, který signalizuje, že program byl již ukonþen.
Obr. 3.2 Test spuštČní programu
•
Program je spuštČn. Funkcí RetireExecutableHandle byl uvolnČn jeho handler. Zadání handleru spuštČného programu vede na status -1, který signalizuje neplatnou operaci.
Obr. 3.3 Ukonþení spuštČného programu
- 15 -
•
Zadání handleru spuštČného programu, u kterého chceme odebrat þíslo handleru vede na status 0, který signalizuje úspČšné odebrání þísla handleru.
Obr. 3.4 UvolnČní handleru
SpouštČný program lze spustit v nČkolika režimech zobrazení (viz. Tab. 3.3). Aplikace má možnost: 1. Zjistit, zda-li byl program spuštČn. 2. Program ukonþit. 3. Uvolnit þíslo handleru na program. Pro pĜípad modulĤ je užiteþné: 1. Zvolení režimu spuštČní. Vhodná je volba normálního aktivního zobrazení. 2. Informace o spuštČní programu. Jsou dĤležité pro aplikaci. 3. Možnost program ukonþit a uvolnit jeho þíslo handleru. DĤležité pro aplikaci. 3.2.2 DoplnČní modulu a další zpĤsoby Ĝízení Na základČ závČrĤ z pĜedchozího pokusu je nutné rozšíĜit komunikaci mezi hlavním programem a modulem o další vlastnosti, aby bylo možné: -
zjišĢovat informace o prĤbČhu výpoþtu pozastavit výpoþet prĤbČžnČ zobrazovat stav výpoþtu
Komunikace hlavní aplikace s jednotlivými moduly je velmi dĤležitým faktorem celého návrhu. PĜi zamyšlení lze dospČt k nČkolika zpĤsobĤm, jak Ĝízení hlavní aplikace realizovat. •
Pomocí souborĤ
Princip spoþívá v komunikaci hlavní aplikace s moduly pomocí dvou souborĤ. Každý je urþen pro jeden smČr komunikace.
- 16 -
PĜíklad: Z hlavní aplikace se odešle þíslo jedna, které znamená požadavek k zahájení výpoþtu. Modul odpoví hlavní aplikaci þíslem dva, které pĜedstavuje informaci o zahájení þtení dat. PrávČ þíslu dva odpovídá zpráva zobrazená uživateli v hlavní aplikaci. Na tomto principu mĤže probíhat celé Ĝízení hlavní aplikace. Otázkou je, zda-li je výhodnČjší používat ke komunikaci jen þísla, která odpovídají daným situacím a následnČ jim pĜiĜadit textovou podobu nebo využívat rovnou stringových ĜetČzcĤ. ObČ metody je zapotĜebí podrobnČji prozkoumat. v úvahu se bude brát reálnČjší zpĤsob Ĝešení. •
Pomocí status baru
Zde by komunikace ve smČru z hlavní aplikace do modulu probíhala podobnČ jako u pĜedchozího pĜípadu. Rozdíl spoþívá v komunikaci opaþným smČrem, þili od modulu do hlavní aplikace. Princip spoþívá v tom, že modul pĜedává informace o svém stavu do status baru. Odtud je hlavní aplikace vyþítá a dále je zpracovává.
3.2.3 Implementace modulu v rĤzných režimech ImplicitnČ se moduly spouští v grafickém režimu. Modul lze spustit z hlavní aplikace nebo samostatnČ. Lze využít i spuštČní modulu z cizí aplikace. Uživatel mĤže využít spuštČní modulu z pĜíkazové Ĝádky. k tomu je nutné nastavit tuto možnost v pĜíslušném konfiguraþním souboru. Nastavení provede uživatel v grafickém režimu výbČrem požadovaného režimu nebo ruþní úpravou daného konfiguraþního souboru.
- 17 -
4 Vzorový výpoþetní modul Jako software pro vzorový výpoþetní modul byl vybrán LabWindows/CVI 8.0 od firmy National Instruments. Pro tvorbu a ukládání konfiguraþních souborĤ slouží formát XML. Vývojové prostĜedí NI CVI má tuto knihovnu implementovánu, ale není možné ji standardnČ po instalaci používat. PĜed jejím použitím je nutné provést následující kroky: 1. Spustit Labwindows/CVI. 2. V menu zvolit Library ĺ Customize. 3. Kliknout na tlaþítko Add a pĜidat c:\Program Files\National Instruments\CVI71\toolslib\toolbox\cvixml.fp. PopĜípadČ upravit cestu tak, aby odpovídala instalaþnímu adresáĜi. 4. Potvrdit pĜidání knihovny. 5. Ukonþit program Labwindows/CVI. 6. Po dalším spuštČní Labwindows/CVI je v menu Library k dispozici nová knihovna CVIXML. 7. Do zdrojových kódĤ je nutné uvést hlaviþkový soubor #include “cvixml.h”.
Formát XML je velmi rozšíĜený. Výhodou je snadná editace bČžným textovým editorem. Uživatel tak získává možnost nastavovat si potĜebné parametry v konfiguraþním souboru aniž by se musel podrobnČji seznamovat s principem tohoto standardu.
Základní struktura konfiguraþního souboru ve formátu XML: <module>
Význam jednotlivých elementĤ XML je uveden v následující tabulce: Parametr module input output local global log control
Odpovídající data Vstup Výstup PromČnná PromČnná Log Komunikace
Popis Identifikace modulu Vstupní data Výstupní data Lokální promČnné Globální promČnné Logovací soubory Komunikaþní soubory
Tab. 4.1 Význam parametrĤ v XML
- 18 -
Vstup Každá vstupní data jsou v elementu input definována subelementem parameter. <parameter name="název" type="typ"> soubor
1. název – identifikuje textem název vstupních dat. 2. typ – informuje o typu vstupních dat. 3. soubor – název souboru, kde jsou vstupní data uložena. Cesta se udává absolutnČ nebo relativnČ vĤþi umístČní konfiguraþního souboru. Hodnoty se zapisují pomocí ASCII znakĤ. Za desetinou teþku se v pĜípadČ typu float považuje znak teþka. Tento zpĤsob zadávání dat umožĖuje ruþnČ editovat datové soubory standardními editory.
Výstup Výstupní data jsou ukládána pouze do externích souborĤ. Na soubory se odkazuje v konfiguraþním souboru: <parameter name="název" type="typ" enabled="yes"> soubor <parameter name="název" type="typ" enabled="no"> soubor
Význam syntaxe elementu parametr je shodný jako v pĜípadČ vstupních dat. Byl pĜidán navíc atribut enabled. Ten mĤže nabývat dvou hodnot: 1. yes – výstupní data jsou povolena. Výstupní soubor se pĜepíše (vytvoĜí). 2. no – výstupní data nejsou povolena. Výstupní soubor zĤstane nezmČnČn (ani se nevytvoĜí). Atribut enabled by mČl modul využívat k tomu, aby nedocházelo ke zbyteþným výpoþtĤm. NapĜíklad pokud uživatel nebude využívat daný výstup, nepovolí ho. Modul mĤže výpoþet vynechat a tím se zkrátí doba bČhu modulu. Typy výstupních dat jsou definovány shodnČ se vstupními daty.
PromČnná PromČnná je definována shodnČ se vstupními daty.
- 19 -
Log Výstupní logovací soubory jsou definovány v konfiguraþním souboru následujícím zpĤsobem: <parameter name="error" type="string" enabled="yes"> error_soubor <parameter name="warning" type="string" enabled="yes"> warning_soubor <parameter name="status" type="string" enabled="yes"> status_soubor
Syntaxe je shodná s definicí výstupních dat s tím rozdílem, že jsou definovány obsahy atributĤ name a pevnČ je stanoven typ. Význam obsahu atributĤ name jsou následující: 1. error – chybové informace. Modul vypisuje chyby, které vedou k jeho pĜedþasnému ukonþení. 2. warning – varovné informace. Modul vypisuje chyby, které nespadají pod chybové informace. 3. status – stavové informace. Modul vypisuje informace o tom, co právČ dČlá. Tím informuje uživatele o své þinnosti. Komunikace Komunikaþní soubory jsou definovány v konfiguraþním souboru následujícím zpĤsobem: <parameter name="command" type="int" enabled="yes"> command.txt <parameter name="state" type="int" enabled="yes"> state.txt
Syntaxe je shodná s definicí výstupních dat s tím rozdílem, že jsou definovány obsahy atributĤ name a pevnČ je stanoven typ. Význam atributĤ name je následující: 1. command – požadavky pro modul. Do externího souboru zapisuje Ĝídící aplikace þísla pĜíkazĤ a modul se podle nich Ĝídí, pokud je parameter povolen. 2. state – aktuální stav modulu. Do externího souboru zapisuje modul pĜi zmČnČ stavu þíslo aktuálního stavu. ěídicí aplikace je tím informována o þinnosti modulu, pokud je parameter povolen.
4.1 Využití vzorového výpoþetního modulu PĜi vytváĜení nového výpoþetního modulu se vychází z projektu vzorového výpoþetního modulu napsaného pro NI CVI. Vzorový výpoþetní modul obsahuje knihovnu DIGAPI a základní funkce pro jeho ovládání. DIGAPI slouží k pĜenosu dat mezi jednotlivými moduly a ke komunikaci modulu s hlavní aplikací.
- 20 -
4.2 Popis þlenČní výpoþetního modulu V každém výpoþetním modulu je nutné definovat využívané knihovny. Dále je potĜeba nadefinovat strukturu, kterou bude DIGAPI využívat. Ve výpoþetním modulu je nutné naimplementovat Ĝadu funkcí: main.c •
int UI_refresh(void)
- refresh položek v grafickém uživatelském rozhraní •
int DIG_config_init(void)
- nastavení poþáteþní konfigurace v grafickém uživatelském rozhraní •
int DIG_config_load(void)
- naþtení konfigurace •
int DIG_config_save(void)
- uložení konfigurace •
int DIG_input_load(void)
- naþtení vstupĤ •
int DIG_output_save(void)
- uložení výstupĤ •
int DIG_process(void)
- pĜedání parametrĤ do výpoþetních funkcí •
int DIG_run(void)
- volání vlastního výpoþtu •
int Main(int argc, char *argv[])
- výbČr režimu a jeho spuštČní •
int CVICALLBACK cfNAZEV (int panel, int event, void *callbackData, int eventData1, int eventData2) - callback funkce prvkĤ grafického uživatelského rozhraní, NAZEV pĜedstavuje jméno
prvku modul.c - obsahuje výpoþetní funkce pro konkrétní výpoþetní modul
4.3 Dokumentace výpoþetního modulu Viz. následující kapitola PĜíklad vzorového výpoþetního modulu.
- 21 -
5 PĜíklad vzorového výpoþetního modulu Pro realizaci konkrétního modulu byl vybrán modul Okno. Úkolem výpoþetního modulu je aplikace þasových okének na prĤbČh signálu. 5.1 Okénka ýasová okénka slouží k úpravČ signálu. Jedná se o funkce, kterými se zpracovávaný signál vynásobí. ýasových okének je mnoho. Pro demonstraci byly vybrány následující þtyĜi þasová okénka: 1. Obdélník
PĜi pohledu na vzorce okének se dá uvažovat o možnostech rozšíĜení: •
V pĜípadČ realizace více typĤ okének se nČkteré jejich þásti opakují. Eliminací opakujících se þástí lze dosáhnout nepatrné úspory místa a hlavnČ zajistit, aby se shodné þásti zbyteþnČ nevykonávaly vícekrát.
•
U Ĝady okének se vyskytují konstanty, které by bylo dobré zapsat do spoleþného datového souboru. Tím se docílí možnost výbČru uživatele, zda-li chce provést výpoþet s implicitními konstantami nebo je zadat explicitnČ.
5.2 VstupnČ výstupní rozhraní modulu Datový tok modulem vþetnČ Ĝídících signálĤ byl naznaþen v kapitole 2.1. v této kapitole je demonstrován na konkrétním pĜíkladu.
- 22 -
5.2.1 ýlenČní modulu Okno Logy
Signál
Komunikace
Aplikace okénka
Upravený signál
Poþet vzorkĤ Typ okénka Režim Obr. 5.1 ýlenČní modulu Okno
5.2.2 Popis þástí modulu 1. Vstupy Na vstupní datový soubor odkazuje konfiguraþní soubor. v datovém souboru jsou uloženy vzorky signálu. Pro ukázku byla použita Ĝada smyšlených þísel. 2. PromČnné Lokálními promČnnými jsou poþet vzorkĤ a typ okénka. Jsou využívány výhradnČ v daném modulu. Globální promČnnou je režim spuštČní modulu. 3. Logy Logy zahrnují informace o pĜípadných chybách, které mohou nastat. Modul s nimi dále nepracuje, slouží k zjištČní stavu modulu. Logy nebyly realizovány. 4. Komunikace Komunikace slouží k ovládání modulu pomocí souborĤ, ale nebyla realizována. 5. Výstupy Výstupem jsou data, která se ukládají do externích datových souborĤ definovaných v konfiguraþním souboru.
5.2.3 PĜehled datových typĤ
Vstupy signal
Datový typ double
Popis Vstupní signál
Tab. 5.1 Datové typy vstupĤ
- 23 -
Globální promČnné rezim
Datový typ int
Popis Režim spuštČní
Tab. 5.2 Datové typy globálních promČnných
Logy error warning status
Datový typ string string string
Popis Chybové informace Varovné informace Stavové informace
Tab. 5.3 Datové typy logĤ
Komunikace command state
Datový typ int int
Popis PĜíkazy aplikace pro modul Stav modulu
Tab. 5.4 Datové typy komunikace
Výstupy obdelnik hann bartlett blacmanharr
Datový typ double double double double
Popis Signál upravený oknem Obdélník Signál upravený oknem Hann Signál upravený oknem Bartlett Signál upravený oknem Blackman-Harris
Tab. 5.5 Datové typy výstupĤ
5.3 NaplnČní jednotlivých funkcí vzorového výpoþetního modulu Implementace funkcí do výpoþetního modulu.
static int maincn_panel; #define DIG_INPUT_SAMPLES_MAX #define DIG_FILENAME_MAX #define DIG_OUTPUT_SAMPLES_MAX
100000 1000 100000
struct DIG_PARAMETER { double input_signal[DIG_INPUT_SAMPLES_MAX]; char input_signal_file[DIG_FILENAME_MAX]; long input_signal_count; double output_obdelnik[DIG_OUTPUT_SAMPLES_MAX]; long output_obdelnik_count; long output_obdelnik_en; double global_rezim; long global_rezim_en; };
- 24 -
struct DIG_PARAMETER dig_param; char *souborxml; int grafrezim, jinyxml; int UI_refresh(void) { SetCtrlVal (maincn_panel, SetCtrlVal (maincn_panel, SetCtrlVal (maincn_panel, SetCtrlVal (maincn_panel,
int okno_obdelnik(double *input_signal, long input_signal_count, double *output_signal, long *output_signal_count) { long i; for(i = 0; i < input_signal_count; i++) { output_signal[i] = input_signal[i] * 1.0; } *output_signal_count = input_signal_count; return(0); }
5.4 Ukázka funkþnosti Navržený modul byl nazván ýasová okna. Modul pracuje implicitnČ v grafickém režimu. Modul lze spustit i z pĜíkazové Ĝádky. Podle nastavení v konfiguraþním souboru se spustí grafické uživatelské rozhraní nebo probČhne výpoþet na pozadí. Uživatel nic nenastavuje, vše je zajištČno z konfiguraþního souboru. Uživatel je pouze informován o dokonþení výpoþtu.
5.4.1 GUI Po spuštČní výpoþetního modulu se uživateli nabídne grafické rozhraní. Uživatel má možnost: 1. 2. 3. 4.
zadat odkud se budou naþítat data zvolit typ okénka, které chce aplikovat na vstupní signál zvolit režim spuštČní modulu naþíst konfiguraci z konfiguraþního souboru XML
- 28 -
5. 6. 7. 8.
uložit konfiguraci do konfiguraþního souboru XML spustit výpoþet sledovat stav modulu v informaþním oknČ ukonþit modul
Grafické rozhraní modulu s naþtenou konfigurací a ukázkou výpoþtu ukazuje následující obrázek.
Obr. 5.2 Ukázka funkþnosti navrženého modulu
5.4.2 PĜíkazová Ĝádka SpouštČní modulu z pĜíkazové Ĝádky nabízí uživateli dvČ možmosti zadaní pĜíkazu: 1. c:\modul.exe 2. c:\modul.exe newconfig.xml V prvním pĜípadČ dojde ke spuštČní modulu s implicitnČ zadaným konfiguraþním souborem. Druhý pĜípad se využije pokud žádáme spuštČní s jiným konfiguraþním souborem. ObČ možnosti jsou naznaþeny v následující ukázce:
Obr. 5.3 Možnosti spuštČní modulu z pĜíkazové Ĝádky
- 29 -
Podle nastavení v konfiguraþním souboru se spustí modul v grafickém rozhraní (Obr. 5.2) nebo spuštČní probČhne na pozadí pĜíkazové Ĝádky. Pro názornost ukázky je uživatel informován o prĤbČhu výpoþtu následujícím oknem:
Obr. 5.4 Kontrola spuštČní modulu z pĜíkazové Ĝádky
5.4.3 Použití souborĤ Vstupní data jsou uložena v externím souboru *.dat. Výstupní data jsou ukládána do externích souborĤ *.dat. Konfigurace jsou uloženy v konfiguraþních souborech *.xml. Odpovídající struktura konfiguraþního souboru z ukázky je následující: <module> <parameter name="signal" type="double"> d:\hlavap4\Cvi\modul 15\signal.dat <parameter name="rezim" type="double" enabled="no"/> <parameter name="error" type="string" enabled="no"/> <parameter name="warning" type="string" enabled="no"/> <parameter name="status" type="string" enabled="no"/> <parameter name="command" type="int" enabled="no"/> <parameter name="state" type="int" enabled="no"/>
- 30 -
5.5 Další možnosti rozšíĜení modulu U modulu je vhodné doplnit ošetĜení chyb vzniklých pĜi: 1. Práci s konfiguraþními XML soubory. 2. Práci s datovými soubory. 3. Komunikaci s hlavní aplikací.
- 31 -
6 ZávČr Cílem bakaláĜské práce bylo navrhnout postup pro vývoj výpoþetního modulu pro obecné zpracování dat. PĜi vývoji se vycházelo z existující knihovny DIGAPI. Bylo otestováno mnoho funkcí, které se dají využít pĜi komunikaci aplikace s výpoþetním modulem. Na základČ navrženého postupu byl vytvoĜen demonstraþní výpoþetní modul. Modul byl navrhován s ohledem na ovládání z jiné aplikace. Na vývoji výpoþetního modulu je zapotĜebí ještČ nadále pracovat. Je tĜeba dokonþit komunikaci aplikace s modulem, ošetĜit vyjímeþné stavy pĜi chodu modulu.
- 32 -
Literatura [1] – ýesák, Petr. The structure of large application. In POSTER 2006. Prague, 2006. [2] – Roztoþil, Jaroslav a kolektiv. Zlepšení metrologických parametrĤ systému pro testování rychlých Aý pĜevodníkĤ a modulĤ s rozlišením 12 až 18 bitĤ. In Program rozvoj metrologie 2006, Praha 2006.
Internetové zdroje [3] – Window function. [online]. [cit. 25.7.2007]
- 33 -
PĜíloha A Struþný popis funkcí DIGAPI, rozdČlených podle jednotlivých oblastí pĤsobnosti: Vstup // získání poþtu vstupĤ int digapi_input_getcount(void *config, long *input_count); // pĜidání dalšího vstupu int digapi_input_add(void *config, char *input_name, enum DIGAPI_PARAM_TYPE input_type, long *input_id); // získání ID vstupu na základČ názvu int digapi_input_getid(void *config, char *input_name, long *input_id); // zjištČní typu hodnot vstupu ID int digapi_input_gettype(void *config, long input_id, enum DIGAPI_PARAM_TYPE *input_type); // nastavení hodnot pro vstup ID int digapi_input_data_set(void *config, long input_id, void *input_data, long input_data_count); // vyþtení hodnot ze vstupu ID int digapi_input_data_get(void *config, long input_id, void *input_data, long *input_data_count); // zjištČní poþtu hodnot vstupu ID int digapi_input_data_getcount(void *config, long input_id, long *input_data_count); // nastavení názvu souboru pro hodnoty vstupu ID int digapi_input_data_file_setname(void *config, long input_id, char *filename); // zjištČní názvu souboru pro hodnoty vstupu ID int digapi_input_data_file_getname(void *config, long input_id, char *filename);
PromČnná // získání poþtu lokálních promČnných int digapi_local_getcount(void *config, long *input_count); // pĜidání další lokální promČnné int digapi_local_add(void *config, char *input_name, enum DIGAPI_PARAM_TYPE input_type, long *input_id); // získání ID lokální promČnné na základČ názvu int digapi_local_getid(void *config, char *input_name, long *input_id); // zjištČní typu hodnot lokální promČnné ID int digapi_local_gettype(void *config, long input_id, enum DIGAPI_PARAM_TYPE *input_type); // nastavení hodnoty pro lokální promČnné ID int digapi_local_data_set(void *config, long input_id, void *input_data, long input_data_count); // vyþtení hodnot z lokální promČnné ID int digapi_local_data_get(void *config, long input_id, void *input_data, long *input_data_count); // zjištČní poþtu hodnot lokální promČnné ID int digapi_local_data_getcount(void *config, long input_id, long *input_data_count); // nastavení názvu souboru pro hodnoty lokální promČnné ID int digapi_local_data_file_setname(void *config, long input_id, char *filename); // zjištČní názvu souboru pro hodnoty lokální promČnné ID int digapi_local_data_file_getname(void *config, long input_id, char *filename);
- 34 -
// získání poþtu globální promČnných int digapi_global_getcount(void *config, long *global_count); // pĜidání další globální promČnné int digapi_global_add(void *config, char *global_name, enum DIGAPI_PARAM_TYPE global_type, long *global_id); // získání ID globální promČnné na základČ názvu int digapi_global_getid(void *config, char *global_name, long *global_id); // zjištČní typu hodnot globální promČnné ID int digapi_global_gettype(void *config, long global_id, enum DIGAPI_PARAM_TYPE *global_type); // nastavení hodnot pro globální promČnné ID int digapi_global_data_set(void *config, long global_id, void *global_data, long global_data_count); // vyþtení hodnot z globální promČnné ID int digapi_global_data_get(void *config, long global_id, void *global_data, long *global_data_count); // zjištČní poþtu hodnot globální promČnné ID int digapi_global_data_getcount(void *config, long global_id, long *global_data_count); // nastavení názvu souboru pro hodnoty globální promČnné ID int digapi_global_data_file_setname(void *config, long global_id, char *filename); // zjištČní názvu souboru pro hodnoty globální promČnné ID int digapi_global_data_file_getname(void *config, long global_id, char *filename); // zjištČní, zda-li je globální promČnná povolena int digapi_global_isenabled(void *config, long global_id, int *enabled); // povolení (zakázání) globální promČnné int digapi_global_enabled(void *config, long global_id, int enabled);
Výstup // získání poþtu výstupĤ int digapi_output_getcount(void *config, long *output_count); // pĜidání dalšího výstupu int digapi_output_add(void *config, char *output_name, enum DIGAPI_PARAM_TYPE output_type, long *output_id); // získání ID výstupu na základČ názvu int digapi_output_getid(void *config, char *output_name, long *output_id); // zjištČní typu hodnot výstupu ID int digapi_output_gettype(void *config, long output_id, enum DIGAPI_PARAM_TYPE *output_type); // nastavení hodnot pro výstup ID int digapi_output_data_set(void *config, long output_id, void *output_data, long output_data_count); // vyþtení hodnot ze výstupu ID int digapi_output_data_get(void *config, long output_id, void *output_data, long *output_data_count); // zjištČní poþtu hodnot výstupu ID int digapi_output_data_getcount(void *config, long output_id, long *output_data_count); // nastavení názvu souboru pro hodnoty výstupu ID int digapi_output_data_file_setname(void *config, long output_id, char *filename); // zjištČní názvu souboru pro hodnoty výstupu ID int digapi_output_data_file_getname(void *config, long output_id, char *filename); // zjištČní, zda-li je výstup povolen int digapi_output_isenabled(void *config, long output_id, int *enabled);
- 35 -
// povolení (zakázání) výstupu int digapi_output_enabled(void *config, long output_id, int enabled);
Log // nastavení názvu souboru pro chyby int digapi_log_error_file_setname(void *config, char *filename); // zjištČní názvu souboru pro chyby int digapi_log_error_file_getname(void *config, char *filename); // zapsání hodnoty chyby int digapi_log_error_write(void *config, char *msg); // vyþtení hodnoty chyby int digapi_log_error_read(void *config, long pos, char *msg); // zjištČní poþtu chyb int digapi_log_error_getcount(void *config, long *output_data_count); // zjištČní, zda-li je výpis chyb povolen int digapi_log_error_isenabled(void *config, int *enabled); // povolení (zakázání) výpisu chyb int digapi_log_error_enabled(void *config, int enabled); // nastavení názvu souboru pro varování int digapi_log_warning_file_setname(void *config, char *filename); // zjištČní názvu souboru pro varování int digapi_log_warning_file_getname(void *config, char *filename); // zapsání hodnoty varování int digapi_log_warning_write(void *config, char *msg); // vyþtení hodnoty varování int digapi_log_warning_read(void *config, long pos, char *msg); // zjištČní poþtu varování int digapi_log_warning_getcount(void *config, long *output_data_count); // zjištČní, zda-li je výpis varování povolen int digapi_log_warning_isenabled(void *config, int *enabled); // povolení (zakázání) výpisu varování int digapi_log_warning_enabled(void *config, int enabled); // nastavení názvu souboru pro stavy int digapi_log_status_file_setname(void *config, char *filename); // zjištČní názvu souboru pro stavy int digapi_log_status_file_getname(void *config, char *filename); // zapsání hodnoty stavu int digapi_log_status_write(void *config, char *msg); // vyþtení hodnoty stavu int digapi_log_status_read(void *config, long pos, char *msg); // zjištČní poþtu stavĤ int digapi_log_status_getcount(void *config, long *output_data_count); // zjištČní, zda-li je výpis stavu povolen int digapi_log_status_isenabled(void *config, int *enabled);
- 36 -
// povolení (zakázání) výpisu stavu int digapi_log_status_enabled(void *config, int enabled);
Komunikace // nastavení názvu souboru pro pĜíkazy int digapi_control_command_file_setname(void *config, char *filename); // zjištČní názvu souboru pro pĜíkazy int digapi_control_command_file_getname(void *config, char *filename); // zapsání pĜíkazu int digapi_control_command_write(void *config, enum DIGAPI_COMMAND_TYPE command); // zjištČní pĜíkazu int digapi_control_command_read(void *config, long pos, enum DIGAPI_COMMAND_TYPE *command); // zjištČní poþtu pĜíkazĤ int digapi_control_command_getcount(void *config, long *output_data_count); // zjištČní, zda-li jsou pĜíkazy povoleny int digapi_control_command_isenabled(void *config, int *enabled); // povolení (zakázání) pĜíkazĤ int digapi_control_command_enabled(void *config, int enabled); // nastavení názvu souboru pro stavy int digapi_control_state_file_setname(void *config, char *filename); // zjištČní názvu souboru pro stavy int digapi_control_state_file_getname(void *config, char *filename); // zapsání stavu int digapi_control_state_write(void *config, enum DIGAPI_COMMAND_TYPE command); // zjištČní stavu int digapi_control_state_read(void *config, long pos, enum DIGAPI_COMMAND_TYPE *command); // zjištČní poþtu stavĤ int digapi_control_state_getcount(void *config, long *output_data_count); // zjištČní, zda-li jsou informace o stavech povoleny int digapi_control_state_isenabled(void *config, int *enabled); // povolení (zakázání) stavu int digapi_control_state_enabled(void *config, int enabled);
- 37 -
PĜíloha B Obsah pĜiloženého CD: •
Dokument obsahující tuto práci ve formátu PDF. - pdf/BakaláĜská práce.pdf
•
Projekty se zdrojovými kódy vytvoĜených aplikací. - cvi/modul 15 - cvi/Aplikace pro spusteni programu - cvi/cvicna aplikace 01 - cvi/cvicny modul 01 - cvi/modul test 01 - cvi/modul test 02 - cvi/zalozky