SlideShare a Scribd company logo
1 of 88
Download to read offline
CESKE VYSOKE UCEN´ TECHNICKE V PRAZE
ˇ   ´      ´ ˇ I           ´

            Fakulta elektrotechnick´
                                   a




     Softwarov´ PLC
              e
           Diplomov´ pr´ce
                   a a




               Vladim´r Kloz
                     ı
    Vedouc´ pr´ce: Ing. Frantiˇek Vacek
          ı a                 s




                  Praha, 2003
Prohl´ˇen´
     as ı

Prohlaˇuji, ˇe jsem diplomovou pr´ci vˇetnˇ doprovodn´ho programov´ho vybaven´
      s     z                    a    c e            e              e          ı
vypracoval samostatnˇ s pouˇit´ uveden´ literatury a konzultac´ s vedouc´ diplo-
                     e      z ım        e                     ı         ım
mov´ pr´ce Ing. Frantiˇkem Vackem.
    e a               s

    Nem´m z´vaˇn´ d˚vod proti uˇit´ tohoto ˇkoln´ d´ ve smyslu § 60 Z´kona
        a   a z y u               z ı        s    ıho ıla                     a
ˇ.121/2000 Sb. , o pr´vu autorsk´m, o pr´vech souvisej´ ıch s pr´vem autorsk´m a o
c                    a          e       a             ıc´       a           y
zmˇnˇ nˇkter´ch z´kon˚ (autorsk´ z´kon).
   e e e    y     a    u        y a

   V Praze dne: 13.ledna 2004                           Vladim´ Kloz
                                                              ır
Podˇkov´n´
   e   a ı

Dˇkuji panu Ing. Frantiˇku Vackovi za cenn´ rady a pˇipom´
  e                     s                  e        r    ınky, kter´ mi poskytl
                                                                   e
bˇhem konzultac´ pˇi zpracov´n´ diplomov´ pr´ce.
 e             ı r          a ı         e a

                                                                  Vladim´ Kloz
                                                                        ır




                                      2
Abstrakt
C´ılem t´to diplomov´ pr´ce je vytvoˇit softwarov´ PLC s vlastnostmi definovan´mi v
         e             e a             r          e                            y
normˇ IEC-1131-3, kter´ bude fungovat pod operaˇn´ syst´mem Real-Time Linux.
      e                   e                          c ım      e
Cel´ syst´m je vytvoˇen jako preprocesor ze zvolen´ho programovac´ jazyka pro PLC
    y      e          r                            e                ıho
(zvolen byl jazyk Instruction List) do jazyka C++.
     V´sledkem pˇekladu programu pro PLC je modul zavediteln´ do oblasti kernelu
      y           r                                               y
operaˇn´ syst´mu Real-Time Linux, kter´ prezentuje program pro PLC.
       c ıho     e                          y
     Souˇast´ pr´ce je tak´ vytvoˇen´ z´kladn´ podpory pro pˇ´
        c´ ı a            e      r ı a       ı              rıstup z PLC programu na
zaˇ´ ı digit´ln´ vstup˚/v´stup˚ (implementov´ny jsou napˇ. ovladaˇe pro paraleln´
   rızen´     a ıch        u y      u              a            r       c          ı
port, ovladaˇ PCI karty Labcard PCI-1750 atd.).
             c

Abstract
The intention of this thesis to realize software PLC with features defined in the norm
IEC-1131-3, which will run under Real-Time Linux operating system. The system is de-
signed as preprocesor from selected programming language for PLC (selected language
was Instruction List) into C++ language.
    The result of PLC program compilation is Real-Time Linux kernel module, that is
representing software PLC.
    The part of this thesis is also creation of basic support for access to digital in-
puts/outputs from PLC program (implemented are drivers for parallel port, PCI card
PLX-1750 etc.).




                                          3
Obsah

´
Uvod                                                                                                                   1

1 N´vrh ˇeˇen´
    a   r s ı                                                                                                          3
  1.1 Funkˇn´ ˇ´st pro user-space . . . . . . . . . . . . . . . . . . . . . . . .
          c ı ca                                                                                                       6
  1.2 Funkˇn´ ˇ´st pro kernel-space . . . . . . . . . . . . . . . . . . . . . . .
          c ı ca                                                                                                       6

2 RT-Linux                                                                                                              7
  2.1 Princip ˇinnosti RT-Linuxu . . . . . . . .
              c                                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
      2.1.1 Definice hard real-time syst´mu . .
                                         e             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
      2.1.2 Popis RT-Linuxu . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
      2.1.3 Princip ˇinnosti . . . . . . . . . . .
                      c                                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
      2.1.4 Vyuˇit´ matematick´ho koprocesoru
                  z ı           e                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
  2.2 RT-Linux a C++ . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
      2.2.1 Dynamick´ alokace pamˇti . . . . .
                        a            e                 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
      2.2.2 Oˇetˇen´ chyb - exceptions . . . . .
                s r ı                                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
      2.2.3 Pouˇit´ C++ templates . . . . . . .
                  z ı                                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10

3 Lexik´ln´ anal´za zdrojov´ho k´du
       a ı       y            e     o                                                                                  11
  3.1 Lexik´ln´ anal´za zdrojov´ho k´du . . . . . . .
           a ı      y           e    o                             .   .   .   .   .   .   .   .   .   .   .   .   .   12
      3.1.1 Struktura zdrojov´ho k´du pro LEX . .
                               e    o                              .   .   .   .   .   .   .   .   .   .   .   .   .   12
  3.2 Popis gramatiky jazyka . . . . . . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   15
      3.2.1 Struktura zdrojov´ho souboru pro YACC
                               e                                   .   .   .   .   .   .   .   .   .   .   .   .   .   15
  3.3 Princip spolupr´ce program˚ LEX a YACC . .
                      a           u                                .   .   .   .   .   .   .   .   .   .   .   .   .   17

4 Zpracov´n´ promˇnn´ch PLC programu
          a ı       e y                                                                                                20
  4.1 Princip zpracov´n´ promˇnn´ch . . . . .
                       a ı    e y                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
  4.2 Deklarace promˇnn´ch . . . . . . . . . .
                       e y                         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
      4.2.1 Pˇ´ e adresy . . . . . . . . . . .
               rım´                                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
  4.3 Pˇehled blok˚ pro deklaraci promˇnn´ch
        r         u                   e y          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      4.3.1 Glob´ln´ promˇnn´ . . . . . . . .
                  a ı       e e                    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      4.3.2 Extern´ promˇnn´ . . . . . . . . .
                    ı      e e                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
      4.3.3 Lok´ln´ promˇnn´ . . . . . . . . .
                 a ı       e e                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
      4.3.4 Vstupn´ promˇnn´ . . . . . . . .
                     ı     e e                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
      4.3.5 V´stupn´ promˇnn´ . . . . . . . .
               y       ı     e e                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25

                                          i
4.3.6 Vstupnˇ/v´stupn´ promˇnn´
                    e y       ı     e e               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
   4.4 Implementace promˇnn´ch . . . . .
                         e y                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
       4.4.1 Parser zdrojov´ho k´du . . .
                            e   o                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
       4.4.2 Vygenerovan´ zdrojov´ k´d
                          y       y o                 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27

5 Zpracov´n´ jazyka IL
          a ı                                                                                                                         30
  5.1 Pˇiˇazovac´ instrukce . . . . . .
        rr       ı                           .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31
  5.2 Logick´ instrukce . . . . . . . .
            e                                .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   32
  5.3 Aritmetick´ instrukce . . . . . .
                 e                           .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   32
  5.4 Porovn´vac´ instrukce . . . . . .
             a ı                             .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   34
  5.5 Instrukce ˇ´ ı toku programu
                rızen´                       .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   34
      5.5.1 Vol´n´ funkc´ . . . . . .
                 a ı      ı                  .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36

6 Zpracov´n´ programov´ch blok˚
         a ı               y          u                                                                                               38
  6.1 Funkˇn´ bloky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
          c ı                                                                                                                         38
  6.2 Programov´ bloky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
                e                                                                                                                     42
  6.3 Funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  43

7 Konfigurace softwarov´ho PLC
                         e                                                                                                            46
  7.1 Struktura bloku RESOURCE . . . . . . . . . . . . . . . . . . . . . . .                                                          46
      7.1.1 Struktura blok˚ TASK . . . . . . . . . . . . . . . . . . . . . . .
                           u                                                                                                          47
      7.1.2 Struktura blok˚ PROGRAM . . . . . . . . . . . . . . . . . . . .
                           u                                                                                                          48

8 Podpora pro RT-Linux                                                                                                                51
  8.1 Knihovna . . . . . . . . . . . . . . . . . . . . . . . . . . .                                      .   .   .   .   .   .   .   51
      8.1.1 Emulace pamˇti PLC . . . . . . . . . . . . . . . . .
                          e                                                                               .   .   .   .   .   .   .   51
      8.1.2 Podpora promˇnn´ch PLC . . . . . . . . . . . . . .
                            e y                                                                           .   .   .   .   .   .   .   52
      8.1.3 Podpora parametr˚ pro vol´n´ programov´ch blok˚
                               u         a ı             y        u                                       .   .   .   .   .   .   .   53
      8.1.4 Emulace aktu´ln´ hodnoty z´sobn´
                           a ı            a     ıku . . . . . . . .                                       .   .   .   .   .   .   .   54
  8.2 Ovladaˇe karet digit´ln´ vstup˚/v´stup˚ . . . . . . . . .
            c             a ıch       u y        u                                                        .   .   .   .   .   .   .   54
      8.2.1 Tvorba ovladaˇe I/O karty . . . . . . . . . . . . . .
                            c                                                                             .   .   .   .   .   .   .   55
  8.3 Podpora C++ v RT-Linuxov´m kernelu . . . . . . . . . .
                                  e                                                                       .   .   .   .   .   .   .   59

9 Pouˇit´ softwarov´ho PLC
      z ı            e                                                                                                                61
  9.1 Instalace softwarov´ho PLC .
                          e              .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   61
  9.2 Parametry pˇ´rıkazov´ho ˇ´dku
                           e ra          .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   62
  9.3 Vytv´ˇen´ knihoven . . . . . .
           ar ı                          .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   63
  9.4 Vytvoˇen´ softwarov´ho PLC .
            r ı             e            .   .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   63

Z´vˇr
 a e                                                                                                                                  66

A Instalace RT-Linuxu                                                                                                                 68

B Kompatibilita s normou IEC-1131-3                                                                                                   70


                                             ii
ˇ ızen´ motorku pomoc´ softwarov´ho PLC
C R´    ı                 ı            e                                             77
       ˇ ıd´ ı
  C.1 R´ ıc´ program motorku . . . . . . . . . . . . . . . . . . . . . . . . . .     77
  C.2 Vizualizaˇn´ program . . . . . . . . . . . . . . . . . . . . . . . . . . . .
               c ı                                                                   78

D Obsah pˇiloˇen´ho CD
         r z e                                                                       80

Literatura                                                                           81




                                          iii
´
Uvod

C´ılem t´to pr´ce je vytvoˇit takzvan´ Softwarov´ PLC. Pod pojmem Softwarov´ PLC
          e        a                r               e               e                                           e
si v naˇem pˇ´ e pˇedstavujeme softwarov´ emul´tor programov´ k´du urˇen´ho
          s        rıpadˇ r                                      y         a                     e o            c e
pro PLC. Tento emul´tor by mˇl b´t vytvoˇen pod operaˇn´ syst´mem RT-Linux
                               a              e y               r                  c ım          e
na procesorov´ platformˇ Intel, mˇl by podporovat vybran´ programovac´ jazyk pro
                    e             e               e                                y                     ı
PLC a komunikovat s PCI kartou digit´ln´ vstup˚/v´stup˚. PLC by mˇlo splˇovat
                                                        a ıch            u y         u                  e        n
vlastnosti definovan´ normou IEC-1131[5].
                           e
     PLC je zkratka pro programovateln´ logick´ automat. Jedn´ se o zaˇ´ ı urˇen´
                                                        y          y                     a             rızen´ c e
zejm´na pro ˇ´ ıc´ a regulaˇn´ techniku. V podstatˇ je to mikroprocesorem osazen´
      e            rıd´ ı               c ı                               e                                            y
syst´m obvykle umoˇnuj´ ı rozˇ´ren´ o dalˇ´ moduly (napˇ. moduly digit´ln´ vstup˚/v´-
     e                     zˇ ıc´ sıˇ ı                  sı                  r                    a ıch            u y
stu-p˚, A/D a D/A pˇevodn´
       u                        r         ıky, moduly pro pr˚myslov´ sbˇrnice atd.). Ve vˇtˇinˇ
                                                                       u        e e                              es e
pˇ´ u lze tyto syst´my programovat pomoc´ tˇech z´kladn´ programovac´ jazyk˚:
  rıpad˚                    e                                  ı r        a       ıch                     ıch         u
IL (instruction list - obdoba assembleru, ST (structured text - obdoba jazyka Pascal)
a tzv. ˇebˇ´ckov´ch diagram˚. Instrukˇn´ soubor je velmi jednoduch´ se zamˇˇen´ na
         z rıˇ y                        u             c ı                                     y            er ım
ˇ´ ı a regulaci. Programovac´ jazyky pro PLC jsou detailnˇ pops´ny v [5].
rızen´                                     ı                                        e        a
     Operaˇn´ syst´m Linux je volnˇ ˇiˇiteln´ syst´m Unix dostupn´ vˇetnˇ zdrojov´ch
             c ı        e                         esr       y        e                      y c e                   y
k´d˚. Vlastn´ Linux je pouze j´dro operaˇn´ syst´mu. Operaˇn´ syst´m je ˇ´ren v
  o u             ı                          a              c ıho         e               c ı         e        sıˇ
distribuc´ 1 , kter´ kromˇ j´dra operaˇn´ syst´mu obsahuj´ tak´ dalˇ´ utility a pro-
            ıch          e         e a                 c ıho         e               ı      e      sı
gramy. Na z´kladˇ klasick´ho j´dra (kernelu) byl n´slednˇ vytvoˇen tzv. RT-Linux.
                 a       e            e      a                            a       e          r
Jedn´ se o rozˇ´ren´ kernelu o vlastnosti hard real-time operaˇn´ syst´mu, pˇiˇemˇ
      a              sıˇ ı                                                             c ıho          e         rc z
jsou zachov´ny pˇedchoz´ v´hody norm´ln´ j´dra a pˇ´
                a       r          ı y                   a ıho a               rıpadn´ zvolen´ distribuce ve
                                                                                        e           e
smyslu existence a pouˇitelnosti ovladaˇ˚ zaˇ´ ı a utilit. Vlastn´ real-time ukoly pot´
                               z                       cu rızen´                          ı                ´           e
bˇˇ´ s vyˇˇ´ prioritou neˇ linuxov´ j´dro jako real-time vl´kna v pamˇt ov´m prostoru
  ezı       ssı                   z            e a                              a                 e’ e
j´dra.
 a
     V ˇasti 1 je uveden rozbor ˇeˇen´ a volba n´sledn´ implementace. Kapitola 2 se
         c´                                  r s ı                   a       e
v kr´tkosti zab´v´ histori´ a vlastnostmi operaˇn´ syst´mu RT-Linux a moˇnostmi
      a               y a           ı                              c ıho        e                             z
jazyka C++ pˇi vyuˇit´ v RT-Linuxu. Kapitola 3 se zab´v´ zp˚sobem zpracov´n´ zdro-
                    r      z ı                                               y a u                           a ı
jov´ho programu pro PLC pomoc´ koneˇn´ho stavov´ho automatu. Kapitoly 4, 5, 6 a 7
    e                                           ı       c e              e
se vˇnuj´ zpracov´n´ jednotliv´ch ˇ´st´ zdrojov´ho k´du. Kapitola 2.1 popisuje zp˚sob
     e ı                a ı               y ca ı                  e      o                                        u
implementace a podpory v operaˇn´ syst´mu RT-Linux, vˇetnˇ vytv´ˇen´ ovladaˇ˚
                                                c ım         e                       c e            ar ı             cu
zaˇ´ ı pro vyuˇit´ v softwarov´m PLC. Kapitola 9 popisuje vlastn´ utilitu plc2cpp a
   rızen´              z ı                   e                                                 ı
jej´ vyuˇit´ pˇi tvorbˇ softwarov´ho PLC. Pˇ´
   ı      z ı r              e                e                rıloha B uv´d´ celkov´ pˇehled vlastnost´
                                                                              a ı           y r                         ı
vytvoˇen´ho softwarov´ho PLC v porovn´n´ s normou IEC-1131-3. V pˇ´
        r e                    e                          a ı                                      rıloze A je uve-
   1
       Napˇ. RedHat Linux, Debian, Slackware atp.
          r


                                                          1
OBSAH                                                                   OBSAH


den kr´tk´ n´vod na zprovoznˇn´ RT-Linuxu. Pˇ´
      a y a                 e ı             rıloha C se kr´tce zab´v´ vytvoˇen´m
                                                          a       y a      r y
uk´zkov´m PLC programem pro ˇ´ ı ot´ˇek stejnosmˇrn´ho motorku.
  a     y                       rızen´ ac           e e




                                       2
Kapitola 1

N´vrh ˇeˇen´
 a    r s ı

Norma IEC-1131-3 zab´vaj´ ı se problematikou programovac´ jazyk˚ pro PLC defin-
                       y ıc´                                 ıch     u
uje z´kladn´ programovac´ jazyky uveden´ v tab.1.1. Jazyky IL, ST a LD maj´ tu
      a     ı             ı                e                                        ı
v´hodu, ˇe jsou mezi sebou navz´jem pˇevoditeln´, pro vlastn´ kompilaci programu
 y       z                        a      r         e             ı
staˇ´ implementace libovoln´ho z nich a n´sledn´ vytvoˇen´ konverzn´ utility z ostatn´
   cı                       e            a     e      r ı          ı                  ıch
programovac´ jazyk˚.
              ıch     u

               N´zev jazyka
                 a                Popis
               IL                 Instruction List - jednoduch´ programovac´
                                                               y            ı
                                  jazyk, obdoba assembleru.
               ST                 Structured Text - pokroˇilejˇ´ programovac´
                                                          c sı              ı
                                  jazyk, obdoba jazyka Pascal ˇi C.
                                                               c
               LD                 Ladder diagram - grafick´ n´stroj pro pro-
                                                           y a
                                  gramov´n´ PLC, automat se v tomto pˇ´ e
                                          a ı                          rıpadˇ
                                  programuje pomoc´ rel´ov´ho schematu.
                                                     ı e e


          Tabulka 1.1: Pˇehled programovac´ jazyk˚ pro PLC dle IEC-1131-3.
                        r                 ıch    u

    Pro z´pis programov´ho k´du PLC byl zvolen jazyk IL s podporou standardn´
         a                e     o                                                     ıch
datov´ch typ˚, ˇ´
       y      u cıseln´ch typ˚ (pro cel´ i desetinn´ ˇ´
                      y       u        a            a cısla) a datov´ho typu pro uloˇen´
                                                                    e                z ı
     1
ˇasu . Z blok˚ pro z´pis vlastn´ PLC programu byly vybr´ny bloky uveden´ v tab.1.2.
c            u      a          ıho                           a               e
    D´le se budeme zab´vat anal´zou moˇn´ch ˇeˇen´ a n´slednou volbou vlastn´ im-
       a                 y         y       z y r s ı         a                     ı
plementace.
    Celkovˇ lze probl´m ˇeˇit bud’ jako interpret zdrojov´ho k´du pro PLC nebo jako
           e          e r s                                e     o
pˇekladaˇ PLC k´du do jin´ho programovac´ jazyka, ze kter´ho bude n´slednˇ zkom-
  r      c       o          e                ıho                e         a     e
pilov´na bin´rn´ podoba programu, kter´ odpov´ a programu PLC.
      a      a ı                         y        ıd´

  1. Interpret PLC k´du - v´hodou tohoto ˇeˇen´ je jednoduˇˇ´ pouˇit´ z hlediska
                       o       y               r s ı         ssı    z ı
     uˇivatele. Odpad´ totiˇ nutnost po kaˇd´ zmˇnˇ programu prov´dˇt jeho rekom-
      z              a     z              z e    e e             a e
     pilaci.
  1
      Tento datov´ typ je tˇeba zejm´na kv˚li definici spouˇtˇn´ PLC program˚ v konfiguraˇn´ bloku.
                 y         r        e     u               se ı             u           c ım

                                                3
NAVRH RESEN´
 ´    ˇ ˇ I



       N´zev bloku
        a                      Popis
       FUNCTION                Blok typu funkce. Jedn´ se o blok umoˇnuj´ ı
                                                            a                   zˇ ıc´
                               volat k´d PLC programu s alespoˇ jedn´
                                          o                                  n         ım
                               vstupn´ parametrem a n´vratovou hodno-
                                         ım                       a
                               tou, kter´ se po n´vratu z vol´n´ uloˇ´ jako
                                            a          a                a ı     zı
                               aktu´ln´ pracovn´ hodnota na z´sobn´
                                      a ı            ı                  a      ıku. Pˇi r
                               kaˇd´m vol´n´ jsou opˇtovnˇ inicializov´ny
                                   z e        a ı           e        e               a
                               vˇechny promˇnn´.
                                 s                e e
       FUNCTION BLOCK          Funkˇn´ blok. Jedn´ se o blok, kter´ m˚ˇe
                                       c ı               a                     y uz
                               m´ libovoln´ poˇet vstupn´ v´stupn´ a
                                  ıt           y c                 ıch, y          ıch
                               vstupnˇ-v´stupn´ parametr˚. Pˇi pouˇit´
                                         e y         ıch               u r           z ı
                               funkˇn´ bloku se nejprve deklaruje jeho in-
                                      c ıho
                               stance jako lok´ln´ promˇnn´. Vnitˇn´ stav
                                                    a ı         e a           r ı
                               instance funkˇn´ bloku z˚st´v´ zachov´n
                                                  c ıho             u a a              a
                               po dobu existence promˇnn´, kterou je tato
                                                              e e
                               instance reprezentov´na.   a
       PROGRAM                 Programov´ blok. Jedn´ se o obdobu bloku
                                              y              a
                               typu FUNCTION BLOCK s t´ rozd´            ım        ılem,
                               ˇe existuje pouze jedna instance tohoto
                               z
                               bloku, kter´ je platn´ po celou dobu
                                                a             a
                               bˇhu programu. V programu nen´ tˇeba
                                 e                                             ı r
                               deklarovat promˇnnou, kterou je reprezen-
                                                     e
                               tov´na pouˇ´ a instance.
                                    a         zıvan´
       CONFIGURATION           Konfiguraˇn´ blok. Hlavn´ blok definuj´ ı
                                             c ı                  ı                    ıc´
                               glob´ln´ promˇnn´ a obsahuj´ ı definici
                                     a ı           e e                    ıc´
                               spouˇtˇn´ jednotliv´ch blok˚ typu program.
                                      se ı              y           u
                               Tento blok nelze vyuˇ´ pro z´pis pro-
                                                              zıt           a
                               gramov´ho k´du v ˇ´dn´m z programovac´
                                          e     o      za e                           ıch
                               jazyk˚. u


            Tabulka 1.2: Programov´ bloky zvolen´ pro implementaci.
                                  e             e

    Hlavn´ nev´hodou ˇeˇen´ je velk´ n´roˇnost na interpret z hlediska jeho stability
         ı    y        r s ı       a a c
    a odolnosti v˚ˇi chyb´m v PLC programu. Interpret by totiˇ v tomto pˇ´ e
                 uc       a                                      z            rıpadˇ
    musel fungovat v r´mci kernel-space RT-Linuxu.
                      a
  2. Pˇekladaˇ PLC k´du - v´hododou tohoto ˇeˇen´ je zejm´na moˇnost vytvoˇit
       r      c         o       y                 r s ı         e      z         r
     pouze preprocesor do jin´ho jazyka a pro vlastn´ generov´n´ bin´rn´ podoby PLC
                             e                      ı        a ı    a ı
     programu vyuˇ´ tento programovac´ jazyk.
                  zıt                    ı
    Nev´hodou tohoto ˇeˇen´ je nutnost po kaˇd´ zmˇnˇ PLC programu tento pro-
       y             r s ı                  z e   e e
    gram znovu kompilovat.
  Pro implementaci softwarov´ho PLC zvol´
                            e           ıme variantu ˇ.2. D˚vodem je moˇnost
                                                     c     u           z

                                           4
NAVRH RESEN´
 ´    ˇ ˇ I



vyuˇ´ jiˇ existuj´ ı kompil´tor jazyka C nebo C++, kter´ je standardnˇ vyuˇ´ an pro
    zıt z        ıc´        a                            y            e      zıv´
programov´n´ ˇ´st´ Linuxov´ho a RT-Linuxov´ho j´dra.
           a ı ca ı           e                e    a
    Po anal´ze [5] je zˇejm´, ˇe zp˚sob z´pisu programu pro PLC lze nejl´pe reprezen-
           y            r  e z      u    a                              e
tovat k´dem v jazyce C++ (podobnost funkˇn´ blok˚ s objekty, moˇnost definovat
       o                                      c ıch    u              z
velk´ mnoˇstv´ funkc´ pomoc´ pˇet´zen´ch oper´tor˚ v podp˚rn´ knihovnˇ atp.).
    e     z ı         ı         ı r ıˇ y         a u        u e          e
    Zvolen´ ˇeˇen´ odpov´ a funkˇn´
          e r s ı         ıd´      c ımu diagramu na obr.1.1. C´
                                                               ılem diplomov´ pr´ce
                                                                               e a
tedy bude vytvoˇit konvertor programu pro PLC do jazyka C++. Vygenerovan´ k´d
                 r                                                               y o
bude n´slednˇ pˇeloˇen do modulu j´dra bˇˇ´ ıho v RT-Linuxu. Pro zjednoduˇen´ kon-
       a     e r z                    a    ezıc´                             s ı
verze bude jeˇtˇ tˇeba vytvoˇit podp˚rnou knihovnu pouˇitelnou v oblasti j´dra, kter´
             se r             r       u                  z                 a         a
bude vyuˇita pˇi pˇekladu C++ k´du.
         z      r r                 o




                  Obr´zek 1.1: Funkˇn´ diagram softwarov´ho PLC
                     a             c ı                  e

   Z obr´zku je patrn´, ˇe softwarov´ PLC bude rozdˇleno na dvˇ hlavn´ ˇ´sti, pˇiˇemˇ
          a            e z           e               e         e       ı ca    rc z
pˇeklad programu bude spouˇtˇn v user-space RT-Linuxu a vlastn´ softwarov´ PLC
 r                            se                                   ı           e
pobˇˇ´ jako real-time vl´kna RT-Linuxu v r´mci kernel-space. Kr´tk´ rozbor jed-
    ezı                    a                   a                     a y
notliv´ch vlastnost´ je uveden v ˇ´stech 1.1 a 1.2.
      y             ı            ca
   Bliˇˇ´ informace o RT-Linuxu a nˇkter´ch pouˇit´ch term´
       zsı                           e    y       z y      ınech z pˇedchoz´ ˇ´sti lze
                                                                     r      ı ca
nal´zt v kapitole 2.1, pˇ´
   e                    rıpadnˇ v manu´lov´ch str´nk´ch RT-Linuxu.
                              e        a y         a a




                                          5
NAVRH RESEN´
 ´    ˇ ˇ I                                                Funkˇn´ ˇ´st pro user-space
                                                               c ı ca


1.1     Funkˇn´ ˇ´st pro user-space
            c ı ca
User-space, nebo-li kontext ve kter´m bˇˇ´ uˇivatelsk´ programy bude vyuˇit pro bˇh
                                    e  ezı z         e                    z        e
preprocesoru (konvertoru) zdrojov´ho k´du. Tento konvertor by mˇl splˇovat n´sleduj´ ı
                                  e   o                        e     n      a      ıc´
poˇadavky:
  z

   • Umoˇnit pˇedzpracov´n´ k´du ve zvolen´m jazyce pro PLC do jazyka C++ v
         z    r         a ı o             e
     takov´m tvaru, aby bylo moˇn´ tento k´d zkompilovat do modulu bˇˇ´ ıho v
          e                    z e        o                         ezıc´
     RT-Linuxu.

   • Moˇnost tvorby a n´sledn´ho vyuˇit´ knihoven funkc´ a funkˇn´ blok˚ pro
        z              a     e      z ı                ı       c ıch   u
     opakovan´ vyuˇit´
             e    z ı.


1.2     Funkˇn´ ˇ´st pro kernel-space
            c ı ca
Kernel-space, neboli kontext j´dra operaˇn´ syst´mu RT-Linux bude vyuˇit pro
                              a          c ıho   e                       z
vlastn´ bˇh vytvoˇen´ho softwarov´ho PLC. Vygenerovan´ k´d v C++ bude zkom-
       ı e       r e              e                   y o
pilov´n jako modul j´dra RT-Linuxu. Pro kompilaci bude tˇeba vytvoˇit podp˚rnou
     a              a                                   r         r        u
knihovnu, kter´ bude m´ n´sleduj´ ı vlastnosti:
              a        ıt a      ıc´

     ˇ s ı
   • Reˇen´ emulace aktu´ln´ hodnoty z´sobn´ (tzv. current result), kde je uloˇena
                        a ı           a    ıku                                z
     hodnota posledn´ proveden´ operace.
                    ı          e

   • Emulace adresov´n´ pˇ´
                    a ı rıstupu do pamˇti ve stylu PLC vˇetnˇ pˇ´
                                      e                 c e rıstupu na extern´
                                                                             ı
     zaˇ´ ı dle adresy.
       rızen´

   • Moˇnost deklarace promˇnn´ch ve stylu PLC, tj. vˇetnˇ pˇ´
        z                     e y                    c e rıpadn´ specifikace
                                                               e
     absolutn´ adresy, na kter´ se promˇnn´ nach´z´
             ı                e        e a      a ı.

   • Moˇnost deklarovat parametry funkc´ funkˇn´ blok˚ a programov´ch blok˚
        z                                  ı,    c ıch  u         y       u
     tak, aby bylo moˇn´ je pˇiˇazovat dle syntaxe PLC.
                     z e     rr

   • Moˇnost modul´rnˇ vytv´ˇet ovladaˇe zaˇ´ ı a tyto ovladaˇe n´slednˇ reg-
         z           a e       ar         c   rızen´             c a   e
     istrovat na konkr´tn´ adresy vstup˚/v´stup˚ softwarov´ho PLC.
                      e ı              u y     u          e




                                          6
Kapitola 2

RT-Linux

Tato kapitola uv´d´ v ˇ´sti 2.1 z´kladn´ informace t´kaj´ ı se RT-Linuxov´ modifikace
                a ı ca           a     ı            y ıc´                e
j´dra a v ˇ´sti 2.2 diskutuje moˇnosti a omezen´ vyuˇit´ jazyka C++ v r´mci RT-
 a        ca                       z              ı    z ı                 a
Linuxu.


2.1     Princip ˇinnosti RT-Linuxu
                c
V t´to ˇ´sti bude v kr´tkosti pops´n princip ˇinnosti RT-Linuxu. Informace zde uveden´
   e ca               a           a          c                                       e
jsou z´ any zejm´na z [9], pˇ´
      ısk´        e           rıpadnˇ z [1].
                                    e

2.1.1    Definice hard real-time syst´mu
                                    e
Tzv. hard real-time syst´m je syst´m, ve kter´m je zaruˇeno ˇasovˇ pˇesn´ spouˇtˇn´
                         e         e           e           c    c     e r e         se ı
jednotliv´ch uloh. Kaˇd´ uloha m´ definov´nu svoji prioritu, se kterou je spouˇtˇna a
         y ´           z a´       a        a                                      se
periodu spouˇtˇn´
              s e ı.
    Perioda spouˇtˇn´ je v podstatˇ tzv. dead-line, tj. nejpozdˇjˇ´ ˇas, do kter´ho mus´
                  se ı            e                            e sı c           e      ı
b´t dan´ real-time uloha dokonˇena, aby mohla b´t opˇt spuˇtˇna.
  y     a            ´          c                  y     e     se
    Priorita ulohy definuje ”d˚leˇitost” ulohy z hlediska pl´novaˇe proces˚.
             ´               u z        ´                    a    c         u

2.1.2    Popis RT-Linuxu
RT-Linux je hard real-time operaˇn´ syst´m urˇen´ pro ˇ´ ı robot˚ a technologick´ch
                                  c ı    e    c y     rızen´       u             y
proces˚, ˇasovˇ n´roˇn´ mˇˇen´ a jin´ ulohy n´roˇn´ na ˇas.
      u c       e a c a er ı          e´      a c e     c
   Dle n´roˇnosti vykon´van´ ulohy a mnoˇstv´ spouˇtˇn´ch vl´ken lze dos´hnout
         a c             a e ´               z ı        se y      a          a
periody spouˇtˇn´ v ˇ´du mikrosekund.
              s e ı ra
   V´hodou RT-Linuxu je, ˇe rozˇiˇuje moˇnosti pouˇit´ klasick´ho unixov´ho syst´mu
     y                      z     sr       z        z ı        e        e       e
o hard real-time vlastnosti pˇi zachov´n´ p˚vodn´ funkˇnosti syst´mu.
                             r        a ı u     ı     c          e




                                           7
RT-LINUX                                                        Princip ˇinnosti RT-Linuxu
                                                                        c


2.1.3      Princip ˇinnosti
                   c
Vlastn´ syst´m je implementov´n jednak jako patch1 klasick´ho Linuxov´ho j´dra, kter´
        ı    e                 a                          e           e    a        y
    s’
zajiˇt uje obsluhu pˇeruˇen´ pˇed vlastn´ Linuxov´m kernelem. Druh´ ˇ´st jsou dy-
                    r s ı r             ım        y                   a ca
                                    e     e         ı     s’ ı
namicky nahr´van´ moduly, kter´ po sv´m zaveden´ zajiˇt uj´ vlastn´ hard real-time
               a e                                                  ı
funkcionalitu (pl´nov´n´ proces˚, poskytnut´ synchronizaˇn´ primitiv, moˇnosti ko-
                  a   a ı        u          ı            c ıch              z
munikace s user-space ˇ´st´ linuxu atd.).
                       ca ı
    Jak vlastn´ RT-Linuxov´ syst´m funguje je dobˇe patrn´ z obr.2.1.
               ı            y      e              r        e




             Obr´zek 2.1: Blokov´ schema funcionality RT-Linuxov´ extenze.
                a               e                               e

      Cel´ syst´m funguje n´sledovnˇ:
         y     e           a       e
      • Po zaveden´ RT-Linuxov´ch modul˚ jsou vˇechna pˇeruˇen´ odchyt´v´na RT-
                  ı           y        u       s       r s ı          a a
        Linuxem.
      • Pokud je vyvol´no pˇeruˇen´ je zpracov´no RT-Linuxem, v pˇ´ e, ˇe je pˇeruˇen´
                      a    r s ı,             a                   rıpadˇ z      r s ı
        vyuˇ´ ano nˇkterou real-time ulohou, je vyvol´n handler pˇeruˇen´ t´to ulohy.
           zıv´     e                 ´              a           r s ı e ´
  1
    Patchem je obvykle naz´v´na soubor, obsahuj´ ı upravu ˇi oprava zdrojov´ho k´du nˇjak´ho
                           y a                   ıc´ ´    c                e    o    e e
programu. Aplikac´ patche na zdrojov´ soubory p˚vodn´ programu je pak z´ ana nov´, upraven´
                 ı                  e          u      ıho               ısk´      a        a
verze.

                                             8
RT-LINUX                                                                     RT-Linux a C++


      • Pokud existuj´ napl´novan´ real-time ulohy ˇekaj´ ı na voln´ ˇas procesoru, pak
                     ı      a      e            ´  c    ıc´        yc
        jsou spuˇtˇny (v z´vislosti na prioritˇ).
                se        a                   e

      • Pokud nen´ ve frontˇ ˇ´dn´ real-time uloha a procesor je voln´, je pˇed´no ˇ´ ı
                 ı         e za a            ´                       y      r a rızen´
        p˚vodn´
         u    ımu linuxov´mu j´dru.
                           e    a

      • P˚vodn´ linuxov´ j´dro vyuˇ´ a pˇeruˇen´ kter´ jsou emulov´na RT-Linuxem2 .
         u    ı        e a        zıv´ r s ı,        a            a

2.1.4       Vyuˇit´ matematick´ho koprocesoru
               z ı            e
V pˇ´ e, ˇe real-time vl´kno chce vyuˇ´
     rıpadˇ z              a           zıvat matematick´ koprocesor (d´le jen FPU),
                                                        y                 a
                                                      3
je nutno tuto skuteˇnost ozn´mit pl´novaˇi proces˚ . Pl´novaˇ n´slednˇ zajist´ pˇi
                    c         a     a      c        u     a      c a        e    ı r
pˇep´ an´ takov´ho vl´kna uloˇen´ stavu registr˚ FPU a jejich pˇ´
  r ın´ ı       e     a        z ı             u                   rıpadn´ obnoven´ ve
                                                                         e        ı
chv´ kdy vl´kno pokraˇuje ve sv´m bˇhu.
    ıli,      a          c        e   e
    Pokud pl´novaˇ proces˚ nen´ informov´n, ˇe vl´kno vyuˇ´ a FPU m˚ˇe doch´zet
              a   c         u   ı         a z     a          zıv´          uz     a
k navracen´ chybn´ch v´sledk˚ v´poˇtu. K tomu m˚ˇe doj´ z n´sleduj´ ıch d˚vod˚:
            ı     y     y     u y c               uz      ıt     a      ıc´   u    u

   1. FPU v jeden okamˇik vyuˇ´ a program z user-space a z´roveˇ real-time vl´kno.
                      z      zıv´                         a    n             a

   2. FPU v jeden okamˇik vyuˇ´ ı alespoˇ dvˇ real-time vl´kna.
                      z      zıvaj´     n e               a

   3. FPU je v jeden okamˇik poˇadov´no nˇkolika real-time vl´kny i programy z user-
                         z     z    a    e                   a
      space.


2.2        RT-Linux a C++
V RT-Linuxu je moˇno vyuˇ´
                       z       zıvat programovac´ jazyka C++ pro tvorbu real-time
                                                  ıho
vl´ken. Pouˇit´ vˇak m´ jist´ omezen´ kter´ vypl´vaj´ jiˇ pˇ´
   a          z ı s        a   a          ı,    a      y ı z rımo z principu, jak´my
syst´m funguje.
     e
     N´sleduj´ ı ˇ´sti se postupnˇ zab´vaj´ jednotliv´mi konstrukcemi jazyka C++ a je-
       a      ıc´ ca              e     y ı           y
jich pouˇit´ v RT-Linuxu. C´
           z ım                 ˇ ast 2.2.1 diskutuje pouˇit´ dynamick´ alokace pamˇti,
                                                           z ı        e            e
ˇ´st 2.2.2 kr´tce diskutuje pouˇit´ exceptions4 a ˇ´st 2.2.3 diskutuje pouˇit´ tem-
ca              a                   z ı                 ca                     z ı
plates(ˇablon).
         s

2.2.1       Dynamick´ alokace pamˇti
                    a            e
Probl´m pouˇit´ dynamick´ alokace pamˇti lze rozdˇlit na ˇ´st, kter´ se t´k´ alokov´n´
      e     z ı           e            e          e      ca        a     y a       a ı
pamˇti bˇhem inicializace real-time modulu a problematiku dynmick´ alokace pamˇti
    e   e                                                            e             e
bˇhem vlastn´ bˇhu real-time procesu (tj. alokace pamˇti pˇ´ z bˇˇ´ ıho RT vl´kna).
 e          ıho e                                     e rımo ezıc´              a
  2
     V podstatˇ lze ˇinnost p˚vodn´ linuxov´ho j´dra pˇirovnat ke zvl´ˇtn´
                e   c        u     ıho         e  a     r            as ımu real-time vl´knu RT-
                                                                                        a
Linuxu, bˇˇ´ ımu s nejniˇˇ´ real-time prioritou.
           ezıc´         zsı
   3
     To je moˇn´ zajistit bud’ informac´ pˇi zakl´d´n´ real-time vl´kna nebo nastaven´ stejn´ho
                z e                      ı r      a a ı            a                 ım      e
parametru za bˇhu real-time vl´kna.
                  e             a
   4
     Tj. vyj´
            ımek pro oˇetˇen´ chybov´ch stav˚ pˇi bˇhu programu
                       s r ı         y        u r e


                                               9
RT-LINUX                                                                  RT-Linux a C++


    Oba tyto probl´my lze ˇeˇit za pomoci pˇet´zen´ C++ oper´toru new a delete,
                    e           r s                r ıˇ ı               a
pˇ´
  rıpadnˇ oper´tor˚ new[] a delete[] pro alokace a uvolˇov´n´ pamˇti dynamick´ch pol´
         e     a u                                       n a ı        e            y       ı.
    V pˇ´ e, ˇe potˇebujeme dynamicky alokovat pamˇt e
        rıpadˇ z      r                                    e ’ bˇhem inicializace, pˇ´
                                                                                    rıpadnˇe
deinicializace modulu, staˇ´ pˇet´zit standardn´ C++ oper´tory uveden´ v´ˇe na vol´n´
                           cı r ıˇ               ı            a            e ys          a ı
linuxov´ho j´dra kalloc(), pˇ´
        e    a                rıpadnˇ kfree(). Toto pˇet´zen´ je jiˇ standardnˇ provedeno
                                       e              r ıˇ ı       z            e
v souboru rtl cpp.h, kter´ je souˇ´st´ distribuce RT-Linux.
                          y           ca ı
                      z       r                               e’
    Za pˇedpokladu, ˇe je tˇeba dynamicky alokovat pamˇt za bˇhu real-time vl´kna,
         r                                                            e                a
je tˇeba si vytvoˇit vlastn´ spr´vu dynamick´ pamˇti. D˚vodem je zejm´na moˇnost
     r            r         ı       a           e      e      u                e       z
vzniku kolize pˇi vol´n´ standardn´ syst´mov´ch vol´n´
                r     a ı              ıch  e      y      a ı.
    Vlastn´ dynamick´ spr´va pamˇti by mˇla fungovat n´sleduj´ ım zp˚sobem:
           ı           a   a            e     e               a      ıc´    u

             z                                           e’
   1. V okamˇiku inicializace RT modulu naalokuje pamˇt z oblasti j´dra pomoc´ vol´n´
                                                                   a         ı a ı
      kmalloc(). Velikost takto alokovan´ pamˇti by mˇla odpov´
                                        e    e         e      ıdat alespoˇ maxim´ln´
                                                                         n       a ı
      potˇebn´ velikosti pamˇti, kterou budeme cht´ dynamicky alokovat. Bloky t´to
         r   e                e                     ıt                            e
      pamˇti mus´ b´t alokov´n ve fyzick´ pamˇti poˇ´ ce.
           e      ı y          a          e    e      cıtaˇ

        r ıˇı     a                                                             s ’ ıc´
   2. Pˇet´z´ oper´tory new, new[], delete, delete[] tak, aby volaly funkce zajiˇt uj´ ı
                                     a          e’ e
      alokaci a dealokaci pamˇti v r´mci pamˇt ov´ho bloku naalokovan´ho bˇhem
                              e                                            e     e
      zav´dˇn´ RT modulu (viz. krok 1).
         a e ı

                                               e ı    e’ e
   3. Bˇhem deaktivace modulu provede uvolnˇn´ pamˇt ov´ho bloku, kter´ byl z´ an
        e                                                              y     ısk´
           e ’ov´ oblasti linuxov´ho j´dra v okamˇiku zaveden´ modulu do pamˇti.
      z pamˇt e                  e    a            z         ı              e

2.2.2       Oˇetˇen´ chyb - exceptions
             s r ı
Vyj´               e                        z        e’ e
    ımky, nebo tak´ exceptions, nelze bohuˇel v pamˇt ov´m prostoru linuxov´ho j´dra
                                                                           e    a
a tedy ani v oblasti, kter´ je vyuˇ´ ana RT rozˇ´ren´ vyuˇ´ Hlavn´ d˚vodem je,
                           a       zıv´          sıˇ ım      zıt.    ım u
ˇe linker optimalizuje k´d pro vol´n´ vyj´
z                       o         a ı    ımek. Proto by bˇhem linkov´n´ modulu j´dra
                                                         e          a ı         a
musely b´t zn´my vˇechny moduly, kter´ se budou v pamˇti nach´zet.
          y    a     s                   e                 e      a
    Dalˇ´ d˚vodem je, ˇe linuxov´ j´dro je ps´na ˇistˇ v jazyce C a jiˇ bˇhem jeho
        sım u             z         e a         a c e                   z e
kompilace jsou vyj´ımky zak´zany pomoc´ parametru pˇekladaˇe.
                             a            ı            r       c

2.2.3       Pouˇit´ C++ templates
               z ı
                                                 ıˇı      zıt,    ’ e
Templates jako vlastnost jazyka C++ lze bez obt´z´ vyuˇ´ nebot bˇhem kompilace je
takov´ k´d nahrazen skuteˇn´m datov´m typem vˇetnˇ vˇech kontrol bˇhem kompi-
      y o                  c y         y            c e s                e
lace.
    Bohuˇel nelze jednoduˇe vyuˇ´ tˇ´ implementovan´ch v knihovnˇ STL5 . D˚vodem
           z             s     zıt rıd                 y             e        u
jsou dynamick´ alokace pamˇti, kter´ jsou v tˇchto tˇ´ ach vyuˇ´
              e              e      e        e       rıd´       zıvany. Omezen´ z toho
                                                                              ı
plynouc´ jsou uvedena v ˇ´sti 2.2.1. Urˇitou moˇnost´ jak t´to knihovny vyuˇ´ by
         ı                ca             c       z      ı,     e                zıt
zˇejmˇ byla vlastn´ rekompilace ze zdrojov´ch k´d˚ se spr´vnˇ pˇet´zen´mi oper´tory
 r    e            ı                       y   o u           a e r ıˇ y          a
pro spr´vu pamˇti.
        a       e

  5
      Standard Template Library.

                                             10
Kapitola 3

Lexik´ln´ anal´za zdrojov´ho k´du
     a ı      y          e    o

V t´to ˇ´sti se budeme zab´vat vlastn´ zpracov´n´ zdrojov´ho k´du v jazyce IL,
    e ca                      y         ım          a ım          e      o
tedy vytvoˇen´ kompil´toru (pˇekladaˇe). Dle [7] lze pˇekladaˇ reprezentovat pomoc´
            r ım          a       r     c                r       c                       ı
koneˇn´ho stavov´ho automatu. V UNIXov´ch syst´mech jsou k dispozici programy
     c e            e                        y        e
LEX a YACC, kter´ umoˇnuj´ takov´ stavov´ automat pro zpracov´n´ zdrojov´ho
                       e     zˇ ı      y        y                          a ı        e
k´du vytvoˇit na z´kladˇ z´pisu pravidel v pˇ´ sn´m tvaru. C´
 o           r       a    e a                rısluˇ e           ˇ ast 3.1 t´to kapitoly se
                                                                            e
zab´v´ popisem programu LEX, kter´ se vyuˇ´ a pro vytvoˇen´ lexik´ln´ analyzeru
    y a                               y        zıv´           r ı        a ıho
                 ˇa
(viz. obr.3.1). C´st 3.2 se zab´v´ popisem jazyka pomoc´ pravidel zadan´ch programu
                                y a                       ı                  y
YACC (na obr.3.1 to odpov´ a syntaktick´mu analyzeru). C´
                              ıd´          e                  ˇ ast 3.3 popisuje princip,
jak´m oba v´ˇe uveden´ programy spolupracuj´ pˇi tvorbˇ pˇekladaˇe.
   y           ys        e                       ı r        e r        c




                          Obr´zek 3.1: Kompilaˇn´ sekvence.
                             a                c ı




                                           11
LEXIKALN´ ANALYZA ZDROJOVEHO KODU
     ´ I      ´          ´    ´                        Lexik´ln´ anal´za zdrojov´ho k´du
                                                            a ı      y          e    o


3.1      Lexik´ln´ anal´za zdrojov´ho k´du
              a ı      y          e    o
Pro lexik´ln´ anal´zu zdrojov´ho k´du bude vyuˇit program LEX. Informace, kter´ jsou
          a ı     y          e    o              z                             e
uvedeny v t´to ˇ´sti jsou ˇerp´ny z [8] a [4]. Program LEX slouˇ´ k vytvoˇen´ parseru
             e ca          c a                                 zı        r ı
zdrojov´ho k´du a pˇevodu kl´cov´ch slov na tzv. tokeny. Z´roveˇ umoˇnuje vytvoˇit
        e     o      r         ıˇ y                         a    n     zˇ          r
stavov´ automat definuj´ ı moˇnou n´slednost r˚zn´ch kl´cov´ch slov ve zdrojov´m
      y                  ıc´    z     a            u y     ıˇ y                   e
k´du.
 o
   Vytvoˇen´ stavov´ automat m˚ˇe pracovat dvˇma zp˚soby:
           r y       y            uz                e    u

  1. Stavov´ automat pˇi pˇechodu do dalˇ´ stavu pˇedchoz´ stav zapomene.
           y          r r               sıho      r      ı

  2. Stavov´ automat ukl´d´ stavy na z´sobn´ Zmˇna stavu je moˇn´ dvˇma smˇry:
           y            a a           a    ık. e              z a e       e

        • Pˇechod do nov´ho stavu, p˚vodn´ stav je uloˇen na z´sobn´
           r            e           u    ı            z       a    ık.
        • Z aktu´ln´ stavu se pˇech´z´ do stavu uloˇen´ho na z´sobn´
                 a ıho         r a ı               z e        a    ıku, aktu´ln´
                                                                            a ı
          stav je zapomenut.

3.1.1     Struktura zdrojov´ho k´du pro LEX
                           e    o
Vstupn´ soubor pro LEX je rozdˇlen do tˇech ˇ´st´ tak, jak je patrno z uk´zky 3.1.
       ı                         e        r    ca ı                      a
Jednotliv´ ˇ´sti jsou od sebe oddˇleny pomoc´ znaˇek %%.
         e ca                    e          ı    c


... definice maker a vlastnost´ analyz´toru ...
                              ı       a
%%
... definice pravidel ...
%%
... funkce v jazyce C/C++ ...



                 Uk´zka 3.1: Struktura vstupn´ souboru pro LEX.
                   a                         ıho

    Prvn´ ˇ´st obsahuje makra pro zjednoduˇen´ definiˇn´ regul´rn´ v´raz˚ pro vyh-
         ı ca                               s ı       c ıch       a ıch y u
led´v´n´ kl´cov´ch slov, parametry parseru a pˇ´
    a a ı ıˇ y                                 rıpadnˇ zdrojov´ k´d v jazyce C/C++.
                                                       e        y o
V tab.3.1 je uveden pˇehled kl´cov´ch slov, kter´ mohou b´t v prvn´ ˇ´sti obsaˇeny.
                       r        ıˇ y             e          y        ı ca        z
    Druh´ ˇ´st vstupn´ souboru obsahuje pravidla ve tvaru regul´rn´ v´raz˚ pro
         a ca           ıho                                          a ıch y u
zpracov´n´ zdrojov´ho k´du a definici akc´ v jazyce C/C++, kter´ pravidlu odpov´ ı.
        a ı         e      o              ı                        e               ıdaj´
Pravidlo m˚ˇe b´t aktivn´ pouze v definovan´ch stavech, akce m˚ˇe obsahovat pˇechod
            uz y             ı               y                    uz             r
do stavu nov´ho nebo do stavu uloˇen´ho na z´sobn´
               e                    z e         a     ıku. Struktura pravidel je patrn´a
z uk´zky 3.2.
     a
    Prvn´ ˇ´st pravidla je nepovinn´ a definuje stavy, ve kter´ch je pravidlo platn´,
         ı ca                        a                           y                     e
pˇ´
  rıpadnˇ stavy, ve kter´ch platn´ nen´ Zde z´leˇ´ na tom, jak je definov´n stav v prvn´
        e                y        e    ı.    a zı                        a               ı
ˇ´sti vstupn´ souboru.
ca            ıho

                                           12
LEXIKALN´ ANALYZA ZDROJOVEHO KODU
     ´ I      ´          ´    ´                         Lexik´ln´ anal´za zdrojov´ho k´du
                                                             a ı      y          e    o


           Definice              Popis
           N´zev reg. v´raz
            a          y        Pˇeddefinovan´ regul´rn´ v´razy, kter´ lze
                                  r            e       a ı y              e
                                pouˇ´ d´le pro zjednoduˇen´ definiˇn´
                                     zıt a                    s ı         c ıch
                                pravidel pro vyhled´v´n´ token˚ ve zdro-
                                                     a a ı        u
                                jov´m k´du.
                                    e    o
           %s                   Definice stav˚, ve kter´ch se m˚ˇe nach´zet
                                              u         y        uz        a
                                vygenerovan´ stavov´ automat. Na jednom
                                             y        y
                                ˇ´dku se m˚ˇe nach´zet deklarace v´ stav˚
                                ra          uz      a                 ıce     u
                                jejichˇ jm´na jsou oddˇlena mezerou.
                                       z e              e
           %{ ... %}            Ohraniˇen´ zdrojov´ho k´du v jazyce
                                        c ı           e       o
                                C/C++, kter´ bude vloˇen tak, jak je
                                                y           z
                                naps´n, na zaˇ´tek vygenerovan´ho zdro-
                                      a          ca                 e
                                jov´ho k´du parseru.
                                    e    o
           %option ...          Parametry vygenerovan´ho parseru, pokud
                                                          e
                                obsahuje kl´cov´ slovo stack, jsou stavy
                                             ıˇ e
                                parseru ukl´d´ny na z´sobn´
                                            a a         a    ık.


Tabulka 3.1: Pˇehled kl´cov´ch slov pouˇiteln´ch v prvn´ ˇ´sti definiˇn´ souboru pro
              r        ıˇ y            z     y         ı ca         c ıho
LEX.


[<stav1[,stav2[,...]]>]reg.v´raz {
                            y
akce v jazyce C;
}



             Uk´zka 3.2: Struktura pravidel pro anal´zu zdrojov´ho k´du.
               a                                    y          e    o

     Druh´ ˇ´st je regul´rn´ v´raz, kter´ definuje, jak dan´ kl´cov´ slovo, konstanta
           a ca           a ı y            y                     e ıˇ e
ˇi jin´ souˇ´st zdrojov´ho k´du je zaps´na. Z´kladn´ struktura regul´rn´ v´raz˚ je
c      a     ca          e     o           a      a     ı                a ıch y u
pops´na v tab. 3.2, podrobnˇjˇ´ informace o regul´rn´ v´razech lze z´
      a                        e sı                 a ıch y              ıskat napˇ. v [6].
                                                                                  r
V pˇ´ e, ˇe zdrojov´ text obsahuje ˇ´st, kter´ odpov´ a pˇ´ sn´mu regul´rn´
     rıpadˇ z           y                 ca        a        ıd´ rısluˇ e         a ımu
v´razu, je tento text uloˇen do promˇnn´ YYTEXT a lze ho pouˇ´ v ˇ´sti pro z´pis
  y                        z            e e                           zıt ca          a
pˇ´ sn´ akce, kter´ se vyvol´ pro dan´ v´raz.
  rısluˇ e            a         a         y y
     V ˇ´sti pro z´pis akce lze zapsat libovolnou akci nebo nepsat nic, pokud se m´ vˇe,
        ca        a                                                                 a s
co odpov´ a dan´mu regul´rn´ v´razu ignorovat. V pˇ´ e, ˇe chceme spolupracovat
           ıd´    e          a ımu y                      rıpadˇ z
s programem YACC, m˚ˇe akce vypadat napˇ. jako v uk´zce 3.3.
                          uz                    r            a
     Uk´zka 3.4 uv´d´ cel´ vstupn´ soubor pro LEX obsahuj´ ı konkr´tn´ pravidlo, vˇetnˇ
         a          a ı y           ı                         ıc´    e ı             c e
akce v jazyce C. Pravidlo detekuje token jako celoˇ´   cıselnou konstantu ve zdrojov´m e
k´du, pokud se stavov´ automat nach´z´ ve stavu any value.
  o                     y                a ı



                                            13
LEXIKALN´ ANALYZA ZDROJOVEHO KODU
     ´ I      ´          ´    ´                     Lexik´ln´ anal´za zdrojov´ho k´du
                                                         a ı      y          e    o


          Regul´rn´ v´raz
               a ı y          Popis
          LD                  Regul´rn´ v´raz je slovo LD.
                                    a ı y
          ˆLD                 Regul´rn´ v´raz je slovo LD na zaˇ´tku
                                    a ı y                           ca
                              ˇ´dku.
                              ra
          LD$                 Regul´rn´ v´raz je slovo LD na konci ˇ´dku.
                                    a ı y                          ra
          LD/([ ]+)           Regul´rn´ v´raz je slovo LD n´sledovan´ li-
                                    a ı y                     a       e
                              bovoln´m poˇtem mezer nebo tabul´tor˚,
                                     y     c                        a u
                              ˇ´st za znakem / nen´ uloˇena v promˇnn´
                              ca                    ı     z          e e
                              YYTEXT a je ponech´na v bufferu pro dalˇ´
                                                    a                    sı
                              zpracov´n´
                                      a ı.
          ([0-9]+)            Regul´rn´ v´raz je ˇ´ skl´daj´ ı se z libo-
                                    a ı y        cıslo     a ıc´
                              voln´ho poˇtu ˇ´
                                  e      c cıslic.
          {SPACE}             Regul´rn´ v´raz odpov´ a definici z prvn´
                                    a ı y             ıd´              ıho
                              bloku zdrojov´ho souboru s n´zvem SPACE.
                                           e                a


       Tabulka 3.2: Struktura regul´rn´ v´raz˚ v definici pravidel pro LEX.
                                   a ıch y u


// pokud se pr´vˇ nach´z´m ve stavu var_declaration
               a e     a ı
if (YY_START == var_declaration)
{
   // vyzvedni aktu´ln´ stav ze z´sobn´ku (dojde k pˇesunu
                     a ı           a   ı            r
   // do stavu pˇedchoz´ho)
                 r       ı
   yy_pop_state();
   // a uloˇ na z´sobn´k stav var_data_type
            z      a   ı
   yy_push_state(var_data_type);
   // uloˇ hodnotu nalezen´ho regul´rn´ho v´razu do promˇnn´
         z                   e       a ı    y           e e
   // pro YACC
   yylval.string = strdup(yytext);
             ’
   // a vrat informaci, ˇe jsi nalezl datov´ typ
                           z                 y
   // promˇnn´
           e e
   return TOK_VAR_DATATYPE;
}
// nejsem v bloku deklarac´ promˇnn´ch,
                             ı    e y
// ale oˇek´v´m deklaraci datov´ho typu
        c a a                   e
// funkce
yylval.string = strdup(yytext);
return TOK_FUNCTION_DATATYPE;
}



      Uk´zka 3.3: Z´pis akce pro nalezen´ regul´rn´ v´raz ze zdrojov´ho k´du.
        a          a                    y      a ı y                e    o




                                        14
LEXIKALN´ ANALYZA ZDROJOVEHO KODU
     ´ I      ´          ´    ´                                   Popis gramatiky jazyka



%{
#include <stdio.h>
// odkaz na poˇ´tadlo ˇ´dk˚
               cı        ra u
extern int iLineCount;
%}
// pouˇij z´sobn´k pˇi zmˇnˇ stavu
      z     a     ı   r     e e
%option stack
// definice povolen´ch stav˚
                    y         u
%s var_init
%%
// pokud jsi ve stavu, kdy je oˇek´v´na inicializace
                                  c a a
// promˇnn´, povol detekci cel´ho ˇ´sla.
       e e                      e   cı
<var_init>[-+]?([0-9]+) {
                                                ’
   yylval.number = atoi(yytext); // hodnotu vrat jako ˇ´slo
                                                      cı
   return VAL_INTEGER;
}
// pokud jde o konec ˇ´dku, zvyˇ poˇ´tadlo a jinak
                        ra        s  cı
// nic nedˇlej
          e
n   ++iLineCount;
%%



               Uk´zka 3.4: Uk´zka definice pravidla pro program LEX.
                 a           a

3.2      Popis gramatiky jazyka
Pro popis gramatiky jazyka lze vyuˇ´ syst´m YACC, kter´ umoˇnuje ve spolupr´ci
                                   zıt    e              y      zˇ           a
s programem LEX definovat velmi jednoduˇe pravidla , jak dan´ programovac´ jazyk
                                          s                  y          ı
vypad´, tj. jak´ umoˇnuje vytv´ˇet program´torsk´ konstrukce a z´pisy.
      a        e    zˇ        ar           a       e            a
   Informace zde uveden´ jsou ˇerp´ny z [8] a [4].
                        e     c a

3.2.1     Struktura zdrojov´ho souboru pro YACC
                           e
Struktura zdrojov´ho souboru pro syst´m YACC je opˇt rozdˇlena do tˇech ˇ´st´ tak,
                   e                     e               e       e         r    ca ı
jak je patrno z obr´zku 3.5. Jednotliv´ ˇ´sti jsou od sebe oddˇleny pomoc´ znaˇek %%.
                   a                   e ca                    e             ı   c
    Prvn´ ˇ´st obsahuje definici token˚ pro vyhled´v´n´ (z tˇchto definic jsou pot´
         ı ca                            u            a a ı       e                      e
vygenerov´ny unik´tn´ identifik´tory jejichˇ symbolick´ n´zvy odpov´ ı n´zv˚m to-
            a       a ı          a            z          e a            ıdaj´ a u
ken˚), prioritu oper´tor˚ apod. V tab.3.3 je uveden pˇehled z´kladn´ pˇ´ u, kter´
    u                a u                                r        a     ıch rıkaz˚        e
mohou b´t v t´to ˇ´sti obsaˇeny.
          y    e ca          z
    ˇ ast pro definici pravidel obsahuje jiˇ pˇ´
    C´                                      z rımo jednotliv´ pravidla, kter´ odpov´ ı
                                                             a                a      ıdaj´
konstrukc´ kter´ lze v jazyce vytvoˇit. Kaˇd´ takov´ pravidlo m´ strukturu dle
           ım,     e                      r       z e      e             a
obr.3.6.
    V´znam jednotliv´ch prvk˚ je n´sleduj´ ı:
      y               y        u     a        ıc´

| Definuje, ˇe n´sleduj´ ı ˇ´st pravidla je nepovinn´.
           z a        ıc´ ca                       a


                                           15
LEXIKALN´ ANALYZA ZDROJOVEHO KODU
     ´ I      ´          ´    ´                               Popis gramatiky jazyka



... definice ...
%%
... definice pravidel pro gramatiku jazyka ...
%%
... funkce v jazyce C ...



               Uk´zka 3.5: Struktura vstupn´ souboru pro program YACC.
                 a                         ıho

  Definice                              Popis
  %token jm´no
           e                           Definice tokenu s n´zvem jm´no
                                                          a        e
  %{...%}                              Blok obsahuj´ ı k´d v jazyce C/C++, kter´
                                                    ıc´ o                        y
                                       bude po zpracov´n´ vloˇen na zaˇ´tek vygen-
                                                       a ı    z       ca
                                       erovan´ho k´du.
                                             e    o
  %union{int iData;char *pData;}       N´vratov´ hodnota yylval je typu union a je
                                         a      a
                                       urˇena nˇkter´m datov´m typem uveden´m
                                         c     e     y        y                y
                                       v unionu.
  %token <iData> TOK INTEGER           Definuje token s datov´m typem iData (dle
                                                              y
                                       definice v unionu).
  %left ’,’                            Definice priority oper´toru.
                                                            a
  %right ’,’                           Definice priority oper´toru.
                                                            a


Tabulka 3.3: Z´kladn´ pˇ´
              a     ı rıkazy pouˇiteln´ v bloku definic vstupn´ souboru pro YACC.
                                z     e                      ıho


nazev:
     [|]
     nazev2
     [{
     ... programov´ k´d v jazyce C/C++ ...
                  y o
     }]
     [[|] nazev3]
     ;



        Uk´zka 3.6: Struktura pravidel pro definici jazyka v programu YACC.
          a

nazev N´zev pravidla (bez diakritiky) oddˇlen´ dvojteˇkou od jeho definice.
       a                                 e y         c

nazev2 N´zev tokenu definovan´ho v ˇ´sti definic na zaˇ´stku vstupn´ souboru pro
        a                   e     ca                ca           ıho


                                         16
LEXIKALN´ ANALYZA ZDROJOVEHO KODU
     ´ I      ´          ´    ´              Princip spolupr´ce program˚ LEX a YACC
                                                            a          u


      YACC nebo n´zev jin´ho pravidla. Pro vytv´ˇen´ rekurzivn´ pravidel m˚ˇe b´t
                     a     e                   ar ı           ıch         uz y
      stejn´ i jako nazev.
           y
{ ... } Ohraniˇuje blok obsahuj´ ı k´d v jazyce C/C++, kter´ bude vykon´n v pˇ´ e,
               c               ıc´ o                       y           a     rıpadˇ
      ˇe pravidlo bude obsaˇeno ve vstupn´ zdrojov´m souboru.
      z                    z               ım       e
; Oznaˇen´ konce bloku, kter´ definuje pravidlo nazev.
      c ı                   y
   Programov´ k´d v jazyce C/C++ definuje akce, kter´ budou pˇi aplikaci pravidla
              y o                                       e          r
vyvol´ny. V pˇ´ e, ˇe nalezen´ token m´ definov´n datov´ typ, lze k hodnotˇ pˇedan´
     a       rıpadˇ z         y        a        a         y                 e r    e
z programu LEX pˇistupovat pomoc´ konstrukce $x, kde x je ˇ´ definuj´ ı poˇad´
                   r                ı                          cıslo        ıc´ r ı
tokenu v definici pravidla. V pˇ´ e pravidla z obr.3.6 by pro token nazev2 s defi-
                               rıpadˇ
novan´m typem odpov´
      y               ıdala hodnota $1. Do ˇ´
                                           cıslov´n´ poˇad´ se zahrnuj´ i programov´
                                                 a ı r ı              ı            e
bloky uzavˇen´ mezi {}.
           r e
   Na obr.3.7 je uvedena kr´tk´ komentovan´ uk´zka definice nˇkolika jednoduch´ch
                            a a             a a                 e                y
pravidel.


3.3     Princip spolupr´ce program˚ LEX a YACC
                       a          u
Tato ˇ´st popisuje spolupr´ci program˚ LEX a YACC pˇi vytv´ˇen´ pˇekladaˇe navrˇen´ho
     ca                    a           u                r     ar ı r       c      z e
jazyka. Princip ˇinnosti je vysvˇtlen na obr.3.2 pomoc´ vytv´ˇen´ho softwarov´ho PLC
                c               e                     ı     ar e             e
(v´sledkem bude program plc2cpp, kter´ bude pˇev´dˇt k´d ve zvolen´m jazyce pro
  y                                       y        r a e o              e
PLC do jazyka C/C++).
    Princip spolupr´ce obou program˚ lze popsat n´sledovnˇ:
                    a                 u             a       e

  1. Nejprve vytvoˇ´
                  rıme lexik´ln´ analyzer pomoc´ programu LEX, kter´ vyhled´ ve
                             a ı                ı                  y       a
     zdrojov´m textu tzv. tokeny (tj. definovan´ kl´cov´ slova).
            e                                 a ıˇ a
  2. N´slednˇ definujeme pomoc´ programu YACC syntaxi navrˇen´ho jazyka (tj.
      a     e                  ı                         z e
     moˇn´ kombinace vyhledan´ch token˚).
        z e                  y        u
  3. Zkompilujeme vstupn´ soubor pro program YACC. V´sledkem je hlaviˇkov´ sou-
                           ı                             y                c y
     bor y.tab.h, kter´ definuje pro jednotliv´ n´zvy token˚ ˇ´
                      y                      e a          u cıseln´ hodnoty (makra)
                                                                  e
     v jazyce C/C++ a soubor y.tab.c, kter´ obsahuje vlastn´ syntaktick´ analyz´tor
                                            y               ı           y      a
     jazyka.
  4. Zkompilujeme vstupn´ soubor pro program LEX. Ten ve vygenerovan´m k´du
                           ı                                           e    o
     vyuˇ´ a soubor y.tab.h vygenerovan´ v pˇedchoz´ kroku. V´sledkem je soubor
         zıv´                             y     r      ım        y
     lex.yy.c, kter´ obsahuje lexik´ln´ analyzer v jazyce C/C++.
                   y               a ı
  5. Zkompilov´n´ soubor˚ vygenerovan´ch v pˇedchoz´ krok˚ spolu s dalˇ´
              a ım        u           y     r        ıch    u           sımi
     podp˚rn´mi ˇ´stmi z´ ame poˇadovan´ kompil´tor. V naˇem pˇ´ e plc2cpp.
         u y ca         ısk´    z       y      a         s    rıpadˇ
  6. Zkompilovan´ program z pˇedchoz´ krok˚ je jiˇ vytv´ˇen´m kompil´torem,
                 y             r       ıch     u     z     ar y          a
     kter´ lze vyuˇ´ ke kompilaci zdrojov´ho k´du ve vytv´ˇen´m jazyce. V naˇem
         y        zıt                     e   o          ar e               s
     pˇ´ e tedy zdrojov´ k´d v implementovan´m programovac´ jazykem pro PLC.
      rıpadˇ            y o                   y              ım

                                        17
LEXIKALN´ ANALYZA ZDROJOVEHO KODU
     ´ I      ´          ´    ´                 Princip spolupr´ce program˚ LEX a YACC
                                                               a          u



// Definuj token pro pˇiˇazen´ hodnoty
                       r r   ı
%token TOK_SET
// Pˇiˇazovan´ hodnota je bud’ cel´ ˇ´slo
    r r      a                    e cı
// nebo nulou ukonˇen´ ˇetˇzec
                  c y r e
%union
{
   int number;
   char *string;
}
// Definuj token s urˇen´m datov´m typem pro n´vrat
                     c y        y             a
// celoˇ´seln´ hodnoty
        cı   e
%token <number> VAL_INT
// Definuj token s urˇen´m datov´m typem pro n´vrat
                     c y        y             a
// nulou ukonˇen´ho ˇetˇzce
             c e    r e
%token <string> VAL_STR

%%
// Definuj z´kladn´ pravidlo pro detekci jednotliv´ch
             a      ı                             y
// blok˚ ve vstupn´m souboru.
        u           ı
blocks:
   // ˇ´dn´ z n´sleduj´c´ch blok˚ v pravidle nen´ povinn´
      Za y      a     ı ı       u               ı       y
   |
   // Po nalezen´ bloku pro pˇiˇazen´ cel´ho ˇ´sla m˚ˇe n´sledovat
                  ı          r r    ı    e   cı     uz    a
   // dalˇ´ vstupn´ blok (rekurze))
          sı        ı
   set_int blocks
   |
   // Po prvn´m bloku pˇiˇazuj´c´m ˇetˇzec jiˇ nen´sleduje
              ı        r r    ı ı r e        z    a
   // ˇadn´ dalˇ´ blok
      z´ y      sı
   set_string
   ;

set_int:
   TOK_SET VAL_INT
   {
      printf("ˇ´seln´ hodnota: %d", $1);
              Cı    a
   }
   ;

set_string:
   TOK_SET VAL_STR
   {
      printf("ˇetˇzcov´ hodnota: %s", $1);
              R e     a
   }
   ;
%%



        Uk´zka 3.7: Uk´zka definice pravidla ve zdrojov´m k´du pro YACC.
          a           a                               e   o



                                           18
LEXIKALN´ ANALYZA ZDROJOVEHO KODU
     ´ I      ´          ´    ´               Princip spolupr´ce program˚ LEX a YACC
                                                             a          u




Obr´zek 3.2: Princip tvorby a funkce pˇekladaˇe jazyka definovan´ho pomoc´ program˚
   a                                  r      c                 e        ı        u
LEX a YACC.

    Zde uveden´ vlastnosti a konstrukce obsahuj´ pouze malou ˇ´st moˇnost´ kter´ pro-
              e                                ı             ca     z    ı,    e
gramy YACC a LEX nab´ ı. V podstatˇ shrnuje vlastnosti vyuˇit´ bˇhem konstrukce
                         ızej´           e                      z e e
softwarov´ho PLC. Podrobnˇjˇ´ informace lze nal´zt v uveden´ literatuˇe.
         e                   e sı                 e          e        r




                                         19
Kapitola 4

Zpracov´n´ promˇnn´ch PLC
       a ı     e y
programu

Tato ˇ´st se zab´v´ zpracov´n´ promˇnn´ch a parametr˚ funkc´ funkˇn´ blok˚ a
     ca         y a        a ım        e y              u     ı,      c ıch    u
                   u ˇa
programov´ch blok˚. C´st 4.1 nastiˇuje princip zpracov´n´ promˇnn´ch v programu,
           y                      n                   a ı     e y
ˇ´st 4.2 se zab´v´ deklarac´ jednotliv´ch promˇnn´ch, ˇ´st 4.3 rozeb´ a jednotliv´
ca             y a         ı           y       e y     ca             ır´        e
moˇn´ bloky promˇnn´ch a ˇ´st 4.4 uv´d´ z´kladn´ principy t´kaj´ ı se implementace
   z e            e y      ca          a ı a     ı         y ıc´
a zpracov´n´ promˇnn´ch v softwarov´m PLC.
         a ı      e y                e


4.1     Princip zpracov´n´ promˇnn´ch
                       a ı     e y
Promˇnn´ v PLC programu se zapisuj´ v r´mci blok˚ promˇnn´ch. Kaˇd´ blok promˇnn´ch
      e e                           ı a           u     e y        z y         e y
m´ jin´ v´znam a ve sv´m tˇle obsahuje deklaraci jedn´ nebo v´ promˇnn´ch tak, jak
  a y y                  e e                         e       ıce     e y
je patrno z uk´zky 4.1. V´znamem jednotliv´ch blok˚ promˇnn´ch se zab´vaj´ dalˇ´
               a           y                y        u      e y          y ı     sı
ˇ´sti t´to kapitoly.
ca     e
    Princip zpracov´n´ promˇnn´ch v r´mci PLC programu prob´ a n´sleduj´ ım zp˚sobem:
                     a ı     e y     a                        ıh´ a    ıc´    u
  1. Detekuj blok deklaruj´ ı promˇnn´ (viz. ˇ´st 4.2).
                          ıc´     e e        ca

  2. Najdi deklaraci promˇnn´ a ukl´dej jej´ parametry do kontejneru CContainer-
                         e e       a       ı
     Variable:

      (a) Separuj n´zev promˇnn´, pˇeved’ ho na mal´ p´
                   a        e e r                  a ısmena a vloˇ do kontejneru.
                                                                 z
      (b) Detekuj, zda deklarace promˇnn´ obsahuje specifikaci adresy, pokud ano,
                                     e e
          uloˇ adresu v kontejneru.
             z
      (c) Identifikuj datov´ typ promˇnn´, pokud se jedn´ o funkˇn´ blok, sdˇl kon-
                          y          e e                a        c ı       e
          tejneru poˇadavek na vloˇen´ hlaviˇkov´ho souboru s pˇ´ sn´m funkˇn´
                    z             z ı       c e                rısluˇ y      c ım
          blokem.
      (d) Pokud se jedn´ o standardn´ datov´ typ, detekuj pˇ´
                       a             ı     y               rıpadnou deklaraci inicial-
          izaˇn´ hodnoty. V pˇ´ e, ˇe je promˇnn´ inicializov´na, uloˇ inicializaˇn´
             c ı              rıpadˇ z         e a             a      z           c ı
          hodnotu do kontejneru.

                                         20
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                                                    Deklarace promˇnn´ch
                                                                                     e y


  3. Existuje-li deklarace dalˇ´ promˇnn´, opakuj vˇe od bodu 2.
                              sı     e e           s

  4. Detekuj konec bloku promˇnn´ch, uzavˇi kontejner promˇnn´ch a pˇidej ho do
                                e y          r               e y        r
     kontejneru obsahuj´ ıho jednotliv´ kontejnery promˇnn´ch platn´ch v aktu´ln´
                       ıc´            e                e y         y         a ım
     programov´m bloku.
               e


4.2        Deklarace promˇnn´ch
                         e y
Jednotliv´ promˇnn´ se deklaruj´ v nˇkolika typech blok˚ s r˚zn´m v´znamem. Jed-
          e      e e           ı     e                  u   u y     y
notliv´ druhy blok˚ promˇnn´ch jsou povoleny v r˚zn´ch kontextech PLC k´du. Promˇnn´
      e           u     e y                     u y                    o        e e
se zapisuj´ zp˚sobem uveden´m v uk´zce 4.1.
          ı u              y        a


...
Zaˇ´tek bloku promˇnn´ch
  ca              e y
...
typ [AT adresa]: N´zev promˇnn´ [:= hodnota];
                  a        e e
...
Konec bloku promˇnn´ch
                e y
...



                              Uk´zka 4.1: Deklarace promˇnn´
                                a                       e e

   Kaˇd´ promˇnn´ mus´ obsahovat datov´ typ a n´zev. Pokud je datov´ typ promˇnn´
       z a       e a      ı                 y       a                    y        e e
                                                         1
jeden ze z´kladn´ datov´ch typ˚ uveden´ch v tab.4.1 , m˚ˇe deklarace promˇnn´ ob-
          a       ıch      y      u         y                uz               e e
sahovat jeˇtˇ kl´cov´ slovo AT n´sledovan´ adresou ve tvaru uveden´m v tab.4.3. D´le
           s e ıˇ e              a          e                         e             a
v tomto pˇ´ e m˚ˇe deklarace obsahovat inicializaˇn´ hodnotu promˇnn´ oddˇlenou
           rıpadˇ uz                                   c ı               e e    e
pomoc´ :=.
       ı
   Jako datov´ typ m˚ˇe b´t pouˇit tak´ n´zev funkˇn´ bloku, zde je tedy tˇeba
                y       uz y         z       e a          c ıho                   r
tak´ zajistit, aby se vygeneroval ˇ´dek pro proveden´ include pˇ´ sn´ho hlaviˇkov´ho
   e                              ra                  ı         rısluˇ e       c e
souboru obsahuj´ ıho deklaraci funkˇn´ bloku. Cel´ deklarace je ukonˇena pomoc´ ;.
                  ıc´                 c ıho           a                   c         ı
   Uk´zka 4.2 uv´d´ pˇ´
       a           a ı rıklad deklarace nˇkolika promˇnn´ch tak,aby byl patrn´ konkr´tn´
                                         e            e y                    y       e ı
z´pis promˇnn´ v programu. Pro vˇtˇ´ n´zornost jsou zaps´ny v r´mci bloku lok´ln´
 a          e e                     e sı a                   a      a            a ıch
promˇnn´ch.
     e y

4.2.1       Pˇ´ e adresy
             rım´
V tab.4.2 je uvedeno nˇkolik uk´zek pˇ´ ych adres pro PLC. Adresa se vˇdy skl´d´ z
                       e        a     rım´                              z      a a
                                  a        y                ıc´              e’ e
prefixu, kter´ definuje typ adresy n´sledovan´ prefixem, definuj´ ım velikost pamˇt ov´ho
             y
bloku, kter´mu adresa odpov´ a.
           e                 ıd´
  1
      V tabulce jsou uvedeny pouze datov´ typy podporovan´ ve vytv´ˇen´m softwarov´m PLC.
                                        e                e        ar e            e


                                               21
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                                          Deklarace promˇnn´ch
                                                                           e y


      Datov´ typ
           y        Velikost    Pozn´mka
                                    a
      BOOL                 1
      SINT                 8
      INT                 16
      DINT                32
      USINT                8
      UINT                16
      UDINT               32
      REAL
      TIME                 64   Dostupn´ pouze jako konstanta urˇuj´ ı pe-
                                        y                       c ıc´
                                riodu spouˇtˇn´ programu.
                                          se ı
      BYTE                  8
      WORD                 16
      DWORD                32


       Tabulka 4.1: Pˇehled z´kladn´ datov´ch typ˚ pouˇiteln´ch v PLC.
                     r       a     ıch    y      u    z     y


VAR
   current: DINT;
   otacky: DINT := 0;
   rps AT %QB10: DINT := 0;
   sp AT %IB10: DINT;
   forward AT %Q0.0: BOOL := FALSE;
   backward AT %Q0.1: BOOL := FALSE;
END_VAR



            Uk´zka 4.2: Uk´zka deklarace jednotliv´ch promˇnn´ch.
              a           a                       y       e y

                 Adresa           Pozn´mka
                                        a
                 %QX35, %Q35      V´stupn´ bit 37
                                    y       ı
                 %MX3.5           5 bit 3 bytu ve vnitˇn´ pamˇti
                                                      r ı    e
                 %IW23            Vstupn´ slovo 23
                                          ı


                   Tabulka 4.2: Uk´zky z´pisu adres pro PLC.
                                  a     a

                   y        u                 e’ y
  Pˇehled jednotliv´ch prefix˚ pro adresaci pamˇt ov´ch m´ PLC je uveden v tab.4.3.
   r                                                    ıst




                                       22
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                             Pˇehled blok˚ pro deklaraci promˇnn´ch
                                                 r          u                   e y


               Adresa     Pozn´mka
                              a
               Typ
               Q          Adresa v´stupu
                                  y
               I          Adresa vstupu
               M          Adresa ve vnitˇn´ pamˇti
                                        r ı    e
               Velikost
               X          Adresa   specifikuje   jeden bit
               Nic        Adresa   specifikuje   jeden bit
               B          Adresa   specifikuje   jeden byte (8bit˚)
                                                                u
               W          Adresa   specifikuje   jedno slovo (16bit˚)
                                                                  u
               D          Adresa   specifikuje   dvojit´ slovo (32bit˚)
                                                      e             u
               L          Adresa   specifikuje   dlouh´ slovo (64bit˚)
                                                      e             u


              Tabulka 4.3: Zp˚sob z´pisu pˇ´ ych adres pro PLC.
                             u     a      rım´

4.3     Pˇehled blok˚ pro deklaraci promˇnn´ch
         r          u                   e y
N´sleduj´ ı ˇ´st se zab´v´ v´znamem a zp˚sobem z´pisu jednotliv´ch typ˚ blok˚
 a      ıc´ ca         y a y               u         a         y      u     u
promˇnn´ch. Informce zde uveden´ jsou ˇerp´ny z [5].
     e y                         e     c a
   Norma [5] definuje n´sleduj´ ı typy promˇnn´ch:
                       a     ıc´          e y

   • Glob´ln´ promˇnn´ - pouˇ´ ı se pro z´pis promˇnn´ch dostupn´ch v cel´m
         a ı       e e      zıvaj´       a        e y           y        e
     PLC programu.

   • Lok´ln´ promˇnn´ - pouˇ´ ı se pro deklaraci lok´ln´ promˇnn´ch v r´mci
         a ı        e e      zıvaj´                 a ıch    e y       a
     funkce, funkˇn´ bloku nebo bloku program.
                 c ıho

   • Extern´ promˇnn´ - pouˇ´ ı se k definici odkazu na glob´ln´ promˇnn´ v
            ı       e e         zıvaj´                     a ı      e e
     r´mci blok˚ funkce, funkˇn´ blok nebo blok program.
      a        u             c ı

   • Vstupn´ promˇnn´ - pouˇ´ ı se pro deklaraci vstupn´ parametr˚ funkc´
             ı     e e        zıvaj´                   ıch       u      ı,
     funkˇn´ blok˚ nebo blok˚ typu program.
         c ıch   u          u

   • V´stupn´ promˇnn´ - pouˇ´ ı se pro deklaraci v´stupn´ parametr˚ funkˇn´
       y       ı      e e      zıvaj´              y     ıch       u     c ıch
     blok˚ a blok˚ typu program.
         u       u

   • Vstupnˇ/v´stupn´ promˇnn´ - zastupuj´ ulohu parametr˚ pˇed´van´ch ref-
              e y        ı      e e           ı´         u r a y
     erenc´ v r´mci blok˚ program a funkˇn´ blok˚.
          ı    a        u               c ıch   u

4.3.1   Glob´ln´ promˇnn´
            a ı      e e
Glob´ln´ promˇnn´ je moˇn´ deklarovat v r´mci bloku CONFIGURATION, pˇ´
     a ı     e e       z e               a                          rıpadnˇ
                                                                          e
v r´mci podbloku konfigurace RESOURCE. Glob´ln´ promˇnn´ jsou n´slednˇ dos-
   a                                            a ı    e e      a     e
tupn´ v cel´m PLC programu, pˇiˇemˇ z blok˚ typu FUNCTION, PROGRAM a
     e     e                    rc z         u

                                        23
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                            Pˇehled blok˚ pro deklaraci promˇnn´ch
                                                r          u                   e y


FUNCTION BLOCK je tˇeba se na nˇ odk´zat pomoc´ deklarace VAR EXTERNAL
                          r            e    a       ı
(viz.4.3.2). Zp˚sob deklarace bloku glob´ln´ promˇnn´ch je patrn´ z uk´zky 4.3.
               u                         a ıch   e y            y     a


... nadˇazen´ blok ...
       r    y
   VAR_GLOBAL
      ...
      Deklarace jednotliv´ch promˇnn´ch;
                         y       e y
      ...
   END_VAR
... pokraˇov´n´ nadˇazen´ho bloku ...
         c a ı     r    e



             Uk´zka 4.3: Deklarace glob´ln´ promˇnn´ch v programu.
               a                       a ıch    e y


4.3.2    Extern´ promˇnn´
               ı     e e
Blok extern´ promˇnn´ch se vyuˇ´ a k odkazu na glob´ln´ promˇnnou, kterou chceme
            ıch      e y           zıv´                 a ı      e
vyuˇ´ v r´mci blok˚ PROGRAM, FUNCTION a FUNCTION BLOCK. V tomto
    zıt    a          u
bloku lze pouˇ´ pouze deklaraci promˇnn´ bez specifikace adresy, kde se nach´z´ ani
              zıt                       e e                                    a ı,
deklarovat inicializaˇn´ hodnotu - tu je moˇno specifikovat v r´mci deklarace promˇnn´
                     c ı                   z                  a                   e e
v bloku VAR GLOBAL. Zp˚sob deklarace bloku glob´ln´ promˇnn´ch je patrn´ z
                             u                         a ıch       e y              y
uk´zky 4.4.
  a


... nadˇazen´ blok ...
       r    y
   VAR_EXTERNAL
      ...
      Deklarace jednotliv´ch promˇnn´ch;
                         y       e y
      ...
   END_VAR
... pokraˇov´n´ nadˇazen´ho bloku ...
         c a ı     r    e



             Uk´zka 4.4: Deklarace extern´ promˇnn´ch v programu.
               a                         ıch   e y


4.3.3    Lok´ln´ promˇnn´
            a ı      e e
Lok´ln´ promˇnn´ lze pouˇ´ pouze v r´mci programov´ch blok˚ PROGRAM, FUNC-
    a ı      e e        zıt         a             y       u
TION a FUNCTION BLOCK. Promˇnn´ deklarovan´ jako lok´ln´ maj´ platnost pouze
                                  e e           e        a ı   ı
v programov´m bloku, kde jsou deklarov´ny.
            e                         a

                                         24
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                         Pˇehled blok˚ pro deklaraci promˇnn´ch
                                             r          u                   e y


   V pˇ´ e funkˇn´ blok˚ a blok˚ typu program si lok´ln´ promˇnn´ uchov´vaj´
        rıpadˇ     c ıch     u       u                   a ı       e e      a ı
svoji hodnotu z pˇedchoz´ vol´n´ po celou dobu existence instance funkˇn´ bloku.
                 r       ıho    a ı                                   c ıho
   Zp˚sob deklarace bloku lok´ln´ promˇnn´ch je patrn´ z uk´zky 4.5.
       u                       a ıch    e y            y      a


... nadˇazen´ blok ...
       r    y
   VAR
      ...
      Deklarace jednotliv´ch promˇnn´ch;
                         y       e y
      ...
   END_VAR
... pokraˇov´n´ nadˇazen´ho bloku ...
         c a ı     r    e



             Uk´zka 4.5: Deklarace lok´ln´ promˇnn´ch v programu.
               a                      a ıch    e y


4.3.4    Vstupn´ promˇnn´
               ı     e e
Bloky vstupn´ promˇnn´ch lze vyuˇ´
              ıch      e y           zıvat v r´mci blok˚ PROGRAM, FUNCTION
                                              a        u
a FUNCTION BLOCK. V jejich deklaraci nelze specifikovat adresu a vyuˇ´ ı se jako
                                                                       zıvaj´
vstupn´ parametry v´ˇe uveden´ch blok˚. Zp˚sob deklarace bloku vstupn´ promˇnn´ch
       ı           ys        y        u    u                         ıch      e y
je patrn´ z uk´zky 4.6.
         y     a


... nadˇazen´ blok ...
       r    y
   VAR_INPUT
      ...
      Deklarace jednotliv´ch promˇnn´ch;
                         y       e y
      ...
   END_VAR
... pokraˇov´n´ nadˇazen´ho bloku ...
         c a ı     r    e



            Uk´zka 4.6: Deklarace vstupn´ promˇnn´ch v programu.
              a                         ıch   e y


4.3.5    V´stupn´ promˇnn´
          y     ı     e e
V´stupn´ promˇnn´ lze pouˇ´ pouze v r´mci blok˚ PROGRAM a FUNCTION BLOCK.
 y      ı     e e         zıt         a       u
V jejich deklaraci nelze specifikovat adresu a vyuˇ´ ı se pro pˇed´v´n´ hodnot z
                                                  zıvaj´      r a a ı
aktu´ln´ programov´ho bloku do bloku nadˇazen´ho. Zp˚sob deklarace bloku v´stupn´
    a ıho            e                     r    e       u                 y     ıch
promˇnn´ch je patrn´ z uk´zky 4.7.
     e y            y      a

                                       25
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka
Diplomka

More Related Content

Viewers also liked (20)

NWA - Network World Alliance - Vie at home
NWA - Network World Alliance - Vie at homeNWA - Network World Alliance - Vie at home
NWA - Network World Alliance - Vie at home
 
Olympic games 2012 - Atletika
Olympic games 2012 - AtletikaOlympic games 2012 - Atletika
Olympic games 2012 - Atletika
 
Adopce signatur
Adopce signaturAdopce signatur
Adopce signatur
 
Prezentace brunch 2011_mashup_9.3
Prezentace brunch 2011_mashup_9.3Prezentace brunch 2011_mashup_9.3
Prezentace brunch 2011_mashup_9.3
 
Důvěryhodný reporting - Jak věřit
Důvěryhodný reporting - Jak věřitDůvěryhodný reporting - Jak věřit
Důvěryhodný reporting - Jak věřit
 
Kolocová, Kateřina: Josef Veverka
Kolocová, Kateřina: Josef VeverkaKolocová, Kateřina: Josef Veverka
Kolocová, Kateřina: Josef Veverka
 
Wychowanie dzieci i młodzieży, tom II
Wychowanie dzieci i młodzieży, tom IIWychowanie dzieci i młodzieży, tom II
Wychowanie dzieci i młodzieży, tom II
 
FAnn vánoce 2005
FAnn vánoce 2005FAnn vánoce 2005
FAnn vánoce 2005
 
Articaine voor N.V.B.T. pdf
Articaine voor N.V.B.T. pdfArticaine voor N.V.B.T. pdf
Articaine voor N.V.B.T. pdf
 
Facebook Cookbook
Facebook CookbookFacebook Cookbook
Facebook Cookbook
 
Praha Places
Praha PlacesPraha Places
Praha Places
 
VANCHIT JANTA
VANCHIT JANTAVANCHIT JANTA
VANCHIT JANTA
 
Balkonu renovācija daudzdzīvokļu dzīvojamās mājās
Balkonu renovācija daudzdzīvokļu dzīvojamās mājās Balkonu renovācija daudzdzīvokļu dzīvojamās mājās
Balkonu renovācija daudzdzīvokļu dzīvojamās mājās
 
html
html html
html
 
Jedlé rostliny - Jídlo obecné
Jedlé rostliny - Jídlo obecnéJedlé rostliny - Jídlo obecné
Jedlé rostliny - Jídlo obecné
 
Europe direct presentation
Europe direct  presentationEurope direct  presentation
Europe direct presentation
 
The uk
The ukThe uk
The uk
 
Rudy mesic gray_txt_s
Rudy mesic gray_txt_sRudy mesic gray_txt_s
Rudy mesic gray_txt_s
 
MasterThesis
MasterThesisMasterThesis
MasterThesis
 
Anatomie d'un email - E-commerce
Anatomie d'un email - E-commerceAnatomie d'un email - E-commerce
Anatomie d'un email - E-commerce
 

Similar to Diplomka

Loskot_Bachelor_Thesis
Loskot_Bachelor_ThesisLoskot_Bachelor_Thesis
Loskot_Bachelor_ThesisMartin Loskot
 
BPTX_2014_1_11320_0_378624_0_158202
BPTX_2014_1_11320_0_378624_0_158202BPTX_2014_1_11320_0_378624_0_158202
BPTX_2014_1_11320_0_378624_0_158202Petr Hude?ek
 
filip-zavadil-bp-2011
filip-zavadil-bp-2011filip-zavadil-bp-2011
filip-zavadil-bp-2011Filip Zavadil
 
Rozšíření nástroje pro analýzu spustitelných souborů
Rozšíření nástroje pro analýzu spustitelných souborůRozšíření nástroje pro analýzu spustitelných souborů
Rozšíření nástroje pro analýzu spustitelných souborůMilan Zavoral
 
filip-zavadil-dp-2013
filip-zavadil-dp-2013filip-zavadil-dp-2013
filip-zavadil-dp-2013Filip Zavadil
 
ČTÚ D-Book, 4.03, srpen 2016
ČTÚ D-Book, 4.03, srpen 2016ČTÚ D-Book, 4.03, srpen 2016
ČTÚ D-Book, 4.03, srpen 2016Jan Brychta
 
Hydrologické analýzy v distribuovaném prostředí
Hydrologické analýzy v distribuovaném prostředíHydrologické analýzy v distribuovaném prostředí
Hydrologické analýzy v distribuovaném prostředíGeokomunita
 
Testování systému pro on-line rezervaci vstupenek do O2 Areny
Testování systému pro on-line rezervaci vstupenek do O2 ArenyTestování systému pro on-line rezervaci vstupenek do O2 Areny
Testování systému pro on-line rezervaci vstupenek do O2 ArenyOndřej Machulda
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware HoudinyCESNET
 
Viktor Kajml bachelor thesis
Viktor Kajml bachelor thesisViktor Kajml bachelor thesis
Viktor Kajml bachelor thesiskajmlv
 
Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Martin Cerveny
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)almadcz
 
Nízkoúrovňové programování
Nízkoúrovňové programováníNízkoúrovňové programování
Nízkoúrovňové programováníMartin Děcký
 

Similar to Diplomka (20)

Loskot_Bachelor_Thesis
Loskot_Bachelor_ThesisLoskot_Bachelor_Thesis
Loskot_Bachelor_Thesis
 
BPTX_2014_1_11320_0_378624_0_158202
BPTX_2014_1_11320_0_378624_0_158202BPTX_2014_1_11320_0_378624_0_158202
BPTX_2014_1_11320_0_378624_0_158202
 
User print 2
User print 2User print 2
User print 2
 
filip-zavadil-bp-2011
filip-zavadil-bp-2011filip-zavadil-bp-2011
filip-zavadil-bp-2011
 
Rozšíření nástroje pro analýzu spustitelných souborů
Rozšíření nástroje pro analýzu spustitelných souborůRozšíření nástroje pro analýzu spustitelných souborů
Rozšíření nástroje pro analýzu spustitelných souborů
 
filip-zavadil-dp-2013
filip-zavadil-dp-2013filip-zavadil-dp-2013
filip-zavadil-dp-2013
 
ČTÚ D-Book, 4.03, srpen 2016
ČTÚ D-Book, 4.03, srpen 2016ČTÚ D-Book, 4.03, srpen 2016
ČTÚ D-Book, 4.03, srpen 2016
 
Hydrologické analýzy v distribuovaném prostředí
Hydrologické analýzy v distribuovaném prostředíHydrologické analýzy v distribuovaném prostředí
Hydrologické analýzy v distribuovaném prostředí
 
Testování systému pro on-line rezervaci vstupenek do O2 Areny
Testování systému pro on-line rezervaci vstupenek do O2 ArenyTestování systému pro on-line rezervaci vstupenek do O2 Areny
Testování systému pro on-line rezervaci vstupenek do O2 Areny
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware Houdiny
 
Viktor Kajml bachelor thesis
Viktor Kajml bachelor thesisViktor Kajml bachelor thesis
Viktor Kajml bachelor thesis
 
SVN základy
SVN základySVN základy
SVN základy
 
Master_Thesis
Master_ThesisMaster_Thesis
Master_Thesis
 
thesis
thesisthesis
thesis
 
Diplomka
DiplomkaDiplomka
Diplomka
 
Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace
 
openMagazin 3/2009
openMagazin 3/2009openMagazin 3/2009
openMagazin 3/2009
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)
 
Nízkoúrovňové programování
Nízkoúrovňové programováníNízkoúrovňové programování
Nízkoúrovňové programování
 
Unix
UnixUnix
Unix
 

Diplomka

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