Beruflich Dokumente
Kultur Dokumente
Fakulta elektrotechnick a
Softwarov PLC e
Diplomov prce a a
Praha, 2003
Prohlen as
Prohlauji, e jsem diplomovou prci vetn doprovodnho programovho vybaven s z a c e e e vypracoval samostatn s pouit uveden literatury a konzultac s vedouc diploe z m e m mov prce Ing. Frantikem Vackem. e a s Nemm zvan dvod proti uit tohoto koln d ve smyslu 60 Zkona a a z y u z s ho la a .121/2000 Sb. , o prvu autorskm, o prvech souvisej ch s prvem autorskm a o c a e a c a y zmn nkterch zkon (autorsk zkon). e e e y a u y a V Praze dne: 13.ledna 2004 Vladim Kloz r
Podkovn e a
Dkuji panu Ing. Frantiku Vackovi za cenn rady a pipom e s e r nky, kter mi poskytl e bhem konzultac pi zpracovn diplomov prce. e r a e a Vladim Kloz r
Abstrakt
C lem tto diplomov prce je vytvoit softwarov PLC s vlastnostmi denovanmi v e e a r e y norm IEC-1131-3, kter bude fungovat pod operan systmem Real-Time Linux. e e c m e Cel systm je vytvoen jako preprocesor ze zvolenho programovac jazyka pro PLC y e r e ho (zvolen byl jazyk Instruction List) do jazyka C++. Vsledkem pekladu programu pro PLC je modul zavediteln do oblasti kernelu y r y operan systmu Real-Time Linux, kter prezentuje program pro PLC. c ho e y Souast prce je tak vytvoen zkladn podpory pro p c a e r a rstup z PLC programu na za digitln vstup/vstup (implementovny jsou nap. ovladae pro paraleln rzen 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 dened in the norm IEC-1131-3, which will run under Real-Time Linux operating system. The system is designed 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 inputs/outputs from PLC program (implemented are drivers for parallel port, PCI card PLX-1750 etc.).
Obsah
Uvod 1 Nvrh een a r s 1.1 Funkn st pro user-space . . . . . . . . . . . . . . . . . . . . . . . . c ca 1.2 Funkn st pro kernel-space . . . . . . . . . . . . . . . . . . . . . . . c ca 2 RT-Linux 2.1 Princip innosti RT-Linuxu . . . . . . . . c 2.1.1 Denice hard real-time systmu . . e 2.1.2 Popis RT-Linuxu . . . . . . . . . . 2.1.3 Princip innosti . . . . . . . . . . . c 2.1.4 Vyuit matematickho koprocesoru z e 2.2 RT-Linux a C++ . . . . . . . . . . . . . . 2.2.1 Dynamick alokace pamti . . . . . a e 2.2.2 Oeten chyb - exceptions . . . . . s r 2.2.3 Pouit C++ templates . . . . . . . z 1 3 6 6 7 7 7 7 8 9 9 9 10 10 11 12 12 15 15 17 20 20 21 21 23 23 24 24 25 25
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
3 Lexikln analza zdrojovho kdu a y e o 3.1 Lexikln analza zdrojovho kdu . . . . . . . a y e o 3.1.1 Struktura zdrojovho kdu pro LEX . . e o 3.2 Popis gramatiky jazyka . . . . . . . . . . . . . . 3.2.1 Struktura zdrojovho souboru pro YACC e 3.3 Princip spoluprce program LEX a YACC . . a u 4 Zpracovn promnnch PLC programu a e y 4.1 Princip zpracovn promnnch . . . . . a e y 4.2 Deklarace promnnch . . . . . . . . . . e y 4.2.1 P e adresy . . . . . . . . . . . rm 4.3 Pehled blok pro deklaraci promnnch r u e y 4.3.1 Globln promnn . . . . . . . . a e e 4.3.2 Extern promnn . . . . . . . . . e e 4.3.3 Lokln promnn . . . . . . . . . a e e 4.3.4 Vstupn promnn . . . . . . . . e e 4.3.5 Vstupn promnn . . . . . . . . y e e i
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
4.4
4.3.6 Vstupn/vstupn promnn e y e e Implementace promnnch . . . . . e y 4.4.1 Parser zdrojovho kdu . . . e o 4.4.2 Vygenerovan zdrojov kd y y o
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
26 26 27 27 30 31 32 32 34 34 36 38 38 42 43 46 46 47 48 51 51 51 52 53 54 54 55 59 61 61 62 63 63 66 68 70
5 Zpracovn jazyka IL a 5.1 Piazovac instrukce . . . . . . rr 5.2 Logick instrukce . . . . . . . . e 5.3 Aritmetick instrukce . . . . . . e 5.4 Porovnvac instrukce . . . . . . a 5.5 Instrukce toku programu rzen 5.5.1 Voln funkc . . . . . . a
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
6 Zpracovn programovch blok a y u 6.1 Funkn bloky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c 6.2 Programov bloky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 6.3 Funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Kongurace softwarovho PLC e 7.1 Struktura bloku RESOURCE . . . . . . . . . . . . . . . . . . . . . . . 7.1.1 Struktura blok TASK . . . . . . . . . . . . . . . . . . . . . . . u 7.1.2 Struktura blok PROGRAM . . . . . . . . . . . . . . . . . . . . u 8 Podpora pro RT-Linux 8.1 Knihovna . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 Emulace pamti PLC . . . . . . . . . . . . . . . . . e 8.1.2 Podpora promnnch PLC . . . . . . . . . . . . . . e y 8.1.3 Podpora parametr pro voln programovch blok u a y u 8.1.4 Emulace aktuln hodnoty zsobn a a ku . . . . . . . . 8.2 Ovladae karet digitln vstup/vstup . . . . . . . . . c a ch u y u 8.2.1 Tvorba ovladae I/O karty . . . . . . . . . . . . . . c 8.3 Podpora C++ v RT-Linuxovm kernelu . . . . . . . . . . e 9 Pouit softwarovho PLC z e 9.1 Instalace softwarovho PLC . e 9.2 Parametry p rkazovho dku e ra 9.3 Vytven knihoven . . . . . . ar 9.4 Vytvoen softwarovho PLC . r e Zvr a e A Instalace RT-Linuxu B Kompatibilita s normou IEC-1131-3
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
ii
zen motorku pomoc softwarovho PLC C R e d C.1 R c program motorku . . . . . . . . . . . . . . . . . . . . . . . . . . C.2 Vizualizan program . . . . . . . . . . . . . . . . . . . . . . . . . . . . c D Obsah piloenho CD r z e Literatura
77 77 78 80 81
iii
Uvod
C lem tto prce je vytvoit takzvan Softwarov PLC. Pod pojmem Softwarov PLC e a r e e e si v naem p e pedstavujeme softwarov emultor programov kdu urenho s rpad r y a e o c e pro PLC. Tento emultor by ml bt vytvoen pod operan systmem RT-Linux a e y r c m e na procesorov platform Intel, ml by podporovat vybran programovac jazyk pro e e e y PLC a komunikovat s PCI kartou digitln vstup/vstup. PLC by mlo splovat a ch u y u e n vlastnosti denovan normou IEC-1131[5]. e PLC je zkratka pro programovateln logick automat. Jedn se o za uren y y a rzen c e zejmna pro c a regulan techniku. V podstat je to mikroprocesorem osazen e rd c e y systm obvykle umonuj rozren o dal moduly (nap. moduly digitln vstup/ve z c s s r a ch u y stu-p, A/D a D/A pevodn u r ky, moduly pro prmyslov sbrnice atd.). Ve vtin u e e es e p u lze tyto systmy programovat pomoc tech zkladn programovac jazyk: rpad e r a ch ch u IL (instruction list - obdoba assembleru, ST (structured text - obdoba jazyka Pascal) a tzv. ebckovch diagram. Instrukn soubor je velmi jednoduch se zamen na z r y u c y er m a regulaci. Programovac jazyky pro PLC jsou detailn popsny v [5]. rzen e a Operan systm Linux je voln iiteln systm Unix dostupn vetn zdrojovch c e esr y e y c e y kd. Vlastn Linux je pouze jdro operan systmu. Operan systm je ren v o u a c ho e c e s distribuc 1 , kter krom jdra operan systmu obsahuj tak dal utility a proch e e a c ho e e s gramy. Na zklad klasickho jdra (kernelu) byl nsledn vytvoen tzv. RT-Linux. a e e a a e r Jedn se o rozren kernelu o vlastnosti hard real-time operan systmu, piem a s c ho e rc z jsou zachovny pedchoz vhody normln jdra a p a r y a ho a rpadn zvolen distribuce ve e e smyslu existence a pouitelnosti ovlada za a utilit. Vlastn real-time ukoly pot z cu rzen e b s vy prioritou ne linuxov jdro jako real-time vlkna v pamt ovm prostoru ez ss z e a a e e jdra. a r s a e V asti 1 je uveden rozbor een a volba nsledn implementace. Kapitola 2 se c v krtkosti zabv histori a vlastnostmi operan systmu RT-Linux a monostmi a y a c ho e z jazyka C++ pi vyuit v RT-Linuxu. Kapitola 3 se zabv zpsobem zpracovn zdror z y a u a jovho programu pro PLC pomoc konenho stavovho automatu. Kapitoly 4, 5, 6 a 7 e c e e se vnuj zpracovn jednotlivch st zdrojovho kdu. Kapitola 2.1 popisuje zpsob e a y ca e o u implementace a podpory v operan systmu RT-Linux, vetn vytven ovlada c m e c e ar cu za pro vyuit v softwarovm PLC. Kapitola 9 popisuje vlastn utilitu plc2cpp a rzen z e jej vyuit pi tvorb softwarovho PLC. P z r e e rloha B uvd celkov pehled vlastnost a y r vytvoenho softwarovho PLC v porovnn s normou IEC-1131-3. V p r e e a rloze A je uve1
OBSAH
OBSAH
den krtk nvod na zprovoznn RT-Linuxu. P a y a e rloha C se krtce zabv vytvoenm a y a r y ukzkovm PLC programem pro otek stejnosmrnho motorku. a y rzen ac e e
Tabulka 1.1: Pehled programovac jazyk pro PLC dle IEC-1131-3. r ch u Pro zpis programovho kdu PLC byl zvolen jazyk IL s podporou standardn a e o ch datovch typ, y u cselnch typ (pro cel i desetinn y u a a csla) a datovho typu pro uloen e z 1 asu . Z blok pro zpis vlastn PLC programu byly vybrny bloky uveden v tab.1.2. c u a ho a e Dle se budeme zabvat analzou monch een a nslednou volbou vlastn ima y y z y r s a plementace. Celkov lze problm eit bud jako interpret zdrojovho kdu pro PLC nebo jako e e r s e o peklada PLC kdu do jinho programovac jazyka, ze kterho bude nsledn zkomr c o e ho e a e pilovna binrn podoba programu, kter odpov a programu PLC. a a y d 1. Interpret PLC kdu - vhodou tohoto een je jednodu pouit z hlediska o y r s ss z uivatele. Odpad toti nutnost po kad zmn programu provdt jeho rekomz a z z e e e a e pilaci.
1
Tento datov typ je teba zejmna kvli denici spoutn PLC program v konguran bloku. y r e u se u c m
I NAVRH RESEN
FUNCTION BLOCK
PROGRAM
CONFIGURATION
Popis Blok typu funkce. Jedn se o blok umonuj a z c volat kd PLC programu s alespo jedn o n m vstupn parametrem a nvratovou hodnom a tou, kter se po nvratu z voln ulo jako a a a z aktuln pracovn hodnota na zsobn a a ku. Pi r kadm voln jsou optovn inicializovny z e a e e a vechny promnn. s e e Funkn blok. Jedn se o blok, kter me c a y uz m libovoln poet vstupn vstupn a t y c ch, y ch vstupn-vstupn parametr. Pi pouit e y ch u r z funkn bloku se nejprve deklaruje jeho inc ho stance jako lokln promnn. Vnitn stav a e a r instance funkn bloku zstv zachovn c ho u a a a po dobu existence promnn, kterou je tato e e instance reprezentovna. a 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 bhu programu. V programu nen teba e r deklarovat promnnou, kterou je reprezene tovna pou a instance. a zvan Konguran blok. Hlavn blok denuj c c globln promnn a obsahuj denici a e e c spoutn jednotlivch blok typu program. se y u Tento blok nelze vyu pro zpis prozt a gramovho kdu v dnm z programovac e o za e ch jazyk. u
Tabulka 1.2: Programov bloky zvolen pro implementaci. e e Hlavn nevhodou een je velk nronost na interpret z hlediska jeho stability y r s a a c a odolnosti vi chybm v PLC programu. Interpret by toti v tomto p e uc a z rpad musel fungovat v rmci kernel-space RT-Linuxu. a 2. Peklada PLC kdu - vhododou tohoto een je zejmna monost vytvoit r c o y r s e z r pouze preprocesor do jinho jazyka a pro vlastn generovn binrn podoby PLC e a a programu vyu tento programovac jazyk. zt Nevhodou tohoto een je nutnost po kad zmn PLC programu tento proy r s z e e e gram znovu kompilovat. Pro implementaci softwarovho PLC zvol e me variantu .2. Dvodem je monost c u z 4
I NAVRH RESEN
vyu ji existuj kompiltor jazyka C nebo C++, kter je standardn vyu an pro zt z c a y e zv programovn st Linuxovho a RT-Linuxovho jdra. a ca e e a r e z u a e Po analze [5] je zejm, e zpsob zpisu programu pro PLC lze nejlpe reprezeny tovat kdem v jazyce C++ (podobnost funkn blok s objekty, monost denovat o c ch u z velk mnostv funkc pomoc petzench opertor v podprn knihovn atp.). e z r y a u u e e Zvolen een odpov a funkn e r s d c mu diagramu na obr.1.1. C lem diplomov prce e a tedy bude vytvoit konvertor programu pro PLC do jazyka C++. Vygenerovan kd r y o bude nsledn peloen do modulu jdra b ho v RT-Linuxu. Pro zjednoduen kona e r z a ezc s verze bude jet teba vytvoit podprnou knihovnu pouitelnou v oblasti jdra, kter se r r u z a a bude vyuita pi pekladu C++ kdu. z r r o
Obrzek 1.1: Funkn diagram softwarovho PLC a c e Z obrzku je patrn, e softwarov PLC bude rozdleno na dv hlavn sti, piem a e z e e e ca rc z peklad programu bude spoutn v user-space RT-Linuxu a vlastn softwarov PLC r se e pob jako real-time vlkna RT-Linuxu v rmci kernel-space. Krtk rozbor jedez a a a y notlivch vlastnost je uveden v stech 1.1 a 1.2. y ca Bli informace o RT-Linuxu a nkterch pouitch term zs e y z y nech z pedchoz sti lze r ca nalzt v kapitole 2.1, p e rpadn v manulovch strnkch RT-Linuxu. e a y a a
I NAVRH RESEN
1.1
User-space, nebo-li kontext ve kterm b uivatelsk programy bude vyuit pro bh e ez z e z e preprocesoru (konvertoru) zdrojovho kdu. Tento konvertor by ml splovat nsleduj e o e n a c poadavky: z Umonit pedzpracovn kdu ve zvolenm jazyce pro PLC do jazyka C++ v z r a o e takovm tvaru, aby bylo mon tento kd zkompilovat do modulu b ho v e z e o ezc RT-Linuxu. Monost tvorby a nslednho vyuit knihoven funkc a funkn blok pro z a e z c ch u opakovan vyuit e z .
1.2
Kernel-space, neboli kontext jdra operan systmu RT-Linux bude vyuit pro a c ho e z vlastn bh vytvoenho softwarovho PLC. Vygenerovan kd v C++ bude zkom e r e e y o pilovn jako modul jdra RT-Linuxu. Pro kompilaci bude teba vytvoit podprnou a a r r u knihovnu, kter bude m nsleduj vlastnosti: a t a c s a a ku z Reen emulace aktuln hodnoty zsobn (tzv. current result), kde je uloena hodnota posledn proveden operace. e Emulace adresovn p a rstupu do pamti ve stylu PLC vetn p e c e rstupu na extern za dle adresy. rzen Monost deklarace promnnch ve stylu PLC, tj. vetn p z e y c e rpadn specikace e absolutn adresy, na kter se promnn nachz e e a a . Monost deklarovat parametry funkc funkn blok a programovch blok z , c ch u y u tak, aby bylo mon je piazovat dle syntaxe PLC. z e rr Monost modulrn vytvet ovladae za a tyto ovladae nsledn regz a e ar c rzen c a e istrovat na konkrtn adresy vstup/vstup softwarovho PLC. e u y u e
Kapitola 2 RT-Linux
a y c e Tato kapitola uvd v sti 2.1 zkladn informace tkaj se RT-Linuxov modikace a ca jdra a v sti 2.2 diskutuje monosti a omezen vyuit jazyka C++ v rmci RTa ca z z a Linuxu.
2.1
V tto sti bude v krtkosti popsn princip innosti RT-Linuxu. Informace zde uveden e ca a a c e jsou z any zejmna z [9], p sk e rpadn z [1]. e
2.1.1
Tzv. hard real-time systm je systm, ve kterm je zarueno asov pesn spoutn e e e c c e r e se jednotlivch uloh. Kad uloha m denovnu svoji prioritu, se kterou je spoutna a y z a a a se periodu spoutn s e . Perioda spoutn je v podstat tzv. dead-line, tj. nejpozdj as, do kterho mus se e e s c e bt dan real-time uloha dokonena, aby mohla bt opt sputna. y a c y e se Priorita ulohy denuje dleitost ulohy z hlediska plnovae proces. u z a c u
2.1.2
Popis RT-Linuxu
RT-Linux je hard real-time operan systm uren pro robot a technologickch c e c y rzen u y proces, asov nron men a jin ulohy nron na as. u c e a c a er e a c e c Dle nronosti vykonvan ulohy a mnostv spoutnch vlken lze doshnout a c a e z se y a a periody spoutn v du mikrosekund. s e ra Vhodou RT-Linuxu je, e roziuje monosti pouit klasickho unixovho systmu y z sr z z e e e o hard real-time vlastnosti pi zachovn pvodn funknosti systmu. r a u c e
RT-LINUX
2.1.3
Princip innosti c
Vlastn systm je implementovn jednak jako patch1 klasickho Linuxovho jdra, kter e a e e a y zajit uje obsluhu peruen ped vlastn Linuxovm kernelem. Druh st jsou dys r s r m y a ca namicky nahrvan moduly, kter po svm zaveden zajit uj vlastn hard real-time a e e e s funkcionalitu (plnovn proces, poskytnut synchronizan primitiv, monosti koa a u c ch z munikace s user-space st linuxu atd.). ca Jak vlastn RT-Linuxov systm funguje je dobe patrn z obr.2.1. y e r e
Obrzek 2.1: Blokov schema funcionality RT-Linuxov extenze. a e e Cel systm funguje nsledovn: y e a e Po zaveden RT-Linuxovch modul jsou vechna peruen odchytvna RT y u s r s a a Linuxem. Pokud je vyvolno peruen je zpracovno RT-Linuxem, v p e, e je peruen a r s , a rpad z r s vyu ano nkterou real-time ulohou, je vyvoln handler peruen tto ulohy. zv e a r s e
Patchem je obvykle nazvna soubor, obsahuj upravu i oprava zdrojovho kdu njakho y a c c e o e e programu. Aplikac patche na zdrojov soubory pvodn programu je pak z ana nov, upraven e u ho sk a a verze.
1
RT-LINUX
RT-Linux a C++
Pokud existuj naplnovan real-time ulohy ekaj na voln as procesoru, pak a e c c yc jsou sputny (v zvislosti na priorit). se a e Pokud nen ve front dn real-time uloha a procesor je voln, je pedno e za a y r a rzen pvodn u mu linuxovmu jdru. e a Pvodn linuxov jdro vyu a peruen kter jsou emulovna RT-Linuxem2 . u e a zv r s , a a
2.1.4
V p e, e real-time vlkno chce vyu rpad z a zvat matematick koprocesor (dle jen FPU), y a 3 je nutno tuto skutenost oznmit plnovai proces . Plnova nsledn zajist pi c a a c u a c a e r pep an takovho vlkna uloen stavu registr FPU a jejich p r n e a z u rpadn obnoven ve e chv kdy vlkno pokrauje ve svm bhu. li, a c e e Pokud plnova proces nen informovn, e vlkno vyu a FPU me dochzet a c u a z a zv uz a k navracen chybnch vsledk vpotu. K tomu me doj z nsleduj ch dvod: y y u y c uz t a c u u 1. FPU v jeden okamik vyu a program z user-space a zrove real-time vlkno. z zv a n a 2. FPU v jeden okamik vyu alespo dv real-time vlkna. z zvaj n e a 3. FPU je v jeden okamik poadovno nkolika real-time vlkny i programy z userz z a e a space.
2.2
RT-Linux a C++
V RT-Linuxu je mono vyu z zvat programovac jazyka C++ pro tvorbu real-time ho vlken. Pouit vak m jist omezen kter vyplvaj ji p a z s a a , a y z rmo z principu, jakm y systm funguje. e Nsleduj sti se postupn zabvaj jednotlivmi konstrukcemi jazyka C++ a jea c ca e y y ast 2.2.1 diskutuje pouit dynamick alokace pamti, z e e jich pouit v RT-Linuxu. C z m st 2.2.2 krtce diskutuje pouit exceptions4 a st 2.2.3 diskutuje pouit temca a z ca z plates(ablon). s
2.2.1
Problm pouit dynamick alokace pamti lze rozdlit na st, kter se tk alokovn e z e e e ca a y a a pamti bhem inicializace real-time modulu a problematiku dynmick alokace pamti e e e e bhem vlastn bhu real-time procesu (tj. alokace pamti p z b ho RT vlkna). e ho e e rmo ezc a
V podstat lze innost pvodn linuxovho jdra pirovnat ke zvltn e c u ho e a r as mu real-time vlknu RTa Linuxu, b mu s nejni real-time prioritou. ezc zs 3 To je mon zajistit bud informac pi zakldn real-time vlkna nebo nastaven stejnho z e r a a a m e parametru za bhu real-time vlkna. e a 4 Tj. vyj mek pro oeten chybovch stav pi bhu programu s r y u r e
2
RT-LINUX
RT-Linux a C++
Oba tyto problmy lze eit za pomoci petzen C++ opertoru new a delete, e r s r a p rpadn opertor new[] a delete[] pro alokace a uvolovn pamti dynamickch pol e a u n a e y . bhem inicializace, p V p e, e potebujeme dynamicky alokovat pamt e rpad z r e rpadn e deinicializace modulu, sta petzit standardn C++ opertory uveden ve na voln c r a e ys a linuxovho jdra kalloc(), p e a rpadn kfree(). Toto petzen je ji standardn provedeno e r z e y ca v souboru rtl cpp.h, kter je soust distribuce RT-Linux. Za pedpokladu, e je teba dynamicky alokovat pamt za bhu real-time vlkna, r z r e e a je teba si vytvoit vlastn sprvu dynamick pamti. Dvodem je zejmna monost r r a e e u e z vzniku kolize pi voln standardn systmovch voln r a ch e y a . Vlastn dynamick sprva pamti by mla fungovat nsleduj m zpsobem: a a e e a c u 1. V okamiku inicializace RT modulu naalokuje pamt z oblasti jdra pomoc voln z e a a kmalloc(). Velikost takto alokovan pamti by mla odpov e e e dat alespo maximln n a potebn velikosti pamti, kterou budeme cht dynamicky alokovat. Bloky tto r e e t e pamti mus bt alokovn ve fyzick pamti po ce. e y a e e cta 2. Petz opertory new, new[], delete, delete[] tak, aby volaly funkce zajit uj r a s c alokaci a dealokaci pamti v rmci pamt ovho bloku naalokovanho bhem e a e e e e zavdn RT modulu (viz. krok 1). a e 3. Bhem deaktivace modulu provede uvolnn pamt ovho bloku, kter byl z an e e e e y sk ov oblasti linuxovho jdra v okamiku zaveden modulu do pamti. z pamt e e e a z e
2.2.2
Vyj mky, nebo tak exceptions, nelze bohuel v pamt ovm prostoru linuxovho jdra e z e e e a a tedy ani v oblasti, kter je vyu ana RT rozren vyu Hlavn dvodem je, a zv s m zt. m u e linker optimalizuje kd pro voln vyj z o a mek. Proto by bhem linkovn modulu jdra e a a musely bt znmy vechny moduly, kter se budou v pamti nachzet. y a s e e a Dal dvodem je, e linuxov jdro je psna ist v jazyce C a ji bhem jeho sm u z e a a c e z e kompilace jsou vyj mky zakzany pomoc parametru pekladae. a r c
2.2.3
e Templates jako vlastnost jazyka C++ lze bez obtz vyu nebot bhem kompilace je zt, takov kd nahrazen skutenm datovm typem vetn vech kontrol bhem kompiy o c y y c e s e lace. Bohuel nelze jednodue vyu t implementovanch v knihovn STL5 . Dvodem z s zt rd y e u jsou dynamick alokace pamti, kter jsou v tchto t ach vyu e e e e rd zvany. Omezen z toho plynouc jsou uvedena v sti 2.2.1. Uritou monost jak tto knihovny vyu by ca c z , e zt zejm byla vlastn rekompilace ze zdrojovch kd se sprvn petzenmi opertory r e y o u a e r y a pro sprvu pamti. a e
5
10
11
3.1
Pro lexikln analzu zdrojovho kdu bude vyuit program LEX. Informace, kter jsou a y e o z e uvedeny v tto sti jsou erpny z [8] a [4]. Program LEX slou k vytvoen parseru e ca c a z r zdrojovho kdu a pevodu klcovch slov na tzv. tokeny. Zrove umonuje vytvoit e o r y a n z r stavov automat denuj monou nslednost rznch klcovch slov ve zdrojovm y c z a u y y e kdu. o Vytvoen stavov automat me pracovat dvma zpsoby: r y y uz e u 1. Stavov automat pi pechodu do dal stavu pedchoz stav zapomene. y r r sho r 2. Stavov automat ukld stavy na zsobn Zmna stavu je mon dvma smry: y a a a k. e z a e e Pechod do novho stavu, pvodn stav je uloen na zsobn r e u z a k. Z aktuln stavu se pechz do stavu uloenho na zsobn a ho r a z e a ku, aktuln a stav je zapomenut.
3.1.1
Vstupn soubor pro LEX je rozdlen do tech st tak, jak je patrno z ukzky 3.1. e r ca a Jednotliv sti jsou od sebe oddleny pomoc znaek %%. e ca e c
... definice maker a vlastnost analyztoru ... a %% ... definice pravidel ... %% ... funkce v jazyce C/C++ ...
Ukzka 3.1: Struktura vstupn souboru pro LEX. a ho Prvn st obsahuje makra pro zjednoduen denin regulrn vraz pro vyh ca s c ch a ch y u ledvn klcovch slov, parametry parseru a p a a y rpadn zdrojov kd v jazyce C/C++. e y o V tab.3.1 je uveden pehled klcovch slov, kter mohou bt v prvn sti obsaeny. r y e y ca z Druh st vstupn souboru obsahuje pravidla ve tvaru regulrn vraz pro a ca ho a ch y u zpracovn zdrojovho kdu a denici akc v jazyce C/C++, kter pravidlu odpov . a e o e daj Pravidlo me bt aktivn pouze v denovanch stavech, akce me obsahovat pechod uz y y uz r do stavu novho nebo do stavu uloenho na zsobn e z e a ku. Struktura pravidel je patrn a z ukzky 3.2. a Prvn st pravidla je nepovinn a denuje stavy, ve kterch je pravidlo platn, ca a y e p rpadn stavy, ve kterch platn nen Zde zle na tom, jak je denovn stav v prvn e y e . a z a sti vstupn souboru. ca ho 12
%s
%{ ... %}
%option ...
Popis Peddenovan regulrn vrazy, kter lze r e a y e pou dle pro zjednoduen denin zt a s c ch pravidel pro vyhledvn token ve zdroa a u jovm kdu. e o Denice stav, ve kterch se me nachzet u y uz a vygenerovan stavov automat. Na jednom y y dku se me nachzet deklarace v stav ra uz a ce u jejich jmna jsou oddlena mezerou. z e e Ohranien zdrojovho kdu v jazyce c e o C/C++, kter bude vloen tak, jak je y z napsn, na zatek vygenerovanho zdroa ca e jovho kdu parseru. e o Parametry vygenerovanho parseru, pokud e obsahuje klcov slovo stack, jsou stavy e parseru ukldny na zsobn a a a k.
Tabulka 3.1: Pehled klcovch slov pouitelnch v prvn sti denin souboru pro r y z y ca c ho LEX.
Ukzka 3.2: Struktura pravidel pro analzu zdrojovho kdu. a y e o Druh st je regulrn vraz, kter denuje, jak dan klcov slovo, konstanta a ca a y y e e i jin soust zdrojovho kdu je zapsna. Zkladn struktura regulrn vraz je c a ca e o a a a ch y u popsna v tab. 3.2, podrobnj informace o regulrn vrazech 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 snmu regulrn rpad z y ca a d rslu e a mu vrazu, je tento text uloen do promnn YYTEXT a lze ho pou v sti pro zpis y z e e zt ca a p sn akce, kter se vyvol pro dan vraz. rslu e a a y y V sti pro zpis akce lze zapsat libovolnou akci nebo nepsat nic, pokud se m ve, ca a a s co odpov a danmu regulrn vrazu ignorovat. V p e, e chceme spolupracovat d e a mu y rpad z s programem YACC, me akce vypadat nap. jako v ukzce 3.3. uz r a Ukzka 3.4 uvd cel vstupn soubor pro LEX obsahuj konkrtn pravidlo, vetn a a y c e c e akce v jazyce C. Pravidlo detekuje token jako celo cselnou konstantu ve zdrojovm e kdu, pokud se stavov automat nachz ve stavu any value. o y a
13
([0-9]+) {SPACE}
Popis Regulrn vraz je slovo LD. a y Regulrn vraz je slovo LD na zatku a y ca dku. ra Regulrn vraz je slovo LD na konci dku. a y ra Regulrn vraz je slovo LD nsledovan lia y a e bovolnm potem mezer nebo tabultor, y c a u st za znakem / nen uloena v promnn ca z e e YYTEXT a je ponechna v bueru pro dal a s zpracovn a . Regulrn vraz je skldaj se z liboa y cslo a c volnho potu e c cslic. Regulrn vraz odpov a denici z prvn a y d ho bloku zdrojovho souboru s nzvem SPACE. e a
// pokud se prv nachzm ve stavu var_declaration a e a if (YY_START == var_declaration) { // vyzvedni aktuln stav ze zsobnku (dojde k pesunu a a r // do stavu pedchozho) r yy_pop_state(); // a ulo na zsobnk stav var_data_type z a yy_push_state(var_data_type); // ulo hodnotu nalezenho regulrnho vrazu do promnn z e a y e e // pro YACC yylval.string = strdup(yytext); // a vrat informaci, e jsi nalezl datov typ z y // promnn e e return TOK_VAR_DATATYPE; } // nejsem v bloku deklarac promnnch, e y // ale oekvm deklaraci datovho typu c a a e // funkce yylval.string = strdup(yytext); return TOK_FUNCTION_DATATYPE; }
Ukzka 3.3: Zpis akce pro nalezen regulrn vraz ze zdrojovho kdu. a a y a y e o
14
%{ #include <stdio.h> // odkaz na potadlo dk c ra u extern int iLineCount; %} // pouij zsobnk pi zmn stavu z a r e e %option stack // definice povolench stav y u %s var_init %% // pokud jsi ve stavu, kdy je oekvna inicializace c a a // promnn, povol detekci celho 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 potadlo a jinak ra s c // nic nedlej e \n ++iLineCount; %%
3.2
Pro popis gramatiky jazyka lze vyu systm YACC, kter umonuje ve spoluprci zt e y z a s programem LEX denovat velmi jednodue pravidla , jak dan programovac jazyk s y vypad, tj. jak umonuje vytvet programtorsk konstrukce a zpisy. a e z ar a e a Informace zde uveden jsou erpny z [8] a [4]. e c a
3.2.1
Struktura zdrojovho souboru pro systm YACC je opt rozdlena do tech st tak, e e e e r ca jak je patrno z obrzku 3.5. Jednotliv sti jsou od sebe oddleny pomoc znaek %%. a e ca e c Prvn st obsahuje denici token pro vyhledvn (z tchto denic jsou pot ca u a a e e vygenerovny uniktn identiktory jejich symbolick nzvy odpov nzvm toa a a z e a daj a u ken), prioritu opertor apod. V tab.3.3 je uveden pehled zkladn p u, kter u a u r a ch rkaz e mohou bt v tto sti obsaeny. y e ca z ast pro denici pravidel obsahuje ji p C z rmo jednotliv pravidla, kter odpov a a daj konstrukc kter lze v jazyce vytvoit. Kad takov pravidlo m strukturu dle m, e r z e e a obr.3.6. Vznam jednotlivch prvk je nsleduj : y y u a c | Denuje, e nsleduj st pravidla je nepovinn. z a c ca a 15
... definice ... %% ... definice pravidel pro gramatiku jazyka ... %% ... funkce v jazyce C ...
Ukzka 3.5: Struktura vstupn souboru pro program YACC. a ho Denice %token jmno e %{...%} Popis Denice tokenu s nzvem jmno a e Blok obsahuj kd v jazyce C/C++, kter c o y bude po zpracovn vloen na zatek vygena z ca erovanho kdu. e o Nvratov hodnota yylval je typu union a je a a urena nkterm datovm typem uvedenm c e y y y v unionu. Denuje token s datovm typem iData (dle y denice v unionu). Denice priority opertoru. a Denice priority opertoru. a
Tabulka 3.3: Zkladn p a rkazy pouiteln v bloku denic vstupn souboru pro YACC. z e ho
nazev: [|] nazev2 [{ ... programov kd v jazyce C/C++ ... y o }] [[|] nazev3] ;
Ukzka 3.6: Struktura pravidel pro denici jazyka v programu YACC. a nazev Nzev pravidla (bez diakritiky) oddlen dvojtekou od jeho denice. a e y c nazev2 Nzev tokenu denovanho v sti denic na zastku vstupn souboru pro a e ca ca ho 16
YACC nebo nzev jinho pravidla. Pro vytven rekurzivn pravidel me bt a e ar ch uz y stejn i jako nazev. y { ... } Ohraniuje blok obsahuj kd v jazyce C/C++, kter bude vykonn v p e, c c o y a rpad e pravidlo bude obsaeno ve vstupn zdrojovm souboru. z z m e ; Oznaen konce bloku, kter denuje pravidlo nazev. c y Programov kd v jazyce C/C++ denuje akce, kter budou pi aplikaci pravidla y o e r vyvolny. V p e, e nalezen token m denovn datov typ, lze k hodnot pedan a rpad z y a a y e r e z programu LEX pistupovat pomoc konstrukce $x, kde x je denuj poad r cslo c r tokenu v denici pravidla. V p e pravidla z obr.3.6 by pro token nazev2 s derpad novanm typem odpov y dala hodnota $1. Do cslovn poad se zahrnuj i programov a r e bloky uzaven mezi {}. r e Na obr.3.7 je uvedena krtk komentovan ukzka denice nkolika jednoduchch a a a a e y pravidel.
3.3
Tato st popisuje spoluprci program LEX a YACC pi vytven pekladae navrenho ca a u r ar r c z e ar e e jazyka. Princip innosti je vysvtlen na obr.3.2 pomoc vytvenho softwarovho PLC c e (vsledkem bude program plc2cpp, kter bude pevdt kd ve zvolenm jazyce pro y y r a e o e PLC do jazyka C/C++). Princip spoluprce obou program lze popsat nsledovn: a u a e 1. Nejprve vytvo rme lexikln analyzer pomoc programu LEX, kter vyhled ve a y a zdrojovm textu tzv. tokeny (tj. denovan klcov slova). e a a 2. Nsledn denujeme pomoc programu YACC syntaxi navrenho jazyka (tj. a e z e mon kombinace vyhledanch token). z e y u 3. Zkompilujeme vstupn soubor pro program YACC. Vsledkem je hlavikov sou y c y bor y.tab.h, kter denuje pro jednotliv nzvy token y e a u cseln hodnoty (makra) e v jazyce C/C++ a soubor y.tab.c, kter obsahuje vlastn syntaktick analyztor y y a jazyka. 4. Zkompilujeme vstupn soubor pro program LEX. Ten ve vygenerovanm kdu e o vyu a soubor y.tab.h vygenerovan v pedchoz kroku. Vsledkem je soubor zv y r m y lex.yy.c, kter obsahuje lexikln analyzer v jazyce C/C++. y a 5. Zkompilovn soubor vygenerovanch v pedchoz krok spolu s dal a m u y r ch u smi podprnmi stmi z ame poadovan kompiltor. V naem p e plc2cpp. u y ca sk z y a s rpad 6. Zkompilovan program z pedchoz krok je ji vytvenm kompiltorem, y r ch u z ar y a kter lze vyu ke kompilaci zdrojovho kdu ve vytvenm jazyce. V naem y zt e o ar e s p e tedy zdrojov kd v implementovanm programovac jazykem pro PLC. rpad y o y m 17
// Definuj token pro piazen hodnoty r r %token TOK_SET // Piazovan hodnota je bud cel slo r r a e c // nebo nulou ukonen etzec c y r e %union { int number; char *string; } // Definuj token s urenm datovm typem pro nvrat c y y a // celoseln hodnoty c e %token <number> VAL_INT // Definuj token s urenm datovm typem pro nvrat c y y a // nulou ukonenho etzce c e r e %token <string> VAL_STR %% // Definuj zkladn pravidlo pro detekci jednotlivch a y // blok ve vstupnm souboru. u blocks: // dn z nsledujcch blok v pravidle nen povinn Za y a u y | // Po nalezen bloku pro piazen celho sla me nsledovat r r e c uz a // dal vstupn blok (rekurze)) s set_int blocks | // Po prvnm bloku piazujcm etzec ji nensleduje 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("etzcov hodnota: %s", $1); R e a } ; %%
18
Obrzek 3.2: Princip tvorby a funkce pekladae jazyka denovanho pomoc program a r c e u LEX a YACC. Zde uveden vlastnosti a konstrukce obsahuj pouze malou st monost kter proe ca z , e gramy YACC a LEX nab . V podstat shrnuje vlastnosti vyuit bhem konstrukce zej e z e e softwarovho PLC. Podrobnj informace lze nalzt v uveden literatue. e e s e e r
19
4.1
Promnn v PLC programu se zapisuj v rmci blok promnnch. Kad blok promnnch e e a u e y z y e y m jin vznam a ve svm tle obsahuje deklaraci jedn nebo v promnnch tak, jak a y y e e e ce e y y y u e y y s je patrno z ukzky 4.1. Vznamem jednotlivch blok promnnch se zabvaj dal a sti tto kapitoly. ca e Princip zpracovn promnnch v rmci PLC programu prob a nsleduj m zpsobem: a e y a h a c u 1. Detekuj blok deklaruj promnn (viz. st 4.2). c e e ca 2. Najdi deklaraci promnn a ukldej jej parametry do kontejneru CContainere e a Variable: (a) Separuj nzev promnn, peved ho na mal p a e e r a smena a vlo do kontejneru. z (b) Detekuj, zda deklarace promnn obsahuje specikaci adresy, pokud ano, e e ulo adresu v kontejneru. z (c) Identikuj datov typ promnn, pokud se jedn o funkn blok, sdl kony e e a c e tejneru poadavek na vloen hlavikovho souboru s p snm funkn z z c e rslu y c m blokem. (d) Pokud se jedn o standardn datov typ, detekuj p a y rpadnou deklaraci inicializan hodnoty. V p e, e je promnn inicializovna, ulo inicializan c rpad z e a a z c hodnotu do kontejneru. 20
Deklarace promnnch e y
3. Existuje-li deklarace dal promnn, opakuj ve od bodu 2. s e e s 4. Detekuj konec bloku promnnch, uzavi kontejner promnnch a pidej ho do e y r e y r kontejneru obsahuj ho jednotliv kontejnery promnnch platnch v aktuln c e e y y a m programovm bloku. e
4.2
Deklarace promnnch e y
Jednotliv promnn se deklaruj v nkolika typech blok s rznm vznamem. Jede e e e u u y y notliv druhy blok promnnch jsou povoleny v rznch kontextech PLC kdu. Promnn e u e y u y o e e se zapisuj zpsobem uvedenm v ukzce 4.1. u y a
... Zatek bloku promnnch ca e y ... typ [AT adresa]: Nzev promnn [:= hodnota]; a e e ... Konec bloku promnnch e y ...
Ukzka 4.1: Deklarace promnn a e e Kad promnn mus obsahovat datov typ a nzev. Pokud je datov typ promnn z a e a y a y e e 1 jeden ze zkladn datovch typ uvedench v tab.4.1 , me deklarace promnn oba ch y u y uz e e sahovat jet klcov slovo AT nsledovan adresou ve tvaru uvedenm v tab.4.3. Dle s e e a e e a v tomto p e me deklarace obsahovat inicializan hodnotu promnn oddlenou rpad uz c e e e pomoc :=. Jako datov typ me bt pouit tak nzev funkn bloku, zde je tedy teba y uz y z e a c ho r tak zajistit, aby se vygeneroval dek pro proveden include p snho hlavikovho e ra rslu e c e souboru obsahuj ho deklaraci funkn bloku. Cel deklarace je ukonena pomoc ;. c c ho a c a rklad deklarace nkolika promnnch tak,aby byl patrn konkrtn e e y y e Ukzka 4.2 uvd p a zpis promnn v programu. Pro vt nzornost jsou zapsny v rmci bloku lokln a e e e s a a a a ch promnnch. e y
4.2.1
P e adresy rm
V tab.4.2 je uvedeno nkolik ukzek p ych adres pro PLC. Adresa se vdy skld z e a rm z a a prexu, kter denuje typ adresy nsledovan prexem, denuj m velikost pamt ovho y a y c e e bloku, ktermu adresa odpov a. e d
1
V tabulce jsou uvedeny pouze datov typy podporovan ve vytvenm softwarovm PLC. e e ar e e
21
Deklarace promnnch e y
Datov typ y BOOL SINT INT DINT USINT UINT UDINT REAL TIME BYTE WORD DWORD
Velikost 1 8 16 32 8 16 32 64 8 16 32
Poznmka a
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
Ukzka 4.2: Ukzka deklarace jednotlivch promnnch. a a y e y Adresa %QX35, %Q35 %MX3.5 %IW23 Poznmka a Vstupn bit 37 y 5 bit 3 bytu ve vnitn pamti r e Vstupn slovo 23
Tabulka 4.2: Ukzky zpisu adres pro PLC. a a Pehled jednotlivch prex pro adresaci pamt ovch m PLC je uveden v tab.4.3. r y u e y st
22
Poznmka a Adresa vstupu y Adresa vstupu Adresa ve vnitn pamti r e Adresa Adresa Adresa Adresa Adresa Adresa specikuje specikuje specikuje specikuje specikuje specikuje jeden bit jeden bit jeden byte (8bit) u jedno slovo (16bit) u dvojit slovo (32bit) e u dlouh slovo (64bit) e u
4.3
Nsleduj st se zabv vznamem a zpsobem zpisu jednotlivch typ blok a c ca y a y u a y u u promnnch. Informce zde uveden jsou erpny z [5]. e y e c a Norma [5] denuje nsleduj typy promnnch: a c e y Globln promnn - pou se pro zpis promnnch dostupnch v celm a e e zvaj a e y y e PLC programu. Lokln promnn - pou se pro deklaraci lokln promnnch v rmci a e e zvaj a ch e y a funkce, funkn bloku nebo bloku program. c ho Extern promnn - pou se k denici odkazu na globln promnn v e e zvaj a e e rmci blok funkce, funkn blok nebo blok program. a u c Vstupn promnn - pou se pro deklaraci vstupn parametr funkc e e zvaj ch u , funkn blok nebo blok typu program. c ch u u Vstupn promnn - pou se pro deklaraci vstupn parametr funkn y e e zvaj y ch u c ch blok a blok typu program. u u Vstupn/vstupn promnn - zastupuj ulohu parametr pedvanch refe y e e u r a y erenc v rmci blok program a funkn blok. a u c ch u
4.3.1
Globln promnn a e e
Globln promnn je mon deklarovat v rmci bloku CONFIGURATION, p a e e z e a rpadn e v rmci podbloku kongurace RESOURCE. Globln promnn jsou nsledn dosa a e e a e tupn v celm PLC programu, piem z blok typu FUNCTION, PROGRAM a e e rc z u 23
FUNCTION BLOCK je teba se na n odkzat pomoc deklarace VAR EXTERNAL r e a (viz.4.3.2). Zpsob deklarace bloku globln promnnch je patrn z ukzky 4.3. u a ch e y y a
... nadazen blok ... r y VAR_GLOBAL ... Deklarace jednotlivch promnnch; y e y ... END_VAR ... pokraovn nadazenho bloku ... c a r e
4.3.2
Extern promnn e e
Blok extern promnnch se vyu a k odkazu na globln promnnou, kterou chceme ch e y zv a e vyu v rmci blok PROGRAM, FUNCTION a FUNCTION BLOCK. V tomto zt a u bloku lze pou pouze deklaraci promnn bez specikace adresy, kde se nachz ani zt e e a , deklarovat inicializan hodnotu - tu je mono specikovat v rmci deklarace promnn c z a e e v bloku VAR GLOBAL. Zpsob deklarace bloku globln promnnch je patrn z u a ch e y y ukzky 4.4. a
... nadazen blok ... r y VAR_EXTERNAL ... Deklarace jednotlivch promnnch; y e y ... END_VAR ... pokraovn nadazenho bloku ... c a r e
4.3.3
Lokln promnn a e e
Lokln promnn lze pou pouze v rmci programovch blok PROGRAM, FUNCa e e zt a y u TION a FUNCTION BLOCK. Promnn deklarovan jako lokln maj platnost pouze e e e a v programovm bloku, kde jsou deklarovny. e a 24
V p e funkn blok a blok typu program si lokln promnn uchovvaj rpad c ch u u a e e a svoji hodnotu z pedchoz voln po celou dobu existence instance funkn bloku. r ho a c ho Zpsob deklarace bloku lokln promnnch je patrn z ukzky 4.5. u a ch e y y a
... nadazen blok ... r y VAR ... Deklarace jednotlivch promnnch; y e y ... END_VAR ... pokraovn nadazenho bloku ... c a r e
4.3.4
Vstupn promnn e e
Bloky vstupn promnnch lze vyu ch e y zvat v rmci blok PROGRAM, FUNCTION a u a FUNCTION BLOCK. V jejich deklaraci nelze specikovat adresu a vyu se jako zvaj vstupn parametry ve uvedench blok. Zpsob deklarace bloku vstupn promnnch ys y u u ch e y je patrn z ukzky 4.6. y a
... nadazen blok ... r y VAR_INPUT ... Deklarace jednotlivch promnnch; y e y ... END_VAR ... pokraovn nadazenho bloku ... c a r e
4.3.5
Vstupn promnn y e e
Vstupn promnn lze pou pouze v rmci blok PROGRAM a FUNCTION BLOCK. y e e zt a u V jejich deklaraci nelze specikovat adresu a vyu se pro pedvn hodnot z zvaj r a a aktuln programovho bloku do bloku nadazenho. Zpsob deklarace bloku vstupn a ho e r e u y ch promnnch je patrn z ukzky 4.7. e y y a 25
Implementace promnnch e y
... nadazen blok ... r y VAR_OUTPUT ... Deklarace jednotlivch promnnch; y e y ... END_VAR ... pokraovn nadazenho bloku ... c a r e
4.3.6
Vstupn/vstupn promnn e y e e
Bloky vstupn/vstupn promnnch lze pou pouze v rmci blok PROGRAM e y ch e y zt a u a FUNCTION BLOCK. V deklaraci jednotlivch promnnch nelze specikovat adresu y e y a zastupuj ulohu parametr pedvanch referenc Tyto parametry lze vyu jak pro u r a y . zt pedn hodnoty do volanho bloku, tak pro z an tto hodnoty po ukonen voln r a e sk e c a p snho bloku. Zpsob deklarace bloku vstupn/vstupn promnnch je patrn rslu e u e y ch e y y z ukzky 4.8. a
... nadazen blok ... r y VAR_IN_OUT ... Deklarace jednotlivch promnnch; y e y ... END_VAR ... pokraovn nadazenho bloku ... c a r e
4.4
Implementace promnnch e y
Implementace promnnch mus splovat vechny poadavky, kter vyplvaj z pedchoz e y n s z e y r sti: ca 1. Spoluprce se vemi datovmi typy zvolenmi pro implementaci. a s y y 2. Monost specikovat absolutn adresu, na kter se promnn nachz z e e a a . 26
Implementace promnnch e y
3. Monost specikovat inicializan hodnotu promnn. z c e e 4. Pro vstupn/vstupn promnn umonit pedat hodnotu promnn do bloku, e y e e z r e e kter provedl voln p snho funkn nebo programovho bloku. y a rslu e c ho e C lem tedy bude vytvoit p sn knihovn t kter umon akce denovan v r rslu e rdy, e z e pedchoz pehledu a vyplvaj z pedchoz st. Pehled navrench t a poadavky r m r y c r ca r z y rd z na jejich funkcionalitu jsou uvedeny v tab.4.4. T rda CVariable Funkcionalita Template t rda implementuj vlastnosti c promnnch pro vechny zkladn datov e y s a e typy z tab.4.1. Template t rda zapouzduj vlastnosti r c promnnch deklarovanch v rmci bloku e y y a VAR INPUT. Template t rda zapouzduj vlastnosti r c promnnch deklarovanch v rmci bloku e y y a VAR OUTPUT. Template t rda zapouzduj vlastnosti r c promnnch deklarovanch v rmci bloku e y y a c e rpadnho pedn e r a VAR IN OUT, vetn p hodnoty promnn do bloku, kter provedl e e y voln p snho funkn a rslu e c ho nebo programovho bloku. e
CPropertyIn
CPropertyOut
CPropertyInOut
4.4.1
V rmci parseru zdrojovho kdu pro PLC budou v generovanm C++ kdu vyuity a e o e o z a o r objekty z tab.4.4. Pro vlastn zpracovn kdu bude vytvoen kontejner CContainerVariable pro udrovn informac o aktuln zpracovvan promnn (informace o daz a a a e e e tovm typu, nzvu, adrese, inicializan hodnot atp.). Dle bude vytvoena template e a c e a r t CContainerContainer, kter bude slouit ke sdruovn kontejner pat ch do rda a z z a u rc jednoho bloku PLC programu.
4.4.2
Vygenerovan zdrojov kd y y o
Implementace promnnch e y
1. Povinn st deklarace vlastn promnn v private nebo public sti deklarace a ca e e ca objektu, kter reprezentuje dan blok z programu. y y 2. Nepovinn st v konstruktoru t zajit uj inicializaci promnn. Gena ca rdy s c e e erovno pouze v p e, e promnn m denovnu inicializan hodnotu. a rpad z e a a a c 3. Pro vstupn a vstupn-vstupn promnn je jet generovn kd resetuj y e y e e se a o c promnnou pro dal pouit e s z . V p e, e se jedn o globln promnnou, je vygenerovna deklarace promnn rpad z a a e a e e typu CVariable s p snm datovm typem a p rslu y y rpadnou inicializan hodnotou c promnn. e e Po zpracovn zdrojovho kdu je pro lokln promnnou vygenerovn kd odpov c a e o a e a o daj e o z rda ukzce 4.9. Ve vygenerovanm kdu je vyuita template t CVariable. a
// deklarace tdy, r // hlavikov soubor c y // counter AT %QB3: INT := 3; class init { ... private: #line 3 "test.plc" CVariable<INT> m_counter; ... };
// konstruktor tdy r // counter AT %QB3: INT := 3; init :: init(void) { #line 3 "test.plc" m_counter = CVariable<INT> ((INT) 3, "QB3"); }
Ukzka 4.9: Ukzka kdu vygenerovanho pro lokln promnn. a a o e a e e Kd generovan pro parametry funkc funkn blok nebo program je patrn o y , c ch u u y z ukzky 4.10. Ve vygenerovanm kdu je vyuita jedna z template t CPropertyIn, a e o z rd CPropertyOut nebo CPropertyInOut dle typu parametru pro p rstup k parametru z m sta, odkud je provedeno voln a template t CVariable, kter je piazena k a rda a rr objektu a je vyu ana k p zv rstupu k parametru uvnit programu. r
28
Implementace promnnch e y
// deklarace tdy, r // hlavikov soubor c y // vstup: INT; class init { private: #line 6 "test.plc" CVariable<INT> m_vstup; ... public: #line 6 "test.plc" CPropertyIn<INT> vstup; ... };
// soubor s implementac tdy r // konstruktor tdy r // vstup: INT; init :: init(void) { #line 6 "test.plc" vstup = CPropertyIn<INT> (&m_vstup); }
Ukzka 4.10: Ukzka kdu vygenerovanho pro parametry funkc funkn blok nebo a a o e , c ch u program. u
29
30
I ZPRACOVAN JAZYKA IL
Piazovac instrukce rr
MUL ( input1 SUB input2 ) (* Vsledek je interpretovn jako: y a *) (* result := result * (input1 - input2) *)
5.1
Piazovac instrukce rr
Tato st se zabv zpracovn instrukc kter umonuj piazovat hodnoty promnnch ca y a a m , e z r r e y a adres. Jednotliv instrukce, kter do tto sti spadaj a jejich vznamje uveden v e e e ca y tab.5.1. Instrukce LD LDN Popis Nastav aktuln hodnotu na zsobn a a ku. Argumentem me bt promnn, adresa nebo konstanta. uz y e a Nastav aktuln hodnotu na zsobn a a ku, piem nerc z jprve provede negaci hodnoty. Argumentem me bt uz y promnn, adresa nebo konstanta. e a Ulo aktuln hodnotu ze zsobn z a a ku do poadovan z e promnn nebo na poadovanou adresu. e e z Ulo aktuln hodnotu ze zsobn z a a ku do poadovan z e promnn nebo na poadovanou adresu, piem nejprve e e z rc z provede negaci hodnoty. Nastav obsah boolean promnn nebo adresy v argu e e mentu na 1, provd se pouze v p e, e aktuln a rpad z a stav zsobn je TRUE. a ku Nastav obsah boolean promnn nebo adresy v argu e e mentu na 0, provd se pouze v p e, e aktuln a rpad z a stav zsobn je TRUE. a ku
ST STN
Tabulka 5.1: Pehled piazovac instrukc jazyka IL. r rr ch Vygenerovan kd pro vybran instrukce je patrn z ukzky 5.2. y o e y a Instrukce, kter nastavuj aktuln hodnotu zsobn (ve vygenerovanm kdu e a a ku e o promnn result, denovan jako instance t CResult) pou petzen konstruke a a rdy zvaj r y tor objektu pro p sn datov typ. rslu y y
31
I ZPRACOVAN JAZYKA IL
Logick instrukce e
{ } {
} { // 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; }
5.2
Logick instrukce e
Tato st se zabv zpracovn logickch instrukc jazyka IL. Pehled jednotlivch ca y a a m y r y logickch instrukc je uveden v tab.5.2. y Vechny instrukce spadaj do tto sti pou jako prvn argument aktuln s c e ca zvaj a hodnotu zsobn a jako druh argument (operand instrukce) mohou m bud cselnou a ku y t konstantu, promnnou (p e rpadn parametr funkce/funkn bloku) nebo p e c ho rmou adresu. Vsledek proveden operace je vdy uloen na zsobn jako jeho aktuln hodnota y e z z a k, a (ve vygenerovanm kdu promnn result). e o e a Jednotliv operace jsou implementovny jako petzen opertor template t e a r y a rdy CResult z podprn PLC knihovny. u e a rklad C++ kdu, kter je vygenerovn pro logick instrukce. o y a e Ukzka 5.3 uvd p a
5.3
Aritmetick instrukce e
Tato st se zabv zpracovn aritmetickch instrukc jazyka IL. Pehled jednotlivch ca y a a m y r y instrukc je uveden v tab.5.3. Zkladn sada aritmetickch instrukc jazyka IL obsahuje a y instrukce pro s an od an nsoben a dlen vech zkladn datovch typ. ct , ct , a e s a ch y u Jako prvn operand p sn aritmetick operace je vdy pouita aktuln hodnota rslu e e z z a zsobn a ku, jako druh operand je pouit parametr instrukce. y z Vsledek aritmetick operace je vdy uloen zpt na zsobn jako jeho aktuln y e z z e a k a
32
I ZPRACOVAN JAZYKA IL
Aritmetick instrukce e
Instrukce AND
OR
XOR
ANDN
ORN
XORN
Popis Na zsobn je uloen vsledek logick operace a k z y e (Zsobn AND Operand), operand mus m stejn daa k t y tov typ jako aktuln hodnota zsobn y a a ku. Na zsobn je uloen vsledek logick operace a k z y e (Zsobn OR Operand), operand mus m stejn daa k t y tov typ jako aktuln hodnota zsobn y a a ku. Na zsobn je uloen vsledek logick operace a k z y e (Zsobn XOR Operand), operand mus m stejn daa k t y tov typ jako aktuln hodnota zsobn y a a ku. Na zsobn je uloen vsledek logick operace a k z y e (Zsobn AND NOT Operand), operand mus m a k t stejn datov typ jako aktuln hodnota zsobn y y a a ku. Na zsobn je uloen vsledek logick operace a k z y e (Zsobn OR NOT Operand), operand mus m stejn a k t y datov typ jako aktuln hodnota zsobn y a a ku. Na zsobn je uloen vsledek logick operace a k z y e (Zsobn XOR NOT Operand), operand mus m a k t stejn datov typ jako aktuln hodnota zsobn y y a a ku.
{ } { }
// AND 2#0101_0101 result = result & 85; // XORN 8#07_02 result = result ^ ~(450);
Ukzka 5.3: Generovan C++ kd pro logick instrukce jazyka IL. a y o e hodnota. Instrukce DIV (dlen ulo v p e dlen nulou na zsobn jako aktuln hode ) z rpad e a k a notu 0 a informace o chyb je vypsna jako hlen do logu jdra operan systmu. e a as a c ho e Ukzka 5.4 uvd C++ kd, kter je pro tyto instrukce generovn. a a o y a
33
I ZPRACOVAN JAZYKA IL
Porovnvac instrukce a
Instrukce ADD
SUB
MUL
DIV
Popis Na zsobn je uloen vsledek aritmetick operace a k z y e (Zsobn + Operand), operand mus m stejn datov a k t y y typ jako aktuln hodnota zsobn a a ku. Na zsobn je uloen vsledek aritmetick operace a k z y e (Zsobn - Operand), operand mus m stejn datov a k t y y typ jako aktuln hodnota zsobn a a ku. Na zsobn je uloen vsledek aritmetick operace a k z y e (Zsobn * Operand), operand mus m stejn datov a k t y y typ jako aktuln hodnota zsobn a a ku. Na zsobn je uloen vsledek aritmetick operace a k z y e (Zsobn / Operand), operand mus m stejn datov a k t y y typ jako aktuln hodnota zsobn a a ku.
{ // ADD 16#0F result = result + 15; } { // MUL %IW4 CVariable<WORD> tmp0 = CVariable<WORD>("IW4", 0); result = result * tmp0; }
5.4
Porovnvac instrukce a
Tato st se zabv zpracovn instrukc jazyka IL pro porovnvn aktuln stavu ca y a a m a a a ho zsobn a operandu. Pehled jednotlivch instrukc je uveden v tab.5.2. a ku r y Vechny instrukce modikuj aktuln hodnotu zsobn na logickou hodnotu s a a ku TRUE nebo FALSE dle vsledku porovnn y a . Ukzka 5.5 uvd kd, kter odpov a vybranm porovnvac instrukc jazyka a a o y d y a m m IL.
5.5
Tato st se zabv pehledem a zpracovn instrukc pro toku programu. Jedn ca y a r a m rzen a se o instrukce umonuj provdt skoky v rmci programu, volat jin programov z c a e a e e 34
I ZPRACOVAN JAZYKA IL
Instrukce GT GE EQ NE LE LT
Popis Na zsobn je uloeno TRUE nebo FALSE dle vsledku a k z y porovnn (Zsobn > Operand). a a k Na zsobn je uloeno TRUE nebo FALSE dle vsledku a k z y porovnn (Zsobn >= Operand). a a k Na zsobn je uloeno TRUE nebo FALSE dle vsledku a k z y porovnn (Zsobn = Operand). a a k Na zsobn je uloeno TRUE nebo FALSE dle vsledku a k z y porovnn (Zsobn = Operand). a a k Na zsobn je uloeno TRUE nebo FALSE dle vsledku a k z y porovnn (Zsobn <= Operand). a a k Na zsobn je uloeno TRUE nebo FALSE dle vsledku a k z y porovnn (Zsobn < Operand). a a k
{ } { }
Ukzka 5.5: Generovan C++ kd pro porovnvac instrukce jazyka IL. a y o a bloku a provst nvrat z volanho bloku. Pehled instrukc je uveden v tab.5.5. e a e r Kd generovan pro jednotliv instrukce z tab.5.5 je uveden v ukzce 5.6. Jak je o y e a patrno, instrukce JMP, JMPN a JMPC jsou nahrazeny v jazyce C++ konstrukc goto LABEL;, piem nvt v PLC programu je pevedeno do programu v jazyce C++. r c z a es r Instrukce RET, RETC a RETN jsou nahrazeny C++ voln return;. a m Sloitj situace nastv v p e pouit instrukc CAL, CALC a CALN, kter z e s a a rpad z e je teba zajistit tak pedn hodumonuj volat instance funkn blok, nebot z c ch u r e r a not parametr. Dle [5] lze hodnoty parametr pro funkn bloky pedvat 3 rznmi u u c r a u y zpsoby, tak jak je denovno v tab.5.6. u a Vytvoen software podporuje monosti . 1 a 2. V p e referenn argument r y z c rpad c ch u funkn blok, kter nejsou specikovny, lze takov funkn blok volat s t e c ch u e a y c m, z se pouije implicitn hodnota parametru, piem p z r c z rpadnou navracenou hodnotu ji z nelze z programu z skat. Ukzka 5.6 uvd kd vygenerovan pi voln instance funkn bloku. a a o y r a c ho 35
I ZPRACOVAN JAZYKA IL
Instrukce JMP CAL RET JMPN CALN RETN JMPC CALC RETC
Popis Skok na nvt denovan v rmci programovho bloku. a es e a e Voln funkn bloku. a c ho Nvrat z volanho programovho bloku. a e e Podm en skok na nvt v rmci programovho bloku n y a es a e v p e, e aktuln stav zsobn je FALSE. rpad z a a ku Podm en voln funkn n e a c ho bloku v p e, e je rpad z aktuln stav zsobn FALSE. a a ku Podm en nvrat z volanho programovho bloku v n y a e e p e, e aktuln stav zsobn je FALSE. rpad z a a ku Podm en skok na nvt v rmci programovho bloku n y a es a e v p e, e aktuln stav zsobn je TRUE. rpad z a a ku Podm en voln funkn n e a c ho bloku v p e, e je rpad z aktuln stav zsobn TRUE. a a ku Podm en nvrat z volanho programovho bloku v n y a e e p e, e aktuln stav zsobn je TRUE. rpad z a a ku
Tabulka 5.5: Pehled instrukc pro toku programu jazyka IL. r rzen slo C 1 2 Popis/ukzka a CAL se vstupn parametry: mi CAL C10(CU := %IX10, PV := 15) CAL + LD a ST pro nastaven vstup: u LD 15 ST C10.PV LD %IX10 ST C10.CU CAL C10 Pouit vstupn opertor: z ch a u LD 15 PV C10 LD %IX10 CU C10
5.5.1
Voln funkc a
Funkce lze volat tak, e na m z sto instrukce se zapse nzev funkce, piem jako a rc z prvn argument funkce je pedna aktuln hodnota zsobn r a a a ku. P rpadn dal hode s noty parametr lze zadat oddlen rkou v rmci argumentu instrukce. Nvratov u e e ca a a a hodnota funkce je uloena jako aktuln hodnota zsobn z a a ku. Ukzka 5.7 uvd PLC a a 36
I ZPRACOVAN JAZYKA IL
Ukzka 5.6: Generovan kd pro vybran instrukce toku programu jazyka IL. a y o e rzen kd pro voln funkce. o a
LD MAX
10 20
Ukzka 5.7: Ukzka voln funkce z jazyka IL. a a a Ukzka 5.8 uvd kd vygenerovan bhem voln funkce. Nejprve je deklarovna a a o y e a a instance objektu, kter funkci reprezentuje, nsledn je vyplnn prvn parametr funkce y a e e aktuln hodnotou zsobn a pot jsou vyplnny p a a ku e e rpadn dal parametry. Po voln e s a funkce je nastavena nov aktuln hodnota zsobn a a a ku.
37
6.1
Funkn bloky c
Funkn bloky svou podstatou odpov objektm jazyka C++. Kad funkn blok c daj u z y c pedt ne je mon ho volat mus m deklarovnu svoji instanci pomoc promnn r m, z z e t a e e s datovm typem odpov c nzvu funkn bloku (viz. ukzka 6.1). y daj m a c ho a
38
Funkn bloky c
Jinmi slovy, kad funkn blok me m v instanc kter jsou reprezentovny y z y c uz t ce , e a rznmi promnnmi (bud globln nebo lokln u y e y a mi a mi). Znikem promnn zanik tak a e e a e instance p snho funkn bloku. rslu e c ho
... VAR ... pid1: PID; (* deklarace instance FB pro PID regultor *) a ... END_VAR ... CAL pid1 ...
Ukzka 6.1: Deklarace instance funkn bloku a jeho nsledn voln a c ho a e a . Princip zpisu kdu pro denici tla funkn bloku je patrn z ukzky 6.2. a o e c ho y a Deklarace jednotlivch blok promnnch je nepovinn. Vznam a vyuit jednotlivch y u e y a y z y blok promnnch je detailn popsn v sti 4. u e y e a ca Blok lokln promnnch m nasleduj vznam: a ch e y a c y Me obsahovat tak deklarace instanc dal funkn blok. uz e sch c ch u Vechny lokln promnn si udruj svoji hodnotu po celou dobu existence ins a e e z stance funkn bloku. c ho Norma [5] umonuje pedvat v parametrech funkn bloku tak odkazy na inz r a c ho e stanci jinho funkn bloku. Tato monost nen ve vytvoenm softwarovm PLC e c ho z r e e dostupn. V nkterch p a e y rpadech by toti bylo nutn zajistit kop z e rovac konstruktor objektu, kterm je funkn blok reprezentovn. Problematick by t bylo chovn v y c a e ez a p e piazen instance funkn bloku deklarovan v rmci jinho bloku programu rpad r r c ho e a e do vstupn nebo vstupn/vstupn promnn. y e y e e y o c a a Ukzka 6.4 obsahuje vygenerovan kd pro funkn blok z ukzky 6.3. Z ukzky je a patrn, e vygenerovan kd je rozdlen na hlavikov soubor s denic t reprezene z y o e c y rdy tuj funkn blok a zdrojov soubor s implementac tto t c c y e rdy. Nzev t kter funkn blok reprezentuje je ve vygenerovanm kdu rozren o a rdy, a c e o s prex plcfb . To umonuje deklarovat v rmci programu rzn typy blok se stejnm z a u e u y nzvem. a
39
Funkn bloky c
FUNCTION_BLOCK name VAR_INPUT ... deklarace jednotlivch vstupnch promnnch ... y e y END_VAR VAR_OUTPUT ... deklarace jednotlivch vstupnch promnnch ... y y e y END_VAR VAR_IN_OUT ... deklarace jednotlivch vstupn/vstupnch promnnch ... y e y e y END_VAR VAR ... deklarace jednotlivch loklnch promnnch ... y a e y END_VAR ... kd programu ve zvolenm jazyce (v naem ppad IL) o e s r e ... END_FUNCTION_BLOCK
Ukzka 6.3: Vstupn soubor pro ukzku vygenerovanho kdu funkn bloku. a a e o c ho
40
Funkn bloky c
// soubor s implementac tdy 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); #line 9 "fb.plc" m_state = CVariable<INT> ((INT) 1); } void plcfb_ukazka :: ExitCall(void) { } plcfb_ukazka :: ~plcfb_ukazka(void) { } void plcfb_ukazka :: Function(void) { CResult result; #line 12 "fb.plc" { result = m_state; } #line 13 "fb.plc" { result = result + 1; } #line 14 "fb.plc" { result.GetValue(m_state); } #line 15 "fb.plc" { result = result * m_x; } #line 16 "fb.plc" { result.GetValue(m_y); } RETURN(); }
// deklarace tdy, r // hlavikov soubor c y #include <plc.h> class plcfb_ukazka { private: #line 3 "fb.plc" CVariable<INT> m_x; #line 6 "fb.plc" CVariable<INT> m_y; #line 9 "fb.plc" CVariable<INT> m_state; public: #line 3 "fb.plc" CPropertyIn<INT> x; #line 6 "fb.plc" CPropertyOut<INT> y; plcfb_ukazka(void); virtual ~plcfb_ukazka(void); void Function(void); void ExitCall(void); };
41
Programov bloky e
6.2
Programov bloky e
Programov bloky jsou obdobou funkn blok popsanch v pedchoz sti. Hlavn e c ch u y r ca rozd spo a v tom, e tento typ blok m automaticky generovnu svoji uniktn l cv z u a a a instanci, kter je platn po celou dobu bhu PLC. Tato instance samozejm uchovv a a e r e a a hodnoty lokln promnnch. a ch e y Programov bloky jsou ureny zejmna pro spoutn jednotlivch vlken PLC proe c e se y a gramu, p rpadn pro jednorzov spoutn nap. pi nbn hran signlu. Nicmn e a e se r r a ez e e a e e je lze volat i p rmo v programu obdobn jako funkn bloky, piem jako parametr e c rc z instrukce CAL se pouije p z rmo nzev programovho bloku. a e a Struktura zpisu programovho bloku je patrn z ukzky 6.5 a je obdobn jako a e a a struktura funkn bloku. c ho
PROGRAM name VAR_INPUT ... deklarace jednotlivch vstupnch promnnch ... y e y END_VAR VAR_OUTPUT ... deklarace jednotlivch vstupnch promnnch ... y y e y END_VAR VAR_IN_OUT ... deklarace jednotlivch vstupn/vstupnch promnnch ... y e y e y END_VAR VAR ... deklarace jednotlivch loklnch promnnch ... y a e y END_VAR ... kd programu ve zvolenm jazyce (v naem ppad IL) o e s r e ... END_PROGRAM
Ukzka 6.5: Deklarace programovho bloku. a e Vygenerovan kd odpov a kdu funkn bloku z ukzky 6.3, pouze prex v y o d o c ho a nzvu t je nahrazen plcp a v hlavikovm souboru je nadenovna globln a rdy c e a a promnn deklaruj instanci bloku pro vyuit v generovanm kdu. e a c z e o
42
Funkce
6.3
Funkce
Funkce jsou nejjednodu jednotky pro zpis programu. Umonuj pedvat pouze vsss a z r a 1 tupn parametry piem jako prvn parametr funkce je pedna aktuln hodnota rc z r a a zsobn a ku. Funkce mus pedvat nvratovou hodnotu, kter se stane aktuln hodno r a a a a tou zsobn a ku. ra Zpsob deklarace funkce je patrn z ukzky 6.6. Prvn dek deklarace denuje u y a 2 krom nzvu funkce tak datov typ nvratov hodnoty . e a e y a e
FUNCTION name:DATATYPE VAR_INPUT ... deklarace jednotlivch vstupnch promnnch ... y e y END_VAR VAR ... deklarace jednotlivch loklnch promnnch ... y a e y END_VAR ... kd programu ve zvolenm jazyce (v naem ppad IL) o e s r e ... END_FUNCTION
Ukzka 6.6: Deklarace funkce. a Nvratov hodnota funkce se nastav tak, e se ulo hodnota do promnn s nzvem a a z z e e a shodnm s nzvem funkce (viz. ukzka 6.7). y a a Kad funkci deklarovan v kdu softwarovho PLC odpov a vygenerovan t z e e o e d a rda v jazyce C++. Voln funkce nsledn spo a ve vytvoen jednorzov instance tto a a e cv r a e e t rdy. Tato instance t zanikne po ukonen voln a pedn nvratov hodnoty rdy c a r a a e do aktuln hodnoty zsobn a a ku. Jednorzovost instance t reprezentuj funkci je a rdy c zajitna vytvoen speciln name-space v jazyce C++3 . se r m a ho a y o a Ukzka 6.9 uvd vygenerovan kd pro funkci z ukzky 6.8. Jak je patrno, princip a generovn kdu je shodn s generovn kdu pro pedchoz programov bloky. Nzev a o y a m o r e a vygenerovan t je rozren o prex plcf . e rdy s
Ze zpsobu pedvn hodnot parametr vyplv, e kad funkce mus m alespo jeden vstupn u r a a u y a z z a t n parametr. 2 Jedn se o poloku DATATYPE, kter je oddlena od nzvu funkce pomoc :. a z a e a 3 Namespace zajit uje platnost instanc vech t a je ohranien pomoc {} s s rd c
43
Funkce
FUNCION exp:INT VAR_INPUT int Value; END_VAR LD Value ... ST exp (* Aktuln hodnotu zsobnku vlom do nvratov *) a a z a e (* hodnoty funkce *) ... END_FUNCTION
FUNCTION min: DINT VAR_INPUT val1: DINT; val2: DINT; END_VAR LD val1 ST min LT val2 RETC LD val2 ST min END_FUNCTION
44
Funkce
// deklarace tdy, r // hlavikov soubor c y #include <plc.h> class plcf_min { private: CVariable<DINT> m_min; #line 3 "function.plc" CVariable<DINT> m_val1; #line 4 "function.plc" CVariable<DINT> m_val2; public: #line 3 "function.plc" CPropertyIn<DINT> parm0; #line 4 "function.plc" CPropertyIn<DINT> parm1; plcf_min(void); virtual ~plcf_min(void); void Function(void); const CVariable<DINT>& GetResult(void); };
// Soubor s implementac tdy 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) { } const CVariable<DINT> &plcf_min :: GetResult(void) { return(this->m_min); } void plcf_min :: Function(void) { CResult result; #line 7 "function.plc" { result = m_val1; } #line 8 "function.plc" { result.GetValue(m_min); } #line 9 "function.plc" { result = (result < m_val2); } #line 10 "function.plc" if (result != 0) RETURN(); #line 12 "function.plc" { result = m_val2; } #line 13 "function.plc" { result.GetValue(m_min); } }
45
7.1
Tato st se zabv vznamem a obsahem bloku RESOURCE. Informace zde uveden ca y a y e jsou erpny z [5]. c a Jak je patrno z ukzky 7.1, me i tento blok obsahovat deklaraci globln a uz a ch promnnch stejn jako p e y e rmo blok CONFIGURATION. Po p rpadn deklaraci globln promnnch ji nsleduje denice uloh (TASK) e a ch e y z a a piazen tchto uloh jednotlivm blokm typu program. To zajist sputn softrr e y u se warovho PLC. e
46
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
7.1.1
Bloky TASK denuj vlastnosti pro spoutn blok PROGRAM. Jedn se tedy o se u a parametry, dle kterch budou nsledn vytvoeny real-time vlkna v rmci RT-Linuxovho y a e r a a e jdra. Blokm tudz p a u rmo neodpov a dn generovan kd. d za y y o V ukzce 7.2 je uveden pehled vech parametr, kter se mohou v denici TASK a r s u e bloku vyskytnout.
Ukzka 7.2: Struktura bloku TASK a jeho zpis. a a Tab.7.1 obsahuje popis jednotlivch parametr bloku a jejich vznam v rznch y u y u y kontextech.
47
Popis Nzev bloku, pouit v okamiku piazen TASK bloku typu a z y z rr PROGRAM. Denuje interval, se kterm je spoutno vlkno, kter m y se a e a piazeno tento TASK. rr Priorita vlkna, ktermu je TASK piazen. Hodnota v rozsahu a e rr 050, 0 odpov a nejvy priorit, 50 odpov a nejvy priorit. d s s e d ss e Pokud je hodnota parametru INTERVAL rzn od 0, pak denu a uje, e blok typu PROGRAM m bt spoutn periodicky pouze z a y se v p e, e hodnota vstupu SINGLE je log.0. Jestlie INTERrpad z z VAL je 0, pak blok je spoutn pouze v p e, e na vstupu se rpad z SINGLE byla detekovna nbn hrana. Hodnota vstupu me a a ez a uz bt reprezentovna bud p adresou nebo globln promnnou. y a rmo a e Tabulka 7.1: Vznam a popis parametr bloku TASK. y u
7.1.2
Bloky typu PROGRAM v rmci deklarace RESOURCE slou k piazen blok TASK a z rr u k jednotlivm programovm blokm PROGRAM1 . Vsledkem je pro vechny bloky y y u y s typu PROGRAM, kter jsou zde uvedeny, vygenerovn samostatnho real-time vlkna, e a e a kter dle parametr uvedench v bloku TASK spout p sn blok PROGRAM. e u y s rslu y se Pokud v deklaraci chyb piazen bloku TASK, ml by bt blok dle [5] spoutn rr e y trvale s nejni monou prioritou vdy, kdy m procesor voln as. Podm zs z z z a yc nka tkaj y c se spoutn vdy, kdy m procesor voln as mus bt pro vytven softwarov PLC se z z a yc y ar e e modikovna. a V p e, e by toti vdy existovalo njak RT-Linuxov vlkno, kter m bet rpad z z z e e e a e a ez a tudz by nezstal dn voln procesorov as, nedostalo by se ke slovu pvodn u za y y y c u Linuxov jdra. To by vedlo k zatuhnut celho systmu. Proto jsou i tyto ulohy e a e e spoutny periodicky s t e periodu spoutn je mon zvolit z p se m, z se z e rkazovho dku. e ra y Deklarace piazen TASK k bloku PROGRAM je patrna z ukzky 7.3. Vznam rr a jednotlivch parametr je uveden v tab.7.2. y u
Ukzka 7.3: Piazen denovanho TASK k bloku typu PROGRAM v rmci bloku a rr e a RESOURCE.
1
48
Popis Uniktn nzev denovanho vlkna. a a e a Nzev bloku TASK, jeho parametry se pouij pi denici a z z r vlkna. a Nzev bloku typu PROGRAM, kter bude spoutn s a y se parametry TASK. Pokud m blok parametry, obsahuje rkou oddlen a ca e e parametry s piazenou hodnotou. Hodnota me bt bud rr uz y konstanta, adresa v pamti PLC nebo globln promnn. e a e a
Tabulka 7.2: Popis a vznam parametr pi denici spoutn programu. y u r se Ukzka 7.5 uvd vygenerovan kd v C++, kter odpov a denici z ukzky 7.4. a a y o y d a Je z n patrn, e kad vytvoen real-time vlkno je oznaeno pro plnova proces e z z e r e a c a c u jako vyu c FPU. Dvodem je monost vyuit datovho typu real kdekoliv v rmci zvaj u z z e a PLC programu. Z toho plyne nutnost zajistit bezkoniktn vyuit FPU v rmci celho z a e operan systmu. 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
49
#include <rtl_cpp.h> CMemory<PLC_MEMORY_SIZE> g_KernelPLCMemory; static void *PCallp1(void *pParms) { struct sched_param p; p.sched_priority = 50; pthread_setschedparam(pthread_self(), SCHED_FIFO, &p); pthread_make_periodic_np(pthread_self(), gethrtime(), 20000000); while(1) { pthread_wait_np(); if (CVariable<BOOL>("QX1.0", 0) != 0) { gprog_plcp_init.stav = CVariable<BIT>("QB0"); gprog_plcp_init.Function(); } } return NULL; } #define THREADS_COUNT 1 static pthread_t threads[THREADS_COUNT]; extern "C" { int init_module(void) { int iRetv = 0, iCount = 0; pthread_attr_t attr; __do_global_ctors_aux(); pthread_attr_init(&attr); pthread_attr_setfp_np(&attr); iRetv += pthread_create(&threads[iCount++], attr, PCallp1, NULL); return iRetv; } void cleanup_module(void) { for (int i = 0; i < THREADS_COUNT; i++) { pthread_delete_np(threads[i]); } __do_global_dtors_aux(); } } MODULE_LICENSE("GPL");
8.1
Knihovna
Podprn knihovna umonuj kompilaci kdu vygenerovanho pomoc konverzn u a z c o e ho programu plc2cpp se skld z nkolika st kter spolu navzjem souvisej Jednotliv a a e ca , e a . e c sti, kter jsou implementovny v rmci podprn knihovny, jsou na obr.8.1 oznaeny ca e a a u e v rmec s edm podkladem. a c ch s y Tab.8.1 uvd pehled jednotlivch t kter podprn knihovna implementuje. a r y rd, e u a Ke kad t e je zrove uveden jej krtk popis a vznam. z e rd a n a y y
8.1.1
Emulace p rstupu do pamti pomoc adres tak, jak je denovno v [5] implemene a tuje t CMemory1 . Ta pro p rda rstup do pamti umonuje adresaci dle normy vetn e z c e p rstupu na digitln vstupy/vstupy. V p e, e se jedn o adresu v intern PLC a y rpad z a pamti, je p e rstup zpracovn p a rmo t rdou CMemory. Pokud se jedn o p a rstup do pamti odpov c adresaci digitln vstup/vstup, e daj a ch u y u je pedno ovladai denovanmu t rzen r a c e rdou CPLCDrivers. Podrobnj popis lze e s nalzt v sti 8.2. e ca
1
51
Knihovna
8.1.2
Podpora promnnch je implementovna v template t CVariable2 . Tato template e y a rde t implementuje nsleduj operace: rda a c Specikovat datov typ promnn tak, jak je denovno v [5]. y e e a Specikovat inicializan hodnotu promnn pi deklaraci. c e e r Specikovat adresu v pamt ovm prostoru emulovanho PLC. Tato adresa samozejm e e e r e me bt i adresa vstupu nebo vstupu, je-li k tto adrese zaregistrovn nkter uz y y e a e y ovlada ve sprvci za (viz. dle). c a rzen a
2
52
Knihovna Popis T rda vyu a k deklaraci promnnch ve vygenzvan e y erovanm C++ kdu. Podporuje adresaci PLC pamti, e o e pokud m promnn tuto adresu v deklaraci specia e a kovnu. a T rda pou a ve vygenerovanm C++ kdu pro zvan e o reprezentaci vstupn ch parametr funkc funkn u , c ch blok a programovch blok. u y u T rda vyu a ve vygenerovanm C++ kdu pro zvan e o reprezentaci vstupn parametr funkn blok a y ch u c ch u programovch blok. y u T rda vyu a ve vygenerovanm C++ kdu pro zvan e o reprezentaci vstupn-vstupn parametr funkn e y ch u c ch blok a programovch blok. u y u T rda, kter implementuje emulaci PLC pamti, zaa e pouzduje funkcionalitu pro p r rstup k adresm vnitn a r pamti, vstupm a vstupm. Pro p e u y u rstup k vstupm a u vstupm vyu a instanci t CDeviceManager. y u zv rdy T reprezentuj aktuln hodnotu zsobn rda c a a ku. Virtuln t vyu a pro tvorbu ovlada vstup a a rda zvan cu u vstup. y u T rda spravuj instance jednotlivch ovlada a c y cu zajit uj mapovn adresy vstupu/vstupu na s c a y p sn ovlada za . rslu y c rzen T zapouzduj funkcionalitu mutex pro zamykn rda r c u a kritickch st ovlada PLC za . y ca cu rzen T rda zapouzduj funkcionalitu mutex pro zar c u mykn kritickch st ovlada PLC za (spina y ca cu rzen lock je funkn podobn mutexu. Rozd je v tom, c e y l e po uzamen oblasti pomoc spinlocku je zakzno z c a a peruen a tudz provdn kd neme bt peruen r s a e y o uz y r s schedulerem).
CPropertyIn
CPropertyOut
CPropertyIO
CMemory
CMutex CSpinLock
8.1.3
Podpora pro pedvn parametr programovm blok je implementovna v template r a a u y u a t ach CPropertyIn, CPropertyOut a CPropertyIO. Pi deklaraci parametru se denrd r uje typ parametru (vstupn vstupn vstupn-vstupn a dle se parametru piazuje , y , e y ) a rr
53
promnn reprezentovan t e a a rdou CVariable3 , kter se pou a v rmci vygenerovanho a zv a e C++ kdu v programovac jazyce PLC pro p o m rstup k hodnot parametru. e
8.1.4
Aktuln hodnota zsobn nebo t tzv. current-result je reprezentovna t a a ku, ez a rdou CRe4 sult . Tato t m nsleduj vlastnosti: rda a a c Uchovv vsledek posledn proveden operace vetn informace o jej datovm a a y e c e m e typu. Implementuje opertory pro matematick a porovnvac operace. a e a Umonuje nastavit aktuln hodnotu zsobn na hodnotu PLC promnn(template z a a ku e e t CVariable). rda Umonuje nastavit aktuln hodnotu zsobn na hodnotu PLC parametru z a a ku funkn nebo programovho bloku. c ho e
8.2
P rstup na hardwarov karty pro digitln vstupy/vstupy je rozdlen na dv urovn e a y e e e (viz. obr.8.1). Nejvy urove je reprezentovna t ss n a rdou CDeviceManager, kter je a volna z objektu CMemory (objekt pro emulaci pamti PLC). a e Tato t udruje seznam aktivn ovlada karet pro PLC, piem zajit uje rda z ch cu rc z s pedn voln ovladai p snho hardwarovho za a zpracovn poadavku. r a a c rslu e e rzen a z Vlastn seznam ovlada je vytvoen jako pole statick velikosti obsahuj odkazy cu r e c na jednotliv registrovan ovladae5 . Pi vyhledvn ovladae odpov c e e c r a a c daj mu zadan e adrese se cyklicky prochz toto pole a ovlada je zde vyhledn. Pokud by bylo pouito a c a z vt mnostv aktivn ovlada, pak by bylo mono vytvoit seznam ovlada jako e s z ch cu z r cu vyhledvac strom pro zven rychlosti vyhledn za , kter odpov a poadovan a ys a rzen e d z e adrese. Vzhledem k tomu, e lze pedpokldat za normln okolnost pouze jednotky z r a a ch pouitch ovlada, lze pouit een povaovat za dostaten efektivn z y cu z er s z c e . Nsledn je v pamt ovm kontextu linuxovho jdra k dispozici instance tohoto oba e e e e a a zv r y y jektu s nzvem g KernelPLCDrivers, kter je vyu ana vytvoenm softwarovm PLC a i zaregistrovanmi ovladai. Tato instance je vytvoena zaveden modulu plc devicemanager.o y c r m do linuxovho jdra a mus bt dostupn ped nahrn e a y a r a m: Vlastn modulu, kter reprezentuje emulovan PLC. ho y e
Ob template t jsou deklarovny se stejnm parametrem ablony (stejnm vnitn datovm e rdy a y s y r m y typem). 4 Implementace v souboru cresult.h 5 Je tedy teba bhem pekladu modul odhadnout, kolik ovlada bude maximln pouito a r e r u cu a e z velikost pole sprvn nastavit. a e
3
54
Jakhokoliv pou eho ovladae. e zvan c Modul lze zavst do pamti jedn z nsleduj ch zpsob6 : e e m a c u u V p e, e je softwarov PLC nainstalovno a modul je dostupn ve stanrpad z e a y dardn adresi modul jdra: m ar u a ]# modprobe plc_devicemanager V p e, e se modul nachz v jinm adresi7 : rpad z a e ar ]# insmod cesta/plc_devicemanager.o
8.2.1
Tvorbu ovladae I/O za lze rozdlit na dv sti: c rzen e e ca 1. Nejprve je teba vytvoit odvozenou t od t CDeviceDriver, kter impler r rdu rdy a e r rstupu na za . rzen mentuje virtuln metody t z ukzky 8.1 volan pi p a rdy a Popis virtuln metod je uveden v tab.8.2. a ch 2. Pot je teba vytvoit modul jdra RT-Linuxu, kter bhem svho zavdn do e r r a y e e a e pamti provede registraci instance t vytvoen v pedchoz kroku do sprvce e rdy r e r m a PLC za . Registrac do sprvce za ovlada oznm kter adresn rozsahy rzen a rzen c a , e vstup a vstup obsluhuje a maj mu tedy bt pedny. Registraci lze provst u y u y r a e metodou RegisterDriver() zkladn objektu CDeviceDriver. a ho Nzev metody a ReadAddress() SetAddress()
DriverInfo()
Virtuln metoda volan v p e, e je teba ze a a rpad z r za pe aktuln hodnotu zadan adresy. rzen r cst a e Virtuln metoda volan v p e, e je teba z proa a rpad z r gramu nastavit hodnotu nkter adresy, kter odpov a e e a d tomuto ovladai. c Metoda vracej nzev a popis ovladae. Je vyu ana c a c zv pi zobrazovn informac tkaj ch se ovladae. r a y c c
Tabulka 8.2: Popis virtuln metod denovanch ve t e CDeviceDriver. a ch y rd Jako p rklad pro tvorbu ovladae lze vyu komentovan zdrojov kdy vytvoench c zt e e o r y ovlada, kter jsou popsny nze. cu e a Kad z nsleduj ch ovlada umonuje pi zavdn modulu specikovat tak z y a c cu z r a e e PLC adresy, na kterch bude ovlada dostupn. Pehled je k dispozici v tab.8.3. y c y r Ovlada lze zavst do pamti pomoc nsleduj ho p c e e a c rkazu:
P rpadn lze zaveden modulu zajistit nap. startovac skriptem pi spoutn operan e r m r se c ho systmu. e 7 Cst cesta v um en modulu me bt absolutn nebo relativn cesta k modulu. a st uz y
6
55
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; ... };
Ukzka 8.1: Virtuln metody pro implementaci ovladae. a a c Parametr iladdr Popis Parametr specikuj zkladn adresu, na c a kter bude ovlada dostupn pi adresovn e c y r a vstup. Pokud je tedy nap. hodnota u r iladdr=10, bude prvn adresa za dos rzen tupn jako %IB10. Pokud parametr nen a specikovn, je za adresovno od %IB0. a rzen a Parametr specikuj zkladn adresu, na c a kter bude ovlada dostupn pi adresovn e c y r a vstup. Pokud je tedy nap. hodnota y u r oladdr=7, bude prvn adresa za dos rzen tupn jako %QB7. Pokud parametr nen a specikovn, je za adresovno od a rzen a %QB0.
oladdr
Tabulka 8.3: Pehled spolench parametr pro moduly ovlada. r c y u cu ]# insmod plc_lpt.o [iladdr=2] [oladdr=3] Parametry modulu jsou nepovinn, pedpokld se, e je ji zaveden modul sprvce e r a a z z a ovlada plc devicemanager.o. Nzev modulu plc lpt.o je teba samozejm nahradit cu a r r e 56
p snm nzvem modulu, kter chceme nahrt do pamti. rslu y a y a e Ovlada PCI karty Advantech c Ovlada dodan karty Advantech PCI LabCard 1750 je vytvoen velice jednodue. c e r s Ovlada si intern udruje informace o vech aktuln hodnotch vstup. Tyto c e z s a ch a y u hodnoty jsou pak ovladaem navrceny v p e, e uivatel z programu te hodnotu c a rpad z z c vstupu. Pokud uivatel zapse na vstup novou hodnotu, je intern informace aktualy z y izovna a na vstupy je okamit zapsna poadovan hodnota. V p e, e uivatel a y z e a z a rpad z z te hodnoty vstup, je aktuln hodnota z ana pi kadm poadavku. c u a sk r z e z Ovlada by bylo mono upravit tak, e by vzorkoval hodnoty pomoc vlastn realc z z ho time vlkna maximln p a a rpustnou frekvenc a uivatel by vdy z z z skal pouze aktuln a navzorkovanou hodnotu. Ovlada paraleln portu c ho Ovlada standardn paraleln portu je vytvoen s ohledem na ulohu otek c ho ho r rzen ac motorku. Popis a vznam jednotlivch adres je uveden v tab.8.4. y y Adresa 0x00 Velikost 1byte Vznam y Vstupn adresa, pi zpisu odpov a zpisu y r a d a na adresu 0x378 (zpisu na zkladn adresu a a paraleln portu). ho Vstupn adresa, pi ten odpov a ten r c d c adresy 0x379 (ten zkladn adresy parc a aleln portu + 0x1). ho Vstupn adresa, v p e, e obsahuje rpad z log.1, bylo vyvolno peruen od paraleln a r s ho portu. Po peten hodnoty je automaticky r c nastaveno zpt na log.0. e
0x00
1byte
0x01.0
1bit
Tabulka 8.4: Vznam jednotlivch adres ovladae paraleln portu. y y c ho Uloha motorku tento ovlada vyu a k vytvoen PID regultoru pro regulaci rzen c zv r a otek pomoc PID regultoru. ac a Nzev modulu ovladae 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 vstupn lze ca y ch z avat z user-space sti hodnoty promnnch PLC. sk ca e y
57
Pro komunikaci mezi kernel-space a user-space je vyuivno jedno RT-Linux FIFO z a pro zpis promnnch do PLC, jedno pro ten promnnch z PLC a jedno pro nasa e y c e y tavovn parametr ovladae. a u c Ovlada poskytuje 64 adres pro vstupy a 64 adres pro vstupy. Velikost pamti je c y e nastavovna pi kompilaci modulu pomoc makra PLC USPACE MEMORY. a r Tab.8.5 popisuje, k emu slou jednotliv real-time FIFO pou a ovladaem. c z a zvan c Index F irstF IF O + 0 Nzev a d R c FIFO Popis Slou k naprogramovn intervalu, se z a kterm je zas an obsah vnitn pamti y l r e ovladae. Pro zpis p c a rkazu slou struktura z struct PLCUserSpaceControl deklarovan a v hlavikovm souboru plc uspace.h. c e Do poloky struktury Command pat z r jedna z hodnot PLC SEND SET TIME, PLC SEND STOP, PLC RESET. Pokud r je hodnota PLC SEND SET TIME, pat do poloky iTime asov interval v [ms] z c y s jakm budou zas ana data. Popis jedy l notlivch p u je popsn v hlavikovm y rkaz a c e souboru. Slou k zpisu dat odpov ch jedz a daj notlivm vstupn adresm ovladae. Pi y m a c r zpisu mus bt zaslno najednou hodnota a y a vech vstup. s u Slou k z avn hodnot vstup a vstup z sk a u y u ovladae (obsah vnitn pamti ovladae). c r e c Struktura zas ych dat je patrna z lan obr.8.2.
F irstF IF O + 1
Vstupn FIFO
F irstF IF O + 2
Vstupn FIFO y
Tabulka 8.5: Popis jednotlivch RT FIFO vyu ych ovladaem pro komunikaci s y zvan c user-space. Ovlada je zaloen na nsleduj m principu: c z a c Po zaveden modulu ovladae (plc uspacedriver.o) do pamti se zaregistruje ve c e sprvci PLC za a oteve si 3 po sob nsleduj real-time fo8 . a rzen r e a c Pokud chce uivatel z avat hodnoty promnnch ze softwarovho PLC, oteve z sk e y e r si c FIFO a naprogramuje si interval, s jakm m bt do vstupn FIFO rd y a y y ho zas an aktuln stav vnitn pamti ovladae (adres). l a r e c
8
Pomoc parametru FirstFIFO pi zavdn modulu lze specikovat, jak nejni FIFO se pouije. r a e e zs z
58
Pokud chce uivatel nastavit nkter ze vstup ovladae, oteve si vstupn FIFO z e y u c r a zale do nho nov stav vech vstup. Tj. mus zapsat takov mnostv dat, s e y s u e z 9 kter odpov a velikosti vnitn pamti ovladae . e d r e c Obr.8.2 ukazuje strukturu dat, kter je zas ana ovladaem pi ten hodnot vstup a l c r c u 10 11 a vstup ovladae. Hlavika nabv vdy hodnoty I nebo O . Oba bloky jsou y u c c y a z vdy zas any za sebou. Pokud hlavika neobsahuje jednu z uvedench hodnot, pak z l c y zejm jsou data zas ana p s rychle a proces v user-space Linuxu je nest a r e l rli h cst. Dsledkem je, e data v FIFO jsou zahazovna. V tomto p e je vhodn provst u z a rpad e e reset ovladae (viz. popis c FIFO). c rd ho
Obrzek 8.2: Struktura bloku dat pi ten hodnot pamti ovladae. a r c e c Ovlada je uren zejmna pro monost vizualizace c procesu. Takto je tak c c e z rd ho e vyu an v rmci vzorov ulohy otek motorku. zv a e rzen ac Ovlada pro ladn programu c e Ovlada pro ladn programu emuluje vstupy a vstupy pomoc vnitn pamti, piem c e y r e rc z pi zmn hodnoty je vypsna na aktuln konzoli Linuxu nov hodnota nastavovan r e e a a a e promnn vetn informace o adrese, na kter se zmna udla. Pi ten hodnoty je na e e c e e e a r c konzoli vypsna informace o ten adrese a hodnot, kter se na n prv nachz a c e e a a e a . Tento ovlada je vhodn vyu c e zvat pouze v p e ladn pomalej program rpad e sch u vzhledem k (nebo doasn snzit frekvenci spoutn p snho RT vlkna), nebot c e s e rslu e a asov nronosti vstupu na linuxovou konzoli me pi astm p c e a c y uz r c e rstupu doj k nestat bilit celho systmu. e e e
8.3
Tato st souvis s pouitm pekladaem GCC a jeho vlastnostmi vyuitelnmi pi ca z y r c z y r pekladu programu. V p e kompilace vygenerovanho C++ kdu jinm pekladaem r rpad e o y r c je mon, e se vet potebnch symbol bude liit. z e z yc r y u s Pro peklada GCC je teba m v rmci jdra RT-Linuxu k dispozici modul rtl cpp, r c r t a a kter implementuje symboly pro nkter funkce a opertory potebn k bhu zkomy e e a r e e pilovanho kdu jazyka C++. Potebn symboly se mohou liit ze dvou dvod: e o r e s u u 1. Je pouita odlin verze pekladae GCC. z s a r c
Hodnota makra PLC USPACE MEMORY pi pekladu ovladae. r r c Pokud nsleduje blok s hodnotami vstup. a u 11 Pokud nsleduje blok s hodnotami vstup. a y u
10 9
59
2. Peklada GCC byl byl bhem sv kompilace zkompilovn s jinmi parametry. r c e e a y Souast distribuce RT-Linuxu je verze modulu, kter implementuje funkce fputs(), c a pure virtual(), cxa atexit(), this xmap does not exist(), assert fail(), isnan(). V bal RT-Linux Contrib je k dispozici novj verze modulu, kter nav oproti ku e s a c pvodn verzi implementuje opertory new, new[], delete, delete[]. Tyto opertory jsou u a a v podstat pouze pesmrovny tak, aby vyu e r e a zvaly voln standardn linuxovho kera ho e nelu pro dynamick alokace a dealokace pamti. Z toho plyne omezen e je lze vyu e e , z zt pouze bhem inicializace a deinicializace modulu jdra. Dostupnost tchto opertor je e a e a u c z a proto podm ena existenc makra CPP INIT . Nav tato verze umonuje linkovn n real-time modul sloench z v zdrojovch soubor. u z y ce y u Na piloenm CD je upraven verze pvodn modulu rtl cpp z RT-Linux Contrib, r z e a u ho kter je vyzkouena s kompiltory GCC 2.96 a GCC 3.2. Tato verze nav implementuje a s a c symbol cxa pure virtual(). Vzhledem k tomu, e kompiltor GCC lze kompilovat s mnoha rznmi parametry, z a u y me se stt, e v jin verzi, p uz a z e rpadn verzi z jin distribuce bude chybt njak dal e e e e y s symbol. Obvykle se jedn o rzn funkce se speciln vznamem, kter jsou v rmci a u e a m y e a normln program linkovny s defaultn funkcionalitou, lze je deklarovat podobn a ch u a e jako ve uveden symboly. ys e
60
9.1
V tto sti je uveden strun nvod ke zprovoznn softwarovho PLC. Nejprve je vak e ca c y a e e s teba m k dispozici funkn instalaci RT-Linuxu. Krtk nvod k jeho zprovoznn je r t c a y a e uveden v p rloze A. V p e, e je RT-Linux uspn nainstalovn, postup je nsleduj : rpad z es e a a c 1. Pipravte si zdrojov kdy projektu. Z r e o skat je lze bud z piloenho CD, nebo z r z e domovsk strnky projektu [2]. e a 2. Rozbal zdrojov kd do pracovn adrese1 : me y o ho ar ]# tar xzf SoftwarePLC-x.yy.tgz 3. Zmn aktuln adres na adres se zdrojovm kdem: e me a ar ar y o ]# cd SoftwarePLC-x.yy 4. Spust konguran skript2 : me c ]# ./configure
Znaky x.yy znamenaj verzi programu. V p e, e chcete zmnit nkter vchoz nastaven programu, lze pidat parametr help pro rpad z e e e y r npovdu o dostupnch parametrech. a e y
2 1
61
5. Nyn ji meme spustit kompilaci programu a podprnch modul jdra: z uz u y u a ]# make dep ]# make 6. Pokud se kompilace zdaila, je meme pistoupit k instalaci programu: r uz r ]# make install Instalace spo a v nakop an modul jdra se sprvcem ovlada za cv rov u a a cu rzen a jednotlivch ovlada do systmovho adrese s moduly jdra, instalaci poy cu e e ar a mocnho skriptu mkplc.sh pro vytven softwarovho PLC, instalaci preprocee ar e soru plc2cpp a instalaci pomocnch knihoven potebnch pro kompilaci PLC y r y programu do modulu jdra pomoc C++. a V tuto chv mme tedy k dispozici ve potebn pro vytven uivatelskch proli a s r e ar z y gram pro PLC. u
9.2
62
Vytven knihoven ar
9.3
Vytven knihoven ar
Vytven knihoven je velmi jednoduch. Sta vytvoit zdrojov soubor s jedn nebo ar e c r y m v bloky pro zpis programu (funkce, funkn blok, blok typu program). ce a c Knihovny se hledaj v nsleduj ch adres a c arch: Pokud je pi pekladu plc2cpp denovna hodnota makra PLC LIBDIRS, je r r a jeho hodnota pedpokldna jako : oddlen seznam dal adres, kde jsou r a a e y sch aru hledny objekty z knihoven. a Pokud je deklarovna promnn prosted PLC LIBDIR, je jej hodnota pedpokldna a e a r r a a jako : oddlen seznam dal adres, kde jsou hledny dal objekty z knie y sch aru a s hoven. Dal monost je parametr -L p s z rkazovho dku(viz.tab.9.1), kter me obsae ra y uz hovat rkou oddlen seznam adres, kde se tak mohou nachzet knihovn ca e y aru e a objekty. V p e, e knihovna pou a jinou knihovnu, lze ve zdrojovm kdu denovat rpad z zv e o zvislost zpsobem uvedenm v ukzce 9.1. a u y a
Ukzka 9.1: Denice vyuit jin knihovny ve zdrojovm kdu PLC. a z e e o Tato vlastnost nen v [5] denovna. Jedn se o rozren vytvoenho softwarovho a a s r e e PLC, kter je vytvoena za uelem komfortnj vytven knihoven i program v a r c e sho ar u jazyce Instruction List. V p e, e je nalezena direktiva Include: v komenti, kter za a na novm rpad z ar y cn e dku, jsou uveden soubory zpracovny stejn, jako by byly soust pvodn zdrora e a e ca u ho jovho kdu. Za direktivou me nsledovat jeden i v zdrojovch soubor, jejich e o uz a c ce y u z jednotliv nzvy jsou oddleny rkou. e a e ca
9.4
V tto sti je uveden jednoduch nvod k vytvoen softwarovho PLC za pomoci ve e ca y a r e ys vytvoenho programu. Podm r e nkou pro sprvnou funkci je samozejm zprovoznn a r e e e softwarov PLC a funkn RT-Linux. e c 63
Pedpokldejme, e chceme vytvoit projekt, kter se bude jmenovat foo, bude se r a z r y nachzet v domovskm adresi uivatele v podadresi s nzvem foo plc a bude se a e ar z ar a skldat ze dvou zdrojovch souboru foo1.plc a foo2.plc uloench p a y z y rmo v adresi ar projektu. Postup je tedy nsleduj : a c 1. Zalo nov projekt zme y tmp]# mkplc.sh --create foo --target-dir ~/foo_plc 2. Nyn pidme zdrojov soubory do Makele. Najdeme v adresi /foo plc soubor r a e ar Makele. Oteveme ho v obl em textovm editoru a najdeme dek: r ben e ra # FILES=deps/filename.plc Tento dek zmn na: ra e me FILES=deps/foo1.plc deps/foo2.plc 3. Nyn vytvo soubory obsahuj zdrojov kdy pro PLC v jazyce instruction rme c e o list foo1.plc a foo2.plc 4. Chceme-li provst kompilaci programu zadme na p e a rkazovm dku v adresi e ra ar projektu: foo_plc]# make
5. Pro sputn vytvoenho softwarovho PLC sta zadat3 : se r e e c foo_plc]# make start 6. Pro zastaven softwarovho PLC lze pou e zt: foo]# make stop
Skript pro vytven softwarovho PLC je koncipovn tak, aby byl co nejjednodu ar e a ss. Pedpokld, e zdrojov kdy pro PLC se budou nachzet p v adresi projektu, r a a z e o a rmo ar vygenerovan soubory budou ukldny do podadrese sources v adresi projektu a vye a a ar ar generovan modul jdra se bude jmenovat plc projekt.o. Dle je teba, aby v nkterm y a a r e e zdrojovm souboru pro PLC byl denovn blok typu CONFIGURATION s nzvem e a a
Pedpokld se, e je sputn RT-Linux a zaveden modul plc devicemanager.o, p r a a z se rpadn ovladae e c za , kter bude program vyu rzen e zvat.
3
64
shodnm s nzvem projektu (v naem p e by to tedy byl blok CONFIGURATION y a s rpad foo. V seznamu soubor, ze kterch se projekt skld je teba uvdt nzev souboru u y a a r a e a vetn podadrese deps. Dvodem je, e v tomto podadresi je uloen pomocn c e ar u z ar z y 4 soubor, kter obsahuje seznam d vygenerovanch soubor a zrove je vyu an y rve y u a n zv programem make, pro udrovn zvislost v projektu. z a a a a e o o a Ukzka 9.2 uvd zkladn kostru zdrojovho kdu PLC. V kdu je denovn jeden a blok typu program vyu c globln promnnou out, konguran blok (s nzvem zvaj a e c a stejnm jako nzev projektu - tedy foo) a spoutn programovho bloku prg rotace s y a se e periodou 0.5s. Zrove je v rmci komente na prvn dku uvedeno pouit 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
Ukzka 9.2: Ukzka kostry PLC programu. a a V p e sloitj projektu lze samozejm vygenerovan Makele upravit run, rpad z e sho r e y c e nebo vytvoit zcela nov soubor odpov c poadavkm. r y daj z u
Tento seznam je pou an pro smazn d vygenerovanch soubor v p e rekompilace. zv a rve y u rpad
65
Zvr a e
Ukolem diplomov prce bylo vytvoit pro operan systm RT-Linux softwarov vye a r c e e baven umonuj spoutt program zapsan v nkterm jazyce pro PLC, kter je z c se y e e y denovanm v norm IEC-1131-3. e e C prce se podailo splnit. Bylo vytvoeno softwarov PLC s takovmi zkladn l a r r e y a mi vlastnostmi, jak je denovno v norm IEC-1131-3. Pro implementaci byl zvolen jazyk a e Instruction List. Funkcionalita vytvoenho PLC odpov a poadavkm normy. Vbr r e d z u y e vlastnost byl proveden tak, aby bylo mono vyu vechny instrukce, bloky pro zpis z zt s a programu, promnn reprezentovan zstupnm jmnem i p e e e a y e rmou adresou. Dle je a mono vyu vechny zpsoby spoutn vlken PLC. Umysln nebyla implementovna z zt s u se a e a monost vyu z zvat zvorkovn aritmetickch operac Dle se nepoda implementoa a y . a rlo vat pedvn funkn blok v parametrech funkc funkn blok a blok typu r a a c ch u , c ch u u r y e r y program. V p rloze B je uveden pehled vlastnost denovanch v [5], kter vytvoen systm podporuje, p e rpadn nepodporuje. e Vzhledem k poteb vytvet knihovny, je mon pomoc direktivy Include:, um en r e ar z e st e uvnit komente denovat zvislost zdrojovho kdu na p sn knihovn. A to jak r ar a e o rslu e e v rmci koncovho programu uivatele, tak v rmci kterkoliv knihovn funkce. Bli a e z a e zs informace o tto vlastnosti lze nalzt v sti 9.3. e e ca Softwarov PLC bylo vytvoeno jako utilita (preprocesor) jazyka Instruction List e r do jazyka C++. Pro kompilaci do strojovho kdu je vyuit standardn linuxov kome o z y piltor. Pro kompilaci vygenerovanho C++ kdu je teba pomocn knihovna, kter a e o r a a je soust softwarovho PLC. ca e Vzhledem k volb pevdt PLC program na program v jazyce C++, byla zrove e r a e a n ovena monost vyu k tvorb RT-Linuxovch aplikac C++. Je vak teba se v er z zt e y s r programu dret omezen uvedench v sti 2.2. z y ca V rmci PLC programu je mon tak vyu a z e e zvat FPU pro matematick operace s e pohyblivou dovou rkou. Toho je doc ra ca leno t e kad vygenerovan vlkno m ve m, z z e e a a svch parametrech pi zakldn uvedeno, e vyu a FPU. y r a a z zv Souast vytvoenho PLC je tak nvrh pro modulrn tvorbu ovlada, kter c r e e a a cu e umonuj z PLC programu pistupovat na extern za . Modularita ovlada umonuje z r rzen cu z libovoln pou e PLC kongurovat dle dostupnho hardware. V rmci projektu byly e zvan e a vytvoeny ovladae pro paraleln port, ovlada umonuj komunikaci mezi uivatelskou r c c z c z st linuxu a softwarovm PLC s vyuit pro visualizaci eho procesu. Dle byl ca y z m rzen a vytvoen ovlada pro PCI kartu s digitln vstupy/vstupy. r c a mi y Funknost celho systmu byla ovena na PLC programu pro otek moc e e er rzen ac 66
d torku. R c program komplexn demonstruje vlastnosti a monosti vytvoenho softe z r e warovho PLC. Vyu a monost spoutn ulohy na zklad nbn hrany (men e zv z se a e a ez e er aktuln otek motorku), periodick spoutn programu pro regulaci otek pomoc a ch ac e se ac PID regultoru. Zrove je vyuit ovlada pro komunikaci s user-space RT-Linuxu. a a n z c Na vzorovm c programu byly tak otestovny rychlostn monosti softwarovho e rd m e a z e PLC. Na po ci Intel Pentium 3 700MHz bylo vyykoueno cyklick spoutn vlken cta s e se a PLC programu s periodou krat ne 100[s]. s z Vytvoen softwarov PLC je um eno na internetov adrese [2] jako projekt pod r e e st e licenc GPLv2. Na tto adrese je t mon nalzt p e ez z e e rpadn dal upravy a opravy e s programu.
67
Tj. soubor jeho aplikac na pvodn linuxov jdro z ame jdro s podporou real-time extenze. z u e a sk a
68
INSTALACE RT-LINUXU
]# rm -f /usr/src/linux ]# ln -s /usr/src/linux-2.4.20 /usr/src/linux Nyn najdeme v adresi rtlinux-3.2-pre1/patches patch na pouitou verzi jdra. ar z a Nyn aplikujeme patch (za pedpokladu, e jsme nali 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_patch2.4.20-rtl3.2-pre1 Provedeme konguraci linuxovho jdra (je teba vybrat vechny potebn ovladae e a r s r e c 2 a podporu modul ) u ]# make menuconfig Nyn ji meme provst kompilaci jdra a nainstalovat nov moduly: z uz e a e ]# make bzImage modules modules_install Zbv jet nakongurovat 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 mme k dispozici zkompilovanou verzi linuxovho jdra s podporou real z a e a time extenze a moduly RT-Linuxu, kter po zaveden do jdra linuxu aktivuj real-time e a rozren (a tedy tak RT-Linux). Zaveden tchto modul lze provst nap. pomoc s e e u e r 3 p rkazu : /etc/rc.d/rtlinux start Dal informace lze nalzt krom internetu tak v souborech README, p s e e e rpadn e INSTALL, kter se nachzej v adres s Linuxem, p e a arch rpadn RT-Linuxem. e
Podpora modul je teba pro kompilaci RT-Linuxovch modul. u r y u Cesta ke spoutc s e mu skriptu se me liit v zvislosti na parametrech zvolench pi kompilaci uz s a y r RT-Linuxu a na pouit distribuci linuxu z e
3
69
1-2
Mal p a smena
Ano
Ano Ne Ne Ne Ne
Programovn a pomoc ebckovch z r y diagram nen k u dispozici. Viz. poznmka v kapia tole 5.
1-5b 1-6a
Zvorkov operace a e
Ne 70
Komente ar
Poznmka a
Na samostatnm e dku i na dku s ra ra kdem o programu. Zrove vyuito k a n z denici zvislosti a na knihovnch (viz. a kapitola 9).
4-1 4-2 4-3 4-4 4-5 4-6 4-7 4-8 5-1 6-1 6-2 6-3 6-4 6-5 6-6 6-7 6-8 7-1a 7-1b 7-2a 7-2b 8-1 8-2 8-3 8-4 8-5 8-6
Ano Ano Ano Ano Ano Ano Ano Ano Ne Ne Ne Ne Ne Ne Ne Ne Ne Ano Ano Ano Ano Ne Ne Ne Ne Ne Ne
Casov konstanty e
71
Tab.-. c 10-1 10-2 10-3 10-4 10-5 10-6 10-7 10-8 10-9 10-10 10-11 10-12 10-13 10-14 10-15 10-16 10-17 10-18 10-19 10-20 12-1 12-2 12-3 12-4 12-5 14-1
datov e
Podporovno a Ano Ano Ano Ano Ano Ano Ano Ano Ano Ano Ne Ano Ne Ne Ne Ne Ano Ano Ano Ano Ne Ne Ne Ne Ne Ne
Poznmka a
14-2 14-3 14-4 14-5 14-6 15-1 15-2 15-3 15-4 15-5 15-6
P a adresace rm
Tab.-. c 15-7 15-8 15-9 16-1 16-2 16-3 16-4 16-5 16-6 16-7 16-8
Popis
Bloky promnnch e y
Podporovno a Ano Ano Ano Ano Ano Ano Ano Ano Ano Ne Ano
Poznmka a
Deklarace promnnch e y
Ano Ano Ano Ano Studen y restart nen mon bnmi z e ez y prostedky v RTr Linuxu zpracovat. Klcov slovo e RETAIN je ignorovno, promnn a e e si po restartu nezachovvaj svoji hoda notu. Pole nejsou porovna. a pod-
17-3 17-4 17-5 17-6 17-7 17-8 18-1 18-2 18-3 18-4
Inicializace promnnch e y
73
Tab.-. c 18-5
Popis
Podporovno a Ano
33-5a 33-5b 33-6a 33-6b 33-7a 33-7b 33-8a 33-8b 33-9a 33-9b 49-1
Ne Ne Ne Ne Ne Ne Ne Ne Ne Ne Ano
Spoutn se je ve skutenosti c nahrazeno periodickm y spoutn s e m. Bli informace lze z s nalzt v kapitole 7. e
49-6a 49-6b
Ano Ne 74
Popis
Podporovno a Ano Ne
49-8a 49-8b 49-9a 49-9b 49-10a 49-10b 49-10c 49-10d 49-10e 49-10f 50-1a 50-1b 50-2a 50-2b 50-3a 50-3b 50-4a 50-4b 50-5a 50-5b 51-1 52-1 52-2 52-3 52-4 52-5 52-6 52-7 52-8 52-9 52-10 52-11 52-12 52-13 52-14
Ano Ano Ano Ano Ne Ne Ne Ne Ne Ne Ano Ano Ne Ne Ano Ne Ne Ne Ne Ano Ano Ano Ano Ano Ano Ano Ano Ano Ano Ano Ano Ano Ano Ano Ano
Instrukce jazyka IL
75
Popis
Poznmka a
Voln a blok u
funkn c ch
Ano Ano Ne Ne
Ne Ne Ne Ne Ne Ne Ne Ne Ne
76
C.1
d R c program motorku
d R c program motorku je koncipovn jako program pro PLC v jazyce Instruction List a a jako takov je zpracovn vytvoenou utilitou plc2cpp. Nsledn je zkompilovn do y a r a e a modulu RT-Linuxovho kernelu. Rychlost oten je e ac rzena genertorem PWM. a Sn an smru a rychlosti oten i vlastn prob a pomoc paraleln portu m e ac rzen h ho (je tedy vyu an vytvoen ovlada paraleln portu). zv r y c ho Velikost otek (dan veliina) se nastavuje z user-space s vyuit p snho ac za a c z m rslu e ovladae. Lze ji tedy dynamicky mnit za bhu programu. Stejn tak jsou pedvny c e e e r a a aktuln men otky do user-space RT-Linuxu. a er e ac Program se skld ze t periodicky spoutnch program s nleduj m vznamem: a a r se y u a c y 1. Sn an potu impulz vygenerovanch inkrementln idlem um enm na m c u y a m c st y h rdelce motorku. Z generovanch impuls je zrove urovn smr oten y u a n c a e ac . 2. Pravideln pevod potu vygenerovanch impuls na otky za sekundu. Hodnota y r c y u ac otek je kladn pro jeden smr a zporn pro smr druh. ac a e a a e y 77
Vizualizan program c
3. Vlastn vpoet c veliin. Skld se z vyhodnocen regulan odchylky, y c rd ch c a a c vpotu PID regultoru a generovn PWM. y c a a Cel c program lze nalzt v podadresi plc/motorek v archivu se softwarovm y rd e ar y PLC.
C.2
Vizualizan program c
Vizualizan program je vytvoen jako jednoduch aplikace pro X-Windows. Ke sv c r a e innosti vyu a objektovou aplikan knihovnu wxWindows (viz. adresa [3]). c zv c Program demonstruje monosti vyuit PLC, piem m tyto vlastnosti: z z rc z a Umonuje nastavit poadovan otky motorku (tj. s vyuit ovladae pro koz z e ac z m c munikaci PLC s user-space RT-Linuxu zapse tuto hodnotu do pamt ovho pros e e 1 toru softwarovho PLC ). e Gracky zobrazuje aktuln otky motorku tak jak je m softwarov PLC (tj. a ac er e tyto otky jsou teny z pamt ovho prostoru softwarovho PLC). Dle zobrazuje ac c e e e a aktuln poadovanou hodnotu otek, tak jak ji nastavil uivatel. Vzhled aplikace a z ac z je patrn z obr.C.1. y Vizualizan program je dostupn v podadresi visualisation softwarovho PLC. c y ar e
78
Vizualizan program c
79
rtlinux plc
80
Literatura
[1] Domovsk strnky projektu RT-Linux [online]. e a <http://www.rtlinux.org>. [2] Domovsk strnky projektu Softwarov PLC pro RT-Linux [online]. e a e <http://sourceforge.net/projects/softwareplc>. [3] Domovsk strnky 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, Bezen 1993. r [6] A.M. Kuchling. Regular Expression HOWTO [online]. <http://www.amk.ca/python/howto/regex>. s [7] Melichar, Ceka, Jeek, and Richta. Konstrukce peklada 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