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
ˇ ızen´ motorkupomoc´ 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´ceje 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 kapitolauv´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´zazdrojov´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 ZDROJOVEHOKODU
´ 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 ZDROJOVEHOKODU
´ 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 ZDROJOVEHOKODU
´ 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 ZDROJOVEHOKODU
´ 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 ZDROJOVEHOKODU
´ 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 ZDROJOVEHOKODU
´ 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 ZDROJOVEHOKODU
´ 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 ZDROJOVEHOKODU
´ 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´chPLC
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 PLCPROGRAMU
´ 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 PLCPROGRAMU
´ 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 PLCPROGRAMU
´ 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 PLCPROGRAMU
´ 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 PLCPROGRAMU
´ 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
33.
ZPRACOVAN´ PROMENNYCH PLCPROGRAMU
´ I ˇ ´ Implementace promˇnn´ch
e y
... nadˇazen´ blok ...
r y
VAR_OUTPUT
...
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.7: Deklarace v´stupn´ promˇnn´ch v programu.
a y ıch e y
4.3.6 Vstupnˇ/v´stupn´ promˇnn´
e y ı e e
Bloky vstupnˇ/v´stupn´ promˇnn´ch lze pouˇ´ pouze v r´mci blok˚ PROGRAM
e y ıch e y zıt a u
a FUNCTION BLOCK. V deklaraci jednotliv´ch promˇnn´ch nelze specifikovat adresu
y e y
a zastupuj´ ulohu parametr˚ pˇed´van´ch referenc´ Tyto parametry lze vyuˇ´ jak pro
ı´ u r a y ı. zıt
pˇed´n´ hodnoty do volan´ho bloku, tak pro z´ an´ t´to hodnoty po ukonˇen´ vol´n´
r a ı e ısk´ ı e c ı a ı
pˇ´ sn´ho bloku. Zp˚sob deklarace bloku vstupnˇ/v´stupn´ promˇnn´ch je patrn´
rısluˇ e u e y ıch e y y
z uk´zky 4.8.
a
... nadˇazen´ blok ...
r y
VAR_IN_OUT
...
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.8: Deklarace v´stupn´ promˇnn´ch v programu.
a y ıch e y
4.4 Implementace promˇnn´ch
e y
Implementace promˇnn´ch mus´ splˇovat vˇechny poˇadavky, kter´ vypl´vaj´ z pˇedchoz´
e y ı n s z e y ı r ı
ˇ´sti:
ca
1. Spolupr´ce se vˇemi datov´mi typy zvolen´mi pro implementaci.
a s y y
2. Moˇnost specifikovat absolutn´ adresu, na kter´ se promˇnn´ nach´z´
z ı e e a a ı.
26
34.
ZPRACOVAN´ PROMENNYCH PLCPROGRAMU
´ I ˇ ´ Implementace promˇnn´ch
e y
3. Moˇnost specifikovat inicializaˇn´ hodnotu promˇnn´.
z c ı e e
4. Pro vstupnˇ/v´stupn´ promˇnn´ umoˇnit pˇedat hodnotu promˇnn´ do bloku,
e y ı e e z r e e
kter´ provedl vol´n´ pˇ´ sn´ho funkˇn´ nebo programov´ho bloku.
y a ı rısluˇ e c ıho e
C´ılem tedy bude vytvoˇit pˇ´ sn´ knihovn´ tˇ´ kter´ umoˇn´ akce definovan´ v
r rısluˇ e ı rıdy, e z ı e
pˇedchoz´ pˇehledu a vypl´vaj´ ı z pˇedchoz´ ˇ´st. Pˇehled navrˇen´ch tˇ´ a poˇadavky
r ım r y ıc´ r ı ca r z y rıd z
na jejich funkcionalitu jsou uvedeny v tab.4.4.
Tˇ´
rıda Funkcionalita
CVariable Template tˇ´rıda implementuj´ ı vlastnosti
ıc´
promˇnn´ch pro vˇechny z´kladn´ datov´
e y s a ı e
typy z tab.4.1.
CPropertyIn Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti
r ıc´
promˇnn´ch deklarovan´ch v r´mci bloku
e y y a
VAR INPUT.
CPropertyOut Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti
r ıc´
promˇnn´ch deklarovan´ch v r´mci bloku
e y y a
VAR OUTPUT.
CPropertyInOut Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti
r ıc´
promˇnn´ch deklarovan´ch v r´mci bloku
e y y a
VAR IN OUT, vˇetnˇ pˇ´
c e rıpadn´ho pˇed´n´
e r a ı
hodnoty promˇnn´ do bloku, kter´ provedl
e e y
vol´n´ pˇ´ sn´ho funkˇn´
a ı rısluˇ e c ıho nebo pro-
gramov´ho bloku.
e
Tabulka 4.4: Pˇehled tˇ´ pro implementaci promˇnn´ch v softwarov´m PLC.
r rıd e y e
4.4.1 Parser zdrojov´ho k´du
e o
V r´mci parseru zdrojov´ho k´du pro PLC budou v generovan´m C++ k´du vyuˇity
a e o e o z
objekty z tab.4.4. Pro vlastn´ zpracov´n´ k´du bude vytvoˇen kontejner CContainer-
ı a ı o r
Variable pro udrˇov´n´ informac´ o aktu´ln´ zpracov´van´ promˇnn´ (informace o da-
z a ı ı a ı a e e e
tov´m typu, n´zvu, adrese, inicializaˇn´ hodnotˇ atp.). D´le bude vytvoˇena template
e a c ı e a r
tˇ´ CContainerContainer, kter´ bude slouˇit ke sdruˇov´n´ kontejner˚ patˇ´ ıch do
rıda a z z a ı u rıc´
jednoho bloku PLC programu.
4.4.2 Vygenerovan´ zdrojov´ k´d
y y o
Vygenerovan´ zdrojov´ k´d v C++ je rozdˇlen do n´sleduj´ ıch ˇ´st´
y y o e a ıc´ ca ı:
• V pˇ´ e, ˇe se nejedn´ o glob´ln´ promˇnn´:
rıpadˇ z a a ı e e
27
35.
ZPRACOVAN´ PROMENNYCH PLCPROGRAMU
´ I ˇ ´ Implementace promˇnn´ch
e y
1. Povinn´ ˇ´st deklarace vlastn´ promˇnn´ v private nebo public ˇ´sti deklarace
a ca ı e e ca
objektu, kter´ reprezentuje dan´ blok z programu.
y y
a ca rıdy s ’ ıc´
2. Nepovinn´ ˇ´st v konstruktoru tˇ´ zajiˇt uj´ ı inicializaci promˇnn´. Gen-
e e
erov´no pouze v pˇ´ e, ˇe promˇnn´ m´ definov´nu inicializaˇn´ hodnotu.
a rıpadˇ z e a a a c ı
3. Pro v´stupn´ a vstupnˇ-v´stupn´ promˇnn´ je jeˇtˇ generov´n k´d resetuj´ ı
y ı e y ı e e se a o ıc´
promˇnnou pro dalˇ´ pouˇit´
e sı z ı.
• V pˇ´ e, ˇe se jedn´ o glob´ln´ promˇnnou, je vygenerov´na deklarace promˇnn´
rıpadˇ z a a ı e a e e
typu CVariable s pˇ´ sn´m datov´m typem a pˇ´
rısluˇ y y rıpadnou inicializaˇn´ hodnotou
c ı
promˇnn´.
e e
Po zpracov´n´ zdrojov´ho k´du je pro lok´ln´ promˇnnou vygenerov´n k´d odpov´ ıc´
a ı e o a ı e a o ıdaj´ ı
uk´zce 4.9. Ve vygenerovan´m k´du je vyuˇita template tˇ´ CVariable.
a e o z rıda
// deklarace tˇ´dy,
rı
// hlaviˇkov´ soubor
c y
// counter AT %QB3: INT := 3; // konstruktor tˇ´dy
rı
class init // counter AT %QB3: INT := 3;
{ init :: init(void)
... {
private: #line 3 "test.plc"
#line 3 "test.plc" m_counter = CVariable<INT> ((INT) 3, "QB3");
CVariable<INT> m_counter; }
...
};
Uk´zka 4.9: Uk´zka k´du vygenerovan´ho pro lok´ln´ promˇnn´.
a a o e a ı e e
K´d generovan´ pro parametry funkc´ funkˇn´ blok˚ nebo program˚ je patrn´
o y ı, c ıch u u y
z uk´zky 4.10. Ve vygenerovan´m k´du je vyuˇita jedna z template tˇ´ CPropertyIn,
a e o z rıd
CPropertyOut nebo CPropertyInOut dle typu parametru pro pˇ´ rıstup k parametru z
m´ısta, odkud je provedeno vol´n´ a template tˇ´ CVariable, kter´ je pˇiˇazena k
a ı rıda a rr
objektu a je vyuˇ´ ana k pˇ´
zıv´ rıstupu k parametru uvnitˇ programu.
r
28
36.
ZPRACOVAN´ PROMENNYCH PLCPROGRAMU
´ I ˇ ´ Implementace promˇnn´ch
e y
// deklarace tˇ´dy,
rı
// hlaviˇkov´ soubor
c y
// vstup: INT;
class init // soubor s implementac´ tˇ´dy
ı rı
{ // konstruktor tˇ´dy
rı
private: // vstup: INT;
#line 6 "test.plc" init :: init(void)
CVariable<INT> m_vstup; {
... #line 6 "test.plc"
public: vstup = CPropertyIn<INT> (&m_vstup);
#line 6 "test.plc" }
CPropertyIn<INT> vstup;
...
};
Uk´zka 4.10: Uk´zka k´du vygenerovan´ho pro parametry funkc´ funkˇn´ blok˚ nebo
a a o e ı, c ıch u
program˚.
u
29
37.
Kapitola 5
Zpracov´n´ jazykaIL
a ı
Tato ˇ´st uv´d´ pˇehled jednotliv´ch instrukc´ jazyka IL, zab´v´ se jejich zpracov´n´
ca a ı r y ı y a a ım
a vykon´v´n´ v softwarov´m PLC. Informace zde uveden´ jsou ˇerp´ny z [5].
a a ım e e c a
Jednotliv´ instrukce jazyka IL m˚ˇeme rozdˇlit dle funkˇn´ v´znamu do n´sleduj´ ıch
e uz e c ıho y a ıc´
kategori´
ı:
1. Pˇiˇazovac´ instrukce - instrukce pro nastaven´ aktu´ln´ hodnoty z´sobn´
rr ı ı a ı a ıku,
promˇnn´ch nebo adres.
e y
2. Logick´ instrukce - instrukce umoˇnuj´ ı logick´ operace mezi promˇnn´mi.
e zˇ ıc´ e e y
3. Aritmetick´ instrukce - instrukce pro n´soben´ dˇlen´ sˇ´ an´ atd.
e a ı, e ı, cıt´ ı
4. Porovn´vac´ instrukce - instrukce slouˇ´ ı k porovn´n´ argumentu a aktu´ln´
a ı zıc´ a ı a ıho
stavu na z´sobn´
a ıku.
5. Instrukce ˇ´rızen´ toku programu - instrukce pro podm´ en´ skoky, vol´n´
ı ınˇ e a ı
funkc´ a funkˇn´ blok˚.
ı c ıch u
Kaˇd´ z kategori´ uveden´ch v´ˇe je vˇnov´na samostatn´ ˇ´st v t´to kapitole
z e ı y ys e a a ca e
popisuj´ ı kr´tce vlastnosti a specifika jednotliv´ch ˇ´st´
ıc´ a y ca ı.
Dle [5] by mˇl aktu´ln´ datov´ typ na z´sobn´ odpov´
e a ı y a ıku ıdat datov´u typu operandu.
e
Vzhledem k vyuˇit´ vlastnost´ jazyka C++ jsou zajiˇtˇny implicitn´ konverze mezi
z ı ı se ı
vˇtˇinou dostupn´ch datov´ch typ˚. Pokud poˇadovan´ konverze neexistuje, je chyba
es y y u z a
hl´ˇena v okamˇiku kompilace vygenerovan´ho C++ souboru.
as z e
Dle [5] lze logick´, aritmetick´ a porovn´nac´ instrukce ˇetˇzit pomoc´ z´vorek,
e e a ı r e ı a
pˇiˇemˇ prav´ z´vorka m´ vˇdy v´znam vyhodnocen´ v´razu od lev´ z´vorky. Uk´zka
rc z a a a z y ı y e a a
5.1 uv´d´ takov´ vol´n´ Tato vlastnost nen´ v implementovan´m softwarov´m PLC dos-
a ı e a ı. ı e e
’ z y y
tupn´, nebot kaˇd´ v´raz lze nahradit takovou posloupnost´ operac´ kter´ z´vorkov´n´
a ı ı, a a a ı
zcela nahrad´ ı.
30
38.
ZPRACOVAN´ JAZYKA IL
´ I Pˇiˇazovac´ instrukce
rr ı
MUL ( input1
SUB input2
)
(* V´sledek je interpretov´n jako:
y a *)
(* result := result * (input1 - input2) *)
Uk´zka 5.1: Pouˇit´ z´vorkovan´ch v´raz˚ v instrukc´
a z ı a y y u ıch.
5.1 Pˇiˇazovac´ instrukce
rr ı
Tato ˇ´st se zab´v´ zpracov´n´ instrukc´ kter´ umoˇnuj´ pˇiˇazovat hodnoty promˇnn´ch
ca y a a ım ı, e zˇ ı r r e y
a adres. Jednotliv´ instrukce, kter´ do t´to ˇ´sti spadaj´ a jejich v´znamje uveden v
e e e ca ı y
tab.5.1.
Instrukce Popis
LD Nastav´ aktu´ln´ hodnotu na z´sobn´
ı a ı a ıku. Argumentem
m˚ˇe b´t promˇnn´, adresa nebo konstanta.
uz y e a
LDN Nastav´ aktu´ln´ hodnotu na z´sobn´
ı a ı a ıku, pˇiˇemˇ ne-
rc z
jprve provede negaci hodnoty. Argumentem m˚ˇe b´t
uz y
promˇnn´, adresa nebo konstanta.
e a
ST Uloˇ´ aktu´ln´ hodnotu ze z´sobn´
zı a ı a ıku do poˇadovan´
z e
promˇnn´ nebo na poˇadovanou adresu.
e e z
STN Uloˇ´ aktu´ln´ hodnotu ze z´sobn´
zı a ı a ıku do poˇadovan´
z e
promˇnn´ nebo na poˇadovanou adresu, pˇiˇemˇ nejprve
e e z rc z
provede negaci hodnoty.
S Nastav´ obsah boolean promˇnn´ nebo adresy v argu-
ı e e
mentu na 1, prov´d´ se pouze v pˇ´ e, ˇe aktu´ln´
a ı rıpadˇ z a ı
stav z´sobn´ je TRUE.
a ıku
R Nastav´ obsah boolean promˇnn´ nebo adresy v argu-
ı e e
mentu na 0, prov´d´ se pouze v pˇ´ e, ˇe aktu´ln´
a ı rıpadˇ z a ı
stav z´sobn´ je TRUE.
a ıku
Tabulka 5.1: Pˇehled pˇiˇazovac´ instrukc´ jazyka IL.
r rr ıch ı
Vygenerovan´ k´d pro vybran´ instrukce je patrn´ z uk´zky 5.2.
y o e y a
Instrukce, kter´ nastavuj´ aktu´ln´ hodnotu z´sobn´ (ve vygenerovan´m k´du
e ı a ı a ıku e o
promˇnn´ result, definovan´ jako instance tˇ´ CResult) pouˇ´ ı pˇet´zen´ konstruk-
e a a rıdy zıvaj´ r ıˇ y
tor objektu pro pˇ´ sn´ datov´ typ.
rısluˇ y y
31
39.
ZPRACOVAN´ JAZYKA IL
´ I Logick´ instrukce
e
{ // LD 10
result = 10;
}
{ // ST vstup
result.GetValue(m_vstup);
}
{ // STN %QB3
CVariable<BYTE> tmp0 = CVariable<BYTE>("QB3", 0);
result.GetValueNeg(tmp0);
}
// S %QX1.1
if (result == true) {
CVariable<BIT> tmp0 = CVariable<BIT>("QX1.1", 0);
tmp0 = 1;
}
Uk´zka 5.2: Generovan´ C++ k´d pro pˇiˇazovac´ instrukce jazyka IL.
a y o rr ı
5.2 Logick´ instrukce
e
Tato ˇ´st se zab´v´ zpracov´n´ logick´ch instrukc´ jazyka IL. Pˇehled jednotliv´ch
ca y a a ım y ı r y
logick´ch instrukc´ je uveden v tab.5.2.
y ı
Vˇechny instrukce spadaj´ ı do t´to ˇ´sti pouˇ´ ı jako prvn´ argument aktu´ln´
s ıc´ e ca zıvaj´ ı a ı
ıku y ıt ’ ˇ´
hodnotu z´sobn´ a jako druh´ argument (operand instrukce) mohou m´ bud cıselnou
a
konstantu, promˇnnou (pˇ´
e rıpadnˇ parametr funkce/funkˇn´ bloku) nebo pˇ´
e c ıho rımou adresu.
V´sledek proveden´ operace je vˇdy uloˇen na z´sobn´ jako jeho aktu´ln´ hodnota
y e z z a ık, a ı
(ve vygenerovan´m k´du promˇnn´ result).
e o e a
Jednotliv´ operace jsou implementov´ny jako pˇet´zen´ oper´tor template tˇ´
e a r ıˇ y a rıdy
CResult z podp˚rn´ PLC knihovny.
u e
Uk´zka 5.3 uv´d´ pˇ´
a a ı rıklad C++ k´du, kter´ je vygenerov´n pro logick´ instrukce.
o y a e
5.3 Aritmetick´ instrukce
e
Tato ˇ´st se zab´v´ zpracov´n´ aritmetick´ch instrukc´ jazyka IL. Pˇehled jednotliv´ch
ca y a a ım y ı r y
instrukc´ je uveden v tab.5.3. Z´kladn´ sada aritmetick´ch instrukc´ jazyka IL obsahuje
ı a ı y ı
instrukce pro sˇ´ an´ odˇ´ an´ n´soben´ a dˇlen´ vˇech z´kladn´ datov´ch typ˚.
cıt´ ı, cıt´ ı, a ı e ı s a ıch y u
Jako prvn´ operand pˇ´ sn´ aritmetick´ operace je vˇdy pouˇita aktu´ln´ hodnota
ı rısluˇ e e z z a ı
z´sobn´
a ıku, jako druh´ operand je pouˇit parametr instrukce.
y z
V´sledek aritmetick´ operace je vˇdy uloˇen zpˇt na z´sobn´ jako jeho aktu´ln´
y e z z e a ık a ı
32
40.
ZPRACOVAN´ JAZYKA IL
´ I Aritmetick´ instrukce
e
Instrukce Popis
AND Na z´sobn´ je uloˇen v´sledek logick´ operace
a ık z y e
(Z´sobn´ AND Operand), operand mus´ m´ stejn´ da-
a ık ı ıt y
tov´ typ jako aktu´ln´ hodnota z´sobn´
y a ı a ıku.
OR Na z´sobn´ je uloˇen v´sledek logick´ operace
a ık z y e
(Z´sobn´ OR Operand), operand mus´ m´ stejn´ da-
a ık ı ıt y
tov´ typ jako aktu´ln´ hodnota z´sobn´
y a ı a ıku.
XOR Na z´sobn´ je uloˇen v´sledek logick´ operace
a ık z y e
(Z´sobn´ XOR Operand), operand mus´ m´ stejn´ da-
a ık ı ıt y
tov´ typ jako aktu´ln´ hodnota z´sobn´
y a ı a ıku.
ANDN Na z´sobn´ je uloˇen v´sledek logick´ operace
a ık z y e
(Z´sobn´ AND NOT Operand), operand mus´ m´
a ık ı ıt
stejn´ datov´ typ jako aktu´ln´ hodnota z´sobn´
y y a ı a ıku.
ORN Na z´sobn´ je uloˇen v´sledek logick´ operace
a ık z y e
(Z´sobn´ OR NOT Operand), operand mus´ m´ stejn´
a ık ı ıt y
datov´ typ jako aktu´ln´ hodnota z´sobn´
y a ı a ıku.
XORN Na z´sobn´ je uloˇen v´sledek logick´ operace
a ık z y e
(Z´sobn´ XOR NOT Operand), operand mus´ m´
a ık ı ıt
stejn´ datov´ typ jako aktu´ln´ hodnota z´sobn´
y y a ı a ıku.
Tabulka 5.2: Pˇehled logick´ch instrukc´ jazyka IL.
r y ı
{ // AND 2#0101_0101
result = result & 85;
}
{ // XORN 8#07_02
result = result ^ ~(450);
}
Uk´zka 5.3: Generovan´ C++ k´d pro logick´ instrukce jazyka IL.
a y o e
hodnota.
Instrukce DIV (dˇlen´ uloˇ´ v pˇ´ e dˇlen´ nulou na z´sobn´ jako aktu´ln´ hod-
e ı) zı rıpadˇ e ı a ık a ı
notu 0 a informace o chybˇ je vyps´na jako hl´ˇen´ do logu j´dra operaˇn´ syst´mu.
e a as ı a c ıho e
Uk´zka 5.4 uv´d´ C++ k´d, kter´ je pro tyto instrukce generov´n.
a a ı o y a
33
41.
ZPRACOVAN´ JAZYKA IL
´ I Porovn´vac´ instrukce
a ı
Instrukce Popis
ADD Na z´sobn´ je uloˇen v´sledek aritmetick´ operace
a ık z y e
(Z´sobn´ + Operand), operand mus´ m´ stejn´ datov´
a ık ı ıt y y
typ jako aktu´ln´ hodnota z´sobn´
a ı a ıku.
SUB Na z´sobn´ je uloˇen v´sledek aritmetick´ operace
a ık z y e
(Z´sobn´ - Operand), operand mus´ m´ stejn´ datov´
a ık ı ıt y y
typ jako aktu´ln´ hodnota z´sobn´
a ı a ıku.
MUL Na z´sobn´ je uloˇen v´sledek aritmetick´ operace
a ık z y e
(Z´sobn´ * Operand), operand mus´ m´ stejn´ datov´
a ık ı ıt y y
typ jako aktu´ln´ hodnota z´sobn´
a ı a ıku.
DIV Na z´sobn´ je uloˇen v´sledek aritmetick´ operace
a ık z y e
(Z´sobn´ / Operand), operand mus´ m´ stejn´ datov´
a ık ı ıt y y
typ jako aktu´ln´ hodnota z´sobn´
a ı a ıku.
Tabulka 5.3: Pˇehled aritmetick´ch instrukc´ jazyka IL.
r y ı
{ // ADD 16#0F
result = result + 15;
}
{ // MUL %IW4
CVariable<WORD> tmp0 = CVariable<WORD>("IW4", 0);
result = result * tmp0;
}
Uk´zka 5.4: Generovan´ C++ k´d pro aritmetick´ instrukce jazyka IL.
a y o e
5.4 Porovn´vac´ instrukce
a ı
Tato ˇ´st se zab´v´ zpracov´n´ instrukc´ jazyka IL pro porovn´v´n´ aktu´ln´ stavu
ca y a a ım ı a a ı a ıho
z´sobn´ a operandu. Pˇehled jednotliv´ch instrukc´ je uveden v tab.5.2.
a ıku r y ı
Vˇechny instrukce modifikuj´ aktu´ln´ hodnotu z´sobn´ na logickou hodnotu
s ı a ı a ıku
TRUE nebo FALSE dle v´sledku porovn´n´
y a ı.
Uk´zka 5.5 uv´d´ k´d, kter´ odpov´ a vybran´m porovn´vac´ instrukc´ jazyka
a a ı o y ıd´ y a ım ım
IL.
5.5 Instrukce ˇ´
rızen´ toku programu
ı
Tato ˇ´st se zab´v´ pˇehledem a zpracov´n´ instrukc´ pro ˇ´ ı toku programu. Jedn´
ca y a r a ım ı rızen´ a
se o instrukce umoˇnuj´ ı prov´dˇt skoky v r´mci programu, volat jin´ programov´
zˇ ıc´ a e a e e
34
42.
ZPRACOVAN´ JAZYKA IL
´ I Instrukce ˇızen´ toku programu
r´ ı
Instrukce Popis
GT Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
a ık z y
porovn´n´ (Z´sobn´ > Operand).
a ı a ık
GE Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
a ık z y
porovn´n´ (Z´sobn´ >= Operand).
a ı a ık
EQ Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
a ık z y
porovn´n´ (Z´sobn´ = Operand).
a ı a ık
NE Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
a ık z y
porovn´n´ (Z´sobn´ = Operand).
a ı a ık
LE Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
a ık z y
porovn´n´ (Z´sobn´ <= Operand).
a ı a ık
LT Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
a ık z y
porovn´n´ (Z´sobn´ < Operand).
a ı a ık
Tabulka 5.4: Pˇehled porovn´vac´ instrukc´ jazyka IL.
r a ıch ı
{ //GT counter
result = (result > m_counter);
}
{ // NE 10
result = (result != 10);
}
Uk´zka 5.5: Generovan´ C++ k´d pro porovn´vac´ instrukce jazyka IL.
a y o a ı
bloku a prov´st n´vrat z volan´ho bloku. Pˇehled instrukc´ je uveden v tab.5.5.
e a e r ı
K´d generovan´ pro jednotliv´ instrukce z tab.5.5 je uveden v uk´zce 5.6. Jak je
o y e a
patrno, instrukce JMP, JMPN a JMPC jsou nahrazeny v jazyce C++ konstrukc´ goto ı
LABEL;, pˇiˇemˇ n´vˇˇt´ v PLC programu je pˇevedeno do programu v jazyce C++.
r c z a es ı r
Instrukce RET, RETC a RETN jsou nahrazeny C++ vol´n´ return;. a ım
Sloˇitˇjˇ´ situace nast´v´ v pˇ´ e pouˇit´ instrukc´ CAL, CALC a CALN, kter´
z e sı a a rıpadˇ z ı ı e
umoˇnuj´ volat instance funkˇn´ blok˚, nebot
zˇ ı c ıch u ’ je tˇeba zajistit tak´ pˇed´n´ hod-
r e r a ı
not parametr˚. Dle [5] lze hodnoty parametr˚ pro funkˇn´ bloky pˇed´vat 3 r˚zn´mi
u u c ı r a u y
zp˚soby, tak jak je definov´no v tab.5.6.
u a
Vytvoˇen´ software podporuje moˇnosti ˇ. 1 a 2. V pˇ´ e referenˇn´ argument˚
r y z c rıpadˇ c ıch u
funkˇn´ blok˚, kter´ nejsou specifikov´ny, lze takov´ funkˇn´ blok volat s t´ ˇe
c ıch u e a y c ı ım, z
se pouˇije implicitn´ hodnota parametru, pˇiˇemˇ pˇ´
z ı r c z rıpadnou navracenou hodnotu jiˇ z
nelze z programu z´ ıskat.
Uk´zka 5.6 uv´d´ k´d vygenerovan´ pˇi vol´n´ instance funkˇn´ bloku.
a a ı o y r a ı c ıho
35
43.
ZPRACOVAN´ JAZYKA IL
´ I Instrukce ˇızen´ toku programu
r´ ı
Instrukce Popis
JMP Skok na n´vˇˇt´ definovan´ v r´mci programov´ho bloku.
a es ı e a e
CAL Vol´n´ funkˇn´ bloku.
a ı c ıho
RET N´vrat z volan´ho programov´ho bloku.
a e e
JMPN Podm´ en´ skok na n´vˇˇt´ v r´mci programov´ho bloku
ınˇ y a es ı a e
v pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je FALSE.
rıpadˇ z a ı a ıku
CALN Podm´ en´ vol´n´ funkˇn´
ınˇ e a ı c ıho bloku v pˇ´ e, ˇe je
rıpadˇ z
aktu´ln´ stav z´sobn´ FALSE.
a ı a ıku
RETN Podm´ en´ n´vrat z volan´ho programov´ho bloku v
ınˇ y a e e
pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je FALSE.
rıpadˇ z a ı a ıku
JMPC Podm´ en´ skok na n´vˇˇt´ v r´mci programov´ho bloku
ınˇ y a es ı a e
v pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je TRUE.
rıpadˇ z a ı a ıku
CALC Podm´ en´ vol´n´ funkˇn´
ınˇ e a ı c ıho bloku v pˇ´ e, ˇe je
rıpadˇ z
aktu´ln´ stav z´sobn´ TRUE.
a ı a ıku
RETC Podm´ en´ n´vrat z volan´ho programov´ho bloku v
ınˇ y a e e
pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je TRUE.
rıpadˇ z a ı a ıku
Tabulka 5.5: Pˇehled instrukc´ pro ˇ´ ı toku programu jazyka IL.
r ı rızen´
ˇ ıslo
C´ Popis/uk´zka
a
1 CAL se vstupn´ parametry:
ımi
CAL C10(CU := %IX10, PV := 15)
2 CAL + LD a ST pro nastaven´ vstup˚:
ı u
LD 15
ST C10.PV
LD %IX10
ST C10.CU
CAL C10
3 Pouˇit´ vstupn´ oper´tor˚:
z ı ıch a u
LD 15
PV C10
LD %IX10
CU C10
Tabulka 5.6: Moˇnosti pˇed´v´n´ parametr˚ pˇi vol´n´ funkˇn´ blok˚.
z r a a ı u r a ı c ıch u
5.5.1 Vol´n´ funkc´
a ı ı
Funkce lze volat tak, ˇe na m´
z ısto instrukce se zap´se n´zev funkce, pˇiˇemˇ jako
ıˇ a rc z
prvn´ argument funkce je pˇed´na aktu´ln´ hodnota z´sobn´
ı r a a ı a ıku. Pˇ´
rıpadn´ dalˇ´ hod-
e sı
noty parametr˚ lze zadat oddˇlen´ ˇ´rkou v r´mci argumentu instrukce. N´vratov´
u e e ca a a a
hodnota funkce je uloˇena jako aktu´ln´ hodnota z´sobn´
z a ı a ıku. Uk´zka 5.7 uv´d´ PLC
a a ı
36
44.
ZPRACOVAN´ JAZYKA IL
´ I Instrukce ˇızen´ toku programu
r´ ı
{ // CAL controler(P := 2)
g_controler.p = 2;
g_controler.Function();
}
// RETC
if (result != 0)
RETURN();
{ // JMP ahoj
goto ahoj;
}
Uk´zka 5.6: Generovan´ k´d pro vybran´ instrukce ˇ´ ı toku programu jazyka IL.
a y o e rızen´
k´d pro vol´n´ funkce.
o a ı
LD 10 (* Vol´n´ funkce MAX(X, Y) *)
a ı
MAX 20 (* Akt´ln´ hodnota z´sobn´ku je 20 *)
a ı a ı
Uk´zka 5.7: Uk´zka vol´n´ funkce z jazyka IL.
a a a ı
Uk´zka 5.8 uv´d´ k´d vygenerovan´ bˇhem vol´n´ funkce. Nejprve je deklarov´na
a a ı o y e a ı a
instance objektu, kter´ funkci reprezentuje, n´slednˇ je vyplnˇn prvn´ parametr funkce
y a e e ı
aktu´ln´ hodnotou z´sobn´ a pot´ jsou vyplnˇny pˇ´
a ı a ıku e e rıpadn´ dalˇ´ parametry. Po vol´n´
e sı a ı
funkce je nastavena nov´ aktu´ln´ hodnota z´sobn´
a a ı a ıku.
{ // MIN 33
MIN f_function;
result.GetValue(f_function.parm0);
f_function.parm1 = 33;
f_function.Function();
result = f_function.GetResult();
}
Uk´zka 5.8: Generovan´ C++ k´d pˇi vol´n´ funkce v jazyce IL.
a y o r a ı
37
45.
Kapitola 6
Zpracov´n´ programov´chblok˚
a ı y u
Tato ˇ´st se zab´v´ zpracov´n´ z´kladn´ blok˚, kter´ se pouˇ´ ı pro z´pis pro-
ca y a a ım a ıch u e zıvaj´ a
gramu.
Dle [5] jsou definov´ny tˇi typy programov´ch blok˚:
a r y u
1. Funkˇn´ bloky - umoˇnuj´ vyuˇ´ vstupn´ parametry, v´stupn´ parametry a
c ı zˇ ı zıt ı y ı
parametry vstupnˇ-v´stupn´ Pˇi pouˇit´ funkˇn´ bloku je tˇeba nejprve defi-
e y ı. r z ı c ıho r
novat jeho instanci. Vnitˇn´ promˇnn´ jsou platn´ po dobu platnosti instance.
r ı e e e
2. Programov´ bloky - obdoba funkˇn´ blok˚. Liˇ´ se t´ ˇe existuje pouze
e c ıch u sı ım, z
jedna glob´lnˇ platn´ instance jej´z vnitˇn´ promˇnn´ jsou platn´ po celou dobu
a e a ıˇ r ı e e e
bˇhu programu.
e
3. Funkce - podporuj´ pouze vstupn´ parametry, vˇdy pouˇ´ ı n´vratovou hod-
ı ı z zıvaj´ a
notu. Vnitˇn´ promˇnn´ jsou platn´ pouze po dobu jednoho vol´n´ funkce.
r ı e e e a ı
Jednotliv´ bloky, jejich v´znam a pouˇit´ jsou pops´ny v n´sleduj´ ıch ˇ´stech t´to
e y z ı a a ıc´ ca e
kapitoly. Veˇker´ uveden´ informace jsou z´ any z [5].
s e e ısk´
K´d generovan´ pro jednotliv´ druhy programov´ch blok˚ odpov´ a vˇdy vygen-
o y e y u ıd´ z
erovan´ tˇ´ e v jazyce C++. N´zev vygenerovan´ tˇ´ je vˇdy rozˇ´ren o prefix, kter´
e rıdˇ a e rıdy z sıˇ y
s’
zajiˇt uje, ˇe je moˇn´ shodnˇ pojmenovat funkci, funkˇn´ blok i blok typu program.
z z e e c ı
Konverzn´ program vˇdy podle kontextu, ve kter´m je n´zev vyuˇit pouˇije spr´vn´ pre-
ı z e a z z a y
fix a t´ i spr´vn´ blok. Pro kaˇd´ z uveden´ch blok˚ je vˇdy vygenerov´n hlaviˇkov´
ım a y z y y u z a c y
soubor a soubor s implementac´ tˇ´ Hlaviˇkov´ soubor je n´slednˇ automaticky in-
ı rıdy. c y a e
cludov´n do generovan´ho k´du v pˇ´ e, ˇe je pˇ´ sn´ blok v programu vyuˇit.
a e o rıpadˇ z rısluˇ y z
6.1 Funkˇn´ bloky
c ı
Funkˇn´ bloky svou podstatou odpov´ ı objekt˚m jazyka C++. Kaˇd´ funkˇn´ blok
c ı ıdaj´ u z y c ı
pˇedt´ neˇ je moˇn´ ho volat mus´ m´ deklarov´nu svoji instanci pomoc´ promˇnn´
r ım, z z e ı ıt a ı e e
s datov´m typem odpov´ ıc´ n´zvu funkˇn´ bloku (viz. uk´zka 6.1).
y ıdaj´ ım a c ıho a
38
46.
ZPRACOVAN´ PROGRAMOVYCH BLOKU
´ I ´ ˚ Funkˇn´ bloky
c ı
Jin´mi slovy, kaˇd´ funkˇn´ blok m˚ˇe m´ v´ instanc´ kter´ jsou reprezentov´ny
y z y c ı uz ıt ıce ı, e a
r˚zn´mi promˇnn´mi (bud’ glob´ln´ nebo lok´ln´
u y e y a ımi a ımi). Z´nikem promˇnn´ zanik´ tak´
a e e a e
instance pˇ´ sn´ho funkˇn´ bloku.
rısluˇ e c ıho
...
VAR
...
pid1: PID; (* deklarace instance FB pro PID regul´tor *)
a
...
END_VAR
...
CAL pid1
...
Uk´zka 6.1: Deklarace instance funkˇn´ bloku a jeho n´sledn´ vol´n´
a c ıho a e a ı.
Princip z´pisu k´du pro definici tˇla funkˇn´ bloku je patrn´ z uk´zky 6.2.
a o e c ıho y a
Deklarace jednotliv´ch blok˚ promˇnn´ch je nepovinn´. V´znam a vyuˇit´ jednotliv´ch
y u e y a y z ı y
blok˚ promˇnn´ch je detailnˇ pops´n v ˇ´sti 4.
u e y e a ca
Blok lok´ln´ promˇnn´ch m´ nasleduj´ ı v´znam:
a ıch e y a ıc´ y
• M˚ˇe obsahovat tak´ deklarace instanc´ dalˇ´ funkˇn´ blok˚.
uz e ı sıch c ıch u
• Vˇechny lok´ln´ promˇnn´ si udrˇuj´ svoji hodnotu po celou dobu existence in-
s a ı e e z ı
stance funkˇn´ bloku.
c ıho
Norma [5] umoˇnuje pˇed´vat v parametrech funkˇn´ bloku tak´ odkazy na in-
zˇ r a c ıho e
stanci jin´ho funkˇn´ bloku. Tato moˇnost nen´ ve vytvoˇen´m softwarov´m PLC
e c ıho z ı r e e
dostupn´. V nˇkter´ch pˇ´
a e y rıpadech by totiˇ bylo nutn´ zajistit kop´
z e ırovac´ konstruktor
ı
objektu, kter´m je funkˇn´ blok reprezentov´n. Problematick´ by t´ˇ bylo chov´n´ v
y c ı a e ez a ı
pˇ´ e pˇiˇazen´ instance funkˇn´ bloku deklarovan´ v r´mci jin´ho bloku programu
rıpadˇ r r ı c ıho e a e
do v´stupn´ nebo vstupnˇ/v´stupn´ promˇnn´.
y ı e y ı e e
Uk´zka 6.4 obsahuje vygenerovan´ k´d pro funkˇn´ blok z uk´zky 6.3. Z uk´zky je
a y o c ı a a
patrn´, ˇe vygenerovan´ k´d je rozdˇlen na hlaviˇkov´ soubor s definic´ tˇ´ reprezen-
e z y o e c y ı rıdy
tuj´ ı funkˇn´ blok a zdrojov´ soubor s implementac´ t´to tˇ´
ıc´ c ı y ı e rıdy.
N´zev tˇ´ kter´ funkˇn´ blok reprezentuje je ve vygenerovan´m k´du rozˇ´ren o
a rıdy, a c ı e o sıˇ
prefix ”plcfb ”. To umoˇnuje deklarovat v r´mci programu r˚zn´ typy blok˚ se stejn´m
zˇ a u e u y
n´zvem.
a
39
47.
ZPRACOVAN´ PROGRAMOVYCH BLOKU
´ I ´ ˚ Funkˇn´ bloky
c ı
FUNCTION_BLOCK name
VAR_INPUT
... deklarace jednotliv´ch vstupn´ch promˇnn´ch ...
y ı e y
END_VAR
VAR_OUTPUT
... deklarace jednotliv´ch v´stupn´ch promˇnn´ch ...
y y ı e y
END_VAR
VAR_IN_OUT
... deklarace jednotliv´ch vstupnˇ/v´stupn´ch promˇnn´ch ...
y e y ı e y
END_VAR
VAR
... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ...
y a ı e y
END_VAR
...
k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL)
o e s rı e
...
END_FUNCTION_BLOCK
Uk´zka 6.2: Deklarace funkˇn´ bloku.
a c ıho
FUNCTION_BLOCK ukazka
VAR_INPUT
x: INT;
END_VAR
VAR_OUTPUT
y: INT;
END_VAR
VAR
state: INT := 1;
END_VAR
LD state
ADD 1
ST state
MUL x
ST y
END_FUNCTION_BLOCK
Uk´zka 6.3: Vstupn´ soubor pro uk´zku vygenerovan´ho k´du funkˇn´ bloku.
a ı a e o c ıho
40
48.
ZPRACOVAN´ PROGRAMOVYCH BLOKU
´ I ´ ˚ Funkˇn´ bloky
c ı
// soubor s implementac´ tˇ´dy
ı rı
#include "ukazk.h"
#include "plcfb_ukazka.h"
#define RETURN() {ExitCall();return;}
plcfb_ukazka :: plcfb_ukazka(void)
{
#line 3 "fb.plc"
x = CPropertyIn<INT> (&m_x);
#line 6 "fb.plc"
y = CPropertyOut<INT> (&m_y);
// deklarace tˇ´dy,
rı
#line 9 "fb.plc"
// hlaviˇkov´ soubor
c y
m_state = CVariable<INT> ((INT) 1);
#include <plc.h>
}
void plcfb_ukazka :: ExitCall(void)
class plcfb_ukazka
{
{
}
private:
plcfb_ukazka :: ~plcfb_ukazka(void)
#line 3 "fb.plc"
{
CVariable<INT> m_x;
}
#line 6 "fb.plc"
void plcfb_ukazka :: Function(void)
CVariable<INT> m_y;
{
#line 9 "fb.plc"
CResult result;
CVariable<INT> m_state;
#line 12 "fb.plc"
public:
{
#line 3 "fb.plc"
result = m_state;
CPropertyIn<INT> x;
}
#line 6 "fb.plc"
#line 13 "fb.plc"
CPropertyOut<INT> y;
{
plcfb_ukazka(void);
result = result + 1;
virtual ~plcfb_ukazka(void);
}
void Function(void);
#line 14 "fb.plc"
void ExitCall(void);
{
};
result.GetValue(m_state);
}
#line 15 "fb.plc"
{
result = result * m_x;
}
#line 16 "fb.plc"
{
result.GetValue(m_y);
}
RETURN();
}
Uk´zka 6.4: Vygenerovan´ k´d funkˇn´ bloku z uk´zky 6.3.
a y o c ıho a
41
49.
ZPRACOVAN´ PROGRAMOVYCH BLOKU
´ I ´ ˚ Programov´ bloky
e
6.2 Programov´ bloky
e
Programov´ bloky jsou obdobou funkˇn´ blok˚ popsan´ch v pˇedchoz´ ˇ´sti. Hlavn´
e c ıch u y r ı ca ı
rozd´ spoˇ´ a v tom, ˇe tento typ blok˚ m´ automaticky generov´nu svoji unik´tn´
ıl cıv´ z u a a a ı
instanci, kter´ je platn´ po celou dobu bˇhu PLC. Tato instance samozˇejmˇ uchov´v´
a a e r e a a
hodnoty lok´ln´ promˇnn´ch.
a ıch e y
Programov´ bloky jsou urˇeny zejm´na pro spouˇtˇn´ jednotliv´ch vl´ken PLC pro-
e c e se ı y a
gramu, pˇ´rıpadnˇ pro jednor´zov´ spouˇtˇn´ napˇ. pˇi n´bˇˇn´ hranˇ sign´lu. Nicm´nˇ
e a e se ı r r a ez e e a e e
je lze volat i pˇ´
rımo v programu obdobnˇ jako funkˇn´ bloky, pˇiˇemˇ jako parametr
e c ı rc z
instrukce CAL se pouˇije pˇ´
z rımo n´zev programov´ho bloku.
a e
Struktura z´pisu programov´ho bloku je patrn´ z uk´zky 6.5 a je obdobn´ jako
a e a a a
struktura funkˇn´ bloku.
c ıho
PROGRAM name
VAR_INPUT
... deklarace jednotliv´ch vstupn´ch promˇnn´ch ...
y ı e y
END_VAR
VAR_OUTPUT
... deklarace jednotliv´ch v´stupn´ch promˇnn´ch ...
y y ı e y
END_VAR
VAR_IN_OUT
... deklarace jednotliv´ch vstupnˇ/v´stupn´ch promˇnn´ch ...
y e y ı e y
END_VAR
VAR
... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ...
y a ı e y
END_VAR
...
k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL)
o e s rı e
...
END_PROGRAM
Uk´zka 6.5: Deklarace programov´ho bloku.
a e
Vygenerovan´ k´d odpov´ a k´du funkˇn´ bloku z uk´zky 6.3, pouze prefix v
y o ıd´ o c ıho a
n´zvu tˇ´ je nahrazen ”plcp ” a v hlaviˇkov´m souboru je nadefinov´na glob´ln´
a rıdy c e a a ı
promˇnn´ deklaruj´ ı instanci bloku pro vyuˇit´ v generovan´m k´du.
e a ıc´ z ı e o
42
50.
ZPRACOVAN´ PROGRAMOVYCH BLOKU
´ I ´ ˚ Funkce
6.3 Funkce
Funkce jsou nejjednoduˇˇ´ jednotky pro z´pis programu. Umoˇnuj´ pˇed´vat pouze vs-
ssı a zˇ ı r a
1
tupn´ parametry pˇiˇemˇ jako prvn´ parametr funkce je pˇed´na aktu´ln´ hodnota
ı rc z ı r a a ı
z´sobn´
a ıku. Funkce mus´ pˇed´vat n´vratovou hodnotu, kter´ se stane aktu´ln´ hodno-
ı r a a a a ı
tou z´sobn´
a ıku.
Zp˚sob deklarace funkce je patrn´ z uk´zky 6.6. Prvn´ ˇ´dek deklarace definuje
u y a ı ra
2
kromˇ n´zvu funkce tak´ datov´ typ n´vratov´ hodnoty .
e a e y a e
FUNCTION name:DATATYPE
VAR_INPUT
... deklarace jednotliv´ch vstupn´ch promˇnn´ch ...
y ı e y
END_VAR
VAR
... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ...
y a ı e y
END_VAR
...
k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL)
o e s rı e
...
END_FUNCTION
Uk´zka 6.6: Deklarace funkce.
a
N´vratov´ hodnota funkce se nastav´ tak, ˇe se uloˇ´ hodnota do promˇnn´ s n´zvem
a a ı z zı e e a
shodn´m s n´zvem funkce (viz. uk´zka 6.7).
y a a
Kaˇd´ funkci deklarovan´ v k´du softwarov´ho PLC odpov´ a vygenerovan´ tˇ´
z e e o e ıd´ a rıda
v jazyce C++. Vol´n´ funkce n´slednˇ spoˇ´ a ve vytvoˇen´ jednor´zov´ instance t´to
a ı a e cıv´ r ı a e e
tˇ´
rıdy. Tato instance tˇ´ zanikne po ukonˇen´ vol´n´ a pˇed´n´ n´vratov´ hodnoty
rıdy c ı a ı r a ı a e
do aktu´ln´ hodnoty z´sobn´
a ı a ıku. Jednor´zovost instance tˇ´ reprezentuj´ ı funkci je
a rıdy ıc´
zajiˇtˇna vytvoˇen´ speci´ln´ name-space v jazyce C++3 .
se r ım a ıho
Uk´zka 6.9 uv´d´ vygenerovan´ k´d pro funkci z uk´zky 6.8. Jak je patrno, princip
a a ı y o a
generov´n´ k´du je shodn´ s generov´n´ k´du pro pˇedchoz´ programov´ bloky. N´zev
a ı o y a ım o r ı e a
vygenerovan´ tˇ´ je rozˇ´ren o prefix ”plcf ”.
e rıdy sıˇ
1
Ze zp˚sobu pˇed´v´n´ hodnot parametr˚ vypl´v´, ˇe kaˇd´ funkce mus´ m´ alespoˇ jeden vstupn´
u r a a ı u y a z z a ı ıt n ı
parametr.
2
Jedn´ se o poloˇku DATATYPE, kter´ je oddˇlena od n´zvu funkce pomoc´ ”:”.
a z a e a ı
3
s’
Namespace zajiˇt uje platnost instanc´ vˇech tˇ´ a je ohraniˇen pomoc´ {}
ı s rıd c ı
43
51.
ZPRACOVAN´ PROGRAMOVYCH BLOKU
´ I ´ ˚ Funkce
FUNCION exp:INT
VAR_INPUT
int Value;
END_VAR
LD Value
...
ST exp (* Aktu´ln´ hodnotu z´sobn´ku vloˇ´m do n´vratov´ *)
a ı a ı zı a e
(* hodnoty funkce *)
...
END_FUNCTION
Uk´zka 6.7: Zp˚sob nastaven´ n´vratov´ hodnoty funkce.
a u ı a e
FUNCTION min: DINT
VAR_INPUT
val1: DINT;
val2: DINT;
END_VAR
LD val1
ST min
LT val2
RETC
LD val2
ST min
END_FUNCTION
Uk´zka 6.8: Vstupn´ k´d pro uk´zku generovan´ho k´du funkce.
a ı o a e o
44
52.
ZPRACOVAN´ PROGRAMOVYCH BLOKU
´ I ´ ˚ Funkce
// Soubor s implementac´ tˇ´dy
ı rı
#define RETURN() return;
plcf_min :: plcf_min(void)
{
#line 3 "function.plc"
parm0 = CPropertyIn<DINT> (&m_val1);
#line 4 "function.plc"
parm1 = CPropertyIn<DINT> (&m_val2);
}
plcf_min :: ~plcf_min(void)
{
// deklarace tˇ´dy,
rı
}
// hlaviˇkov´ soubor
c y
const CVariable<DINT> &plcf_min ::
#include <plc.h>
GetResult(void)
class plcf_min
{
{
return(this->m_min);
private:
}
CVariable<DINT> m_min;
void plcf_min :: Function(void)
#line 3 "function.plc"
{
CVariable<DINT> m_val1;
CResult result;
#line 4 "function.plc"
#line 7 "function.plc"
CVariable<DINT> m_val2;
{
public:
result = m_val1;
#line 3 "function.plc"
}
CPropertyIn<DINT> parm0;
#line 8 "function.plc"
#line 4 "function.plc"
{
CPropertyIn<DINT> parm1;
result.GetValue(m_min);
}
plcf_min(void);
#line 9 "function.plc"
virtual ~plcf_min(void);
{
void Function(void);
result = (result < m_val2);
const CVariable<DINT>&
}
GetResult(void);
#line 10 "function.plc"
};
if (result != 0)
RETURN();
#line 12 "function.plc"
{
result = m_val2;
}
#line 13 "function.plc"
{
result.GetValue(m_min);
}
}
Uk´zka 6.9: Vygenerovan´ k´d funkce z uk´zky 6.8.
a y o a
45
53.
Kapitola 7
Konfigurace softwarov´hoPLC
e
Tato ˇ´st se zab´v´ speci´ln´ blokem CONFIGURATION definovan´m v [5]. Tento
ca y a a ım y
blok slouˇ´
zı:
• K deklaraci glob´ln´ promˇnn´ch dostupn´ch v programu.
a ıch e y y
• K definici uloh (definuj´ parametry pro spouˇtˇn´ blok˚ typu program).
´ ı se ı u
• K pˇiˇazen´ uloh k jednotliv´m blok˚m typu program.
rr ı´ y u
Uk´zka 7.1 uv´d´ strukturu bloku typu CONFIGURATION se z´kladn´ pod-
a a ı a ımi
bloky, kter´ jsou vybr´ny pro implementaci v softwarov´m PLC. Norma [5] definuje
e a e
jeˇtˇ dalˇ´ podbloky, kter´ nejsou pro bˇh softwarov´ho PLC tˇeba.
se sı e e e r
Blok s glob´ln´ promˇnn´mi obsahuje deklarace glob´ln´ promˇnn´ch tak, jak
a ımi e y a ıch e y
je pops´no v kapitole 4. Promˇnn´ mohou b´t bud
a e e y ’ standardn´ datov´ch typ˚, nebo
ıch y u
se m˚ˇe jedna o glob´ln´ deklarace funkˇn´ blok˚.
uz a ı c ıch u
Blokem RESOURCE se podrobnˇji zab´v´ n´sleduj´ ı ˇ´st 7.1.
e y a a ıc´ ca
Blok CONFIGURATION v generovan´m k´du m´ tedy za ukol definovat podklady
e o a ´
pro vytvoˇen´ funkc´ potˇebn´ch pro spuˇtˇn´ a ukonˇen´ softwarov´ho PLC (zaveden´
r ı ı r y se ı c ı e ı
kernel modulu softwarov´ho PLC do pamˇti a jeho vyjmut´
e e ı).
7.1 Struktura bloku RESOURCE
Tato ˇ´st se zab´v´ v´znamem a obsahem bloku RESOURCE. Informace zde uveden´
ca y a y e
jsou ˇerp´ny z [5].
c a
Jak je patrno z uk´zky 7.1, m˚ˇe i tento blok obsahovat deklaraci glob´ln´
a uz a ıch
promˇnn´ch stejnˇ jako pˇ´
e y e rımo blok CONFIGURATION.
Po pˇ´
rıpadn´ deklaraci glob´ln´ promˇnn´ch jiˇ n´sleduje definice uloh (TASK)
e a ıch e y z a ´
a pˇiˇazen´ tˇchto uloh jednotliv´m blok˚m typu program. To zajist´ spuˇtˇn´ soft-
rr ı e ´ y u ı se ı
warov´ho PLC.
e
46
54.
´
KONFIGURACE SOFTWAROVEHO PLC Struktura bloku RESOURCE
CONFIGURATION name
VAR_GLOBAL
...
variable
...
END_VAR
RESOURCE xx ON yy
VAR_GLOBAL
...
variable
...
END_VAR
...
TASK TaskName(INTERVAL:=T#0.1ms);
...
...
PROGRAM p1 WITH TaskName: ProgramName();
...
END_RESOURCE
END_CONFIGURATION
Uk´zka 7.1: Struktura bloku CONFIGURATION.
a
7.1.1 Struktura blok˚ TASK
u
Bloky TASK definuj´ vlastnosti pro spouˇtˇn´ blok˚ PROGRAM. Jedn´ se tedy o
ı se ı u a
parametry, dle kter´ch budou n´slednˇ vytvoˇeny real-time vl´kna v r´mci RT-Linuxov´ho
y a e r a a e
j´dra. Blok˚m tud´z pˇ´
a u ıˇ rımo neodpov´ a ˇ´dn´ generovan´ k´d.
ıd´ za y y o
V uk´zce 7.2 je uveden pˇehled vˇech parametr˚, kter´ se mohou v definici TASK
a r s u e
bloku vyskytnout.
TASK name([INTERVAL := T#50ms][, PRIORITY := 2][, SINGLE := %Q2.1]);
Uk´zka 7.2: Struktura bloku TASK a jeho z´pis.
a a
Tab.7.1 obsahuje popis jednotliv´ch parametr˚ bloku a jejich v´znam v r˚zn´ch
y u y u y
kontextech.
47
55.
´
KONFIGURACE SOFTWAROVEHO PLC Struktura bloku RESOURCE
Parametr Popis
name N´zev bloku, pouˇit´ v okamˇiku pˇiˇazen´ TASK bloku typu
a z y z rr ı
PROGRAM.
INTERVAL Definuje interval, se kter´m je spouˇtˇno vl´kno, kter´ m´
y se a e a
pˇiˇazeno tento TASK.
rr
PRIORITY Priorita vl´kna, kter´mu je TASK pˇiˇazen. Hodnota v rozsahu
a e rr
0−50, 0 odpov´ a nejvyˇˇ´ prioritˇ, 50 odpov´ a nejvyˇˇ´ prioritˇ.
ıd´ s sı e ıd´ ssı e
SINGLE Pokud je hodnota parametru INTERVAL r˚zn´ od 0, pak defin-
u a
uje, ˇe blok typu PROGRAM m´ b´t spouˇtˇn periodicky pouze
z a y se
v pˇ´ e, ˇe hodnota vstupu SINGLE je log.0. Jestliˇe INTER-
rıpadˇ z z
VAL je 0, pak blok je spouˇtˇn pouze v pˇ´ e, ˇe na vstupu
se rıpadˇ z
SINGLE byla detekov´na n´bˇˇn´ hrana. Hodnota vstupu m˚ˇe
a a ez a uz
b´t reprezentov´na bud’ pˇ´ adresou nebo glob´ln´ promˇnnou.
y a rımo a ı e
Tabulka 7.1: V´znam a popis parametr˚ bloku TASK.
y u
7.1.2 Struktura blok˚ PROGRAM
u
Bloky typu PROGRAM v r´mci deklarace RESOURCE slouˇ´ k pˇiˇazen´ blok˚ TASK
a zı rr ı u
k jednotliv´m programov´m blok˚m PROGRAM1 . V´sledkem je pro vˇechny bloky
y y u y s
typu PROGRAM, kter´ jsou zde uvedeny, vygenerov´n´ samostatn´ho real-time vl´kna,
e a ı e a
kter´ dle parametr˚ uveden´ch v bloku TASK spouˇt´ pˇ´ sn´ blok PROGRAM.
e u y s ı rısluˇ y
Pokud v deklaraci chyb´ pˇiˇazen´ bloku TASK, mˇl by b´t blok dle [5] spouˇtˇn
ı rr ı e y se
trvale s nejniˇˇ´ moˇnou prioritou vˇdy, kdyˇ m´ procesor voln´ ˇas. Podm´
zsı z z z a yc ınka t´kaj´ ı
y ıc´
se spouˇtˇn´ vˇdy, kdyˇ m´ procesor voln´ ˇas mus´ b´t pro vytv´ˇen´ softwarov´ PLC
se ı z z a yc ı y ar e e
modifikov´na.
a
V pˇ´ e, ˇe by totiˇ vˇdy existovalo nˇjak´ RT-Linuxov´ vl´kno, kter´ m´ bˇˇet
rıpadˇ z z z e e e a e a ez
a tud´z by nez˚stal ˇ´dn´ voln´ procesorov´ ˇas, nedostalo by se ke slovu p˚vodn´
ıˇ u za y y y c u ı
Linuxov´ j´dra. To by vedlo k ”zatuhnut´ cel´ho syst´mu. Proto jsou i tyto ulohy
e a ı” e e ´
spouˇtˇny periodicky s t´ ˇe periodu spouˇtˇn´ je moˇn´ zvolit z pˇ´
se ım, z se ı z e rıkazov´ho ˇ´dku.
e ra
Deklarace pˇiˇazen´ TASK k bloku PROGRAM je patrna z uk´zky 7.3. V´znam
rr ı a y
jednotliv´ch parametr˚ je uveden v tab.7.2.
y u
PROGRAM Name [WITH TaskName]: ProgramName([Parm1 := value1[, ...]]);
Uk´zka 7.3: Pˇiˇazen´ definovan´ho TASK k bloku typu PROGRAM v r´mci bloku
a rr ı e a
RESOURCE.
1
Ve v´znamu bloku pro z´pis programu z kapitoly 6.
y a
48
56.
´
KONFIGURACE SOFTWAROVEHO PLC Struktura bloku RESOURCE
N´zev
a Popis
Name Unik´tn´ n´zev definovan´ho vl´kna.
a ı a e a
TaskName N´zev bloku TASK, jehoˇ parametry se pouˇij´ pˇi definici
a z z ı r
vl´kna.
a
ProgramName N´zev bloku typu PROGRAM, kter´ bude spouˇtˇn s
a y se
parametry TASK.
Parm1 Pokud m´ blok parametry, obsahuje ˇ´rkou oddˇlen´
a ca e e
parametry s pˇiˇazenou hodnotou. Hodnota m˚ˇe b´t bud’
rr uz y
konstanta, adresa v pamˇti PLC nebo glob´ln´ promˇnn´.
e a ı e a
Tabulka 7.2: Popis a v´znam parametr˚ pˇi definici spouˇtˇn´ programu.
y u r se ı
Uk´zka 7.5 uv´d´ vygenerovan´ k´d v C++, kter´ odpov´ a definici z uk´zky 7.4.
a a ı y o y ıd´ a
Je z n´ patrn´, ˇe kaˇd´ vytvoˇen´ real-time vl´kno je oznaˇeno pro pl´novaˇ proces˚
ı e z z e r e a c a c u
jako vyuˇ´ ıc´ FPU. D˚vodem je moˇnost vyuˇit´ datov´ho typu real kdekoliv v r´mci
zıvaj´ ı u z z ı e a
PLC programu. Z toho plyne nutnost zajistit bezkonfliktn´ vyuˇit´ FPU v r´mci cel´ho
ı z ı a e
operaˇn´ syst´mu.
c ıho e
PROGRAM init
VAR_INPUT
stav: INT;
END_VAR
END_PROGRAM
CONFIGURATION test
RESOURCE xx ON yy
TASK pok1(INTERVAL:=T#20ms, SINGLE:=%QX1.0);
PROGRAM p1 WITH pok1: init(stav := %QB0);
END_RESOURCE
END_CONFIGURATION
Uk´zka 7.4: Definice spouˇtˇn´ PLC vl´ken.
a se ı a
49
Kapitola 8
Podpora proRT-Linux
Tato kapitola se zab´v´ vytvoˇenou podporou pro RT-Linux. V ˇ´sti 8.1 je pops´na
y a r ca a
podp˚rn´ knihovna potˇebn´ pro kompilaci modul˚ softwarov´ho PLC, ˇ´st 8.2 se
u a r a u e ca
zab´v´ tvorbou ovladaˇ˚ pro vstupn´ a v´stupn´ zaˇ´ ı. C´
y a cu ı y ı rızen´ ˇ ast 8.3 se zab´v´ potˇebnou
y a r
podporou pˇ´
rımo v j´dˇe RT-Linuxu.
a r
Obr.8.1 uv´d´ pro uplnost schematick´ n´ˇrt cel´ho vytvoˇen´ho softwarov´ho PLC.
a ı ´ y ac e r e e
ˇ
Sipky v obr´zku naznaˇuj´ jak´m zp˚sobem prob´ a vnitˇn´ komunikace mezi jed-
a c ı, y u ıh´ r ı
notliv´mi ˇ´stmi softwarov´ho PLC.
y ca e
8.1 Knihovna
Podp˚rn´ knihovna umoˇnuj´ ı kompilaci k´du vygenerovan´ho pomoc´ konverzn´
u a zˇ ıc´ o e ı ıho
programu plc2cpp se skl´d´ z nˇkolika ˇ´st´ kter´ spolu navz´jem souvisej´ Jednotliv´
a a e ca ı, e a ı. e
ˇ´sti, kter´ jsou implementov´ny v r´mci podp˚rn´ knihovny, jsou na obr.8.1 oznaˇeny
ca e a a u e c
v r´meˇc´ s ˇed´m podkladem.
a c ıch s y
Tab.8.1 uv´d´ pˇehled jednotliv´ch tˇ´ kter´ podp˚rn´ knihovna implementuje.
a ı r y rıd, e u a
Ke kaˇd´ tˇ´ e je z´roveˇ uveden jej´ kr´tk´ popis a v´znam.
z e rıdˇ a n ı a y y
8.1.1 Emulace pamˇti PLC
e
Emulace pˇ´ rıstupu do pamˇti pomoc´ adres tak, jak je definov´no v [5] implemen-
e ı a
tuje tˇ´ CMemory1 . Ta pro pˇ´
rıda rıstup do pamˇti umoˇnuje adresaci dle normy vˇetnˇ
e zˇ c e
pˇ´
rıstupu na digit´ln´ vstupy/v´stupy. V pˇ´ e, ˇe se jedn´ o adresu v intern´ PLC
a ı y rıpadˇ z a ı
pamˇti, je pˇ´
e rıstup zpracov´n pˇ´
a rımo tˇ´rıdou CMemory.
Pokud se jedn´ o pˇ´
a rıstup do pamˇti odpov´ ıc´ adresaci digit´ln´ vstup˚/v´stup˚,
e ıdaj´ ı a ıch u y u
je ˇ´ ı pˇed´no ovladaˇi definovan´mu tˇ´
rızen´ r a c e rıdou CPLCDrivers. Podrobnˇjˇ´ popis lze
e sı
nal´zt v ˇ´sti 8.2.
e ca
1
Implementace v souboru cmemory.h
51
59.
PODPORA PRO RT-LINUX Knihovna
Obr´zek 8.1: Schema vytvoˇen´ho softwarov´ho PLC.
a r e e
8.1.2 Podpora promˇnn´ch PLC
e y
Podpora promˇnn´ch je implementov´na v template tˇ´ CVariable2 . Tato template
e y a rıde
tˇ´ implementuje n´sleduj´ ı operace:
rıda a ıc´
• Specifikovat datov´ typ promˇnn´ tak, jak je definov´no v [5].
y e e a
• Specifikovat inicializaˇn´ hodnotu promˇnn´ pˇi deklaraci.
c ı e e r
e’ e
• Specifikovat adresu v pamˇt ov´m prostoru emulovan´ho PLC. Tato adresa samozˇejmˇ
e r e
m˚ˇe b´t i adresa vstupu nebo v´stupu, je-li k t´to adrese zaregistrov´n nˇkter´
uz y y e a e y
ovladaˇ ve spr´vci zaˇ´ ı (viz. d´le).
c a rızen´ a
2
Implementace v souboru cvariable.h
52
60.
PODPORA PRO RT-LINUX Knihovna
N´zev tˇ´
a rıdy Popis
CVariable Tˇ´
rıda vyuˇ´ a k deklaraci promˇnn´ch ve vygen-
zıvan´ e y
erovan´m C++ k´du. Podporuje adresaci PLC pamˇti,
e o e
pokud m´ promˇnn´ tuto adresu v deklaraci speci-
a e a
fikov´nu.
a
CPropertyIn Tˇ´
rıda pouˇ´ a ve vygenerovan´m C++ k´du pro
zıvan´ e o
reprezentaci vstupn´ ıch parametr˚ funkc´ funkˇn´
u ı, c ıch
blok˚ a programov´ch blok˚.
u y u
CPropertyOut Tˇ´
rıda vyuˇ´ a ve vygenerovan´m C++ k´du pro
zıvan´ e o
reprezentaci v´stupn´ parametr˚ funkˇn´ blok˚ a
y ıch u c ıch u
programov´ch blok˚.
y u
CPropertyIO Tˇ´
rıda vyuˇ´ a ve vygenerovan´m C++ k´du pro
zıvan´ e o
reprezentaci vstupnˇ-v´stupn´ parametr˚ funkˇn´
e y ıch u c ıch
blok˚ a programov´ch blok˚.
u y u
CMemory Tˇ´
rıda, kter´ implementuje emulaci PLC pamˇti, za-
a e
pouzdˇuje funkcionalitu pro pˇ´
r rıstup k adres´m vnitˇn´
a r ı
pamˇti, vstup˚m a v´stup˚m. Pro pˇ´
e u y u rıstup k vstup˚m au
v´stup˚m vyuˇ´ a instanci tˇ´ CDeviceManager.
y u zıv´ rıdy
CResult Tˇ´ reprezentuj´ ı aktu´ln´ hodnotu z´sobn´
rıda ıc´ a ı a ıku.
CDeviceDriver Virtu´ln´ tˇ´ vyuˇ´ a pro tvorbu ovladaˇ˚ vstup˚ a
a ı rıda zıvan´ cu u
v´stup˚.
y u
CDeviceManager Tˇ´
rıda spravuj´ ı instance jednotliv´ch ovladaˇ˚ a
ıc´ y cu
s ’ ıc´
zajiˇt uj´ ı mapov´n´ adresy vstupu/v´stupu na
a ı y
pˇ´ sn´ ovladaˇ zaˇ´ ı.
rısluˇ y c rızen´
CMutex Tˇ´ zapouzdˇuj´ ı funkcionalitu mutex˚ pro zamyk´n´
rıda r ıc´ u a ı
kritick´ch ˇ´st´ ovladaˇ˚ PLC zaˇ´ ı.
y ca ı cu rızen´
CSpinLock Tˇ´
rıda zapouzdˇuj´ ı funkcionalitu mutex˚ pro za-
r ıc´ u
myk´n´ kritick´ch ˇ´st´ ovladaˇ˚ PLC zaˇ´ ı (spin-
a ı y ca ı cu rızen´
lock je funkˇnˇ podobn´ mutexu. Rozd´ je v tom,
c e y ıl
ˇe po uzamˇen´ oblasti pomoc´ spinlocku je zak´z´no
z c ı ı a a
pˇeruˇen´ a tud´z prov´dˇn´ k´d nem˚ˇe b´t pˇeruˇen
r s ı ıˇ a e y o uz y r s
schedulerem).
Tabulka 8.1: Pˇehled tˇ´ implementovan´ch v podp˚rn´ knihovnˇ pro PLC.
r rıd y u e e
8.1.3 Podpora parametr˚ pro vol´n´ programov´ch blok˚
u a ı y u
Podpora pro pˇed´v´n´ parametr˚ programov´m blok˚ je implementov´na v template
r a a ı u y u a
tˇ´ ach CPropertyIn, CPropertyOut a CPropertyIO. Pˇi deklaraci parametru se defin-
rıd´ r
uje typ parametru (vstupn´ v´stupn´ vstupnˇ-v´stupn´ a d´le se parametru pˇiˇazuje
ı, y ı, e y ı) a rr
53
61.
PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
c a ıch u y u
a rıdou CVariable3 , kter´ se pouˇ´ a v r´mci vygenerovan´ho
promˇnn´ reprezentovan´ tˇ´
e a a zıv´ a e
C++ k´du v programovac´ jazyce PLC pro pˇ´
o ım rıstup k hodnotˇ parametru.
e
8.1.4 Emulace aktu´ln´ hodnoty z´sobn´
a ı a ıku
Aktu´ln´ hodnota z´sobn´ nebo t´ˇ tzv. current-result je reprezentov´na tˇ´
a ı a ıku, ez a rıdou CRe-
4
sult . Tato tˇ´ m´ n´sleduj´ ı vlastnosti:
rıda a a ıc´
• Uchov´v´ v´sledek posledn´ proveden´ operace vˇetnˇ informace o jej´ datov´m
a a y ı e c e ım e
typu.
• Implementuje oper´tory pro matematick´ a porovn´vac´ operace.
a e a ı
• Umoˇnuje nastavit aktu´ln´ hodnotu z´sobn´ na hodnotu PLC promˇnn´(template
zˇ a ı a ıku e e
tˇ´ CVariable).
rıda
• Umoˇnuje nastavit aktu´ln´ hodnotu z´sobn´ na hodnotu PLC parametru
zˇ a ı a ıku
funkˇn´ nebo programov´ho bloku.
c ıho e
8.2 Ovladaˇe karet digit´ln´ vstup˚ ystup˚
c a ıch u/v´ u
Pˇ´
rıstup na hardwarov´ karty pro digit´ln´ vstupy/v´stupy je rozdˇlen na dvˇ urovnˇ
e a ı y e e´ e
(viz. obr.8.1). Nejvyˇˇ´ uroveˇ je reprezentov´na tˇ´
ssı ´ n a rıdou CDeviceManager, kter´ je a
vol´na z objektu CMemory (objekt pro emulaci pamˇti PLC).
a e
Tato tˇ´ udrˇuje seznam aktivn´ ovladaˇ˚ karet pro PLC, pˇiˇemˇ zajiˇt uje
rıda z ıch cu rc z s’
pˇed´n´ vol´n´ ovladaˇi pˇ´ sn´ho hardwarov´ho zaˇ´ ı a zpracov´n´ poˇadavku.
r a ı a ı c rısluˇ e e rızen´ a ı z
Vlastn´ seznam ovladaˇ˚ je vytvoˇen jako pole statick´ velikosti obsahuj´ ı odkazy
ı cu r e ıc´
na jednotliv´ registrovan´ ovladaˇe5 . Pˇi vyhled´v´n´ ovladaˇe odpov´ ıc´
e e c r a a ı c ıdaj´ ımu zadan´ e
adrese se cyklicky proch´z´ toto pole a ovladaˇ je zde vyhled´n. Pokud by bylo pouˇito
a ı c a z
vˇtˇ´ mnoˇstv´ aktivn´ ovladaˇ˚, pak by bylo moˇno vytvoˇit seznam ovladaˇ˚ jako
e sı z ı ıch cu z r cu
vyhled´vac´ strom pro zv´ˇen´ rychlosti vyhled´n´ zaˇ´ ı, kter´ odpov´ a poˇadovan´
a ı ys ı a ı rızen´ e ıd´ z e
adrese. Vzhledem k tomu, ˇe lze pˇedpokl´dat za norm´ln´ okolnost´ pouze jednotky
z r a a ıch ı
pouˇit´ch ovladaˇ˚, lze pouˇit´ ˇeˇen´ povaˇovat za dostateˇnˇ efektivn´
z y cu z er s ı z c e ı.
e e’ e
N´slednˇ je v pamˇt ov´m kontextu linuxov´ho j´dra k dispozici instance tohoto ob-
a e a
jektu s n´zvem g KernelPLCDrivers, kter´ je vyuˇ´ ana vytvoˇen´m softwarov´m PLC
a a zıv´ r y y
i zaregistrovan´mi ovladaˇi. Tato instance je vytvoˇena zaveden´ modulu plc devicemanager.o
y c r ım
do linuxov´ho j´dra a mus´ b´t dostupn´ pˇed nahr´n´
e a ı y a r a ım:
• Vlastn´ modulu, kter´ reprezentuje emulovan´ PLC.
ıho y e
3
Obˇ template tˇ´ jsou deklarov´ny se stejn´m parametrem ˇablony (stejn´m vnitˇn´ datov´m
e rıdy a y s y r ım y
typem).
4
Implementace v souboru cresult.h
5
Je tedy tˇeba bˇhem pˇekladu modul˚ odhadnout, kolik ovladaˇ˚ bude maxim´lnˇ pouˇito a
r e r u cu a e z
velikost pole spr´vnˇ nastavit.
a e
54
62.
PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
c a ıch u y u
• Jak´hokoliv pouˇ´ eho ovladaˇe.
e zıvan´ c
Modul lze zav´st do pamˇti jedn´ z n´sleduj´ ıch zp˚sob˚6 :
e e ım a ıc´ u u
• V pˇ´ e, ˇe je softwarov´ PLC nainstalov´no a modul je dostupn´ ve stan-
rıpadˇ z e a y
dardn´ adres´ˇi modul˚ j´dra:
ım ar u a
]# modprobe plc_devicemanager
• V pˇ´ e, ˇe se modul nach´z´ v jin´m adres´ˇi7 :
rıpadˇ z a ı e ar
]# insmod cesta/plc_devicemanager.o
8.2.1 Tvorba ovladaˇe I/O karty
c
Tvorbu ovladaˇe I/O zaˇ´ ı lze rozdˇlit na dvˇ ˇ´sti:
c rızen´ e e ca
1. Nejprve je tˇeba vytvoˇit odvozenou tˇ´ od tˇ´ CDeviceDriver, kter´ imple-
r r rıdu rıdy a
mentuje virtu´ln´ metody tˇ´ z uk´zky 8.1 volan´ pˇi pˇ´
a ı rıdy a e r rıstupu na zaˇ´ ı.
rızen´
Popis virtu´ln´ metod je uveden v tab.8.2.
a ıch
2. Pot´ je tˇeba vytvoˇit modul j´dra RT-Linuxu, kter´ bˇhem sv´ho zav´dˇn´ do
e r r a y e e a e ı
pamˇti provede registraci instance tˇ´ vytvoˇen´ v pˇedchoz´ kroku do spr´vce
e rıdy r e r ım a
PLC zaˇ´ ı. Registrac´ do spr´vce zaˇ´ ı ovladaˇ ozn´m´ kter´ adresn´ rozsahy
rızen´ ı a rızen´ c a ı, e ı
vstup˚ a v´stup˚ obsluhuje a maj´ mu tedy b´t pˇed´ny. Registraci lze prov´st
u y u ı y r a e
metodou RegisterDriver() z´kladn´ objektu CDeviceDriver.
a ıho
N´zev metody
a
ReadAddress() Virtu´ln´ metoda volan´ v pˇ´ e, ˇe je tˇeba ze
a ı a rıpadˇ z r
zaˇ´ ı pˇeˇ´ aktu´ln´ hodnotu zadan´ adresy.
rızen´ r cıst a ı e
SetAddress() Virtu´ln´ metoda volan´ v pˇ´ e, ˇe je tˇeba z pro-
a ı a rıpadˇ z r
gramu nastavit hodnotu nˇkter´ adresy, kter´ odpov´ a
e e a ıd´
tomuto ovladaˇi.
c
DriverInfo() Metoda vracej´ ı n´zev a popis ovladaˇe. Je vyuˇ´ ana
ıc´ a c zıv´
pˇi zobrazov´n´ informac´ t´kaj´ ıch se ovladaˇe.
r a ı ı y ıc´ c
Tabulka 8.2: Popis virtu´ln´ metod definovan´ch ve tˇ´ e CDeviceDriver.
a ıch y rıdˇ
Jako pˇ´
rıklad pro tvorbu ovladaˇe lze vyuˇ´ komentovan´ zdrojov´ k´dy vytvoˇen´ch
c zıt e e o r y
ovladaˇ˚, kter´ jsou pops´ny n´ze.
cu e a ıˇ
Kaˇd´ z n´sleduj´ ıch ovladaˇ˚ umoˇnuje pˇi zav´dˇn´ modulu specifikovat tak´
z y a ıc´ cu zˇ r a e ı e
PLC adresy, na kter´ch bude ovladaˇ dostupn´. Pˇehled je k dispozici v tab.8.3.
y c y r
Ovladaˇ lze zav´st do pamˇti pomoc´ n´sleduj´ ıho pˇ´
c e e ı a ıc´ rıkazu:
6
Pˇ´
rıpadnˇ lze zaveden´ modulu zajistit napˇ. startovac´ skriptem pˇi spouˇtˇn´ operaˇn´
e ı r ım r se ı c ıho
syst´mu.
e
7ˇ
C´st cesta v um´ en´ modulu m˚ˇe b´t absolutn´ nebo relativn´ cesta k modulu.
a ıstˇ ı uz y ı ı
55
63.
PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
c a ıch u y u
class CDeviceDriver
{
...
public:
virtual int ReadAddress(void *Value,
int iValueSize,
int iInputAddr,
int iByteAddress,
int iBitAddress
) = 0;
virtual int SetAddress(void *Value,
int iValueSize,
int iInputAddr,
int iByteAddress,
int iBitAddress
) = 0;
virtual const char* DriverInfo(void) = 0;
...
};
Uk´zka 8.1: Virtu´ln´ metody pro implementaci ovladaˇe.
a a ı c
Parametr Popis
iladdr Parametr specifikuj´ ı z´kladn´ adresu, na
ıc´ a ı
kter´ bude ovladaˇ dostupn´ pˇi adresov´n´
e c y r a ı
vstup˚. Pokud je tedy napˇ. hodnota
u r
iladdr=10, bude prvn´ adresa zaˇ´ ı dos-
ı rızen´
tupn´ jako %IB10. Pokud parametr nen´
a ı
specifikov´n, je zaˇ´ ı adresov´no od %IB0.
a rızen´ a
oladdr Parametr specifikuj´ ı z´kladn´ adresu, na
ıc´ a ı
kter´ bude ovladaˇ dostupn´ pˇi adresov´n´
e c y r a ı
v´stup˚. Pokud je tedy napˇ. hodnota
y u r
oladdr=7, bude prvn´ adresa zaˇ´ ı dos-
ı rızen´
tupn´ jako %QB7. Pokud parametr nen´
a ı
specifikov´n, je zaˇ´ ı adresov´no od
a rızen´ a
%QB0.
Tabulka 8.3: Pˇehled spoleˇn´ch parametr˚ pro moduly ovladaˇ˚.
r c y u cu
]# insmod plc_lpt.o [iladdr=2] [oladdr=3]
Parametry modulu jsou nepovinn´, pˇedpokl´d´ se, ˇe je jiˇ zaveden modul spr´vce
e r a a z z a
ovladaˇ˚ plc devicemanager.o. N´zev modulu plc lpt.o je tˇeba samozˇejmˇ nahradit
cu a r r e
56
64.
PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
c a ıch u y u
pˇ´ sn´m n´zvem modulu, kter´ chceme nahr´t do pamˇti.
rısluˇ y a y a e
Ovladaˇ PCI karty Advantech
c
Ovladaˇ dodan´ karty Advantech PCI LabCard 1750 je vytvoˇen velice jednoduˇe.
c e r s
Ovladaˇ si internˇ udrˇuje informace o vˇech aktu´ln´ hodnot´ch v´stup˚. Tyto
c e z s a ıch a y u
hodnoty jsou pak ovladaˇem navr´ceny v pˇ´ e, ˇe uˇivatel z programu ˇte hodnotu
c a rıpadˇ z z c
v´stupu. Pokud uˇivatel zap´se na v´stup novou hodnotu, je intern´ informace aktual-
y z ıˇ y ı
izov´na a na v´stupy je okamˇitˇ zaps´na poˇadovan´ hodnota. V pˇ´ e, ˇe uˇivatel
a y z e a z a rıpadˇ z z
ˇte hodnoty vstup˚, je aktu´ln´ hodnota z´ ana pˇi kaˇd´m poˇadavku.
c u a ı ısk´ r z e z
Ovladaˇ by bylo moˇno upravit tak, ˇe by vzorkoval hodnoty pomoc´ vlastn´ real-
c z z ı ıho
time vl´kna maxim´ln´ pˇ´
a a ı rıpustnou frekvenc´ a uˇivatel by vˇdy z´
ı z z ıskal pouze aktu´ln´
a ı
navzorkovanou hodnotu.
Ovladaˇ paraleln´ portu
c ıho
Ovladaˇ standardn´ paraleln´ portu je vytvoˇen s ohledem na ulohu ˇ´ ı ot´ˇek
c ıho ıho r ´ rızen´ ac
motorku. Popis a v´znam jednotliv´ch adres je uveden v tab.8.4.
y y
Adresa Velikost V´znam
y
0x00 1byte V´stupn´ adresa, pˇi z´pisu odpov´ a z´pisu
y ı r a ıd´ a
na adresu 0x378 (z´pisu na z´kladn´ adresu
a a ı
paraleln´ portu).
ıho
0x00 1byte Vstupn´ adresa, pˇi ˇten´ odpov´ a ˇten´
ı r c ı ıd´ c ı
adresy 0x379 (ˇten´ z´kladn´ adresy par-
c ı a ı
aleln´ portu + 0x1).
ıho
0x01.0 1bit Vstupn´ adresa, v pˇ´ e, ˇe obsahuje
ı rıpadˇ z
log.1, bylo vyvol´no pˇeruˇen´ od paraleln´
a r s ı ıho
portu. Po pˇeˇten´ hodnoty je automaticky
r c ı
nastaveno zpˇt na log.0.
e
Tabulka 8.4: V´znam jednotliv´ch adres ovladaˇe paraleln´ portu.
y y c ıho
´
Uloha ˇ´ ı motorku tento ovladaˇ vyuˇ´ a k vytvoˇen´ PID regul´toru pro regulaci
rızen´ c zıv´ r ı a
ot´ˇek pomoc´ PID regul´toru.
ac ı a
N´zev modulu ovladaˇe paraleln´ portu je plc lpt.o.
a c ıho
Ovladaˇ pro komunikaci s user-space Linuxu
c
Tento ovladaˇ slouˇ´ ke komunikaci s user-space Linuxu. Pomoc´ vstupn´ adres lze
c zı ı ıch
nastavovat hodnoty PLC adres z user-space ˇ´sti Linuxu, pomoc´ adres v´stupn´ lze
ca ı y ıch
z´ avat z user-space ˇ´sti hodnoty promˇnn´ch PLC.
ısk´ ca e y
57
65.
PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
c a ıch u y u
Pro komunikaci mezi kernel-space a user-space je vyuˇiv´no jedno RT-Linux FIFO
z a
pro z´pis promˇnn´ch do PLC, jedno pro ˇten´ promˇnn´ch z PLC a jedno pro nas-
a e y c ı e y
tavov´n´ parametr˚ ovladaˇe.
a ı u c
Ovladaˇ poskytuje 64 adres pro vstupy a 64 adres pro v´stupy. Velikost pamˇti je
c y e
nastavov´na pˇi kompilaci modulu pomoc´ makra PLC USPACE MEMORY.
a r ı
Tab.8.5 popisuje, k ˇemu slouˇ´ jednotliv´ real-time FIFO pouˇ´ a ovladaˇem.
c zı a zıvan´ c
Index N´zev
a Popis
F irstF IF O + 0 ˇ ıd´ ı
R´ ıc´ FIFO Slouˇ´ k naprogramov´n´ intervalu, se
zı a ı
kter´m je zas´ an obsah vnitˇn´ pamˇti
y ıl´ r ı e
ovladaˇe. Pro z´pis pˇ´
c a rıkazu slouˇ´ struktura
zı
struct PLCUserSpaceControl deklarovan´ a
v hlaviˇkov´m souboru plc uspace.h.
c e
Do poloˇky struktury Command patˇ´
z rı
jedna z hodnot PLC SEND SET TIME,
PLC SEND STOP, PLC RESET. Pokud
je hodnota PLC SEND SET TIME, patˇ´ rı
do poloˇky iTime ˇasov´ interval v [ms]
z c y
s jak´m budou zas´ ana data. Popis jed-
y ıl´
notliv´ch pˇ´ u je pops´n v hlaviˇkov´m
y rıkaz˚ a c e
souboru.
F irstF IF O + 1 Vstupn´ FIFO
ı Slouˇ´ k z´pisu dat odpov´ ıch jed-
zı a ıdaj´
notliv´m vstupn´ adres´m ovladaˇe. Pˇi
y ım a c r
z´pisu mus´ b´t zasl´no najednou hodnota
a ı y a
vˇech vstup˚.
s u
F irstF IF O + 2 V´stupn´ FIFO
y ı Slouˇ´ k z´ av´n´ hodnot vstup˚ a v´stup˚
zı ısk´ a ı u y u
ovladaˇe (obsah vnitˇn´ pamˇti ovladaˇe).
c r ı e c
Struktura zas´ ych dat je patrna z
ılan´
obr.8.2.
Tabulka 8.5: Popis jednotliv´ch RT FIFO vyuˇ´ ych ovladaˇem pro komunikaci s
y zıvan´ c
user-space.
Ovladaˇ je zaloˇen na n´sleduj´ ım principu:
c z a ıc´
• Po zaveden´ modulu ovladaˇe (plc uspacedriver.o) do pamˇti se zaregistruje ve
ı c e
spr´vci PLC zaˇ´ ı a otevˇe si 3 po sobˇ n´sleduj´ ı real-time fifo8 .
a rızen´ r e a ıc´
• Pokud chce uˇivatel z´ avat hodnoty promˇnn´ch ze softwarov´ho PLC, otevˇe
z ısk´ e y e r
si ˇ´ ıc´ FIFO a naprogramuje si interval, s jak´m m´ b´t do v´stupn´ FIFO
rıd´ ı y a y y ıho
zas´ an aktu´ln´ stav vnitˇn´ pamˇti ovladaˇe (adres).
ıl´ a ı r ı e c
8
Pomoc´ parametru FirstFIFO pˇi zav´dˇn´ modulu lze specifikovat, jak´ nejniˇˇ´ FIFO se pouˇije.
ı r a e ı e zsı z
58
66.
PODPORA PRO RT-LINUX Podpora C++ v RT-Linuxov´m kernelu
e
• Pokud chce uˇivatel nastavit nˇkter´ ze vstup˚ ovladaˇe, otevˇe si vstupn´ FIFO
z e y u c r ı
a zaˇle do nˇho nov´ stav vˇech vstup˚. Tj. mus´ zapsat takov´ mnoˇstv´ dat,
s e y s u ı e z ı
9
kter´ odpov´ a velikosti vnitˇn´ pamˇti ovladaˇe .
e ıd´ r ı e c
Obr.8.2 ukazuje strukturu dat, kter´ je zas´ ana ovladaˇem pˇi ˇten´ hodnot vstup˚
a ıl´ c r c ı u
10 11
a v´stup˚ ovladaˇe. Hlaviˇka nab´v´ vˇdy hodnoty ”I” nebo ”O” . Oba bloky jsou
y u c c y a z
vˇdy zas´ any za sebou. Pokud hlaviˇka neobsahuje jednu z uveden´ch hodnot, pak
z ıl´ c y
zˇejmˇ jsou data zas´ ana pˇ´ s rychle a proces v user-space Linuxu je nest´ a ˇ´
r e ıl´ rıliˇ ıh´ cıst.
D˚sledkem je, ˇe data v FIFO jsou zahazov´na. V tomto pˇ´ e je vhodn´ prov´st
u z a rıpadˇ e e
reset ovladaˇe (viz. popis ˇ´ ıc´ FIFO).
c rıd´ ıho
Obr´zek 8.2: Struktura bloku dat pˇi ˇten´ hodnot pamˇti ovladaˇe.
a r c ı e c
Ovladaˇ je urˇen zejm´na pro moˇnost vizualizace ˇ´ ıc´ procesu. Takto je tak´
c c e z rıd´ ıho e
vyuˇ´ an v r´mci vzorov´ ulohy ˇ´ ı ot´ˇek motorku.
zıv´ a e´ rızen´ ac
Ovladaˇ pro ladˇn´ programu
c e ı
Ovladaˇ pro ladˇn´ programu emuluje vstupy a v´stupy pomoc´ vnitˇn´ pamˇti, pˇiˇemˇ
c e ı y ı r ı e rc z
pˇi zmˇnˇ hodnoty je vyps´na na aktu´ln´ konzoli Linuxu nov´ hodnota nastavovan´
r e e a a ı a e
promˇnn´ vˇetnˇ informace o adrese, na kter´ se zmˇna ud´la. Pˇi ˇten´ hodnoty je na
e e c e e e a r c ı
konzoli vyps´na informace o ˇten´ adrese a hodnotˇ, kter´ se na n´ pr´vˇ nach´z´
a c e e a ı a e a ı.
Tento ovladaˇ je vhodn´ vyuˇ´
c e zıvat pouze v pˇ´ e ladˇn´ pomalejˇ´ program˚
rıpadˇ e ı sıch u
(nebo doˇasnˇ sn´zit frekvenci spouˇtˇn´ pˇ´ sn´ho RT vl´kna), nebot
c e ıˇ s e ı rısluˇ e a ’ vzhledem k
ˇasov´ n´roˇnosti v´stupu na linuxovou konzoli m˚ˇe pˇi ˇast´m pˇ´
c e a c y uz r c e rıstupu doj´ k nesta-
ıt
bilitˇ cel´ho syst´mu.
e e e
8.3 Podpora C++ v RT-Linuxov´m kernelu
e
Tato ˇ´st souvis´ s pouˇit´m pˇekladaˇem GCC a jeho vlastnostmi vyuˇiteln´mi pˇi
ca ı z y r c z y r
pˇekladu programu. V pˇ´ e kompilace vygenerovan´ho C++ k´du jin´m pˇekladaˇem
r rıpadˇ e o y r c
je moˇn´, ˇe se v´ˇet potˇebn´ch symbol˚ bude liˇit.
z e z yc r y u s
Pro pˇekladaˇ GCC je tˇeba m´ v r´mci j´dra RT-Linuxu k dispozici modul rtl cpp,
r c r ıt a a
kter´ implementuje symboly pro nˇkter´ funkce a oper´tory potˇebn´ k bˇhu zkom-
y e e a r e e
pilovan´ho k´du jazyka C++. Potˇebn´ symboly se mohou liˇit ze dvou d˚vod˚:
e o r e s u u
1. Je pouˇita odliˇn´ verze pˇekladaˇe GCC.
z s a r c
9
Hodnota makra PLC USPACE MEMORY pˇi pˇekladu ovladaˇe.
r r c
10
Pokud n´sleduje blok s hodnotami vstup˚.
a u
11
Pokud n´sleduje blok s hodnotami v´stup˚.
a y u
59
67.
PODPORA PRO RT-LINUX Podpora C++ v RT-Linuxov´m kernelu
e
2. Pˇekladaˇ GCC byl byl bˇhem sv´ kompilace zkompilov´n s jin´mi parametry.
r c e e a y
Souˇast´ distribuce RT-Linuxu je verze modulu, kter´ implementuje funkce fputs(),
c´ ı a
pure virtual(), cxa atexit(), this fixmap does not exist(), assert fail(), isnan().
V bal´ RT-Linux Contrib je k dispozici novˇjˇ´ verze modulu, kter´ nav´ oproti
ıku e sı a ıc
p˚vodn´ verzi implementuje oper´tory new, new[], delete, delete[]. Tyto oper´tory jsou
u ı a a
v podstatˇ pouze pˇesmˇrov´ny tak, aby vyuˇ´
e r e a zıvaly vol´n´ standardn´ linuxov´ho ker-
a ı ıho e
nelu pro dynamick´ alokace a dealokace pamˇti. Z toho plyne omezen´ ˇe je lze vyuˇ´
e e ı, z zıt
pouze bˇhem inicializace a deinicializace modulu j´dra. Dostupnost tˇchto oper´tor˚ je
e a e a u
proto podm´ ena existenc´ makra CPP INIT . Nav´ tato verze umoˇnuje linkov´n´
ınˇ ı ıc zˇ a ı
real-time modul˚ sloˇen´ch z v´ zdrojov´ch soubor˚.
u z y ıce y u
Na pˇiloˇen´m CD je upraven´ verze p˚vodn´ modulu rtl cpp z RT-Linux Contrib,
r z e a u ıho
kter´ je vyzkouˇena s kompil´tory GCC 2.96 a GCC 3.2. Tato verze nav´ implementuje
a s a ıc
symbol cxa pure virtual().
Vzhledem k tomu, ˇe kompil´tor GCC lze kompilovat s mnoha r˚zn´mi parametry,
z a u y
m˚ˇe se st´t, ˇe v jin´ verzi, pˇ´
uz a z e rıpadnˇ verzi z jin´ distribuce bude chybˇt nˇjak´ dalˇ´
e e e e y sı
symbol. Obvykle se jedn´ o r˚zn´ funkce se speci´ln´ v´znamem, kter´ jsou v r´mci
a u e a ım y e a
norm´ln´ program˚ linkov´ny s defaultn´ funkcionalitou, lze je deklarovat podobnˇ
a ıch u a ı e
jako v´ˇe uveden´ symboly.
ys e
60
68.
Kapitola 9
Pouˇit´ softwarov´hoPLC
z ı e
Tato kapitola se zab´v´ pouˇit´ vytvoˇen´ho software pro programov´n´ softwarov´ho
y a z ım r e a ı e
PLC. Nejprve je v ˇ´sti 9.1 uveden n´vod na zprovoznˇn´ programu, ˇ´st 9.2 popisuje
ca a e ı ca
utilitu plc2cpp a jej´ parametry na pˇ´
ı rıkazov´m ˇ´dku, ˇ´st 9.3 popisuje moˇnost vytv´ˇen´
e ra ca z ar ı
knihoven funkc´ a funkˇn´ blok˚ pro znovuvyuˇit´ jiˇ hotov´ho k´du a ˇ´st 9.4 ob-
ı c ıch u z ı z e o ca
sahuje jednoduch´ n´vod, jak vytvoˇit softwarov´ PLC.
y a r e
9.1 Instalace softwarov´ho PLC
e
V t´to ˇ´sti je uveden struˇn´ n´vod ke zprovoznˇn´ softwarov´ho PLC. Nejprve je vˇak
e ca c y a e ı e s
tˇeba m´ k dispozici funkˇn´ instalaci RT-Linuxu. Kr´tk´ n´vod k jeho zprovoznˇn´ je
r ıt c ı a y a e ı
rıloze A.
uveden v pˇ´
V pˇ´ e, ˇe je RT-Linux uspˇˇnˇ nainstalov´n, postup je n´sleduj´ ı:
rıpadˇ z ´ es e a a ıc´
r e o ıskat je lze bud’ z pˇiloˇen´ho CD, nebo z
1. Pˇipravte si zdrojov´ k´dy projektu. Z´ r z e
domovsk´ str´nky projektu [2].
e a
2. Rozbal´ zdrojov´ k´d do pracovn´ adres´ˇe1 :
ıme y o ıho ar
]# tar xzf SoftwarePLC-x.yy.tgz
3. Zmˇn´ aktu´ln´ adres´ˇ na adres´ˇ se zdrojov´m k´dem:
e ıme a ı ar ar y o
]# cd SoftwarePLC-x.yy
4. Spust´ konfiguraˇn´ skript2 :
ıme c ı
]# ./configure
1
Znaky x.yy znamenaj´ verzi programu.
ı
2
V pˇ´ e, ˇe chcete zmˇnit nˇkter´ v´choz´ nastaven´ programu, lze pˇidat parametr –help pro
rıpadˇ z e e e y ı ı r
n´povˇdu o dostupn´ch parametrech.
a e y
61
69.
POUZIT´ SOFTWAROVEHO PLC
ˇ I ´ Parametry pˇıkazov´ho ˇ´dku
r´ e ra
5. Nyn´ jiˇ m˚ˇeme spustit kompilaci programu a podp˚rn´ch modul˚ j´dra:
ı z uz u y u a
]# make dep
]# make
6. Pokud se kompilace zdaˇila, je m˚ˇeme pˇistoupit k instalaci programu:
r uz r
]# make install
Instalace spoˇ´ a v nakop´ an´ modul˚ j´dra se spr´vcem ovladaˇ˚ zaˇ´ ı
cıv´ ırov´ ı u a a cu rızen´
a jednotliv´ch ovladaˇ˚ do syst´mov´ho adres´ˇe s moduly j´dra, instalaci po-
y cu e e ar a
mocn´ho skriptu mkplc.sh pro vytv´ˇen´ softwarov´ho PLC, instalaci preproce-
e ar ı e
soru plc2cpp a instalaci pomocn´ch knihoven potˇebn´ch pro kompilaci PLC
y r y
programu do modulu j´dra pomoc´ C++.
a ı
V tuto chv´ m´me tedy k dispozici vˇe potˇebn´ pro vytv´ˇen´ uˇivatelsk´ch pro-
ıli a s r e ar ı z y
gram˚ pro PLC.
u
9.2 Parametry pˇ´
rıkazov´ho ˇ´dku
e ra
Pˇehled a popis parametr˚ pˇ´
r u rıkazov´ho ˇ´dku utility plc2cpp je uveden v tab.9.1.
e ra
Parametr Popis
-t directory Adres´ˇ, do kter´ho se maj´ ukl´dat vygenerovan´ zdrojov´
ar e ı a e e
soubory v C++.
-s source N´zev vstupn´ souboru v jazyce Instruction List.
a ıho
-p project N´zev projektu. Pouˇ´ a se pro n´zev vygenerovan´ho mod-
a zıv´ a e
ulu j´dra, pro odvozen´ n´zvu hlaviˇkov´ho souboru s ex-
a ı a c e
portem glob´ln´ promˇn´ch atp.
a ıch e y
-r time ˇ v [ns] urˇuj´ ı jak ˇasto bude detekov´na n´bˇˇn´ hrana
Cas c ıc´ c a a ez a
sign´lu pˇi spouˇtˇn´ uloh, kter´ nejsou spouˇtˇny periodicky.
a r s e ı´ e se
-n time ˇ
Cas v [ns] urˇuj´ ı periodu spouˇtˇn´ uloh, kter´ nemaj´
c ıc´ se ı ´ e ı
pˇiˇazen TASK.
rr
-L libdirs Dalˇ´ adres´ˇe oddˇlen´ ˇ´rkou pouˇ´ e pro hled´n´ kni-
sı ar e e ca zıvan´ a ı
hoven.
-h Zobraz´ n´povˇdu k programu.
ı a e
-l listfile Do souboru listfile uloˇ´ seznam vˇech vygenerovan´ch sou-
zı s y
bor˚ v C++ (vˇetnˇ hlaviˇkov´ch soubor˚).
u c e c y u
Tabulka 9.1: Pˇehled parametr˚ pˇ´
r u rıkazov´ho ˇ´dku utility plc2cpp.
e ra
62
70.
POUZIT´ SOFTWAROVEHO PLC
ˇ I ´ Vytv´ˇen´ knihoven
ar ı
9.3 Vytv´ˇen´ knihoven
ar ı
Vytv´ˇen´ knihoven je velmi jednoduch´. Staˇ´ vytvoˇit zdrojov´ soubor s jedn´ nebo
ar ı e cı r y ım
v´ bloky pro z´pis programu (funkce, funkˇn´ blok, blok typu program).
ıce a c ı
Knihovny se hledaj´ v n´sleduj´ ıch adres´ˇ´
ı a ıc´ arıch:
• Pokud je pˇi pˇekladu plc2cpp definov´na hodnota makra PLC LIBDIRS, je
r r a
jeho hodnota pˇedpokl´d´na jako : oddˇlen´ seznam dalˇ´ adres´ˇ˚, kde jsou
r a a e y sıch aru
hled´ny objekty z knihoven.
a
• Pokud je deklarov´na promˇnn´ prostˇed´ PLC LIBDIR, je jej´ hodnota pˇedpokl´d´na
a e a r ı ı r a a
jako : oddˇlen´ seznam dalˇ´ adres´ˇ˚, kde jsou hled´ny dalˇ´ objekty z kni-
e y sıch aru a sı
hoven.
• Dalˇ´ moˇnost´ je parametr -L pˇ´
sı z ı rıkazov´ho ˇ´dku(viz.tab.9.1), kter´ m˚ˇe obsa-
e ra y uz
hovat ˇ´rkou oddˇlen´ seznam adres´ˇ˚, kde se tak´ mohou nach´zet knihovn´
ca e y aru e a ı
objekty.
V pˇ´ e, ˇe knihovna pouˇ´ a jinou knihovnu, lze ve zdrojov´m k´du definovat
rıpadˇ z zıv´ e o
z´vislost zp˚sobem uveden´m v uk´zce 9.1.
a u y a
(* Include: min.plc,max.plc *)
(* Include: pid.plc *)
PROGRAM prg_control
...
Uk´zka 9.1: Definice vyuˇit´ jin´ knihovny ve zdrojov´m k´du PLC.
a z ı e e o
Tato vlastnost nen´ v [5] definov´na. Jedn´ se o rozˇ´ren´ vytvoˇen´ho softwarov´ho
ı a a sıˇ ı r e e
PLC, kter´ je vytvoˇena za uˇelem komfortnˇjˇ´ vytv´ˇen´ knihoven i program˚ v
a r ´c e sıho ar ı u
jazyce Instruction List.
V pˇ´ e, ˇe je nalezena direktiva Include: v koment´ˇi, kter´ zaˇ´ a na nov´m
rıpadˇ z ar y cın´ e
ˇ´dku, jsou uveden´ soubory zpracov´ny stejnˇ, jako by byly souˇ´st´ p˚vodn´ zdro-
ra e a e ca ı u ıho
jov´ho k´du. Za direktivou m˚ˇe n´sledovat jeden ˇi v´ zdrojov´ch soubor˚, jejichˇ
e o uz a c ıce y u z
jednotliv´ n´zvy jsou oddˇleny ˇ´rkou.
e a e ca
9.4 Vytvoˇen´ softwarov´ho PLC
r ı e
V t´to ˇ´sti je uveden jednoduch´ n´vod k vytvoˇen´ softwarov´ho PLC za pomoci v´ˇe
e ca y a r ı e ys
vytvoˇen´ho programu. Podm´
r e ınkou pro spr´vnou funkci je samozˇejmˇ zprovoznˇn´
a r e e e
softwarov´ PLC a funkˇn´ RT-Linux.
e c ı
63
71.
POUZIT´ SOFTWAROVEHO PLC
ˇ I ´ Vytvoˇen´ softwarov´ho PLC
r ı e
Pˇedpokl´dejme, ˇe chceme vytvoˇit projekt, kter´ se bude jmenovat foo, bude se
r a z r y
nach´zet v domovsk´m adres´ˇi uˇivatele v podadres´ˇi s n´zvem foo plc a bude se
a e ar z ar a
skl´dat ze dvou zdrojov´ch souboru foo1.plc a foo2.plc uloˇen´ch pˇ´
a y z y rımo v adres´ˇi
ar
projektu.
Postup je tedy n´sleduj´ ı:
a ıc´
1. Zaloˇ´ nov´ projekt
zıme y
tmp]# mkplc.sh --create foo --target-dir ~/foo_plc
2. Nyn´ pˇid´me zdrojov´ soubory do Makefile. Najdeme v adres´ˇi /foo plc soubor
ı r a e ar
Makefile. Otevˇeme ho v obl´ em textov´m editoru a najdeme ˇ´dek:
r ıben´ e ra
# FILES=deps/filename.plc
Tento ˇ´dek zmˇn´ na:
ra e ıme
FILES=deps/foo1.plc deps/foo2.plc
3. Nyn´ vytvoˇ´ soubory obsahuj´ ı zdrojov´ k´dy pro PLC v jazyce instruction
ı rıme ıc´ e o
list foo1.plc a foo2.plc
4. Chceme-li prov´st kompilaci programu zad´me na pˇ´
e a rıkazov´m ˇ´dku v adres´ˇi
e ra ar
projektu:
foo_plc]# make
5. Pro spuˇtˇn´ vytvoˇen´ho softwarov´ho PLC staˇ´ zadat3 :
se ı r e e cı
foo_plc]# make start
6. Pro zastaven´ softwarov´ho PLC lze pouˇ´
ı e zıt:
foo]# make stop
Skript pro vytv´ˇen´ softwarov´ho PLC je koncipov´n tak, aby byl co nejjednoduˇˇ´
ar ı e a ssı.
Pˇedpokl´d´, ˇe zdrojov´ k´dy pro PLC se budou nach´zet pˇ´ v adres´ˇi projektu,
r a a z e o a rımo ar
vygenerovan´ soubory budou ukl´d´ny do podadres´ˇe sources v adres´ˇi projektu a vy-
e a a ar ar
generovan´ modul j´dra se bude jmenovat plc projekt.o. D´le je tˇeba, aby v nˇkter´m
y a a r e e
zdrojov´m souboru pro PLC byl definov´n blok typu CONFIGURATION s n´zvem
e a a
3
Pˇedpokl´d´ se, ˇe je spuˇtˇn RT-Linux a zaveden modul plc devicemanager.o, pˇ´
r a a z se rıpadnˇ ovladaˇe
e c
zaˇ´ ı, kter´ bude program vyuˇ´
rızen´ e zıvat.
64
72.
POUZIT´ SOFTWAROVEHO PLC
ˇ I ´ Vytvoˇen´ softwarov´ho PLC
r ı e
shodn´m s n´zvem projektu (v naˇem pˇ´ e by to tedy byl blok CONFIGURATION
y a s rıpadˇ
foo.
V seznamu soubor˚, ze kter´ch se projekt skl´d´ je tˇeba uv´dˇt n´zev souboru
u y a a r a e a
vˇetnˇ podadres´ˇe deps. D˚vodem je, ˇe v tomto podadres´ˇi je uloˇen pomocn´
c e ar u z ar z y
4
soubor, kter´ obsahuje seznam dˇ´ vygenerovan´ch soubor˚ a z´roveˇ je vyuˇ´ an
y rıve y u a n zıv´
programem make, pro udrˇov´n´ z´vislost´ v projektu.
z a ı a ı
Uk´zka 9.2 uv´d´ z´kladn´ kostru zdrojov´ho k´du PLC. V k´du je definov´n jeden
a a ı a ı e o o a
blok typu program vyuˇ´ ıc´ glob´ln´ promˇnnou out, konfiguraˇn´ blok (s n´zvem
zıvaj´ ı a ı e c ı a
stejn´m jako n´zev projektu - tedy foo) a spouˇtˇn´ programov´ho bloku prg rotace s
y a se ı e
periodou 0.5s. Z´roveˇ je v r´mci koment´ˇe na prvn´ ˇ´dku uvedeno pouˇit´ knihovny
a n a ar ım ra z ı
pid.plc.
(* Include: pid.plc *)
PROGRAM prg_rotace
VAR_EXTERNAL
out: BYTE;
END_VAR
LD out
...
END_PROGRAM
CONFIGURATION foo
VAR_GLOBAL
out AT %QB0: BYTE := 1;
END_VAR
RESOURCE xx ON yy
TASK rotaceTask(INTERVAL:=T#0.5s);
PROGRAM p1 WITH rotaceTask: prg_rotace();
END_RESOURCE
END_CONFIGURATION
Uk´zka 9.2: Uk´zka kostry PLC programu.
a a
V pˇ´ e sloˇitˇjˇ´ projektu lze samozˇejmˇ vygenerovan´ Makefile upravit ruˇnˇ,
rıpadˇ z e sıho r e y c e
nebo vytvoˇit zcela nov´ soubor odpov´ ıc´ poˇadavk˚m.
r y ıdaj´ ı z u
4
Tento seznam je pouˇ´ an pro smaz´n´ dˇ´ vygenerovan´ch soubor˚ v pˇ´ e rekompilace.
zıv´ a ı rıve y u rıpadˇ
65
73.
Z´vˇr
a e
´
Ukolemdiplomov´ pr´ce bylo vytvoˇit pro operaˇn´ syst´m RT-Linux softwarov´ vy-
e a r c ı e e
baven´ umoˇnuj´ ı spouˇtˇt program zapsan´ v nˇkter´m jazyce pro PLC, kter´ je
ı zˇ ıc´ se y e e y
definovan´m v normˇ IEC-1131-3.
e e
C´ pr´ce se podaˇilo splnit. Bylo vytvoˇeno softwarov´ PLC s takov´mi z´kladn´
ıl a r r e y a ımi
vlastnostmi, jak je definov´no v normˇ IEC-1131-3. Pro implementaci byl zvolen jazyk
a e
Instruction List. Funkcionalita vytvoˇen´ho PLC odpov´ a poˇadavk˚m normy. V´bˇr
r e ıd´ z u y e
vlastnost´ byl proveden tak, aby bylo moˇno vyuˇ´ vˇechny instrukce, bloky pro z´pis
ı z zıt s a
programu, promˇnn´ reprezentovan´ z´stupn´m jm´nem i pˇ´
e e e a y e rımou adresou. D´le je
a
moˇno vyuˇ´ vˇechny zp˚soby spouˇtˇn´ vl´ken PLC. Umyslnˇ nebyla implementov´na
z zıt s u se ı a ´ e a
moˇnost vyuˇ´
z zıvat z´vorkov´n´ aritmetick´ch operac´ D´le se nepodaˇ´ implemento-
a a ı y ı. a rılo
vat pˇed´v´n´ funkˇn´ blok˚ v parametrech funkc´ funkˇn´ blok˚ a blok˚ typu
r a a ı c ıch u ı, c ıch u u
program. V pˇ´ rıloze B je uveden pˇehled vlastnost´ definovan´ch v [5], kter´ vytvoˇen´
r ı y e r y
syst´m podporuje, pˇ´
e rıpadnˇ nepodporuje.
e
Vzhledem k potˇebˇ vytv´ˇet knihovny, je moˇn´ pomoc´ direktivy Include:, um´ en´
r e ar z e ı ıstˇ e
uvnitˇ koment´ˇe definovat z´vislost zdrojov´ho k´du na pˇ´ sn´ knihovnˇ. A to jak
r ar a e o rısluˇ e e
v r´mci koncov´ho programu uˇivatele, tak v r´mci kter´koliv knihovn´ funkce. Bliˇˇ´
a e z a e ı zsı
informace o t´to vlastnosti lze nal´zt v ˇ´sti 9.3.
e e ca
Softwarov´ PLC bylo vytvoˇeno jako utilita (preprocesor) jazyka Instruction List
e r
do jazyka C++. Pro kompilaci do strojov´ho k´du je vyuˇit standardn´ linuxov´ kom-
e o z ı y
pil´tor. Pro kompilaci vygenerovan´ho C++ k´du je tˇeba pomocn´ knihovna, kter´
a e o r a a
je souˇ´st´ softwarov´ho PLC.
ca ı e
Vzhledem k volbˇ pˇev´dˇt PLC program na program v jazyce C++, byla z´roveˇ
e r a e a n
ovˇˇena moˇnost vyuˇ´ k tvorbˇ RT-Linuxov´ch aplikac´ C++. Je vˇak tˇeba se v
er z zıt e y ı s r
programu drˇet omezen´ uveden´ch v ˇ´sti 2.2.
z ı y ca
V r´mci PLC programu je moˇn´ tak´ vyuˇ´
a z e e zıvat FPU pro matematick´ operace s e
pohyblivou ˇ´dovou ˇ´rkou. Toho je doc´
ra ca ıleno t´ ˇe kaˇd´ vygenerovan´ vl´kno m´ ve
ım, z z e e a a
sv´ch parametrech pˇi zakl´d´n´ uvedeno, ˇe vyuˇ´ a FPU.
y r a a ı z zıv´
Souˇast´ vytvoˇen´ho PLC je tak´ n´vrh pro modul´rn´ tvorbu ovladaˇ˚, kter´
c´ ı r e e a a ı cu e
umoˇnuj´ z PLC programu pˇistupovat na extern´ zaˇ´ ı. Modularita ovladaˇ˚ umoˇnuje
zˇ ı r ı rızen´ cu zˇ
libovolnˇ pouˇ´ e PLC konfigurovat dle dostupn´ho hardware. V r´mci projektu byly
e zıvan´ e a
vytvoˇeny ovladaˇe pro paraleln´ port, ovladaˇ umoˇnuj´ ı komunikaci mezi uˇivatelskou
r c ı c zˇ ıc´ z
ˇ´st´ linuxu a softwarov´m PLC s vyuˇit´ pro visualizaci ˇ´ eho procesu. D´le byl
ca ı y z ım rızen´ a
vytvoˇen ovladaˇ pro PCI kartu s digit´ln´ vstupy/v´stupy.
r c a ımi y
Funkˇnost cel´ho syst´mu byla ovˇˇena na PLC programu pro ˇ´ ı ot´ˇek mo-
c e e er rızen´ ac
66
74.
POUZIT´ SOFTWAROVEHO PLC
ˇ I ´ Vytvoˇen´ softwarov´ho PLC
r ı e
ˇ ıd´ ı
torku. R´ ıc´ program komplexnˇ demonstruje vlastnosti a moˇnosti vytvoˇen´ho soft-
e z r e
warov´ho PLC. Vyuˇ´ a moˇnost spouˇtˇn´ ulohy na z´kladˇ n´bˇˇn´ hrany (mˇˇen´
e zıv´ z se ı ´ a e a ez e er ı
aktu´ln´ ot´ˇek motorku), periodick´ spouˇtˇn´ programu pro regulaci ot´ˇek pomoc´
a ıch ac e se ı ac ı
PID regul´toru. Z´roveˇ je vyuˇit ovladaˇ pro komunikaci s user-space RT-Linuxu.
a a n z c
Na vzorov´m ˇ´ ıc´ programu byly tak´ otestov´ny rychlostn´ moˇnosti softwarov´ho
e rıd´ ım e a ı z e
PLC. Na poˇ´ ci Intel Pentium 3 700MHz bylo vyykouˇeno cyklick´ spouˇtˇn´ vl´ken
cıtaˇ s e se ı a
PLC programu s periodou kratˇ´ neˇ 100[µs].
sı z
Vytvoˇen´ softwarov´ PLC je um´ eno na internetov´ adrese [2] jako projekt pod
r e e ıstˇ e
licenc´ GPLv2. Na t´to adrese je t´ˇ moˇn´ nal´zt pˇ´
ı e ez z e e rıpadnˇ dalˇ´ upravy a opravy
e sı ´
programu.
67
75.
Dodatek A
Instalace RT-Linuxu
Tatoˇ´st v kr´tkosti uv´d´ n´vod k instalaci RT-Linuxu. Pˇedpokl´daj´ se alespoˇ
ca a a ı a r a ı n
ˇ´steˇn´ znalosti potˇebn´ pro spr´vu Linuxu a instalaci uˇivatelsky kompilovan´ho
ca c e r e a z e
j´dra. Pro podrobnˇjˇ´ informace je tˇeba si prostudovat pˇ´ snou dokumentaci na
a e sı r rısluˇ
n´ze uveden´ch adres´ch.
ıˇ y a
K instalaci je tˇeba z adresy http://www.rtlinux.org st´hnout distribuci RT-Linuxu.
r a
Souˇ´st´ staˇen´ho bal´ je i tzv. patch1 pro vybran´ verze p˚vodn´ linuxov´ho
ca ı z e ıku e u ıho e
j´dra. Ten provede v p˚vodn´ zdrojov´m k´du linuxu zmˇny potˇebn´ k bˇhu RT-
a u ım e o e r e e
Linuxu.
Nyn´ je moˇn´ si z adresy ftp://ftp.linux.org st´hnout zdrojov´ k´d linuxov´ho
ı z e a y o e
j´dra. Je tˇeba vybrat takovou verzi, kter´ je podporov´na RT-Linuxem (tj. existuje
a r a a
patch na tuto verzi linuxov´ho j´dra).
e a
M´me-li k dispozici oba bal´ popsan´ v pˇedchoz´ odstavc´ m˚ˇeme pˇistoupit
a ıky e r ıch ıch, uz r
k vlastn´ instalaci:
ı
• Budeme pˇedpokl´dat, ˇe vˇechny operace budeme prov´dˇt na cestˇ /usr/src:
r a z s a e e
]# cd /usr/src
• Nyn´ rozbal´ staˇen´ linuxov´ j´dro (pokud se staˇen´ soubor jmenuje linux-
ı ıme z e e a z y
2.4.20.tar.gz):
]# tar xzf linux-2.4.20.tar.gz
• Rozbal´ staˇen´ zdrojov´ k´dy RT-Linuxu (pokud se staˇen´ soubor jmenuje
ıme z e e o z y
rtlinux-3.2-pre1.tar.gz):
]# tar xzf rtlinux-3.2-pre1.tar.gz
• Nyn´ vytvoˇ´
ı rıme symblick´ link na nov´ zdrojov´ soubory j´dra (t´ zajist´
y e e a ım ıme
pouˇit´ spr´vn´ch hlaviˇkov´ch soubor˚ bˇhem kompilace):
z ı a y c y u e
1
Tj. soubor jehoˇ aplikac´ na p˚vodn´ linuxov´ j´dro z´ ame j´dro s podporou real-time extenze.
z ı u ı e a ısk´ a
68
76.
INSTALACE RT-LINUXU
]# rm -f /usr/src/linux
]# ln -s /usr/src/linux-2.4.20 /usr/src/linux
• Nyn´ najdeme v adres´ˇi rtlinux-3.2-pre1/patches patch na pouˇitou verzi j´dra.
ı ar z a
• Nyn´ aplikujeme patch (za pˇedpokladu, ˇe jsme naˇli soubor kernel patch-2.4.20-
ı r z s
rtl3.2-pre1):
]# cd linux-2.4.20
]# patch -p1 < ../rtlinux-3.2-pre1/patches/kernel_patch-
2.4.20-rtl3.2-pre1
• Provedeme konfiguraci linuxov´ho j´dra (je tˇeba vybrat vˇechny potˇebn´ ovladaˇe
e a r s r e c
2
a podporu modul˚ )
u
]# make menuconfig
• Nyn´ jiˇ m˚ˇeme prov´st kompilaci j´dra a nainstalovat nov´ moduly:
ı z uz e a e
]# make bzImage modules modules_install
• Zb´v´ jeˇtˇ nakonfigurovat RT-Linuxovou extenzi a nainstalovat jej´ moduly:
y a se ı
]# cd ../rtlinux-3.2-pre1
]# make menuconfig
]# make dep
]# make all
]# make install
Nyn´ jiˇ m´me k dispozici zkompilovanou verzi linuxov´ho j´dra s podporou real-
ı z a e a
time extenze a moduly RT-Linuxu, kter´ po zaveden´ do j´dra linuxu aktivuj´ real-time
e ı a ı
rozˇ´ren´ (a tedy tak´ RT-Linux). Zaveden´ tˇchto modul˚ lze prov´st napˇ. pomoc´
sıˇ ı e ı e u e r ı
3
pˇ´
rıkazu :
/etc/rc.d/rtlinux start
Dalˇ´ informace lze nal´zt kromˇ internetu tak´ v souborech README, pˇ´
sı e e e rıpadnˇ
e
INSTALL, kter´ se nach´zej´ v adres´ˇ´ s Linuxem, pˇ´
e a ı arıch rıpadnˇ RT-Linuxem.
e
2
Podpora modul˚ je tˇeba pro kompilaci RT-Linuxov´ch modul˚.
u r y u
3
Cesta ke spouˇtˇc´
s e ımu skriptu se m˚ˇe liˇit v z´vislosti na parametrech zvolen´ch pˇi kompilaci
uz s a y r
RT-Linuxu a na pouˇit´ distribuci linuxu
z e
69
77.
Dodatek B
Kompatibilita snormou IEC-1131-3
N´ze uveden´ tabulka obsahuje pˇehled podporovan´ch vlastnost´ softwarov´ho PLC
ıˇ a r y ı e
vzhledem k poˇadovan´m vlastnostem, kter´ jsou uv´dˇny v [5]. V tabulce je vˇdy
z y e a e z
uv´dˇno ˇ´ tabulky z [5], ˇ´ vlastnosti, kr´tk´ charakteristika (obvykle pro celou
a e cıslo cıslo a a
skupinu vlastnost´ informace o tom, zda je vlastnost podporov´na a pˇ´
ı), a rıpadnˇ pozn´mku
e a
k implementaci.
Nˇkter´ vlastnosti, kter´ nesouvis´ pˇ´ s programovac´ jazykem Instruction List,
e e e ı rımo ım
nejsou n´ze uvedeny.
ıˇ
Tab.-ˇ.
c Popis Podporov´no
a Pozn´mka
a
1-1 Znakov´ sady
e Podporov´ny ASCII
a
znaky, diakritika
podporov´na v r´mci
a a
koment´ˇ˚.
aru
1-2 Mal´ p´
a ısmena Ano Podporov´na v r´mci
a a
n´zv˚ promˇnn´ch,
a u e y
funkc´ a funkˇn´
ı c ıch
blok˚.
u V tˇchto
e
pˇ´
rıpadech je rozd´ ıl
v mal´ch a velk´ch
y y
p´
ısmenech ignorov´n.
a
1-3a Ano
1-3b Ne
1-4a Ne
1-4b Ne
1-5a Ne Programov´n´a ı po-
moc´ı ˇebˇ´ckov´ch
z rıˇ y
diagram˚ nen´ k
u ı
dispozici.
1-5b
1-6a Z´vorkov´ operace
a e Ne Viz. pozn´mka v kapi-
a
tole 5.
70
78.
KOMPATIBILITA S NORMOUIEC-1131-3
Tab.-ˇ.
c Popis Podporov´no
a Pozn´mka
a
1-6b Z´vorkov´ operace
a e Ne
2-1 Ano
2-2 Ano
2-3 Ano
3-1 Koment´ˇe
ar Ano Na samostatn´m e
ˇ´dku i na ˇ´dku s
ra ra
k´dem
o programu.
Z´roveˇ vyuˇito k
a n z
definici z´vislosti
a
na knihovn´ch (viz.
a
kapitola 9).
4-1 Ano
4-2 Ano
4-3 Ano
4-4 Ano
4-5 Ano
4-6 Ano
4-7 Ano
4-8 Ano
5-1 ˇ e
Retˇzcov´ konstanty
e Ne
6-1 Kombinace znak˚ v
u Ne
ˇetˇzc´
r e ıch
6-2 Ne
6-3 Ne
6-4 Ne
6-5 Ne
6-6 Ne
6-7 Ne
6-8 Ne
7-1a ˇ
Casov´ konstanty
e Ano
7-1b Ano
7-2a Ano
7-2b Ano
8-1 Konstanty pro datum Ne Pˇ´ sn´ datov´ typy
rısluˇ e e
a denn´ ˇas
ıc nejsou podporov´ny.
a
8-2 Ne
8-3 Ne
8-4 Ne
8-5 Ne
8-6 Ne
71
79.
KOMPATIBILITA S NORMOUIEC-1131-3
Tab.-ˇ.
c Popis Podporov´no
a Pozn´mka
a
10-1 Element´rn´
a ı datov´
e Ano
typy
10-2 Ano
10-3 Ano
10-4 Ano
10-5 Ano
10-6 Ano
10-7 Ano
10-8 Ano
10-9 Ano
10-10 Ano
10-11 Ne
10-12 Ano
10-13 Ne
10-14 Ne
10-15 Ne
10-16 Ne
10-17 Ano
10-18 Ano
10-19 Ano
10-20 Ano
12-1 Odvozen´ uˇivatelsk´
e z e Ne
datov´ typy
e
12-2 Ne
12-3 Ne
12-4 Ne
12-5 Ne
14-1 Inicializace Ne
uˇivatelsk´ch
z y da-
tov´ch typ˚
y u
14-2 Ne
14-3 Ne
14-4 Ne
14-5 Ne
14-6 Ne
15-1 Pˇ´ a adresace
rım´ Ano
15-2 Ano
15-3 Ano
15-4 Ano
15-5 Ano
15-6 Ano
72
80.
KOMPATIBILITA S NORMOUIEC-1131-3
Tab.-ˇ.
c Popis Podporov´no
a Pozn´mka
a
15-7 Ano
15-8 Ano
15-9 Ano
16-1 Bloky promˇnn´ch
e y Ano
16-2 Ano
16-3 Ano
16-4 Ano
16-5 Ano
16-6 Ano
16-7 Ne
16-8 Ano Kl´cov´ slovo je ig-
ıˇ e
norov´no,
a p˚vodn´
u ı
v´znam je ztracen.
y
16-9 Ano
16-10 Ano
17-1 Deklarace Ano
promˇnn´ch
e y
17-2 Ano Studen´ y restart
nen´ moˇn´ bˇˇn´mi
ı z e ez y
prostˇedky v RT-
r
Linuxu zpraco-
vat. Kl´cov´ slovo
ıˇ e
RETAIN je ig-
norov´no, promˇnn´
a e e
si po restartu neza-
chov´vaj´ svoji hod-
a ı
notu.
17-3 Ano
17-4 Ne Pole nejsou pod-
porov´na.
a
17-5 Ano
17-6 Ne
17-7 Ne
17-8 Ne
18-1 Inicializace Ano
promˇnn´ch
e y
18-2 Ano Viz. pozn´mka o RE-
a
TAIN promˇnn´ch.
e y
18-3 Ano
18-4 Ne
73
81.
KOMPATIBILITA S NORMOUIEC-1131-3
Tab.-ˇ.
c Popis Podporov´no
a Pozn´mka
a
18-5 Ano S vyj´
ımkou
ˇetˇzcov´ch
r e y
promˇnn´ch.
e y
18-6 Ne
18-7 Ano
18-8 Ne
18-9 Ano
33-1 Moˇnosti
z deklarace Ano Kl´cov´
ıˇ e slovo RE-
funkˇn´ blok˚
c ıch u TAIN je ignorov´no.
a
33-2 Ano Kl´cov´
ıˇ e slovo RE-
TAIN je ignorov´no.
a
33-3 Ano Kl´cov´
ıˇ e slovo RE-
TAIN je ignorov´no.
a
33-4a Ano
33-4b Ne Grafick´ programovac´
e ı
jazyky nejsou pod-
porov´ny.
a
33-5a Ne
33-5b Ne
33-6a Ne
33-6b Ne
33-7a Ne
33-7b Ne
33-8a Ne
33-8b Ne
33-9a Ne
33-9b Ne
49-1 Moˇnosti
z deklarace Ano
blok˚ CONFIGURA-
u
TION a RESOURCE
49-2 Ano
49-3 Ano
49-4 Ano
49-5a Ano
49-5b Ano Spouˇtˇn´
se ı je
ve skuteˇnosti
c
nahrazeno period-
ick´m
y spouˇtˇn´
s e ım.
Bliˇˇ´ informace lze
z sı
nal´zt v kapitole 7.
e
49-6a Ano
49-6b Ne
74
82.
KOMPATIBILITA S NORMOUIEC-1131-3
Tab.-ˇ.
c Popis Podporov´no
a Pozn´mka
a
49-6c Ano
49-7 Ne Deklaraci lze nahra-
dit pomocnou
promˇnnou.
e
49-8a Ano
49-8b Ano
49-9a Ano
49-9b Ano
49-10a Ne
49-10b Ne
49-10c Ne
49-10d Ne
49-10e Ne
49-10f Ne
50-1a Parametry deklarace Ano
blok˚ TASK
u
50-1b Ano
50-2a Ne Grafick´ jazyky nejsou
e
podporov´ny.
a
50-2b Ne
50-3a Ano
50-3b Ne
50-4a Ne
50-4b Ne
50-5a Ne
50-5b Ano
51-1 Ano
52-1 Instrukce jazyka IL Ano
52-2 Ano
52-3 Ano
52-4 Ano
52-5 Ano
52-6 Ano
52-7 Ano
52-8 Ano
52-9 Ano
52-10 Ano
52-11 Ano
52-12 Ano
52-13 Ano
52-14 Ano
75
83.
KOMPATIBILITA S NORMOUIEC-1131-3
Tab.-ˇ.
c Popis Podporov´no
a Pozn´mka
a
52-15 Ano
52-16 Ano
52-17 Ano
52-18 Ano
52-19 Ano
52-20 Ano
52-21 Ne ˇ e ı
Retˇzen´ operac´ po-
ı
moc´ z´vorek nen´
ı a ı
podporov´no.
a
53-1 Vol´n´
a ı funkˇn´
c ıch Ano
blok˚
u
53-2 Ano
53-3 Ne
54-4 Ne Funkˇn´ bloky jako
c ı
parametry nejsou
podporov´ny.
a
54-5 Ne
54-6 Ne
54-7 Ne
54-8 Ne
54-9 Ne
54-10 Ne
54-11 Ne
54-12 Ne
54-13 Ne
76
84.
Dodatek C
ˇ ızen´motorku pomoc´
R´ ı ı
softwarov´ho PLC
e
V t´to ˇasti je kr´tce pops´na vzorov´ aplikace, kter´ ukazuje, jak lze softwarov´ PLC
e c´ a a a a e
vyuˇ´ Jedn´ se o ˇ´ ı motorku, kter´ je pˇipojen k PC pomoc´ paraleln´ portu.
zıt. a rızen´ y r ı ıho
Aplikace se skl´d´ ze dvou nez´visl´ch ˇ´st´
a a a y ca ı:
1. Vlastn´ ˇ´ ıc´ program napsan´ v jazyce Instruction List pro PLC. Ten pomoc´
ı rıd´ ı y ı
PID regul´toru ˇ´ ı motorek, kter´ je pˇipojen k poˇ´ ci pomoc´ paraleln´
a rıd´ y r cıtaˇ ı ıho
portu.
2. Jednoduch´ uk´zkov´ vizualizace pro X-Windows naprogramovan´ v jazyce C++,
a a a a
zobrazuj´ ı aktu´ln´ ot´ˇky motorku a umoˇnuj´ ı nastavit poˇadovan´ ot´ˇky
ıc´ a ı ac zˇ ıc´ z e ac
motorku.
C.1 ˇ ıd´ ı
R´ ıc´ program motorku
ˇ ıd´ ı
R´ ıc´ program motorku je koncipov´n jako program pro PLC v jazyce Instruction List
a
a jako takov´ je zpracov´n vytvoˇenou utilitou plc2cpp. N´slednˇ je zkompilov´n do
y a r a e a
modulu RT-Linuxov´ho kernelu. Rychlost ot´ˇen´ je ˇ´
e ac ı rızena gener´torem PWM.
a
Sn´ an´ smˇru a rychlosti ot´ˇen´ i vlastn´ ˇ´ ı prob´ a pomoc´ paraleln´ portu
ım´ ı e ac ı ı rızen´ ıh´ ı ıho
(je tedy vyuˇ´ an vytvoˇen´ ovladaˇ paraleln´ portu).
zıv´ r y c ıho
Velikost ot´ˇek (ˇ´dan´ veliˇina) se nastavuje z user-space s vyuˇit´ pˇ´ sn´ho
ac za a c z ım rısluˇ e
ovladaˇe. Lze ji tedy dynamicky mˇnit za bˇhu programu. Stejnˇ tak jsou pˇed´v´ny
c e e e r a a
aktu´ln´ mˇˇen´ ot´ˇky do user-space RT-Linuxu.
a ı er e ac
Program se skl´d´ ze tˇ´ periodicky spouˇtˇn´ch program˚ s n´leduj´ ım v´znamem:
a a rı se y u a ıc´ y
1. Sn´ an´ poˇtu impulz˚ vygenerovan´ch inkrement´ln´ ˇidlem um´ en´m na
ım´ ı c u y a ım c ıstˇ y
hˇ´
rıdelce motorku. Z generovan´ch impuls˚ je z´roveˇ urˇov´n smˇr ot´ˇen´
y u a n c a e ac ı.
2. Pravideln´ pˇevod poˇtu vygenerovan´ch impuls˚ na ot´ˇky za sekundu. Hodnota
y r c y u ac
ot´ˇek je kladn´ pro jeden smˇr a z´porn´ pro smˇr druh´.
ac a e a a e y
77
85.
R´
ˇ IZEN´ MOTORKUPOMOC´ SOFTWAROVEHO PLC
I I ´ Vizualizaˇn´ program
c ı
3. Vlastn´ v´poˇet ˇ´ ıc´ veliˇin. Skl´d´ se z vyhodnocen´ regulaˇn´ odchylky,
ı y c rıd´ ıch c a a ı c ı
v´poˇtu PID regul´toru a generov´n´ PWM.
y c a a ı
Cel´ ˇ´ ıc´ program lze nal´zt v podadres´ˇi plc/motorek v archivu se softwarov´m
y rıd´ ı e ar y
PLC.
C.2 Vizualizaˇn´ program
c ı
Vizualizaˇn´ program je vytvoˇen jako jednoduch´ aplikace pro X-Windows. Ke sv´
c ı r a e
ˇinnosti vyuˇ´ a objektovou aplikaˇn´ knihovnu wxWindows (viz. adresa [3]).
c zıv´ c ı
Program demonstruje moˇnosti vyuˇit´ PLC, pˇiˇemˇ m´ tyto vlastnosti:
z z ı rc z a
• Umoˇnuje nastavit poˇadovan´ ot´ˇky motorku (tj. s vyuˇit´ ovladaˇe pro ko-
zˇ z e ac z ım c
e’ e
munikaci PLC s user-space RT-Linuxu zap´se tuto hodnotu do pamˇt ov´ho pros-
ıˇ
1
toru softwarov´ho PLC ).
e
• Graficky zobrazuje aktu´ln´ ot´ˇky motorku tak jak je mˇˇ´ softwarov´ PLC (tj.
a ı ac erı e
c e’ e
tyto ot´ˇky jsou ˇteny z pamˇt ov´ho prostoru softwarov´ho PLC). D´le zobrazuje
ac e a
aktu´ln´ poˇadovanou hodnotu ot´ˇek, tak jak ji nastavil uˇivatel. Vzhled aplikace
a ı z ac z
je patrn´ z obr.C.1.
y
Vizualizaˇn´ program je dostupn´ v podadres´ˇi visualisation softwarov´ho PLC.
c ı y ar e
1
a e’ y
Z pohledu RT-Linuxu se jedn´ o pamˇt ov´ prostor linuxov´ho kernelu.
e
78
86.
R´
ˇ IZEN´ MOTORKUPOMOC´ SOFTWAROVEHO PLC
I I ´ Vizualizaˇn´ program
c ı
Obr´zek C.1: Uk´zka jednoduch´ho vizualizaˇn´ rozhran´
a a e c ıho ı.
79
87.
Dodatek D
Obsah pˇiloˇen´hoCD
r z e
Souˇ´st´ diplomov´ pr´ce je CD, jehoˇ obsah a struktura jsou patrny z tab.D.1.
ca ı e a z
Adres´ˇ
ar Obsah adres´ˇe ar
dokument Text diplomov´ pr´ce ve form´tu PDF a Postscript.
e a a
linux Zdrojov´ k´dy linuxov´ho j´dra s aplikovan´m patchem
e o e a y
RT-Linuxu verze 3.2-pre1. Jedn´ se o verzi, na kter´ bylo
a e
PLC vyv´ ıjeno a testov´no.
a
rtlinux Staˇen´ bal´ pro RT-Linux a RT-Linux Contrib.
z e ıky
plc Obsahuje vytvoˇen´ softwarov´ PLC.
r e e
Tabulka D.1: Obsah a struktura pˇiloˇen´ho CD.
r z e
80
88.
Literatura
[1] Domovsk´ str´nkyprojektu RT-Linux [online].
e a
<http://www.rtlinux.org>.
[2] Domovsk´ str´nky projektu Softwarov´ PLC pro RT-Linux [online].
e a e
<http://sourceforge.net/projects/softwareplc>.
[3] Domovsk´ str´nky projektu wxWindows [online].
e a
<http://www.wxwindows.org>.
[4] Charles Donnelly and Stallman Richard. Bison. Free Software Foundation, 1995.
[5] In IEC-1131-3 - Programmable controlers - Part3, Bˇezen 1993.
r
[6] A.M. Kuchling. Regular Expression HOWTO [online].
<http://www.amk.ca/python/howto/regex>.
ˇ s
[7] Melichar, Ceˇka, Jeˇek, and Richta. Konstrukce pˇekladaˇ˚ 1,2. Vydavatelstv´
z r cu ı
ˇ
CVUT, 1999.
[8] Thomas Niemann. A Compact Guide To Lex&Yacc. ePaper Press.
[9] Victor Yodaiken, Duben 1999. The RTLinux Manifesto [online].
<http://www.fsmlabs.com/developers/white_papers/rtmanifesto.pdf>.
81