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

Keerulisemad binaarloogika funktsioonid

Taimerid ehk viivituse teostajad

Nimi Käsutüübid
Sisselülitusviivitusega taimer TON
Väljalülitusviivitusega taimer TOF
Impulsstaimer PT

Juhtimisülesannetes kasutatakse tihti erinevaid taimeri funktsioone nt signaalide eluea pikendamiseks, väljundi hilisem aktiveerimine, jne. Programmis määrab taimeri sätted, nt viivitusaja ja taimeri aktiveerimise tingimuse programmeerija. Standard IEC 61131 määratleb taimeritele ainult 3 erinevat ajafunktsiooni, mis on esitatud tabelis 5.1.

Iga programmis kasutatud taimeri jaoks on vaja luua üks muutuja POU muutujate deklaratsioonialas nagu Timer_ON_0 : TON;. Selles hoitakse mälus taimeriga seotud väärtusi. Ühte muutujat ei tohi kasutada mitme paralleelse ajalise funktsiooni teostamiseks. Kui ühte tüüpi taimereid kasutatakse erinevates kohtades ja erinevatel aegadel siis võib kasutada sama muutujat nende tähistamiseks. Probleemide vältimiseks on soovitav siiski kasutada iga taimeri jaoks eraldi muutujat.

Joonisel 5.1 on kujutatud sisselülitusviivitusega taimer LD, FBD ja ST keeles. Teised taimerid näevad samasugused välja, ainus erinevus seisneb taimeri käsutüübi tähises (tabel 5.1). Näiteks väljalülitusviivitusega taimeri kasutamiseks ST keeles tuleb taimeri muutuja deklaratsioonis asendada käsk TON käsuga TOF.

FBD LD
FBD taimer LD taimer
ST
//Taimeri funktsiooni definieerimine POU muutujate deklaratsioonialas
Timer_ON_0 : TON;

//Taimeri funktsioon ST keeles
Timer_ON_0 (IN := Sisend1, PT := T#4S, Q => Valjund1, ET => Aeg_Valja);

Tabelis 5.2 on esitatud taimerite juures kasutatud muutujad, sisendid ja väljundid.

Muutuja Sisend/Väljund Andmetüüp Kommentaar
Sisend1 IN BOOL Binaarsisend taimeri aktiveerimiseks (ühebitine binaarsignaal taimeri aktiveerimiseks)
PT TIME Sisend taimerile ajaintervalli määramiseks (viivituseaja väärtus)
Valjund1 Q BOOL Binaarväljund, mis näitab taimeri tulemust (olekut)
Aeg_Valja ET TIME Väljund, mis väljastab taimeris loendatud aja väärtuse (loendatud aja väärtus)
Timer_ON_0, Timer_OFF_0, Timer_TP_0 TON, TOF, TP Muutuja, kuhu salvestatakse taimeriga seotud väärtused

Taimerid töötavad määratud aja jooksul. Lihtsam viis ajaintervalli (viivitusaja) määramiseks on kirjutada see konstandina taimeri sisendisse PT. Ajaintervall kirjutatakse CoDeSys järgmiselt: T#aaDbbHccMddSeeeMS,
kus:

  • aa - päevad
  • bb - tunnid
  • cc - minutid
  • dd - sekundid
  • eee - millisekundid

Näide ajakonstandist T#2D3H10M3S10MS (2 päeva, 3 tundi, 19 minutit, 3 sekundit ja 10 millisekundit). Taimerile võib ette anda ajaintervalli ka muutujana, mille deklareeritud andmetüüp on TIME. Vaata ka pt "Elementaarsed andmetüübid" ajaintervalli ja andmetüübi TIME kohta.

Sisselülitusviivitusega taimer (TON)

Kui taimeri (joonis 5.2) sisendis IN tuvastatakse loogiline 1, siis hakkab taimer aega loendama kuni ET väärtus saavutab ettemääratud PT aja. Selle saavutamisel aktiveeritakse (seatakse kõrgeks) väljund Q. Väljund Q jääb aktiivseks kuni sisendist IN kaob loogiline 1. Kui IN signaal kaob enne kui taimeri aeg ET saavutab PT väärtuse (enne kui taimeri aeg saab täis), siis peatatakse aja lugemine ja taimeri ajaline väärtus nullitakse. Sel puhul ei aktiveerita väljundit Q.

FBD Signaalide ajadiagramm
FBD TON taimer Signaalid

Joonisel 5.2 on kujutatud väljalülitusviivitusega taimer FBD keeles ja selle signaalide olekudiagramm. PT on taimerile ette antud ajaintervall (väljalülituse viivituseaeg) ning ET väljastab taimeri poolt loetud aja.

Järgnevalt on esitatud CoDeSys koostatud taimeri TON näite failid, mis saab laadida alla ja testida arvutis.

Väljalülitusviivitusega taimer (TOF)

Kui taimeri (joonis 5.3) sisendis IN tuvastatakse loogiline 1, siis aktiveeritakse kohe taimeri väljund Q. Taimer hakkab loendama ajaintervalliga PT määratud aega, kui sisendi IN signaal muutub nulliks. Loendamine kestab taimeris kuni etteantud viivitusaja PT lõpuni (kuni ET saavutab PT väärtuse). Väljund Q desaktiveeritakse (loogiline 0), kui taimeri viivitusaeg on läbi saanud ja sisend IN on 0. Kui aja loendamise kestel tuleb sisendisse IN positiivse frondiga signaal (0 muutub 1), siis peatatakse loendamine. Loendamine algab otsast peale, kui sisendi IN väärtus muudetakse nulliks.

FBD Signaalide ajadiagramm
FBD TOF taimer Signaalid

Joonisel 5.4 on kujutatud väljalülitusviivitusega taimer FBD keeles ja selle signaalide olekudiagramm. PT on taimerile ette antud ajaintervall (väljalülituse viivituseaeg) ning ET väljastab taimeri poolt loetud aja.

Järgnevalt on esitatud CoDeSys koostatud taimeri TOF näite failid, mis saab laadida alla ja testida arvutis.

Impulsstaimer (TP)

Kui taimeri (joonis 5.4) sisendis IN tuvastatakse signaali tõusev front, siis hakkab taimer aega loendama kuni taimeri ajaväärtus ET saavutab ettemääratud aja PT. Väljund Q on aktiivne kuni taimer töötab ja etteantud aeg PT pole möödas. Sisendi IN signaali muutus (nulliks ja tagasi üheks) ei mõjuta taimeri tööd enne kui impulsi etteantud aeg PT pole möödas.

FBD Signaalide ajadiagramm
FBD TP taimer Signaalid

Joonisel 5.4 on kujutatud impulsstaimer FBD keeles ja selle signaalide olekudiagramm. PT on taimerile ette antud ajaintervall (impulsiaeg) ning ET väljastab taimeri poolt loetud aega.

Järgnevalt on esitatud CoDeSys koostatud taimeri TP näite failid, mis saab laadida alla ja testida arvutis.

Taimeri jupitamine ST keeles

//Taimeri põhi keha, mis tegeleb aja loendamisega
Timer_ON_0 (IN := Sisend1, PT := T#4S);
//Taimeri väljundi Q väärtus omistatakse muutujale Valjund1
Valjund1 =: Timer_ON_0.Q;
//Taimeri ajaline väärtus ET omistatakse muutujale Aeg_Valja
Aeg_Valja =: Timer_ON_0.ET;

ST keeles ei pea siduma kõik muutujad taimeriga ühes kohas. Selle võib jagada juppideks nagu seda on tehtud joonisel 5.5. Samas võib jätta kaks alumist programmiosa välja ja kasutada taimeri nime koos vajalike lühenditega programmis otse. Nt muutujate Valjund1 ja Aeg_Valja asemel võib kasutada taimeri muutujat otse, lisades selle nime lõppu punktiga eraldatud väljundi tähis, nt Timer_ON_0.Q ja Timer_ON_0.ET.

Loendur

Nimi Käsutüübid
Ülesloendur CTU
Allaloendur CTD
Üles-alla loendur CTUD

Impulsside loendamiseks (nt esemete loendamiseks tootmisliinis) ja asendi või kauguse hindamiseks kasutatakse tihti loendusfunktsioone. Standardis IEC 61131 on määratud 3 loendusfunktsiooni, mis on ka CoDeSys olemas (tabel 5.3).

Nagu taimeridki vajavad loendurid oma tööks muutujaid, mis seotakse vastava loenduriga ja kasutatakse loenduriga seotud väärtuste meelespidamiseks. Need muutujad võib deklareerida POU muutujate deklaratsioonialas nagu nt Loend_UA : CTUD;. Iga loenduri jaoks on soovitav kasutada eraldi muutujat.

Joonisel 5.6 on kujutatud üles-alla loendur FBD, LD ja ST keeles. Ülejäänud kaks loendurit omab samu komponente. Ainus erinevus seisneb selles, et osadel loenduritel puuduvad osaliselt järgmised sisendid: CU, CD, RESET või LOAD. Nt ülesloenduris puuduvad sisendid CD ja LOAD ning väljundist on puudu QD. Väljund QU esitatakse ülesloenduris ainult Q tähisena. Ülejäänud osa on nii nagu kujutatud joonisel 5.6 (loenduri muutuja nimi võib- olla teine).

FBD LD
FBD loendur LD loendur
ST
//Loenduri funktsiooni definieerimine POU muutujate deklaratsioonialas
Loend_UA : CTUD;

//Taimeri funktsioon ST keeles
Loend_UA (CU :=> Ules, CD := Alla, RESET := Nulli, LOAD := Lae, PV :=> 3,
          QU => Valjund1, QD => Valjund2, CV => Vaartus);

Tabelis 5.4 on esitatud loenduri juures kasutatud muutujad, sisendid ja väljundid.

Muutuja Sisend/Väljund Andmetüüp Kommentaar
Ules CU BOOL Binaarsisend, mis suurendab loenduri väärtust ühe võrra, kui selles tuvastatakse tõusev front
Alla CD BOOL Binaarsisend, mis vähendab loenduri väärtust ühe võrra, kui selles tuvastatakse tõusev front
Nulli R BOOL Binaarsisend, mis nullib loenduri (loenduri väärtus muutub nulliks)
Lae LD BOOL Binaarsisend, mille peale laetakse loenduri väärtuseks PV sisendis olev algväärtus
PV WORD Loendurile etteantud algväärtus (ainult täisarv). Võib kasutada ka muutujaid, millesse on salvestatud sobiv väärtus
Valjund1 Q, QU BOOL Binaarväljund, mis on aktiivne kui loenduri väärtus CV on saavutanud algväärtusega PV sama või suurema väärtuse
Valjund2 Q, QD BOOL Binaarväljund, mis on aktiivne kui CV loenduri väärtus on nulliga sama või väiksem sellest
Vaartus CV WORD Väljund, mis väljastab loendustulemi täisarvuna
Loend_UA, Loend_U, Loend_A CTUD, CTU, CTD Muutuja, kuhu salvestatakse loenduriga seotud väärtused

Ülesloendur (CTU)

Ülesloenduri esmakäivitusel on selle loendi väärtus CV (loendustulem) null (joonis 5.7). Loenduri väärtus CV suureneb ühe võrra (+1), kui loenduri sisendi CU signaalis tuvastatakse tõusev front. Loenduri lõpuväärtust ehk väärtust, mille saavutades annab loendi väljundisse Q loogilise 1, saab määrata sisendis PV. Kui CV on saavutanud PV-ga sama või suurema väärtuse, siis annab väljund Q välja loogilise 1. Loenduri väärtus CV nullitake kui sisendi RESET signaaliks on loogiline 1.

FBD Signaalide ajadiagramm
FBD CTU loendur Signaalid

Järgnevalt on esitatud CoDeSys koostatud ülesloenduri CTU näite failid, mis saab laadida alla ja testida arvutis.

Allaloendur (CTD)

Allaloenduri esmakäivitusel on selle loendi väärtus CV (loendustulem) null (joonis 5.8). Enamasti on alla lugeva loenduri puhul kasulik laadida eelmääratud väärtus sisendist PV loendi väärtusesse CV, et oleks number, millest alla lugema hakata. Seda saab teha, kui sisendisse LOAD anda loogiline 1.

FBD Signaalide ajadiagramm
FBD CTD loendur Signaalid

Kui sisendisse CD tuleb positiivse frondiga signaal, siis vähendatakse loenduri väärtust CV ühe võrra (-1). Kui loenduri väärtus langeb nullini, siis muutub väljund Q aktiivseks. Et taastada loenduri algset määratud väärtust, tuleb anda sisendisse LOAD loogiline 1, mispeale laetakse loendi väärtuseks CV loenduri sisendis määratud väärtus PV.

Järgnevalt on esitatud CoDeSys koostatud allaloenduri CTD näite failid, mis saab laadida alla ja testida arvutis.

Üles-alla loendur(CTUD)

Joonis 5.9.

Üles-alla loenduri (joonis 5.6) väärtus CV (loendustulem) on null esmakäivitusel (joonis 5.9). Loenduri väärtus suureneb ühe võrra (+1), kui loenduri sisendis CU tuvastatakse tõusev front. Tõusva frondiga signaal sisendis CD vähendab loenduri väärtust ühe võrra (-1). Kui mõlemas sisendis CU ja CD tuvastatakse positiivne signaalifront, siis täidetakse mõlemat käsku korraga ja loenduri väärtus ei muutu. Loogiline 1 sisendis RESET viib loenduri väärtuse nulli. Sisendis LOAD olev loogiline 1 laeb loenduri väärtuseks CV sisendis PV olev väärtuse, kui sisendis RESET ei ole loogilist 1. Üles-alla loenduri signaalide olekud on kujutatud joonis 5.9.

Järgnevalt on esitatud CoDeSys koostatud üles-alla loenduri CTUD näite failid, mis saab laadida alla ja testida arvutis.

Loenduri jupitamine ST keeles

//Loenduri põhi keha, mis tegeleb mingi väärtuse loendamisega
Loend_UA (CU := Ules, CD := Alla, RESET := Nulli, LOAD := Lae, PV := 4);
//Loenduri väljund QU omistatakse muutujale
Valjund1 =: Loend_UA.QU;
//Loenduri väljund QD omistatakse muutujale
Valjund2 =: Loend_UA.QD;
//Loenduri loendustulem CV omistatakse muutujale
Vaartus =: Loend_UA.CV;

Ka loendurite juures ei pea siduma kõik muutujad loenduriga ühes kohas ST keels. Selle võib jagada juppideks nagu seda on tehtud joonisel 5.10. Samas võib jätta alumise programmiosa välja ja kasutada loenduri nime koos vajalike lühenditega programmis otse. Nt muutujate Valjund1, Valjund2 ja Vaartus asemel võib kasutada loenduri muutujat otse, lisades selle nime lõppu punktiga eraldatud väljundi tähis, nt Loend_UA.QU, Loend_UA.QD ja Loend_UA.CV.

Komparaator

Joonis 5.11.

Komparaatoritega (e võrdlusplokkidega) võrreldakse kahes sisendis olevate samatüübiliste andmete (muutujate) väärtusi. Võrdlustulemus väljastatakse binaarväljundi kaudu [viide]. Selle väljundi signaal on loogiline 1, kui võrdlustulemus on TÕENE, või loogiline 0, kui see on VÄÄR. Joonisel 5.11 on esitatud standardi IEC 61131 kohased võrdlused, mis on ka CoDeSys olemas. FBD ja LD keeles kasutatakse vastava komparaatori tähistamiseks tähtede kombinatsiooni. ST keeles märkide kombinatsiooni.

Joonisel 5.12 on esitatud "suurem kui või võrdne" komparaator FBD ja LD keeles. Muutuja SArv1 väärtust võrreldakse muutuja SArv2 väärtusega. Komperaator väljastab loogilise 1, kui mõlema muutuja väärtused on võrdsed või kui muutuja SArv1 väärtus on suurem kui muutuja SArv2 väärtus. Ehk siis SArv1 ≥ SArv2. Komparaator tulemus kantakse edasi teistele funktsioonidele ja/või muutujatele. Selle tulemusel muutub muutuja Valjund1 aktiivseks (loogiline 1). Kui eespool loetletud võrdlustingimused ei ole täidetud, siis väljastab komparaator loogilise 0. Seega ei aktiveeru muutuja Valjund1.

FBD LD
Komparaator FBD keeles Komparaator LD keeles

Mõnikord on komparaatoritel (joonis 5.13) olemas ka aktiveerimissisend EN. Sellega saab mõjutada komparaatori täitmist. Komparaatoris määratud võrdlus teostatakse ja saadud tulemus edastatakse muutujale Valjund1 kui muutuja Vordle omab signaali loogilist 1. Kui muutujal Vordle on väärtuseks loogiline 0, siis sõltmuata komparaatori tulemusets on ka muutuja Valjund1 väärtuseks loogiline 0. Kui komparaatoris olevat võrdlust soovitakse teostada kogu aeg, siis tuleb muutuja Vordle asendada väärtusega TRUE või jätta see sinna lisamata (LD keeles tuleb kustutada ka avatud kontakt). Vaata ka järgmist pt aktiveerimisignaalide kohta.

FBD LD
Komparaator FBD keeles Komparaator LD keeles

Järgnevalt on esitatud CoDeSys koostatud komparaatorite näite failid, mis saab laadida alla ja testida arvutis.

Tabelis 5.5 on esitatud komparaatorite juures kasutatud muutujad, sisendid ja väljundid. Oluline on jätta meelde, et võrdluses tuleks kasutada sama andmetüübiga muutujaid.

Muutuja Andmetüüp Kommentaar
Vordle BOOL Sisend EN, mis lubab teostada võrdlust
SArv1 BYTE, WORD, DWORD, LWORD, SINT, INT, DINT, LINT, USINT, UINT, UDINT, ULINT, REAL, LREAL, STRING, WSTRING, DATE, TIME, LTIME, DT, TOD Sisend A, mille väärtust tahetakse võrrelda sisendiga B
SArv2 Sisend B, mille väärtust tahetakse võrrelda sisendiga A
Valjund1 BOOL Binaarväljund, millega väljastatakse komparaatori tulemus

Komparaatoris võib kasutada muutujate asemel ka konstante e siis väärtusi (nt 32, T#10s, jne), mis sobivad muutujale valitud andmetüübiga kokku.

//Komparaator on seotud otse väljundmuutujaga
Valjund1 := SArv1 > SArv2;

//Komparaatorit on kasutatud IF tingimusluases
IF SArv1 > SArv2 THEN
    Valjund1 := TRUE;
ELSE
    Valjund1 := FALSE;
END_IF;

Joonisel 5.14 on esitatud kaks võimaliku varianti "suurem kui" komparaatorit ST keeles. Esimese puhul on komparaator seotud otse muutuja Valjund1 tehtega. Teise puhul kasutatakse IF tingimuslauset muutuja Valjund1 väärtuse muutmiseks.

Järgnevalt on esitatud CoDeSys koostatud ST keeles komparaatorite näited, mis saab laadida alla ja testida arvutis.

Funktsioonide ja funktsioonplokkide aktiveerimissignaalid

Joonis 5.15.

FBD ja LD keeles on funktsiooni plokkidel ja osadel funktsioonidel aktiveerimissignaalid (joonis 5.15) nagu sisendit EN ja väljundit ENO. Need esinesid ka eelmises peatükis esitatud komparaator funktsioonides (joonis 5.13).

Sisend EN on aktiveerimissisend, mis võimaldab mõjutada funktsiooni täitmist. Kui aktiveerimissisendi EN signaal on loogiline 1, siis täidetakse antud funktsiooni. Signaali loogiline 0 puhul ei täideta funktsiooni. Igat funktsiooni ja funktsiooni plokki täidetakse LD keeles alati, kui aktiveerimissisendi EN ette pole midagi kirjutatud/lisatud (sisendi EN väärtus on alati loogiline 1).

Väljund ENO on aktiveerimisväljund, mis annab infot funktsiooni täitmise õnnestumise kohta. Kui aktiveerimisväljundi ENO omab signaali loogiline 1, siis on funktsiooni täidetud ja ilma vigadeta. Kui aga aktiveerimisväljundi ENO signaal on loogiline 0 ja samas aktiveerimissisendi EN signaal on loogiline 1, siis on toimunud mingi tõrge funktsiooni täitmisel. Selle põhjuseks võib-olla näiteks see et sisend- ja väljundmuutuja andmetüübid ei lange kokku.

Joonisel 5.15 kujutatud ADD funktsiooni täidetakse, kui muutuja Aktiveeri lubab seda. SEL funktsiooni täidetakse, kui ADD funktsiooni täitmine õnnestus. Kui ADD funktsiooni täitmisel tekib probleem, siis SEL funktsiooni ei täideta. SEL funktsiooni ei täideta ka siis, kui ADD funktsiooni ei täideta.

Järgnevalt on esitatud aktiveerimissignaalide kasutamise näited komparaatoriga (suurem kui või võrdne), mis on tehtud CoDeSys ja saab testida oma arvutis.

Aktiveerimissisend EN ja –väljund ENO (mõlemad koos) saab tekitada FBD ja LD keeles eraldi sõltumata funktsioonidest/funktsiooni plokkidest kasutades ikooni EN_ENO või En_ENO?. Esimese puhul tuleb valida ka kohe funktsioon või funktsiooni plokk, mille juures soovitakse kasutada sisendit EN ja väljundit ENO. Teise puhul tekitatakse programmi tühi kast, millel on olemas sisend EN ja väljund ENO.

Kui aktiveerimissiendit EN ja -väljundit ENO ei soovita, siis tuleb kasutada ikooni EN_ENO või En_ENO?.

Loogikatehted mitmebitiliste muutujatega

Kaks muutuva väärtusega muutujat või üks muutuja ja konstant ühendatakse omavahel loogikatehte abil. Standart IEC 61131 kasutab loogikatehete jaoks lihtsaid binaarloogika funktsioone. Need on AND, OR, XOR (joonis 5.16) ja NOT (joonis 5.20). Nende tehete juures kasutatavad sisend- ja väljundmuutujad peaksid olema sama andmetüüpi (nt BOOL, BYTE, WORD, DWORD, LWORD). Need tehted ei võimalda kasutada väljundmuutujana väiksema mälumahuga muutujat.

FBD LD
Loogikatehe FBD keeles Loogikatehe LD keeles
ST
//XOR loogika tehe, kus kasutatakse mitmebitilisi muutujaid
Valjund1 := Sisend1 XOR Sisend2;
Joonis 5.17.

Binaarloogika NING-tehte tulemuseks saadud baidi (või ka bitt/andmesõna/topelt andmesõna/pikk andmesõna) mingi bitt on loogiline 1, kui kõigi sisendmuutujates vastaval kohal oleva biti väärtus on loogiline 1 (joonis 5.17). NING-tehtes võib-olla rohkem kui kaks sisendmuutujat.

Binaarloogika NING-tehtega saab varjata/peita mittevajalikke või mitteolulisi bitte (nende väärtusi) muutujas. Selleks kasutatakse maski, mille abil vajalikud või olulises kohas olevad bitid saavad signaali loogiline 1 ja teised (varjatavad) signaali loogiline 0. Maskina võib kasutada muutujat või konstanti. Maskeeritav muutuja ja mask liidetakse binaarloogika NING-tehte abil kokku, kus mittevajalike bittide väärtused varjatakse (signaal muutub loogiliseks 0) ja oluliste bittide väärtused ei muutu.

Joonisel 5.17 maskeeritakse sisendmuutuja Sisend1 bitid 1, 5 ja 6 ning sisendmuutuja Mask kasutatakse maskina. Tulemus kirjutatakse muutujasse Valjund1.


Joonis 5.18.

Binaarloogika VÕI-tehte baidi (või ka bitt/andmesõna/topelt andmesõna/pikk andmesõna) tulemuse mingi bitt on loogiline 1 kui vähemalt ühe sisendmuutujas vastaval kohal oleva biti väärtus on loogiline 1 (joonis 5.18). Antud loogikatehet kasutatakse bitimustri täiendamiseks. Binaarloogika VÕI-tehte abil lisatakse tulemuseks saadava kahendarvu ühte või mitmesse bitti loogiline 1.

Joonisel 5.18 oleva muutuja Sisend1 bittide 1, 5 ja 6 signaalid peaksid olema ühed. Selleks täiendatakse VÕI loogikatehtes bitimustrit lisades muutuja Taiend bittidesse 1, 5 ja 6 loogilise 1. Bitid, mis omasid loogilist 1 muutujas Sisend1, jäävad selleks.


Joonis 5.19.

Binaarloogika VVÕI-tehte tulemuseks saadud baidi (või ka bitt/andmesõna/topelt andmesõna/pikk andmesõna) bitt on 1 kui kõikide sisendmuutujates vastaval kohal olevatest bittidest on ainult ühel väärtus loogiline 1 (joonis 5.19). Antud loogikatehe võimaldab muutuja bitimustris tuvastada signaali muutust ühes või mitmes biti kohas. Selleks liidetakse VVÕI-tehte abil kokku muutuja vana ja uus bitimuster. Igas kohas, kus toimub signaali muutus 0 → 1 või 1 → 0, väljastab VVÕI-tehe signaali loogiline 1.

Joonisel 5.19 on näha, et signaali muutus on toimunud bittides 5 (1 → 0) ja 0 (0 → 1). Sisendmuutuja VanaSise omab vana bitimustrit ja sisendmuutuja Sisend1 uut bitimustrit.

Kui on vaja avastada ühte tüüpi signaali muutust nt 0 → 1, siis tuleb VVÕI-tehte tulemusega ja uue sisendmuutuja Sisend1 bitimustriga teha NING-tehe. Tulemus väljastab selles biti kohas loogilise 1, kus toimus positiivne signaali muutus. Negatiivse signaali muutuse (1 → 0) avastamiseks tuleb VVÕI-tehte tulemusega teha NING-tehe vana bitimustriga (VanaSise).


Joonis 5.20.

Binaarloogika EI-tehte tulemuseks on sisendmuutuja inverteeritud väärtus. Kõik bitid, mille väärtus on loogiline 1, saavad oma väärtuseks loogilise nulli ja vastupidi (joonis 5.20). Igat muutuja biti väärtust inverteeritakse eraldi.


Tabelis 5.6 on esitatud muutujad, mida kasutati eespool mitmebitiliste tehete tegemisel koos andmetüüpide ja kirjeldusega.

Muutuja Andmetüüp Kommentaar
Sisend1, Sisend2, Mask, Taiend, VanaSise BOOL, BYTE, WORD, DWORD, LWORD Sisendoperand, millega teostatakse vastav mitmebitline tehe
Valjund1 BOOL, BYTE, WORD, DWORD, LWORD Väljundoperand, millesse salvestatakse (antakse välja) mitmebitilise tehte tulemus

Nihkefunktsioonid

Nimi Kommentaar
SHL Bitimuster nihutatakse vasakule
SHR Bitimuster nihutatakse paremale
ROL Bitimuster ringnihutatakse vasakule
ROR Bitimuster ringnihutatakse paremale

Nihke- ja ringnihkefunktsioone kasutatakse mingi muutuja (operandi) bitimustri nihutamiseks vasakule või paremale kindla arvu positsioonide võrra. Nihutamise käigus muutuja bitimustris vabanevad positsioonid täidetakse 0-ga. Ringnihkel muutuja bitimustris vabanevad positsioonid täidetakse mälupiirkonnast väljanihutatud bittide väärtustega.

Standard IEC 61131 ja CoDeSys pakuvad nelja nihkefunktsiooni, mis on esitatud tabelis 5.7. Nihke funktsiooni esimeseks sisendiks on muutuja (joonis xxx) mille bitimustrit tahetakse nihutada vasakule või paremale. Järgmisena sisestatakse arv, mille võrra nihutatakse bitimustrit vasakule või paremale. Iga andmetüübi jaoks on olemas suurim bittide arv, mille võrra saab teostada bitted nihutamist. Andmetüüpide:

  • BYTE, SINT ja USINT puhul on selleks 8
  • WORD, INT ja UINT on 16
  • DWORD, DINT ja UDINT on 32
  • LWORD, LINT ja LUIMT on 64
FBD LD
Nihkefunktsioon	 FBD keeles Ringnihkefunktsioon LD keeles
ST
//Muutuja bitimustrit nihutatakse 3 võrra vasakule
TulBitMu1 := SHL(SisBitMu1, 3);

Joonisel 5.21 on esitatud mõned nihkefunktsioonid. ST keeles on esitatud SHL nihkefunktsioon. ST keeles kirjutatakse nihutatava bitimustri muutuja nimi (antud näites on selleks SisBitMu1) ja nihutatavate bittide arv (selleks on 3 bitti) sulgude sisse. FBD keeles on esitatud nihkefunktsioon paremale SHR ning LD keeles ringnihutamise funktsioon vasakule ROL. Kõik nihkefunktsioonid näevad välja nagu joonisel 5.21 esitatud. Ainus erinevus on vastava funktsiooni käsu nimes.

Ka nihkefunktsioonid võivad omada aktiveerimisisendit ning –väljundit FBD ja LD keeles (joonis 5.22). Nende kaudu saab mõjutada nihkefunktsiooni täitmist. Vaata ka pt aktiveerimisignaalide kohta.

FBD LD
Ringnihkefunktsioon	FBD keeles Ringnihkefunktsioon LD keeles

Tabelis 5.8 on esitatud nihkefunktsioonide juures kasutatud muutujad, sisendid ja väljundid. Muutujate asemel võib kasutada ka konstante ehk siis arve, mis sobivad muutujate andmetüübiga kokku.

Muutuja Andmetüüp Kommentaar
SisBitMu1 BYTE, WORD, DWORD, LWORD, SINT, INT, DINT, LINT, USINT, UINT, UDINT, ULINT Sisend, mille väärtuse bitimustrit tahetakse nihutada
3 SINT, INT, USINT, UINT Sisendile omistatakse nihutavate bittide (kohtade) arv bitimustris
TulBitMu1 BYTE, WORD, DWORD, LWORD, SINT, INT, DINT, LINT, USINT, UINT, UDINT, ULINT Väljund, millele kaudu väljastatakse nihutamise tulemus

Funktsioonid SHL ja SHR nihutavad bitimustrit bitthaaval vaskalule või paremale etteantud biti kohtade arvu võrra. Tulemus väljastatakse ja kantakse edasi muutujale TulBitMu1. SHL puhul täidetakse vabaks jäänud kohad 0-ga kõikide andmetüüpide juures (joonis 5.23 a). SHR puhul täidetakse vabaks jäänud biti kohad 0-ga, kui nihutatava muutuja andmetüübiks on BYTE, WORD, DWORD, LWORD, USINT, UINT, UDINT ja ULINT (joonis 5.23 b). Andmetüüpide SINT, INT, DINT ja LINT puhul täidetakse SHR puhul tühjaks jäänud biti kohad bitimustris kõige vasakul pool oleva biti väärtusega ehk arvu märgi biti väärtusega (joonis 5.24). Andmetüübi SINT bitimustri viimane biti on 7. bitt, INT puhul on 15. bitt, DINT puhul on 31. bitt ja LINT puhul 63. bitt. Kui viimase biti väärtus on 1 (arv on negatiivne) siis täidetakse vabaks jäänud biti kohad ühega ja 0 (arv on positiivne) puhul täidetakse need nulliga.

Joonis 5.23.
Joonis 5.24.

Joonisel 5.24 esitatud muutuja SisBitMu1, mille andmetüüp on DINT, väärtus on negatiivne. Seetõttu on muutuja SisBitMu1 viimase biti (31) väärtuseks 1. Seega nihutamisel vabanenud bittide kohad täidetakse loogilise 1-ga.

Kui nihutatava biti kohtade arv on 0, siis väljastatakse sisendis oleva muutuja bitimuster muutumatul kujul. Kui nihutatavate bitikohtade arv ületab bitimustris olevate bittide arvu, siis väljastatakse SHL puhul väärtus 0 (bitimustris on kõik kohad täidetud 0-ga). SHR puhul võib olla väljastatavaks väärtuseks 0 või -1 (viimase puhul on bitimustris kõik kohad täidetud 1-ga).

Funktsioonid ROL ja ROR nihutavad (ringnihutavad) kogu muutuja sisu bitthaaval paremale või vasakule ning tühjaks jäänud kohad täidetakse nihutamisel üle bitimustri nihutatud bittide väärtustega (joonis 5.25).

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