Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
E. Timing a VI
• Atunci când o buclă termină execuția unei iterații, imediat începe executarea următoarei iterații, bineînțeles dacă nu este întâlnită o condiție de stop.
• Most often, you need to control the iteration frequency or timing. For example, if you are acquiring data, and you want to acquire the data once every 10 seconds, you need a way to time the loop iterations so they occur once every 10 seconds.
• This section introduces some methods for timing your loops.
Wait Functions
• Plasarea unei funcții de așteptare în interiorul unei
bucle, permite VI-ului să “doarmă” un anumit interval
de timp. Acest lucru permite procesorului să abordeze
alte sarcini. Funcțiile Wait utilizează practic ceasul
sistemului de operare.
The Wait Until Next ms Multiple Function monitors a
millisecond counter and waits until the millisecond
counter reaches a multiple of the amount you specify.
Use this function to synchronize activities. Place this
function in a loop to control the loop execution rate. For
this function to be effective, your code execution time
must be less than the time specified for this
function.The execution rate for the first iteration of the
loop is indeterminate.
The Wait (ms) Function waits until the millisecond
counter counts to an amount equal to the input you
specify. This function guarantees that the loop
execution rate is at least the amount of the input you
specify.
Elapsed Time
In some cases, it is useful to determine how much time
elapses after some point in your VI. The Elapsed Time
Express VI indicates the amount of time that elapses
after the specified start time. This Express VI keeps
track of time while the VI continues to execute. This
Express VI does not provide the processor with time to
complete other tasks.
F. Iterative Data Transfer. Regiștrii
de transfer (deplasare)
• La programarea cu bucle (While sau For), de
multe ori trebuiesc acceste datele din iterațiile
anterioare.
• De exemplu, daca achizitionam date la fiecare
iterație a unei bucle, și dorim sa calculăm
media la fiecare 5 iterații, este necesară
reținerea datelor din iterațiile anterioare.
• In acest caz se utilizează regiștrii de transfer.
• Shift registers are similar to static variables
in text-based programming languages.
• A shift register appears as a pair of
terminals directly opposite each other on the
vertical sides of the loop border.
• Registrii de transfer sunt componente ale
structurilor repetitive ce pot fi utilizate pentru
transferul unor valori intre doua sau mai
multe iteratii succesive ale structurii.
• Pentru a adauga un registru de transfer unei structuri repetitive (bucla For sau While), se selecteaza optiunea Add Shift Register din meniul propriu al structurii.
• Un registru de transfer contine doua terminale (stang si drept) dispuse pe conturul structurii.
• O valoare conectata la terminalul drept al registrului va "apare" in terminalul stang la iteratia urmatoare. Cu alte cuvinte, terminalul stang introduce in iteratia curenta valoarea ce a fost transmisa la terminalul drept in iteratia anterioara.
• La executarea primei iteratii a unei bucle, nu exista inca
nici un transfer efectuat de catre registru intre cele doua
terminale ale sale. Terminalul stang al registrului nu a
fost inca "alimentat" cu o valoare din iteratia
precedenta. Pentru a se putea efectua extragerea unei
valori din terminalul stang la prima iteratie, se
conecteaza la acest terminal o valoare din exteriorul
buclei. Se spune ca registrul de transfer se
initializeaza.
• A shift register transfers any data type and
automatically changes to the data type of the first object
wired to the shift register. The data you wire to the
terminals of each shift register must be the same type.
• Terminalul stang al unui registru de transfer poate fi dimensionat, capatand astfel mai multe componente. Intr-o astfel de situatie, valoarea transferata din iteratia anterioara se afla in componenta superioara.
• De sus in jos, fiecare componenta contine cate o valoare
provenita dintr-o iteratie mai indepartata.
• Dupa executarea ultimei iteratii a buclei, din terminalul drept al
registrului se poate extrage ultima valoare transferata acestuia.
• O structura repetitiva poate contine mai multi registri de
transfer, fiecare cu una sau mai multe componente ale
terminalului stang si fiecare transferand intre iteratii valori de
diverse tipuri.
• VI-ul din figura de mai jos folosește registrii de deplasare si o bucla For, pentru a accesa valorile din repetarile anterioare. Indicatorul X(i) afiseaza valoarea curenta, indicatorul X(i-1) afiseaza valoarea penultimei iteratii, indicatorul X(i-2) afiseaza o valoare cu doua iteratii in urma, si asa mai departe.
Initialized Shift Registers
Run Once VI stops execution Run Again
Output = 5 Output = 5
Uninitialized Shift Registers
Run Once VI stops execution Run Again
Output = 8 Output = 4
G. AFIȘAREA DATELOR
• Mediul de programare LabVIEW dispune, în
meniul Graph al paletei de controale, de o
serie de elemente pentru reprezentari grafice.
• Cele mai utilizate sunt cele aflate pe prima
linie a meniului Graph:
Waveform Chart (numit pe scurt Chart);
Waveform Graph (numit pe scurtGraph) și
XY Graph.
Figure 2.16. Paleta Controls și subpaleta Graph
Elementul Waveform Chart
• Unui element de tip Chart i se pot trimite în mod succesiv, punct cu punct, valorile ordonatelor punctelor pe care sa le traseze grafic.
• Acesta afișază și reține datele care au fost achiziționate și de asemenea adaugă noile date achiziționate.
• Un element de tip Chart considera valorile succesive pe care le primeste drept ordonate ale punctelor de pe grafic. Abscisele punctelor sunt considerate automat crescatoare din unitate în unitate (0 pentru prima valoare primita, 1 pentru a doua s.a.m.d.).
• Bucla While executa câte o iteratie la fiecare trei secunde (datorita functiei Wait (ms)). La fiecare iteratie, functia Random Number (0-1) trimite câte o valoare aleatoare la elementul Chart.
• Atunci când primeste o noua valoare, un element Chart traseaza un segment de dreapta din punctul cel mai recent (ultimul de pe grafic) pâna în punctul determinat de noua valoare primita.
• Un element Chart accepta nu numai valori
trimise punct cu punct (scalare) ci si siruri de
valori (Array).
• Atunci când primeste un sir de valori
(considerate de asemenea tot ordonate ale
punctelor), un element Chart adauga la
sfârsitul graficului deja existent, nu un singur
punct ci un numar de puncte egal cu
numarul de valori din sirul primit.
• În figura de mai jos, la fiecare iteratie a buclei While (la
fiecare trei secunde), bucla For genereaza un sir
(Array) de sapte valori aleatoare, sir ce este trimis
elementului Chart.
• La fiecare trei secunde, la graficul din elementul
Chart sunt adaugate astfel înca sapte puncte.
• Waveform charts can display multiple plots together using the Bundle function located on the Cluster, Class & Variant palette. In Figure 2.19, the Bundle function bundles the outputs of the three VIs to plot on the waveform chart.
Figure 2.19. Wiring
Multiple Plots to a
Waveform Chart
• Dacă un element Chart primeşte o matrice de
valori numerice (Array cu două dimensiuni),
atunci el va trasa simultan un număr de
grafice, egal cu numărul de linii ale matricei.
Indicatorul Waveform Graph
• Un element de tip Graph nu acceptă valori
individuale (scalare) ci numai şiruri (Array) de
valori. Spre deosebire de elementele Chart,
atunci când primeşte un şir de valori,
elementul Graph şterge graficul pe care îl
afişase anterior şi afişează doar graficul
format din noile puncte primite.
• Pentru a vedea diferența dintre un Chart și un Graph, se va implementa VI-ul a cărei Diagramă Bloc este prezentată mai jos.
• Graficul se va schimba şi în elementul Graph la
fiecare trei secunde dar, spre deosebire de cel
afişat de Waveform Chart, la afişarea unui şir
nou valorile afişate anterior se vor pierde.
• Un element de tip Graph consideră, de
asemenea, valorile succesive pe care le
primeşte drept ordonate ale punctelor de pe
grafic, iar abscisele punctelor sunt considerate
automat crescătoare din unitate în unitate (0
pentru prima valoare primită, 1 pentru a doua
ş.a.m.d.).
• Elementele de tip Graph permit însă,
suplimentar, definirea abscisei primului punct şi
a distanţei pe orizontală dintre două puncte
succesive. În această situaţie, valorile x0 şi Δx
se introduc (printr-o funcţie Bundle) într-un
Cluster împreună cu şirul de valori ce
reprezintă ordonatele punctelor, iar la terminalul
elementului Graph se conectează ieşirea
funcţiei Bundle.
Figure 2.17. Definirea valorilor x0 şi Δx
• Dacă un element Graph primeşte o matrice de valori numerice (Array cu două dimensiuni), atunci el va trasa simultan un număr de grafice egal cu numărul de linii ale matricei.
Figure 2.23. Multiple-Plot Waveform Graphs
• În situaţia în care se trasează mai multe grafice şi se
doreşte definirea abscisei x0 a primului punct şi a
distanţei Δx pe orizontală dintre două puncte succesive,
mărimile respective vor fi aceleaşi pentru toate graficele.
În funcţia Bundle, la cea de a treia intrare se
conectează matricea de valori.
Indicatorul XY Graph
• Indicatorul de tip XY Graph acceptă la
intrare un Cluster format din două şiruri
(Array) de valori. Primul şir reprezintă
abscisele, iar cel de-al doilea ordonatele
punctelor de pe grafic. Evident, cele două
şiruri trebuie să conţină acelaşi număr de
valori. Atunci când se primeşte o astfel de
structură de date, graficul anterior este
şters.
Figure 2.24. The XY Graph Indicator
• În figura de mai jos este arătat un program
pentru trasarea graficului funcţiei sinus între 0
şi 2π prin 101 puncte.
Fig.2.25. Diagrama bloc pentru generarea graficului
funcţiei sinus
• Stabilind că punctele vor fi la distanţe egale pe
orizontală, se determină întâi distanţa Δx pe
abscisă dintre două puncte succesive,
împărţind la 100 intervalul de trasare, de
lungime 2π.
• Într-o buclă For cu numărul de iteraţii egal cu
numărul de puncte, se determină la fiecare
iteraţie abscisa unui punct cu relaţia xi= i·Δx şi
se calculează ordonata y=sin(xi). La ieşirea din
bucla For, şirurile de valori xi şi yi sunt grupate
într-un cluster (cu funcţia Bundle), iar acesta
este trimis la terminalul elementului XY Graph.
• Dacă se doreşte trasarea
simultană a mai multor grafice
se construieşte pentru fiecare
grafic câte un Cluster format
din două Array-uri (unul
pentru abscisele şi altul
pentru ordonatele punctelor).
Ieşirile funcţiilor Bundle se
conectează la o funcţie Build
Array, iar ieşirea funcţiei
Build Array se conectează la
terminalul elementului XY
Graph.
Opţiuni proprii indicatoarelor grafice
• În meniurile proprii ale indicatoarelor grafice se află
sub-meniul Visible Items, care conţine o serie de
opţiuni conform listei din figura de mai jos, prin
intermediul cărora se pot obţine facilităţi de afişare.
Fig. Opţiunile din
submeniul Visible
Items
• Selectând opţiunea Plot Legend, ca pe figura precedentă, se afişează o legendă, ca în figura alăturată, ce poate fi poziţionată independent, sau dimensionată pentru a avea un număr de poziţii egal cu numărul de grafice reprezentate. Numele graficelor (iniţial Plot 0, Plot 1 s.a.m.d.) pot fi modificate cu ajutorul uneltei de editare a textelor. Fig. Opţiunea Plot Legend
• Apăsând butonul drept al mouse-ului atunci când cursorul este poziţionat deasupra unui grafic din legendă, se deschide un meniu propriu din care pot fi configurate opţiuni de afişare ale graficului respectiv: culoare, tip şi grosime de linie.
• Opţiunea Scale Legend, din acelaşi submeniu şi redată în figura următoare, afişează o componentă ce permite configurarea modului în care sunt afişate scalele indicatorului de reprezentare grafică: eticheta scalei, formatul şi precizia de reprezentare, vizibilitatea scalei sau a etichetei acesteia, culoarea caroiajului.
• Pentru fiecare scală sunt
disponibile:
un buton (notat cu X sau Y),
la a cărui apăsare se
realizează o autoscalare pe
direcţia respectivă;
un buton (marcat cu un lacăt) care, atunci când este
apăsat, menţine continuu autoscalarea pe direcţia
corespunzătoare.
• De regulă, pentru axa X se afişează Time, având semnificaţia de axă a timpului, ceea ce este util pentru semnalele care evoluează în raport cu timpul, dar se pot asocia şi alte semnificaţii.
H. Luarea deciziilor într-un VI.
Simple Decision: Select Function
• If Temp Scale is TRUE, pass top input;
• If temp scale is FALSE, pass bottom input.
• If the decision to be made is more complex than a
Select function can execute, a Case Structure may
be what is required.
Structura Case
• Structura de selectie Case - contine multiple
subdiagrame, numai una din acestea executându-se
depinzând de valoarea de intrare transmisă structurii.
Figure 2.25. Structura de selecție Case
Selecting a Case
• Figure 2.26 shows a VI that uses a Case structure to execute different code dependent on whether a user selects °C or °F for temperature units. The top block diagram shows the True case in the foreground. In the middle block diagram, the False case is selected. To select a case, enter the value in the case selector identifier or use the Labeling tool to edit the values. After you select another case, that case displays on the block diagram, as shown in the bottom block diagram of Figure 2.26.
Figure 2.26. Changing the Case View of a Case Structure
Boolean Case Structure
• Figure 2.27 shows a Boolean Case structure.
Figure 2.27. Boolean Case Structure
• If the Boolean control wired to the selector terminal is True, the VI adds the numeric values. Otherwise, the VI subtracts the numeric values.
Integer Case Structure
• Figure 2.28 shows an integer Case structure.
Figure 2.28. Integer Case Structure
• If the Integer wired to the selector terminal is 0 (add), the VI adds the numeric values. If the value is1 (subtract), the VI subtracts the numeric values. If Integer is any other value than 0 (add) or 1 (subtract), the VI adds the numeric values, because that is the default case.
String Case Structure
• Figure 2.29 shows a string Case structure.
Figure 2.29. String Case Structure
• If String is add, the VI adds the numeric values. If String is subtract, the VI subtracts the numeric values.
Enumerated Case Structure
• Figure 2.30 shows a enumerated Case structure.
Figure 2.30. Enumerated Case Structure
• If Enum is add, the VI adds the numeric values. If Enum is subtract, theVI subtracts the numeric values.
Using Case Structures for Error Handling
• The following example shows a Case structure where an error cluster defines the cases.
Figure 2.31. No Error Case
Figure 2.32. Error Case
• When you wire an error cluster to the selector terminal of a Case structure, the case selector label displays two cases—Error and No Error—and the border of the Case structure changes color—red for Error and green for No Error. If an error occurs, the Case structure executes the Error subdiagram.
I. Structura secvențială (Sequence)
• Această structură 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.
• O structură secvențială conţine una sau mai multe subdiagrame sau cadre (frame) care se execută în ordine secvenţială.
• Există două secvenţe structurale: structură secvenţială plată (Flat Sequence Structure) şi structură secvenţială stivuită (Stacked Sequence Structure).
Structura secvenţială plată
• Structura secvenţială plată se utilizează pentru a asigura execuţia unei subdiagrame înainte sau după o altă subdiagramă. Adăugarea unei noi structuri secvenţiale se obţine prin click - dreapta pe chenarul structurii şi apelarea facilităţii dorite din meniul contextual.
• Un clik – dreapta pe bara orizontală a chenarului oferă două facilităţi: introducerea unei structuri secvenţiale în faţă (Add Frame Before) sau introducerea unei structuri după (Add Frame After).
• Un click – dreapta pe bara verticală a chenarului oferă doar una din cele două posibilităţi: pe bara stângă permite Add Frame Before iar pe bara dreaptă permite Add Frame After. Un click-dreapta pe o bară verticală a chenarului pentru o structură secvenţială intermediară oferă facilitatea Insert Frame.
• Structurile secvenţiale plate se execută de la stânga la dreapta când toate datele legate la cadru sunt disponibile. Se recomandă structura secvenţială plată pentru a evita secvenţele locale şi pentru o documentare mai bună a diagramei bloc.
• În primul cadru se realizează operaţia de multiplicare a valorii controlui introdus în panoul frontal iar rezultatul este transferat spre cadrul 2. În cadrul 2 şi 3 se execută alte două operaţii matematice care se bazează pe rezultatul anterior. Condiţionarea privind succesiunea operaţiilor şi o ordonare clară a diagramei s-a soluţionat astfel prin structura secvenţială plată.
Figure 2.33. Structură secvențială plată
Structura secvenţială stivă
• Atunci cand este dispusa in
diagrama, o structura
Sequence stivă, contine o
singura fereastra, aceasta
fiind totodata si fereastra
curenta (vizibila). Deschizand
meniul propriu al structurii si
alegand una din optiunile
Add Frame After sau Add
Frame Before, se poate
adauga o fereastra dupa sau
inaintea celei curente.
• Daca o structura Sequence stivă contine mai mult de o fereastra, atunci ferestrele primesc indici (numere de ordine) incepand cu 0, iar pe latura superioara a conturului structurii apare un selector prin intermediul caruia se poate trece de la o fereastra la alta.
• Atunci cand o structura Sequence stivă contine cel putin doua ferestre, ordinea acestora poate fi schimbata: se modifica indicele ferestrei curente, selectand optiunea Make This Frame, apoi noul indice.
• Atunci cand se doreste transferul unei valori intre doua ferestre ale unei structuri Sequence, prin selectarea optiunii Add Sequence Local se dispune pe conturul structurii o variabila locala a acesteia (sub forma unui patrat galben).
• Daca, in una din ferestrele structurii, se conecteaza o valoare la variabila locala, fereastra respectiva devine fereastra sursa pentru acea variabila. In acea fereastra, simbolul variabilei locale contine o fereastra indreptata spre exteriorul structurii. In ferestrele anterioare ferestrei sursa, simbolul variabilei locale devine hasurat, semn ca valoarea variabilei locale nu este accesibila in acele ferestre.
• In ferestrele de dupa fereastra sursa, simbolul variabilei locale va contine o sageata indreptata spre interiorul structurii. In aceste ferestre, valoarea transferata prin intermediul variabilei locale poate fi utilizata in fluxul de date. O structura Sequence poate dispune de mai multe variabile locale.
• Intr-o structura Sequence pot fi utilizate valori provenite din fluxul de date exterior. O valoare introdusa din exterior intr-o structura Sequence va putea fi utilizata in oricare dintre ferestrele structurii. Daca, intr-o anumita fereastra, se face o legatura din structura Sequence in exteriorul acesteia, la iesirea respectiva (patratul de pe contur) nu va mai putea fi legata o alta valoare din alta fereastra (ar exista o incertitudine privind valoarea care iese din structura).
• Indiferent de indicele ferestrei in care s-a facut o legatura spre exterior, valoarea va parasi iesirea de pe conturul structurii Sequence doar dupa executarea ultimei ferestre.
• În figura alăturată se prezintă o structură secvenţială stivă formată din 3 cadre (0, 1, 2) cadrul activ în figura prezentată fiind cadrul 1.
• În fiecare cadru se pot introduce nodurile existente sau edita altele noi. Diagrama care trebuie execută prima se introduce în cadrul “0”, diagrama care trebuie executată a doua în cadrul “1” s.a.m.d.
• O exemplificare a utilizării structurii secvenţiale stivă este prezentată în figura de mai jos
a) b)
c)
• Exemplu de structură secvenţială stivă:
a – cadru 0; b – cadru 1; c – cadru 2
• In primul cadru se realizează conform
schemei logice impuse o operaţie de
multiplicare iar rezultatul este vizualizat prin
indicatorul Numeric 2 şi utilizat atât în
cadrul 2 cât şi în cadrul 3. Acest lucru este
posibil prin crearea secvenţei locale
apelând din meniul contextual pentru click
dreapta pe conturul vertical al cadrului.
• Secvenţa locală devine activă după
conectarea unui fir la aceasta. Starea
activă este semnalizată prin apariţia unei
săgeţi în interiorul semnului alocat
secvenţei. Pe acelaşi principiu rezultatul
operaţiei matematice din cadrul 2 este
posibil să fie utilizat în cadrul 3 (dar nu şi în
cadrul 1, fluxul datelor fiind doar spre
cadrele de ordin superior).
J. Nodul Formulă (Formula Node)
• Nodul Formulă facilitează scrierea în interiorul său, a formulelor matematice de calcul. Se recomandă utilizarea Nodului Formulă pentru implementarea formulelor complexe.
• Avantajele Nodului Formulă sunt următoarele:
se uşurează scrierea, depanarea şi înțelegerea formulelor matematice;
se elimină erorile care pot să apară la transcrierea formulelor matematice complexe în limbajul G, care foloseşte noduri şi fire;
se reduce suprafața ocupată în diagrama bloc de formule matematice, implementate prin noduri şi fire.
• Nodul Formulă este disponibil în caseta cu funcții şi VI-uri, în grupul „Structuri” (Structures).
• Instrucțiunile de prelucrare din interiorul nodului se scriu într-o sintaxa asemănătoare limbajelor de programare, bazate pe text.
• Nodul Formulă defineşte operațiile prin una sau mai multe instrucțiuni de atribuire, fiecare terminându-se prin caracterul punct şi virgulă (;). Se precizează că o instrucțiune se poate întinde pe mai multe linii text; numărul maxim de caractere, care încap pe o linie, este dat de dimensiunea tipului de caractere folosit şi de dimensiunea orizontală a Nodul Formulă.