Podstawy programowania aplikacji w środowisku graficznym LabView Wstęp
LabView – informacje ogólne: Określenie LabVIEW jest akronimem nazwy : Laboratory Virtual Instrument Engineering Workbench. Jest to graficzne środowisko programistyczne stworzone przez National Instruments. Środowisko wykorzystuje graficzny język programowania o nazwie "G". LabVIEW prezentuje odmienne podejście do sposobu kreowania programu. Program składa się z połączonych ze sobą węzłów operacyjnych a wykonywanie programu determinuje przepływ danych pomiędzy tymi węzłami. Każdy węzeł (w postaci odpowiedniej ikony) posiada wejścia odpowiadające za wprowadzanie danych wejściowych do węzła-funkcji oraz wyjścia, którymi są wyprowadzane dane wyjściowe z funkcji. Przepływ informacji określony liniami połączeń powoduje, iż operacje i funkcje są wykonywane w odpowiedniej kolejności. Autorzy środowiska przeznaczyli je od samego początku dla inżynierów i naukowców, którzy właśnie w ten sposób rozwiązują problemy i dla nich ten sposób programowania wydaje się bardziej naturalny w przeciwieństwie do klasycznego programowania tekstowego. Program LabVIEW jest nazywany przyrządem wirtualnym ( virtual instrument ) lub krótko programem VI. Określenie to wynika z podobieństwa wizualnego obrazu aplikacji oraz jej działania do rzeczywistego urządzenia. Narzędzie konstruowania laboratoryjnego przyrządu wirtualnego. Virtual Instrument – przyrząd pozorny (nierzeczywisty).
Elementy programu VI : Pulpit (front panel), który pełni rolę interfejsu użytkownika : Ikony i złącza (icon & connector pane). Unikalna ikona identyfikuje reprezentowany przez nią program VI w innym programie VI (jako subVI - procedura w tekstowych językach programowania). Złącze (connector pane) definiuje wejścia i wyjścia podprogramu oraz ich przyporządkowanie. Odpowiada definicji argumentów procedury w językach tekstowych. Diagram (block diagram), który jest graficznym zapisem kodu programu. Definiuje funkcjonalność aplikacji w języku graficznym G.
Pulpit programu VI : Pulpit wizualnie odpowiada rozwiązaniom płyt przednich urządzeń pomiarowych. Pulpit buduje się go za pomocą elementów kontrolnych i prezentacyjnych. Stanowią one odpowiednio końcówki wejściowe i wyjściowe programu VI. Elementami kontrolnymi są pokrętła nastawcze, przyciski, przełączniki itp. Symulują one elementy nastawcze fizycznych urządzeń i dostarczają danych wejściowych do diagramu VI. Elementami prezentacyjnymi są wyświetlacze numeryczne, alfanumeryczne, LEDy, wyświetlacze graficzne (wykresy), tabele itp. Symulują one elementy prezentacyjne fizycznych urządzeń i wyświetlają dane dostarczane przez diagram.
Diagram programu VI : Diagram to zapis kodu programu w języku graficznym G. Do jego zapisu wykorzystuje się końcówki (terminals), węzły (nodes), przewody (wires) oraz konstrukcje sterujące (structures): Końcówki są portami wejściowymi i wyjściowymi przesyłającymi informacje pomiędzy pulpitem i diagramem. Końcówka jest generowana automatycznie w diagramie w momencie postawienia elementu kontrolnego lub prezentacyjnego na pulpicie. Reprezentuje ona port do określonego elementu pulpitu oraz typ danych wchodzących lub wychodzących, np. DBL -double. Węzły są obiektami wyposażonymi w wejścia i wyjścia danych realizującymi określone operacje podczas działania programu (wyrażenia, operatory, funkcje). Przewody służą do budowania połączeń (dróg przepływu danych) pomiędzy elementami diagramu. Każde połączenie może mieć tylko jedno źródło danych lecz może być rozgałęzione do wielu punktów odbioru danych. Złe połączenia są zaznaczane czarną linią przerywaną. Konstrukcje sterujące języka graficznego zapewniają specyficzny sposób wykonania fragmentów kodu. Pozwalają realizować powtarzanie bloków kodu (pętle), warunkowy wybór wykonania bloków kodu (case) lub określić sekwencję wykonania bloków kodu.
Ikona i złącze programu VI : Gdy program VI ma służyć jako podprogram dla innych aplikacji VI konieczne jest zbudowanie ikony stanowiącej jego graficzną reprezentację oraz zdefiniowanie złącza. Ikona podprogramu jest jego graficzną reprezentacją w diagramach aplikacji wykorzystujących taki podprogram. Stanowi węzeł budowanego diagramu. Złącze definiuje wejścia i wyjścia podprogramu i tym samym umożliwia wykonanie odpowiednich połączeń w diagramie programu wykorzystującego go jako podprogram. Złącze jest zestawem końcówek odpowiadających określonym elementom kontrolnym i prezentacyjnym pulpitu danego podprogramu. Zaciski wejściowe złącza przekazują dane do diagramu podprogramu za pośrednictwem elementów kontrolnych pulpitu podprogramu. Zaciski wyjściowe złącza otrzymują dane z diagramu za pośrednictwem elementów prezentacyjnych pulpitu podprogramu.
Wykonanie kodu programu : Końcówki i węzły połączone liniami przepływu danych tworzą diagram programu VI : Kolejność wykonania operacji przez węzły diagramu jest określona przepływem danych (data flow). Zasady dotyczące sterowania przepływem danych można ująć następująco: Działanie diagramu rozpoczyna się od elementów skrajnych, stanowiących źródła danych dla poszczególnych torów przepływu danych (terminale wejściowe, stałe, węzły bez wejść). Węzeł rozpoczyna działanie po otrzymaniu wszystkich danych wejściowych. Węzeł diagramu wykonuje tylko raz swoje operacje. Dane na wyjściach węzła (węzeł może mieć kilka wyjść) pojawiają się jednocześnie po wykonaniu charakterystycznych dla niego operacji. Uzyskane dane wyjściowe są jednocześnie dostarczone do węzłów odbierających. Węzły, które otrzymają w danej chwili wszystkie dane są wykonywane pseudo-jednocześnie.
Ilustracja przepływu danych : Faza 1. Faza 2. Faza 3.
Program z niezależnymi poddiagramami : Węzły, które otrzymają w danej chwili wszystkie dane są wykonywane pseudo-jednocześnie. Nie można jednak zakładać kolejności wykonania operacji przez węzły, które uzyskały stan gotowości. Środowisko samo decyduje o kolejności wykonania stosując technikę arbitralnego przeplotu. W ten sposób węzły lub grupy węzłów różnych gałęzi są wykonywane przemiennie co skutkuje równoległością ich realizacji.
Kolejność wykonania węzłów : Kolejność wykonania węzłów diagramu zapewnia przepływ danych pomiędzy nimi. Rodzaj wykonanej operacji arytmetycznej zależy od rodzaju użytych węzłów oraz sposobu połączenia ich wejść i wyjść. Węzły funkcji I/O nie są logicznie powiązane danymi na których wykonują swoje zasadnicze funkcje. Posiadają wejścia i wyjścia deskryptorów określające urządzenia fizyczne na których mają działać i przekazywanie tych danych można wykorzystać do określenia kolejności wykonania węzłów I/O. Jeśli wymaganej kolejności wykonania nie można uzyskać z przepływu danych trzeba zastosować specjalne konstrukcje sterujące języka G.
Struktury konstrukcyjne Sekwencje, wybór warunkowy, pętle
Konstrukcja sekwencji operacji : Konstrukcje sekwencyjne stosuje się do wymuszenia określonej kolejności wykonywania fragmentów kodu, gdy nie daje się tego uzyskać przepływem danych. Konstrukcja sekwencyjna wygląda jak ramka filmu i składa się z jednej lub kilku ramek ułożonych w stos (stacked sequence) lub płasko jedna za drugą (flat sequence) . Oba rodzaje konstrukcji działają podobnie ale posiadają nieco odmienne własności. Stacked sequence: Trzy ramki w układzie stosu. Flat sequence: Trzy ramki w układzie płaskim.
Konstrukcja sekwencji operacji (stacked sequence): Konstrukcja sekwencji w układzie stosu wykonuje swoje ramki w kolejności określonej numerami porządkowymi przypisanymi do ramek ( 0, 1, 2, 3 ... itd.). Konstrukcja rozpoczyna działanie po uzyskaniu kompletu danych wejściowych i wykonuje się jednokrotnie. Dane opuszczają strukturę w momencie, gdy ostatnia ramka zakończy wykonanie zawartego w niej kodu. Oznacza to, że dane wyjściowe określonej ramki opuszczają strukturę po jej całkowitym wykonaniu, a nie kiedy skończy się wykonanie danej ramki. Dane wejściowe konstrukcji są dostępne dla wszystkich jej ramek i każda z nich może korzystać z tych danych. Tunele wyjściowe są też widoczne we wszystkich ramkach, ale każde z wyjść może mieć tylko jedno źródło danych. Czyli wyjścia są związane z konkretnymi ramkami.
Przekazywanie danych w obszarze sekwencji (stacked sequence) : Przekazywanie danych z jednej ramki do ramek występujących po niej realizuje się za pomocą terminala zwanego lokalną sekwencją. Do uzyskania lokalnej sekwencji, wykorzystuje się operację Add Sequence Local (menu konstrukcji). Lokalna sekwencja jest zaznaczona końcówką przenoszenia danych we wszystkich ramkach sekwencji. W ramce będącej źródłem danych dla lokalnej sekwencji punkt przekazywania danych jest zaznaczony zewnętrznym zwrotem strzałki a w ramce odbiorczej strzałką zwróconą do jej wnętrza. Ramki poprzedzające ramkę będącą źródłem danych nie mogą korzystać z danych przenoszonych lokalną sekwencją i w nich punkt przenoszenia nie jest zaznaczony strzałką. Konstrukcja sekwencyjna może wykorzystywać wiele lokalnych sekwencji przekazywania danych.
Konstrukcja sekwencji operacji (flat sequence): Konstrukcja sekwencji w układzie płaskim wykonuje kolejno swoje ramki rozpoczynając od skrajnej, lewej ramki konstrukcji. W konstrukcji płaskiej ramki nie mają numerów porządkowych. Konstrukcja rozpoczyna działanie, gdy pierwsza jej ramka uzyska komplet danych wejściowych. Ramki konstrukcji wykonują swoje kody po uzyskaniu kompletu danych wejściowych i wykonują się jednokrotnie. Dane opuszczają ramkę konstrukcji w momencie, gdy zakończy ona wykonanie zawartego w niej kodu. Oznacza to, że dane wyjściowe określonej ramki są dostępne zaraz po jej wykonaniu, a nie kiedy skończy się wykonanie całej konstrukcji. Każda ramka ma swoje wejścia danych. Każda ramka ma swoje wyjścia danych ( na zewnątrz konstrukcji lub do następnej ramki). Lokalna sekwencja nie występuje w tej konstrukcji.
Konstrukcja wyboru (case) : Konstrukcja sterująca case umożliwia alternatywne wykonywanie bloków kodu objętych tą konstrukcją. Funkcjonalnie odpowiada instrukcji if...then...else lub switch języka C. Konstrukcja posiada minimum dwie ramki. Każda ramka zawiera blok programowy realizujący określone operacje oraz deklarację wartości wybierających. Wykonanie konstrukcji polega na wykonaniu kodu tylko jednej z jej ramek. Wybór ramki jest realizowany na podstawie danej dostarczonej do wejścia selekcyjnego konstrukcji case (?). Dla każdej z możliwych wartości selektora musi być przypisana jedna z ramek konstrukcji case.
Przykład selektora całkowitego konstrukcji case : Określenie wartości wybierających daną ramkę realizuje się przez wpisanie ich listy w okienku ramki określającej te wartości. W sytuacji wyboru przy użyciu danych całkowitych pole wartości wybierającej daną ramkę może mieć postać: Pojedynczej wartości całkowitej, np. 12 - ramka jest wykonywana, gdy selektor konstrukcji otrzyma wartość 12. Listy wartości całkowitych, np. 2, 4, 6, 7 - ramka jest wykonywana, gdy selektor konstrukcji otrzyma jedną z wartości podanej w liście. Listy wartości określonych zakresem, np. 5..25 - ramka jest wykonywana, gdy selektor konstrukcji otrzyma wartość z podanego zakresu. Wartości domyślnej - Default - ramka jest wykonywana, gdy selektor konstrukcji otrzyma wartość różną od wartości określonych dla innych ramek konstrukcji.
Przykład selektora stringowego konstrukcji case : Typ selektora modyfikuje się automatycznie do typu danej dołączonej do wejścia wybierającego. Po zmianie typu selektora trzeba edytować ponownie wartości wybierające. Dla danych stringowych pole wartości wybierającej daną ramkę może mieć postać: Pojedynczej wartości stringowej, np. ”City” Listy wartości, np. ”first”, ”second” - ramka jest wykonywana, gdy selektor konstrukcji otrzyma jedną z wartości podanych w liście. Listy wartości określonych zakresem, np. ”a”..”d” - ramka jest wykonywana, gdy selektor konstrukcji otrzyma string rozpoczynający się literą a, b lub c. Wartości domyślnej - Default - ramka jest wykonywana, gdy selektor konstrukcji otrzyma wartość różną od wartości określonych dla innych ramek konstrukcji.
Tunele wejściowe i wyjściowe konstrukcji case : Tunele wejść i wyjść konstrukcji tworzą się automatycznie podczas prowadzenia połączeń przez kontury konstrukcji. Tunele wejść danych tworzą wejścia dla wszystkich ramek konstrukcji, ale diagram danej ramki korzysta tylko z tych, które są potrzebne. Struktura realizuje jednokrotnie swoje zadanie po uzyskaniu danych na wszystkich wejściach . Wszystkie wejścia danych oraz wejście selektora muszą być dołączone do źródeł danych. Wykonanie dotyczy realizacji tylko wybranej ramki konstrukcji. Każda ramka struktury definiuje wyjścia danych, które są wyjściami struktury. Wyjście danych utworzone w jednej ramce jest widoczne w innych ramkach struktury. Każde wyjście konstrukcji CASE dotyczy wszystkich jej ramek. Czyli konstrukcja po wykonaniu swoich zadań musi dostarczyć dane na wszystkich wyjściach, również tych, które dotyczą wyjść z ramek aktualnie nie realizowanych.
Konstrukcja pętli for : Konstrukcję pętli for stosuje się w celu cyklicznego wykonania wybranego bloku kodu, gdy liczba wymaganych powtórzeń (iteracji) wykonania jest znana. Ramka pętli for posiada predefiniowane wejście liczby iteracji oraz terminal wyjścia licznika iteracji. Wejście liczby iteracji jest typu long integer. Licznik iteracji jest zerowany w momencie rozpoczęcia działania pętli, dostarcza aktualny numer wykonywanej iteracji (od 0 do N-1) i jest inkrementowany po każdej iteracji. Sprawdzenie warunku zakończenia (i<N) jest wykonywane przed rozpoczęciem kolejnej iteracji.
Konstrukcja pętli while : Konstrukcję pętli while stosuje się w celu cyklicznego wykonania wybranego bloku kodu, gdy liczba wymaganych powtórzeń (iteracji) wykonania nie jest znana. Ramka pętli while posiada predefiniowany terminal wyjścia licznika iteracji oraz terminal warunku kontynuowania działania pętli. Licznik iteracji jest zerowany w momencie rozpoczęcia działania pętli, dostarcza aktualny numer wykonywanej iteracji (od 0) i jest inkrementowany po każdej iteracji. Terminal kontynuacji działania pętli korzysta z wartości logicznych (boolowskich) wypracowanych przez diagram pętli. Konfigurowanie terminala kontynuacji pozwala ustalić wartość logiczną przerywającą działanie pętli (Continue IF True lub Stop If True). Sprawdzenie warunku zakończenia jest realizowane po wykonaniu każdej iteracji, dlatego zawsze jest wykonana przynajmniej jedna iteracja pętli.
Konstrukcja pętli for z terminalem przerwania : Generalnie pętlę for stosuje się, gdy liczba wymaganych powtórzeń (iteracji) wykonania jest znana. Wersje wcześniejsze od LV 8.5 dysponowały konstrukcją for bez możliwości wcześniejszego przerwania. Teraz istnieje możliwość opcjonalnego zastosowania terminala przerwania warunkowego. Terminal przerwania ma identyczne cechy jak terminal pętli while. Maksymalną liczbę iteracji pętli for z uaktywnionym terminalem przerwania wyznacza terminal iteracji. Ich liczba może być mniejsza, jeśli wcześniej zostanie spełniony warunek przerwania.
Tunele wejściowe pętli: Tunele wejściowe pętli służą do przekazania danych zewnętrznych do pętli; ściślej do poszczególnych jej iteracji. Pętla rozpoczyna działanie po otrzymaniu wszystkich danych wejściowych. W tym momencie są one też przekazywane do pętli i ich wartości są dostępne dla każdej jej iteracji i są takie same dla każdej z nich. Zmiana ustawienia nastawnika SLIDE nie wpływa na wyniki działania pętli, ponieważ ta działa na wartości uzyskanej w momencie rozpoczęcia jej działania. Aby aktualne ustawienie nastawnika wpływało na operacje wewnątrz pętli, jego terminal musi być umieszczony wewnątrz pętli, aby w każdej iteracji odczytywać aktualny jego stan.
Tunele wejściowe z auto-indeksacją : Tunel wejściowy przekazujący tablice może pracować tak, aby pętla dostała od razu całą tablicę (Disable Indexing) lub aby kolejne iteracje dostawały kolejne elementy tablicy (Enable Indexing). Auto-indeksowanie wejściowe polega na przekazaniu kolejnym iteracjom pętli danej odpowiadającej wyrażeniu TABLICA[i] , gdzie i jest numerem iteracji. Jeśli jest to tablica N-wymiarowa iteracje pętli dostaną tablicę (N-1)-wymiarową (rozkładanie tablicy). W przypadku tablicy jednowymiarowej iteracje będą dostawały kolejne elementy tablicy znajdującej się w tunelu wejściowym.. W przypadku tablicy dwuwymiarowej iteracje będą dostawały kolejne wiersze tablicy znajdującej się w tunelu wejściowym.
Tunele wejściowe z tablicami: Ta sama tablica jest przekazana do pętli przez tunel z i bez auto-indeksacji. Pętla wykonuje dwie iteracje ( i= 0, 1 ). Tunel z auto-indeksacją przekazuje iteracjom pętli pojedyncze elementy tablicy. Węzeł sumujący dodaje do siebie wartości skalarne tworząc w pierwszej iteracji wartość 5 a w drugiej 4 ( Wsk1= tab[i] + i ). Tunel bez auto-indeksacji przekazuje iteracjom pętli całą tablicę. Węzeł sumujący pracuje na całej tablicy, tworząc w każdej iteracji czteroelementową tablicę jednowymiarową z odpowiednio zmodyfikowanymi elementami ( Wsk2 = tab + i ).
Wejście z auto-indeksacją a liczba iteracji pętli for: Wejście z auto-indeksowaniem wpływa na liczbę iteracji pętli for, która jest wtedy określona przez wartość z wejścia liczby iteracji lub rozmiaru tablicy wejściowej. Obowiązuje mniejsza z tych wartości. Wejście liczby iteracji może pozostać niepołączone, jeśli pętla korzysta z auto-indeksowanego wejścia. W przypadku kilku wejść z auto-indeksowaniem liczba iteracji jest określona rozmiarem najmniejszej tablicy. Jeśli dwie tablice 20- i 50-elementowa poprzez wejścia z auto-indeksacją inicjują działanie pętli for z zadeklarowaną liczbą 25 iteracji, to pętla realizuje 20 iteracji wykorzystując w nich wszystkie elementy tablicy pierwszej oraz 20 pierwszych elementów tablicy drugiej.
Wejście z auto-indeksacją a liczba iteracji pętli while: Wejście z auto-indeksowaniem nie wpływa na liczbę iteracji pętli while. Liczba iteracji wynika tylko z warunku przerwania działania pętli. Jeśli liczba iteracji przekroczy rozmiar tablicy znajdującej się w tunelu wejściowym wówczas dostarczane są wartości domyślne ( zera dla tablicy jednowymiarowej). Wartościami domyślnymi są puste tablice w sytuacji, gdy w tunelu wejściowym jest tablica wielowymiarowa. Operacje dwuargumentowe dają pustą tablicę jeśli jeden z argumentów jest pustą tablicą. Przykład: pętla wykona 5 iteracji. Tablica wejściowa jest trójelementowa, zatem w iteracji numer 3 i 4 węzeł sumujący otrzyma z tunelu wejściowego wartości zero.
Tunele wyjściowe pętli : Dane wyjściowe są generowane w tunelach wyjściowych po zakończeniu działania pętli. Tunel wyjściowy pętli for i while może pracować z auto-indeksacją lub bez, niezależnie od rodzaju danych doprowadzonych z wnętrza pętli. Jeśli pracuje bez auto-indeksacji dostarcza wartość wyprowadzoną na wyjście podczas ostatniej iteracji wykonanej przez pętlę. Tryb auto-indeksacji tworzy na wyjściu tablicę z danych dostarczanych na wyjście po każdej iteracji pętli. Tablica wyjściowa dostępna po zakończeniu działania pętli ma rozmiar równy liczbie wykonanych iteracji. Jej wymiar zależy od wymiaru danych produkowanych w iteracjach. W przypadku produkcji danych skalarnych powstają tablice jednowymiarowe. Tablice jednowymiarowe produkowane w iteracjach tworzą tablice dwuwymiarowe, itd.
Sprawność pętli z wyjściami z auto-indeksacją : Tunel wyjściowy pętli z auto-indeksacją jest doskonałym narzędziem tworzenia danych tablicowych. Pętla for jest sprawniejsza, ponieważ w momencie rozpoczęcia pracy znany jest rozmiar oraz wymiar tablicy i następuje jednokrotne zaalokowanie wymaganej pamięci dla danej wyjściowej. Dla pętli while nie jest znana liczba iteracji do wykonania co powoduje konieczność realokacji pamięci dla danej wyjściowej po każdej iteracji.
Rejestr przesuwny pętli (shift registers) : Jednoelementowy rejestr przesuwny pętli pozwala przekazać daną do następnej iteracji pętli. Iteracja rozpoczyna się pobraniem danej z rejestru, a kończy wpisaniem do rejestru wyniku działania. Następna iteracja pobiera znów daną z rejestru, czyli korzysta z wyniku uzyskanego w poprzedniej iteracji. Rejestr tworzy się wybierając z menu konstrukcji pętli FOR lub WHILE pozycję Add Shift Register. Pętla może mieć wiele rejestrów przesuwnych. Terminal ze strzałką skierowaną w górę jest wejściem rejestru. Do niego realizuje się połączenie z wyjściem wybranego węzła poddiagramu pętli, który dostarcza danej przekazywanej do następnej iteracji. Wyjściem rejestru jest terminal ze strzałką skierowaną w dół. Dostarcza on danej z poprzedniej iteracji lub wartość początkową w pierwszej iteracji.
Wieloelementowy rejestr przesuwny: Wieloelementowy rejestr pozwala wykorzystać w danej iteracji wyniki z kilku wcześniejszych iteracji. Iteracja może pobierać dane z każdej pozycji zastosowanego rejestru. Wynik iteracji jest wprowadzany do rejestru na najmłodszą pozycję powodując przesunięcie wszystkich pozycji. Dana z pozycji najstarszej jest usuwana z rejestru. Rejestr wieloelementowy tworzy się wybierając z menu wybranego rejestru pozycję Add Element, która dodaje jeden element do rejestru. Przykład: Pętla tworzy tablicę, której każdy element jest średnią z czterech ostatnio wygenerowanych wartości przypadkowych. Z wyjątkiem trzech pierwszych elementów.
Węzeł sprzężenia zwrotnego (Feedback Node): Węzeł zapamiętuje daną z poprzedzającego wykonania pętli lub węzła VI. Zapamiętuje tylko jedną daną, dlatego jest przydatny tam gdzie należy zachować informacje z poprzedzającego wykonania. Zapamiętuje daną aż do momentu otrzymania nowej danej. Terminal inicjalizacji jest przyklejony do węzła. Odpowiada to inicjalizacji globalnej, czyli zapamiętania dołączonej wartości początkowej w momencie rozpoczęcia działania VI zawierającego ten węzeł. Jeśli węzeł sprzężenia znajduje się wewnątrz pętli lub zagnieżdżonych pętli, wówczas terminal inicjalizacji można przeciągnąć na lewą krawędź wybranej pętli. Wtedy start tej pętli powoduje także inicjalizację węzła sprzężenia.
Inicjowanie węzła sprzężenia zwrotnego : Węzeł sprzężenia zwrotnego zastosowany w pętli jest równoważny jednoelementowemu rejestrowi przesuwnemu. Jeśli w pętli należy przekazywać tylko wynik poprzedzającej iteracji, wówczas jest obojętne, który z dostępnych sposobów zostanie zastosowany. Kiedy jednak trzeba przekazać wynik wcześniejszej iteracji pozostaje tylko rozwiązanie z rejestrem przesuwnym. Miejsce inicjalizacji decydująco wpływa na uzyskane wyniki. Diagram1: Węzeł jest inicjalizowany globalnie ; raz w momencie rozpoczęcia działania konstrukcji. Diagram2: Obie iteracje pętli zewnętrznej aktywizują działanie pętli wewnętrznej. Gdy pętla wewnętrzna rozpoczyna działanie inicjalizuje w pierwszej kolejności węzeł sprzężenia. Skutkiem tego w obu iteracjach pętla dostarcza takie same tablice.
Formuły i skrypty: Węzły formuł i skryptów są użyteczne do realizacji operacji zapisanych tekstowo. Formuła matematyczna - blok tekstowy zawierający formuły matematyczne i wyrażenia o syntaktyce podobnej do C. MathScript – zapis operacji w LabView MathScript o syntaktyce podobnej do MATLAB. Skrypt Xmath – zapis operacji jako skryptu MATRIX; wymaga zainstalowanego oprogramowania NI MATRIX . Skrypt MATLAB – zapis operacji jako skryptu MATLAB; wymaga zainstalowanego oprogramowania MATLAB .
Węzeł formuły : Syntaktyka zapisu bloku programu węzła jest podobna do zapisu instrukcji programu w języku C. Blok może zawierać deklaracje zmiennych (dostępny tylko typ float oraz int) oraz wyrażenia. Wyrażenia wykorzystują takie same operatory jak język C (te same oznaczenia i priorytety). Można korzystać z instrukcji sterujących if..then..else, switch..case, pętli for, while, do..while itp. Menu formuły posiada pozycje służące do kreowania wejść i wyjść węzła (odpowiednio Add Input oraz Add Output). Po wykreowaniu należy w polu utworzonego wejścia lub wyjścia wpisać jego nazwę. Stanowią one zmienne formuły, domyślnie są typu float.
Węzeł wyrażenia : Węzeł stosuje się do obliczenia wyrażenia zawierającego jedną zmienną. Wejście węzła jest zmienną wyrażenia o nazwie X. Wynik wyrażenia jest daną wyjściową węzła. Wyrażenie może korzystać z funkcji: abs, acos, acosh, asin, asinh, atan, atanh, ceil, cos, cosh, cot, csc, exp, expm1, floor, getexp, getman, int, intrz, ln, lnp1, log, log2, max, min, mod, rand, rem, sec, sign, sin, sinc, sinh, sizeOfDim, sqrt, tan, tanh. Przykład: