1. CESKE VYSOKE UCEN´ TECHNICKE V PRAZE
ˇ ´ ´ ˇ I ´
Fakulta elektrotechnick´
a
Softwarov´ PLC
e
Diplomov´ pr´ce
a a
Vladim´r Kloz
ı
Vedouc´ pr´ce: Ing. Frantiˇek Vacek
ı a s
Praha, 2003
2. Prohl´ˇen´
as ı
Prohlaˇuji, ˇe jsem diplomovou pr´ci vˇetnˇ doprovodn´ho programov´ho vybaven´
s z a c e e e ı
vypracoval samostatnˇ s pouˇit´ uveden´ literatury a konzultac´ s vedouc´ diplo-
e z ım e ı ım
mov´ pr´ce Ing. Frantiˇkem Vackem.
e a s
Nem´m z´vaˇn´ d˚vod proti uˇit´ tohoto ˇkoln´ d´ ve smyslu § 60 Z´kona
a a z y u z ı s ıho ıla a
ˇ.121/2000 Sb. , o pr´vu autorsk´m, o pr´vech souvisej´ ıch s pr´vem autorsk´m a o
c a e a ıc´ a y
zmˇnˇ nˇkter´ch z´kon˚ (autorsk´ z´kon).
e e e y a u y a
V Praze dne: 13.ledna 2004 Vladim´ Kloz
ır
3. Podˇkov´n´
e a ı
Dˇkuji panu Ing. Frantiˇku Vackovi za cenn´ rady a pˇipom´
e s e r ınky, kter´ mi poskytl
e
bˇhem konzultac´ pˇi zpracov´n´ diplomov´ pr´ce.
e ı r a ı e a
Vladim´ Kloz
ır
2
4. Abstrakt
C´ılem t´to diplomov´ pr´ce je vytvoˇit softwarov´ PLC s vlastnostmi definovan´mi v
e e a r e y
normˇ IEC-1131-3, kter´ bude fungovat pod operaˇn´ syst´mem Real-Time Linux.
e e c ım e
Cel´ syst´m je vytvoˇen jako preprocesor ze zvolen´ho programovac´ jazyka pro PLC
y e r e ıho
(zvolen byl jazyk Instruction List) do jazyka C++.
V´sledkem pˇekladu programu pro PLC je modul zavediteln´ do oblasti kernelu
y r y
operaˇn´ syst´mu Real-Time Linux, kter´ prezentuje program pro PLC.
c ıho e y
Souˇast´ pr´ce je tak´ vytvoˇen´ z´kladn´ podpory pro pˇ´
c´ ı a e r ı a ı rıstup z PLC programu na
zaˇ´ ı digit´ln´ vstup˚/v´stup˚ (implementov´ny jsou napˇ. ovladaˇe pro paraleln´
rızen´ a ıch u y u a r c ı
port, ovladaˇ PCI karty Labcard PCI-1750 atd.).
c
Abstract
The intention of this thesis to realize software PLC with features defined in the norm
IEC-1131-3, which will run under Real-Time Linux operating system. The system is de-
signed as preprocesor from selected programming language for PLC (selected language
was Instruction List) into C++ language.
The result of PLC program compilation is Real-Time Linux kernel module, that is
representing software PLC.
The part of this thesis is also creation of basic support for access to digital in-
puts/outputs from PLC program (implemented are drivers for parallel port, PCI card
PLX-1750 etc.).
3
7. ˇ ızen´ motorku pomoc´ softwarov´ho PLC
C R´ ı ı e 77
ˇ ıd´ ı
C.1 R´ ıc´ program motorku . . . . . . . . . . . . . . . . . . . . . . . . . . 77
C.2 Vizualizaˇn´ program . . . . . . . . . . . . . . . . . . . . . . . . . . . .
c ı 78
D Obsah pˇiloˇen´ho CD
r z e 80
Literatura 81
iii
8. ´
Uvod
C´ılem t´to pr´ce je vytvoˇit takzvan´ Softwarov´ PLC. Pod pojmem Softwarov´ PLC
e a r e e e
si v naˇem pˇ´ e pˇedstavujeme softwarov´ emul´tor programov´ k´du urˇen´ho
s rıpadˇ r y a e o c e
pro PLC. Tento emul´tor by mˇl b´t vytvoˇen pod operaˇn´ syst´mem RT-Linux
a e y r c ım e
na procesorov´ platformˇ Intel, mˇl by podporovat vybran´ programovac´ jazyk pro
e e e y ı
PLC a komunikovat s PCI kartou digit´ln´ vstup˚/v´stup˚. PLC by mˇlo splˇovat
a ıch u y u e n
vlastnosti definovan´ normou IEC-1131[5].
e
PLC je zkratka pro programovateln´ logick´ automat. Jedn´ se o zaˇ´ ı urˇen´
y y a rızen´ c e
zejm´na pro ˇ´ ıc´ a regulaˇn´ techniku. V podstatˇ je to mikroprocesorem osazen´
e rıd´ ı c ı e y
syst´m obvykle umoˇnuj´ ı rozˇ´ren´ o dalˇ´ moduly (napˇ. moduly digit´ln´ vstup˚/v´-
e zˇ ıc´ sıˇ ı sı r a ıch u y
stu-p˚, A/D a D/A pˇevodn´
u r ıky, moduly pro pr˚myslov´ sbˇrnice atd.). Ve vˇtˇinˇ
u e e es e
pˇ´ u lze tyto syst´my programovat pomoc´ tˇech z´kladn´ programovac´ jazyk˚:
rıpad˚ e ı r a ıch ıch u
IL (instruction list - obdoba assembleru, ST (structured text - obdoba jazyka Pascal)
a tzv. ˇebˇ´ckov´ch diagram˚. Instrukˇn´ soubor je velmi jednoduch´ se zamˇˇen´ na
z rıˇ y u c ı y er ım
ˇ´ ı a regulaci. Programovac´ jazyky pro PLC jsou detailnˇ pops´ny v [5].
rızen´ ı e a
Operaˇn´ syst´m Linux je volnˇ ˇiˇiteln´ syst´m Unix dostupn´ vˇetnˇ zdrojov´ch
c ı e esr y e y c e y
k´d˚. Vlastn´ Linux je pouze j´dro operaˇn´ syst´mu. Operaˇn´ syst´m je ˇ´ren v
o u ı a c ıho e c ı e sıˇ
distribuc´ 1 , kter´ kromˇ j´dra operaˇn´ syst´mu obsahuj´ tak´ dalˇ´ utility a pro-
ıch e e a c ıho e ı e sı
gramy. Na z´kladˇ klasick´ho j´dra (kernelu) byl n´slednˇ vytvoˇen tzv. RT-Linux.
a e e a a e r
Jedn´ se o rozˇ´ren´ kernelu o vlastnosti hard real-time operaˇn´ syst´mu, pˇiˇemˇ
a sıˇ ı c ıho e rc z
jsou zachov´ny pˇedchoz´ v´hody norm´ln´ j´dra a pˇ´
a r ı y a ıho a rıpadn´ zvolen´ distribuce ve
e e
smyslu existence a pouˇitelnosti ovladaˇ˚ zaˇ´ ı a utilit. Vlastn´ real-time ukoly pot´
z cu rızen´ ı ´ e
bˇˇ´ s vyˇˇ´ prioritou neˇ linuxov´ j´dro jako real-time vl´kna v pamˇt ov´m prostoru
ezı ssı z e a a e’ e
j´dra.
a
V ˇasti 1 je uveden rozbor ˇeˇen´ a volba n´sledn´ implementace. Kapitola 2 se
c´ r s ı a e
v kr´tkosti zab´v´ histori´ a vlastnostmi operaˇn´ syst´mu RT-Linux a moˇnostmi
a y a ı c ıho e z
jazyka C++ pˇi vyuˇit´ v RT-Linuxu. Kapitola 3 se zab´v´ zp˚sobem zpracov´n´ zdro-
r z ı y a u a ı
jov´ho programu pro PLC pomoc´ koneˇn´ho stavov´ho automatu. Kapitoly 4, 5, 6 a 7
e ı c e e
se vˇnuj´ zpracov´n´ jednotliv´ch ˇ´st´ zdrojov´ho k´du. Kapitola 2.1 popisuje zp˚sob
e ı a ı y ca ı e o u
implementace a podpory v operaˇn´ syst´mu RT-Linux, vˇetnˇ vytv´ˇen´ ovladaˇ˚
c ım e c e ar ı cu
zaˇ´ ı pro vyuˇit´ v softwarov´m PLC. Kapitola 9 popisuje vlastn´ utilitu plc2cpp a
rızen´ z ı e ı
jej´ vyuˇit´ pˇi tvorbˇ softwarov´ho PLC. Pˇ´
ı z ı r e e rıloha B uv´d´ celkov´ pˇehled vlastnost´
a ı y r ı
vytvoˇen´ho softwarov´ho PLC v porovn´n´ s normou IEC-1131-3. V pˇ´
r e e a ı rıloze A je uve-
1
Napˇ. RedHat Linux, Debian, Slackware atp.
r
1
9. OBSAH OBSAH
den kr´tk´ n´vod na zprovoznˇn´ RT-Linuxu. Pˇ´
a y a e ı rıloha C se kr´tce zab´v´ vytvoˇen´m
a y a r y
uk´zkov´m PLC programem pro ˇ´ ı ot´ˇek stejnosmˇrn´ho motorku.
a y rızen´ ac e e
2
10. Kapitola 1
N´vrh ˇeˇen´
a r s ı
Norma IEC-1131-3 zab´vaj´ ı se problematikou programovac´ jazyk˚ pro PLC defin-
y ıc´ ıch u
uje z´kladn´ programovac´ jazyky uveden´ v tab.1.1. Jazyky IL, ST a LD maj´ tu
a ı ı e ı
v´hodu, ˇe jsou mezi sebou navz´jem pˇevoditeln´, pro vlastn´ kompilaci programu
y z a r e ı
staˇ´ implementace libovoln´ho z nich a n´sledn´ vytvoˇen´ konverzn´ utility z ostatn´
cı e a e r ı ı ıch
programovac´ jazyk˚.
ıch u
N´zev jazyka
a Popis
IL Instruction List - jednoduch´ programovac´
y ı
jazyk, obdoba assembleru.
ST Structured Text - pokroˇilejˇ´ programovac´
c sı ı
jazyk, obdoba jazyka Pascal ˇi C.
c
LD Ladder diagram - grafick´ n´stroj pro pro-
y a
gramov´n´ PLC, automat se v tomto pˇ´ e
a ı rıpadˇ
programuje pomoc´ rel´ov´ho schematu.
ı e e
Tabulka 1.1: Pˇehled programovac´ jazyk˚ pro PLC dle IEC-1131-3.
r ıch u
Pro z´pis programov´ho k´du PLC byl zvolen jazyk IL s podporou standardn´
a e o ıch
datov´ch typ˚, ˇ´
y u cıseln´ch typ˚ (pro cel´ i desetinn´ ˇ´
y u a a cısla) a datov´ho typu pro uloˇen´
e z ı
1
ˇasu . Z blok˚ pro z´pis vlastn´ PLC programu byly vybr´ny bloky uveden´ v tab.1.2.
c u a ıho a e
D´le se budeme zab´vat anal´zou moˇn´ch ˇeˇen´ a n´slednou volbou vlastn´ im-
a y y z y r s ı a ı
plementace.
Celkovˇ lze probl´m ˇeˇit bud’ jako interpret zdrojov´ho k´du pro PLC nebo jako
e e r s e o
pˇekladaˇ PLC k´du do jin´ho programovac´ jazyka, ze kter´ho bude n´slednˇ zkom-
r c o e ıho e a e
pilov´na bin´rn´ podoba programu, kter´ odpov´ a programu PLC.
a a ı y ıd´
1. Interpret PLC k´du - v´hodou tohoto ˇeˇen´ je jednoduˇˇ´ pouˇit´ z hlediska
o y r s ı ssı z ı
uˇivatele. Odpad´ totiˇ nutnost po kaˇd´ zmˇnˇ programu prov´dˇt jeho rekom-
z a z z e e e a e
pilaci.
1
Tento datov´ typ je tˇeba zejm´na kv˚li definici spouˇtˇn´ PLC program˚ v konfiguraˇn´ bloku.
y r e u se ı u c ım
3
11. NAVRH RESEN´
´ ˇ ˇ I
N´zev bloku
a Popis
FUNCTION Blok typu funkce. Jedn´ se o blok umoˇnuj´ ı
a zˇ ıc´
volat k´d PLC programu s alespoˇ jedn´
o n ım
vstupn´ parametrem a n´vratovou hodno-
ım a
tou, kter´ se po n´vratu z vol´n´ uloˇ´ jako
a a a ı zı
aktu´ln´ pracovn´ hodnota na z´sobn´
a ı ı a ıku. Pˇi r
kaˇd´m vol´n´ jsou opˇtovnˇ inicializov´ny
z e a ı e e a
vˇechny promˇnn´.
s e e
FUNCTION BLOCK Funkˇn´ blok. Jedn´ se o blok, kter´ m˚ˇe
c ı a y uz
m´ libovoln´ poˇet vstupn´ v´stupn´ a
ıt y c ıch, y ıch
vstupnˇ-v´stupn´ parametr˚. Pˇi pouˇit´
e y ıch u r z ı
funkˇn´ bloku se nejprve deklaruje jeho in-
c ıho
stance jako lok´ln´ promˇnn´. Vnitˇn´ stav
a ı e a r ı
instance funkˇn´ bloku z˚st´v´ zachov´n
c ıho u a a a
po dobu existence promˇnn´, kterou je tato
e e
instance reprezentov´na. a
PROGRAM Programov´ blok. Jedn´ se o obdobu bloku
y a
typu FUNCTION BLOCK s t´ rozd´ ım ılem,
ˇe existuje pouze jedna instance tohoto
z
bloku, kter´ je platn´ po celou dobu
a a
bˇhu programu. V programu nen´ tˇeba
e ı r
deklarovat promˇnnou, kterou je reprezen-
e
tov´na pouˇ´ a instance.
a zıvan´
CONFIGURATION Konfiguraˇn´ blok. Hlavn´ blok definuj´ ı
c ı ı ıc´
glob´ln´ promˇnn´ a obsahuj´ ı definici
a ı e e ıc´
spouˇtˇn´ jednotliv´ch blok˚ typu program.
se ı y u
Tento blok nelze vyuˇ´ pro z´pis pro-
zıt a
gramov´ho k´du v ˇ´dn´m z programovac´
e o za e ıch
jazyk˚. u
Tabulka 1.2: Programov´ bloky zvolen´ pro implementaci.
e e
Hlavn´ nev´hodou ˇeˇen´ je velk´ n´roˇnost na interpret z hlediska jeho stability
ı y r s ı a a c
a odolnosti v˚ˇi chyb´m v PLC programu. Interpret by totiˇ v tomto pˇ´ e
uc a z rıpadˇ
musel fungovat v r´mci kernel-space RT-Linuxu.
a
2. Pˇekladaˇ PLC k´du - v´hododou tohoto ˇeˇen´ je zejm´na moˇnost vytvoˇit
r c o y r s ı e z r
pouze preprocesor do jin´ho jazyka a pro vlastn´ generov´n´ bin´rn´ podoby PLC
e ı a ı a ı
programu vyuˇ´ tento programovac´ jazyk.
zıt ı
Nev´hodou tohoto ˇeˇen´ je nutnost po kaˇd´ zmˇnˇ PLC programu tento pro-
y r s ı z e e e
gram znovu kompilovat.
Pro implementaci softwarov´ho PLC zvol´
e ıme variantu ˇ.2. D˚vodem je moˇnost
c u z
4
12. NAVRH RESEN´
´ ˇ ˇ I
vyuˇ´ jiˇ existuj´ ı kompil´tor jazyka C nebo C++, kter´ je standardnˇ vyuˇ´ an pro
zıt z ıc´ a y e zıv´
programov´n´ ˇ´st´ Linuxov´ho a RT-Linuxov´ho j´dra.
a ı ca ı e e a
Po anal´ze [5] je zˇejm´, ˇe zp˚sob z´pisu programu pro PLC lze nejl´pe reprezen-
y r e z u a e
tovat k´dem v jazyce C++ (podobnost funkˇn´ blok˚ s objekty, moˇnost definovat
o c ıch u z
velk´ mnoˇstv´ funkc´ pomoc´ pˇet´zen´ch oper´tor˚ v podp˚rn´ knihovnˇ atp.).
e z ı ı ı r ıˇ y a u u e e
Zvolen´ ˇeˇen´ odpov´ a funkˇn´
e r s ı ıd´ c ımu diagramu na obr.1.1. C´
ılem diplomov´ pr´ce
e a
tedy bude vytvoˇit konvertor programu pro PLC do jazyka C++. Vygenerovan´ k´d
r y o
bude n´slednˇ pˇeloˇen do modulu j´dra bˇˇ´ ıho v RT-Linuxu. Pro zjednoduˇen´ kon-
a e r z a ezıc´ s ı
verze bude jeˇtˇ tˇeba vytvoˇit podp˚rnou knihovnu pouˇitelnou v oblasti j´dra, kter´
se r r u z a a
bude vyuˇita pˇi pˇekladu C++ k´du.
z r r o
Obr´zek 1.1: Funkˇn´ diagram softwarov´ho PLC
a c ı e
Z obr´zku je patrn´, ˇe softwarov´ PLC bude rozdˇleno na dvˇ hlavn´ ˇ´sti, pˇiˇemˇ
a e z e e e ı ca rc z
pˇeklad programu bude spouˇtˇn v user-space RT-Linuxu a vlastn´ softwarov´ PLC
r se ı e
pobˇˇ´ jako real-time vl´kna RT-Linuxu v r´mci kernel-space. Kr´tk´ rozbor jed-
ezı a a a y
notliv´ch vlastnost´ je uveden v ˇ´stech 1.1 a 1.2.
y ı ca
Bliˇˇ´ informace o RT-Linuxu a nˇkter´ch pouˇit´ch term´
zsı e y z y ınech z pˇedchoz´ ˇ´sti lze
r ı ca
nal´zt v kapitole 2.1, pˇ´
e rıpadnˇ v manu´lov´ch str´nk´ch RT-Linuxu.
e a y a a
5
13. NAVRH RESEN´
´ ˇ ˇ I Funkˇn´ ˇ´st pro user-space
c ı ca
1.1 Funkˇn´ ˇ´st pro user-space
c ı ca
User-space, nebo-li kontext ve kter´m bˇˇ´ uˇivatelsk´ programy bude vyuˇit pro bˇh
e ezı z e z e
preprocesoru (konvertoru) zdrojov´ho k´du. Tento konvertor by mˇl splˇovat n´sleduj´ ı
e o e n a ıc´
poˇadavky:
z
• Umoˇnit pˇedzpracov´n´ k´du ve zvolen´m jazyce pro PLC do jazyka C++ v
z r a ı o e
takov´m tvaru, aby bylo moˇn´ tento k´d zkompilovat do modulu bˇˇ´ ıho v
e z e o ezıc´
RT-Linuxu.
• Moˇnost tvorby a n´sledn´ho vyuˇit´ knihoven funkc´ a funkˇn´ blok˚ pro
z a e z ı ı c ıch u
opakovan´ vyuˇit´
e z ı.
1.2 Funkˇn´ ˇ´st pro kernel-space
c ı ca
Kernel-space, neboli kontext j´dra operaˇn´ syst´mu RT-Linux bude vyuˇit pro
a c ıho e z
vlastn´ bˇh vytvoˇen´ho softwarov´ho PLC. Vygenerovan´ k´d v C++ bude zkom-
ı e r e e y o
pilov´n jako modul j´dra RT-Linuxu. Pro kompilaci bude tˇeba vytvoˇit podp˚rnou
a a r r u
knihovnu, kter´ bude m´ n´sleduj´ ı vlastnosti:
a ıt a ıc´
ˇ s ı
• Reˇen´ emulace aktu´ln´ hodnoty z´sobn´ (tzv. current result), kde je uloˇena
a ı a ıku z
hodnota posledn´ proveden´ operace.
ı e
• Emulace adresov´n´ pˇ´
a ı rıstupu do pamˇti ve stylu PLC vˇetnˇ pˇ´
e c e rıstupu na extern´
ı
zaˇ´ ı dle adresy.
rızen´
• Moˇnost deklarace promˇnn´ch ve stylu PLC, tj. vˇetnˇ pˇ´
z e y c e rıpadn´ specifikace
e
absolutn´ adresy, na kter´ se promˇnn´ nach´z´
ı e e a a ı.
• Moˇnost deklarovat parametry funkc´ funkˇn´ blok˚ a programov´ch blok˚
z ı, c ıch u y u
tak, aby bylo moˇn´ je pˇiˇazovat dle syntaxe PLC.
z e rr
• Moˇnost modul´rnˇ vytv´ˇet ovladaˇe zaˇ´ ı a tyto ovladaˇe n´slednˇ reg-
z a e ar c rızen´ c a e
istrovat na konkr´tn´ adresy vstup˚/v´stup˚ softwarov´ho PLC.
e ı u y u e
6
14. Kapitola 2
RT-Linux
Tato kapitola uv´d´ v ˇ´sti 2.1 z´kladn´ informace t´kaj´ ı se RT-Linuxov´ modifikace
a ı ca a ı y ıc´ e
j´dra a v ˇ´sti 2.2 diskutuje moˇnosti a omezen´ vyuˇit´ jazyka C++ v r´mci RT-
a ca z ı z ı a
Linuxu.
2.1 Princip ˇinnosti RT-Linuxu
c
V t´to ˇ´sti bude v kr´tkosti pops´n princip ˇinnosti RT-Linuxu. Informace zde uveden´
e ca a a c e
jsou z´ any zejm´na z [9], pˇ´
ısk´ e rıpadnˇ z [1].
e
2.1.1 Definice hard real-time syst´mu
e
Tzv. hard real-time syst´m je syst´m, ve kter´m je zaruˇeno ˇasovˇ pˇesn´ spouˇtˇn´
e e e c c e r e se ı
jednotliv´ch uloh. Kaˇd´ uloha m´ definov´nu svoji prioritu, se kterou je spouˇtˇna a
y ´ z a´ a a se
periodu spouˇtˇn´
s e ı.
Perioda spouˇtˇn´ je v podstatˇ tzv. dead-line, tj. nejpozdˇjˇ´ ˇas, do kter´ho mus´
se ı e e sı c e ı
b´t dan´ real-time uloha dokonˇena, aby mohla b´t opˇt spuˇtˇna.
y a ´ c y e se
Priorita ulohy definuje ”d˚leˇitost” ulohy z hlediska pl´novaˇe proces˚.
´ u z ´ a c u
2.1.2 Popis RT-Linuxu
RT-Linux je hard real-time operaˇn´ syst´m urˇen´ pro ˇ´ ı robot˚ a technologick´ch
c ı e c y rızen´ u y
proces˚, ˇasovˇ n´roˇn´ mˇˇen´ a jin´ ulohy n´roˇn´ na ˇas.
u c e a c a er ı e´ a c e c
Dle n´roˇnosti vykon´van´ ulohy a mnoˇstv´ spouˇtˇn´ch vl´ken lze dos´hnout
a c a e ´ z ı se y a a
periody spouˇtˇn´ v ˇ´du mikrosekund.
s e ı ra
V´hodou RT-Linuxu je, ˇe rozˇiˇuje moˇnosti pouˇit´ klasick´ho unixov´ho syst´mu
y z sr z z ı e e e
o hard real-time vlastnosti pˇi zachov´n´ p˚vodn´ funkˇnosti syst´mu.
r a ı u ı c e
7
15. RT-LINUX Princip ˇinnosti RT-Linuxu
c
2.1.3 Princip ˇinnosti
c
Vlastn´ syst´m je implementov´n jednak jako patch1 klasick´ho Linuxov´ho j´dra, kter´
ı e a e e a y
s’
zajiˇt uje obsluhu pˇeruˇen´ pˇed vlastn´ Linuxov´m kernelem. Druh´ ˇ´st jsou dy-
r s ı r ım y a ca
e e ı s’ ı
namicky nahr´van´ moduly, kter´ po sv´m zaveden´ zajiˇt uj´ vlastn´ hard real-time
a e ı
funkcionalitu (pl´nov´n´ proces˚, poskytnut´ synchronizaˇn´ primitiv, moˇnosti ko-
a a ı u ı c ıch z
munikace s user-space ˇ´st´ linuxu atd.).
ca ı
Jak vlastn´ RT-Linuxov´ syst´m funguje je dobˇe patrn´ z obr.2.1.
ı y e r e
Obr´zek 2.1: Blokov´ schema funcionality RT-Linuxov´ extenze.
a e e
Cel´ syst´m funguje n´sledovnˇ:
y e a e
• Po zaveden´ RT-Linuxov´ch modul˚ jsou vˇechna pˇeruˇen´ odchyt´v´na RT-
ı y u s r s ı a a
Linuxem.
• Pokud je vyvol´no pˇeruˇen´ je zpracov´no RT-Linuxem, v pˇ´ e, ˇe je pˇeruˇen´
a r s ı, a rıpadˇ z r s ı
vyuˇ´ ano nˇkterou real-time ulohou, je vyvol´n handler pˇeruˇen´ t´to ulohy.
zıv´ e ´ a r s ı e ´
1
Patchem je obvykle naz´v´na soubor, obsahuj´ ı upravu ˇi oprava zdrojov´ho k´du nˇjak´ho
y a ıc´ ´ c e o e e
programu. Aplikac´ patche na zdrojov´ soubory p˚vodn´ programu je pak z´ ana nov´, upraven´
ı e u ıho ısk´ a a
verze.
8
16. RT-LINUX RT-Linux a C++
• Pokud existuj´ napl´novan´ real-time ulohy ˇekaj´ ı na voln´ ˇas procesoru, pak
ı a e ´ c ıc´ yc
jsou spuˇtˇny (v z´vislosti na prioritˇ).
se a e
• Pokud nen´ ve frontˇ ˇ´dn´ real-time uloha a procesor je voln´, je pˇed´no ˇ´ ı
ı e za a ´ y r a rızen´
p˚vodn´
u ımu linuxov´mu j´dru.
e a
• P˚vodn´ linuxov´ j´dro vyuˇ´ a pˇeruˇen´ kter´ jsou emulov´na RT-Linuxem2 .
u ı e a zıv´ r s ı, a a
2.1.4 Vyuˇit´ matematick´ho koprocesoru
z ı e
V pˇ´ e, ˇe real-time vl´kno chce vyuˇ´
rıpadˇ z a zıvat matematick´ koprocesor (d´le jen FPU),
y a
3
je nutno tuto skuteˇnost ozn´mit pl´novaˇi proces˚ . Pl´novaˇ n´slednˇ zajist´ pˇi
c a a c u a c a e ı r
pˇep´ an´ takov´ho vl´kna uloˇen´ stavu registr˚ FPU a jejich pˇ´
r ın´ ı e a z ı u rıpadn´ obnoven´ ve
e ı
chv´ kdy vl´kno pokraˇuje ve sv´m bˇhu.
ıli, a c e e
Pokud pl´novaˇ proces˚ nen´ informov´n, ˇe vl´kno vyuˇ´ a FPU m˚ˇe doch´zet
a c u ı a z a zıv´ uz a
k navracen´ chybn´ch v´sledk˚ v´poˇtu. K tomu m˚ˇe doj´ z n´sleduj´ ıch d˚vod˚:
ı y y u y c uz ıt a ıc´ u u
1. FPU v jeden okamˇik vyuˇ´ a program z user-space a z´roveˇ real-time vl´kno.
z zıv´ a n a
2. FPU v jeden okamˇik vyuˇ´ ı alespoˇ dvˇ real-time vl´kna.
z zıvaj´ n e a
3. FPU je v jeden okamˇik poˇadov´no nˇkolika real-time vl´kny i programy z user-
z z a e a
space.
2.2 RT-Linux a C++
V RT-Linuxu je moˇno vyuˇ´
z zıvat programovac´ jazyka C++ pro tvorbu real-time
ıho
vl´ken. Pouˇit´ vˇak m´ jist´ omezen´ kter´ vypl´vaj´ jiˇ pˇ´
a z ı s a a ı, a y ı z rımo z principu, jak´my
syst´m funguje.
e
N´sleduj´ ı ˇ´sti se postupnˇ zab´vaj´ jednotliv´mi konstrukcemi jazyka C++ a je-
a ıc´ ca e y ı y
jich pouˇit´ v RT-Linuxu. C´
z ım ˇ ast 2.2.1 diskutuje pouˇit´ dynamick´ alokace pamˇti,
z ı e e
ˇ´st 2.2.2 kr´tce diskutuje pouˇit´ exceptions4 a ˇ´st 2.2.3 diskutuje pouˇit´ tem-
ca a z ı ca z ı
plates(ˇablon).
s
2.2.1 Dynamick´ alokace pamˇti
a e
Probl´m pouˇit´ dynamick´ alokace pamˇti lze rozdˇlit na ˇ´st, kter´ se t´k´ alokov´n´
e z ı e e e ca a y a a ı
pamˇti bˇhem inicializace real-time modulu a problematiku dynmick´ alokace pamˇti
e e e e
bˇhem vlastn´ bˇhu real-time procesu (tj. alokace pamˇti pˇ´ z bˇˇ´ ıho RT vl´kna).
e ıho e e rımo ezıc´ a
2
V podstatˇ lze ˇinnost p˚vodn´ linuxov´ho j´dra pˇirovnat ke zvl´ˇtn´
e c u ıho e a r as ımu real-time vl´knu RT-
a
Linuxu, bˇˇ´ ımu s nejniˇˇ´ real-time prioritou.
ezıc´ zsı
3
To je moˇn´ zajistit bud’ informac´ pˇi zakl´d´n´ real-time vl´kna nebo nastaven´ stejn´ho
z e ı r a a ı a ım e
parametru za bˇhu real-time vl´kna.
e a
4
Tj. vyj´
ımek pro oˇetˇen´ chybov´ch stav˚ pˇi bˇhu programu
s r ı y u r e
9
17. RT-LINUX RT-Linux a C++
Oba tyto probl´my lze ˇeˇit za pomoci pˇet´zen´ C++ oper´toru new a delete,
e r s r ıˇ ı a
pˇ´
rıpadnˇ oper´tor˚ new[] a delete[] pro alokace a uvolˇov´n´ pamˇti dynamick´ch pol´
e a u n a ı e y ı.
V pˇ´ e, ˇe potˇebujeme dynamicky alokovat pamˇt e
rıpadˇ z r e ’ bˇhem inicializace, pˇ´
rıpadnˇe
deinicializace modulu, staˇ´ pˇet´zit standardn´ C++ oper´tory uveden´ v´ˇe na vol´n´
cı r ıˇ ı a e ys a ı
linuxov´ho j´dra kalloc(), pˇ´
e a rıpadnˇ kfree(). Toto pˇet´zen´ je jiˇ standardnˇ provedeno
e r ıˇ ı z e
v souboru rtl cpp.h, kter´ je souˇ´st´ distribuce RT-Linux.
y ca ı
z r e’
Za pˇedpokladu, ˇe je tˇeba dynamicky alokovat pamˇt za bˇhu real-time vl´kna,
r e a
je tˇeba si vytvoˇit vlastn´ spr´vu dynamick´ pamˇti. D˚vodem je zejm´na moˇnost
r r ı a e e u e z
vzniku kolize pˇi vol´n´ standardn´ syst´mov´ch vol´n´
r a ı ıch e y a ı.
Vlastn´ dynamick´ spr´va pamˇti by mˇla fungovat n´sleduj´ ım zp˚sobem:
ı a a e e a ıc´ u
z e’
1. V okamˇiku inicializace RT modulu naalokuje pamˇt z oblasti j´dra pomoc´ vol´n´
a ı a ı
kmalloc(). Velikost takto alokovan´ pamˇti by mˇla odpov´
e e e ıdat alespoˇ maxim´ln´
n a ı
potˇebn´ velikosti pamˇti, kterou budeme cht´ dynamicky alokovat. Bloky t´to
r e e ıt e
pamˇti mus´ b´t alokov´n ve fyzick´ pamˇti poˇ´ ce.
e ı y a e e cıtaˇ
r ıˇı a s ’ ıc´
2. Pˇet´z´ oper´tory new, new[], delete, delete[] tak, aby volaly funkce zajiˇt uj´ ı
a e’ e
alokaci a dealokaci pamˇti v r´mci pamˇt ov´ho bloku naalokovan´ho bˇhem
e e e
zav´dˇn´ RT modulu (viz. krok 1).
a e ı
e ı e’ e
3. Bˇhem deaktivace modulu provede uvolnˇn´ pamˇt ov´ho bloku, kter´ byl z´ an
e y ısk´
e ’ov´ oblasti linuxov´ho j´dra v okamˇiku zaveden´ modulu do pamˇti.
z pamˇt e e a z ı e
2.2.2 Oˇetˇen´ chyb - exceptions
s r ı
Vyj´ e z e’ e
ımky, nebo tak´ exceptions, nelze bohuˇel v pamˇt ov´m prostoru linuxov´ho j´dra
e a
a tedy ani v oblasti, kter´ je vyuˇ´ ana RT rozˇ´ren´ vyuˇ´ Hlavn´ d˚vodem je,
a zıv´ sıˇ ım zıt. ım u
ˇe linker optimalizuje k´d pro vol´n´ vyj´
z o a ı ımek. Proto by bˇhem linkov´n´ modulu j´dra
e a ı a
musely b´t zn´my vˇechny moduly, kter´ se budou v pamˇti nach´zet.
y a s e e a
Dalˇ´ d˚vodem je, ˇe linuxov´ j´dro je ps´na ˇistˇ v jazyce C a jiˇ bˇhem jeho
sım u z e a a c e z e
kompilace jsou vyj´ımky zak´zany pomoc´ parametru pˇekladaˇe.
a ı r c
2.2.3 Pouˇit´ C++ templates
z ı
ıˇı zıt, ’ e
Templates jako vlastnost jazyka C++ lze bez obt´z´ vyuˇ´ nebot bˇhem kompilace je
takov´ k´d nahrazen skuteˇn´m datov´m typem vˇetnˇ vˇech kontrol bˇhem kompi-
y o c y y c e s e
lace.
Bohuˇel nelze jednoduˇe vyuˇ´ tˇ´ implementovan´ch v knihovnˇ STL5 . D˚vodem
z s zıt rıd y e u
jsou dynamick´ alokace pamˇti, kter´ jsou v tˇchto tˇ´ ach vyuˇ´
e e e e rıd´ zıvany. Omezen´ z toho
ı
plynouc´ jsou uvedena v ˇ´sti 2.2.1. Urˇitou moˇnost´ jak t´to knihovny vyuˇ´ by
ı ca c z ı, e zıt
zˇejmˇ byla vlastn´ rekompilace ze zdrojov´ch k´d˚ se spr´vnˇ pˇet´zen´mi oper´tory
r e ı y o u a e r ıˇ y a
pro spr´vu pamˇti.
a e
5
Standard Template Library.
10
18. Kapitola 3
Lexik´ln´ anal´za zdrojov´ho k´du
a ı y e o
V t´to ˇ´sti se budeme zab´vat vlastn´ zpracov´n´ zdrojov´ho k´du v jazyce IL,
e ca y ım a ım e o
tedy vytvoˇen´ kompil´toru (pˇekladaˇe). Dle [7] lze pˇekladaˇ reprezentovat pomoc´
r ım a r c r c ı
koneˇn´ho stavov´ho automatu. V UNIXov´ch syst´mech jsou k dispozici programy
c e e y e
LEX a YACC, kter´ umoˇnuj´ takov´ stavov´ automat pro zpracov´n´ zdrojov´ho
e zˇ ı y y a ı e
k´du vytvoˇit na z´kladˇ z´pisu pravidel v pˇ´ sn´m tvaru. C´
o r a e a rısluˇ e ˇ ast 3.1 t´to kapitoly se
e
zab´v´ popisem programu LEX, kter´ se vyuˇ´ a pro vytvoˇen´ lexik´ln´ analyzeru
y a y zıv´ r ı a ıho
ˇa
(viz. obr.3.1). C´st 3.2 se zab´v´ popisem jazyka pomoc´ pravidel zadan´ch programu
y a ı y
YACC (na obr.3.1 to odpov´ a syntaktick´mu analyzeru). C´
ıd´ e ˇ ast 3.3 popisuje princip,
jak´m oba v´ˇe uveden´ programy spolupracuj´ pˇi tvorbˇ pˇekladaˇe.
y ys e ı r e r c
Obr´zek 3.1: Kompilaˇn´ sekvence.
a c ı
11
19. LEXIKALN´ ANALYZA ZDROJOVEHO KODU
´ I ´ ´ ´ Lexik´ln´ anal´za zdrojov´ho k´du
a ı y e o
3.1 Lexik´ln´ anal´za zdrojov´ho k´du
a ı y e o
Pro lexik´ln´ anal´zu zdrojov´ho k´du bude vyuˇit program LEX. Informace, kter´ jsou
a ı y e o z e
uvedeny v t´to ˇ´sti jsou ˇerp´ny z [8] a [4]. Program LEX slouˇ´ k vytvoˇen´ parseru
e ca c a zı r ı
zdrojov´ho k´du a pˇevodu kl´cov´ch slov na tzv. tokeny. Z´roveˇ umoˇnuje vytvoˇit
e o r ıˇ y a n zˇ r
stavov´ automat definuj´ ı moˇnou n´slednost r˚zn´ch kl´cov´ch slov ve zdrojov´m
y ıc´ z a u y ıˇ y e
k´du.
o
Vytvoˇen´ stavov´ automat m˚ˇe pracovat dvˇma zp˚soby:
r y y uz e u
1. Stavov´ automat pˇi pˇechodu do dalˇ´ stavu pˇedchoz´ stav zapomene.
y r r sıho r ı
2. Stavov´ automat ukl´d´ stavy na z´sobn´ Zmˇna stavu je moˇn´ dvˇma smˇry:
y a a a ık. e z a e e
• Pˇechod do nov´ho stavu, p˚vodn´ stav je uloˇen na z´sobn´
r e u ı z a ık.
• Z aktu´ln´ stavu se pˇech´z´ do stavu uloˇen´ho na z´sobn´
a ıho r a ı z e a ıku, aktu´ln´
a ı
stav je zapomenut.
3.1.1 Struktura zdrojov´ho k´du pro LEX
e o
Vstupn´ soubor pro LEX je rozdˇlen do tˇech ˇ´st´ tak, jak je patrno z uk´zky 3.1.
ı e r ca ı a
Jednotliv´ ˇ´sti jsou od sebe oddˇleny pomoc´ znaˇek %%.
e ca e ı c
... definice maker a vlastnost´ analyz´toru ...
ı a
%%
... definice pravidel ...
%%
... funkce v jazyce C/C++ ...
Uk´zka 3.1: Struktura vstupn´ souboru pro LEX.
a ıho
Prvn´ ˇ´st obsahuje makra pro zjednoduˇen´ definiˇn´ regul´rn´ v´raz˚ pro vyh-
ı ca s ı c ıch a ıch y u
led´v´n´ kl´cov´ch slov, parametry parseru a pˇ´
a a ı ıˇ y rıpadnˇ zdrojov´ k´d v jazyce C/C++.
e y o
V tab.3.1 je uveden pˇehled kl´cov´ch slov, kter´ mohou b´t v prvn´ ˇ´sti obsaˇeny.
r ıˇ y e y ı ca z
Druh´ ˇ´st vstupn´ souboru obsahuje pravidla ve tvaru regul´rn´ v´raz˚ pro
a ca ıho a ıch y u
zpracov´n´ zdrojov´ho k´du a definici akc´ v jazyce C/C++, kter´ pravidlu odpov´ ı.
a ı e o ı e ıdaj´
Pravidlo m˚ˇe b´t aktivn´ pouze v definovan´ch stavech, akce m˚ˇe obsahovat pˇechod
uz y ı y uz r
do stavu nov´ho nebo do stavu uloˇen´ho na z´sobn´
e z e a ıku. Struktura pravidel je patrn´a
z uk´zky 3.2.
a
Prvn´ ˇ´st pravidla je nepovinn´ a definuje stavy, ve kter´ch je pravidlo platn´,
ı ca a y e
pˇ´
rıpadnˇ stavy, ve kter´ch platn´ nen´ Zde z´leˇ´ na tom, jak je definov´n stav v prvn´
e y e ı. a zı a ı
ˇ´sti vstupn´ souboru.
ca ıho
12
20. LEXIKALN´ ANALYZA ZDROJOVEHO KODU
´ I ´ ´ ´ Lexik´ln´ anal´za zdrojov´ho k´du
a ı y e o
Definice Popis
N´zev reg. v´raz
a y Pˇeddefinovan´ regul´rn´ v´razy, kter´ lze
r e a ı y e
pouˇ´ d´le pro zjednoduˇen´ definiˇn´
zıt a s ı c ıch
pravidel pro vyhled´v´n´ token˚ ve zdro-
a a ı u
jov´m k´du.
e o
%s Definice stav˚, ve kter´ch se m˚ˇe nach´zet
u y uz a
vygenerovan´ stavov´ automat. Na jednom
y y
ˇ´dku se m˚ˇe nach´zet deklarace v´ stav˚
ra uz a ıce u
jejichˇ jm´na jsou oddˇlena mezerou.
z e e
%{ ... %} Ohraniˇen´ zdrojov´ho k´du v jazyce
c ı e o
C/C++, kter´ bude vloˇen tak, jak je
y z
naps´n, na zaˇ´tek vygenerovan´ho zdro-
a ca e
jov´ho k´du parseru.
e o
%option ... Parametry vygenerovan´ho parseru, pokud
e
obsahuje kl´cov´ slovo stack, jsou stavy
ıˇ e
parseru ukl´d´ny na z´sobn´
a a a ık.
Tabulka 3.1: Pˇehled kl´cov´ch slov pouˇiteln´ch v prvn´ ˇ´sti definiˇn´ souboru pro
r ıˇ y z y ı ca c ıho
LEX.
[<stav1[,stav2[,...]]>]reg.v´raz {
y
akce v jazyce C;
}
Uk´zka 3.2: Struktura pravidel pro anal´zu zdrojov´ho k´du.
a y e o
Druh´ ˇ´st je regul´rn´ v´raz, kter´ definuje, jak dan´ kl´cov´ slovo, konstanta
a ca a ı y y e ıˇ e
ˇi jin´ souˇ´st zdrojov´ho k´du je zaps´na. Z´kladn´ struktura regul´rn´ v´raz˚ je
c a ca e o a a ı a ıch y u
pops´na v tab. 3.2, podrobnˇjˇ´ informace o regul´rn´ v´razech lze z´
a e sı a ıch y ıskat napˇ. v [6].
r
V pˇ´ e, ˇe zdrojov´ text obsahuje ˇ´st, kter´ odpov´ a pˇ´ sn´mu regul´rn´
rıpadˇ z y ca a ıd´ rısluˇ e a ımu
v´razu, je tento text uloˇen do promˇnn´ YYTEXT a lze ho pouˇ´ v ˇ´sti pro z´pis
y z e e zıt ca a
pˇ´ sn´ akce, kter´ se vyvol´ pro dan´ v´raz.
rısluˇ e a a y y
V ˇ´sti pro z´pis akce lze zapsat libovolnou akci nebo nepsat nic, pokud se m´ vˇe,
ca a a s
co odpov´ a dan´mu regul´rn´ v´razu ignorovat. V pˇ´ e, ˇe chceme spolupracovat
ıd´ e a ımu y rıpadˇ z
s programem YACC, m˚ˇe akce vypadat napˇ. jako v uk´zce 3.3.
uz r a
Uk´zka 3.4 uv´d´ cel´ vstupn´ soubor pro LEX obsahuj´ ı konkr´tn´ pravidlo, vˇetnˇ
a a ı y ı ıc´ e ı c e
akce v jazyce C. Pravidlo detekuje token jako celoˇ´ cıselnou konstantu ve zdrojov´m e
k´du, pokud se stavov´ automat nach´z´ ve stavu any value.
o y a ı
13
21. LEXIKALN´ ANALYZA ZDROJOVEHO KODU
´ I ´ ´ ´ Lexik´ln´ anal´za zdrojov´ho k´du
a ı y e o
Regul´rn´ v´raz
a ı y Popis
LD Regul´rn´ v´raz je slovo LD.
a ı y
ˆLD Regul´rn´ v´raz je slovo LD na zaˇ´tku
a ı y ca
ˇ´dku.
ra
LD$ Regul´rn´ v´raz je slovo LD na konci ˇ´dku.
a ı y ra
LD/([ ]+) Regul´rn´ v´raz je slovo LD n´sledovan´ li-
a ı y a e
bovoln´m poˇtem mezer nebo tabul´tor˚,
y c a u
ˇ´st za znakem / nen´ uloˇena v promˇnn´
ca ı z e e
YYTEXT a je ponech´na v bufferu pro dalˇ´
a sı
zpracov´n´
a ı.
([0-9]+) Regul´rn´ v´raz je ˇ´ skl´daj´ ı se z libo-
a ı y cıslo a ıc´
voln´ho poˇtu ˇ´
e c cıslic.
{SPACE} Regul´rn´ v´raz odpov´ a definici z prvn´
a ı y ıd´ ıho
bloku zdrojov´ho souboru s n´zvem SPACE.
e a
Tabulka 3.2: Struktura regul´rn´ v´raz˚ v definici pravidel pro LEX.
a ıch y u
// pokud se pr´vˇ nach´z´m ve stavu var_declaration
a e a ı
if (YY_START == var_declaration)
{
// vyzvedni aktu´ln´ stav ze z´sobn´ku (dojde k pˇesunu
a ı a ı r
// do stavu pˇedchoz´ho)
r ı
yy_pop_state();
// a uloˇ na z´sobn´k stav var_data_type
z a ı
yy_push_state(var_data_type);
// uloˇ hodnotu nalezen´ho regul´rn´ho v´razu do promˇnn´
z e a ı y e e
// pro YACC
yylval.string = strdup(yytext);
’
// a vrat informaci, ˇe jsi nalezl datov´ typ
z y
// promˇnn´
e e
return TOK_VAR_DATATYPE;
}
// nejsem v bloku deklarac´ promˇnn´ch,
ı e y
// ale oˇek´v´m deklaraci datov´ho typu
c a a e
// funkce
yylval.string = strdup(yytext);
return TOK_FUNCTION_DATATYPE;
}
Uk´zka 3.3: Z´pis akce pro nalezen´ regul´rn´ v´raz ze zdrojov´ho k´du.
a a y a ı y e o
14
22. LEXIKALN´ ANALYZA ZDROJOVEHO KODU
´ I ´ ´ ´ Popis gramatiky jazyka
%{
#include <stdio.h>
// odkaz na poˇ´tadlo ˇ´dk˚
cı ra u
extern int iLineCount;
%}
// pouˇij z´sobn´k pˇi zmˇnˇ stavu
z a ı r e e
%option stack
// definice povolen´ch stav˚
y u
%s var_init
%%
// pokud jsi ve stavu, kdy je oˇek´v´na inicializace
c a a
// promˇnn´, povol detekci cel´ho ˇ´sla.
e e e cı
<var_init>[-+]?([0-9]+) {
’
yylval.number = atoi(yytext); // hodnotu vrat jako ˇ´slo
cı
return VAL_INTEGER;
}
// pokud jde o konec ˇ´dku, zvyˇ poˇ´tadlo a jinak
ra s cı
// nic nedˇlej
e
n ++iLineCount;
%%
Uk´zka 3.4: Uk´zka definice pravidla pro program LEX.
a a
3.2 Popis gramatiky jazyka
Pro popis gramatiky jazyka lze vyuˇ´ syst´m YACC, kter´ umoˇnuje ve spolupr´ci
zıt e y zˇ a
s programem LEX definovat velmi jednoduˇe pravidla , jak dan´ programovac´ jazyk
s y ı
vypad´, tj. jak´ umoˇnuje vytv´ˇet program´torsk´ konstrukce a z´pisy.
a e zˇ ar a e a
Informace zde uveden´ jsou ˇerp´ny z [8] a [4].
e c a
3.2.1 Struktura zdrojov´ho souboru pro YACC
e
Struktura zdrojov´ho souboru pro syst´m YACC je opˇt rozdˇlena do tˇech ˇ´st´ tak,
e e e e r ca ı
jak je patrno z obr´zku 3.5. Jednotliv´ ˇ´sti jsou od sebe oddˇleny pomoc´ znaˇek %%.
a e ca e ı c
Prvn´ ˇ´st obsahuje definici token˚ pro vyhled´v´n´ (z tˇchto definic jsou pot´
ı ca u a a ı e e
vygenerov´ny unik´tn´ identifik´tory jejichˇ symbolick´ n´zvy odpov´ ı n´zv˚m to-
a a ı a z e a ıdaj´ a u
ken˚), prioritu oper´tor˚ apod. V tab.3.3 je uveden pˇehled z´kladn´ pˇ´ u, kter´
u a u r a ıch rıkaz˚ e
mohou b´t v t´to ˇ´sti obsaˇeny.
y e ca z
ˇ ast pro definici pravidel obsahuje jiˇ pˇ´
C´ z rımo jednotliv´ pravidla, kter´ odpov´ ı
a a ıdaj´
konstrukc´ kter´ lze v jazyce vytvoˇit. Kaˇd´ takov´ pravidlo m´ strukturu dle
ım, e r z e e a
obr.3.6.
V´znam jednotliv´ch prvk˚ je n´sleduj´ ı:
y y u a ıc´
| Definuje, ˇe n´sleduj´ ı ˇ´st pravidla je nepovinn´.
z a ıc´ ca a
15
23. LEXIKALN´ ANALYZA ZDROJOVEHO KODU
´ I ´ ´ ´ Popis gramatiky jazyka
... definice ...
%%
... definice pravidel pro gramatiku jazyka ...
%%
... funkce v jazyce C ...
Uk´zka 3.5: Struktura vstupn´ souboru pro program YACC.
a ıho
Definice Popis
%token jm´no
e Definice tokenu s n´zvem jm´no
a e
%{...%} Blok obsahuj´ ı k´d v jazyce C/C++, kter´
ıc´ o y
bude po zpracov´n´ vloˇen na zaˇ´tek vygen-
a ı z ca
erovan´ho k´du.
e o
%union{int iData;char *pData;} N´vratov´ hodnota yylval je typu union a je
a a
urˇena nˇkter´m datov´m typem uveden´m
c e y y y
v unionu.
%token <iData> TOK INTEGER Definuje token s datov´m typem iData (dle
y
definice v unionu).
%left ’,’ Definice priority oper´toru.
a
%right ’,’ Definice priority oper´toru.
a
Tabulka 3.3: Z´kladn´ pˇ´
a ı rıkazy pouˇiteln´ v bloku definic vstupn´ souboru pro YACC.
z e ıho
nazev:
[|]
nazev2
[{
... programov´ k´d v jazyce C/C++ ...
y o
}]
[[|] nazev3]
;
Uk´zka 3.6: Struktura pravidel pro definici jazyka v programu YACC.
a
nazev N´zev pravidla (bez diakritiky) oddˇlen´ dvojteˇkou od jeho definice.
a e y c
nazev2 N´zev tokenu definovan´ho v ˇ´sti definic na zaˇ´stku vstupn´ souboru pro
a e ca ca ıho
16
24. LEXIKALN´ ANALYZA ZDROJOVEHO KODU
´ I ´ ´ ´ Princip spolupr´ce program˚ LEX a YACC
a u
YACC nebo n´zev jin´ho pravidla. Pro vytv´ˇen´ rekurzivn´ pravidel m˚ˇe b´t
a e ar ı ıch uz y
stejn´ i jako nazev.
y
{ ... } Ohraniˇuje blok obsahuj´ ı k´d v jazyce C/C++, kter´ bude vykon´n v pˇ´ e,
c ıc´ o y a rıpadˇ
ˇe pravidlo bude obsaˇeno ve vstupn´ zdrojov´m souboru.
z z ım e
; Oznaˇen´ konce bloku, kter´ definuje pravidlo nazev.
c ı y
Programov´ k´d v jazyce C/C++ definuje akce, kter´ budou pˇi aplikaci pravidla
y o e r
vyvol´ny. V pˇ´ e, ˇe nalezen´ token m´ definov´n datov´ typ, lze k hodnotˇ pˇedan´
a rıpadˇ z y a a y e r e
z programu LEX pˇistupovat pomoc´ konstrukce $x, kde x je ˇ´ definuj´ ı poˇad´
r ı cıslo ıc´ r ı
tokenu v definici pravidla. V pˇ´ e pravidla z obr.3.6 by pro token nazev2 s defi-
rıpadˇ
novan´m typem odpov´
y ıdala hodnota $1. Do ˇ´
cıslov´n´ poˇad´ se zahrnuj´ i programov´
a ı r ı ı e
bloky uzavˇen´ mezi {}.
r e
Na obr.3.7 je uvedena kr´tk´ komentovan´ uk´zka definice nˇkolika jednoduch´ch
a a a a e y
pravidel.
3.3 Princip spolupr´ce program˚ LEX a YACC
a u
Tato ˇ´st popisuje spolupr´ci program˚ LEX a YACC pˇi vytv´ˇen´ pˇekladaˇe navrˇen´ho
ca a u r ar ı r c z e
jazyka. Princip ˇinnosti je vysvˇtlen na obr.3.2 pomoc´ vytv´ˇen´ho softwarov´ho PLC
c e ı ar e e
(v´sledkem bude program plc2cpp, kter´ bude pˇev´dˇt k´d ve zvolen´m jazyce pro
y y r a e o e
PLC do jazyka C/C++).
Princip spolupr´ce obou program˚ lze popsat n´sledovnˇ:
a u a e
1. Nejprve vytvoˇ´
rıme lexik´ln´ analyzer pomoc´ programu LEX, kter´ vyhled´ ve
a ı ı y a
zdrojov´m textu tzv. tokeny (tj. definovan´ kl´cov´ slova).
e a ıˇ a
2. N´slednˇ definujeme pomoc´ programu YACC syntaxi navrˇen´ho jazyka (tj.
a e ı z e
moˇn´ kombinace vyhledan´ch token˚).
z e y u
3. Zkompilujeme vstupn´ soubor pro program YACC. V´sledkem je hlaviˇkov´ sou-
ı y c y
bor y.tab.h, kter´ definuje pro jednotliv´ n´zvy token˚ ˇ´
y e a u cıseln´ hodnoty (makra)
e
v jazyce C/C++ a soubor y.tab.c, kter´ obsahuje vlastn´ syntaktick´ analyz´tor
y ı y a
jazyka.
4. Zkompilujeme vstupn´ soubor pro program LEX. Ten ve vygenerovan´m k´du
ı e o
vyuˇ´ a soubor y.tab.h vygenerovan´ v pˇedchoz´ kroku. V´sledkem je soubor
zıv´ y r ım y
lex.yy.c, kter´ obsahuje lexik´ln´ analyzer v jazyce C/C++.
y a ı
5. Zkompilov´n´ soubor˚ vygenerovan´ch v pˇedchoz´ krok˚ spolu s dalˇ´
a ım u y r ıch u sımi
podp˚rn´mi ˇ´stmi z´ ame poˇadovan´ kompil´tor. V naˇem pˇ´ e plc2cpp.
u y ca ısk´ z y a s rıpadˇ
6. Zkompilovan´ program z pˇedchoz´ krok˚ je jiˇ vytv´ˇen´m kompil´torem,
y r ıch u z ar y a
kter´ lze vyuˇ´ ke kompilaci zdrojov´ho k´du ve vytv´ˇen´m jazyce. V naˇem
y zıt e o ar e s
pˇ´ e tedy zdrojov´ k´d v implementovan´m programovac´ jazykem pro PLC.
rıpadˇ y o y ım
17
25. LEXIKALN´ ANALYZA ZDROJOVEHO KODU
´ I ´ ´ ´ Princip spolupr´ce program˚ LEX a YACC
a u
// Definuj token pro pˇiˇazen´ hodnoty
r r ı
%token TOK_SET
// Pˇiˇazovan´ hodnota je bud’ cel´ ˇ´slo
r r a e cı
// nebo nulou ukonˇen´ ˇetˇzec
c y r e
%union
{
int number;
char *string;
}
// Definuj token s urˇen´m datov´m typem pro n´vrat
c y y a
// celoˇ´seln´ hodnoty
cı e
%token <number> VAL_INT
// Definuj token s urˇen´m datov´m typem pro n´vrat
c y y a
// nulou ukonˇen´ho ˇetˇzce
c e r e
%token <string> VAL_STR
%%
// Definuj z´kladn´ pravidlo pro detekci jednotliv´ch
a ı y
// blok˚ ve vstupn´m souboru.
u ı
blocks:
// ˇ´dn´ z n´sleduj´c´ch blok˚ v pravidle nen´ povinn´
Za y a ı ı u ı y
|
// Po nalezen´ bloku pro pˇiˇazen´ cel´ho ˇ´sla m˚ˇe n´sledovat
ı r r ı e cı uz a
// dalˇ´ vstupn´ blok (rekurze))
sı ı
set_int blocks
|
// Po prvn´m bloku pˇiˇazuj´c´m ˇetˇzec jiˇ nen´sleduje
ı r r ı ı r e z a
// ˇadn´ dalˇ´ blok
z´ y sı
set_string
;
set_int:
TOK_SET VAL_INT
{
printf("ˇ´seln´ hodnota: %d", $1);
Cı a
}
;
set_string:
TOK_SET VAL_STR
{
printf("ˇetˇzcov´ hodnota: %s", $1);
R e a
}
;
%%
Uk´zka 3.7: Uk´zka definice pravidla ve zdrojov´m k´du pro YACC.
a a e o
18
26. LEXIKALN´ ANALYZA ZDROJOVEHO KODU
´ I ´ ´ ´ Princip spolupr´ce program˚ LEX a YACC
a u
Obr´zek 3.2: Princip tvorby a funkce pˇekladaˇe jazyka definovan´ho pomoc´ program˚
a r c e ı u
LEX a YACC.
Zde uveden´ vlastnosti a konstrukce obsahuj´ pouze malou ˇ´st moˇnost´ kter´ pro-
e ı ca z ı, e
gramy YACC a LEX nab´ ı. V podstatˇ shrnuje vlastnosti vyuˇit´ bˇhem konstrukce
ızej´ e z e e
softwarov´ho PLC. Podrobnˇjˇ´ informace lze nal´zt v uveden´ literatuˇe.
e e sı e e r
19
27. Kapitola 4
Zpracov´n´ promˇnn´ch PLC
a ı e y
programu
Tato ˇ´st se zab´v´ zpracov´n´ promˇnn´ch a parametr˚ funkc´ funkˇn´ blok˚ a
ca y a a ım e y u ı, c ıch u
u ˇa
programov´ch blok˚. C´st 4.1 nastiˇuje princip zpracov´n´ promˇnn´ch v programu,
y n a ı e y
ˇ´st 4.2 se zab´v´ deklarac´ jednotliv´ch promˇnn´ch, ˇ´st 4.3 rozeb´ a jednotliv´
ca y a ı y e y ca ır´ e
moˇn´ bloky promˇnn´ch a ˇ´st 4.4 uv´d´ z´kladn´ principy t´kaj´ ı se implementace
z e e y ca a ı a ı y ıc´
a zpracov´n´ promˇnn´ch v softwarov´m PLC.
a ı e y e
4.1 Princip zpracov´n´ promˇnn´ch
a ı e y
Promˇnn´ v PLC programu se zapisuj´ v r´mci blok˚ promˇnn´ch. Kaˇd´ blok promˇnn´ch
e e ı a u e y z y e y
m´ jin´ v´znam a ve sv´m tˇle obsahuje deklaraci jedn´ nebo v´ promˇnn´ch tak, jak
a y y e e e ıce e y
je patrno z uk´zky 4.1. V´znamem jednotliv´ch blok˚ promˇnn´ch se zab´vaj´ dalˇ´
a y y u e y y ı sı
ˇ´sti t´to kapitoly.
ca e
Princip zpracov´n´ promˇnn´ch v r´mci PLC programu prob´ a n´sleduj´ ım zp˚sobem:
a ı e y a ıh´ a ıc´ u
1. Detekuj blok deklaruj´ ı promˇnn´ (viz. ˇ´st 4.2).
ıc´ e e ca
2. Najdi deklaraci promˇnn´ a ukl´dej jej´ parametry do kontejneru CContainer-
e e a ı
Variable:
(a) Separuj n´zev promˇnn´, pˇeved’ ho na mal´ p´
a e e r a ısmena a vloˇ do kontejneru.
z
(b) Detekuj, zda deklarace promˇnn´ obsahuje specifikaci adresy, pokud ano,
e e
uloˇ adresu v kontejneru.
z
(c) Identifikuj datov´ typ promˇnn´, pokud se jedn´ o funkˇn´ blok, sdˇl kon-
y e e a c ı e
tejneru poˇadavek na vloˇen´ hlaviˇkov´ho souboru s pˇ´ sn´m funkˇn´
z z ı c e rısluˇ y c ım
blokem.
(d) Pokud se jedn´ o standardn´ datov´ typ, detekuj pˇ´
a ı y rıpadnou deklaraci inicial-
izaˇn´ hodnoty. V pˇ´ e, ˇe je promˇnn´ inicializov´na, uloˇ inicializaˇn´
c ı rıpadˇ z e a a z c ı
hodnotu do kontejneru.
20
28. ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
´ I ˇ ´ Deklarace promˇnn´ch
e y
3. Existuje-li deklarace dalˇ´ promˇnn´, opakuj vˇe od bodu 2.
sı e e s
4. Detekuj konec bloku promˇnn´ch, uzavˇi kontejner promˇnn´ch a pˇidej ho do
e y r e y r
kontejneru obsahuj´ ıho jednotliv´ kontejnery promˇnn´ch platn´ch v aktu´ln´
ıc´ e e y y a ım
programov´m bloku.
e
4.2 Deklarace promˇnn´ch
e y
Jednotliv´ promˇnn´ se deklaruj´ v nˇkolika typech blok˚ s r˚zn´m v´znamem. Jed-
e e e ı e u u y y
notliv´ druhy blok˚ promˇnn´ch jsou povoleny v r˚zn´ch kontextech PLC k´du. Promˇnn´
e u e y u y o e e
se zapisuj´ zp˚sobem uveden´m v uk´zce 4.1.
ı u y a
...
Zaˇ´tek bloku promˇnn´ch
ca e y
...
typ [AT adresa]: N´zev promˇnn´ [:= hodnota];
a e e
...
Konec bloku promˇnn´ch
e y
...
Uk´zka 4.1: Deklarace promˇnn´
a e e
Kaˇd´ promˇnn´ mus´ obsahovat datov´ typ a n´zev. Pokud je datov´ typ promˇnn´
z a e a ı y a y e e
1
jeden ze z´kladn´ datov´ch typ˚ uveden´ch v tab.4.1 , m˚ˇe deklarace promˇnn´ ob-
a ıch y u y uz e e
sahovat jeˇtˇ kl´cov´ slovo AT n´sledovan´ adresou ve tvaru uveden´m v tab.4.3. D´le
s e ıˇ e a e e a
v tomto pˇ´ e m˚ˇe deklarace obsahovat inicializaˇn´ hodnotu promˇnn´ oddˇlenou
rıpadˇ uz c ı e e e
pomoc´ :=.
ı
Jako datov´ typ m˚ˇe b´t pouˇit tak´ n´zev funkˇn´ bloku, zde je tedy tˇeba
y uz y z e a c ıho r
tak´ zajistit, aby se vygeneroval ˇ´dek pro proveden´ include pˇ´ sn´ho hlaviˇkov´ho
e ra ı rısluˇ e c e
souboru obsahuj´ ıho deklaraci funkˇn´ bloku. Cel´ deklarace je ukonˇena pomoc´ ;.
ıc´ c ıho a c ı
Uk´zka 4.2 uv´d´ pˇ´
a a ı rıklad deklarace nˇkolika promˇnn´ch tak,aby byl patrn´ konkr´tn´
e e y y e ı
z´pis promˇnn´ v programu. Pro vˇtˇ´ n´zornost jsou zaps´ny v r´mci bloku lok´ln´
a e e e sı a a a a ıch
promˇnn´ch.
e y
4.2.1 Pˇ´ e adresy
rım´
V tab.4.2 je uvedeno nˇkolik uk´zek pˇ´ ych adres pro PLC. Adresa se vˇdy skl´d´ z
e a rım´ z a a
a y ıc´ e’ e
prefixu, kter´ definuje typ adresy n´sledovan´ prefixem, definuj´ ım velikost pamˇt ov´ho
y
bloku, kter´mu adresa odpov´ a.
e ıd´
1
V tabulce jsou uvedeny pouze datov´ typy podporovan´ ve vytv´ˇen´m softwarov´m PLC.
e e ar e e
21
29. ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
´ I ˇ ´ Deklarace promˇnn´ch
e y
Datov´ typ
y Velikost Pozn´mka
a
BOOL 1
SINT 8
INT 16
DINT 32
USINT 8
UINT 16
UDINT 32
REAL
TIME 64 Dostupn´ pouze jako konstanta urˇuj´ ı pe-
y c ıc´
riodu spouˇtˇn´ programu.
se ı
BYTE 8
WORD 16
DWORD 32
Tabulka 4.1: Pˇehled z´kladn´ datov´ch typ˚ pouˇiteln´ch v PLC.
r a ıch y u z y
VAR
current: DINT;
otacky: DINT := 0;
rps AT %QB10: DINT := 0;
sp AT %IB10: DINT;
forward AT %Q0.0: BOOL := FALSE;
backward AT %Q0.1: BOOL := FALSE;
END_VAR
Uk´zka 4.2: Uk´zka deklarace jednotliv´ch promˇnn´ch.
a a y e y
Adresa Pozn´mka
a
%QX35, %Q35 V´stupn´ bit 37
y ı
%MX3.5 5 bit 3 bytu ve vnitˇn´ pamˇti
r ı e
%IW23 Vstupn´ slovo 23
ı
Tabulka 4.2: Uk´zky z´pisu adres pro PLC.
a a
y u e’ y
Pˇehled jednotliv´ch prefix˚ pro adresaci pamˇt ov´ch m´ PLC je uveden v tab.4.3.
r ıst
22
30. ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
´ I ˇ ´ Pˇehled blok˚ pro deklaraci promˇnn´ch
r u e y
Adresa Pozn´mka
a
Typ
Q Adresa v´stupu
y
I Adresa vstupu
M Adresa ve vnitˇn´ pamˇti
r ı e
Velikost
X Adresa specifikuje jeden bit
Nic Adresa specifikuje jeden bit
B Adresa specifikuje jeden byte (8bit˚)
u
W Adresa specifikuje jedno slovo (16bit˚)
u
D Adresa specifikuje dvojit´ slovo (32bit˚)
e u
L Adresa specifikuje dlouh´ slovo (64bit˚)
e u
Tabulka 4.3: Zp˚sob z´pisu pˇ´ ych adres pro PLC.
u a rım´
4.3 Pˇehled blok˚ pro deklaraci promˇnn´ch
r u e y
N´sleduj´ ı ˇ´st se zab´v´ v´znamem a zp˚sobem z´pisu jednotliv´ch typ˚ blok˚
a ıc´ ca y a y u a y u u
promˇnn´ch. Informce zde uveden´ jsou ˇerp´ny z [5].
e y e c a
Norma [5] definuje n´sleduj´ ı typy promˇnn´ch:
a ıc´ e y
• Glob´ln´ promˇnn´ - pouˇ´ ı se pro z´pis promˇnn´ch dostupn´ch v cel´m
a ı e e zıvaj´ a e y y e
PLC programu.
• Lok´ln´ promˇnn´ - pouˇ´ ı se pro deklaraci lok´ln´ promˇnn´ch v r´mci
a ı e e zıvaj´ a ıch e y a
funkce, funkˇn´ bloku nebo bloku program.
c ıho
• Extern´ promˇnn´ - pouˇ´ ı se k definici odkazu na glob´ln´ promˇnn´ v
ı e e zıvaj´ a ı e e
r´mci blok˚ funkce, funkˇn´ blok nebo blok program.
a u c ı
• Vstupn´ promˇnn´ - pouˇ´ ı se pro deklaraci vstupn´ parametr˚ funkc´
ı e e zıvaj´ ıch u ı,
funkˇn´ blok˚ nebo blok˚ typu program.
c ıch u u
• V´stupn´ promˇnn´ - pouˇ´ ı se pro deklaraci v´stupn´ parametr˚ funkˇn´
y ı e e zıvaj´ y ıch u c ıch
blok˚ a blok˚ typu program.
u u
• Vstupnˇ/v´stupn´ promˇnn´ - zastupuj´ ulohu parametr˚ pˇed´van´ch ref-
e y ı e e ı´ u r a y
erenc´ v r´mci blok˚ program a funkˇn´ blok˚.
ı a u c ıch u
4.3.1 Glob´ln´ promˇnn´
a ı e e
Glob´ln´ promˇnn´ je moˇn´ deklarovat v r´mci bloku CONFIGURATION, pˇ´
a ı e e z e a rıpadnˇ
e
v r´mci podbloku konfigurace RESOURCE. Glob´ln´ promˇnn´ jsou n´slednˇ dos-
a a ı e e a e
tupn´ v cel´m PLC programu, pˇiˇemˇ z blok˚ typu FUNCTION, PROGRAM a
e e rc z u
23
31. ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
´ I ˇ ´ Pˇehled blok˚ pro deklaraci promˇnn´ch
r u e y
FUNCTION BLOCK je tˇeba se na nˇ odk´zat pomoc´ deklarace VAR EXTERNAL
r e a ı
(viz.4.3.2). Zp˚sob deklarace bloku glob´ln´ promˇnn´ch je patrn´ z uk´zky 4.3.
u a ıch e y y a
... nadˇazen´ blok ...
r y
VAR_GLOBAL
...
Deklarace jednotliv´ch promˇnn´ch;
y e y
...
END_VAR
... pokraˇov´n´ nadˇazen´ho bloku ...
c a ı r e
Uk´zka 4.3: Deklarace glob´ln´ promˇnn´ch v programu.
a a ıch e y
4.3.2 Extern´ promˇnn´
ı e e
Blok extern´ promˇnn´ch se vyuˇ´ a k odkazu na glob´ln´ promˇnnou, kterou chceme
ıch e y zıv´ a ı e
vyuˇ´ v r´mci blok˚ PROGRAM, FUNCTION a FUNCTION BLOCK. V tomto
zıt a u
bloku lze pouˇ´ pouze deklaraci promˇnn´ bez specifikace adresy, kde se nach´z´ ani
zıt e e a ı,
deklarovat inicializaˇn´ hodnotu - tu je moˇno specifikovat v r´mci deklarace promˇnn´
c ı z a e e
v bloku VAR GLOBAL. Zp˚sob deklarace bloku glob´ln´ promˇnn´ch je patrn´ z
u a ıch e y y
uk´zky 4.4.
a
... nadˇazen´ blok ...
r y
VAR_EXTERNAL
...
Deklarace jednotliv´ch promˇnn´ch;
y e y
...
END_VAR
... pokraˇov´n´ nadˇazen´ho bloku ...
c a ı r e
Uk´zka 4.4: Deklarace extern´ promˇnn´ch v programu.
a ıch e y
4.3.3 Lok´ln´ promˇnn´
a ı e e
Lok´ln´ promˇnn´ lze pouˇ´ pouze v r´mci programov´ch blok˚ PROGRAM, FUNC-
a ı e e zıt a y u
TION a FUNCTION BLOCK. Promˇnn´ deklarovan´ jako lok´ln´ maj´ platnost pouze
e e e a ı ı
v programov´m bloku, kde jsou deklarov´ny.
e a
24
32. ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
´ I ˇ ´ Pˇehled blok˚ pro deklaraci promˇnn´ch
r u e y
V pˇ´ e funkˇn´ blok˚ a blok˚ typu program si lok´ln´ promˇnn´ uchov´vaj´
rıpadˇ c ıch u u a ı e e a ı
svoji hodnotu z pˇedchoz´ vol´n´ po celou dobu existence instance funkˇn´ bloku.
r ıho a ı c ıho
Zp˚sob deklarace bloku lok´ln´ promˇnn´ch je patrn´ z uk´zky 4.5.
u a ıch e y y a
... nadˇazen´ blok ...
r y
VAR
...
Deklarace jednotliv´ch promˇnn´ch;
y e y
...
END_VAR
... pokraˇov´n´ nadˇazen´ho bloku ...
c a ı r e
Uk´zka 4.5: Deklarace lok´ln´ promˇnn´ch v programu.
a a ıch e y
4.3.4 Vstupn´ promˇnn´
ı e e
Bloky vstupn´ promˇnn´ch lze vyuˇ´
ıch e y zıvat v r´mci blok˚ PROGRAM, FUNCTION
a u
a FUNCTION BLOCK. V jejich deklaraci nelze specifikovat adresu a vyuˇ´ ı se jako
zıvaj´
vstupn´ parametry v´ˇe uveden´ch blok˚. Zp˚sob deklarace bloku vstupn´ promˇnn´ch
ı ys y u u ıch e y
je patrn´ z uk´zky 4.6.
y a
... nadˇazen´ blok ...
r y
VAR_INPUT
...
Deklarace jednotliv´ch promˇnn´ch;
y e y
...
END_VAR
... pokraˇov´n´ nadˇazen´ho bloku ...
c a ı r e
Uk´zka 4.6: Deklarace vstupn´ promˇnn´ch v programu.
a ıch e y
4.3.5 V´stupn´ promˇnn´
y ı e e
V´stupn´ promˇnn´ lze pouˇ´ pouze v r´mci blok˚ PROGRAM a FUNCTION BLOCK.
y ı e e zıt a u
V jejich deklaraci nelze specifikovat adresu a vyuˇ´ ı se pro pˇed´v´n´ hodnot z
zıvaj´ r a a ı
aktu´ln´ programov´ho bloku do bloku nadˇazen´ho. Zp˚sob deklarace bloku v´stupn´
a ıho e r e u y ıch
promˇnn´ch je patrn´ z uk´zky 4.7.
e y y a
25