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
CASE
taha kirjutatud muutuja või avaldise väärtusele leidub allpool sobiv vaste, siis täidetakse sellele vastele järgnevad laused. Kui ühelegicase
võtmesõnale ei järgne muutuja või avaldise väärtusele vastavat väärtust, siis programmi täitmist jätkatakseELSE
võ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";