III. Tablouri (Arrays) și Clustere Sometimes it is beneficial to group data related to one another. Use arrays and clusters to group related data in LabVIEW. Arrays combine data of the same data type into one data structure, and clusters combine data of multiple data types into one data structure. This lesson explains arrays and clusters, and applications where using these can be beneficial.
Topics A. Arrays B. Clusters
A. Arrays Spre deosebire de elementele scalare, care reprezentau o singura valoare, de un anumit tip (numeric, boolean, alfanumeric), elementele vectoriale (Array) pot contine, într-o manieră ordonată, mai multe valori de acelasi tip. Un tablou este o colecţie de elemente ale datelor care sunt toate de acelaşi tip. Un tablou are una sau mai multe dimensiuni şi poate avea până la 2 31 1 de elemente pe dimensiune, sau cât permite memoria.
Tablourile, în LabVIEW, pot fi de orice tip: numerice, Booleane, tip cale, stringuri, unde, și tip clustere (exceptând şiruri, tabele sau grafice). Se poate accesa fiecare element al tabloului prin index-ul său. Index-ul este în gama (0, N-1) unde N este numărul elementelor din tablou. Tabloul unidimensional (1D) arătat mai jos ilustrează această structură. De notat că primul element are index-ul 0, al doilea element are index-ul 1, etc..
Figure 3.1 shows an example of an array of numerics. The first element shown in the array (3.00) is at index 1, and the second element (1.00) is at index 2. The element at index 0 is not shown in this image, because element 1 is selected in the index display. The element selected in the index display always refers to the element shown in the upper left corner of the element display. Figure 3.1. Array Control of Numerics
Crearea Array-urilor de Controale și Indicatoare Se va selecta Array din subpaleta Controls >> All Controls >> Array and Cluster Atunci cand un element de tipul Array se dispune pe panou, tipul datelor pe care acesta le va contine nu este inca definit. Se spune ca elementul de tip Array este vid. Terminalul din diagrama bloc al elementului este de culoare neagra. Sageata Run este sparta, semn ca programul este incomplet si nu poate fi rulat. Pentru a defini tipul de date, in elementul de tip Array trebuie introdus un element de control sau indicator scalar de tipul dorit (numeric, boolean, alfanumeric, e.t.c.). Elementul scalar ce urmeaza a fi introdus in Array poate exista deja pe panou sau poate fi selectat la momentul respectiv din paleta de elemente.
Modul de plasare a unui obiect de date (în cazul acesta Control Numeric), într-un tablou: EXERCITIU Să se dispună pe panoul unei aplicatii: - un Array cu valori numerice; - un Array cu valori booleene; - un Array cu valori alfanumerice. Transformati cele trei Arrayuri din elemente de control in elemente indicatoare.
Two-Dimensional Arrays The previous examples use 1D arrays. A 2D array stores elements in a grid. It requires a column index and a row index to locate an element, both of which are zero-based. Figure 3.2 shows an 8 column by 8 row 2D array, which contains 8 8 = 64 elements. Figure 3.2. 2D Array
To add a multidimensional array to the front panel, right-click the index display and select Add Dimension from the shortcut menu. You also can resize the index display until you have as many dimensions as you want. Initializing Arrays You can initialize an array or leave it unitialized. When an array is initialized, you defined the number of elements in each dimension and the contents of each element. An uninitialized array contains a fixed number of dimensions but no elements. Figure 3.3 shows an uninitialized 2D array control. Notice that the elements are all dimmed. This indicates that the array is uninitialized. Figure 3.3. 2D Uninitialized Array
In Figure 3.4, six elements are initialized. In a 2D array, after you initialize an element in a row, the remaining elements in that row are initialized and populated with the default value for the data type. For example, in Figure 3.5, if you enter 4 in to the element in the first column, third row, the elements in the second and third column in the third row are automatically populated with a 0. Figure 3.4. An Initialized 2D Array with Six Elements Figure 3.5. An Array That Has Been Autopopulated with Zeroes
In mod implicit, atunci cand este creat, un Array are o singura dimensiune, putand fi descris drept o matrice coloana. Terminalul unui element Array se caracterizeaza prin prezenta unor paranteze drepte a caror grosime este proportionala cu numarul de dimensiuni. Atunci cand se realizeaza legaturi in diagrama, conexiunile pe care circula un Array cu o dimensiune sunt mai groase decat cele pe care circula valori scalare. Pentru Array-urile cu doua sau mai multe dimensiuni, conexiunile sunt reprezentate cu linie dubla. Spatiul intermediar al liniei duble este cu atat mai mare cu cat numarul de dimensiuni ale Array-ului este mai mare.
1. Select Array Constant shell from the Array subpalette Creating Array Constants 2. Place the data object in the array shell Atunci cand este necesara existenta in diagrama a unei constante Array, aceasta poate fi selectata din meniul cu functii pentru valori vectoriale (Array) al paletei de functii.
La dispunerea sa in diagrama, similar elementelor Array de pe panou, o astfel de constanta nu are definit tipul de date pe care le va contine. Definirea tipului de date se realizeaza prin introducerea in chenarul constantei Array a unei constante de tipul dorit (numeric, boolean sau alfanumeric). O constanta Array permite aceleasi operatii de definire a numarului de valori vizibile sau de modificare a numarului de dimensiuni ca si elementele Array din panou.
Crearea și utilizarea Tablourilor Auto-Indexarea buclele acumulează array-urile la marginile lor. În mod implicit, buclele For sunt auto-indexate, în timp ce buclele While, nu.
Crearea Tablourilor cu ajutorul Buclelor Buclele acumulează tablourile la marginile lor Auto Indexarea poate fi eliminată Se pot utiliza două Bucle For, una în interiorul celeilalte, pentru crearea unui Array 2D. Bucla For exterioară crează elementele rânduri, iar Bucla For interioară crează elementele coloană.
Auto-Index Input An array input can be used to set the For Loop count terminal. Number of elements in the array equals the count terminal input. Run arrow not broken
Funcții Array Pentru a obtine in mod dinamic (programatic), structuri de valori de tipul Array, pot fi utilizate o serie de functii specifice.
Common Array Functions Array Size Functia Dimensiune Tablou (Array Size), returneaza numarul de elemente ale fiecarei dimensiuni ale tabloului de intrare. Initialize Array Functia Initializeaza tablou (Initialize Array), realizeaza initializarea elementelor unui tablou cu N dimensiuni cu o valoare indicata.
Array Subset Functia Subtablou (Array Subset), returneaza un numar specificat din elementele unui tablou, începand de la un indice.
The Build Array Function Appending an element Concatenate Inputs Building a higher dimension array
The Index Array Function Extracting an Element Extracting a Row Extracting an Element of a Row
Modurile în care un Array se poate comporta la intrarea sau la iesirea dintr-o structura repetitiva sunt valabile si in cazul buclelor While, cu deosebirea ca, in cazul acestora, comportamentul implicit este inversat: -in mod implicit, o bucla While va prelua la fiecare iteratie intreg Array-ul de intrare. Doar in cazul in care componentei de pe contur i se selecteaza, din meniul propriu, optiunea Enable Indexing, bucla While va prelua cate o valoare la fiecare iteratie. -in mod implicit, daca o valoare din interiorul unei bucle While se conecteaza la conturul acesteia, componenta de pe contur va genera, dupa incheierea executiei buclei, doar valoarea primita in ultima iteratie. Doar daca se selecteaza optiunea Enable Indexing a componentei de pe contur, aceasta va genera, dupa incheierea ultimei iteratii, un Array cuprinzand valorile primite in cadrul tuturor iteratiilor.
Functiile aritmetice si logice pentru valori scalare, precum si cele pentru valori alfanumerice, permit conectarea de Array-uri continand valori de tipurile corespunzatoare. Se pot astfel realiza: - operatii aritmetice asupra valorilor dintr-un Array (radăcina pătrată, functii trigonometrice etc.), între un Array și o valoare scalara sau intre doua Array-uri; - operatii logice intre un Array si o valoare booleana sau intre doua Array-uri cu valori booleene; -operatii asupra Array-urilor de valori alfanumerice.
Functiile Add Array Elements si Multiply Array Elements determina suma, respectiv produsul valorilor numerice dintr-un Array. Functiile And Array Elements si Or Array Elements efectueaza operatiile logice SI, respectiv SAU, asupra tuturor valorilor booleene dintr-un Array, obtinand o valoare booleana scalara. Atunci cand au drept operanzi un Array si o valoare scalara sau doua Array-uri, functiile de comparatie genereaza un Array de valori booleene, compararea fiind efectuata valoare cu valoare.
Daca, din meniul propriu al functiei de comparatie, se alege optiunea Compare Aggregates, functia va genera o valoare booleana scalara. De exemplu, daca se compara doua Array-uri de valori numerice cu functia Equal? in starea Compare Aggregates, functia va genera valoarea True doar daca este indeplinita conditia de egalitate intre toate perechile de valori aflate pe aceleasi pozitii in cele doua Array-uri.
Functia Number To Boolean Array, aflata in meniul pentru functii booleene, transforma un numar natural intr-un Array de valori booleene, efectuand de fapt transformarea din baza 10 in baza 2. Bitul cel mai putin semnificativ este reprezentat in Array de valoarea cu indicele 0. De exemplu, valoarea 6=0+2 1 +2 2 este transformata intr-un Array cu trei valori booleene: (False, True, True). Functia Boolean Array To Number realizeaza transformarea inversa, dintr-un Array de valori booleene intr-un numar natural.
Polimorfism Poliformismul reprezintă capabilităţile funcţiilor din LabView (de ex. adunare, înmulţire, împărţire) de a accepta la intrare date cu dimensiuni şi reprezentări diferite. Funcţiile aritmetice care posedă aceste proprietăţi se numesc funcţii polimorfice. Un exemplu clasic pentru această proprietate este poliformismul funcţiei adiţionale scalar scalar, scalar matrice și matricematrice de dimensiuni diferite. Combinația Scalar+Scalar Rezultatul Scalar Array+scalar Array+Array Array Array Array+Array Array
B. Clustere Sunt structuri de date care grupează datele împreună. Datele pot fi de tipuri diferite (numerice, Booleene, stringuri, e.t.c.). Elementele trebuie să fie, fie toate controale, fie toate indicatoare. Analog cu o legătură de fire dintr-un cablu. Fiecare fir din cablu reprezintă un element al clusterului.
Deoarece un cluster are un singur fir (de intrare sau de ieșire) chiar dacă acesta transportă multiple valori de diferite date, clusterele reduc firele și numărul de terminale conector pe care un subvi le necesită. Figura de mai jos ilustrează conceptul de grupare, respectiv degrupare, a elementelor de date într-un cluster.
Cluster Controls and Indicators 1. Select a Cluster shell from the Array & Cluster subpalette 2. Place objects inside the shell 30
Creating Cluster Constants 1. Select Cluster Constant shell from the Cluster subpalette 2. Place objects in the Cluster shell
Cluster Order Elements have a logical order (start with 0) To change order, right-click the border and select Reorder Controls in Cluster... 32
Utilizarea Clusterelor pentru transferul Unul dintre avantajele clusterelor este acela că acestea pot fi utilizate pentru gruparea datelor la intrarea și respectiv ieșirea subvi-urilor. Clusterele reduc astfel numărul de fire într-o diagramă. datelor în SubVI-uri 33
Funcții Cluster Aceste funcții se găsesc în subpaleta Cluster, Class & Variant a paletei Functions>>Programming
Funcţia Bundle Grupează mai multe componente, realizând un grup, sau înlocuieşte una sau mai multe componente ale unui grup existent. Gruparea elementelor se realizează în ordinea acestora în cadrul grupului. Prima componentă conectată la funcţia Bundle este componenta cu index-ul 0, urmează componenta cu index-ul 1, s.a.m.d. Numărul de intrări poate fi modificat fie prin selectarea Add Input din meniul contextual al intrării fie utilizând unealta de poziţionare / redimensionare din caseta Tools.
O altă exemplificare a utilităţii funcţiei Bundle este prezentată în figura de mai jos. Constanta numerică (setată la valoarea 0) defineşte punctul de origine real iar prin controlul numeric se impune valoarea de incrementare. Funcţia Bundle reuneşte datele numerice permiţând reprezentarea grafică.
Funcţia Bundle poate fi utilizată și pentru înlocuirea unor componente ale unui grup (cluster) deja existent. În acest caz, grupul trebuie conectat la intrarea cluster a funcţiei. În cadrul aplicaţiei de mai jos, funcţia bundle permite înlocuirea valorii numerice corespunzatoare controlului Knob şi respectiv a controlului Numeric 2, cu valorile numerice corespunzătoare controalelor knob_input, respectiv Numeric 2_input.
Funcţia Bundle by Name Funcţia Bundle by Name este folosită doar pentru înlocuirea unei componente dintr-un grup existent. Modul de lucru este asemănător cu cel prezentat anterior. Cluster-ul existent se conectează la intrarea specificată a funcţiei (input cluster). În ordinea logică a construcţiei se introduce controlul care va înlocui o componentă. Componenta de înlocuit se va identifica după numele reprezentat prin eticheta asociată. Numărul posibilităţilor de înlocuire se pot vizualiza din meniul contextual al intrării funcţiei prin selectarea opţiunii Select Item.
Funcțiile Unbundle și Unbundle by Name Descompunerea (degruparea) grupurilor (clusterelor) în componente, se realizează cu ajutorul a două funcţii, Unbundle şi Unbundle by Name.
Error Clusters Use the error in and error out clusters in each VI you use or build to handle errors in the VI. The error clusters located on the Controls»Array & Cluster palette include the components of information shown Error cluster contains the following information: Boolean to report whether error occurred Integer to report a specific error code String to give information about the error
Error Cluster Details Status is a Boolean value that reports TRUE if an error occurred. Most VIs, functions, and structures that accept Boolean data also recognize this parameter. Code is a signed 32-bit integer that identifies the error numerically. A nonzero error code coupled with a status of FALSE signals a warning rather than a fatal error. Source is a string that identifies where the error occurred.