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 hüppe koha tegemiseks ja ikooni kasutatakse hüppe sihtkoha (märgise) loomiseks mingisse segmenti.
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
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.
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".
POU-de lisamiseks FBD või LD keeles koostatud programmis tuleb kasutada ikoone , , või . 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".
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 |
---|---|
//POU-s oleva programmi töö lõpetamine tingimuse alusel
|
|
FBD ja LD keeles saab lisada RETURN käsu programmi ikooni 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.
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
|
CASE SArv1 OF
|
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
|
FOR kordustsükli näide |
FOR Index := 0 TO 10 BY 1 DO
|
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
|
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
|
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.