Structuri repetitive


  • Tipuri de structuri repetitive

        Pentru a dezvolta aplicatii mai complexe avem nevoie de structuri care sa iplementeze repetitiile unor parti din aplicatie.

        Sunt implementate doua structuri repetitive:
  • Structura While Loop

        Se gaseste in grupul Programming => Structures => While Loop

        Aplicatiile in care la un moment dat trebuie sa repetam anumite parti ale aplicatiilor atata timp cat este indeplinita o anumita conditie sunt realizate utilizand structura "While Loop"

  • Utilizarea structurii While Loop

        Structuria "While Loop" este similara instructiunii "do while" din c++. Este folosita pentru a repeta atata timp cat o conditie este indeplinita.
        Am realizat in cursurile anterioare o aplicatie in care se folosea un generator de numere aleatoate si afisarea valorii generate intr-un indicator numeric. Aplicatia era rulata in mod continuu, obtinandu-se astfel, afisarea continua a valorilor generate. Folosind structura "While Loop" vom putea controla intervalul in care sa se afiseze repetitiv valorile generate nemaifiind nevoie de rulare continua.
        Vom realiza aplicatia numita while_v0_v0 , aplicatie care se lanseaza de la butonul "Run" nu de la butonul "Run Continuously"



        Diagrama bloc va contine o structura "While Loop" in interiorul careia se include partea de aplicate ce trebuie repetata.



        Dupa cum se observa repetitia se face pana cand se apasa butonul "Stop" buton care initial are valorea "True".

        Dupa rularea aplicatiei, se genereaza o serie de valori aleatoare pana la apasarea butonului "Stop". Daca dorim afisarea temporizata a valorilor generate va trebui sa includem in structura repetitiva o functie "Wait" aflata in grupul Functions => Timing => Wait, realizand astfel aplicatia: while_v0_v1 .



        In coltul stanga jos al structurii "While Loop" exista variabila i care contorizeaza iteratia curenta. Am putea afisa valoarea acestei variabile in locul variabilei generate aleator while_v0_v2 . In acest caz, diagrama bloc devine:



        Reluam aplicatia care afiseaza un numar intreg de tipul U8 sub forma binara utilizand 8 Led-uri dar de data aceasta numarul intreg va fi chiar variabila i folosita pentru iteratie intr-o structura "While Loop" while_v0_v3



        Vom plasa deci in structura repetitiva aplicatia pentru afisare pe led-uri



        Sa afisam acum o valoare crescatoare folosind un control de tip "Meter" while_v0_v4



        Vom folosi variabila i pentru a afisa valori crescatoare pe "Meter"



        Dupa cum se observa in diagrama bloc, a fost nevoie si de o temporizare, in caz contrar variatia lui i este foarte rapida si nu vom observa decat valoarea finala.

        Aceeasi metoda o putem utiliza pentru a afisa acum o valoare a functiei sinus folosind un control de tip "Waveform Chart" while_v0_v5



        In diagrama bloc vom folosi functia Sin aflata in grupul:Mathematics => Elementary => Trigonometric => Sine.



        Pentru a afisa mai putine perioade in unitatea de tipm, contorul i a fost impartit cu 10.

        Putem imbunatati aplicatia anterioara prin plasarea unor controale pentru a stabili sa zicem numarul de grade intre doua puncte afisate si intarzierea. while_v0_v6





        De aceasta data intarzierea nu mai este fixa, fiind data de valoarea controlului de tip "Slider" iar unghiul curent in radiani este dat de relatia
         i*90/(pi/2*x) unde x= numarul de grade intre doua puncte afisate.
         Am realizat deci un generator de semnal sinusoidal. Pe acelasi principiu putem realiza un generator de semnal dreptunghiular. while_v0_v7



        aven nevoie de o functie care sa ne intoarca valoarea 1 sau 0. Daca utilizam functia modulo 2 asupra lui contorului i, optinem succesiv valorile 1 si 0.



        Latimea implsurilor se regleaza din controlul "Latime" care divide valoarea contorului i cu valoarea controlului "Latime". Dupa operatia de impartire a trebuit sa convertim rezultatul intr-un numar intreg pe 64 biti altfel functia "modulo" nu ar mai fi dat rezultat 1 sau 0.
         Pentru a realiza un generator de semnal in treapta while_v0_v8 de forma:

    este suficient sa schimbam functia "modulo" 2 cu "modulo" 5


         Dupa acelasi principiu, pentru a realiza un generator de semnal "dinti de fierastrau" while_v0_v9 de forma:

    este suficient sa utilizam functia "modulo" n in care n sa fie suficient de mare pentru a ajunge la trepte de dimensiunea unui pixel, astfel panta devine aproape limiara.


        Este util de multe ori sa afisam datele in mod grafic sub forma de histograma. Urmatoarea aplicatie while_v0_v10 utilizeaza controlul grafic "Wavwform Chart" setat in mod corespunzator pentru a afisa o histograma.



        Diagrama logica este extrem de simpla:



        Efectul de histogram este obtinut doar din setarea corespunzatoare a controlul grafic "Wavwform Chart".



        Aplicatia poate fi imbunatatita while_v0_v11 prin atasarea unui control din care sa putem regla intarzierea intre doua valori afisate astfel:



        Diagrama bloc va trebui sa utilizeze valoarea data de controlul "Delay" pentru a realiza o pauza intre valorile generate.



        Dupa cum se observa in diagrama bloc se trimit spre afisare valori 0 cu exceptia faptului cand restul impartirii contorului i cu valoarea data de "Delay" este 0 deci la un numar multiplu al valorii data de "Delay".

  • Utilizarea variabilelor locale in structuri While Loop

        Multe aplicatii nu se pot rezolva fara a utiliza variabile locale. De multe ori avem nevoie de variabile contor suplimentare pentru a dezvolta aplicatii mai complexe. In aplicatiile anterioare ne-am "legat" tot timpul de variabila contor "i" a structurii "While Loop". Vom incerca in aplicatiile urmatoare sa folosim variabile locale pentru a realiza aplicatii mai consistente.

         Contoare de energie

        Energia este echivalenta cu integrala puterii in timp. In sistemele de calcul secventiale, integrala se poate calcula prin metoda dreptunghiurilor deci putem insuma valorile puterii la intervale prestabilite de timp pentru calculul energiei. while_v0_v12_0


        Vom introduce variabila locala W pentru calcului energiei.


        Pentru a afisa energia in W-ora, tinand cont ca masurarea puterii se realizeaza la intervale de 100 ms, va trebui sa impartim valoarea puterii la 10*60*60.

         Generatoare de semnal

         O alta metoda pentru a obtine un generator de semnal "dinti de fierastrau" este utilizarea unei structuri decizonale care sa valideze la iesire o valoare crescatoare, pana la valoarea de prag numita amplitudine maxima-Amax. while_v0_v12


        De data aceasta nu mai putem utiliza contorul i pentru ca de fiecare data cand se ajunge la valoarea de prag trebuie sa reinitializam variabila cu 0, ceea ce nu sete posibil pentru variabila i. Vom utiliza deci o variabila locala numita "Ampl" variabila care pastreaza amplitudinea curenta a semnalului.


        Utilizand structura decizionala de tip "Selector", se furnizeaza tot timpul la iesire "Ampl", atata timp cat aceasta este sub pragul stabilit.
        Panta se stabileste din controlul "Panta" prin adunarea valorii data de acesta la amplitudinea curenta. Cu cat valoarea "panta" este mai mare, cu atat amplitudinea curenta creste mai repede.
         Revenim la generatorul de semnal dreptunghiular si vom utiliza variabile locale pentru a controla latimea impulsurilor dreptunghiulare. while_v0_v13


        Vom introduce o variabila locala numita "Contor_w" care se incrementeaza la fiecare trecere si in cazul in care este atinsa valloarea setata de "Controlul" "Latime",aceasta se reinitializeaza la 0.


        Se observa ca pana variabila "Contor_w" atinge valoarea "Latime/2" se trimite valoarea 0 la dispozitivul grafic de afisare. In timpul cat variabila "Contor_w" este mai mare decat valoarea "Latime/2" se trimite valoarea 1 la dispozitivul grafic de afisare

  • Trasarea figurilor geometrice utilizand structuri While Loop

        Desenarea figurilor geometrice intr-un "Front Panel" este un proces repetitiv care presupune plasarea unui control de tip "2D Picture" aflat in grupul: Classic => Classic Graph => Controls => 2D Picture. De fiecare data cand se deseneaza ceva pe acest control se adauga vechiului continut, noul continut, asa incat desenarea este un proces repetitiv. Pentru inceput vom plasa un control de tip "2D Picture" in care vom desena un dreptungi while_v0_v14 .

    Pentru a desena un dreptungi, vom utiliza functia Draw Rect plasata in grupul:Functions => Programming => Graphics and Songs => Picture Functions => Draw Rect. Aceasta functie necesita o serie de parametri. Pentru a intelege mai bine modul in care lucreaza aceasta functie, vom furniza acesti parametrii de la niste controale situate pe "Front Panel". Pentru a trasa un dreptunghi, este nevoie de coordonatele punctului stanga sus si dreapta jos. Functia mai are nevoie de un parametru care sa indice culoarea cu care se deseneaza, asa ca acest parapetru va fi furnizat de controlul "Color Box" situat in grupul Functions => Programming => Graphics and Songs => Picture Functions => Color Box. Cel mai important parametru este parametrul "Picture" parametru care precizeaza unde sa se deseneze dreptunghiul. Functia intoarec parametrul "New Picture", reprezentand parametrul "Picture" la care se adauga dreptungiul precizat prin ceilalti parametri. In cazul in care se doreste o ca parametrul "New Picture" sa contina numai dreptunghiul precizat, "Parametrului "Picture" trebuie sa i se atribuie constanta "Empty Picture" aflata in grupul Functions => Programming => Graphics and Songs => Picture Functions => Empty Picture



        Functia "Draw Rect" are nevoie de o singura structura care contine cei patru parapetri care reprezinta coordonatele dreptunghiului, asa ca a fost necesata "impachetarea celor 4 parametrii utilizand o functie "Bundle" situata in grupul : Programming => Cluster => Bundle

        La fiecare iteratie a structurii while, vechea "Picture" este stearsa si se redeseneaza un nou dreptunhi cu noi parametrii stabiliti din controalele dispuse pe panoul frontal. In cazul in care vrem sa se pastreze vechiul continut, "New Picture" trebuie sa devina se trimita la intrarea functiei pentru a se redesena peste vechiul continut. while_v0_v15 .



        Avem nevoie de o variabila locala pentru a putea conecta iesirea functiei la intrarea ei.



        Initializarea cariabilei locale "Picture" se face o singura data la inceputul aplicatiei astfel noile dreptunghiuri trasate se aduna vechilor dreptunghiuri.

        Vom realiza in continuare aplicatii similare pentru a desena elipse while_v0_v16





        Dupa cum se observa, pentru a desena o elipsa, s-a folosit functia :Functions => Programming => Graphics and Songs => Picture Functions => Draw Round si s-au furnizat coordonatele unui dreptunghi in care va fi inscrisa elipsa. Pentru a desena un cerc, va trebui sa furnizam deci coordonatele unui patrat.

        Pentru a desena un cerc exista posibilitatea sa furnizam raza si coordonatele centrului cercului utilizand functia: Functions => Programming => Graphics and Songs => Picture Functions => Draw Circle. while_v0_v17





        Pentru a desena o linie while_v0_v18 trebuiesc furnizati doar doi parametrii care reprezinta coordonatele unui punct. Linia va fi trasata de la pozitia curenta la pozitia data de coordonate. Deci pentru a trasa o linie trebuie mai intai sa ne pozitionam pe pozitia de start a liniei utilizand functia : Functions => Programming => Graphics and Songs => Picture Functions => Move Pen si pe urma sa trasam o linie la coordonatele finale utilizand functia Functions => Programming => Graphics and Songs => Picture Functions => Draw Line. In final trebuie sa furnizam tot patru parametri.



        Coordonatele unui punct se dau tot in forma impachetata deci se va folosi iarasi o functie "Bundle"



        Pentru a furniza coordonatele unui punct exista un control special numit:Const Cluster while_v0_v19



        Coordonatele unui punct se dau de data aceasta gata impachetate



  • Utilizarea limbajului C in diagrame bloc

        De multe ori diagramele bloc devin complicate si stufoase. Solutia pentru realizarea unor aplicatii mai robuste, este includerea de cod C in diagrame bloc. Acest lucru este posibil utilizand functia:Functions => Programming => Formula Node.
        Aplicatia pentru simularea generatoarelor de semnal, devin mult mai simple folosind functii "Formula Node".
        Sa reluam aolicatia pentru realizarea unui generator de semnal "dinti de fierastrau" realizand aplicatia: while_v0_v20 bazata pe utilizarea functiei "Formula Node".



        Similar cu aplicatia initiala, se va utiliza functia modulo numai ca de data aceasta apelata ca functie C



        Functia de tip "Formula Node" utilizata are o variabila de intrare x si o variabila de iesire y. Aceste variabile sunt utilizate in cadrul secventei de cod in C utilizata in interiorul structurii "Formula Node".

        Secventa de cod in C utilizata in interiorul structurii "Formula Node", poate sa contina una sau mai multe linii de program. Este cazul si aplicatiei while_v0_v21 in care se simuleaza un generator de semnal dreptunghiular.



        Se vor folosi doua variabile y si z . Variabila y va fi folosita pe post de contor iar z ca variabila de iesire avand valoarea 0 sau 10 pentru a simula iesirea dreptunghiulara. Pe primele 10 valori ale lui y iesirea va fi 0 iar pe urmatoarele 10 valori ale lui y, iesirea va avea valoarea 10. Pentru evidentiere, valaorea variabilei y a fost afisata intr-un control numeric.



        Modul de functionare descris mai sus este mult mai concis exprimat de codul cuprins de structura "Formula node"