Funkčné bloky programu pre 1PLC
1. | Programovateľné logické automaty |
2. | Hardvér (jednočipové PLC) |
3. | Softvér 1PLC |
4. | Funkčné bloky programu pre 1PLC |
5. | Prepojenie 1PLC s počítačom
|
Obsah
Riešenie funkčných blokov jazyka STL
Každý príkaz jazyka STL je potrebné prepísať do assembleru mikrokontroléra Atmel AVR. Keďže jazyk STL je zásobníkový jazyk, pri riešení blokov je vhodné využiť vstavaný zásobník mikrokontroléra a inštrukcie na prácu so zásobníkom. Prehľad príkazov v jazyku STL sa nachádza v nasledujúcich podkapitolách.
Ku každému príkazu je uvedená tabuľka s informáciami. Je v nej uvedený príklad zápisu príkazu v jazyku STL a čo príkaz vykonáva so zásobníkom (aké dáta z neho vyberá a aké vkladá).
Naskytajú sa dve možnosti implementácie blokov. Prvá je, že bloky budú uložené spolu s operačným systémom v mikrokontroléri ako podprogramy. Užívateľský program bude iba odkazovať na tieto bloky. Druhá možnosť je využiť v užívateľskom programe priamo napísané funkčné bloky a poskladať program z nich.
Pre realizáciu jednoduchších príkazov som vybral druhú možnosť, keďže je rýchlejšia na vykonávanie. Prvá možnosť bola zvolená iba pre príkazy pracujúce s premennými v plávajúcej desatinnej čiarke (ADDF, SUBF, ... ). Operácie v plávajúcej desatinnej čiarke sú pomerne pomalé, takže navýšenie času predávaním parametrov cez registre je zanedbateľný. Naproti tomu sú pomerne rozsiahle, takže ak by sa mali vkladať zakaždým, keď je v programe daný príkaz použitý, rýchlo by sa zaplnila pamäť určená pre program.
Aritmetické príkazy využívajú rôzne veľkosti dát (8, 16, 32-bit). V tabuľke rozsah konštánt sú uvedené rozsahy daných konštánt.
Typ konštanty | Rozsah dekadicky |
---|---|
B | 0 ... 255 |
W | -32 768 ... 32 767 |
D | -2 147 483 648 ... 2 147 483 647 |
F | ±10-45 ... ±1039 |
Riadiace funkčné bloky
Začiatok a koniec užívateľského programu
Na začiatku užívateľského programu je potrebné zálohovanie ukazateľa zásobníka. Keďže program nemusí mať rovnaký počet inštrukcií pop a push (resp. počet inštrukcií push môže prevyšovať počet inštrukcií pop, opačne nie), program by sa na konci nevrátil späť do riadiacej slučky správne.
Na konci programu sa ukazateľ zásobníka obnoví späť na hodnotu ako mal pri zavolaní programu. Program sa ukončí inštrukciou RET (návrat z podprogramu), keďže užívateľský program je z operačného systému volaný ako podprogram (funkcia).
Funkčné bloky logických operácii
A
Príkaz A vyberie z vrcholu zásobníka hodnotu a spraví logický súčin s hodnotou zadanou ako parameter príkazu. Výsledok uloží na vrchol zásobníka.
Vzor príkazu | A PX.Y A V0.0 |
Výber zo zásobníka | 1. operand |
Vloženie do zásobníka | výsledok |
AN
Príkaz AN vyberie z vrcholu zásobníka hodnotu a spraví logický súčin s negovanou hodnotou zadanou ako parameter príkazu. Výsledok uloží na vrchol zásobníka.
Vzor príkazu | AN PX.Y AN V0.0 |
Výber zo zásobníka | 1. operand |
Vloženie do zásobníka | výsledok |
O
Príkaz O vyberie z vrcholu zásobníka hodnotu a spraví logický súčet s hodnotou zadanou ako parameter príkazu. Výsledok uloží na vrchol zásobníka.
Vzor príkazu | O PX.Y O V0.0 |
Výber zo zásobníka | 1. operand |
Vloženie do zásobníka | výsledok |
ON
Príkaz O vyberie z vrcholu zásobníka hodnotu a spraví logický súčet s negovanou hodnotou zadanou ako parameter príkazu. Výsledok uloží na vrchol zásobníka.
Vzor príkazu | ON PX.Y ON V0.0 |
Výber zo zásobníka | 1. operand |
Vloženie do zásobníka | výsledok |
ALD
Príkaz ALD vyberie 2 hodnoty z vrcholu zásobníka a spraví s nimi logický súčin. Výsledok vloží späť do zásobníka.
Vzor príkazu | ALD |
Výber zo zásobníka | 1. operand 2. operand |
Vloženie do zásobníka | výsledok |
OLD
Príkaz OLD vyberie 2 hodnoty z vrcholu zásobníka a spraví s nimi logický súčet. Výsledok vloží späť do zásobníka.
Vzor príkazu | OLD |
Výber zo zásobníka | 1. operand 2. operand |
Vloženie do zásobníka | výsledok |
NOT
Príkaz NOT neguje hodnotu na vrchole zásobníka.
Vzor príkazu | NOT |
Výber zo zásobníka | operand |
Vloženie do zásobníka | výsledok |
=
Príkaz = nastaví bit v zadanom bajte a zadanom pamäťovom priestore na hodnotu vrcholu zásobníka. Napríklad = P0.0 nastaví 0. bit v 0. bajte pamäťového priestoru P na hodnotu vrcholu zásobníka. Vrchol zásobníka nijako nemení.
Vzor príkazu | = PX.Y = P0.0 |
Výber zo zásobníka | operand |
Vloženie do zásobníka | operand |
S
Príkaz S nastaví bit v zadanom bajte a zadanom pamäťovom priestore, ak je hodnota vrcholu zásobníka 1. Napríklad S P0.0 nastaví 0. bit v 0. bajte pamäťového priestoru P na hodnotu 1, ak je na vrchole zásobníka 1. Vrchol zásobníka nijako nemení.
Vzor príkazu | S PX.Y S P0.0 |
Výber zo zásobníka | operand |
Vloženie do zásobníka | operand |
R
Príkaz R vynuluje bit v zadanom bajte a zadanom pamäťovom priestore, ak je hodnota vrcholu zásobníka 1. Napríklad S P0.0 nastaví 0. bit v 0. bajte pamäťového priestoru P na hodnotu 1, ak je na vrchole zásobníka 1. Vrchol zásobníka nijako nemení.
Vzor príkazu | R PX.Y R P0.0 |
Výber zo zásobníka | operand |
Vloženie do zásobníka | operand |
PE
Príkaz PE detekuje nábežnú hranu. Predchádzajúci stav je uložený na adrese zadanej ako argument. Príkaz vyberie z vrcholu zásobníka hodnotu a zistí, či sa zmenila zo stavu 0 do stavu 1. Ak áno uloží na vrchol zásobníka 1, inak 0.
Vzor príkazu | PE PX.Y PE V0.0 |
Výber zo zásobníka | operand |
Vloženie do zásobníka | výsledok |
NE
Príkaz NE detekuje dobežnú hranu. Predchádzajúci stav je uložený na adrese zadanej ako argument. Príkaz vyberie z vrcholu zásobníka hodnotu a zistí, či sa zmenila zo stavu 1 do stavu 0. Ak áno uloží na vrchol zásobníka 1, inak 0.
Vzor príkazu | NE PX.Y NE V0.0 |
Výber zo zásobníka | operand |
Vloženie do zásobníka | výsledok |
Funkčné bloky pre prácu so zásobníkom
LD
Príkaz LD uloží na vrchol zásobníka hodnotu bitu v zadanom bajte a pamäťovom priestore. Napríklad LD P0.0 uloží 0. bit z 0. bajtu v pamäťovom priestore P na vrchol zásobníka.
Vzor príkazu | LD PX.Y LD P1.4 |
Výber zo zásobníka | - |
Vloženie do zásobníka | operand |
LDN
Príkaz LDN uloží na vrchol zásobníka negovanú hodnotu bitu v zadanom bajte a pamäťovom priestore. Napríklad LD P0.0 uloží negovaný 0. bit z 0. bajtu v pamäťovom priestore P na vrchol zásobníka.
Vzor príkazu | LDN PX.Y LDN P1.4 |
Výber zo zásobníka | - |
Vloženie do zásobníka | negovaný operand |
LPR, LPS
Príkaz LPR, LPS skopíruje hodnotu vrcholu zásobníka na vrchol zásobníka. Takže 2 vrchné bity budú mať rovnakú hodnotu.
Vzor príkazu | LPR |
Výber zo zásobníka | operand |
Vloženie do zásobníka | operand operand |
LPP
Príkaz LPP zahodí hodnotu z vrcholu zásobníka.
Vzor príkazu | LPP |
Výber zo zásobníka | operand |
Vloženie do zásobníka | - |
Funkčné bloky na presun dát
MOVB, MOVW, MOVD, MOVF
Príkazy MOV kopírujú dáta (veľkosti 1B pre MOVB, 2B pre MOVW a 4B pre MOVD a MOVF) z adresy zadanej ako druhý parameter do adresy zadanej ako prvý parameter. Presun sa vykoná iba vtedy ak je na vrchole zásobníka hodnota 1. Ak je ako druhý parameter zadaná konštanta, tak sa konštanta vloží na adresu, ktorá je ako prvý parameter.
Napríklad MOVB V0,V1 skopíruje hodnotu z adresy 1 do adresy 0 v pamäťovom priestore V. Príkazy nemenia vrchol zásobníka.
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | MOVB PX1,PX2 MOVB PX,K MOVB V0,V1 MOVD V0,-2 589 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | povolenie |
Porovnávacie funkčné bloky
==B, ==W, ==D, ==F
Príkazy == porovnávajú medzi sebou dve hodnoty alebo hodnotu a konštantu, zadané ako operandy v prípade, že na vrchole zásobníka je 1. Do zásobníka uloží 1 ak sa hodnoty rovnajú.
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | ==B PX1,PX2 ==B PX,K ==B V0,V1 ==D V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | výsledok |
<>B, <>W, <>D, <>F
Príkazy <> porovnávajú medzi sebou dve hodnoty alebo hodnotu a konštantu, zadané ako operandy v prípade, že na vrchole zásobníka je 1. Do zásobníka uloží 1 ak sa hodnoty nerovnajú.
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | <>B PX1,PX2 <>B PX,K <>B V0,V1 <>D V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | výsledok |
<B, <W, <D, <F
Príkazy < porovnávajú medzi sebou dve hodnoty alebo hodnotu a konštantu, zadané ako operandy v prípade, že na vrchole zásobníka je 1. Do zásobníka uloží 1 ak je 1. operand menší ako 2. .
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | <B PX1,PX2 <B PX,K <B V0,V1 <D V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | výsledok |
<=B, <=W, <=D, <=F
Príkazy <= porovnávajú medzi sebou dve hodnoty alebo hodnotu a konštantu, zadané ako operandy v prípade, že na vrchole zásobníka je 1. Do zásobníka uloží 1 ak je 1. operand menší alebo rovný ako 2. .
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | <=B PX1,PX2 <=B PX,K <=B V0,V1 <=D V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | výsledok |
>B, >W, >D, >F
Príkazy > porovnávajú medzi sebou dve hodnoty alebo hodnotu a konštantu, zadané ako operandy v prípade, že na vrchole zásobníka je 1. Do zásobníka uloží 1 ak je 1. operand väčší ako 2. .
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | >B PX1,PX2 >B PX,K >B V0,V1 >D V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | výsledok |
>=B, >=W, >=D, >=F
Príkazy >= porovnávajú medzi sebou dve hodnoty alebo hodnotu a konštantu, zadané ako operandy v prípade, že na vrchole zásobníka je 1. Do zásobníka uloží 1 ak je 1. operand väčší alebo rovný ako 2. .
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | >=B PX1,PX2 >=B PX,K >=B V0,V1 >=D V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | výsledok |
Aritmetické funkčné bloky
ADDB, ADDW, ADDD, ADDF
Príkazy ADD sčítajú 2 hodnoty v prípade, že na vrchole zásobníka je 1.
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | ADDB PX1,PX2,PX3 ADDB PX1,PX2,K ADDW V23,V23,V16 ADDD V0,V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | povolenie |
SUBB, SUBW, SUBD, SUBF
Príkazy SUB odčítajú 2 hodnoty v prípade, že na vrchole zásobníka je 1.
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | SUBB PX1,PX2,PX3 SUBB PX1,PX2,K SUBW V23,V23,V16 SUBD V0,V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | povolenie |
MULB, MULW, MULD, MULF
Príkazy MUL vynásobia 2 hodnoty v prípade, že na vrchole zásobníka je 1.
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | MULB PX1,PX2,PX3 MULB PX1,PX2,K MULW V23,V23,V16 MULD V0,V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | povolenie |
DIVB, DIVW, DIVD, DIVF
Príkazy DIV vydelia 2 hodnoty v prípade, že na vrchole zásobníka je 1.
Rozsah konštánt je uvedený v tabuľke rozsah konštánt.
Vzor príkazu | DIVB PX1,PX2,PX3 DIVB PX1,PX2,K DIVW V23,V23,V16 DIVD V0,V0,2 345 790 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | povolenie |
INCB, INCW, INCD
Príkazy INC pripočítajú 1 k hodnote v prípade, že na vrchole zásobníka je 1.
Vzor príkazu | INCB PX INCW V12 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | povolenie |
DECB, DECW, DECD
Príkazy DEC odpočítajú 1 od hodnoty v prípade, že na vrchole zásobníka je 1.
Vzor príkazu | DECB PX DECW V12 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | povolenie |
Ostatné funkčné bloky
TON
Príkaz TON zapína časovač zapnutia. Ak je na vrchole zásobníka 1, časovač je rozopnutý (uloží do zásobníka 0). Po dosiahnutí zadaného času K.rozlíšenie_časovača sa časovač zopne (uloží do zásobníka 1).
Vzor príkazu | TON TX,K TON T10,8 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | stav |
TOFF
Príkaz TON zapína časovač zapnutia. Ak je na vrchole zásobníka 1, časovač je zopnutý (uloží do zásobníka 1). Po dosiahnutí zadaného času K.rozlíšenie_časovača sa časovač rozopne (uloží do zásobníka 0).
Vzor príkazu | TOFF TX,K TOFF T10,8 |
Výber zo zásobníka | povolenie |
Vloženie do zásobníka | stav |
CU
Príkaz CU počíta impulzy na vstupe. Vyberie z vrcholu zásobníka 2 hodnoty (prvá je reset, druhá vstup) a ak na vstupe bola nábežná hrana, tak pripočíta 1. Ak hodnota dosiahne K, tak vloží do zásobníka 1.
Vzor príkazu | CU CX,K CU C5,245 |
Výber zo zásobníka | reset vstup |
Vloženie do zásobníka | stav |
CD
Príkaz CD odpočítava impulzy na vstupe od hodnoty K. Vyberie z vrcholu zásobníka 2 hodnoty (prvá je reset, druhá vstup) a ak na vstupe bola nábežná hrana, tak odpočíta 1. Ak hodnota dosiahne 0, tak vloží do zásobníka 1.
Vzor príkazu | CD CX,K CD C17,-456 |
Výber zo zásobníka | reset vstup |
Vloženie do zásobníka | stav |