260 likes | 411 Views
LabView 7.1. LabView. Vývojový systém (full development package) Base package – bez knihovny Advanced Analysis, obsahuje knihovny GPIB, RS232, Data Acquisition, a Base Analysis Advanced analysis library – (rozšířené analyzační knihovny)
E N D
LabView Vývojový systém (full development package) • Base package – bez knihovny Advanced Analysis, • obsahuje knihovny GPIB, RS232, Data Acquisition, a Base Analysis • Advanced analysis library – (rozšířené analyzační knihovny) • statistika, lineární algebra, operace s poli, generování signálů, zpracování signálů, digitální filtry, okénkové funkce. Lze jej dále doplnit o překladač aplikací (application builder) SQL toolkit pro podporu databázi, PID regulátor, Control Toolbox, VXI knihovna apod.
Program – virtuální nástroj (VI) • programové struktury • sekvence (sequence) • přepínač (case) • cyklus FOR (for-loop) • autoindexace vstupních a výstupních tunelů (možnost vypnutí) • cyklus WHILE • pole (array), struktury (clucter) • události (events) • lokální, globální proměnné, konstanty • matematický výraz • polymorfizmus • property • subVi (vlastní, vnitřní) (soubory, I/O zařízení, filtry, mat. operace,…) • Aplikaci lze uchovat samostatně (*.vi soubor), nebo sdružovat více aplikací (*.llb soubor)
Části virtuálního nástroje • Čelní panel (front panel) • Ovládací a indikační prvky (controls) • ikona a konektor • Blokové schéma (block diagram) • grafické vyjádření programu (functions)
Nástroje pro práci Výběr změna pozice popisovač ovladač scrooling propojovač spojovač výběr barvy dle objektu pop-up menu sonda spojovač - space bar barva breakpoint run stop Svítí-li žárovička: Labview při vykonávání zobrazuje svoji činnost v blokovém schématu výběr - single click výběr - double click krokování nastavení textu pauza výběr - triple click Opakované spuštění
Ikona, konektor, komentáře • Front panel • Ikona obrázek symbolizující VI nástroj • Konektor interface pro navázání VI nástroje s okolím
Pop-up menu, property • Umožňuje rychlé připojení prvků k objektu. • create/(constatnt,control,indikator) • Změna objektu na jiný. • replace/… • Přístup k property vlastnostem. • create/property node • Vyhledání prvku na panelu. • Vyhledání vlastních lokálních proměných. • Změna datového typu a rozsahu hodnot. • representation/typ • format&precision • …
Programové struktury • Sekvence (složena z rámců) • Umělé vytvoření posloupnosti prováděná příkazů. • Jednotlivé rámce sekvence se provádějí popořadě (0, 1, 2…). • Zobrazen je vždy jen jede rámec. • Vstup do rámce tunelem (jeden vstup může být napojen na více bloků různých rámců) • Výstup z rámce tunelem (jeden blok jeden tunel) • Přepínač (case) • Větvení programu, dle podmínky do dvou či více větví • Terminál pro připojení testovací podminky
Programové struktury • For-loop cyklus • Pro známý počet opakování • Automatická indexace vstupního/výstupního kanálu [i] • Vypnuto – vstupem je pole v každém kroku, výstupem je skalár po ukončení celého cyklu. • Zapnuto – vstupem je prvek na indexu i, výstupem je pole výsledků jednotlivých průchodů. • Rychlost provádění cyklu lze ovlivnit vložením bloku Wait Until Next ms Multiple. • Pro zpřístupnění hodnot z mynulých průchodů slouží posuvné registry.
Programové struktury • While-loop cyklus • Opakování dáno testovanou podmínkou (true = opakuj) • Rychlost provádění cyklu lze ovlivnit vložením bloku Wait Until Next ms Multiple. • Pro zpřístupnění hodnot z minulých průchodů slouží posuvné registry. • Event structure • Provádění rámce při vybrané události.
Provádění bloků operace • Asynchronní provádění • bloku může být spuštěno simultánně spolu s dalšími bloky tj. střídavé provádění malých úseků kódu přidělováním kapacity CPU. LabVIEW obsahuje plánovač pro víceúlohoví běh, který přerušuje vykonávání kódu bloku, který má k dispozici všechna svá vstupní data, a přepíná na vykonávání kódu dalšího bloku, který má rovněž k dispozici všechna vstupní data. • Řadič priority přiděluje kódu daného bloku kapacitu CPU na dobu, která odpovídá jeho prioritě, potom přeřazuje tento blok na konec fronty, kterou obhospodařuje. Z této fronty je blok vyřazen po dokončení své činnosti. • Asynchronně se provádějí bloky odpovídající strukturám, vstupně/výstupním funkcím, časovacím funkcím a uživatelem definovaným subVI. • Code Interface Nodes (CINs) a všechny výpočetní funkce jsou prováděny synchronně. Kód bloku je prováděn bez přepínání na provádění jiných bloků a teprve po jeho dokončení je kapacita CPU předána pro provádění jiných bloků. • Existuje pět úrovní priority: 0, 1, 2, 3 a subroutine. • Nejnižší úroveň priority je úroveň 0, • Nejvyšší prioritou je priorita subroutine, která je v některých ohledech speciální. Běží-li některý VI s prioritou subroutine, žádný jiný nebude spuštěn, dokud se tento nedokončí. Provádění těchto bloků je tedy sekvenční.
Provádění bloků operace • Reentrantní provádění bloků znamená, že je možné provádět několikanásobně volaný blok paralelně. (každé volání takovéhoto bloku totiž vytváří separátně kopii dat) užitečné ve třech případech: • jestliže VI obslužného programu řídí a komunikuje s fyzickým přístrojem a musí řídit několik identických přístrojů • jestliže VI čeká specifikovaný časový intervalnebo dojde k vypršení nastaveného času • jestliže VI obsahuje data, která nemohou být sdílenas jinými položkami tohoto VI, • Reentrantní provádění VI se povoluje nastavení VI Setup... Příklad viz. [1]
DLL • Pro volání funkcí z DLL souboru musíme mít k dispozici: • konkrétní dll soubor ;), • jména funkcí v DLL, • počet a typy argumentů ve fci s návratový typem, • volací konvence (C, stdcall). tyto informace získáme z prototypu funkcí v hlavičkovém souboru .h void MyFunction(int32 a, double* b, char* string, uInt32 arraysize, int16* dataarray); b je pointer na jedno realné číslo (8B float), string je pointer na řetězec dataarray je pointer na pole 16b celých čísel
#include “main.h" #include <windows.h> #include <stdio.h> #include <stdlib.h> #include "math.h" #define true 1 #define false 0 DLLIMPORT int GetSphereSAandVol(double radius, double* sa, double* vol) { if(radius < 0) return false; //return false (0) if radius is negative *sa = GetSA(radius); *vol = GetVol(radius); return true; } DLLIMPORT double GetSA(double radius) { return 4 * M_PI * radius * radius; } DLLIMPORT double GetVol(double radius) { return 4.0/3.0 * M_PI * pow(radius, 3.0); } BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } main.h DLLIMPORT int GetSphereSAandVol(double radius, double* sa, double* vol); DLLIMPORT double GetSA(double radius); DLLIMPORT double GetVol(double radius);
DLL, advanced functions Blok pro volání fce z dll souboru call library function node CIN – Code Interface Node Vstupní zařízení (joystick, klávesnice, myš,…) I/O port Jestli je funkce v DLL schopná paralelního zpracování (threadsafe) lze zvolit Reentrant (žlutá/oranžová barva) WIN registry Výběr fce z DLL DLL soubor Manipulace s daty – přetypování, posuvy, přesouvání, rozdělování,… Synchronizace – semafory, fronta, … přidávání argumentů pro postupné vytvoření prototypu fce Nastavení typu argumentu nebo návratové hodnoty funkce Volací konvence
Vytvoření DLL v LabView • Vytvoříme VI přístroj, • přidělíme terminálu vstupy/výstupy, • uložíme a uzavřeme. • Otevřeme nový VI • v tools: Build application or shared library (DLL) …
Vytvoření DLL v LabView Výběr VI přístroje Identifikátor fce Výběr DLL/EXE Volací konvence Jména exportovaných funkcí z VI do DLL souboru. Jméno výsledného DLL Argumenty fce Nastavení argumentu Zdrojový a cílový adresář Prototyp fce Po vytvoření všech prototypů funkcí z VI přístroje, zvolit BUILD - provede kompilaci a vytvoří výsledný .DLL, .h a .lib soubor v cílovém adresáři.
Použití DLL z LabView v C #include <stdio.h> #include <stdlib.h> //#include "SharedLib.h" #include "windows.h" double C = 0; double F = 25; HANDLE fH = 0; double (*f_to_c2)(double *DegF); int main(int argc, char *argv[]) { printf("Nacteni DLL knihovny\n"); fH = LoadLibrary("SharedLib.dll"); printf("Jeji handle jest %d\n",fH); if (fH == 0) { MessageBox(NULL,"Chyba pri nacteni DLL","Chyba", MB_OK); return 1; } printf("Ziskani ukazatele na konverzni fci\n"); f_to_c2 = GetProcAddress(fH, "f_to_c"); printf("Jeji pointer jest %d\n",f_to_c2); if (f_to_c2 == 0) { MessageBox(NULL,"Chyba pri nacteni funkce z DLL","Chyba", MB_OK); return 1; } C = f_to_c2(&F); printf("Konverze stupnu\nF=%f\tna\t\°C=%f\n",F,C); FreeLibrary(fH); system("PAUSE"); return 0; }
CIN • CIN (Code Interface Node) • Blok zpřístupňující C/C++ kód pro LabView • V C kódu musíme zahrnout hlavičkový soubor extcode.h (v adresáři …/LabWiew/cintools) #include "extcode.h" • LabView volá funkce standardizovaného rozhraní: funkce které mají konkrétní identifikátory, návratovou hodnotu a parametry: • MgErr CINRun(volitelné parametry_dle I/O bloku); // při každém provedení bloku CIN • MgErr CINProperties(int32 prop, void *data); // nastaveni CIN • MgErr CINLoad(RsrcFile reserved) // provede se při načtení CIN • CINSave, CINUnload, CINAbort, CINInit, CINDispose. • Dále je možné využívat v kódu další vnitřní fce LabView, typy, … (viz. manuál ve formátu pdf, dostupný z nápovědy k CIN bloku) • Na rozdíl od bloku pro DLL se parametry pro blok CIN volitelně přidají při tvorbě programu, poté se vygeneruje příslušná šablona pro C/C++.
Blok CIN se „roztáhne“ tak, aby obsahoval potřebný počet terminálů (parametrů) • Terminály mohou být: • obousměrné • vstupní • výstupní Terminálům přiřadíme konkrétní signály Vytvoříme šablonu pro C/C++
CIN • Do vytvořené šablony doplníme náš kód. • Následně je potřeba vygenerovat .lsb soubor http://zone.ni.com/devzone/conceptd.nsf/webmain/31DAB548C369B2C6862567C8006D8FC9 • Vytvoříme nový projekt DLL • Nastavíme kompilátor: • Multithreaded DLL, zarovnávání čísel po 1B, konvence volání funkcí C. • Adresář cintools přidat do cesty pro vyhledávání include souborů • Do projektu přiřadit tyto soubory: Cin.obj, Labview.lib, Lvsb.lib, Lvsbmain.def • Vytvoříme příkaz pro vlastní sestavení .lsb souboru • Build commands "<Cintools_path>\lvsbutil" "$(TargetName)" -d "$(WkspDir)\$(OutDir)„ • Output files "$(OutDir)$(TargetName).lsb„ • Spustíme kompilaci
CIN • Po naprogramování a úspěšném přeložení projektu DLL získáme požadovaný soubor .lsb • V přeloženém DLL nejsou slinkovány fce CINXxxx (neuvedeme #include nas_soubor.c v hlavním souboru DLL) • .lsb soubor je sestaven pomocí programu lvsbutil • .lsb načteme do bloku CIN pomocí pop-up okna Load Code Resource Z funkce CINProperties získal LabView informaci o kódu, jenž je threadsafe (žlutá barva) a je možné k tomuto objektu přistupovat paralelně.
Simulation module • Všechny bloky ze simulačního modulu musí být na simulační smyčce nebo simulačním subVI • Lineární (diskrétní i spojité) systémy lze zadávat pomocí přenosu, stavového prostoru, pólů a nul • Nelineární systémy je nutné sestavit pomocí bloků • Zrcadlové obrácení bloku pomocí položky kontextového menu bloku – Reverse terminals • Pokud je na vstupu derivace skok, dojde k zastavení simulace • Při použití bloků nepatřících do simulačního modulu dochází k neočekávanému chování Simulation module
SubVI • Zpřehlednění blokového schématu • Znovupoužití vytvořeného schématu • Vytvoření z aktuálního výběru pomocí nabídky Edit - Create subVI • Výstupy/vstupy vytvořeného subVI odpovídají propojeným výstupům/vstupům z/do výběru použitého pro vytvoření subVI • Uložené subVI se vloží pomocí funkce Select a VI … Select a VI…
Reference [1] http://vlab.fme.vutbr.cz/ [2] http://www.physics.muni.cz/~cermak/index.php [3] http://zone.ni.com/zone/jsp/zone.jsp Communicating with a Real-Time Engine http://zone.ni.com/devzone/devzone.nsf/webcategories/80B108310397CDE886256B5D00798294 Programming Event Response Applications http://zone.ni.com/devzone/devzone.nsf/webcategories/B8486B92B6C187B486256B5D007A8C43 Programming Control Applications http://zone.ni.com/devzone/devzone.nsf/webcategories/98B00EDB9735ECB386256B5D007A86D0 Using External Code http://zone.ni.com/devzone/devzone.nsf/webcategories/69AC4D47BD54298A86256AB7006AB23C Hardware Input and Output http://zone.ni.com/devzone/devzone.nsf/webcategories/9B7EBE009FDF14718625688B00731D38