SCL keel
Üldiselt SCL keelest
Struktureeritud tekst (Structured Text - ST) on kõrgtasemeline programmeerimiskeel ülesannete juhtimiseks ja keeruliste matemaatiliste arvutuste tegemiseks. Tööstuse arenemise ja keerukamate lahenduste kasutuselevõtuga on seda laialdasemalt kasutama hakatud kõikjal, kus on vaja seadmeid liidestada teiste tööstusseadmete ja serveritega ning kasutada mitmeid erinevaid kommunikatsiooniprotokolle.
Võrdlus teiste PLC programmeerimiskeeltega
IL või STL
Siin on SCL keele eeliseks oluliselt parem arusaadavus ja jälgitavus inimesele - väga lühikesed (ridade arvult) ja selged programmilõigud ning võimalus kasutada programmi voo juhtimise elemente (If-else, for, while, case). Kui IL / STL koosneb enamasti väga algelistest instruktsioonidest, siis SCL pakub sellega võrreldes palju rohkem ja palju rohkemate võimalustega instruktsioone. See võib vähendada vajadust pidevalt samu asju uuesti kirjutada või võimaldab neid lühemalt kirjutada. Lisandunud võimaluste ja täiendava keerukusega tuleb mängu ka rohkem erinevaid andmetüüpe, sest erinevate instruktsioonide vaheliseks andmevahetuseks peavad nad keerukamatest andmetest ühte moodi aru saama.SCL puudusteks võib jällegi tuua vajaduse meelde jätta rohkem instruktsioone ja seda, kuidas neid kasutatakse ning vähem vabadust andmeid liigutada arvestamata erinevate andmetüüpidega.
Graafilised keeled nagu LAD või FBD
Siin on SCL keele eeliseks kompaktsus (enamasti mahub ekraanile oluliselt rohkem SCL koodi kui LAD või FBD diagrammi), dünaamilisus ja taaskasutatavus (lihtsam valida, kopeerida ja sobitada). SCL keele puuduseks on vajadus tunda keele süntaksit (ei saa asju lihtsalt omavahel kokku lohistada) ja vajadus teada instruktsioonide nimetusi ja nende parameetrite järjekorda.Olulisemad SCL keele elemendid ja instruktsioonid
Operaatorid (Operators)
Operaatorid ehk tehtemärgid on need, mis määravad ära, millist operatsiooni ehk tehet mingite väärtustega teha - olgu operandideks siis muutujad või konstandid. Operaatoritega saab enamasti teha lihtsamaid tehteid, mida arvutiprotsessorid otseselt ise teha suudavad, nagu aritmeetikatehted ja loogikatehted ning väärtuste üle kandmine.
- := - omistamine - ühele operandile teise operandi või avaldise tulemuse väärtuse omistamine,
 
Aritmeetikaoperaatorid:
- + - liitmine,
 - - - lahutamine,
 - * - korrutamine,
 - / - jagamine
 - MOD - jagamisjäägi leidmine
 
- NOT - "ei" loogika ehk inverteerimine
 - AND - "ning" loogika
 - OR - "või" loogika
 - XOR - välistav "või" loogika
 
- = - Võrdne. Tulemus on tõene, kui operandid on samade väärtustega ehk võrdsed. Mitte segi ajada omistusoperaatoriga.
 - <> - Mitte võrdne. Tulemus on tõene, kui kaks operandi ei ole samade väärtustega.
 - < - Väiksem kui. Tulemus on tõene, kui operand vasakul on väiksem kui operand paremal.
 - > - Suurem kui. Tulemus on tõene, kui operand vasakul on suurem kui operand paremal.
 - <= - Väiksem võrdne. Tulemus on tõene, kui operand vasakul on väiksem või võrdne operandiga paremal.
 - >= - Suurem võrdne. Tulemus on tõene, kui operand vasakul on suurem või võrdne operandiga paremal.
 
Avaldised ja omistuslaused
Avaldised määravad, mis tehted ja millises järjekorras on vaja väärtuse leidmiseks täita. Avaldised koosnevad operandidest, operaatoritest ehk tehtemäkidest, olenevalt keelest ka sulgudest, mis määravad tehtejärjekorra. Avaldise tulemuseks on alati mingisugune väärtus.
Omistuslause puhul esmalt arvutatakse kokku avaldis paremal ja seejärel omistatakse selle tulemus vasakul olevale muutujale.
							"Lamp1" := true;
						
					
							"pool_kiirus" := "kiirus" / 2;
						
					Tingimuslaused
 
						Tingimuslaused (Conditional statement)
						Tingimuslaused on juhtlaused, mis võimaldavad kirja panna, mis tingimustel 
						mingeid järgnevaid operatsioone tehakse kasutades selleks 
						võrdlusoperaatoreid.
                    
Võrdluslaused on liitlaused ja koosnevad kahest osast - tingimusosa (kirjeldab, mis tingimusel täiteosa täidetakse) ja täiteosa (kirjeldab mida tehakse, kui tingimus on täidetud). Selle pärast lõpetatakse semikooloniga eraldi nii tingimuslause kui selle sees olevad täitelaused. Täitelauseid ja teisi tingimuslauseid võib tingimuslause sees olla mitu.
- 
							
If-Then - Kui tingimus on täidetud, siis tehakse midagi.
IF "StartNupp" THEN
"Mootor" := true;
END_IF;
IF "pumpamine_aktiveeritud" AND "mahuti3_tase" > "mahuti3_seadepunkt" THEN
"pump" := true;
END_IF;
 - 
							
If-Then-Else - Kui tingimus on täidetud, siis tehakse midagi, kui ei ole, siis tehakse midagi muud.
IF "toorik_magasiinis" THEN
"indikaator_magasiin_tühi" := false;
ELSE
"indikaator_magasiin_tühi" := true;
"toorikute_arv_magasiinis" := 0;
END_IF; - 
							
If-Elsif - Kui tingimus on täidetud, siis tehakse midagi, kui ei ole, siis kontrollitakse järgmist tingimust. Kui järgmine tingimus on täidetud, siis tehakse midagi, kui ka see ei ole täidetud, kontrollitakse järgmist tingimust jne. Soovi korral saab else-if konstruktsioonile isada ka
else.Siinkohal on oluline ära märkida, et üleval pool asuval tingimusel on kõrgem prioriteet - kui üleval pool olev tingimus on täidetud, siis allpool olevaid tingimusi enam ei kontrollita.
IF "veetase" <= 10 THEN // mahuti tühi
"tasemeindikaator_tühi" := true;
"tasemeindikaator_normaalne" := false;
"tasemeindikaator_täis" := false;
ELSIF "veetase" < 90 THEN // veetase normaalne
"tasemeindikaator_tühi" := false;
"tasemeindikaator_normaalne" := true;
"tasemeindikaator_täis" := false;
ELSIF "veetase" >= 90 THEN // mahuti täis
"tasemeindikaator_tühi" := false;
"tasemeindikaator_normaalne" := false;
"tasemeindikaator_täis" := true;
END_IF; - 
							
							
Case Of - Kui
CASEtaha kirjutatud muutuja või avaldise väärtusele leidub allpool sobiv vaste, siis täidetakse sellele vastele järgnevad laused. Kui ühelegicasevõtmesõnale ei järgne muutuja või avaldise väärtusele vastavat väärtust, siis programmi täitmist jätkatakseELSEvõtmesõnast. Kui ka see puudub, siis jätkatakse pärastEND_CASE;oleva programmikoodi täitmist. Korraga saab täituda ainult üks variant.CASE "Kiirus_Reziim" OF
1:
"Kiirus_Konveier1" := 30;
2:
"Kiirus_Konveier1" := 50;
3:
"Kiirus_Konveier1" := 100;
ELSE:
"Kiirus_Konveier1" := 0;
END_CASE; 
Loendamine
Kuigi uuemates TIA Portali versioonides SCL keeles sarnaselt LAD ja FBD keeltega eraldi loendurid, siis ajalooliselt neid SCL keeles algselt ei olnud. Seda põhjusel, et loendamist on võrdlemisi lihtne teha ka kasutades numbrilise andmetüübiga muutujat, tingimuslauset ja liitmist või lahutamist (olenevalt kummas suunas me tahame loendada) ning see annab meile veidi rohkem paindlikust kui eraldi loenduri kasutamine.
Näide toorikute loendamisest, kus "toorik_pos1" muutuja, mis esindab positsioonis 1 oleva anduri kahendsignaali. See andur peab loendama mööduvaid toorikuid. "toorikute_arv" on mõne numbrilise, täisarvulise andmetüübiga (näiteks, USINT, UINT, INT jne) muutuja, kus hoitakse loendatud väärtust. "toorik_pos1_enne" on tõusva frondi tuvastuseks vajalik mälubitt, mis hoiab meeles mis oli "toorik_pos1" väärtuseks eelmise programmitsükli ajal (vt. Signaali väärtuse muutuse avastamine)
								IF "toorik_pos1" AND NOT "toorik_pos1_enne" THEN
								    "toorikute_arv" = "toorikute_arv" + 1;
								END_IF;
								
								"toorik_pos1_enne" := "toorik_pos1";
							
						Taimerid
Kuidas taimerid töötavad tuleb lugeda peatüki Taimerid ehk viivituse teostajad alt. Siin on ära toodud vaid mõned SCL keelele spetsiifilised näited taimerite kasutamise kohta. Eelnevalt tuleks kindlasti lugeda kuidas töötavad taimerid.
SCL keeles ei piisa vaid taimeri välja kirjutamisest vaid taimeri kasutamiseks on vaja ka taimeri andmeplokki. Selle automaatseks tekitamiseks tuleb taimeri funktsioon eelnevalt funktsioonide alt sisse lohistada.
- 	
						    
Sisselülitusviide, kus väljund on ära määratud juba taimeri välja kutsumisel.
"Taimer1".TON(IN:="Nupp", PT:=T#4s, Q=>"Lamp1");Siin on PLC väljund jäigalt taimeri väljundiga seotud - kui taimeri väljund on true, süüdatakse antud näites ka lamp ja niipea kui taimeri väljund on false, lamp ka kustub. Lampi ei saa muudel tingimustel sisse või välja lülitada, sest lambi väljundile antud muutuja kirjutatakse taimeri poolt alati üle.
 - 	
						    
Taimeri sisendis avaldise kasutamine keerukamate tingimuste jaoks
"Taimer1".TON(IN:="Nupp1" AND "Nupp2", PT:=T#4s, Q=>"Lamp1"); - 	
						    
Taimeri väljundi kasutamine eraldi tingimuslauses
IF "Taimer1".Q THEN
"Lamp1" := true;
END_IF;
"Taimer1".TON(IN:="Nupp", PT:=T#4s);Siin ei ole PLC väljund jäigalt taimeri väljundiga seotud - sisse ja väljalülitamise tingimused saavad olla erinevad. Taimeri väljundit saab kasutada mitmes erinevas tingimuslauses. On soovitav taimeri väljundit kasutavad tingimuslaused hoida taimeri enda välja kutsumise lausest üleval pool.
 - 	
						    
Taimeri sisendi mõjutamine läbi muutuja - koodis mitmes eri kohas
#Mälu := false;
IF "Andur1" THEN
#Mälu := true;
END_IF;
// Siin vahel on näiteks veel palju koodi
IF "Andur2" THEN
#Mälu := true;
END_IF;
IF "Taimer1".Q THEN
"Lamp1" := true;
END_IF;
"Taimer1".TON(IN:=#Mälu, PT:=T#4s);Siin kasutatakse koodi eri osades kahte erinevat andurit sisselülitusviite alustamiseks. Antud näites kui kumbki andur on järjest 4 sekundit aktiivne, siis lülitatakse Lamp1 sisse.
Selline kasutus on sobilik kui me tahame taimerit aktiveerida mitmel tingimusel ja hoida need tingimused ülejäänud koodi mõttes loogilisemas kohas, mitte tuua loogikat taimeri juurde. Näiteks kui on eesmärgiks anda veateade, kui mitme erineva anduri signaal liiga kauaks aktiivseks jääb.
 - 	
						    
Taimeri aja määramine väljaspool taimeri väljakutsumise lauset ilma eraldi muutuja tegemiseta
"Taimer1".PT := T#4s;
IF "Taimer1".Q THEN
"Lamp1" := true;
END_IF;
"Taimer1".TON(IN:="Nupp", PT:="Taimer1".PT);Taimeri PT parameetrile saab väärtuse anda nii konstandist kui muutujast. Kahjuks ei ole võimalik PT väärtuse määramist ära jätta ja kasutada väärtuse välises määramiseks otse taimeri andmeploki enda muutujat. Kui me siiski ei soovi eraldi muutujat teha ja ikkagi väliselt kasutada taimeri enda andmeploki muutujat, siis selle näitega saab sellest piirangust mööda andes PT väärtuseks selle juba olemasoleva väärtuse täites sellega tingimuse, et PT väärtus peab olema välja kutsumisel määratud.
 
                
                   
                   
                   
                   