Funkčné bloky programu pre 1PLC

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání

Funkčné bloky programu

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 \ref{tab:konstanty} sú uvedené rozsahy daných konštánt.

Rozsah 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
operand
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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | MOVB PX$_1$,PX$_2$
MOVB PX,K
MOVB V0,V1
MOVD V0,$-2\,589$ |- Výber zo zásobníka | povolenie |- Vloženie do zásobníka | povolenie |- \end{tabular} \end{center}

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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | ==B PX$_1$,PX$_2$
==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 |- \end{tabular} \end{center}

<>B, <>W, <>D, <>F

Príkazy \textless \textgreater  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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | <>B PX$_1$,PX$_2$
<>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 |- \end{tabular} \end{center}

<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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | <B PX$_1$,PX$_2$
<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 |- \end{tabular} \end{center}


<=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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | <=B PX$_1$,PX$_2$
<=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 |- \end{tabular} \end{center}

=== >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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | >B PX$_1$,PX$_2$
>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 |- \end{tabular} \end{center}

>=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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | >=B PX$_1$,PX$_2$
>=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 |- \end{tabular} \end{center}

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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | ADDB PX$_1$,PX$_2$,PX$_3$
ADDB PX$_1$,PX$_2$,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 |- \end{tabular} \end{center}

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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | SUBB PX$_1$,PX$_2$,PX$_3$
SUBB PX$_1$,PX$_2$,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 |- \end{tabular} \end{center}

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 \ref{tab:konstanty}.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | MULB PX$_1$,PX$_2$,PX$_3$
MULB PX$_1$,PX$_2$,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 |- \end{tabular} \end{center}

INCB, INCW, INCD

Príkazy INC pripočítajú 1 k hodnote v prípade, že na vrchole zásobníka je 1.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | INCB PX
INCW V12 |- Výber zo zásobníka | povolenie |- Vloženie do zásobníka | povolenie |- \end{tabular} \end{center}

DECB, DECW, DECD

Príkazy DEC odpočítajú 1 od hodnoty v prípade, že na vrchole zásobníka je 1.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | DECB PX
DECD V48 |- Výber zo zásobníka | povolenie |- Vloženie do zásobníka | povolenie |- \end{tabular} \end{center}

\subsection{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).

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | TON TX,K
TON T10,8 |- Výber zo zásobníka | povolenie |- Vloženie do zásobníka | stav |- \end{tabular} \end{center}

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).

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | TOFF TX,K
TOFF T10,8 |- Výber zo zásobníka | povolenie |- Vloženie do zásobníka | stav |- \end{tabular} \end{center}

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.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | CU CX,K
CU C5,245 |- Výber zo zásobníka | reset
vstup |- Vloženie do zásobníka | stav |- \end{tabular} \end{center}

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.

\begin{center} \begin{tabular}{|l|l|} |- Vzor príkazu | CD CX,K
CD C17,$-456$ |- Výber zo zásobníka | reset
vstup |- Vloženie do zásobníka | stav |- \end{tabular} \end{center}