Programarea PLC-urilor SIMATIC S7-1200/1500
  • Obiective
  • Organizarea sarcinilor de lucru
        Aplicatiile SCADA sunt rulate in general de serverele SCADA sau de terminalele HMI. In aplicatiile Siemens SCADA aplicatiile HMI sunt dezvoltate pe baza scripturilor VB Scripts (Visual Basic Scripts). In cazul aplicatiilor SCADA care necesita pe langa monitorizarea diverselor procese, comanda si controlul acestora, pentru a creste performanta intregului sistem SCADA, functiile de comanda si control ale proceselor trebuie transferate spre PLC-uri(Programmable Logic Controller).


        Mediul de dezvoltare SCADA TIA-Portal include pe langa instrumentele de dezvoltare HMI-uri, elemente pentru programarea PLC-urilor de tipul SIMATIC S7-1200/1500.

    1.Elemente de programare SCL

         SCL (Structured Control Language) inclus TIA Portal este un limbaj de programare de nivel inalt bazat pe limbajul de programare Pascal.
        Vom dezvolta in continuare proiectul numit   Prg_plc_000  in cadrul caruia vom realiza diverse screen-uri in care vom folosi facilitatile de programarea PLC-urilor de tipul SIMATIC S7-1200/1500 oferite de limbajul SCL.


         SCL este un limbaj bazat pe:     Comentarii

        // Pentru o singura linie de comentariu
        (*
        Mai multe linii de comentariu
        *)

        Definirea variabilelor

        In SCL variabilele se definesc prin intermediul Tag-urilor, de tip (I sau Q) pentru variabile de intrare sau iesire si de tipul M daca e o variabila generala.


        Daca e o variabila generala trebuie stabilit tipul acesteia( Int, Real..)

        Crearea functiilor

        Program blocks --> Add new block --> Function -->SCL


        Dupa ce s-a creat functia, cu dublu click pe numele functiei, se editeaza continutul functiei.



    2. Instructiuni

        Instructiunea IF :

        Instructiunea IF se foloseste pentru a selecta executia unei instructiuni (sau a unui grup de instructiuni) functie de valoarea logica a unei expresii relationale

        Formatul instructiunii:
        Instructiunea IF are urmatoarele formate:

        IF expresie relationala THEN
          instructiune(instructiuni)
        END_IF

        sau

        IF expresie relationala THEN
          instructiune(instructiuni)
        ELSE
          instructiune(instructiuni)
        END_IF

        Instructiunea CASE :

        CASE "variabila" OF
          0:
          declaratii;
          1:
          declaratii;
          .
          .
          .
          n:
          declaratii;
        END_CASE;

    Aplicatii care utilizeaza instructiuni decizionale
        Ne propunem, in cadrul proiectului "Prg_plc_000" sa definim un PLC tag de tip int tag numit "Contor"



        Vom defini in cadrul proiectului "Prg_plc_000" functia SCL in: Program blocks -->"Incr_cnt".

    "Contor" := "Contor" + 1;
    IF "Contor" > 100 THEN
        "Contor" := 0;
        ;
    END_IF;
    

        Pentru a fi lansata in executie functia "Incr_cnt", trebuie apelata din functia "Main" functie cu care se incepe rularea programului in PLC. Includerea apelului functiei "Incr_cnt" in functa "Main" se face prin operatia de Click pe functia "Incr_cnt" si Drag pe "Network1" a functiei "Main".

         Dupa compilarea si transferarea programului in PLC (butonul "Compile" si butonul "Download to device"), functia "Main" se lanseaza automat in executie. Functia "Main" apeleaza la randul ei functia "Incr_cnt".
        In cazul ca nu dispunem de PLC, rularea programului poate fi simulata din butonul "Stat simulation" din meniul principal.



        Selectand PLC Tags-->Show all tags si apasand butonul "Monitor all" (incercuit cu rosu), putem vedea in mod dinamic schimbarea valorii acestui tag.



        Valorile sunt afisate la interval de 0.1 secunde iar modificarea valorii acestu tag se face cu o viteza mult mai mare, deci vom vedea numere aleatoare intre 0 si 100, nu vom vedea numere afisate in ordine de la 0 la 100.
        Am putea sa realizam un screen numit "Contor_01" in care sa afisam grafic valoarea contorului. Plasam pe acest screen un obiect "Trend view" si un obiect "Slider" carora le atribuim PLC tag-ul "Contor".



        Dupa atribuirea PLC tag-ul "Contor" acestor obiecte, acest tag apare automat in HMI tags



        Modificam Acquisition cyle la 100 ms, apasam "Start simulation" si obtinem:



        Pentru a realiza un contor care se incrementeaza numai la un anumit interval ( de ex 100ms), vom crea un nou block "Cyclic interrupt" si un nou tag "Cyclic_cnt".


       Continutul acestei functii fiind:

    "Cyclic_cnt" := "Cyclic_cnt" + 1;
    IF "Cyclic_cnt" > 100 THEN
        "Cyclic_cnt" := 0;
        ;
    END_IF;
    
    




        Daca introducem PLC tags: "Alfa" si "Val_sin" am putea sa afisam o forma sinusoidala.
       Completam functia "Cyclic interrupt" cu:

    "Alfa" := "Alfa" + 0.1;
    IF "Alfa" > 100 THEN
        "Alfa" := 0;
    END_IF;
    
    "Val_sin" := 50 * (1 - SIN("Alfa"));


        Creem Screen-ul "Contor_03" in care atrbuim obiectului "Trend view" tag-urile "Contor" "Val_sin", rulam din nou aplicatia si obtinem:



        Vom folosi in continuare instructiunea CASE pentru a realiza diverse aplicatii in care vom folosi 10 LED-uri fizice plasate pe PLC cat si 10 LED-uri simulate,plasate pe Screen-ul "Leduri_01".


        Vom defini deci 10 TAG-uri PLC de tip bool-ean, cu numele C00...C10 avand adresele %Q0.0...%Q0.7,%Q1.0,%Q1.1 si o variabila k de tip int.


        Pentru simularea LED-urilor, vom plasa pe Screen-ul "Leduri_01" 10 obiecte "Rectangle" cu numele "Rectangle_1"... "Rectangle_10". Fiecarui obiect "Rectangle" ii adaugam o animatie "Apperance" careia ii setam PLC Tag C01...C10


        Aplictiile pe care le vom realiza in continuare, vor fi realizate in PLC prin intermediul functiilor SCL. In HMI nu vom mai realiza Script-uri, toata logica aplicatiei fiind inclusa in functiile scrise in SCL.
        Prima aplicatie numita "Scan" va simula deplasarea unui singur LED de la staga la dreapta. Continutul functiei "Cyclic interrupt" va fi:

         "k" := "k" + 1;
        IF "k" > 10 THEN
            "k" := 0;
        END_IF;
        CASE "k" OF
            0:
                "C17" := FALSE;
            1:
                "C17" := FALSE;
                "C00" := TRUE;
            2:
                "C00" := FALSE;
                "C01" := TRUE;
            3:
                "C01" := FALSE;
                "C02" := TRUE;
            4:
                "C02" := FALSE;
                "C03" := TRUE;
            5:
                "C03" := FALSE;
                "C04" := TRUE;
            6:
                "C04" := FALSE;
                "C05" := TRUE;
            7:
                "C05" := FALSE;
                "C06" := TRUE;
            8:
                "C06" := FALSE;
                "C07" := TRUE;
            9:
                "C07" := FALSE;
                "C16" := TRUE;
            10:
                "C16" := FALSE;
                "C17" := TRUE;
            ELSE
                "C00" := FALSE;
                "C17" := FALSE;
        END_CASE;

        Se lanseaza comanda "Download to device" dupa care se poate observa modul cum ruleaza acest program, fie prin vizualizarea PLC-tags si activarea obtiunii "Monitor all" fie prin afisarea HMI-uli "Leduri_01"



        Instructiunea FOR :

        FOR contor=contor_start TO contor_stop DO
          declaratii
          .
          .
          .
          declaratii
        END_FOR;

        Vom folosi in continuare Screen-ul "Leduri_01" cu cele 10 LED-uri pentru a afisa PLC tag-ul k in format binar pe cele 10 LED-uri. Pentru a realiza conversia int->binar se vor face operatii repetate de impartire cu 2 si vom folosi deci instructiunea repetitiva FOR. Avem nevoie de variabilele temporare j si b pe care le vom defini in sectiunea "temp".


        Apelarea tag-urilor in program se face folosind " " iar apelarea variabilelor temporare se face folosind simbolul # astfel ontinutul functiei "Cyclic interrupt" fiind:

        "k" := REAL_TO_INT("Alfa" * 10);
        FOR #j := 0 TO 9 DO
            IF ("k" MOD 2) = 0 THEN
                #b := FALSE;
            ELSE
                #b :=TRUE ;
            END_IF;
            "k" :=REAL_TO_INT("k" / 2) ;
            CASE #j OF
                0:
                    "C17" := #b;
                1:
                    "C16" := #b;
                2:
                    "C07" := #b;
                3:
                    "C06" := #b;
                4:
                    "C05" := #b;
                5:
                    "C04" := #b;
                6:
                    "C03" := #b;
                7:
                    "C02" := #b;
                8:
                    "C01" := #b;
                9:
                    "C00" := #b;
                ELSE
                    ;
            END_CASE;
            
            ;
        END_FOR;
    

        Se lanseaza comanda "Download to device" dupa care se poate observa modul cum ruleaza acest program, fie prin vizualizarea PLC-tags si activarea obtiunii "Monitor all" fie prin afisarea HMI-uli "Leduri_01"


        Instructiunea WHILE :

         WHILE expresie relationala DO
          declaratii;
          .
          .
          .
          declaratii;
        END_WHILE;

        Aplicatia anterioara poate fi rescrisa folosind instructiunea WHILE astfel:

        "k" := "k" + 1;
        IF "k" > 1000 THEN
            "k" := 0;
        END_IF;
        #j := 0;
        WHILE #j<10 DO
            IF ("k" MOD 2) = 0 THEN
                #b := FALSE;
            ELSE
                #b :=TRUE ;
            END_IF;
            "k" :=REAL_TO_INT("k" / 2) ;
            CASE #j OF
                0:
                    "C17" := #b;
                1:
                    "C16" := #b;
                2:
                    "C07" := #b;
                3:
                    "C06" := #b;
                4:
                    "C05" := #b;
                5:
                    "C04" := #b;
                6:
                    "C03" := #b;
                7:
                    "C02" := #b;
                8:
                    "C01" := #b;
                9:
                    "C00" := #b;
                ELSE
                    ;
            END_CASE;
            
            ;
         END_WHILE;
    

        Definirea si utilizarea tablourilor

        In SCL se pot defini tablouri numai ca variabile temporare. Mai jos este definita variabila "Matr_l" de tip Array of Bool.



        Utilizand acest tablou, vom simula un "Vu-metru".

        "k" :="k"+ 1;
        IF"k" > 10 THEN
            "k" := 1;
        END_IF;
        #j := 0;
        WHILE #j<10 DO
            IF "k" > #j THEN
                #Matr_l[#j] := TRUE;
            ELSE
                #Matr_l[#j] := FALSE;
            END_IF;
            #j := #j + 1;
        END_WHILE;
        "C17" := #Matr_l[0];
        "C16" := #Matr_l[1];
        "C07" := #Matr_l[2];
        "C06" := #Matr_l[3];
        "C05" := #Matr_l[4];
        "C04" := #Matr_l[5];
        "C03" := #Matr_l[6];
        "C02" := #Matr_l[7];
        "C01" := #Matr_l[8];
        "C00" := #Matr_l[9];
    
    

        Se lanseaza comanda "Download to device" dupa care se poate observa modul cum ruleaza acest program, fie prin vizualizarea PLC-tags si activarea obtiunii "Monitor all" fie prin afisarea HMI-uli "Leduri_01"



    
    


    3. Diverse aplicatii

    Utilizarea marimilor digitale

        In aceasta aplicatie vom utiliza:




    Utilizarea marimilor analogice

        In aceasta aplicatie vom utiliza:     Pentru intrarile analogice in domeniul este 0 -10v, valorile corespunzatoare fiind in domeniul 0-32000
        Pentru iesirile analogice in domeniul: -3200 +32000 valorile la iesire fiind in domeniul -10v +10v


    Multi I/O

        In aceasta aplicatie vom utiliza toate intrarile si iesirile:



    Rezumat


  • SCL (Structured Control Language)

        Instructiunea IF :

        Instructiunea IF se foloseste pentru a selecta executia unei instructiuni (sau a unui grup de instructiuni) functie de valoarea logica a unei expresii relationale

        Formatul instructiunii:
        Instructiunea IF are urmatoarele formate:

        IF expresie relationala THEN
          instructiune(instructiuni)
        END_IF

        sau

        IF expresie relationala THEN
          instructiune(instructiuni)
        ELSE
          instructiune(instructiuni)
        END_IF

        Instructiunea CASE :

        CASE "variabila" OF
          0:
          declaratii;
          1:
          declaratii;
          .
          .
          .
          n:
          declaratii;
        END_CASE;

        Instructiunea FOR :

        FOR contor=contor_start TO contor_stop DO
          declaratii
          .
          .
          .
          declaratii
        END_FOR;
        Instructiunea WHILE :

         WHILE expresie relationala DO
          declaratii;
          .
          .
          .
          declaratii;
        END_WHILE;

  • Rezultate asteptate
  • Termeni esentiali


  • Recomandari bibliografice

  • Link-uri utile


    Test de evaluare