Tratarea marimilor analogice
  • Obiective
  • Organizarea sarcinilor de lucru

    1. Afisarea marimilor analogice


        In multe cazuri avem de-a face cu marimi analogice. Intalnim marimi analogice la interfata cu procesele tehnologice, atat la intrarile analogice cat si iesirile analogice.



        Putem intalni marimi analogice aleatoare sau periodice (repetitive).



        Marimilor analogice li se ataseaza tag-uri corespunzatoare de tip numeric pentru a pastra valorile instantanee si tag-uri de tip "Trend Tags" pentru a pastra evolutia in timp a valorilor analogice.
        Marimile analogice pot fi deasemenea simulate utilizand diverse obiece grafice plasate pe paginile grafice ale aplicatiilor.
        Vom realiza in continuare un nou proiect cu numele   M_analogice  si in cadrul lui o pagina grafica numita analogic in care se simuleaza si se afiseaza o marime analogica de intrare. Afisarea se va face atat numeric cat si folosind diverse obiecte grafice care simuleaza aparate de masura si control.



        Pentru inceput vom introduce un nou tag numit "u_ali"



        Vom plasa un obiect "Symbol" de tipul Xp_slider -right normal
        Setam proprietatea Slider-Vertical -Tag=U_ali si Offset at maximum = 230 pixeli. Setand aceasta proprietate in acest mod, vom putea actiona acest simbul si sa-l deplasam pe verticala 230 de pixeli. Miscarea acestui obiect de la 0 la 230 pixeli va cauza modificarea tag-ului asociat U_ali de la 0 la val maxima definita.


        Afisarea valorii u_ali sub forma numerica se face utilizand un obiect de tip "Number"
        Reprezentarea sub forma unei bare vericale se face utilizand un obiect "Rectangle" in care:


        Pentru a simula volt-metrul, s-a folosit un obiect "ActiveX" CimeterX.TechMeter unde s-a bifat proprietatea "Value" si i sa atribuit valoarea u_ali plasata in zona Associate prpoerty 'Value' with tag....


        In aplicatia anterioara am utilizat controlul de tipul CiMeterX pe post de instrument virtual pentru a afisa sub forma analogica valoarea instantanee a diversilor parametri. La plasarea acestora pe pagina grafica se pot seta diverse proprietati. Proprietatile acestor instrumente virtuale se pot modifica dinamic in timpul functionarii, prin intermediul codului de program lansate in timpul aplicatiei de diverse evenimente cum ar fi: scanarea paginii, apasarea unui buton etc.
        Pentru a ne putea referi din program la un anumit CiMeterX plasat pe pagina grafica, avem nevoie de o valoare de inentificare a acestuia. Dupa plasarea acestuia pe pagina grafica, acesta intradevar primeste un astfel de nume de indentificare dupa cum se vede in imaginea de jos:


        CiMeterX plasat pe pagina grafica este defapt din punt de vedere al programarii un obiec care dupa cum se vede, poarta numele "AN231", nume pe care il vom utiliza in codul programului pe care il vom scrie.
        Vom incerca sa scriem niste functii declansate de apasarea unor butoane, functii care modifica proprietatile acestor instrumente virtuale.
        Urmatoarea aplicatie multimetru reprogrameaza un CiMeterX si il transforma intr-un multimetru prin apasarea unor butoane.



        Pentru a transforma CiMeterX in voltmetru, se apasa butonul "U" care lanseaza functia transf_u( )

    
    FUNCTION transf_u() 
    	_ObjectSetProperty(ObjectByName("AN231"), "Value",u_alim);
    	_ObjectSetProperty(ObjectByName("AN231"), "Caption","Tensiune");
    	_ObjectSetProperty(ObjectByName("AN231"), "MaxValue",260);
    	_ObjectSetProperty(ObjectByName("AN231"), "EngUnit","Volti");
    END
    


        Pentru a transforma CiMeterX in ampermetru se apasa butonul "I" care lanseaza functia transf_i( )

    
    FUNCTION transf_i() 
    	_ObjectSetProperty(ObjectByName("AN231"), "Value",i_consum);
    	_ObjectSetProperty(ObjectByName("AN231"), "Caption","Curent");
    	_ObjectSetProperty(ObjectByName("AN231"), "MaxValue",50);
    	_ObjectSetProperty(ObjectByName("AN231"), "EngUnit","Amperi");
    END
    


        Pentru a transforma CiMeterX in watmetru, se apasa butonul "P" care lanseaza functia transf_p( )

    
    FUNCTION transf_p()
    	_ObjectSetProperty(ObjectByName("AN231"), "Value",putere);
    	_ObjectSetProperty(ObjectByName("AN231"), "Caption","Putere");
    	_ObjectSetProperty(ObjectByName("AN231"), "MaxValue",12000);
    	_ObjectSetProperty(ObjectByName("AN231"), "EngUnit","Wati");
    END
    


        Pentru a transforma culoara de fundal in rosu, se apasa butonul "Rosu" care lanseaza functia transf_r( )

    
    FUNCTION transf_r()
    	_ObjectSetProperty(ObjectByName("AN231"), "BackColor",6350);
    END
    


        Pentru a transforma culoara de fundal in galben, se apasa "Galben" care lanseaza functia transf_g( )

    
    FUNCTION transf_g()
    	_ObjectSetProperty(ObjectByName("AN231"), "BackColor",65534);
    END	
    


        Exista o serie de alte indicatoare virtuale definite in grupul "ActivX" sau in grupul "Genie". Vom utiliza in urmatoarea aplicatie indicator un obiect de tip "Genie" -> Faceplat -> Indicator1 si realizam urmatoarea aplicatie:



        Plasarea obiectului de tip "Genie" -> Faceplat -> Indicator1 este extrem de simpla, dupa alegerea acestuia, nu trebuie decat setat tag-ul aferent.

        Chiar si simularea tensiunii de alimentare am putea-o realiza in urmatoarea aplicatie slider cu un obiect de tip "Genie" si anume: "Genie" -> Faceplat -> Manual_l...1_v



    2. Evolutia in timp a marimilor - Trends


         Vom realiza o noua pagina grafica numita trends in care vom analiza evolutia in timp a diverselor marimi.
         Pentru analiza in timp a evolutiei diverselor marimi digitale sau analogice exista o serie de obiecte destinate afisarii graficelor in timp a diverselor marimi.

        Trend

        Unul dintre cele mai simple obiecte care ne permit afisarea evolutiei in timp a diverselor marimi este obiectul "Trend".
        Acestui obiect trebuie sa-i atasam un tag mai specila si anume un Trend Tag.
        Din Citect Progect Editor ->Tags->Trend Tags adaugam un tag nou:



        Dupa cum se observa din imaginea de sus, Trend-Tag-ul tensiune va stoca datele provenite de la tag-ul u_alim.
        Sample Period nu poate fi mai mic de 0.500 pentru marimi de tip REAL sau mai mic de 0.125 pentru marimi de tip INT.
        Vom plasa un obiect "Trend" caruia putem sa-i atasam diverse tag-uri de tip Trend Tag. Vom atasa Trend tag-ul tensiune si curent_c care vor permite trasarea graficelor de evolutie in timp a marimilor u_alim respectiv i_consum. Vom mai plasa doua obiecte cu care sa simulam marimile u_alim si i_consum si obtinem:



        Genie Trends, Process Analyst Control

        In aplicatia anterioara, evolutia in timp a diverselor marimi era afisata grafic insa nu exista posibilitatea analizei formelor de unda afisate. Folosind un obiect de tip "Genie" sau un obiect "Process Analyst Control" este posibila analiza formelor de unda achizitionate.
        Vom realiza o noua pagina grafica numita process_a in care vom simula doua marimi (curentul si tensiunea) similara cu pagina anterioara, dar de data aceasta vom plasa un obiect "Genie" si un obiect "Process Analyst Control". Vom alege din lista "Trends" pentru "Genie" si "Add Pen" pentru "Process Analyst Control".



        Daca lansam aplicatia, numai dupa actionarea butonului corespunzator "Genie - Trends" , va fi declansata afisarea evolutiei in timp, dar de data aceastaavem o serie de facilitati pentru analiza graficelor afisate.



    3. Simularea marimilor analogice


        De multe ori avem nevoie sa simulam anumite semnale analogice. Prima metoda folosita a fost simularea marimilor analogice prin actionarea manuala a anumitor butoane. Semnalele se pot simula si automat utilizand functii matematice sau functii simple scrise in cadrul modulelor de program "Cicode"
        Sa presupunem ca vrem sa simulam o functie "dinti de fierastrau" pentru evolutia curentului consumat. Vom include o functie de genul:

    FUNCTION Simul_c_df()
    	IF i_consum > 44 THEN
    	i_consum=0;
    	ELSE
    	i_consum=i_consum+0.25;
    	END
    END
    


        Dupa cum se vede, la fiecare apel al functiei i_consum este incrementat cu 0.25. In cazul in care se ajunge la valoarea maxima definita (in acest caz 45 volti), se forteaza i_consum la 0.
        Vom realiza o noua pagina grafica numita simulare_f in care afisam do poarametrii (tensiiune si curent) . Tensiunea va fi simulata manual iar pentru curent vom face apelul functiei "Simul_c_df" pentru a modifica in mod constant valoarea curentului obtinand in final aplicatia de jos:



        Vom mai scrie o functie care intrerupe curentul electric in cazul in care tensiunea nu este in plaja stabilita.

    FUNCTION lim_u()
    
    	IF u_alim>230 THEN
    		comut_alim=0;
    	END
    
    	IF u_alim<210 THEN
    		comut_alim=0;
    	END
    
    	IF u_alim>210 AND u_alim<230 THEN
    		comut_alim=1;
    	END
    	
    	IF comut_alim=0 THEN
    		i_consum=0
    	END
    END
    
    

        Dupa cum se observa, in cazul in care tensiunea nu se incadreaza in plaja 210v-230v se forteaza i_consum la 0

        Daca dorim o evolutie sinusoidala a curentului, in aplicatia simulare_f , apelam o functie de genul:

    FUNCTION Simul_c_sin()
    	rad=rad + 0.01;
    	i_consum=20*(1+sin(rad));
    END
    

        S-a introdus o noua variabila rad pentru a pastra unghiul in radiani. Pentru o variatie a curentului in limitele 0-45 amperi, s-a atrbuit lui i_consum valoarea 45*(1+sin(rad))
        In acest caz aplicatia arata astfel:


        Pentru a simula consumul pe 24 de ore, in aplicatia simulare_c vom scrie o functie care simuleaza valoarea curentului consumat in fiecare interval orar astfel:

    FUNCTION simul_c()
    	ora=ora+0.1
    	IF ora> 24 THEN
    	   ora=0
    	END    
    
      	IF ora>=0 AND ora < 4 
      	THEN
     		i_consum=6
      	END
      	
      	IF ora>=4 AND ora < 5 
    
      	THEN
     		i_consum=20
      	END  
      	
       	IF ora>=5 AND ora < 6 
    
      	THEN
     		i_consum=29
      	END 
        
        IF ora>=6 AND ora < 7 
    
      	THEN
     		i_consum=35
      	END 
     	
     	IF ora>=7 AND ora < 8 
    
      	THEN
     		i_consum=39
      	END
      	 
     	IF ora>=8 AND ora < 9 
    
      	THEN
     		i_consum=40
      	END
      	  
     	IF ora>=9 AND ora < 10 
    
      	THEN
     		i_consum=42
      	END
      	IF ora>=10 AND ora < 11 
    
      	THEN
     		i_consum=45
      	END
     	  
     	IF ora>=11 AND ora < 12 
    
      	THEN
     		i_consum=42
        END
     	IF ora>=12 AND ora < 13 
    
      	THEN
     		i_consum=40
      	END
      	IF ora>=13 AND ora < 14 
    
      	THEN
     		i_consum=33
      	END
     	
     	IF ora>=14 AND ora < 17 
    
      	THEN
     		i_consum=30
      	END
      	
      	IF ora>=17 AND ora < 18 
    
      	THEN
     		i_consum=25
      	END
        
      	IF ora>=18 AND ora < 19 
    
      	THEN
     		i_consum=20
      	END
     	IF ora>=19 AND ora < 20 
    
      	THEN
     		i_consum=25
      	END
      	
     	IF ora>=20 AND ora < 21 
    
      	THEN
     		i_consum=40
      	END
    
      	IF ora>=21 AND ora < 22 
    
      	THEN
     		i_consum=45
      	END
     	
     	IF ora>=22 AND ora < 23 
    
      	THEN
     		i_consum=33
      	END
    
      	IF ora>=23 AND ora < 24 
    
      	THEN
     		i_consum=22
      	END
      END
    
    



        Obiectul "Trend" utilizat pentru afisarea evolutiei in timp a diverselor marimi, poate fi utilizat pe post de obiect "Plot" care ne permite sa afisam diverse grafice in coordonate x-t sau x-y.
        In aplicatia afis_gr_01 , se va realiza o astfel de aplicatie folosind Graphics Bilder. Plasam obiectul "Trend":



        In vederea utilizarii acestui obiect, trebuie sa obtinem numarul de identificare al obiectului (Obiect AN) din fereastra Trend Properties->Access.



        In cazul de fata numarul de identificare al obiectului (Obiect AN) este 205. Vom folosi acest cod in functiile pentru diverse afisari grafice din pagina grafica: afis_gr_01. Vom trasa pentru inceput o curba care trece prin 10 coordonatele x salvate intr-un vector numit in aceasta aplicatie Buf1[]

        Functia definita: Plot_lin foloseste o serie de functii predefinite in Citect cum ar fi: PlotOpen, PlotGrid, PlotLine, PlotClose, acestea fiind foarte bine documentate in Help-ul Citect.
    INT hPlot;
    REAL Buf1[10] =20,20,60,60,40,40,50,60,55,60;
    FUNCTION Plot_lin(INT hAn,INT iGridCol= Yellow,INT iFrameCol= Black,INT iFillCol=Black)
    	INT FrameWidth=10;
    	hPlot=PlotOpen(hAn,"Display",65);
    	PlotGrid(hPlot,10,0,0,400,200,10,iGridCol,9,iGridCol,FrameWidth,iFrameCol,iFillCol,0);
    	PlotLine(hPlot, 0, Light_Red, 2, 7, Magenta , 1, 10, Buf1[0], 0,200,1);
    	PlotClose(hPlot);
    END
    


        Dupa cum se observa, s-a defint variabila INT hPlot care reprezinta handler-ul obiectului "Trend" in care se va face afisarea grafica. Acest handler se obtine prin intermediul functiei PlotOpen(hAn,"Display",65) , hAn fiind numarul de identificare al obiectului (Obiect AN) acesta fiind transmis ca parametru in cazul apelului acestei functii. In pagina grafica: afis_gr_01 pe butonul "Linie" se face apelarea functiei Plot_lin astfel:
    Plot_lin(205)
    




        205 fiind numarul de identificare al obiectului "Trend" (Obiect AN). Dupa apasarea butonului "Linie" se obtine:



        Putem plasa mai multe grafice simultan pe ecran. Vom mai defini un vector REAL Buf2[10] cu valori pentru a doua curba. Functia Plot_linii va trasa doua curbe simultan.
    INT hPlot;
    REAL Buf1[10] =20,20,60,60,40,40,50,60,55,60;
    REAL Buf2[10];
    FUNCTION Plot_linii(INT hAn,INT iGridCol= Yellow,INT iFrameCol= Black,INT iFillCol=Black)
    	INT FrameWidth=10;
    	hPlot=PlotOpen(hAn,"Display",65);
    	PlotGrid(hPlot,10,0,0,400,200,10,iGridCol,9,iGridCol,FrameWidth,iFrameCol,iFillCol,0);
    	PlotLine(hPlot, 0, Light_Red, 2, 7, Magenta , 1, 10, Buf1[0], 0,200,1);
    	PlotLine(hPlot, 0, Light_Cyan, 1, 6, Yellow , 1, 10, Buf2[0], 0,200,1);
    	PlotClose(hPlot);
    END
    




        Vectorul REAL Buf2[10] nu are atribuite valori deci toate sunt 0.

        Vom defini in continuare functia Plot_sin pentru a trasa graficul functiei sinus folosin de data aceasta 100 de valori.
    INT hPlot;
    REAL Buf3[100];
    	INT i
    	REAL rad=0;
    	FOR i=0 TO 99 DO
    		rad=rad + 0.09;
    		Buf3[i] =100*(1+Sin(rad));
    	END
    	INT FrameWidth=10;
    	hPlot=PlotOpen(hAn,"Display",65);
    	PlotGrid(hPlot,100,0,0,400,200,10,iGridCol,9,iGridCol,FrameWidth,iFrameCol,iFillCol,0);
    	PlotLine(hPlot, 0, Light_Blue, 1, 0, Light_Red , 1, 100, Buf3[0], 0,200,1);
    	PlotClose(hPlot);
    




        Putem folosi obiectul "Trend" pentru a trasa grafice in coordonate x-y.Vom defini astfel functia Plot_xy pentru a trasa un graficul in coordonate x-y pentru valorile aflate in vectorul XTable[10] respectiv YTable[10] .
    INT hPlot;
    REAL YTable[10]=10,20,30,40,50,60,70,80,90,100;
    REAL XTable[10]=10,20,40,50,60,60,50,40,20,10;
    
    FUNCTION Plot_xy(INT hAn,INT iGridCol= Yellow,INT iFrameCol= Black,INT iFillCol=Black)
    	INT FrameWidth=10;
    	hPlot=PlotOpen(hAn,"Display",65);
    	PlotGrid(hPlot,10,0,0,400,200,10,iGridCol,9,iGridCol,FrameWidth,iFrameCol,iFillCol,0);
    	PlotXYLine(hPlot,0,Light_Green,1,0,White,1,10,XTable[0],0,100,YTable[0],0,100,1);
    	PlotClose(hPlot);
    END
    




        Vom combina toate graficele de sus prin intermediul functiei Plot
    INT hPlot;
    REAL Buf1[10] =20,20,60,60,40,40,50,60,55,60;
    REAL Buf2[10];
    REAL Buf3[100];
    REAL YTable[10]=10,20,30,40,50,60,70,80,90,100;
    REAL XTable[10]=10,20,40,50,60,60,50,40,20,10;
    
    FUNCTION Plot(INT hAn,INT iGridCol= Grey,INT iFrameCol= Black,INT iFillCol=Black)
    	INT i;
    	REAL rad=0;
    	FOR i=0 TO 9 DO
    		rad=rad + 0.6;
    		Buf3[i] =100*(1+Sin(rad));
    	END
    	INT FrameWidth=10;
    	hPlot=PlotOpen(hAn,"Display",65);
    	PlotGrid(hPlot,10,0,0,400,200,10,iGridCol,9,iGridCol,FrameWidth,iFrameCol,iFillCol,0);
    	PlotScaleMarker(hPlot,-15,190, 11, 1, Black, 1);
    	PlotLine(hPlot, 0, Light_Red, 2, 7, Magenta , 1, 10, Buf1[0], 0,200,1);
    	PlotLine(hPlot, 3, Light_Cyan, 1, 6, Yellow , 1, 10, Buf2[0], 0,200,1);
    	PlotLine(hPlot, 0, Light_Blue, 1, 4, Light_Red , 1, 10, Buf3[0], 0,200,1);
    	PlotXYLine(hPlot,0,Light_Green,1,0,White,1,10,XTable[0],0,100,YTable[0],0,100,1);
    	PlotClose(hPlot);
    END
    




    Test de autoevaluare


    Rezumat


    Afisarea sub forma numerica
        Afisarea valorii unei marimi analogice sub forma numerica se face utilizand un obiect de tip "Number"

    Afisarea sub forma de bara verticala (histografica)
        Reprezentarea sub forma unei bare vericale se face: Afisarea unui instrument virtual
        Pentru a afisa un instrument virtual, se foloseste un obiect "ActiveX" CimeterX.TechMeter unde se bifeaza proprietatea "Value" si i se atribuie numele tag-ului ce reprezinta marimea analogica

    Controlul din program al unui instrument virtual
        Controlul din program al unui instrument virtual se face pe baza Object Name-ul atribuit la plasarea acestuia pe pagina grafica.

    Afisarea evolutiei in timp a marimilor analogice
        Afisarea evolutiei in timp a marimilor analogice se face cu: Simularea marimilor analogice se face:
  • Rezultate asteptate
  • Termeni esentiali


  • Recomandari bibliografice

  • Link-uri utile

    Test de evaluare