Programmeeritavad kontrollerid
Euroopa struktuurfondide logo
Siemens LOGO! viide Automatiseerimise viide Mehhatroonikaseadmete viide Pneumoautomaatika viide

PLC programmeerimine

Standard IEC 61131-3

Kaasaegsed programmeerimisvahendid peavad vastama teatud nõudmistele, et nendega saaks luua odavaid ja piisava funktsionaalsusega tehnilisi rakendusi. Arendustöö efektiivsuse tõstmiseks erineva otstarbega automatiseeritud seadmete loomisel kasutatakse tihti erinevaid programmeerimiskeeli. Rakenduse programmide loomiseks ja kergeks muutmiseks on vajalikud sellised võimalused nagu rakendamiseelne (Offline) programmi testimine ja simuleerimine, programmi muutmine PLCs tehnilise rakenduse töö ajal (Online) ning PLCs oleva tegeliku programmi dokumenteerimine. PLCs olevad programmilõigud peavad pärast dokumenteerimist olema korduskasutatavad. Arendusel tuleks kasutada avatud (standardse) liidesega programmeerimissüsteemi. Rahvusvahelise standardi IEC 61131 kasutuselevõtmisega astuti suur samm edasi nende nõudmiste täitmisel. Selle standardi eesmärgiks on vähendada väljaõppekulusid, samuti suurte komplekssete programmisüsteemide loomise ja rakendamise kulusid.

Kuna see standard on väga detailirohke, siis kõik ettevõtted ei rakenda oma programmeerimissüsteemides kõiki selles standardis kirjeldatud võimalusi. Standard pakub välja võimaluse kirjeldada funktsionaalseid nõudmisi tabeli abil. Tootja peaks tabelis ära märkima need funktsioonid, mida nende tarkvaratööriist täidab ja missuguses ulatuses. Paljud PLC tootjad toetavad standardit, kuid nende tööriistade vastavus standardi nõudmistele kõigub laias ulatuses. Eri firmade programmeerimistööriistade täieliku vastavuse saavutamine ei ole kerge ülesanne.

Standardi kolmandas osas (IEC 61131-3) kirjeldatakse PLC programmeerimiskeeli. Tekst ühtlustab laialdaselt kasutatud programmeerimiskeeled üheks harmoniseeritud versiooniks pidades silmas ka tuleviku võimalusi [11].

Programmi ülesehituse plokk

Plokid IEC 61131-3 järgi

Standardis IEC 61131-3 nimetatakse funktsionaalseid plokke, millest moodustatakse kõik programmid ja projektid, nn programmi ülesehituse üksusteks (POU-deks). Tavapärases programmeerimiskeskkonnas vastavad nendele programmiplokid, juhtimisplokid, järjestusplokid ja funktsiooniplokid [12]. Standardi üks oluline eesmärk on piirata eri plokitüüpide mitmekesisust ja seega lihtsustada nende kasutamist. Standard määratleb järgmised POU tüübid: funktsioon (FUN), funktsiooniplokk (FB) ja programm (PROG).

Plokid STEP-7 järgi

Siemens lõi programmeerimisvahendi STEP 7 oma kontrolleriseeriate S7-300 ja S7-400 programmeerimiseks [9]. Seoses S7-1200 kontrolleri turule tulekuga tuli STEP 7-st välja uus ja ümberkirjutatud versioon 10 ja selle järg, 11, mille kohta käib ka see dokument. Programmeerimiskeskkonnas STEP 7 on POUd natuke teistmoodi koostatud. Funktsioon (FC) on samasugune kui standardis IEC 61131-3. Funktsioonplokiga seotakse aga eraldi (piirkonnas) salvestatud andmete plokk – (DB), mis standardis IEC61131-3 on defineeritud kui funktsiooniploki sisene osa. Programmi nime kasutamise asemel kasutab STEP 7 niinimetatud juhtplokke tähisega OB, mida aktiveeritakse tsükliliselt PLC operatsioonisüsteemi poolt ja mis moodustab liidese kasutaja programmi ja PLC operatsioonisüsteemi vahel.

Juhtplokk (OB) on POU , mis vastab mingile määratud sündmusele kontrolleris. OB sees oleva programmi kirjutab programmeerija, kuid see aktiveeritakse (hakatakse täitma) PLC operatsioonisüsteemi poolt teatud tingimuste korral. Nt iga CPU käivitamisel (lülitades TÖÖ režiimi) täidetakse OB 100 või kasutaja poolt määratud OB, numbriga >= 200. Seega reageerib kontrolleri operatsioonisüsteem kindlale sündmusele aktiveerides sellele vastava OB. Tabelis 3.1 on ära toodud erinevad OB tüübid vastavalt nende funktsionaalsusele ja aktiveerimise tingimustele. Kui varem sai kõiki katkestusi määrata ainult kindlate OB numbrite kaudu, siis nüüd alates Step 7 v10-st saab alates OB200 plokist ise sündmusi ja nende parameetreid määrata uue ploki loomisel.

Erilist tähelepanu väärib OB1, mida võib käsitleda, kui peaprogrammi. Seda hakatakse tsükliliselt täitma pärast kontrolleri töörežiimi viimist. OB1 on ainus POU, mis peab programmis kindlalt olemas olema. Kõik teised OB-d katkestavad OB1 tööd kuni nende tsükkel läbi saab.

OB tüüp OB number Aktiveerimise sündmus ja rakenduse kirjeldus
Tavaliselt tsükliliselt täidetav 1 Aktiveeritakse pärast igat CPU käivitamist tsükliliselt, et töödelda peamist kasutaja programmi.
CPU käivitused 100, >= 200 Aktiveeritakse igal STOP > START üleminekul enne OB1 käivitamist. Muuseas ka kontrolleri käivitamisel.
Ajaline viivitus
katkestus
>= 200 Programmi osade täitmine aktiveeritakse kasutaja poolt määratud ajavahemiku möödumisel.
Tsükliline katkestus >= 200 Aktiveeritakse tsükliliselt määratud ajaintervallide (nt 500 ms) järel, et täita programmi (nt PID kontuur) kindla intervalli järel.
Riistvaraline katkestus >= 200 Aktiveeritakse siis kui esineb protsessiseadme või mooduli algatatud katkestus, et täita kasutaja ettekirjutatud hooldusrutiini.
Diagnostilise vea katkestus 82 Käivitatakse, kui moodulis on tuvastatud viga.
Aja viga 80 Käivitatakse siis kui:
  • maksimaalne tsükli aeg ületatud
  • välja kutsutud OB on veel töötlemisel (töötab)
  • järjekorra ületäitumine
  • katkestuste kadu suure katkestuste koormuse tõttu

Funktsioon (FC) on POU, millel võivad olla määratud väärtustega parameetreid, kuid funktsiooni muutujate väärtusi ei peeta meeles (mälus) pärast funktsiooni töö lõppu – samade sisendväärtuste puhul annab funktsioon alati ühesugused väljundväärtused. Sellised on näiteks analüütilised funktsioonid.

Funktsioonide mõte seisneb selles, et mingit kindlat ülesannet täitva programmiosa peab funktsioonina kirjutama vaid ühe korra. Edaspidi, kui on soov seda programmiosa kasutada, ei tule seda iga kord uuesti kirjutada vaid piisab vaid vastava funktsiooni välja kutsumisest.

[joonis]

Funktsiooniplokk (FB) on funktsioonile sarnane POU selle vahega, et sellel on mälu ja selle väljundite väärtus sõltub sisendmuutujate - ja samuti ka plokisiseste (mälus olevate) muutujate väärtustest. Kõikide plokisiseste muutujate (välja arvatud "Temp" piirkond) väärtused peetakse funktsiooniploki töö vaheajal meeles (hoitakse mälus). Funktsiooniplokid seotakse neile vastava andmeplokiga (DB), kus hoitakse pidevalt selle funktsiooniploki muutujate väärtusi. Samast funktsiooniplokist võib olla mitu instantsi. Instantsides kasutatakse sama funktsiooniploki programmikoodi, kuid iga instantsi muutujaid hoitakse erinevates andmeplokkides.

Funktsiooniploki kasutamine on mõtekas siis, kui on vaja täita spetsiifilist ülesannet ning selle ülesandega seotud andmeid on vaja meeles pidada. Mitme funktsiooniploki instantsi kasutamine on mõtekas näiteks mitme sarnase seadme (nt pumpade) juhtimisel, mille juhtimisega seotud andmed tuleb meeles pidada. Sellisel juhul oleks näiteks iga pumba kohta eraldi instants pumpade juhtimise funktsiooniplokist. FB kasutamine ei pea muidugi ilmtingimata otseselt seadmetega seotud olema.

Andmeplokk (DB) on üksus, mis hoiab endas programmi tööks vajalikke andmeid (muutujad ja nende väärtused). Andmeplokid võivad olla globaalsed ehk kõigile programmiüksustele (OB, FC, FB) vabalt kasutatavad või nö instantsi andmeplokid, mis on seotud spetsiifilise funktsiooniplokiga. Vaatamata sellele, et instantsi andmeplokid on vastava funktsiooniplokiga seotud, saavad kõik teised programmiüksused selle poole siiski vajadusel pöörduda olgugi, et see on enamasti ebasoovitav lahendus.

Andmeplokis olevate muutujate poole on võimalik pöörduda, kui sümboolseks aadressiks kirjutada näiteks: "AndmeplokiNimi".MuutujaNimi .

Pärast kontrolleri väljalülitamist andmeplokki kirjutatud väärtused ei säili (säilivad ainult andmeploki loomisel määratud algväärtused). Andmeplokkide jaoks kasutatakse enamasti kahte mälu:

  • Programmimälu (Load memory), mis on välkmälu baasil säilmälu, kus hoitakse püsivalt andmeplokkide struktuuri ja muutujate algväärtusi.
  • Töömälu (Work memory), mis on RAM baasil hävimälu, kus hoitakse kontrolleri töö ajal muutujate väärtusi. Pärast toite kadumist andmed kaovad.

Andmeplokke saab hoida ka ainult programmimälus, kuid sellisel juhul tuleb vältida pidevat kirjutamist sellesse andmeplokki. Samuti on võimalik aeg-ajalt töömälus olevaid andmeploki muutujate väärtusi programmimällu üle kanda kasutades WRIT_DBL funktsiooni.

Süsteemiplokid (SFB, SFC ja SDB)
Peale programmeerija poolt programmis kasutamiseks mõeldud plokkide (OB, FB, FC ja DB) on STEP 7-s veel kolme eritüüpi süsteemiplokke (SFB, SFC ja SDB), mis on integreeritud PLC operatsioonisüsteemi. Kasutaja saab neid kasutada (aktiveerida) oma programmis. Need süsteemiplokid võimaldavad lahendada paljusid tavalisi ülesandeid ja funktsioone ning vähendavad seetõttu oluliselt programmi arendamise aega. Süsteemiplokkide sisu ei saa muuta ja vaadata (need on vastavate tegevuste eest kaitstud).

Programmi täitmine PLC-s

Joonis 3.1.

S7-1200 PLCs toimub rakenduse põhiprogrammi tsükliline täitmine OB1 kaudu. Pärast toite sisselülitamist ja CPU lülitamist TÖÖ režiimi aktiveeritakse ja täidetakse OB1 igal PLC tsüklil kuni CPU TÖÖ režiim katkestatakse või toide lülitatakse välja. Kuna OB1 täidetakse tsükliliselt, siis tuleb teised plokid selle abiga aktiveerida (välja kutsuda). Kui mingi plokk oli aktiveeritud OB1 poolt ja see lõpetas oma tegevuse, siis antakse programmi juhtimine tagasi OB1-le. Siemensi PLC kasutab OB juures prioriteedinumbreid. Kõrgema prioriteediga OB katkestab madalama prioriteediga OB täitmise. PLC programmi tsükliline täitmine on piltlikult esitatud joonisel 3.1.

PLCs kasutatavad andmetüübid

Andmetüübid on andmete klassifikatsioonid, kus on ära määratud nende formaat(kuidas mingid väärtuseid hoitakse), reaalne pikkus bittides ja eelnevast tulenev vahemik. Õigesti valitud andetüübid tagavad andmete optimaalse töötlemise võimalikkuse ja selle, et erinevate muutujate jaoks reserveeritakse sobiv hulk mälu.

Andmetüübid IEC 61131-3 järgi

Standardis IEC 61131-3 on määratletud grupp andmetüüpe üldnimega elementaarsed andmetüübid. Nende tähised on esitatud tabelis 3.2. Andmetüüpe iseloomustavad kasutatud bittide arv ja võimalik numbriliste väärtuste vahemik.

Boole Märgiga täisarv Märgita täisarv Reaalarv Aeg, kestus, kuupäev ja tähemärgi rida
BOOL
BYTE
WORD
DWORD
LWORD
INT
SINT
DINT
LINT
UINT
USINT
UDINT
ULINT
REAL
LREAL
TIME
DATE
TIME_OF_DAY
DATE_AND_TIME
STRING

Lisaks nendele saab kasutaja tuletada (luua) uusi andmetüüpe ja kasutada neid nagu elementaarseid andmetüüpe.

Elementaarsed andmetüübid

Alates STEP-7 v10-st on võimalik kasutada järgmisi elementaarandmetüüpe:

Tüüp ja kirjeldus Bittide arv Formaat Vahemik ja arvu tähistus
(Väiksemast suurema väärtuseni)
Näide
BOOL (bitt) 1 Tõeväärtus TRUE (signaal “1”)/FALSE (signaal “0”) TRUE
BYTE (bait) 8 Kuueteist-kümnendarv B#16#0 .. B#16#FF B#16#10
WORD
(sõna)
16 Kahendarv 2#0 .. 2#1111_1111_1111_1111 2#0001_0000_0000_0000
Märgita kümnendarv 0 .. 65535 61241
2x8 bit märgita kümnendarvud B#(0,0) .. B#(255,255) B#(10,20)
Kuueteist-kümnendarv W#16#0 .. W#16#FFFF W#16#1000
BCD C#0 .. C#999 C#998
DWORD
(topeltsõna)
32 Kahendarv 2#0 .. 2#1111_1111_1111_1111_1111_1111_1111_1111 2#1000_0001_0001_1000_1011_1011_0111_1111
Märgita kümnendarv 0 .. 4294967295 61241
Kuueteist-kümnendarv DW#16#0000_0000 .. DW#16#FFFF_FFFF DW#16#00A2_1234
4x8 bit märgita kümnendarvud B#(0,0,0,0) .. B#(255,255,255,255) B#(1,14,100,120)
SINT
(Int, 8 bitti)
8 Märgiga kümnendarv -128 .. 127 63
USINT
(Int, 8 bitti)
8 Märgita kümnendarv 0 .. 255 63
INT
(Integer)
16 Märgiga kümnendarv -32768 .. 32767 1
UINT
(Integer)
16 Märgita kümnendarv 0 .. 65535 4532
DINT
(Int, 32 bitti)
32 Märgiga kümnendarv -2147483648 .. 2147483647 -2546854
UDINT
(Int, 32 bitti)
32 Märgita kümnendarv 0 .. 4294967295 265746
REAL
(komakohaga arv)
32 IEEE koma-kohaga arv Ülemine piir: +/-3.402823e+38
Alumine piir: +/-1.175495e-38
1.234567e+13
LREAL
(komakohaga arv)
64 IEEE koma-kohaga arv Ülemine piir: +/-1.7976931348623158e+308
Alumine piir: +/-2.2250738585072014e-308
1.0e-5
TIME
(IEC-Time)
32 IEC-aeg 1 ms sammudega, märgiga täisarv -T#24D_20H_31M_23S_648MS ..
T#24D_20H_31M_23S_647MS
T#0D_1H_1M_0S_0MS
TIME#0D_1H_1M_0S_0MS
DATE
(IEC-kuupäev)
16 IEC-kuupäev 1 päeva sammudega D#1990-1-1 .. D#2168-12-31 DATE#1994-3-15
CHAR
(tähemärk)
8 ASCII -tähemärk  “A”, “B” jne. “O”

Kompleksandmetüübid

Kompleksandmetüübid või ka komposiitandmetüübid on andmetüübid, mis koosnevad elementaarsetest andmetüüpidest. PLC tags nimelisse globaalsesse sümbolite nimekirja neid andmetüüpe lisada ei saa, küll saab neid aga kasutada programmide, funktsioonide ja funktsiooniplokkide kohalikus sümbolite tabelis ja andmeplokkides.

Tüüp ja kirjeldus Bittide arv Formaat Vahemik ja arvu tähistus
(Väiksemast suurema väärtuseni)
Näide
DTL
(aeg)
12 aasta-kuu-päev-tund:minut:sekund.nanosekund DTL#1970-01-01-00:00:00.0 .. DTL#2554-12-31-23:59:59.999999999 DTL#2012-12-18-20:30:20.250
TON_TIME
(IEC taimerist tuletatud muutujad)
128 ST (Time);PT (Time); ET (Time);RU (Bool); IN (Bool); Q (Bool)
STRING
(sõne)
n + 2 ASCII tähemärgid (CHAR) 0 .. 254 märki 'see on string'
ARRAY
(massiiv)
n * andmetüübi pikkus ARRAY [alumine piir..ülemine piir] of andmetüüp [-32768 .. 32767]
STRUCT
(struktuur)


Bait Komponent Andmetüüp Vahemik Kirjeldus
0 Year UInt 1970 .. 2553 Aasta
1
2 Month USInt 1..12 Kuu
3 Day USInt 1..31 Päeva number ühes kuus
4 Weekday USINT 1 (Pühapäev) ..
7 (Laupäev)
Nädalapäeva number
5 Hour USINT 0..23 Kellaaja tunniosa
6 Minute USINT 0..59 Kellaaja minutiosa
7 Second USINT 0..59 Kellaaja sekundiosa
8 Nanoseconds UDINT 0 to 999999999 Kellaaja nanosekundi-osa
9
10
11

DTL on 12 baidine andmetüüp, mis hoiab endas kuupäeva ja kellaaega. See koosneb mitmest komponendist, mille poole on võimalik ka eraldi pöörduda.

Näiteks kui on muutuja #aeg, siis sellest on võimalik nädalapäeva välja lugeda määrates operandiks: #aeg.Weekday

String ehk sõne on ASCII tähemärkide (tabelis Tabel 3.3. toodud andmetüübi CHAR) jada, mis võimaldab endas hoida lühikesi tekstijuppe.
Stringil saab määrata andmetüübi väljal selle maksimaalse pikkuse kirjutades maksimaalse tähemärkide arvu kantsulgudesse. Näiteks kui andmetüübiks märkida STRING[6], siis on stringi maksimaalne kasutatav pikkus 6 tähemärki. Kui pikkus märkimata jätta ehk kirjutada andmetüübiks ainult STRING, siis võetakse maksimaalseks pikkuseks absoluutne maksimumpikkus ehk 254 tähemärki.

Array ehk massiiv on kogum sama tüüpi andmetest. Näiteks sisaldab ARRAY [0..4] of INT andmetüübiga määratud muutuja endas sisuliselt 5 INT tüüpi muutujat, millele vastavad indeksi numbrid 0, 1, 2, 3, 4. Massiivi liikmete poole saab pöörduda kirjutades liikme indeksi numbri massiivi muutuja nime taha kantsulgudesse. Näiteks kui operandiks kirjutada #temperatuur[2] pöördutakse massiivi nimega temperatuur liikme poole, mille indeksi number on 2.

Massiivi liikmete poole saab ka dünaamiliselt pöörduda kasutades pöördumisel staatilise indeksinumbri asemel mõnda integer tüüpi muutujat. Näiteks: #temperatuur[#indesinumber], eeldades, et kohalik muutuja #indeksinumber on deklareeritud kui täisarv (Int, SInt UInt, USInt). Seda meetodit kasutades tuleb ettevatlik olla ja kontrollida, et indeksinumbrit sisaldava muutuja väärtus ei läheks massiivi piiridest välja.

Nimi Andmetüüp Näidisväärtus
■ ▼ temperetuur ARRAY [0..4] of INT
temperatuur[0] Int 102
temperatuur[1] Int 15
temperatuur[2] Int -23
temperatuur[3] Int 417
temperatuur[4] Int 3

Struct on andmetüüp, mis võib koosneda kindlatest eelnevalt deklareeritud elementaarssetest andmetüüpidest. Näide STRUCT tüübi deklareerimisest:

Nimi Andmetüüp Kommentaar
■ ▼ paremeetrid Struct Seadme parameetrid
pinge USInt Pinge voltides
vool USInt Vool amprites
olek Bool Kas seade on aktiivne
temperatuur SInt Temperatuur kraadides
täitunud Real Mahuti täituvus liitrites

Antud näites toodud struktuuri ühe liikme, pinge, poole saaks pöörduda, eeldusel et tegu on kohaliku muutujaga, kui operandiks määrata #parameetrid.pinge.

Näide keerulisemast kompleksandmetüüpide kasutamisest

Alates S7-1200 kontrolleri firmware versioonist 2.1 ja STEP7 tarkvarapaketist v11 on andmeplokkides võimalik teha ka struktuuride massiive.

Nimi Andmetüüp Kommentaar
■ ▼ mootor array [0..2] of struct Mootorid
■ ▼ mootor[0] Struct Mootor 0
kiirus USInt Pööret minutis
suund Bool Mootori pöörlemise suund
olek Bool Olek. O: väljas, 1: sees
■  ▼ pinge array [1..3] of USInt Faasipinge
pinge[1] USInt L1
pinge[2] USInt L2
pinge[3] USInt L3
■ ▼ mootor[1] Struct Mootor 1
kiirus USInt Pööret minutis
suund Bool Mootori pöörlemise suund
olek Bool Olek. O: väljas, 1: sees
■  ▼ pinge array [1..3] of USInt Faasipinge
pinge[1] USInt L1
pinge[2] USInt L2
pinge[3] USInt L3
■ ▼ mootor[2] Struct Mootor 2
kiirus USInt Pööret minutis
suund Bool Mootori pöörlemise suund
olek Bool Olek. O: väljas, 1: sees
■  ▼ pinge array [1..3] of USInt Faasipinge
pinge[1] USInt L1
pinge[2] USInt L2
pinge[3] USInt L3

Antud näites saaks mootori nr 1 kiiruse poole pöörduda kasutades operandina aadressi: "Andmed".mootor[1].kiirus ning sama mootori 3. faasipinge poole saab pöörduda kasutades operandina aadressi: "Andmed".mootor[1].pinge[3].

Muutujate adresseerimine STEP 7 kohaselt

Muutujad deklareeritakse koos andmetüüpidega. PLC mälus on muutujad justkui kohahoidjad rakenduse spetsiifiliste andmete väärtuste salvestamiseks. Et paremini mõista konkreetset programmi ja selle muutujaid, kasutatakse sümboolset adresseerimist. See võimaldab määrata absoluutsele aadressile sümboolse nime. Globaalsete muutujate sümbolid deklareeritakse STEP 7 sümbolitabelis ja neid saab kasutada programmi kõikides plokkides. Muutuja nimi (sümbol) peab olema ainulaadne ja see võib esineda selles sümbolitabelis ainult üks kord. Plokkide (OB, FC ja FB) kohalikud muutujad ja nende sümbolid deklareeritakse vastava ploki deklaratsiooniosas. Neid muutujaid saab kasutada ainult selles plokis, kus ta deklareeriti. Sama nime võib vabalt uuesti kasutada mingis teises plokis, kui see seal uuesti deklareerida.

S7-300 PLC mooduli pesa numbrid siinil lihtsustavad I/Ode adresseerimist – mooduli asukoht (positsioon) siinil määrab esimese aadressi moodulis [14]. Pesa number 4 on esimene, mida saavad kasutada I/O moodulid. Seejuures neljandas pesas oleva digitaalsisendi (DI) mooduli andmete baidi aadress algab 0ga. Meeles tuleb pidada, et 16 sisendiga DI mooduli kasutamisel jääb aadressiväljal kaks baiti kasutamata. Järelikult algab järgmise mooduli andmete baidi aadress numbriga 4. Joonisel 3.2 on näidatud Siemens S7-300 PLC moodulite adresseerimine.

S7 mälu piirkondade adresseerimine

S7 PLC mälus on piirkonnad, mille poole saab kasutaja programmist pöörduda. S7-300 PLCs on need mälupiirkonnad: sisendite protsessikuva (I), väljundite protsessikuva (Q), mälubitt (M), perifeeria sisend (PI), perifeeria väljund (PQ), kohalik muutuja (L), taimer (T) ja loendur (C).

Joonis 3.2.

Iga mälupiirkond on jagatud baitideks ja selles on võimalik ligipääs ka bittidele, baitidele (8 bitti), sõnadele (16 bitti) ja topeltsõnadele (32 bitti). Seejuures kasutab üks topeltsõna ära 4 baiti alates n baidist kuni n+3 baidini. Biti aadressile viidatakse alati unikaalse sümboliga, mis koosneb mälupiirkonna tähisest, millele järgnevad baidi ja punktiga eraldatud biti numbrid (nt I 28.3). Kui adresseerimisel viidatakse mälupiirkonnale nagu bait, sõna ja topeltsõna, siis lisatakse mälupiirkonna tähisele täht B, W või D (nt IB 7, IW 7, ID 7). Igast plokist saab ligi kõikidele mälupiirkondadele väljaarvatud kohaliku muutuja mälupiirkond. Joonisel 3.3 on kujutatud digitaalsete andmete jagunemine tüüposadeks ja nende paiknemine mälupiirkondades. Nagu näha, tuleb mälupiirkondade adresseerimisega ja kasutamisega olla väga ettevaatlik, et mitte kogemata üle kirjutada teiste andmete baite, kasutades nt programmis sisendite protsessikuva IW 0 ja IW 1. Kui programm muudab IW 0 väärtust, siis muutub ka IW 1 väärtus, kuigi programmis seda ei soovitud teha. Selle vältimiseks tuleks kasutada IW 1 asemel IW 2.

Joonis 3.3.

PLC loeb programmi iga tsükli alguses sisendite olekud ja salvestab need sisendite protsessikuvasse (PII). Edasi määratakse programmi igas tsüklis ka väljundi olekud ja salvestatakse väljundite protsessikuvasse (PIQ). Programmi iga tsükli lõpus edastatakse saadud tulemused (väljundite väärtused) signaalimoodulitele, et teostada programmi käigus saadud tulemused reaalselt.

Perifeeria mälupiirkond (nt I0:P, Q3:P) võimaldab lugeda ja kirjutada andmeid otse PLC moodulitest(sse). Selle võttega kõrvaldatakse töötsüklis I/O olekute uuendusega seotud viivitused. Perifeeria mälupiirkonda kasutatakse ka analoogmoodulite andmete lugemiseks ja kirjutamiseks. Tsüklite vahel analoogmoodulite andmeid PLC mälus automaatselt ei värskendata.

Lokaalset mälupiirkonda (L) kasutatakse ajutiste muutujate väärtuste haldamiseks. Kui ploki töö on lõpetatud, siis saab seda mälupiirkonda uuendada ja kasutada teise ploki juures. Selle adresseerimine sarnaneb sisendite ja väljundite protsessikuvale (nt L 31.5, LB 3, LW 3, LD 3).

PLC programmeerimiskeeled

Standardis IEC 61131-3 võimaldab kasutada PLC programmeerimiseks viit erinevat programmeerimiskeelt.

Joonis 3.4.
Joonis 3.5.

Käsulist (Instruction List - IL) on masinale kohaldatud programmeerimiskeel, mida toetab mingis vormis suurem osa programmeerimistarkvaradest. Seda kasutatakse ka vahekeelena programmide tõlkimisel teistesse keeltesse. IL keeles programmi üks rida kirjeldab üht korraldust, mis PLC jaoks on üks täidetav käsk. See rida koosneb joonisel 3.4 kujutatud elementidest. Korraldus algab operatsiooni või käsu sümboliga, millele järgneb üks või mitu komadega eraldatud operandi/muutujat. Enne korraldust võib olla märgis kooloniga. Märgis tähistab programmisisest hüppe aadressi. Kui reas on kommentaar, siis kirjutatakse see rea lõppu ning ümarsulgude ja tärnide (* .. *) vahele. STEP 7-s kasutatakse kommentaari alguse tähistamiseks reas kaht kaldkriipsu //.

Märgiseid kasutatakse programmisisesteks hüpeteks ühelt programmi realt teisele, jättes mitu rida vahele. Standardis ei ole kirjeldatud hüpped programmi sees, kuid see on lubatud paljudes programmeerimissüsteemides, et parandada programmi täitmist ja lühendada selle aega.

STEP 7 ≤ 5.x versioonides nimetati seda keelt STL-iks. Alates versioon 10-st kannab see juba nime IL. Programmiteksti näide on esitatud joonisel 3.5. Step 7 Basic paketis seda keelt ei ole.

CASE #STEP OF   0..1:
  IF "reset"() AND NOT "empty" THEN
    "swiv_mag":=0;
    "swiv_dow":=1;
    "blink_Q1":=0;
    "Q1":=0;
    "INC"(#STEP);
  ELSIF "reset"() AND "empty" AND NOT "key_man" THEN
    "blink_Q1":=1;
  ELSIF "reset"() AND "empty" AND "key_man" THEN
    "blink_Q1":=1;
    "STEP":=1;
  END_IF;

Struktureeritud tekst (Structured Text - ST) on kõrgtasemeline programmeerimiskeel ülesannete juhtimiseks ja keeruliste matemaatiliste arvutuste tegemiseks. Selle keele eelis IL ees on selle parem arusaadavus ja jälgitavus inimesele - väga lühikesed ja selged programmilõigud ning võimsad programmi käskude voo juhtimise elemendid (If-else, for, while, case). Erinevalt ILst võib ST avaldis enda alla võtta mitu rida.

STEP 7-s kutsutakse seda keelt struktureeritud juhtimiskeeleks (Structured Control Language - SCL). See sarnaneb programmeerimiskeelele PASCAL (joonis 3.6)

Funktsiooniplokkskeem (function block diagram - FBD) on graafiline keel aritmeetika, Boole või teiste funktsioonielementide ja -plokkide ühendamiseks. FBD keel on pärit signaali töötluse valdkonnast, kus on olulised reaal- või täisarvud. Praeguseks on sellest saanud universaalne programmeerimiskeel enamuse PLC jaoks.

Joonis 3.7.

FBDs kirjutatud programmi kood on jagatud lõikudeks, mida tuntakse segmentidena. Segmendid võimaldavad struktureerida programmi ülesehitust POUs. FBD segmendi graafiline osa sisaldab ristkülikuid ja programmi juhtimise avaldusi koos ühendatud horisontaalsete ning vertikaalsete joontega (joonis 3.7). Ristkülikute sisendid võivad olla ühendatud kas muutujatega, konstantidega või siis olla ka vabalt kasutamata.

FBD kasutatakse horisontaalseid ja vertikaalseid ühendusjooni, mis võivad hargneda mitmeks. Ühe sisendiga ei tohi ühendada mitut väljundit, kuna see võib põhjustada programmi käitumises ebakõlasid. Programmi juhtimiseks on eraldi olemas käsud lahkumiseks POUst ja segmentide töötlemise järjekorra muutmiseks.

FBDs hinnatakse segmendis oleva programmi täitmist järgmiste reeglite järgi:

  1. hinnatakse elemendi kõikide sisendite olekud enne selle sisu teostamist;
  2. mingi elemendi hindamine on läbi, kui kõik tema väljundid on väärtustatud;
  3. segmendi hindamine on läbi, kui selles olevate kõikide elementide väljundid on väärtustatud.

Kontaktaseskeem (Ladder Diagram - LD) on graafiline keel, mille abil seotakse tõeväärtuslikke muutujaid. LD on võrreldav varasemalt tuntud releeskeemidega, milles esitatakse graafiliselt energia liikumist elektriskeemis. Antud programmeerimiskeel on mõeldud tõeväärtuslike signaalide (TÕENE/VÄÄR) töötlemiseks. LD keele segment on piiratud vasakult ja paremalt poolt vertikaalsete siinidega. Vasakult siinilt jõuab energia (loogika signaal väärtusega 1) kõikide temaga seotud elementideni (graafiliste sümboliteni). Sõltuvalt skeemielementide olekust lasevad need energial edasi liikuda paremale järgmise elemendini või katkestavad liikumise.

Nagu FBD puhulgi on ka LD elementide ühendamiseks horisontaalsed ja vertikaalsed ühendusjooned ning ristumispunktid. Kontakt LDis teostab sissetuleva joonega seotud (nimelise) muutuja väärtusega loogika operatsiooni. Teostatav loogikaoperatsioon sõltub kontakti tüübist. Operatsiooni tulemusel saadud väärtus antakse kohe edasi väljuvale joonele (ühendatud paremale poole).

Joonis 3.8.

Kõikide muutujate andmetüübid on tõeväärtuslikud (TÕENE/VÄÄR) ja LD elementide vahelised seosed kannavad edasi ainult tõeväärtusi.

STEP 7 keskkonnas kustutakse seda keelt Ladder Logic'uks (LAD). Skeemi näide on esitatud joonisel 3.8.

Joonis 3.9.

Järjestatud funktsioonide kaart (Sequential Function Chart – SFC) on graafiline programmeerimiskeel rakenduse (nt tootmisliin) juhtimisprotsesside jaotamiseks väiksemateks osadeks ja selle koosluse juhtimiseks. Graafiline skeem näitab ilusti protsessi voogu (liikumist teostusel) ja on seetõttu oluline tööriist PLC programmi struktureerimiseks. SFC keeles on võimalik saavutada rakenduse protsesside järjestikust ja ka paralleelset täitmist.

Väiksemate programmiosade (nt protsess, ülesanne) samm-sammuline täitmine sõltub nii programmi voos defineeritud tingimustest kui ka I/Ode käitumisest. Programmi samm programmeeritakse tavaliselt standardis IEC 61131-3 defineeritud teistes keeltes.

Esimene SFC struktureerimistase on segment koos selle alla kuuluva sammu ja siirde- elemendiga (joonis 3.9). Üks samm saab olla aktiivne või mitteaktiivne. Aktiivse sammuga täidetakse temaga seotud juhiseid (käskusid), kuni ta muutub mitteaktiivseks. Sammu oleku muutus aktiivsest passiivseks määratakse siirde tingimusega, mis esitatakse tõeväärtusavaldise kujul. Kui aktiivse sammu taga oleva siirdetingimuse väärtus muutub "TÕESEKS", siis aktiveerub selle siirde järel olev samm ja eelnev lõpetab. Siirde aktiveerimisega antakse eelneva sammu atribuudi "aktiivne" väärtus edasi järgmisele sammule või sammudele. Aktiivsus liigub läbi sammude, mis kõik koos moodustavad võrgu. Paralleelsete harude puhul programmis jagatakse "aktiivne" olek mitmeks osaks ning harude lõpus liidetakse see uuesti kokku.

STEP 7-s kutsutakse seda keelt Graphical Programming Language'ks (S7-GRAPH).

Siemensi PLC programmeerimistööriist STEP 7 Basic sisaldab tavakeeli FBD ja LAD. Teisi keeli nagu SCL ja S7-GRAPH saab eraldi juurde osta näiteks STEP 7 Professional tarkvarapaketile..

Standard lubab kasutada ka teisi programmeerimiskeeli (nt C++), kui need täidavad standardis määratud algnõudeid.

Programmeerimine standardi IEC 61499 abil

Andmevoogu ja loogilist protsessi täitmise jada saab programmeerida ja dokumenteerida standardi IEC 61131-3 graafiliste keeltega (LD, FBC, SFC), kuid samuti on vaja näidata graafiliselt (juhtimisseadmete) juhtimisprogrammide topoloogilist jagunemist, nende üldist konfiguratsiooni ja seoseid automatiseerimisprojekti teiste hajutatud osadega. Seda tehakse palju kõrgemal loogilisel tasemel kui POUde programmeerimine.

Keeruliste hajutatud rakenduste seadistamise tööriistu kutsutakse konfiguratsiooni redaktoriteks. Programmiosa moodustatakse suurematest üksustest funktsiooniplokkide sidumise teel. Keerulised hajutatud automatiseerimisülesanded omavad laialdast andmeside ja teostamise juhtimise struktuuri. Teostuse ajal toimub tihe andmevahetus erinevates kohtades paiknevate juhtimisseadmete vahel. Seejuures on kontrolleri programmid seotud võrgusõlmede ülesannetega ja programmide sisendid ning väljundid on omavahel seotud.

Standard IEC 61499 käsitleb hajutatud automatiseerimisrakenduste loomist, näiteks funktsiooniplokkide seadistamist füüsiliselt erineva ja geograafiliselt eraldatud juhtimisriistvara jaoks ning nende teostuse sünkroniseerimist [15].

Hajutatud automatiseeritud süsteemi programmi osade ja juhtimisriistvara elementide vastastikuse toime kirjeldamiseks kasutab IEC 61499 mitme tasemega hierarhilist mudelit:

  • Süsteem
  • Seade
  • Ressurss/allikas
  • Rakendus
  • Funktsiooniplokk

Reaalses automaatikakeskkonnas toimivad erinevatest juhtimisseadmetest moodustatud rakendused süsteemina. Mingi konkreetne seade koosneb tema rakendusprogrammidest, liidesest andmesidevõrguga, liidesest automatiseeritud protsessiseadmete ning juhtimisseadme riistvaraga, milles need ressursid toimivad.

Ressurss on iseseisev täidetav tarkvaraline üksus koos parameetritega. Igas seadmes saab toimida mitu ressurssi. Ressurss koosneb funktsiooniplokkidest (vahetavad omavahel eriliste liideste abil sündmuste ja muutujate andmeid). Teenuse liidese funktsiooniplokk moodustatakse andmesideliidesest ja automatiseeritud protsessi kasutajaliidesest. Ülejäänud funktsiooniploki tüübid (ka kasutaja poolt loodud funktsiooniplokid) on aluseks tegelikule juhtimisprogrammile.

Rakenduse tase on kokku lepitud (reaalne) programmeerimistase. Sellel tasemel seotakse süsteemi funktsiooniplokid omavahel kokku sõltumata ressurssidest, milles need funktsiooniblokid töötavad. Seetõttu just see tase kirjeldab ära konkreetse rakenduse, mis võib iseenesest olla hajutatud mitmete ressursside vahel.

Funktsiooniplokid on siin väikseimad rakenduse (programmi moodustavad) üksused, mis standardi IEC 61499 järgi koosnevad enamasti kahest osast:

  1. täitmise juhtimine: sündmuste loomine ja töötlemine koos juhtimise sisendite ja väljunditega;
  2. algoritm (kasutaja programm) koos andmete sisenditega ja väljunditega ning sisemiste andmetega.

Konkreetne (protsessi, ülesande) algoritm programmeeritakse standardis IEC 61131-3 kirjeldatud keeltega ja selle juhtimist käsitlev osa SFC keele abil. Täitmise juhtimise diagramm (ECC) juhib algoritmi või selle osade täitmist sõltuvalt ajalise protsessi tegelikust olekust ja sissetulevatest sündmustest.

PLC juhtimisprogrammi loomine

PLC juhtimisprogrammi loomine koosneb järgmistest etappidest (joonis 3.10) [8]:

  • spetsifikatsioon: protsessi või ülesande kirjeldus
  • projekteerimine: rakenduse (e lahenduse) kirjeldus
  • realiseerimine: lahenduse elluviimine
  • integreerimine/kasutuselevõtt: lahenduse sidumine keskkonnaga ja katsetamine

Etapp 1: Spetsifikatsioon (probleemi sõnastamine)

Siin koostatakse rakenduse protsessi või ülesande detailne kirjeldus. See tegevus toob välja konfliktid, eksitused ja puudused tehnilistes nõuetes või spetsifikatsioonides. Antud etapi lõpuks on olemas:

  • juhtimisprotsessi või ülesande suuline kirjeldus;
  • tehnika struktuur/paigutus;
  • rakenduse (lahenduse) umbkaudne struktuur.

Etapp 2: Projekteerimine (põhimõttelise lahenduse konkreetne vorm)

Protsessi või ülesande põhimõtteline lahendus töötatakse välja 1. etapi tulemuste alusel. See peab kirjeldama juhtimissüsteemi käitumist ning olema sõltumatu tehnilisest realiseerimisest. Antud nõudeid täidab funktsionaalne skeem (GRAFCET). Funktsionaalset rakendust (lahendust) saab samm-sammult täiustada, kuni see sisaldab kõiki osasid. Keerulise juhtimisülesande korral tuleks rakendus (lahendus) jagada üksikuteks osadeks. Need võivad olla erifunktsioonid, mida kasutatakse nt visuaalse liidese teostamisel või andmeside korraldamisel.

Etapp 3: Realiseerimine (põhimõttelise lahenduse programmeerimine)

Rakendusprotsessi või selle ülesande põhimõtteline lahendus tõlgitakse juhtimisprogrammiks kasutades standardiga IEC 61131-3 määratud programmeerimiskeeli (SFC, FBD, LD, IL ja ST). Juhtimissüsteeme, mis töötavad ajas vastavalt loogilisele protsessile, saab kergesti programmeerida SFC keeles. LD, FBD ja IL keeled sobivad põhioperatsioonide formuleerimiseks ja juhtimissüsteemide jaoks, mida saab kirjeldada lihtsate loogikaoperatsioonide või tõeväärtussignaalidega. Kõrgtasemelist ST keelt kasutatakse peamiselt matemaatilise sisuga programmiosade loomiseks, nagu nt juhtimisalgoritmide kirjeldamiseks.

Joonis 3.10.

Nii palju, kui PLC või selle programmeerimistarkvara seda etappi toetab, tuleb loodud juhtimisprogramme või programmiosi enne kasutuselevõttu testida (simuleerida). See võimaldab avastada vead ja kõrvaldada need juba algstaadiumis, hiljem võib vigade kõrvaldamine olla palju keerulisem ja kulukam.

Etapp 4: Kasutuselevõtt (juhtimisprotsessi või ülesande koostamine ja katsetused)

Siin katsetatakse kolmes eelmises etapis loodud automatiseeritud süsteemi ja tegelike tootmisseadmete koostööd. Kui juhtimisülesanded on keerukad, tuleb seda teha süstemaatiliselt samm-sammu haaval. Korrektselt toimides leitakse vead kergesti ja kõrvaldatakse need nii juhtimisprogrammist kui ka mujalt süsteemist.

Dokumentatsioon on süsteemi loomisel üks oluline ja kriitilise tähtsusega komponent, mida läheb hiljem vaja süsteemi hooldusel ja laiendamisel. Dokumentatsioon, sealhulgas juhtimisprogrammi kohta, peab olema saadaval nii paberil kui ka andmekandjal. See on vajalik kasutuse käepärasuse ja varukoopiate omamise huvides. Dokumentatsioon koosneb üksikute etappide aruannetest, juhtimisprogrammide väljatrükkidest ja juhtimisprogramme käsitlevatest mistahes võimalikest kirjeldustest, nagu [8]:

  • probleemi kirjeldus
  • tehniliste seadmete positsiooninumbritega visand või seadmete paigutus
  • elektriskeemid
  • klemmide ühendusskeem
  • juhtimisprogrammide väljatrükid
  • sisendite-väljundite (I/O) nimekiri
  • täiendav dokumentatsioon
Creative Commons Licence
"Programmeeritavad kontrollerid" is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License .