Utilizarea limbajului de programare VBS in mediul WinCC

1.Controale de intrare-iesire


    Aplicatiile SCADA simple se pot crea in principiu fara a utiliza notiuni de programare. Aplicatiile mai complexe nu pot fi realizate decat utilizand facilitatile oferite de limbajele de programare ANSI C si VB incluse in mediul de dezvoltare WinCC

Controale de tipul on/off

    Folosind Graphics Designer vom crea o pagina grafica "led1" pentru a simula comanda de alimentare cu energie a unui proces. Alimentarea va fi semnalizata in pagina grafica prin aprinderea unui LED. LED-ul va avea doua stari. Starea stins de culore gri si starea aprins, de culoare verde.

    Se va defini un Internal Tag -L1 de tip boolean care va fi modificat de Toggle button si afisat de un cerc caruia i se va seta Background color in functie de L1

    Display Library -- Operation -- Toggle Buttons -- On_Off_1
       - se seteaza Properties -- Tag -- Assignment -- Dynamic -- Tag -- L1 --Update 250 ms
    Standard Objects -- Circle
       - se seteaza Properties -- Efects -- Global Color Scheme -- No
       - se seteaza Properties -- Colors -- Background color -- Dynamic -- Dynamic Dialog -- Tag -- L1 -- Bolean



    Se observa ca nu se poate seta Update Time, acesat fiind setat implicit la 2 s. Vom folosi alta metoda prin utilizarea Smart Objects-ului -- Status Display in urmatoarea pagina grafica "led2"
    Smart Objects -- Status Display
      -se atribuie Tag -- L1 -- Update 250 ms
      -se atribuie imagini pentru 0 si pentru 1 corespunzatoare lui L1. Se face click dreapta pe simbol si se alege Configuration Dialog. Se aduc imaginile cu Browse si apoi se trag pe starea 0 respectiv starea 1.



    Se pot utiliza simbolurile existente in biblioteca. Pentru a realiza un Set simbol de vane controlat de doua butoane on respectiv off. In continuare se vor alege doua simboluri din biblioteca atfel: un simbol pentru vana on si un simbol pentru vana off si se vor plasa pe Layer-uri diferite in urmatoarea pagina grafica "led3" . Plasarea pe diferite Layer-uri se poate face sii dupa plasarea simbolurilor prin setarea proprietarii Layer astfel:
       - se seteaza Properties -- Layer -- se alege Layer-ul corespunzator.

    Pentru valva off, se seteaza
      -- Properties -- Miscellaneus -- Display -- No

    Se plaseaza doua butoane unul On si altul Off
    Windows Objects -- Button -- Text -- On
      -- Properties -- Events -- Mouse -- Action -- VBS Action

Sub OnClick(ByVal Item)   

Dim Valva1_r
Set Valva1_r = ScreenItems("Gruppe43")
Dim Valva1_v
Set Valva1_v = ScreenItems("Gruppe45")
Valva1_r.Visible=False
Valva1_v.Visible=True

End Sub

    Windows Objects -- Button -- Text -- Off
      -- Properties -- Events -- Mouse -- Action -- VBS Action

Sub OnClick(ByVal Item)
 
Dim Valva1_r
Set Valva1_r = ScreenItems("Gruppe43")
Dim Valva1_v
Set Valva1_v = ScreenItems("Gruppe45")
Valva1_r.Visible=True
Valva1_v.Visible=False

End Sub




Controale alfanumerice de intrare/iesire

    Vom crea o noua pagina grafica "afisd_01" ,in care vom afisa un text la apasarea unui buton.
    Afisarea textului se face utilizand un obiect standard
    Standard Objects -- Static Text -- Text=Loc mesaj
    Windows Objects -- Button
       - se seteaza Properties -- Font -- Text=Start
       - se completeaza Events -- Mouse -- Mouse Action cu urmatoarea procedura:

Sub OnClick(Byval Item)
 
Dim objTxt
Set objTxt = ScreenItems("Static Text1")
objTxt.Text="Ati apasat butonul START "

End Sub




    Se poate folosi pe post de consola Smart Object-ul Applications Windows
    Vom crea o noua pagina grafica "afisd_02" ,in care vom afisa valoarea tag-urilor Temp si L1
    Plasam urmatoarele elemente:
    Smart Objects -- Applications Windows
       - se seteaza Global Script -- GSC Diagnostics
    Windows Objects -- Button
       - se seteaza Properties -- Font -- Text=Start
       - se completeaza Events -- Mouse -- Mouse Action cu urmatoarea procedura:

Sub OnClick(Byval Item)
     
Dim objTag_T 
Dim objTag_L1
Set objTag_T = HMIRuntime.Tags("Temp")
Set objTag_L1 = HMIRuntime.Tags("L1")
objTag_T.Read
objTag_L1.Read
HMIRuntime.Trace "Temperatura: " & objTag_T.Value & " grade "  & vbCrLf & 
"Valoarea tag-ului L1:"& objTag_L1.Value & vbCrLf

End Sub




    Pentru afisari in format binar se poate folosi controlul 8 bit Display +I/O Field aflat in Global Library
    Vom crea o noua pagina grafica "afisd_03" ,in care vom afisa valoarea tag-ului Temp in format binar. Plasam urmatoarele elemente:

    Display Library -- Displays -- Displays -- 8 bit Display +I/O Field
       - se seteaza Properties pentru 8 bit Display -- User Defined2 -- Byte Value -- Tag -- Temp --Update 250 ms
       - se seteaza Properties pentru I/O Field -- InputOutput -- OutputValue -- Tag -- Temp --Update 250 ms
    Windows Objects -- Slider Obiect -- Tag -- Temp -- Update 250ms


    Vom crea o noua pagina grafica "afisd_04" ,in care vom introduce valoarea tag-ului Temp de la tastatura folosind un Smart Object I/O Field. Plasam urmatoarele elemente:
    Standard Objects -- Static Text
    Smart Objects -- I/O Field
       - se seteaza: Tag -- Temp -- Update 250ms
       - se completeaza Events -- Keyboard -- Press cu urmatoarea procedura:

Sub OnKeyDown(ByVal Item, ByVal nChar, Byval nRepCnt, ByVal nFlags) 

Dim objTxt
Dim objCtrl
Set objTxt = ScreenItems("Static Text1")
Set objCtrl = ScreenItems("I/O Field2")
objTxt.Text=objCtrl.InputValue

End Sub




    Pentru afisari de mesaje se poate folosi si fereastra "Message Box" astfel:
    In pagina grafica "afisd_05" plasam urmatoarele obiecte:
    Windows Objects -- Button
       - se seteaza Properties -- Font -- Text=Start
       - se completeaza Events -- Mouse -- Mouse Action cu urmatoarea procedura:

Sub OnClick(Byval Item)
   
 Dim txt
 Dim objTag
 Set objTag = HMIRuntime.Tags("Temp")
 objTag.Read
 txt= "Valoarea temperaturii este:"
 MsgBox txt & objTag.Value

End Sub




Controale grafice de intrare/iesire

    Vom crea o noua pagina grafica "afis_01" , care permite modificarea valorii tag-uli Temp de tipul Unsigned 8-biti predefinit anterior.
    Pentru modificarea dinamica a valorii tag-ului Temp se va folosi un Slider Object.
    Afisarea valorii tag-ului se face prin intermediul unui control de tip Meter.

    Display Library -- Meters -- Meter2
       - se seteaza Properties -- User Defined2 -- Process --Dynamic -- Tag -- Temp --Update 250 ms
    Windows Objects -- Slider Obiect -- Tag -- Temp -- Update 250ms



    Vom crea o noua pagina grafica "afis_02" , care contine:

    Controls -- Activx Controls -- Wincc Gauge Control
       - se seteaza Properties -- Control Properties -- Value -- Tag -- Temp -- -- Update 250ms

    Controls -- Activx Controls -- Wincc Slider Control
       - se seteaza Properties -- Control Properties -- Position -- Tag -- Temp -- -- Update 250ms

    Windows Objects -- Rectangle
      -- Properties -- Rectangle -- Filling -- Fill Level -- Tag -- Temp --Update 250 ms
      -- Properties -- Rectangle -- Dynamic Filling -- Yes

    Display Library -- Meters -- Meter2
       - se seteaza Properties -- User Defined2 -- Process --Dynamic -- Tag -- Temp --Update 250 ms



    

2. Instructiuni decizionale
Instructiunea If ... Then / Else:

    Instructiunea If ... Then / Else se foloseste pentru a executa o instructiune sau o secventa de instructiuni cand valoare logica a unei expresii este adevarata si alta instructiune sau o secventa de instructiuni pentru cazul cand valoarea logic a aceleiasi expresii nu este adevarata.

  • Formatul instructiunii:

        if expresie logica Then
          instructiuni
        Else
          instructiuni
        End If


  • Aplicatii care utilizarea instructiuni decizionale

        Vom incerca sa utilizam in continuare instructiunea If ... Then / Else pentru a controla functionarea butonului Pornit/ Oprit.

       Vom realiza aplicatia "if_01" vom implementa on buton on/off.

        Vom plasa un Smart Objects -- Status Display
          -setam -- Tag -- L1 -- Update 250 ms
          -tribuim imagini pentru 0 si pentru 1 corespunzatoare lui L1
       Se plaseaza un buton start din Windows Objects -- Button -- Text = On/Off
           -se completeaza -- Properties -- Events -- Mouse -- Action -- VBS Action -- cu urmatoarea procedura

    Sub OnClick(Byval Item) 
     
    Dim x
    Set x = HMIRuntime.Tags("L1")
    x.Read
    Dim Tag_L1
    Set Tag_L1 = HMIRuntime.Tags("L1")
    Tag_L1.Read
    If x.Value=1 Then
    Tag_L1.Value=False
    Else
    Tag_L1.Value=True
    End If
    Tag_L1.Write
    
    End Sub
    


       Urmatoarea aplicatie "if_02" vom implementa on buton on/off din simboluri.
       Se plaseazadoua simboluri pe Layer-uri diferite
           -se completeaza pentru fiecare simbol -- Properties -- Events -- Mouse -- Action -- VBS Action -- cu urmatoarea procedura

    Sub OnClick(Byval Item) 
    
    Dim x
    Set x = HMIRuntime.Tags("L1")
    Dim Tag_L1
    Set Tag_L1 = HMIRuntime.Tags("L1")
    Dim Valva1_r
    Set Valva1_r = ScreenItems("Polygon4")
    Dim Valva1_v
    Set Valva1_v = ScreenItems("Polygon5")
    Tag_L1.Read
    x.Read
    If x.Value=1 Then
    Tag_L1.Value=False
    Valva1_v.Visible=False
    Valva1_r.Visible=True
    Else
    Tag_L1.Value=True
    Valva1_r.Visible=False
    Valva1_v.Visible=True
    End If
    Tag_L1.Write
    
    End Sub
    


       In acest moment dublul simbol functioneaza, insa la actionarea, dar la apasarea Toggle Button-ului, simbolul valvei ramane nemodificat. Va trebui sa mai scriem o procedura declansata pe unul din evenimentele paginii grafice care sa actualizeze in permanenta starea valvei cand tag-ul corespunzator valvei este actionat din alta parte



       Am folosit proprietatea Picture Obiect al paginii grafice -- Geometry -- Picture Width -- VBS Action, urmatorul script

    Dim Tag_L1
    Set Tag_L1 = HMIRuntime.Tags("L1")
    Dim Valva1_r
    Set Valva1_r = ScreenItems("Polygon4")
    Dim Valva1_v
    Set Valva1_v = ScreenItems("Polygon5")
    Tag_L1.Read
    If Tag_L1.Value=1 Then
    Valva1_v.Visible=True
    Valva1_r.Visible=False
    Else
    Valva1_r.Visible=True
    Valva1_v.Visible=False
    End If
    


       Dupa care am setat Triger-ul la 250 ms

        Sa reluam aplicatia afis_01 dar de data aceasta sa nu mai modificam manual valoarea tag-ului Temp, sa modificam dinamic valoarea.
        Realizam o noua pagina grafica "if_03" pe care plasam toate elementele de pe afis_01 si in plus:
       Folosim din nou proprietatea Picture Obiect al paginii grafice -- Geometry -- Picture Width -- VBS Action, scriptul de jos si setam Triger-ul la 250 ms.

    Function Width_Trigger(ByVal Item)
    Dim objTag
    Set objTag = HMIRuntime.Tags("Temp")
    objTag.Read
    objTag.Value = objTag.Value + 10
    If objTag.Value>100 Then
    objTag.Value=1
    End If
    objTag.Write
    End Function
    


    3. Istructiuni repetitive

    Instructiunea Do While

        Instructiunea Do While Se foloseste pentru a executa repetitiv o instructiune sau o secventa de instructiuni atata timp cat o expresie este adevarata.
  • Formatul instructiunii:

        Formatul instructiunii
        Do While (expresie)
          instructiuni
        Loop

        Instructiunea se executa repetat atīta timp cīt valoarea expresiei este adevarata. Testul are loc īnaintea fiecarei executii a instructiunii. Modul de functionare al instructiunii este urmatorul:
  •      Se testeaza expresia din paranteze. Daca ea este adevarata (sau expresia din paranteze are o valoare diferita de zero)
  •      Se executa corpul instructiunii while
  •      Se reia testarea si executia pana expresia devine falsa (sau valoarea expresiei din paranteze este zero)
  •      Se continua executia cu instructiunea de dupa corpul instructiunii while, deci instructiunea while se termina.


  • Aplicatii care utilizeaza instructiunea Do While

        Sa realizam un program care afiseaza primele 10 numere naturale.

        Folosind Smart Object-ul Applications Windows vom afisa primele 10 de numere naturale
        Vom crea o noua pagina grafica "while_01" ,in care afisam primele 10 de numere naturale
        Plasam urmatoarele elemente:
        Smart Objects -- Applications Windows
           - se seteaza Global Script -- GSC Diagnostics
        Windows Objects -- Button
           - se seteaza Properties -- Font -- Text=Start
           - se completeaza Events -- Mouse -- Mouse Action cu urmatoarea procedura:

    Sub OnClick(Byval Item)
          
    Dim i
    i=1
     Do While i <= 10
    	HMIRuntime.Trace "I=: " & i & vbCrLf 
    	i=i+1
     Loop
    
    End Sub
    


    Instructiunea For

        Instructiunea For se foloseste pentru a executa repetitiv o instructiune sau o secventa de instructiuni. De obicei implementeaza structura ciclica cu numar cunoscut de pasi.
  • Formatul instructiunii:

        Instructiunea For are urmatorul format:

        For expresie1 To expresie2
            instructiuni;
        Next
         expresie1 constituie initializarea ciclului si se executa o singura data īnaintea ciclului.
         expresie2 specifica testul care controleaza ciclul. El se executa īnaintea fiecarei iteratii. Daca conditia din test este adevarata atunci se executa corpul ciclului, care consta de cele mai multe ori īn modificarea valorii variabilei de control al ciclului.
         Se incrementeaza variabila din expresie1
         Se revine apoi la reevaluarea conditiei. Ciclul se termina cīnd expresie2 devine falsa.


  • Aplicatii care utilizeaza instructiunea For

       Vom realiza aplicatia "for_01" in care afisam random 10 dreptunghiuri de inaltimi diferite.
       Se plaseaza 10 dreptunghiuri cu numele Rectangle1, Rectangle2,...,Rectangle 10 din Standard Objects -- Rectangle
           -se seteaza -- Properties -- Color -- Background Color -- la culoarea dorita
           -se seteaza -- Properties -- Effects -- Global Color Scheme = No
       Se plaseaza un buton start din Windows Objects -- Button -- Text = Start
           -se completeaza -- Properties -- Events -- Mouse -- Action -- VBS Action -- cu urmatoarea procedura

    Sub OnClick(Byval Item)   
    	Dim x
    	Dim i
    	Dim v_bar
    	For i=1 To 10
    		Set v_bar = ScreenItems("Rectangle" +CStr(i))
    		x=200*Rnd()
    		v_bar.Height=x
    		v_bar.Top=290-x
    	Next      
    End Sub
    




        Se poate utiliza proprietatea FillingIndex si se seteaza in procente nivelul de umplere al figurii. Realizam astfel aplicatia "for_01_01"

    Sub OnClick(ByVal Item)          
    	Dim x
    	Dim i
    	Dim v_bar
    	For i=1 To 10
    		Set v_bar = ScreenItems("Rectangle" +CStr(i))
    		x=100*Rnd()
    		v_bar.FillingIndex=x
    	Next
    End Sub
    


        Folosind Smart Object-ul Applications Windows vom afisa primele 25 de numere naturale
        Vom crea o noua pagina grafica "for_02" ,in care primele 25 de numere naturale
        Plasam urmatoarele elemente:
        Smart Objects -- Applications Windows
           - se seteaza Global Script -- GSC Diagnostics
        Windows Objects -- Button
           - se seteaza Properties -- Font -- Text=Start
           - se completeaza Events -- Mouse -- Mouse Action cu urmatoarea procedura:

    Sub OnClick(Byval Item)
          
    Dim i
    For i=1 To 25
    HMIRuntime.Trace "I=: " & i & vbCrLf 
    Next
    
    End Sub
    




    Instructiunea Do Until

        Formatul instructiunii
        Do Until (expresie)
          instructiuni
        Loop

        Instructiunea se executa repetat pana cand valoarea expresiei devine adevarata.
        Testul are loc īnaintea fiecarei executii a instructiunii.
        Instructiunea Do Until se foloseste atunci cand se cunoaste conditia finala pana la care se repeta secventa de instructiuni


  • Aplicatii care utilizeaza instructiunea Do Until

        Pentru afisari repetitive de mesaje se va folosi fereastra "Message Box" astfel:
        In pagina grafica "until_01" plasam urmatoarele obiecte:
        Windows Objects -- Button
           - se seteaza Properties -- Font -- Text=Start
           - se completeaza Events -- Mouse -- Mouse Action cu urmatoarea procedura:

    Sub OnClick(Byval Item)
    Dim val_r, rasp
    Randomize			' Initializare generator numere aleatoare
    Do Until rasp = vbNo
     val_r = Int((9 * Rnd) + 1)	' Generare numar aleator intre 0-9.
     MsgBox " Numarul aleator intre 0-9 este: " & val_r
     rasp = MsgBox ("Reluati ? ", vbYesNo)
    Loop
    
    End Sub
    


    4. Proceduri si functii


        Functiile sunt des utilizate pentru realizarea aplicatiilor SCADA. Majoritatea butoanelor, prin intermediul evenimentelor lanseaza secvente de cod impachetate in cadrul unor functii. Exista o varietate mare de functii astfel avem functii cu sau fara parametri, functii care returneaza sau nu valori.

    Proceduri
        O procedura se defineste astfel:

         Sub  Nume_functie (lista_param_ formali) 
          declaratii_variabile_locale
          instructiuni
         End Sub 
    

        Prima linie reprezinta antetul procedurii, īn care se indica: numele procedurii, lista parametrilor formali si tipul lor.
        Lista_param_formali (īncadrata īntre paranteze rotunde) consta īntr-o lista (enumerare) care contine tipul si identificatorul fiecarui parametru de intrare, despartite prin virgula. Daca lista parametrilor formali este vida, īn antet, dupa numele functiei, apar doar parantezele ( ).
        Corpul procedurii este un bloc, care implementeaza algoritmul de calcul folosit de catre procedura. Īn corpul functiei apar (īn orice ordine) declaratii pentru variabilele locale si instructiuni.

    Aplicatii care utilizeaza proceduri

       Sa reluam aplicatia "if_02" in care am implement on buton on/off din simboluri.
       Dupa ce am plasat doua simboluri pe Layer-uri diferite am completa pentru fiecare simbol -- Properties -- Events -- Mouse -- Action -- VBS Action -- cu urmatoarea procedura

    Sub OnClick(Byval Item) 
    	Dim x
    	Set x = HMIRuntime.Tags("L1")
    	Dim Tag_L1
    	Set Tag_L1 = HMIRuntime.Tags("L1")
    	Dim Valva1_r
    	Set Valva1_r = ScreenItems("Polygon4")
    	Dim Valva1_v
    	Set Valva1_v = ScreenItems("Polygon5")
    	Tag_L1.Read
    	x.Read
    	If x.Value=1 Then
    		Tag_L1.Value=False
    		Valva1_v.Visible=False
    		Valva1_r.Visible=True
    	Else
    		Tag_L1.Value=True
    		Valva1_r.Visible=False
    		Valva1_v.Visible=True
    	End If
    	Tag_L1.Write
    End Sub
    


       Am mai scris o procedura declansata pe unul din evenimentele paginii grafice care sa actualizeze in permanenta starea valvei cand tag-ul corespunzator valvei este actionat din alta parte.



       Am folosit proprietatea Picture Obiect al paginii grafice -- Geometry -- Picture Width -- VBS Action, urmatorul script

    Function Width_Trigger(ByVal Item)
    	Dim Tag_L1
    	Set Tag_L1 = HMIRuntime.Tags("L1")
    	Dim Valva1_r
    	Set Valva1_r = ScreenItems("Polygon4")
    	Dim Valva1_v
    	Set Valva1_v = ScreenItems("Polygon5")
    	Tag_L1.Read
    	If Tag_L1.Value=1 Then
    		Valva1_v.Visible=True
    		Valva1_r.Visible=False
    	Else
    		Valva1_r.Visible=True
    		Valva1_v.Visible=False
    	End If
    End Function
    


       Dupa care am setat Triger-ul la 250 ms

       Vom scrie doua proceduri astfel:

    Sub valva_on_off 
    	Dim x
    	Set x = HMIRuntime.Tags("L1")
    	Dim Tag_L1
    	Set Tag_L1 = HMIRuntime.Tags("L1")
    	Dim Valva1_r
    	Set Valva1_r = ScreenItems("Polygon4")
    	Dim Valva1_v
    	Set Valva1_v = ScreenItems("Polygon5")
    	Tag_L1.Read
    	x.Read
    	If x.Value=1 Then
    		Tag_L1.Value=False
    		Valva1_v.Visible=False
    		Valva1_r.Visible=True
    	Else
    		Tag_L1.Value=True
    		Valva1_r.Visible=False
    		Valva1_v.Visible=True
    	End If
    	Tag_L1.Write
    End Sub
    


    Sub valva_init
    	Dim Tag_L1
    	Set Tag_L1 = HMIRuntime.Tags("L1")
    	Dim Valva1_r
    	Set Valva1_r = ScreenItems("Polygon4")
    	Dim Valva1_v
    	Set Valva1_v = ScreenItems("Polygon5")
    	Tag_L1.Read
    	If Tag_L1.Value=1 Then
    		Valva1_v.Visible=True
    		Valva1_r.Visible=False
    	Else
    		Valva1_r.Visible=True
    		Valva1_v.Visible=False
    	End If
    End Sub
    


       Aceste proceduri le vom integra in Global -- Script --Project Module

       Vom scrie acum aplicatia "proc_01" in care implementam la fel un buton on/off din simboluri, dar vom apela procedurile scrise anterior si anume valva_on_off respectiv valava_init.
       Dupa ce am plasat doua simboluri pe Layer-uri diferite am completa pentru fiecare simbol -- Properties -- Events -- Mouse -- Action -- VBS Action -- cu urmatoarea procedura

    Sub OnClick(Byval Item) 
    
    	Call valva_on_off
    
    End Sub
    


        Scriem de asemenea o procedura declansata pe unul din evenimentele paginii grafice care sa actualizeze in permanenta starea valvei cand tag-ul corespunzator valvei este actionat din alta parte.



       Am folosit proprietatea Picture Obiect al paginii grafice -- Geometry -- Picture Width -- VBS Action, urmatorul script

    Function Width_Trigger(ByVal Item)
    
    	Call valva_init
    	
    End Function
    


       Dupa care setam Triger-ul la 250 ms

       Procedurile scrise inainte nu sunt prea generale vom incerca sa le rescriem si sa transmitem parametrii legati de Tag si cele doua simboluri folosite astfel incat aceste proceduri sa poata fi folosite eventual si de alte simboluri plasate.

       Vom rescrie aplicatia anterioara si vom realiza "proc_02"
       Vom scrie doua proceduri astfel:

    Sub valva_on_off_p(Byval tag,s1,s2)
    	Dim x
    	Set x = HMIRuntime.Tags(tag)
    	Dim Tag_L1
    	Set Tag_L1 = HMIRuntime.Tags(tag)
    	Dim Valva1_r
    	Set Valva1_r = ScreenItems(s1)
    	Dim Valva1_v
    	Set Valva1_v = ScreenItems(s2)
    	Tag_L1.Read
    	x.Read
    	If x.Value=1 Then
    		Tag_L1.Value=False
    		Valva1_v.Visible=False
    		Valva1_r.Visible=True
    	Else
    		Tag_L1.Value=True
    		Valva1_r.Visible=False
    		Valva1_v.Visible=True
    	End If
    	Tag_L1.Write
    End Sub
    


    Sub valva_init_p(Byval tag,s1,s2)
    	Dim Tag_L1
    	Set Tag_L1 = HMIRuntime.Tags(tag)
    	Dim Valva1_r
    	Set Valva1_r = ScreenItems(s1)
    	Dim Valva1_v
    	Set Valva1_v = ScreenItems(s2)
    	Tag_L1.Read
    	If Tag_L1.Value=1 Then
    		Valva1_v.Visible=True
    		Valva1_r.Visible=False
    	Else
    		Valva1_r.Visible=True
    		Valva1_v.Visible=False
    	End If
    End Sub
    


       Aceste proceduri le vom integra de asemenea in Global -- Script --Project Module

    Functii

        O functie se defineste astfel:

         Function  Nume_functie (lista_param_formali) 
          declaratii_variabile_locale
          instructiuni
          Nume_functie = valoare
         End Function 
    

        Prima linie reprezinta antetul functiei, īn care se indica: numele functiei, lista parametrilor formali si tipul lor si tipul valorii returnate . La fel ca un operand sau o expresie, o functie are un tip, care este dat de tipul valorii returnate de functie īn functia apelanta.
        lista_param_formali (īncadrata īntre paranteze rotunde) consta īntr-o lista (enumerare) care contine tipul si identificatorul fiecarui parametru de intrare, despartite prin virgula.
        Corpul functiei este un bloc, care implementeaza algoritmul de calcul folosit de catre functie. Īn corpul functiei apar (īn orice ordine) declaratii pentru variabilele locale si instructiuni. Pentru intoarcerea valorii se foloseste instructiunea return valoare. La executie, la īntālnirea acestei instructiuni, se revine īn functia apelanta.

        Argumentele functiei transmit valori unei functii apelate.Valoarea returnata se poat folosi pentru a transmite valori functiei apelante.

  • Returnarea valorilor dintr-o functie.

    Aplicatii care utilizeaza functii definite de utilizator
        In pagina grafica "func_00" plasam urmatoarele obiecte:
        Standard Objects -- Static Text
        2 elemente de tipul Controls -- Activx Controls -- Wincc Slider Control
           - se completeaza la ambele slidere Events -- Object Events -- Change cu urmatoarea procedura:

    Sub Change(ByVal Item,  ByVal Position)           
    Dim objTxt
    Set objTxt = ScreenItems("Static Text1")
    Dim sld1
    Set sld1 = ScreenItems("Control1")
    Dim sld2
    Set sld2 = ScreenItems("Control2")
    objTxt.Text=power(sld1.Position,sld2.Position)
    End Sub
    


       Vom integra functia de jos in Global -- Script --Project Module

    Function power(Byval u,i)
    	Dim p
    	p=u*i
    	power=p
    End Function
    




    5. Tablouri de elemente


        Variabilele utilizate pana acum puteau contine o singura valoare. De multe ori e nevoie sa folosim variabile care pot stoca mai multe valori. Cu alte cuvinte se simte nevoia utilizarii tablourilor. Un tablou permite folosirea unei singure variabile pentru a stoca mai multe valori. Valorile sunt stocate la adrese consecutive cu alte cuvinte, la indecsi consecutivi incepand cu 0 . Utilizarea tablourilor ar un mare avantaj, care consta in posibilitatea utilizarii instructiunilor repetitive pentru a relucra toate valorile stocate in tablouri. Din acest motiv, tablourile mai sunt numite si "masive de date"

  • Declararea unui tablou

        Un tablou este similar cu o variabila, deci el trebuie declarat inainte de a putea fi folosit.

     Dim  nume_tablou(nr_elemente)
    


         Toate valorile dintr-un tablou trebuie sa fie de acelasi tip.

    Aplicatii care utilizeaza tablouri
        Sa realizam o aplicatie care genereaza aleator 5 numere dupa care le afiseaza. Numerele vor fi memorate intr-un tablou dupa care vor fi afisate.
        In pagina grafica "matr_01" plasam urmatoarele obiecte:
        Windows Objects -- Button
           - se seteaza Properties -- Font -- Text=Start
           - se completeaza Events -- Mouse -- Mouse Action cu urmatoarea procedura:

    Sub OnClick(Byval Item) 
    
    	Dim i 
    	Dim numere(5)
    	Randomize			' Initializare generator numere aleatoare
    	For i=0 To 4
     		numere(i) = Int((90 * Rnd) + 1)	' Generare numar aleator intre 0-90.
    	Next
    		HMIRuntime.Trace "Numerele sunt:  " & vbCrLf
    	For i=0 To 4
     		HMIRuntime.Trace "numere("& i & ")=" & numere(i) & vbCrLf 
    	Next
    
    End Sub
    


    Reluam aplicatia aplicatia "for_01_01" si realizam aplicatia "matr_02" in care nu vom mai construi numele figurii, vom realiza un vector cu denumirile figurilor geometrice astfel:

    Sub OnClick(Byval Item)  
    	Dim figuri(11)
    	figuri(0)=""
    	figuri(1)="Rectangle1"
    	figuri(2)="Rectangle2"
    	figuri(3)="Rectangle3"
    	figuri(4)="Rectangle4"
    	figuri(5)="Rectangle5"
    	figuri(6)="Rectangle6"
    	figuri(7)="Rectangle7"
    	figuri(8)="Rectangle8"
    	figuri(9)="Rectangle9"
    	figuri(10)="Rectangle10" 
    	Dim x
    	Dim i
    	Dim v_bar
    	For i=1 To 10
    		Set v_bar = ScreenItems(figuri(i))
    		x=100*Rnd()
    		v_bar.FillingIndex=x
    	Next
    End Sub