LUCRAREA NR. 4 Controale şi indicatoare de tip tablou şi grup. Obiecte de tip grafic 1. Controale şi indicatoare de tip tablou şi grup (Array & Cluster) Aceste obiecte pot fi de două feluri: de tip matrice (tablou) şi de tip grup. Ele pot fi accesate din submeniul Array & Cluster din meniul Controls. Tablouri Un tablou este o colecţie de date de mărime variabilă ale cărui elemente sunt toate de acelaşi tip, comparativ cu grupul care are dimensiune fixă şi elemente de tipuri diferite. Elementele unui tablou sunt ordonate, iar accesarea unui element din tablou se face indexând tabloul. Indexarea se face începând de la 0, ceea ce înseamnă că domeniul indexului este de la 0 la n-1 unde n este numărul de elemente ale tabloului. În cazul tablourilor bidimensionale este nevoie de doi indici pentru a localiza un element: un indice pentru rând şi un indice pentru coloană, ambii indici plecând de la 0. În acest caz vorbim de un tablou N x M, unde N este numărul de linii şi M numărul de coloane şi conţine N x M elemente. Un exemplu simplu este o tablă de şah care are 8 linii şi 8 coloane, deci în total 64 de poziţii. Tablourile pot avea un număr arbitrar de dimensiuni, dar pentru a localiza un element este necesar câte un indice pentru fiecare dimensiune. Tipul datelor unui tablou poate fi un grup conţinând diferite tipuri de date, inclusiv tablouri ale căror tipuri de elemente este un grup. Nu se poate crea un tablou de tablouri, în schimb se pot utiliza tablouri multidimensionale sau un tablou de grupuri de tablouri. Tablourile sunt frecvent folosite atunci când trebuie executate calcule sau operaţii intrare-ieşire în mod iterativ. Folosirea tablourilor reduce dimensiunile, le face mai rapide şi mai uşor de dezvoltat (datorită numărului mare de funcţii şi VI-uri pentru manipularea tablourilor din LabVIEW). 49 Un tablou poate fi plasat în panoul frontal selectând opţiunea Array din meniul Array & Cluster, aşa cum arată Fig. 1. Fig. 1. Panoul frontal al unui tablou Un tablou nou creat conţine un index, un cadru (display) gol şi o etichetă ce poate fi opţională. Există două moduri pentru a defini tipul unui tablou: i) se poate aduce un control sau indicator valid în cadrul tabloului sau ii) se selectează un control sau indicator direct în suprafaţa cadrului. În ambele cazuri, controlul (indicatorul) inserat umple cadrul tabloului. Un tablou nou creat are o singură dimensiune şi un singur index. Pentru a creşte dimensiunea tabloului, se poate selecta opţiunea Add Dimension din meniul aparent, iar pentru a scădea dimensiunea acestuia se foloseşte Remove Dimension. Pentru fiecare dimensiune adăugată apare un index adiţional. Dimensiunea tabloului este decisă de utilizator care decide de asemenea de câţi indici este nevoie pentru a localiza informaţia. De exemplu, pentru a localiza al şaselea cuvânt de pe linia 28, pagina 192 al unei cărţi, sunt necesari trei indici: 6, 28,192. Cu elementele unui tablou se lucrează ca şi cum ar fi elemente de sine-stătătoare, iar cu indexul cadrului în acelaşi mod în care se lucrează cu un control digital. Dimensiunea unui tablou nu se poate 50 fixa, dar când se setează valorile implicite ale unui tablou se setează implicit şi dimensiunea lui. Dimensiunea implicită nu trebuie făcută mai mare decât este necesar. Dacă un tablou este setat la o valoare implicită mare, toate evaluările implicite ale sale sunt salvate în VI-ul care îl conţine, ceea ce conduce la mărirea dimensiunii fişierului. Un tablou nou creat fără elemente este nedefinit, nu are nici un tip de date, nu are elemente şi nu poate fi folosit în program. Pentru a afla dimensiunea unui tablou se selectează opţiunea Show Last Element din submeniul Data Operations al meniului aparent. Din tablourile LabVIEW se pot copia date. Pentru a selecta datele ce trebuie copiate se setează indexul pe primul element ce se doreşte copiat şi apoi se alege Start Selection din submeniul Data Operations al meniului aparent. Se setează apoi indexul pe ultimul element din setul ce se doreşte copiat şi se selectează opţiunea End Selection din submeniul Data Operations al meniului aparent. Grupuri În LabVIEW un grup este o colecţie ordonată de unul sau mai multe elemente similare structurilor din C sau din alte limbaje de programare. Comparativ cu tablourile, grupurile conţin orice combinaţie de tipuri de date. Grupurile diferă de tablouri şi prin faptul că au dimensiune fixă. Ca şi un tablou, un grup este un control sau un indicator şi el nu poate conţine un amestec de controale şi indicatoare. Un control sau un indicator de tip grup se creează prin instalarea oricărei combinaţii de date de tip boolean, şir, grafic, tablou sau alt grup în interiorul unui grup. Obiectele de tip grup se accesează din meniul Controls, submeniul Array & Cluster (Fig. 2). Selectând Change to Control sau Change to Indicator din meniul aparent al unui grup, toate elementele grupului se modifică din indicatoare în controale şi invers. Selectând comanda Make Current Value Default din meniul Data Operations al meniului aparent se setează valorile curente ca valori implicite pentru fiecare element al grupului. Elementele unui grup au o ordine logică ce nu are nici o legătură cu poziţia lor în interiorul ferestrei de afişare de pe panoul frontal. Primul element inserat în grup este elementul 0, al doilea elementul 1, ş.a.m.d. Dacă un element al grupului este şters, ordinea elementelor este ajustată automat. Această ordine poate fi modificată selectând opţiunea Cluster Order din meniul aparent. Ordinea în grup determină ordinea în care elementele apar ca terminale în funcţiile de asamblare şi dezasamblare din diagrama bloc. 51 Fig. 2. Selectarea unui obiect de tip cluster Elementele unui grup nu sunt componente permanente ale acestuia aşa că elementele pot fi mutate sau redimensionate în mod independent chiar şi atunci când se află în fereastra de afişare de pe panoul frontal. LabVIEW-ul are mai multe funcţii în submeniul Cluster al meniului Functions pentru asamblarea sau construirea de grupuri. Funcţiile Bundle şi Bundle by Name asamblează un grup din elemente individuale sau înlocuiesc elementele individuale cu elemente de acelaşi tip. Funcţia Array to Cluster converteşte un tablou într-un grup de elemente. Funcţia Bundle apare în diagrama bloc cu două terminale de intrare în partea stângă. Redimensionând pe verticală simbolul grafic, se creează atâtea terminale câte sunt necesare. Elementul conectat la primul terminal devine elementul zero, cel conectat la al doilea terminal elementul 1, ş.a.m.d. Trebuie legate toate terminalele care au fost create. În plus faţă de terminalele pentru elemente din partea stângă, această funcţie mai are un terminal de intrare pentru grupuri în mijloc. Acest terminal se utilizează pentru a înlocui unul sau mai multe elemente ale unui grup deja existent fără a afecta celelalte elemente. 52 Funcţia Bundle by Name este similară funcţiei Bundle cu deosebirea că în loc de a accesa câmpurile grupului prin poziţie acestea sunt accesate după nume. În acest caz pot fi accesate doar acele elemente ce se doresc a fi utilizate. Pentru fiecare element ce se doreşte accesat trebuie adăugată funcţiei o nouă intrare. Deoarece numele unui element nu specifică poziţia acestuia în interiorul unui grup, un grup trebuie conectat la terminalul din mijloc. Această funcţie poate fi utilizată doar pentru a înlocui elementele după nume, nu şi pentru a crea un nou grup. De notat că funcţia poate fi redimensionată pentru a avea atâtea elemente câte sunt necesare. Această funcţie este utilă când se lucrează cu structuri de date care se pot modifica în timpul procesului de dezvoltare a programului. Dacă modificările făcute de utilizatori implică adăugarea unui element nou, sau reordonarea grupului, schimbarea nu necesită modificări în funcţia Bundle by Name, deoarece numele elementelor rămân valide. Funcţia Array to Cluster converteşte un tablou de elemente unidimensional într-un grup de elemente. Această funcţie este utilă când se doreşte afişarea elementelor pe panoul frontal într-un indicator de tip grup, dar elementele trebuie manipulate în diagrama bloc prin valoarea indexului. Numărul de elemente din grup se setează folosind opţiunea Cluster Size din meniul aparent. Funcţia asignează tabloului 0 elementul 0 din grup, ş.a.m.d. Dacă tabloul are mai multe elemente decât grupul, funcţia ignoră elementele suplimentare. Pentru dezasamblarea grupurilor în elementele componente corespunzătoare LabVIEW conţine funcţiile Unbundle şi Unbundle by Name care dezasamblează grupurile şi Cluster to Array care converteşte un grup cu elemente de acelaşi tip într-un tablou cu elemente de acelaşi tip. Funcţia Unbundle se obţine tot din submeniul Cluster al meniului Functions şi are două terminale de ieşire în partea dreaptă. Similar funcţiei Bundle, folosind instrumentul de redimensionare, se ajustează numărul de ieşiri necesare. Elementul 0 corespunde primei ieşiri, elementul 1 celei de-a doua ieşiri, ş.a.m.d. Funcţia Unbundle by Name este similară funcţiei Unbundle cu deosebirea că elementele grupului sunt referite prin nume şi nu prin poziţie. În acest caz pot fi citite doar elementele care interesează şi nu trebuie ca fiecare element al grupului să aibă o ieşire. Unul din avantajele funcţiei Unbundle by Name faţă de funcţia Unbundle este aceea că aceasta nu este aşa de ”legată” de structura datelor unui grup. 53 Funcţia Unbundle trebuie să aibă întotdeauna acelaşi număr de terminale şi elemente. Dacă se mută sau se adaugă un element, VI-ul devine inoperabil. Cu funcţia Unbundle by Name se pot adăuga sau muta elemente într-un grup fără a afecta VI-ul. Funcţia Cluster to Array converteşte elementele unui grup într-un tablou cu o singură dimensiune format cu elementele grupului. Elementele grupului trebuie să fie toate de acelaşi tip, iar tabloul conţine acelaşi număr de elemente ca şi grupul. Funcţia este utilă atunci când se doreşte gruparea unui set de controale pe panoul frontal într-o anumită ordine în interiorul unui grup dar prelucrarea lor se face în diagrama bloc folosind indexul. 2. Obiecte de tip grafic Obiectele de tip grafic sunt create din submeniul Graph al meniului Controls. Aceste obiecte sunt de două tipuri principale: grafice (graph) şi diagrame (chart). Un indicator grafic este un cadru (afişaj) bidimensional ce conţine graficul uneia sau mai multor mărimi. Graficul primeşte şi plotează blocuri de date. O diagramă afişează de asemenea grafice, dar primeşte date curente şi reactualizează display-ul punct cu punct sau bloc cu bloc, reţinând numai un anumit număr din ultimele puncte de afişare plasate într-un buffer. LabVIEW are trei tipuri de grafice şi două tipuri de diagrame: Waveform Chart, Waveform Graph, XY Graph, Intensity Chart şi Intensity Graph (Fig. 3). Fig. 3. 54 Graficele sunt de două feluri: de tip formă de undă şi grafice XY (de tip osciloscop). Formele de undă plotează numai funcţii de o singură variabilă cu puncte uniform distribuite de-a lungul axei x. Graficele XY pot fi utilizate pentru a plota funcţii multivariabile cum ar fi forme circulare sau forme de undă cu bază de timp variabilă. Ambele tipuri de grafice pot afişa orice număr de ploturi (curbe). Pentru graficele ce afişează un singur plot, graficele de tip formă de undă (Waveform Graph) acceptă două tipuri de date. Primul tip de date este tabloul cu o singură dimensiune. LabVIEW interpretează datele ca puncte pe grafic şi incrementează punctele cu 1 pornind de la x = 0. În Fig. 4 este prezentată fereastra panou pentru un astfel de exemplu de grafic, iar în Fig. 5 fereastra diagramă asociată, care arată cum sunt conectate obiectele. Fig. 4. Fig. 5. 55 Al doilea tip de date care poate fi utilizat este un grup cu următoarele elemente: o valoare iniţială x, un pas de incrementare ∆x şi un vector cu date y. În Fig. 6 şi Fig. 7 sunt prezentate ferestrele Panel şi Diagram pentru un grafic care foloseşte date de tip cluster. Fig. 6. Fig. 7. Graficele de tip XY (XY Graph) acceptă tot două tipuri de date. Primul tip de date acceptat este grupul format din două tablouri (vectori de date): un vector x şi un vector y. În Fig. 8 şi Fig. 9 este prezentat un exemplu, în care cei doi vectori x şi y sunt creaţi cu ajutorul unei structuri de tip For care va fi descrisă ulterior (o altă posibilitate simplă de a crea doi vectori este de a implementa două controale de tip tablou). 56 Fig. 8. Fig. 9. Al doilea tip de date acceptat de un Grafic XY (pentru un singur plot) este un tablou de ”puncte”, unde un ”punct” este un grup constituit dintr-o valoare x şi o valoare y. Prin urmare, tipul de date acceptat este un tablou de grupuri. Reprezentarea echivalentă exemplului din Fig. 8 şi 9 este dată în Fig. 10 (fereastra panou va afişa acelaşi rezultat ca cel din Fig. 8). 57 Fig. 10. O altă posibilitate pentru acest tip de date (tablou de grupuri) este ilustrată în Fig. 11. Fig. 11. Ambele tipuri de grafice prezentate (Waveform Graph şi XY Graph) conţin elemente opţionale care pot fi făcute vizibile sau ascunse folosind submeniul Show al meniului aparent. Aceste opţiuni includ o legendă cu ajutorul căreia se definesc culoarea şi stilul de 58 plotare al unui grafic şi o paletă cursor folosită pentru a afişa cursoare multiple. Graficele ajustează în mod automat scalele verticală şi orizontală, opţiune ce poate fi inhibată folosind opţiunile Autoscale X şi Autoscale Y din submeniul Data Operations al meniului aparent. Autoscalarea poate conduce la o afişare a graficelor mai lentă în funcţie de computerul şi sistemul video utilizate. Chart Formele de undă de tip diagramă (chart) sunt tipuri speciale de indicatoare care afişează unul sau mai multe grafice. Chart-urile diferă de grafice prin aceea că reţin datele anterioare până la o valoare ce poate fi diferită. Noile date sunt adăugate la cele vechi permiţând observarea valorii curente în contextul celor anterioare. Diagramele au atribute similare graficelor, inclusiv legenda şi paleta şi lucrează în acelaşi fel. Opţiunea Update Mode din submeniul Data Operations al meniului aparent al unei diagrame permite modificarea modului în care diagrama se comportă când sunt adăugate noi date pe display. Există trei opţiuni posibile: tip bandă rulantă, domeniu şi baleiaj. Modul implicit este cel de tip bandă rulantă. Modul bandă rulantă are un afişaj alunecător similar cu un registrator cu sul de hârtie. La fiecare nouă valoare primită, aceasta este plotată la marginea din dreapta, iar vechile valori se deplasează la stânga. Modul domeniu are un afişaj similar unui osciloscop. La fiecare nouă valoare primită aceasta este plotată la dreapta ultimei valori şi când graficul ajunge la marginea din dreapta a suprafeţei de plotare, ecranul este şters şi plotarea începe de la marginea din stânga. Acest mod de afişare este mult mai rapid decât cel anterior deoarece este eliberat de procesele implicate de deplasarea imaginii. Modul baleiaj acţionează asemănător modului domeniu, dar ecranul nu este şters când datele ating marginea din dreapta a ecranului. O linie verticală mobilă marchează începutul noilor date şi se deplasează de-a lungul ecranului pe măsură ce sunt adăugate date noi. În Fig. 12 este prezentat un exemplu simplu (o curbă de tip sinusoidal) cu un obiect grafic de tip chart (Waveform Chart) – opţiunea bandă rulantă, în Fig. 13 este prezentat acelaşi plot dar pentru opţiunea de domeniu. Ultima opţiune – cea de baleiaj – este ilustrată pentru acelaşi exemplu în Fig. 14. 59 Un obiect de tip chart (diagramă) poate afişa mai multe grafice prin suprapunerea lor unul peste altul. Un exemplu de grafice suprapuse este prezentat în Fig. 15. Fig. 12. Fig. 13. 60 Fig. 14. Fig. 15. Se pot afişa alternativ mai multe grafice prin "stivuirea" unuia deasupra celuilalt, cu scale Y diferite pentru fiecare grafic, prin selectarea opţiunii Stack Plots din meniul aparent (Fig. 16). 61 Fig. 16. Prezentarea graficelor sub formă de stivă Un alt obiect grafic care se poate selecta din submeniul Graph al meniului Controls este diagrama de tip Intensity Chart. Acest indicator este un mod de afişare a datelor tridimensionale într-un plot bidimensional prin plasarea de blocuri colorate în planul cartezian. Aceste diagrame acceptă tablouri bidimensionale de numere. Fiecare număr din tablou reprezintă o culoare specifică, indicii unui element al tabloului setând locaţia pentru aceasta culoare. 3. Temă de laborator 3.1. Să se realizeze programul pentru calculul expresiei: S = (A+B)*C, unde A, B, C, S sunt matrice de numere reale (se va utiliza pentru înmulţire meniul Functions/Analysis/Linear Algebra). 3.2. Să se realizeze programul pentru calculul normei unui / p n 1 = ∑=, p - tipul normei. vector x de x x i p dimensiune n: p 1 i 3.3. Să se creeze un tablou de grupuri, fiecare grup având următoarele câmpuri: nume, prenume, vârstă şi ocupaţie. Să se ordoneze elementele tabloului în ordine alfabetică şi apoi în ordine crescătoare a vârstei (se poate utiliza funcţia Sort 1D Array din submeniul Array al meniului Functions) 3.4. Să se realizeze graficul funcţiei: f(x)=sin(x)/x. 3.5. Să se afişeze simultan graficele funcţiilor cos(x) şi sin(x) pe acelaşi ecran şi pe ecrane diferite. 62