lab 02 - cvi

20
19 Laboratorul 2 În cadrul acestui laborator vom construi o primă aplicaţie în mediul LabWindows CVI care va conţine toate elementele funcţionale fundamentale, constitutive, care vor fi folosite ulterior în laboratoarele viitore, în dezvoltarea unor programe cu interfeţe grafice ce vor comunica cu diverse echipamente periferice externe. Problemă: Să se construiască o aplicaţie în LabWindows CVI care să prezinte un panou prevăzut cu un buton şi un LED. O apăsare pe acest buton va determina aprinderea LED-ului în timp ce la următoarea apăsare LED-ul se va stinge. Procesul putând continua. Fereastra principală va avea active toate butoanele care sunt caracteristice oricărei aplicaţii Windows (Minimize, Maximize, Close) iar aceste butoane vor lucra în mod corespunzător. În concluzie, în această lucrare va fi prezentat modul de realizare a interfeţei grafice asociată unui program precum şi modalitatea de integrare a codul sursă a acestuia cu partea grafică a programului sub mediul de dezvoltare LabWindows/CVI. În cadrul laboratorului se vor urmări atingerea următoarelor obiective: 1. Crearea unui nou proiect 2. Crearea interfeţei cu utilizatorul 3. Includerea noii interfeţe în proiect 4. Poziţionarea de două noi controale (un buton şi un LED) pe UIR 5. Generarea automată a codului aplicaţiei 6. Comentarea codului generat 7. Modificarea valorii sau stării elementelor interfeţei grafice 8. Exerciţii

Upload: others

Post on 07-Jun-2022

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lab 02 - CVI

19

Laboratorul 2

În cadrul acestui laborator vom construi o primă aplicaţie în mediul LabWindows CVI care va conţine toate elementele funcţionale fundamentale, constitutive, care vor fi folosite ulterior în laboratoarele viitore, în dezvoltarea unor programe cu interfeţe grafice ce vor comunica cu diverse echipamente periferice externe. Problemă: Să se construiască o aplicaţie în LabWindows CVI care să prezinte un panou prevăzut cu un buton şi un LED. O apăsare pe acest buton va determina aprinderea LED-ului în timp ce la următoarea apăsare LED-ul se va stinge. Procesul putând continua. Fereastra principală va avea active toate butoanele care sunt caracteristice oricărei aplicaţii Windows (Minimize, Maximize, Close) iar aceste butoane vor lucra în mod corespunzător. În concluzie, în această lucrare va fi prezentat modul de realizare a interfeţei grafice asociată unui program precum şi modalitatea de integrare a codul sursă a acestuia cu partea grafică a programului sub mediul de dezvoltare LabWindows/CVI. În cadrul laboratorului se vor urmări atingerea următoarelor obiective:

1. Crearea unui nou proiect

2. Crearea interfeţei cu utilizatorul

3. Includerea noii interfeţe în proiect

4. Poziţionarea de două noi controale (un buton şi un LED) pe UIR

5. Generarea automată a codului aplicaţiei

6. Comentarea codului generat

7. Modificarea valorii sau stării elementelor interfeţei grafice

8. Exerciţii

Page 2: Lab 02 - CVI

20

1. Crearea unui nou proiect Un proiect este o colecţie de:

• interfeţe grafice (*.uir) – fişiere care conţin descrierea unor panouri cât şi a obiectelor de pe acestea (obiectele de pe un panou poartă numele generic de „controale”) – aceste panouri pot sau nu să fie active sau vizibile, la un moment dat, funcţie de necesităţile programului,

• fişiere sursă (*.c) – care înglobează diferite părţi ale programului,

• fişiere heder (*.h) – descrierea diferitelor funcţii utilizate în program,

• fişiere bibliotecă (*.lib) – diferite librării externe programului nostru din care apelăm anumite funcţii şi

• fişiere obiect (*.obj)

care inter-relaţionează între ele cu un anumit scop specific impus de programator. Scopul de bază a unui proiect este de a „sparge” programul în mai multe blocuri funcţionale pentru a păstra complexitatea programului sub control.

Pentru crearea unui proiect şi a setărilor iniţiale ale acestuia urmăriţi paşii:

1. Pentru realizarea noului proiect selectaţi din meniul File submeniul New urmat de Project(*.prj) sau apăsaţi combinaţia de taste <Ctrl+N>.

2. În cazul în care un alt proiect este deja încărcat sunteţi întrebaţi dacă doriţi întradevăr să închideţi vechiul proiect. Răspunde-ţi cu YES.

3. Următoarea fereastră vă prezintă opţiunile şi setările implicite care vor fi preluate de la proiectul anterior. Răspunde-ţi cu OK – vezi Fig. 1.

4. Proiectul astfel creat se salvează cu ajutorul meniului File, de unde se selectează Save sau apăsaţi direct combinaţia de taste <Ctrl+S>.

5. După selectarea directorului unde se va face salvarea (discul C: directorul \home) se apasă butonul Save.

Deşi la ora actuală proiectul este gol, neavând nici o funcţionalitate, în următorii paşi, ce vor fi prezentaţi ulteriori, acesta va fi completat până la realizarea aplicaţiei propuse.

Page 3: Lab 02 - CVI

21

Pe lângă datele curente despre fiecare fişier inclus în proiect (nume, tip, dată) acesta mai are precizat şi unul sau mai mulţi din următorii indicatori:

• I – indică faptul că respectivul fişier conţine descrierea unui driver de instrument

• S – s-au făcut modificări în fişierul respectiv şi deci trebuie salvat

• C – indică obligativitatea compilării respectivului fişier înainte de rularea aplicaţiei

• – indică faptul că fişierul este deschis într-o fereastră de editare

• – indică faptul ca acest fişier, asociat cu acest simbol, nu este deschis.

Fig.1. Fereastra de transfer a setărilor proiectului anterior către noul proiect

2. Crearea interfeţei cu utilizatorul 1. Selectaţi din meniul File submeniul New urmat de submeniul User

Interface (*.uir).... Prin această suită de comenzi am lansat în execuţie editorul interfeţelor grafice cu utilizatorul care are în mod implicit un unic panou deja creat.

2. Salvăm acest UIR (User InteRface) prin File, Save As... (ambele opţiuni din editorul pentru interfeţele grafice).

Page 4: Lab 02 - CVI

22

3. Panoul este echivalentul ferestrelor din programarea Windows. Pentru a le crea, din editorul de interfeţe grafice se execută secvenţa Create, Panel, astfel obţinem un nou panou în cadrul UIR-ului curent. Prin dublu “click” pe acesta se va intra în fereastra de editare a caracteristicilor panoului care va fi similară cu cea prezentată în Fig. 2.

Fig. 2. Fereastra caracteristicilor asociată cu fiecare panou

Diferitele butoane ce permit acţiunea directă a editorului de interfeţe se găsesc, de regulă, în partea stângă sub bara de meniuri şi au următoarele semnificaţii şi funcţionalităţi:

• – oferă diferite facilităţi de operare. În momentul în care este activat, evenimentele generate de utilizator – de ex. cele generate cu ajutorul mous-ului – vor fi afişate în partea dreaptă sub bara de meniuri.

• – utilizat pentru a modifica textul asociat cu obiectele din UIR, permiţând modificarea label-ul diferitelor controale, a valorilor lor implicite etc.

• – buton folosit pentru modificare culorii obiectelor. Prin apăsarea butonului din stânga a mouse-ului se obţine colorarea automată a obiectul selectat folosindu-ne de

Page 5: Lab 02 - CVI

23

culoarea curentă. Prin apăsarea butonului din dreapta a mouse-ului se permite selectarea unei anumite culori specifice, alta decât cea implicită.

• – element folosit în principal la selectarea, mutarea, dimensionarea, gruparea etc. a diferitelor obiecte.

Cu ajutorul ferestrei de editare a caracteristicilor unui panou, vezi Fig. 2, vom putea modifica modul de apariţie grafică şi de comportare a ferestrei. Astfel:

Constant Name – cu ajutorul textului din acest box se va genera identificatorul acestui panou. Identificatorul panoului este folosit de toate funcţiile care doresc să acceseze, interogheze, preia, seteze etc. diferite proprietăţi ale panoului (de exemplu atunci când se doreşte modificarea în timpul rulării programului a culorii acestuia).

Callback Function – permite specificarea numelui unei funcţii de răspuns care va fi apelată automat la generarea unor anumite evenimente de către controlul grafic (de exemplu când dorim să închidem fereastra vom apăsa pe butonul ; această acţiune va genera la nivelul codului un salt în cadrul funcţiei de răspuns determinată de un anumit eveniment specific – în cazul nostru de evenimentul EVENT_CLOSE). Folosirea unei funcţii specifice asociată oricărui element de tip control este opţională.

De exemplu, în momentul când vom da “click” cu butonul din stânga al mous-ul pe un buton pe care îl vom poziţiona pe interfaţa grafică se vor genera următoarele evenimentele:

1. GOT_FOCUS – dacă butonul nu este activ, apăsarea pe acesta determină activarea lui, simultan cu generarea acestui eveniment;

2. LEFT_CLICK – când utilizatorul dă “click” cu butonul din stânga al mous-ului pe butonul de comandă sau pe orice alt tip de element de tip control sau interfaţă grafică acest eveniment este automat generat. Interfeţele generate cu mediul LabWindows/CVI pot recunoaşte “clik”-uri ale butonului din stânga sau dreapta ale mous-ului simple sau duble;

3. COMMIT – în momentul în care utilizatorul eliberează butonul mous-ului acest eveniment este generat în sensul în care utilizatorul a săvârşit, a comis (commit în engleză) un eveniment legat de acel buton sau control.

Panel Title – titlul panoului, vizibil în bara superioară a ferestrei, dacă aceasta este activă.

Page 6: Lab 02 - CVI

24

Other Attributes… – Odată cu apăsarea acestui buton se va deschide un nou panou, similar cu cel din Fig. 3, în care pot fi setate o serie de parametri care vor descrie modul de comportare ulterioară a ferestrei.

Fig. 3. Diferiţi parametri şi caracteristici ce determină diferitele moduri de comportare ale unui panou asociate cu diferitele evenimente potenţiale

4. Pentru a începe să satisfacem cerinţele problemei iniţiale, câmpul

Callback Function va fi completat cu fPanel. Această funcţie va fi apaelată de fiecare dată când un anumit eveniment specific asociat numai cu panoul va avea loc (minimizarea, maximizarea, închiderea, mutarea, etc. unui panou).

5. Deoarece dorim să avem active butoanele de Minimize, Maximize, apăsăm butonul Other Attributes… şi selectăm opţiunile Can Maximize şi Can Minimize. Iar apoi apăsăm butonul OK.

6. În editorul caracteristicilor ferestrei apăsăm butonul OK.

7. Salvăm din noul UIR (File, Save All) pentru a avea active ultimile modificări.

Page 7: Lab 02 - CVI

25

3. Includerea noii interfeţe în proiect Pentru ca programul să se poată folosi de interfaţa grafică anterior

creată aceasta trebuie introdusă în proiect.

1. Astfel, din meniul Edit al proiectului Test se selectează opţiunea Add Files To Project... .

2. Din noua fereastră deschisă putem selecta în mod particular pentru situaţia de faţă User Interface (*.uir)... sau orice alt tip de resursă pe care dorim să o includem în proiect cu o altă ocazie – la modul cel mai general putem utiliza opţiunea All Files... .

3. După dublu clic pe fişierul test.uir sau prin selectarea fişierului test.uir urmată de apăsarea butonului Add se observă apariţia în box-ul Selected Files: a fişierului test.uir precedat de calea unde se află.

4. Se apasă butonul OK pentru încheierea procesului. Din acest moment în cadrul proiectului Test un prim fişier a fost inclus.

4. Poziţionarea de două noi controale (un buton şi un LED) pe UIR 1. Redeschideţi editorul de interfeţe grafice prin “dublu click” pe fişierul

test.uir din fereastra proiectului.

2. Din meniul Create alegeţi opţiunea Command Button şi selectaţi un buton din cele existente. Diferenţa între acestea este dată doar de forma geometrică şi posibilitatea introducerii unei imagini. După selecţie, butonul ales va apare pe panoul curent. Pentru obţinerea aceluiaşi rezultat putem da “click” dreapta cu mous-ul pe panou, iar apoi se urmează aceeaşi paşi similari.

3. Pentru crearea LED-ului procedaţi în mod similar selectând de data aceasta opţiunea LED.

4. Pentru a intra în fereastra de editare a caracteristicilor butonului se va executa un “dublu click” în zona ocupată de buton.

5. Deoarece dorim ca la fiecare apăsarea a acestui buton să basculăm starea LED-ului suntem obligaţi să asociem o funcţie acestui buton în care să

Page 8: Lab 02 - CVI

26

implementăm această funcţionalitate. Astfel în câmpul Callback Function vom specifica funcţia fButon

6. Completaţi restul câmpurilor conform Fig. 4. Utilizarea în câmpul Label a expresiei “__Schimba stare LED”, deci a folosirii a două “underscore”, este utilizată pentru ca eticheta butonului să fie afişată sub forma “Schimba stare LED”. În acest mod un potenţial utilizator al programului este atenţionat că pentru acţionarea acestui buton poate folosi şi tastatura. Câmpul Shortcut Key se completează ca în figură, în acest mod combinaţia de taste <Ctrl+S> va determina acelaşi rezultat ca executarea unui “click” cu mous-ul pe buton.

Fig. 4. Diferiţi parametri şi caracteristici asociaţi cu un buton

7. Selectaţi pentru câmpul Control Mode opţiunea Hot.

Când un control este creat şi plasat pe interfaţa grafică aceasta poate genera evenimentele în mai multe moduri distincte şi, în plus, poate avea comportări diferite faţă de utilizator. Fiecare control are patru moduri distincte de operare:

• Normal

Page 9: Lab 02 - CVI

27

• Indicator • Hot (implicit) • Validate

Normal – utilizatorul poate modifica starea obiectului (în cazul nostru butonul) şi în plus acesta va genera toate evenimentele conform modului normal de operare mai puţin evenimentul COMMIT.

Indicator – utilizatorul nu poate influenţa starea obiectului şi acesta nu va genera niciodată evenimentele COMMIT şi VAL_CHANGED (value change – schimbarea valorii). Obiectul putând fi folosit numai pentru afişarea informaţiilor. Există şi obiecte, cum sunt Strip Chart (din meniul Graph) şi Text Message, care pot fi folosite numai ca indicatoare.

Hot – este identic cu modul Normal dar spre deosebire de acesta controlul va genera şi evenimentul COMMIT când utilizatorul va acţiona asupra lui.

Validate – este identic cu modul de lucru Hot dar, spre deosebire de acesta, înainte de a genera evenimentul COMMIT obiectul va valida plaja de valori permisă, dar numai dacă obiectele vor avea atributul Range Check pus pe Notify. Dacă valoarea iese din domeniul prescris se va afişa un panou de notificare a erorii. Obiectul nu va genera evenimentul COMMIT atâta timp cât nu se introduce o valoare corectă.

8. Eventual puteţi aranja diferitele controalele conform “simţului artistic” propriu. Deoarece această operaţie este mare consumatoare de timp, mai ales când numărul de obiecte grafice este mare, LabWindows CVI a fost prevăzut cu o serie de facilităţi de aranjare automată care vor fi prezentate în rândurile de mai jos. Din meniul Arrange se selectează Allignment... folosind în continuare una dintre posibilele opţiuni după cum urmează:

• - Left Edges – aliniază vertical toate obiectele funcţie de marginea lor stângă, raportând totul la cel mai din stânga dintre obiecte.

• - Horizontal Centers aliniază vertical toate controalele funcţie de axa centrală de simetrie ale acestora.

• - Right Edges aliniază vertical toate obiectele funcţie de marginea lor dreaptă, puctul de referinţă va fi cel mai din dreapta obiect.

Page 10: Lab 02 - CVI

28

• - Top Edges aliniază superior toate obiectele funcţie de marginea lor dreaptă faţă de obiectul poziţionat cel mai sus.

• - Vertical Centers aliniază orizontal obiectele selectate funcţie de axa verticală a lor.

• - Bottom Edges aliniază orizontal toate obiectele funcţie de marginea inferioară.

Pentru ca aceste opţiuni să fie active anterior se vor selecta toate obiectele pe care dorim să le aliniem (se ţine tasta <Shift> apăsată şi se selectează obiectul cu un “click” pe acesta).

Similar putem distribui (aranja în mod automat) controalele pe un panou folosindu-ne de anumite opţiuni incluse în pachet. Pentru a ajunge la aceste opţiuni din meniul Arrange se selectează Distribution... folosind în continuare una dintre posibilele opţiuni după cum urmează:

• - Top Edges asigură spaţiere verticală între partea superioară a controalelor. Cel mai de sus şi cel mai de jos control sunt considerate puncte de referinţă.

• - Vertical Centers asigură spaţiere verticală între centrele controalelor. Cel mai de sus şi cel mai de jos control sunt considerate puncte de referinţă.

• - Bottom Edges asigură spaţiere verticală între partea inferioară a controalelor. Cel mai de sus şi cel mai de jos control sunt considerate puncte de referinţă.

• - Vertical Gap asigură spaţiere verticală la distanţe egale între ele a controalelor. Cel mai de sus şi cel mai de jos control sunt considerate puncte de referinţă.

• - Vertical Compress minimizează spaţiile pe verticală dintre controale, eliminând astfel orice spaţiu dintre ele.

• - Left Edges setează spaţii orizontale egale între marginile din stânga ale controalelor. Cel mai de sus şi cel mai de jos control sunt considerate puncte de referinţă.

Page 11: Lab 02 - CVI

29

• - Horizontal Centers setează spaţii orizontale egale între centrele controalelor. Cel mai din stânga şi cel mai din dreapta control sunt considerate puncte de referinţă.

• - Right Edges setează spaţii orizontale egale între marginile din dreapta ale controalelor. Control de la extremitatea stângă şi cel de la extremitatea dreaptă sunt punctele de referinţă.

• - Horizontal Gap generează o spaţiere orizontală între controale. În mod similar punctele de referinţă sunt cele două controale extreme.

• - Horizontal Compress minimizează spaţiile pe orizontală dintre controale şi elimină orice spaţiu dintre ele.

5. Generarea automată a codului aplicaţiei Din acest moment partea grafică pentru aplicaţia cerută este

terminată. Nu ne mai rămâne decât să salvăm fişierul UIR – în mod similar cu descrierea anterior făcută. O dată cu salvarea fişierului UIR va fi generat şi un alt fişier asociat cu acesta de tip header cu acelaşi nume, dar având extensia .h în care sunt stocate valorile constantelor PANEL, PANEL_Buton şi PANEL_LED care ne definesc obiectele de pe interfaţă şi interfaţa cât şi funcţiile fButon şi fPanel asociate cu interfaţa şi butonul. Fişierul test.h nu trebuie să fie modificat manual niciodată, el va fi modificat automat ori de câte ori vom modifica interfaţa grafică sau elementele de pe ea. Dacă dorim putem crea un nou fişier cu prototipuri (care să conţină şi acest fişier test.h) pe care sa-l includem ulterior în fişierele de tip .c.

1. Acum vom trece la generarea automată a scheletului de cod corespunzător descrierii grafice, folosind următoarea secvenţă de comenzi Code, urmată de Generate şi în final de All Code…, toată această secvenţă fiind dată în editorul de interfeţe. În acest moment se va deschide o nouă fereastră similară cu cea din Fig. 5.

2. Bifaţi funcţia fPanel drept funcţia care va gestiona evenimentul EVENT_CLOSE. În acest mod mediul va adăuga automat cod pentru gestionarea acestui eveniment în funcţia fPanel asociată cu fereastra dumneavoastră.

Page 12: Lab 02 - CVI

30

Fig. 5. Panoul de generare automată a codului programului în conformitate cu cerinţele impuse prin intermediul interfaţei grafice

3. Puteţi selecta generarea funcţiei WinMain() în loc de main() drept punct

de intrare în momentul în care executabilul va fi lansat. În situaţia utilizării unui program linker extern sau a utilizării funcţiilor din librăria SDK este de preferat utilizarea funcţiei WinMain(). Pentru programul pe care îl dezvoltăm în cadrul acestui laborator această opţiune este indiferentă, alegeţi deci oricare din cele două opţiuni.

4. Câmpul Panel Variable Name va conţine “mânerul” (handle-rul) cu ajutorul căruia veţi referi în mod constant panoul aplicaţiei, datorită numărul mare de folosiri a aceste variabile se preferă o denumire cât mai scurtă (de exemplu: panel).

5. Apăsaţi butonul OK pentru generarea codului. Imediat o fereastră similară cu cea din Fig. 6 va fi generată.

Page 13: Lab 02 - CVI

31

Fig. 6. Codul generat în mod automat de către mediul LabWindows CVI 6. Salvaţi codul astfel generat prin intermediul opţiunilor: File, Save (sau

<Ctrl+S>) sub numele de test.c.

7. Includeţi fişierul test.c în proiect – paşii sunt similari cu cei parcurşi în situaţia includerii în proiect a interfeţei grafice, dar, acum selectaţi un fişier cu extensia .c.

Lansaţi în execuţie programul şi testaţi funcţionalitatea butoanelor Minimize, Maximize şi Close.

6. Comentarea codului generat Codul generat în mod automat de mediul de dezvoltare LabWindows

CVI este: #include <cvirte.h> #include <userint.h> #include "test.h"

static int panelHandle;

int main (int argc, char *argv[])

Page 14: Lab 02 - CVI

32

{ if (InitCVIRTE (0, argv, 0) == 0) //linia 1 return -1; /* out of memory */ if ((panelHandle = LoadPanel (0, "test.uir", PANEL)) < 0) //linia 2 return -1; DisplayPanel (panelHandle); //linia 3 RunUserInterface (); //linia 4 DiscardPanel (panelHandle); //linia 5 return 0; } int CVICALLBACK fPanel (int panel, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_GOT_FOCUS:

break; case EVENT_LOST_FOCUS: break; case EVENT_CLOSE: QuitUserInterface (0); //linia 6 break; } return 0; } int CVICALLBACK fButon (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: break; } return 0; }

În continuare vom comenta cele mai importante aspecte ale

programului generat. Astfel: linia 1 – în această linie se realizează iniţializarea „motorului” mediului

LabWindows CVI: CVI Run-Time Engine. Apelul funcţiei InitCVIRTE este necesar numai în executabile sau DLL-uri care sunt link-editate extern, prototipul acestei funcţiei este în fişierul cvirte.h inclus în mod

Page 15: Lab 02 - CVI

33

automat de către mediul LabWindows CVI în codul sursă al fişierului principal ce include funcţia main.

linia 2 – prin funcţia LoadPanel se încarcă un panou dintr-un fişier de tipul UIR (în cazul nostru particular din fişierul test.uir). Panoul care se va încărca din fişierul test.uir va avea identificatorul PANEL – într-un fişier UIR pot exista mai multe panouri, fiecare având propriul identificator. Acest panou va fi „copilul” ferestrei a cărui „handle”-r („mâner”, identificator) este trimis ca prim argument al funcţiei LoadPanel. În cazul în care valoarea trimisă este 0 fereastra pe care o încărcam nu va avea nici un părinte fiind considerată drept fereastra principală (the top-level panel). În variabila panelHandle se va stoca un identificator unic al acestui panou.

linia 3 – se afişează panoul cu „handle”-rul panelHandle.

linia 4 – se lansează în execuţie fereastra principală a programului. Din această funcţie se va reveni numai atunci când funcţia QuitUserInterface() este lansată în execuţie din una din funcţiile asociate cu diferitele controale de pe panou.

linia 5 – se eliberează resursele folosite de fereastra identificată prin identificatorul stocat în variabila panelHandle precum şi toate resursele utilizate de „copii” acesteia din memorie şi, totodată, se curăţă ecranul (memoria video a plăcii grafice) de această fereastră, dacă evident ea era vizibilă.

linia 6 – În fiecare moment în care este generat un eveniment legat de fereastra principală, automat se realizează un salt în funcţia fPanel. Dar, numai dacă evenimentul generator este EVENT_CLOSE atunci funcţia QuitUserInterface (0) va fi executată; execuţia acestei funcţii determină la rândul ei terminarea funcţiei RunUserInterface () şi, deci, a întregului program după execuţia liniei 5.

7. Modificarea valorii sau stării elementelor interfeţei grafice

Deşi la execuţia acestui proiect se poate observa că în linii mari acesta funcţionează, totuşi aprinderea şi stingerea LED-ului la fiecare apăsare a butonului nu este realizată încă. Deci trebuie, în continuare, să

Page 16: Lab 02 - CVI

34

completăm corpul funcţiei fButon cu codul necesar îndeplinirii obiectivelor propuse în cadrul acestei teme.

Pentru a modifica stare unor controale sau pentru a lua anumite valori de la alte controale vor fi folosite următoarele două funcţii specifice: GetCtrlVal şi SetCtrlVal. Pentru a ajunge la panourile acestor două funcţii (funcţii aparţinând librăriei mediului LabWindows CVI) se va realiza următoarea suită de comenzi: Library, User Interface…, Controls/Graphs/Strip Charts…, General functions şi de aici se va selecta funcţia Get Control Value sau funcţia Set Control Value.

Fig. 7. Panoul funcţiei SetCtrlVal

1. Poziţionaţi-vă în interiorul funcţiei fButon sub linia case

EVENT_COMMIT; în acest punct vom introduce codul necesar aprinderii, stingerii LED-ului. Astfel, zona de cod situată între această linie (case EVENT_COMMIT) şi până la primul break se va executa numai atunci când utilizatorul a comis evenimentul (a apăsat butonul) şi în această zonă trebuie să scriem codul necesar aprinderii/stingerii LED-ului.

2. Se introduce funcţia SetCtrlVal prin urmarea următorului arbore de căutare: Library, User Interface…, Controls/Graphs/Strip Charts…, General functions şi Set Control Value. Un panou similar cu cel din

Page 17: Lab 02 - CVI

35

Fig. 7 se va deschide. Câmpul Panel Handle este „handle”-rul (mânerul) prin care este referit panoul pe care se află controlul a cărui stare dorim să o modificăm. În situaţia noastră va fi panelHandle obţinut prin intermediul funcţiei LoadPanel în linia 2.

3. Pentru aflarea diferitelor informaţii legate de una din funcţiile librăriei mediului LabWindows CVI apăsaţi combinaţia <Shift+F1> atunci când panoul funcţiei respective este activ (un panou similar, dar particular, cu cel din Fig. 7). Pentru aflarea anumitor informaţii despre diferitele argumente ale funcţiei respective apăsaţi tasta <F1> când respectivul câmp este selectat (cursorul este poziţionat în câmpul respectiv).

Fig. 8. Panoul de selecţie a identificatorului unui anumit control 4. În câmpul Control ID se referă obiectul de pe interfaţa grafică asupra

căruia dorim sa acţionăm. Identificatorul oricărui control este format din identificatorul panoului (în cazul nostru PANEL) urmat de cel al obiectului (LED). Identificatorul se poate alege dintr-o listă prin selcţia Code urmată de Select UIR Constant... sau prin apăsarea tastei <Enter> atunci când câmpul Control ID este selectat. Ambele secvenţe vor fi executate ulterior poziţionării cursorului în câmpul Control ID. Fereastra care va apare este similară cu cea din Fig. 8. Cu ajutorul câmpului Constant Type se pot selecta identificatorii elementelor care vor fi afişate. După selecţia PANEL_LED se continuă cu OK. Un mod

Page 18: Lab 02 - CVI

36

similar de a ajunge la fereastra din Fig. 8 este prin apăsarea butonului de pe bara de instrumente a panoului din Fig. 7.

Se recomandă ca de fiecare dată să se aleagă constantele de identificare a diferitelor controale în mod automat şi nu prin introducerea manuală a lor. Această recomandare va duce automat la minimizarea numărului de erori şi la funcţionarea corectă a programului.

4. În câmpul Value se introduce valoarea ce va fi trimisă controlului. În cazul nostru 1 pentru ca LED-ul să fie aprins şi 0 pentru a-l stinge. Această valoare este dependentă de tipul obiectului a cărui stare sau valoare se modifică.

5. Se înserează funcţia prin Code urmată de Insert Function Call, tastarea combinaţiei de taste <Ctrl+I> sau prin apăsarea butonului . Pentru afişarea panoului oricărei funcţii aparţinând librăriilor mediului LabWindows CVI se apasă combinaţia de taste <Ctrl+P>, cursorul fiind poziţionat anterior pe linia pe care se regăseşte funcţia.

6. Se rulează aplicaţia şi se apasă butonul. Se observă aprinderea LED-ului. Apăsări ulterioare pe buton nu vor schimba starea acestuia.

7. În continuare se completează programul astfel încât acesta să satisfacă cerinţele iniţiale.

Indicaţii: pentru rezolvarea problemei se poate folosi: (1). o variabilă globală, (2). sau se poate folosi modificatorul static în faţa unei variabile locale funcţiei fButon, (3). sau cu ajutorul funcţiei GetCtrlVal se poate interoga starea LED-ului urmând ca ulterior să complementăm această stare (atenţie variabila unde veţi depozita valoarea controlului trebuie să o trimiteţi la funcţie prin referinţă – deci adresa ei !!! – GetCtrlVal (panelHandle, PANEL_LED, &valoare_returnata))

8. Exerciţii

1. Folosiţi un control numeric cu limitare de domeniu şi observaţi ce se întâmplă în momentul în care depăşiţi domeniul de valori ales prealabil (anterior efectuaţi toate setările pentru a face activă opţiunea de validare a domeniului).

2. Schimbaţi culoare LED-ului. Astfel în starea ON să fie roşu în timp ce în starea OFF să fie galben.

Page 19: Lab 02 - CVI

37

3. Pe aplicaţia pe care aţi dezvoltat-o deja introduceţi două controale numerice. Primul vă va permite numai să introduceţi un număr în timp ce cu ajutorul celui de al doilea veţi afişa numai valori. În momentul apăsării butonului valoarea de la controlul de intrare va fi afişată la cel de ieşire.

Page 20: Lab 02 - CVI

38