CoDeSys
Siemens S7-1200 viide Siemens LOGO! viide Automatiseerimise viide Mehhatroonikaseadmete viide Pneumoautomaatika viide

Programmi juhtimisfunktsioonid

PLC programmide teostamisel tuleb sageli loobuda programmi samm-sammulisest täitmisest ja täita ka alternatiivseid programmiosasid. See saavutatakse hüpete ja tsüklite kasutamisega mingis POU-s või opereerides erinevate POU-dega. Funktsioonide ja POU-de tingimuslik käivitamine või programmi alternatiivne hargnemine viib samuti programmi mittelineaarsele täitmisele [viide].

Hüppefunktsioonid

Hüppefunktsioonidega saab programmi täitmist suunata ühest programmiosast teise. Standardi IEC 61131 kohaselt kirjeldatakse hüpet programmis käsuga JMP ja sellega seotud sihtkoha märgisega. Hüppeid saab teostada programmis tingimusteta või tingimuslikult.

Tabelis 7.1 on esitatud CoDeSys hüppekäsud LD ja ST keeles. LD ja FBD keeles kasutatakse ikooni JMP hüppe koha tegemiseks ja ikooni LABLE kasutatakse hüppe sihtkoha (märgise) loomiseks mingisse segmenti.

LD käsk (operatsioon) ST Kommentaar
JMP JMP M_01; Tingimuseta hüpe, siit hüpatakse alati mingisse kohta
JMP IF Sisend1 THEN
    JMP M_01;
END_IF;
Hüpe, kui sisendmuutuja Sisend1 omab loogilist 1
JMP IF NOT (Sisend1) THEN
    JMP M_01;
END_IF;
Hüpe, kui sisendmuutuja Sisend1 omab loogilist 0
Sihtkoht M_01: Valjund1 := 1; Hüppe sihtkoht, mis kirjutatakse selleks ettenähtud kohta. ST keeles kirjutatakse sihtkoha märgis mingi käsu algusesse

Programmi koostamisel tähistatakse hüppe sihti sihtkoha märgisega. Märgis võib koosneda erinevatest sümbolitest. See peab olema unikaalne ehk siis ei tohi olla kasutusel muutujana või mingi muu nimena (funktsioon). Märgise juures tuleb arvestada suurte ja väikeste tähtedega. Hüppe sihtkoha märgis kirjutatakse ST keeles hüppekäsu järele ja LD keeles musta kolmnurga taha. ST keeles sisestatakse hüppe sihtkoha märgis programmirea algusse, millele järgneb koolon, nt M_01: Valjund1 := 1;. LD keeles tuleb teha ikooni LABLE abil eraldi märgise koht segmendis, kuhu kirjutatakse hüppe sihtkoha märgis. Sihtkoha märgis saab programmis olla ainult ühes kohas, kuid sinna saab hüpata ühe POU erinevatest kohtadest. Antud POU-s, kus on märgis kasutusel, saab hüpata nii edasi kui ka tagasi. Sihtkoha märgised võivad erinevates POU-des kattuda, kuna hüpped toimuvad ainult selles POU-s kus kasutatakse hüppe käske.

Joonisel 7.1 on kirjutatud LD ja ST keeles programm, kus on kasutatud hüppe käske. Muutujale TArv1 omistatakse muutuja SArv1 väärtus kui muutuja Sisend1 signaal on loogiline 1. Kui aga muutuja Sisend1 signaal on loogiline 0, siis omistatakse muutujale TArv1 väärtus 0.

LD ST
JMP näide LD //Network 1: Hüppe kui muutuja Sisend1 ei ole aktiivne
IF NOT(Sisend1) THEN
    JMP M001;
END_IF;

//Network 2: Muutuja SArv1 väärtus antakse muutujale TArv1
TArv1 := SArv1;
JMP M002;

//Network 3: Muutujal TArv1 antakse väärtuseks 0
M001: TArv1 := 0;

//Network 4: Programmi lõpp
M002: RETURN;

Oluline on teada, et kui mingist programmi osast hüpatakse üle (ei täideta), siis selles osas olevate muutujate väärtused jäävad sellisteks, nagu need määrati viimasel programmi osa täitmisel. See kehtib ka siis, kui muutuja väärtuse määramise tingimus on muutunud.

POU aktiveerimine

CoDeSys kasutatakse FBD ja LD keeles POU-de (PRG, FB ja FUN) aktiveerimiskäsu kujutamiseks ristkülikut (joonis 7.2). Ristküliku sees on esitatud POU üldnimi ja tema siirdeparameetrid (sisendmuutujad, mis võtavad vastu POU-sse antavad väärtused; väljundmuutujad, mis väljastavad väärtusi POU-st; jne). Osade POU-de puhul kirjutatakse kasti kohale muutuja nimi, mis on seotud vastava POU-ga. Selleks POU-ks on FB. FB on veel eriline selle poolest, et tema siirdeparameetreid (välja arvatud VAR_IN_OUT osas defineeritud muutujad) ei ole vaja siduda muutujatega, need võib jätta tühjaks. FB avamisel säilitavad tema siirdeparameetrid oma esialgsed väärtused (FUN omad ei tee seda). Rohkem infot POU-de kohta leiab pt "Programmi ülesehituse plokk". Rohkem infot siirdeparameetrite ehk muutujate deklareerimise kohta leiab osast "Muutujate deklareerimine sümbolite abil".

FBD
FB FBD FUN FBD
ST
//FB muutuja deklareerimine POU muutujate deklaratsioonialas
FB_1 : FB;

//FB-s oleva programmi kutsung
FB_1 (SISEND := Sisend1, VALJUND => Valjund1, SISSE_VALJA := Mem1);

//FUN-s oleva programmi kutsung
FUN (SISEND := Sisend1, VALJUND => Valjund1, SISSE_VALJA := Mem1);

POU-de lisamiseks FBD või LD keeles koostatud programmis tuleb kasutada ikoone EN_ENO, EN_ENO, En_ENO? või EN_ENO. Esimese kahe ikooni puhul tuleb valida funktsioonide ja POU-de nimekirjast (joonis 7.3) sobiv POU. Teise kahe puhul tuleb kirjutada sobiva POU nimi kasti sisse. Lõpptulemus peaks olema midagi sellist nagu kujutatud joonisel 7.2, kui POU-de juures kasutatakse funktsioonide aktiveerimissignaale (kasutatud esimest või kolmandat ikooni). Aktiveerimissignaalide kohta leiab rohkem infot peatükist "Funktsioonide ja funktsioonplokkide aktiveerimissignaalid".

Joonis 7.3.

ST keeles tuleb kirjutada POU nimi ning sulgude sisse siirdeparameetrid ja neile vastavad muutujate nimed. Selle võib jätta tegemata kui programmi koostamisel on kasutatud globaalseid muutujaid, mis võimaldavad kanda andmeid edasi ühelt POU-lt teisele. FB aktiveerimiseks tuleb ST keeles kasutada sellega seotud muutuja nime, mis on nt deklareeritud POU muutujate deklaratsioonialas. Kui FB puhul on mingid siirdeparameetrid, millega ei soovita siduda muutujaid, siis ei ole neid vaja lisada ST keelde või kommenteerida need (* *) abil välja. FUN puhul tuleb kõik siirdeparameetrid siduda muutujatega. Vastasel juhul ei pruugi FUN plokki kirjutatud programm töötada.

Oluline on jätta meelde, et PLC töötamise ajal (CPU on TÖÖ režiimis) peavad kõik programmis aktiveeritavad ja töötavad POU-d olema laetud PLC-sse. Nende puudumisel katkestatakse programmi täitmine ja CPU läheb STOPP režiimi.

POU töö lõpetamine

CoDeSys kasutab POU-des oleva programmi täitmise tingimuseta või tingimuslikuks katkestamiseks käsku RETURN. See lõpetab POU-s oleva programmi täitmise ja naaseb programmi täitmisel tagasi POU-sse, millest aktiveeriti nüüd töötamise lõpetanud POU, ning programmi täitmist jätkatakse vanas POU-s pooleli jäänud kohast või alustatakse otsast peale.

Joonisel 7.4 on esitatud POU töö lõpetamise funktsioon LD ja ST keeles. See võimaldab katkestada POU oleva programmi täitmist enneaegselt. RETURN funktsiooni puhul katkestatakse programmi täitmine LD programmis, kui funktsiooni sissetulev signaal on loogiline 1. Kui RETURN funktsioonile ei panda mingit tingimust ette, siis katkestab see kogu aeg programmi täimist antud kohas POU-s.

LD ST
RETURN näide LD //POU-s oleva programmi töö lõpetamine tingimuse alusel
IF Sisend1 THEN
    RETURN;
END_IF;

//POU-s oleva programme töö lõpetamine
RETURN;
RETURN näide LD

FBD ja LD keeles saab lisada RETURN käsu programmi ikooni RETURN abil.

Joonisel 7.5 on esitatud PLC näidisprogramm ST keeles. Programm on jagatud ära erinevate POU-de vahel. Programmis on kasutatud hüppe-, funktsioonide aktiveerimis- ja nende töö lõpetamisfunktsioone. Algul aktiveeritakse PLC_PRG kaudu POU FB1 ja selle sees olevat programmi täidetakse iga töötsükkel. POU-s FB1 oleva programmi täitmine katkestatakse käsu RETURN poolt enneaegselt kui muutuja Sisend2 signaal on loogiline 1. Kui RETURN käsk ei katkesta POU FB1 sees olevat programmi täitmist, siis täidetakse (aktiveeritakse) ka POU FUN1 sees olevat programmi sinnamaani kuni jõutakse käsuni RETURN. See katkestab alati (tingimusteta) POU-s FUN1 oleva programmi täitmise enne kui jõutakse programmi lõppu.

Joonis 7.5.

POU-d FUN2 ja FB3 aktiveeritakse, kui nende aktiveerimistingimused on täidetud (joonis 7.5). See tähendab, et FUN2-s oleva programmi täitmise alustamiseks (funktsiooni aktiveerimiseks) peab muutuja Sisend1 signaal olema loogiline 1 (seda kontrollitakse PLC_PRG-s) ja FB3 puhul peab muutuja Sisend3 signaal olema loogiline 0 (seda kontrollitakse FUN2 koodis). FB3-s oleva programmi täitmine katkestatakse käsu RETURN poolt, kui eespool ei teostata hüpet (JMP M001). See tähendab, et IF tingimus ei ole täidetud (muutuja Sisend4 signaal on loogiline 0) ja plokis FB3 oleva programmi täitmine lõpeb enne POU lõppu jõudmist.

Lisafunktsioonid ST keeles programmi juhtimiseks

Järgmised ST keele käsud (laused) mõjutavad ka PLC programmi täitmise struktuuri, muutes selle täitmise mittelineaarseks.

CASE lause

CASE lause ülesehituse CASE lause näide
CASE (*muutuja*) OF
(*Väärtus 1*):
    (*Programmilõik 1*);
(*Väärtus 2, Väärtus 3*):
    (*Programmilõik 2*);
(*Väärtus 4 .. Väärtus5*):
    (*Programmilõik 3*);
ELSE
    (*Programmilõik 4*);
END_CASE;
CASE SArv1 OF
1:
    Valjund1 := 0;
    Valjund2 := 0;
2, 3:
    Valjund1 := 1;
    Valjund2 := 0;
4..9:
    Valjund1 := 0;
    Valjund2 := 1;
ELSE
    Valjund1 := 1;
    Valjund2 := 1;
    SArv1 := 0;
END_CASE;

CASE lause (joonis 7.6) on tingimuslause, mida kasutatakse, kui muutuja eri väärtuste puhul soovitakse teha erinevaid tegevusi või täita erinevaid programmilõike. Muutuja võimalikud väärtused saab anda ette, kas üksiku väärtusena või mingi vahemikuna. Iga väärtuse juures olev programmilõik võib koosneda rohkem kui ühest tegevusest (programmi reast).

Joonisel 7.6 parempoolses koodis kontrollitakse muutuja SArv1 väärtust. Vastavalt tulemusele omistatakse muutujatele Valjund1 ja Valjund2 mingid loogilised väärtused. Kui SArv1 väärtus on 0, siis omistatakse mõlemale muutujale loogiline 1. Kui SArv1 väärtus on 2 või 3, siis aktiveeritakse ainult muutuja Valjund1. Kui SArv1 väärtus jääb vahemikku 4 kuni 9 (mõlemad piirväärtused kaasa arvatud) vahele, siis aktiveeritakse ainult muutuja Valjund2. Kui muutuja SArv1 väärtus ei lange kokku eelpool toodud väärtustega, siis aktiveeritakse mõlemad väljundid ning muutujale SArv1 antakse väärtuseks 0. Ehk siis täidetakse ELSE järel olevat programmilõiku.

CASE lause kasutamisel on soovitatav vaadata, et väärtused (või nende vahemikud) ei kattuks. Vastasel juhul täidetakse programmilõik, mille tingimus (võimalik väärtus) paikneb eespool. Alati tuleks kasutada ELSE osa, kui muutuja väärtus väljub eelpool määratletud tingimustest (väärtustest, nende vahemikest).

CASE lause sisse saab panna ka teist CASE lausest nagu seda saab teha IF tingimuslauses.

Kordustsüklid

FOR kordustsükkel on kindla korduste arvuga tsükkel, kus soovitakse mingit programmilõiku korrata teatud arv kordi. Korduse loendamine toimub tsüklikäsu enda sees. Toimunud korduste loendamiseks kasutatakse muutujat, mis on lisatud FOR tsükli päisesse. Siin peab teadma, mitu korda soovitakse programmilõiku korrata. Tsükli kordamine toimub nii kaua kuni ületatakse tsükli lõppväärtus.

Joonisel 7.7 esitatud programmi lõigu abil nullitakse massiivi Mass1 väärtused. Seda tehakse nii kaua kuni tsüklimuutuja väärtus on suurem kui 10 (tsükli lõppväärtus). Tsükli loendamist alustatakse nullist (algväärtust) ja suurendatakse ühe (sammu väärtuse) võrra. Sammu osa ({} sees ole osa) võib jätta välja, kui tsüklimuutuja väärtust suurendatakse 1 võrra. Antud näites kasutatakse tsüklimuutujat Index väärtust massiivi elemendi koha viitamiseks.

FOR kordustsükli ülesehituse
FOR (*Kordustsükli loendamise tsüklimuutuja*) := (*Algväärtus*) TO (*Lõppväärtus*) {BY (*Samm*)} DO
    (*Korratav programmilõik*)
END_FOR;
FOR kordustsükli näide
FOR Index := 0 TO 10 BY 1 DO
    Mass1[Index] := 0;
END_FOR;

FOR tsükli kõrval on olemas WHILE-DO ja REPEAT-UNTIL kordustsüklid (joonis 7.8), mis töötavad mingi tingimuse kontrollimisel. Tingimuseks kasutatakse loogikatehteid, mille lõplikuks tulemuseks saab olla kas ainult TÕENE (loogiline 1) või VÄÄR (loogiline 0). WHILE kordustsükkel töötab niikaua kuni kordamise tingimus saab valeks (VÄÄR). REPEAT kordus töötab kuni kordamise tingimus saab tõeseks (TÕENE).

WHILE kordustsükli ülesehituse REPEAT kordustsükli ülesehituse
WHILE (*Korduse alustamise tingimus*) DO
    (*Korratav programmilõik*);
END_WHILE;
REPEAT
    (*Korratav programmilõik*);
UNTIL (*Korduse lõpetamise tingimus*)
END_REPEAT;

WHILE kordustsüklit nimetatakse alustamistingimuse kontrolliga ehk eelkontrolliga tsükliks. Seetõttu, kuna enne esimese (ja enne iga järgmise) korduse algust kontrollitakse tsükli kordamise alustamise tingimust. Käskude DO ja END_WHILE vahele jäävat programmilõiku ei täideta kui kontrollitav tingimus on juba esimesel kordusel VÄÄR.

REPEAT kordustsüklit kutsutakse järelkontrolliga tsükliks, kuna alles korduse lõpus kontrollitakse tsükli kordamise lõpetamise tingimust. See tähendab, et kui korduse lõpetamise tingimus on juba alguses TÕENE, siis täidetakse käskude REPEAT ja UNTIL vahele jäävat programmilõiku ikkagi üks kord. Kuid teist korda ei korrata.

WHILE kordustsükli näide REPEAT kordustsükli näide
WHILE Index <= 10 DO
    Mass1[Index] := 0;
    Index := Index + 1;
END_WHILE;
REPEAT
    Mass1[Index] := 0;
    Index := Index + 1;
UNTIL Index > 10
END_REPEAT;

Joonisel 7.9 on tehtud sama programm, mis joonisel 7.7. Ehk massiivi elementide väärtuste nullimine. Mõlemad kordused töötavad niikaua kuni muutuja Index väärtus saab 11. Esimese puhul muutub korduse tingimus valeks ja teise puhul tõeseks.

PLC programmi koostamisel ei ole soovitav kasutada WHILE ja REPEAT kordustsükleid, kuna PLC võib jääda nendega koostatud kordusi täitma lõpmatuseni, ilma nendest välja minemata. Selle vältimiseks tuleks nende sisse ehitada mingisugune korduse katkestamine võimalus, mis kasutab käsku EXIT.

Kordustsükleid on võimalik panna üksteise sisse nagu CASE ja IF tingimuslauseid.

CONTINUE

FOR Index := 0 TO 10 DO
    IF Mass1[Index] >= 99 THEN
        CONTINUE;
    END_IF;
    Mass1[Index] := Mass1[Index] + 1;
END_FOR;

CONTINUE käsk võimaldab jätta vahele mingi kordustsükli osa täitmist. See tähendab, et kui CONTINUE käsk aktiveeritakse, siis hüpatakse PLC programmis kordustsükli algusesse (nt FOR osa juurde) tagasi ja PLC jätkab järgmise kordustsükli täitmisega. Kogu programmilõik, mis tuleb peale CONTINUE käsku, jäetakse antud kordustsüklis täitmata. CONTINUE käsku saab kasutada ainult kordustsüklite (FOR, WHILE, REPEAT) sees.

Joonisel 7.10 on teostatud FOR tsükkel koos CONTINUE käsuga. Siin suurendatakse FOR kordustsükli abil massiivis Mass1 olevate elementide väärtusi 1 võrra. Kui massiivi Mass1 mingi elemendi väärtuseks on saavutanud 99 või sellest veel suurem, siis hüpatakse käsu CONTINUE abil kordustsükli algusesse tagasi. PLC programm jätkab järgmise massiivi Mass1 elemendi väärtuse suurendamisega, kui see ei ole ületanud lubatud piiri (väärtus ei tohi olla suurem kui 99).

CONTINUE käsk töötab ainult selle korduse juures, mille sees seda kasutatakse. See tähendab, et iga erineva korduse jaoks on vaja kasutada eraldi CONTINUE käsku, mis asub ainult selle korduse sees (mitte alamkorduse sees). Kui ühe korduse sisse koondada mitu CONTINUE käsku, siis need töötavad ainult selle kordusega.

EXIT

FOR Index := 0 TO 10 DO
    IF Mass1[Index] = 0 THEN
        EXIT;
    END_IF;
    Mass1[Index] := 0;
END_FOR;

EXIT käsk võimaldab katkestada mingi pooleli oleva kordustsükli (FOR, WHILE, REPEAT) täitmist. Selle käsu aktiveerumisel hüppab PLC kordustsüklist välja ja jätkab kordustsükli järel oleva programmi täitmist. Ka EXIT käsk töötab ainult selle korduse juures, mille sees seda kasutatakse ehk siis selle juures, mis on temale kõige lähemal.

Joonisel 7.11 on teostatud FOR tsükkel koos EXIT käsuga. Siin omistatakse massiivi Mass1 elementidele väärtuseks null ehk nende väärtused nullitakse. EXIT käsk lõpetab FOR kordustsükli täitmise enneaegselt kui massiivi Mass1 mingi elemendi väärtus on juba 0. See tähendab et alates sellest massiivi Mass1 elemendist (mille väärtus on juba 0) ei nullita ülejäänud alles jäänud elementide väärtusi. Need jäävad nii nagu need olid enne FOR kordust.

Creative Commons Licence
"CoDeSys" is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License .