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.
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 |
---|---|
![]() |
![]() |
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 |
---|---|
![]() |
![]() |
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 |
---|---|
![]() |
![]() |
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).
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 |
---|---|
![]() |
![]() |
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 |
---|---|
![]() |
![]() |
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)
Ü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
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 |
---|---|
![]() |
![]() |
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 |
---|---|
![]() |
![]() |
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
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
või
.
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
või
.
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 |
---|---|
![]() |
![]() |
ST | |
//XOR loogika tehe, kus kasutatakse mitmebitilisi muutujaid |
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
.
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.
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
).
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 |
---|---|
![]() |
![]() |
ST | |
//Muutuja bitimustrit nihutatakse 3 võrra vasakule |
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 |
---|---|
![]() |
![]() |
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.](assets/05_23_s.png)
![Joonis 5.24.](assets/05_24_s.png)
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.](assets/05_25_s.png)