Sunteți pe pagina 1din 12

Lucrarea 7

Structuri înLabVIEW

1 Scopul lucrǎrii
Scopul lucrării este de a înŃelege structurile din LabVIEW şi de a învăŃa
folosirea lor.

2 ConsideraŃii teoretice
Structurile sunt reprezentări grafice similare instrucŃiunilor de ciclare şi
condiŃionare din limbajele bazate pe text. Structurile se utilizează pe DB pentru a
repeta anumite porŃiuni de cod şi a se executa coduri într-o anumită ordine. Ca
orice alt nod, structurile au terminale prin care acestea se interconectează cu alte
noduri din DB, sunt executate automat când datele sunt disponibile la intrări şi
furnizează la ieşire rezultatul când execuŃia structurii este completă.
Orice structură are un cadru propriu, redimensionabil, ce cuprinde partea
din DB ce se execută în concordanŃă cu regulile structurii. SecŃiunea din DB
cuprinsă în interiorul cadrului (conturului) unei structuri este denumită
subdiagramă. Terminalele prin care se introduc sau se extrag date se numesc tunele.
Structurile pot fi accesate din paleta Functions, submeniul Structures.
Există 5 tipuri de structuri de bază:
1. Bucla FOR
2. Bucla WHILE
3. CASE
4. SecvenŃă
5. Nod de formule
2.1 Bucla FOR
Bucla FOR , prezentată în Figura 1 se utilizează pentru controlul
operaŃiilor repetitive. Ea execută o subdiagramă de un număr de ori. Este
echivalentă cu:
InstrumentaŃie virtuală Lucrarea 7

For i = 0 to N-1
Se executa diagrama din bucla

Figura 1 Bucla FOR

Codurile se execută un anumit număr de ori, cât este valoarea numărului


legat la terminalul N (terminal de intrare). Se poate seta explicit prin legarea unei
valori din afara buclei la terminalul de numărare sau implicit prin autoindexare.
Dacă intrarea în FOR este un vector, terminalul N poate să rămână nelegat. In
acest caz bucla se execută de atâtea ori câte elemente are vectorul (v.
Autoindexarea).
Terminalul de iteraŃie i (terminal de ieşire) reprezintă indexul buclei şi
indică numărul iteraŃiei (ciclării) la care s-a ajuns. Prima iteraŃie este întotdeauna 0.
Atât N cât şi i sunt numere întregi cu semn, pe 32 biŃi, deci bucla se
31
poate executa de maximum 2 -1 ori. Dacă la N se leagă un număr real,
31
LabVIEW îl trunchiază la tip întreg cu semn şi eventual îl limitează la 2 -1.
Dacă la N se leagă 0 sau un număr negativ, bucla nu ciclează.
Se adaugă registre de deplasare la bucla FOR pentru a se trece datele de
la iteraŃia curentă la următoarea iteraŃie.
Exemplul 1 :
Să se genereze numere aleatoare în intervalul 0-1, de 10 ori.
Se foloseşte bucla FOR în care se plasează Random Number (Functions
» Programming » Numeric » Random Number (0–1)).
Se leagă terminalul de ieşire la marginea buclei For pentru a crea un tunel
de ieşiere. Tunelul apare ca o cutie în care este un simbol array în onterior.
Pentru bucla For auto-indexarea este activată implicit, în timp ce pentru bucla
While este dezactivatăimplicit.
Se crează un indicator array la acest tunnel în afara buclei. Firul de
legătură apare mai gros datorită datorită tipului array al datelor. Va apărea şi un
indicator de tip array pe PF, ce poate fi redimensionat după dorinŃă.
Numărul de iteraŃii este setat pe 10.
Se crează un al doilea tunel de ieşire prin legarea ieşirii Random
Number la conturul buclei şi se dezactivează auo-indexarea prin alegerea
Disable indexing din meniu. Tunelul devine un dreptunghi umplut ce
reprezintă un scalar. Se crează un indicator pe tunel (Create»Indicator) . Se
realizează un indicator de tip scalar în afara buclei.
2
InstrumentaŃie virtuală Lucrarea 7

Se crează un al treilea indicator la terminalul funcŃiei Random Number,


plasat însă în interiorul buclei For, pentru a se urmări valorile ce ies din acest
bloc.
Se va plasa un Time Delay (Functions » Programming » Timing »
Time Delay) pentru a se obŃine o întârziere a execuŃiei (0,1 s) ca să fie suficient
timp pentru observarea valorii curente ce se generează (Figura 2).

Figura 2 DB pentru Exemplul 1

Se salvează IV şi se execută.
Pe indicatorul din interiorul buclei se va afişa, la fiecare 0,1 s, un număr
aleatoriu cuprins între 0 şi 1. pe indicatoarele din afara buclei nu va fi disponibilă
nici o data pâna ce programul nu este compet (până când nu sunt executate toate
iteraŃiile). Pe indicatorul conectat la tunelul ce permite indexarea, se vor genera 10
valori, iar pe cel conectat la tunelul la care s-a dezactivat indexarea, numai ultimul
element al sirului (Figura 3).

Figura 3 PF după rulare pentru Exemplul 1

3
InstrumentaŃie virtuală Lucrarea 7

2.2 Bucla WHILE


Bucla WHILE (Figura 4) execută o subdiagramă până la îndeplinirea unei
anumite condiŃii (terminalul de condiŃionare primeşte o anumită valoare
booleană).

Figura 4 Bucla WHILE

Valoarea de condiŃionare se stabileşte din meniul pop-up al buclei –


Continue if True, care este şi valoarea implicită. Dacă valoarea terminalului de

condiŃionare este Continue if True , bucla ciclează până când terminalul


primeşte valoarea FALSE. Dacă se doreşte ciclarea pe FALSE, se validează

opŃiunea Stop if True .


Verificarea terminalului de condiŃionare de către program se face după
execuŃia buclei. De aceea, oricare ar fi valoarea booleană legată la acest terminal,
bucla se execută cel puŃin o dată. Dacă terminalul nu este legat, bucla nu se
execută niciodată.
Este recomandabil ca toate IV ce se construiesc să fie încadrate în
întregime într-o buclă WHILE care trebuie să fie prevăzută la terminalul de
condiŃionare cu un buton de STOP. Este sigur astfel că toate sarcinile începute în
cadrul buclei sunt duse la sfârşit. Oprirea instrumentului trebuie să se facă
obligatoriu de la acest buton. Dacă oprirea instrumentului se face de la butonul
de stop de urgenŃă (Abort Execution) din bară, pot exista sarcini neterminate, cum
ar fi: deschiderea şi neînchiderea unor fişiere, a unor legături cu reŃeaua (serverul),
alocarea unor resurse hardware fără a mai fi dezalocate, etc.
CondiŃia de execuŃie a buclei trebuie legată în interiorul acesteia, pentru a
putea fi citită la fiecare rulare. Dacă se plasează terminalul unui control Boolean
în afara buclei WHILE, Figura 5, şi controlul este setat pe FALSE dacă
terminalul de condiŃionare este Stop if True când bucla începe ciclarea, se obŃine
o ciclare infinită. Oprirea buclei se face din butonul Abort Execution de pe bară
Terminalul de iteraŃie i (terminal de ieşire) reprezintă indexul buclei şi
indică numărul iteraŃiei (ciclării) la care s-a ajuns. Prima iteraŃie este întotdeauna 0.
Pentru a se trece datele de la iteraŃia curentă la următoarea iteraŃie, la
bucla WHILE se adaugă registre de deplasare.

4
InstrumentaŃie virtuală Lucrarea 7

Figura 5 Ciclare infinită

Exemplul 2
Să se genereze, cu o anumită temporizare, şi să se afişeze un număr
aleator cuprins între 0 şi 1, oprirea executării programului făcându-se de la un
buton de Stop de pe PF.
Panoul frontal al aplicaŃiei este cel din Figura 6, iar diagrama bloc cea din
Figura 7

Figura 6 PF pentru Exemplul 2

Figura 7 DB pentru Exemplul 2

5
InstrumentaŃie virtuală Lucrarea 7

2.3 Autoindexarea
Autoindexarea (Disable Indexing) este o noŃiune specifică buclelor
FOR şi WHILE.
Dacă la intrarea unei bucle se aplică o matrice şi din pop-up-ul tunelului
de intrare se validează opŃiunea Enable Indexing, atunci la fiecare iteraŃie bucla
ia în calcul, în ordine, câte un element din matricea respectivă. De ex., dacă la
intrare avem un vector, la prima iteraŃie se ia elementul 0, la a doua iteraŃie se ia
elementul 1, ş.a.m.d. Dacă la intrare se află o matrice bidimensională, atunci la
prima iteraŃie se ia linia 0, la a doua iteraŃie linia 1, ş.a.m.d. Dacă, din contra, se
validează opŃiunea Disable Indexing, atunci la fiecare iteraŃie se ia în calcul toată
matricea.
La tunelele de ieşire, problema se pune în mod invers. Dacă opŃiunea
Enable Indexing este validată, ieşirea din buclă va fi o matrice (vector) ale cărei
elemente sunt generate în urma fiecărei iteraŃii. Dacă se validează Disable
Indexing, ieşirea din buclă va fi un scalar şi anume valoarea obŃinută în urma
ultimei iteraŃii.
Dacă la intrarea unei bucle FOR se aplică doi vectori de lungimi diferite
şi nu se leagă terminalul de numărare (şi este validată autoindexarea), bucla va
cicla de atâtea ori câte elemente are cel mai mic vector. In condiŃiile de mai sus,
dacă terminalul de numărare este legat, bucla ciclează de atâtea ori cât este
valoarea cea mai mică dintre lungimile vectorilor de la intrare şi terminalul de
numărare.
In cazul buclei WHILE, autoindexarea vectorului de intrare se realizează
şi după terminarea elementelor acestuia, bucla oprindu-se doar atunci când nu
mai este îndeplinită condiŃia de ciclare. După terminarea elementelor vectorului,
mai departe, până la oprirea buclei, se ia în calcul valoarea implicită a ultimului
element.
2.4 Registre de deplasare
Registrele de deplasare (RD) sunt perechi de terminale ce se utilizează în
buclele FOR şi WHILE pentru transferarea valorilor calculate de la o iteraŃie la
alta. Crearea unui RD se face din pop-up-ul buclei FOR sau WHILE selectându-
se Add Shift Register. Registrele de deplasare apar sub forma unei perechi de
terminale, opuse unuia altuia pe părŃile verticale ale conturului buclei.
Un registru de deplasare transferă orice tip de date şi automat. Datele
legate la terminalele fiecărui registru de deplasare trebuie să fie de acelaşi tip.
La terminalul din dreapta, RD stochează valoarea corespunzătoare
iteraŃiei actuale, iar la terminalul din stânga este accesibilă valoarea
corespunzătoare iteraŃiei imediat anterioare.
RD se poate redimensiona în partea stângă pentru obŃinerea şi a valorilor
altor iteraŃii anterioare (Figura 8). Redimensionarea se face cu pop-up pe RD –
Add Element, sau analog cu redimensionarea matricilor.

6
InstrumentaŃie virtuală Lucrarea 7

Figura 8 Redimensionarea RD pentru a obŃine valori ale altor iteraŃii

Se pot adăuga mai multe registre de deplasare la o buclă. Dacă sunt


operaŃii multiple care utilizează valorile iteraŃiilor anterioare din interiorul buclei,
se utilizeară registre de deplasare multiple pentru a memora datele de la acele
procese diferite din structură (Figura 9).

Figura 9 Buclă FOR cu două register de deplasare

Prin iniŃializarea unui registru de deplasare se resetează valoarea pe care


registrul o transferă la prima iteraŃie a buclei atunci când IV fucŃionează. Se
iniŃializează prin conectarea unui control sau a unei constante la terminalul din
stânga al registrului, ca în figura Figura 10.

Figura 10 IniŃializarea unui registru de deplasare

În Figura 10 bucla se execută de 5 ori, incrementându-se cu 1 valoarea


transportată de registru. După 5 iteraŃii ale buclei FOR, registrul de deplasare
trece valoarea finală 5 la indicator şi rularea IV este terminată. De fiecare dată
7
InstrumentaŃie virtuală Lucrarea 7

când se rulează IV, registrul este iniŃializat cu valoarea 0. Dacă nu se iniŃializează


registrul, bucla utilizează valoarea scrisă în registru atunci când s-a executat
ultima oară bucla sau valoarea implicită a tipului de dată dacă bucla nu a fost
rulată niciodată.
2.5 Structura CASE
Această structură are două sau mai multe subdiagrame. La un moment
dat este vizibilă numai o subdiagramă şi structura execută numai o subdiagramă.
Valoarea de intrare determină ce subdiagramă se execută. Structura CASE este
similară cu if..then.. else din limbajul de programare bazat pe text.
.

Figura 11 Structura CASE

Selectorul de cazuri este un terminal de a cărui valoare depinde


care caz se execută. La acest terminal se pot lega date de tip boolean, numeric de
tip întreg, şiruri de caractere.

Identificatorul de cazuri este o etichetă specifică fiecărui


caz în parte, ce trebuie să aibă corespondent strict între valorile selectorului de
cazuri. De ex., dacă la SC se leagă un boolean, etichetele IC vor fi True şi False.
Dacă la SC se leagă un numeric, etichetele IC vor fi chiar numerele de la SC.
Dacă la SC se leagă şiruri de caractere, eticheta cazului va fi chiar şirul de
caractere care-l comandă, scris între ghilimele.
Dacă la selectorul de cazuri se leagă mai multe valori decât numărul de
cazuri din structură, este necesară stabilirea unui caz implicit (default). De ex.
dacă la identificatorul de cazuri avem cazurile 1, 2 şi 3 unde 1 este default şi de la
selectorul de cazuri se aplică 4, atunci structura execută cazul implicit, 1.
Tunelurile de intrare sunt terminale de intrare în CASE. Pot exista
tuneluri de intrare utilizate de unele cazuri şi de altele nu.
Tunelurile de ieşire trebuie să primească date de la toate cadrele CASE
din structură. Dacă există cel puŃin un cadru care nu furnizează date tunelului,
acesta este reprezentat printr-un dreptunghi alb şi programul dă eroare de sintaxă.
In momentul în care toate tunelurile primesc date de la toate cadrele, acesta
capătă culoarea tipului de date pe care le transportă.
Se pot adăuga sau şterge cazuri din meniul pop-up al structurii.

8
InstrumentaŃie virtuală Lucrarea 7

Exemplul 3
Să se realizeze un IV care să efectueze rădăcina pătrată a unui numar,
utilizându-se structura CASE.
Se verifică dacă numărul este pozitiv. Dacă da, atunci se calculează
rădăcina pătrată, dacă nu se afişează un mesaj „Error...Negative number”.
Diagrama bloc este cea din Figura 12

Figura 12 DB a IV din Exemplul 3

2.6 Structura SEQUENCE


Structura Sequence se foloseşte atunci când se doreşte execuŃia
programului într-o anumită ordine preferenŃială, alta decât fluxul de date oferit de
LabVIEW. Altfel spus, se utilizează această structură pentru controlul ordinii
execuŃiei atunci când dependenŃa naturală a datelor nu există şi deplasarea printre
parametri nu este posibilă. Structura Sequence nu este utilizată în mod ferecvent
în LabVIEW.
Sunt disponibile două tipuri de structuri de tip Sequence: structura plată
(Flat Sequence) şi structura suprapusă (Stacked Sequence).
Structura plată, prezentată în Figura 13, afişează toate cadrele deodată şi
le execută de la stânga la dreapta atunci cand toate datele legate la un cadru sunt
disponibile, până ce ultimul cadru se execută.

Figura 13 Structura Flat Sequence

Structura suprapusă se prezintă sub forma unor cadre suprapuse, ce se


execută în ordinea 0, 1, 2,... (Figura 14).

9
InstrumentaŃie virtuală Lucrarea 7

Figura 14 Structura Stacked Sequence

Adăugarea sau ştergerea de cadre se face din meniul pop-up al structurii


cu Add Frame After (Before) sau Delete this Frame.
Trecerea datelor de la o secvenŃă la alta se face prin tunelurile de
comunicare, care se obŃin din meniul pop-up – Add Sequence Local. Săgeata
tunelului specifică direcŃia datelor.
Nici o dată dintr-o structură Sequence nu este accesibilă decât după ce
structura a fost complet executată.
Tunelurile de ieşire dintr-o structură Sequence pot avea doar o singură
sursă de date, spre deosebire de structura CASE, unde fiecare caz trebuia să
trimită date tunelului. Ieşiri pot fi create din orice secvenŃă, dar datele sunt
accesibile la acea ieşire numai după terminarea de executat şi a ultimei secvenŃe
din structură.
2.7 Nodul formulă de calcul
Ultima opŃiune din caseta de funcŃii corespunzătoare controlului
programului este caseta pentru formule de calcul.
Avantajele utilizării formulelor de calcul sunt următoarele:
• Se uşurează scrierea, depanarea şi înŃelegerea formulelor matematice;
• Se elimină erorile, care pot apărea la transcrierea formulelor matematice
complexe în limbajul grafic (se folosesc noduri şi fire);
•Se reduce suprafaŃa ocupată în diagrama bloc faŃă de cazul
implementării prin noduri şi fire
Editarea instrucŃiunilor de atribuire se realizează cu uneltele de etichetare
sau de operare. Finalizarea operaŃiilor este determinată de selectarea din bara cu
“unelte” a opŃiuni <Enter> sau prin acŃionarea butonuluidin tastatură. Trecerea
de la un rând la următorul se realizează în acelaşi mod, prin tasta <Enter>.
Variabilele de intrare se adugă pe conturul grafic al nodului prin meniul
contextual asociat chenarului: Add Input/Add Output. In general variabilele de
intrare se poziŃionează în stânga iar cele de ieşire în dreapta.
Operatorii utilizaŃi în operaŃiile de editare a formulelor de calcul sunt
prezentaŃi în Tabel 1.

10
InstrumentaŃie virtuală Lucrarea 7

Tabel 1

Se va studia exemplul din Help LabVIEW pentru Formula Node (Figura


15 DB pentru exemplul din Help pentru Formula Node).

Figura 15 DB pentru exemplul din Help pentru Formula Node

2.8 Nodul MathScript


Execută LabVIEW MathScripts. Sintaxa LabVIEW MathScripts este
similară sintaxei Matlab. Se vor citi informaŃiile din Help.
În Figura 16 este prezentat exemplul dat în Help.

2.9 Figura 16 DB pentru Nod MathScript (din Help)

11
InstrumentaŃie virtuală Lucrarea 7

3 Desfăşurarea lucrării
1. Să se utilizeze bucla FOR şi registre de deplasare pentru a calcula
maximul dintr-un şir de numere aleatoare.
2. Să se construiască un IV care să afişeze două semnale aleatoare pe un
afişor: un semnal aleator cuprins între 0 şi 1 şi altul cu media ultimelor
4 puncte ale semnalului aleator. Oprirea instrumentului se va face de pe
PF.
3. Să se analizeze exemplul pentru lucrul cu subIV şi structuri, din Digital
Signal Processing System Design: LabVIEW-Based Hybrid Programming,
Nasser Kehtarnavaz, pag. 29-32.

12

S-ar putea să vă placă și