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
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                                       Implementace promˇnn´ch
                                                                           e y



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



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

4.3.6    Vstupnˇ/v´stupn´ promˇnn´
               e y      ı     e e
Bloky vstupnˇ/v´stupn´ promˇnn´ch lze pouˇ´ pouze v r´mci blok˚ PROGRAM
              e y      ıch      e y            zıt         a        u
a FUNCTION BLOCK. V deklaraci jednotliv´ch promˇnn´ch nelze specifikovat adresu
                                           y        e y
a zastupuj´ ulohu parametr˚ pˇed´van´ch referenc´ Tyto parametry lze vyuˇ´ jak pro
          ı´               u r a y               ı.                     zıt
pˇed´n´ hodnoty do volan´ho bloku, tak pro z´ an´ t´to hodnoty po ukonˇen´ vol´n´
 r a ı                   e                   ısk´ ı e                   c ı    a ı
pˇ´ sn´ho bloku. Zp˚sob deklarace bloku vstupnˇ/v´stupn´ promˇnn´ch je patrn´
 rısluˇ e            u                           e y     ıch      e y            y
z uk´zky 4.8.
     a


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



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



4.4     Implementace promˇnn´ch
                         e y
Implementace promˇnn´ch mus´ splˇovat vˇechny poˇadavky, kter´ vypl´vaj´ z pˇedchoz´
                 e y       ı n         s        z            e     y ı r           ı
ˇ´sti:
ca

  1. Spolupr´ce se vˇemi datov´mi typy zvolen´mi pro implementaci.
            a       s         y              y

  2. Moˇnost specifikovat absolutn´ adresu, na kter´ se promˇnn´ nach´z´
       z                         ı                e        e a      a ı.

                                        26
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                                        Implementace promˇnn´ch
                                                                            e y


  3. Moˇnost specifikovat inicializaˇn´ hodnotu promˇnn´.
       z                           c ı             e e

  4. Pro vstupnˇ/v´stupn´ promˇnn´ umoˇnit pˇedat hodnotu promˇnn´ do bloku,
                e y        ı     e e     z    r                e e
     kter´ provedl vol´n´ pˇ´ sn´ho funkˇn´ nebo programov´ho bloku.
         y            a ı rısluˇ e      c ıho             e

   C´ılem tedy bude vytvoˇit pˇ´ sn´ knihovn´ tˇ´ kter´ umoˇn´ akce definovan´ v
                            r   rısluˇ e        ı rıdy,    e    z ı               e
pˇedchoz´ pˇehledu a vypl´vaj´ ı z pˇedchoz´ ˇ´st. Pˇehled navrˇen´ch tˇ´ a poˇadavky
 r        ım r               y ıc´ r         ı ca    r         z y     rıd    z
na jejich funkcionalitu jsou uvedeny v tab.4.4.

           Tˇ´
            rıda             Funkcionalita
           CVariable         Template tˇ´rıda implementuj´ ı vlastnosti
                                                           ıc´
                             promˇnn´ch pro vˇechny z´kladn´ datov´
                                  e y           s        a       ı     e
                             typy z tab.4.1.
           CPropertyIn       Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti
                                                       r ıc´
                             promˇnn´ch deklarovan´ch v r´mci bloku
                                  e y               y         a
                             VAR INPUT.
           CPropertyOut      Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti
                                                       r ıc´
                             promˇnn´ch deklarovan´ch v r´mci bloku
                                  e y               y         a
                             VAR OUTPUT.
           CPropertyInOut    Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti
                                                       r ıc´
                             promˇnn´ch deklarovan´ch v r´mci bloku
                                  e y               y         a
                             VAR IN OUT, vˇetnˇ pˇ´
                                              c e rıpadn´ho pˇed´n´
                                                             e     r a ı
                             hodnoty promˇnn´ do bloku, kter´ provedl
                                            e e                 y
                             vol´n´ pˇ´ sn´ho funkˇn´
                                a ı rısluˇ e          c ıho nebo pro-
                             gramov´ho bloku.
                                    e


    Tabulka 4.4: Pˇehled tˇ´ pro implementaci promˇnn´ch v softwarov´m PLC.
                  r       rıd                     e y               e



4.4.1    Parser zdrojov´ho k´du
                       e    o
V r´mci parseru zdrojov´ho k´du pro PLC budou v generovan´m C++ k´du vyuˇity
    a                   e      o                               e         o       z
objekty z tab.4.4. Pro vlastn´ zpracov´n´ k´du bude vytvoˇen kontejner CContainer-
                             ı         a ı o               r
Variable pro udrˇov´n´ informac´ o aktu´ln´ zpracov´van´ promˇnn´ (informace o da-
                z a ı            ı       a ı        a e         e e
tov´m typu, n´zvu, adrese, inicializaˇn´ hodnotˇ atp.). D´le bude vytvoˇena template
    e         a                      c ı       e         a             r
tˇ´ CContainerContainer, kter´ bude slouˇit ke sdruˇov´n´ kontejner˚ patˇ´ ıch do
 rıda                            a           z          z a ı          u    rıc´
jednoho bloku PLC programu.

4.4.2    Vygenerovan´ zdrojov´ k´d
                    y        y o
Vygenerovan´ zdrojov´ k´d v C++ je rozdˇlen do n´sleduj´ ıch ˇ´st´
           y        y o                e        a      ıc´ ca ı:

   • V pˇ´ e, ˇe se nejedn´ o glob´ln´ promˇnn´:
        rıpadˇ z          a       a ı      e e


                                        27
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                                         Implementace promˇnn´ch
                                                                             e y


       1. Povinn´ ˇ´st deklarace vlastn´ promˇnn´ v private nebo public ˇ´sti deklarace
                a ca                   ı     e e                        ca
          objektu, kter´ reprezentuje dan´ blok z programu.
                       y                  y
                   a ca                  rıdy   s ’ ıc´
       2. Nepovinn´ ˇ´st v konstruktoru tˇ´ zajiˇt uj´ ı inicializaci promˇnn´. Gen-
                                                                           e e
          erov´no pouze v pˇ´ e, ˇe promˇnn´ m´ definov´nu inicializaˇn´ hodnotu.
              a            rıpadˇ z       e a a            a             c ı
       3. Pro v´stupn´ a vstupnˇ-v´stupn´ promˇnn´ je jeˇtˇ generov´n k´d resetuj´ ı
               y     ı          e y     ı     e e       se         a o           ıc´
          promˇnnou pro dalˇ´ pouˇit´
               e             sı   z ı.

   • V pˇ´ e, ˇe se jedn´ o glob´ln´ promˇnnou, je vygenerov´na deklarace promˇnn´
        rıpadˇ z         a      a ı       e                 a                   e e
     typu CVariable s pˇ´ sn´m datov´m typem a pˇ´
                       rısluˇ y         y            rıpadnou inicializaˇn´ hodnotou
                                                                        c ı
     promˇnn´.
          e e

   Po zpracov´n´ zdrojov´ho k´du je pro lok´ln´ promˇnnou vygenerov´n k´d odpov´ ıc´
              a ı       e    o             a ı      e              a o         ıdaj´ ı
uk´zce 4.9. Ve vygenerovan´m k´du je vyuˇita template tˇ´ CVariable.
  a                       e    o          z             rıda

// deklarace tˇ´dy,
              rı
// hlaviˇkov´ soubor
         c  y
// counter AT %QB3: INT := 3;     // konstruktor tˇ´dy
                                                  rı
class init                        // counter AT %QB3: INT := 3;
{                                 init :: init(void)
...                               {
private:                          #line 3 "test.plc"
#line 3 "test.plc"                   m_counter = CVariable<INT> ((INT) 3, "QB3");
   CVariable<INT> m_counter;      }
...
};


          Uk´zka 4.9: Uk´zka k´du vygenerovan´ho pro lok´ln´ promˇnn´.
            a           a     o              e          a ı      e e

    K´d generovan´ pro parametry funkc´ funkˇn´ blok˚ nebo program˚ je patrn´
      o           y                     ı,    c ıch     u              u        y
z uk´zky 4.10. Ve vygenerovan´m k´du je vyuˇita jedna z template tˇ´ CPropertyIn,
     a                        e    o        z                     rıd
CPropertyOut nebo CPropertyInOut dle typu parametru pro pˇ´  rıstup k parametru z
m´ısta, odkud je provedeno vol´n´ a template tˇ´ CVariable, kter´ je pˇiˇazena k
                               a ı             rıda               a     rr
objektu a je vyuˇ´ ana k pˇ´
                zıv´      rıstupu k parametru uvnitˇ programu.
                                                    r




                                         28
ZPRACOVAN´ PROMENNYCH PLC PROGRAMU
       ´ I     ˇ  ´                                     Implementace promˇnn´ch
                                                                         e y




// deklarace tˇ´dy,
               rı
// hlaviˇkov´ soubor
         c  y
// vstup: INT;
class init                      // soubor s implementac´ tˇ´dy
                                                       ı rı
{                               // konstruktor tˇ´dy
                                                rı
private:                        // vstup: INT;
#line 6 "test.plc"              init :: init(void)
   CVariable<INT> m_vstup;      {
   ...                          #line 6 "test.plc"
public:                            vstup = CPropertyIn<INT> (&m_vstup);
#line 6 "test.plc"              }
   CPropertyIn<INT> vstup;
   ...
};


Uk´zka 4.10: Uk´zka k´du vygenerovan´ho pro parametry funkc´ funkˇn´ blok˚ nebo
   a           a     o              e                      ı,    c ıch   u
program˚.
       u




                                      29
Kapitola 5

Zpracov´n´ jazyka IL
       a ı

Tato ˇ´st uv´d´ pˇehled jednotliv´ch instrukc´ jazyka IL, zab´v´ se jejich zpracov´n´
     ca     a ı r                y           ı                y a                 a ım
a vykon´v´n´ v softwarov´m PLC. Informace zde uveden´ jsou ˇerp´ny z [5].
        a a ım              e                               e     c a
   Jednotliv´ instrukce jazyka IL m˚ˇeme rozdˇlit dle funkˇn´ v´znamu do n´sleduj´ ıch
            e                      uz          e           c ıho y             a      ıc´
kategori´
        ı:

  1. Pˇiˇazovac´ instrukce - instrukce pro nastaven´ aktu´ln´ hodnoty z´sobn´
       rr      ı                                   ı     a ı           a    ıku,
     promˇnn´ch nebo adres.
          e y

  2. Logick´ instrukce - instrukce umoˇnuj´ ı logick´ operace mezi promˇnn´mi.
           e                          zˇ ıc´        e                  e y

  3. Aritmetick´ instrukce - instrukce pro n´soben´ dˇlen´ sˇ´ an´ atd.
               e                            a     ı, e ı, cıt´ ı

  4. Porovn´vac´ instrukce - instrukce slouˇ´ ı k porovn´n´ argumentu a aktu´ln´
             a    ı                        zıc´         a ı                 a ıho
     stavu na z´sobn´
               a    ıku.

  5. Instrukce ˇ´rızen´ toku programu - instrukce pro podm´ en´ skoky, vol´n´
                      ı                                   ınˇ e           a ı
     funkc´ a funkˇn´ blok˚.
          ı       c ıch    u

    Kaˇd´ z kategori´ uveden´ch v´ˇe je vˇnov´na samostatn´ ˇ´st v t´to kapitole
       z e             ı       y      ys     e     a             a ca        e
popisuj´ ı kr´tce vlastnosti a specifika jednotliv´ch ˇ´st´
        ıc´ a                                     y ca ı.
    Dle [5] by mˇl aktu´ln´ datov´ typ na z´sobn´ odpov´
                 e       a ı      y        a      ıku      ıdat datov´u typu operandu.
                                                                       e
Vzhledem k vyuˇit´ vlastnost´ jazyka C++ jsou zajiˇtˇny implicitn´ konverze mezi
                   z ı          ı                       se               ı
vˇtˇinou dostupn´ch datov´ch typ˚. Pokud poˇadovan´ konverze neexistuje, je chyba
 es                y         y       u           z      a
hl´ˇena v okamˇiku kompilace vygenerovan´ho C++ souboru.
  as             z                           e
    Dle [5] lze logick´, aritmetick´ a porovn´nac´ instrukce ˇetˇzit pomoc´ z´vorek,
                       e            e          a ı              r e            ı a
pˇiˇemˇ prav´ z´vorka m´ vˇdy v´znam vyhodnocen´ v´razu od lev´ z´vorky. Uk´zka
 rc z          a a         a z      y                 ı y              e a         a
5.1 uv´d´ takov´ vol´n´ Tato vlastnost nen´ v implementovan´m softwarov´m PLC dos-
       a ı       e a ı.                    ı                  e             e
             ’ z y y
tupn´, nebot kaˇd´ v´raz lze nahradit takovou posloupnost´ operac´ kter´ z´vorkov´n´
     a                                                      ı       ı,     a a       a ı
zcela nahrad´ ı.




                                          30
ZPRACOVAN´ JAZYKA IL
       ´ I                                                        Pˇiˇazovac´ instrukce
                                                                   rr       ı



MUL ( input1
SUB input2
)
(* V´sledek je interpretov´n jako:
    y                     a             *)
(* result := result * (input1 - input2) *)



                Uk´zka 5.1: Pouˇit´ z´vorkovan´ch v´raz˚ v instrukc´
                  a            z ı a          y    y u             ıch.

5.1     Pˇiˇazovac´ instrukce
         rr       ı
Tato ˇ´st se zab´v´ zpracov´n´ instrukc´ kter´ umoˇnuj´ pˇiˇazovat hodnoty promˇnn´ch
     ca         y a        a ım          ı,    e     zˇ ı r r                     e y
a adres. Jednotliv´ instrukce, kter´ do t´to ˇ´sti spadaj´ a jejich v´znamje uveden v
                  e                e     e ca            ı           y
tab.5.1.

        Instrukce     Popis
           LD         Nastav´ aktu´ln´ hodnotu na z´sobn´
                               ı    a ı             a     ıku. Argumentem
                      m˚ˇe b´t promˇnn´, adresa nebo konstanta.
                        uz y          e a
           LDN        Nastav´ aktu´ln´ hodnotu na z´sobn´
                               ı    a ı              a     ıku, pˇiˇemˇ ne-
                                                                 rc z
                      jprve provede negaci hodnoty. Argumentem m˚ˇe b´t
                                                                     uz y
                      promˇnn´, adresa nebo konstanta.
                             e a
           ST         Uloˇ´ aktu´ln´ hodnotu ze z´sobn´
                          zı     a ı              a    ıku do poˇadovan´
                                                                   z      e
                      promˇnn´ nebo na poˇadovanou adresu.
                             e e            z
           STN        Uloˇ´ aktu´ln´ hodnotu ze z´sobn´
                          zı     a ı              a    ıku do poˇadovan´
                                                                   z      e
                      promˇnn´ nebo na poˇadovanou adresu, pˇiˇemˇ nejprve
                             e e           z                  rc z
                      provede negaci hodnoty.
            S         Nastav´ obsah boolean promˇnn´ nebo adresy v argu-
                               ı                 e e
                      mentu na 1, prov´d´ se pouze v pˇ´ e, ˇe aktu´ln´
                                        a ı             rıpadˇ z        a ı
                      stav z´sobn´ je TRUE.
                              a   ıku
            R         Nastav´ obsah boolean promˇnn´ nebo adresy v argu-
                               ı                 e e
                      mentu na 0, prov´d´ se pouze v pˇ´ e, ˇe aktu´ln´
                                        a ı             rıpadˇ z        a ı
                      stav z´sobn´ je TRUE.
                              a   ıku


                Tabulka 5.1: Pˇehled pˇiˇazovac´ instrukc´ jazyka IL.
                              r       rr       ıch       ı

    Vygenerovan´ k´d pro vybran´ instrukce je patrn´ z uk´zky 5.2.
                 y o              e                 y     a
    Instrukce, kter´ nastavuj´ aktu´ln´ hodnotu z´sobn´ (ve vygenerovan´m k´du
                   e         ı      a ı          a    ıku                 e   o
promˇnn´ result, definovan´ jako instance tˇ´ CResult) pouˇ´ ı pˇet´zen´ konstruk-
      e a                  a              rıdy              zıvaj´ r ıˇ y
tor objektu pro pˇ´ sn´ datov´ typ.
                  rısluˇ y      y



                                          31
ZPRACOVAN´ JAZYKA IL
       ´ I                                                           Logick´ instrukce
                                                                           e



{   // LD 10
    result = 10;
}
{   // ST vstup
    result.GetValue(m_vstup);
}
{ // STN %QB3
   CVariable<BYTE> tmp0 = CVariable<BYTE>("QB3", 0);
   result.GetValueNeg(tmp0);
}
   // S %QX1.1
if (result == true) {
   CVariable<BIT> tmp0 = CVariable<BIT>("QX1.1", 0);
   tmp0 = 1;
}



       Uk´zka 5.2: Generovan´ C++ k´d pro pˇiˇazovac´ instrukce jazyka IL.
         a                  y      o       rr       ı

5.2     Logick´ instrukce
              e
Tato ˇ´st se zab´v´ zpracov´n´ logick´ch instrukc´ jazyka IL. Pˇehled jednotliv´ch
      ca         y a          a ım       y           ı           r                y
logick´ch instrukc´ je uveden v tab.5.2.
       y           ı
    Vˇechny instrukce spadaj´ ı do t´to ˇ´sti pouˇ´ ı jako prvn´ argument aktu´ln´
      s                       ıc´    e ca         zıvaj´       ı                 a ı
                ıku             y                                    ıt     ’ ˇ´
hodnotu z´sobn´ a jako druh´ argument (operand instrukce) mohou m´ bud cıselnou
          a
konstantu, promˇnnou (pˇ´
                 e        rıpadnˇ parametr funkce/funkˇn´ bloku) nebo pˇ´
                                 e                     c ıho             rımou adresu.
V´sledek proveden´ operace je vˇdy uloˇen na z´sobn´ jako jeho aktu´ln´ hodnota
  y                  e             z     z       a      ık,             a ı
(ve vygenerovan´m k´du promˇnn´ result).
                 e     o        e a
    Jednotliv´ operace jsou implementov´ny jako pˇet´zen´ oper´tor template tˇ´
             e                            a          r ıˇ y    a                 rıdy
CResult z podp˚rn´ PLC knihovny.
                u e
    Uk´zka 5.3 uv´d´ pˇ´
        a          a ı rıklad C++ k´du, kter´ je vygenerov´n pro logick´ instrukce.
                                     o        y              a          e


5.3     Aritmetick´ instrukce
                  e
Tato ˇ´st se zab´v´ zpracov´n´ aritmetick´ch instrukc´ jazyka IL. Pˇehled jednotliv´ch
     ca         y a           a ım          y           ı              r            y
instrukc´ je uveden v tab.5.3. Z´kladn´ sada aritmetick´ch instrukc´ jazyka IL obsahuje
         ı                       a    ı                y            ı
instrukce pro sˇ´ an´ odˇ´ an´ n´soben´ a dˇlen´ vˇech z´kladn´ datov´ch typ˚.
                cıt´ ı,     cıt´ ı, a     ı     e ı s        a       ıch      y      u
Jako prvn´ operand pˇ´ sn´ aritmetick´ operace je vˇdy pouˇita aktu´ln´ hodnota
           ı            rısluˇ e          e               z      z        a ı
z´sobn´
 a     ıku, jako druh´ operand je pouˇit parametr instrukce.
                      y                z
    V´sledek aritmetick´ operace je vˇdy uloˇen zpˇt na z´sobn´ jako jeho aktu´ln´
     y                    e            z      z      e      a     ık               a ı


                                          32
ZPRACOVAN´ JAZYKA IL
       ´ I                                                       Aritmetick´ instrukce
                                                                           e


        Instrukce    Popis
          AND        Na z´sobn´ je uloˇen v´sledek logick´ operace
                             a    ık       z      y              e
                     (Z´sobn´ AND Operand), operand mus´ m´ stejn´ da-
                       a       ık                           ı ıt      y
                     tov´ typ jako aktu´ln´ hodnota z´sobn´
                         y             a ı            a   ıku.
           OR        Na z´sobn´ je uloˇen v´sledek logick´ operace
                             a    ık       z      y              e
                     (Z´sobn´ OR Operand), operand mus´ m´ stejn´ da-
                       a       ık                          ı ıt      y
                     tov´ typ jako aktu´ln´ hodnota z´sobn´
                         y             a ı            a   ıku.
          XOR        Na z´sobn´ je uloˇen v´sledek logick´ operace
                             a    ık       z      y              e
                     (Z´sobn´ XOR Operand), operand mus´ m´ stejn´ da-
                       a       ık                           ı ıt      y
                     tov´ typ jako aktu´ln´ hodnota z´sobn´
                         y             a ı            a   ıku.
          ANDN       Na z´sobn´ je uloˇen v´sledek logick´ operace
                             a    ık       z      y              e
                     (Z´sobn´ AND NOT Operand), operand mus´ m´
                       a       ık                                    ı ıt
                     stejn´ datov´ typ jako aktu´ln´ hodnota z´sobn´
                           y       y            a ı           a    ıku.
          ORN        Na z´sobn´ je uloˇen v´sledek logick´ operace
                             a    ık       z      y              e
                     (Z´sobn´ OR NOT Operand), operand mus´ m´ stejn´
                       a       ık                               ı ıt    y
                     datov´ typ jako aktu´ln´ hodnota z´sobn´
                            y             a ı           a    ıku.
          XORN       Na z´sobn´ je uloˇen v´sledek logick´ operace
                             a    ık       z      y              e
                     (Z´sobn´ XOR NOT Operand), operand mus´ m´
                       a       ık                                    ı ıt
                     stejn´ datov´ typ jako aktu´ln´ hodnota z´sobn´
                           y       y            a ı           a    ıku.


                 Tabulka 5.2: Pˇehled logick´ch instrukc´ jazyka IL.
                               r            y           ı


{   // AND 2#0101_0101
    result = result & 85;
}
{   // XORN 8#07_02
    result = result ^ ~(450);
}



         Uk´zka 5.3: Generovan´ C++ k´d pro logick´ instrukce jazyka IL.
           a                  y      o            e

hodnota.
   Instrukce DIV (dˇlen´ uloˇ´ v pˇ´ e dˇlen´ nulou na z´sobn´ jako aktu´ln´ hod-
                    e ı)     zı   rıpadˇ e ı              a     ık          a ı
notu 0 a informace o chybˇ je vyps´na jako hl´ˇen´ do logu j´dra operaˇn´ syst´mu.
                         e        a          as ı           a         c ıho     e
   Uk´zka 5.4 uv´d´ C++ k´d, kter´ je pro tyto instrukce generov´n.
      a          a ı        o       y                              a




                                         33
ZPRACOVAN´ JAZYKA IL
       ´ I                                                     Porovn´vac´ instrukce
                                                                     a ı


        Instrukce   Popis
          ADD       Na z´sobn´ je uloˇen v´sledek aritmetick´ operace
                         a     ık       z     y              e
                    (Z´sobn´ + Operand), operand mus´ m´ stejn´ datov´
                      a     ık                          ı ıt   y     y
                    typ jako aktu´ln´ hodnota z´sobn´
                                  a ı           a   ıku.
           SUB      Na z´sobn´ je uloˇen v´sledek aritmetick´ operace
                         a     ık       z     y              e
                    (Z´sobn´ - Operand), operand mus´ m´ stejn´ datov´
                      a     ık                         ı ıt    y     y
                    typ jako aktu´ln´ hodnota z´sobn´
                                  a ı           a   ıku.
          MUL       Na z´sobn´ je uloˇen v´sledek aritmetick´ operace
                         a     ık       z     y              e
                    (Z´sobn´ * Operand), operand mus´ m´ stejn´ datov´
                      a     ık                         ı ıt    y     y
                    typ jako aktu´ln´ hodnota z´sobn´
                                  a ı           a   ıku.
           DIV      Na z´sobn´ je uloˇen v´sledek aritmetick´ operace
                         a     ık       z     y              e
                    (Z´sobn´ / Operand), operand mus´ m´ stejn´ datov´
                      a     ık                         ı ıt    y     y
                    typ jako aktu´ln´ hodnota z´sobn´
                                  a ı           a   ıku.


              Tabulka 5.3: Pˇehled aritmetick´ch instrukc´ jazyka IL.
                            r                y           ı


{ // ADD 16#0F
   result = result + 15;
}
{ // MUL %IW4
   CVariable<WORD> tmp0 = CVariable<WORD>("IW4", 0);
   result = result * tmp0;
}



       Uk´zka 5.4: Generovan´ C++ k´d pro aritmetick´ instrukce jazyka IL.
         a                  y      o                e

5.4     Porovn´vac´ instrukce
              a   ı
Tato ˇ´st se zab´v´ zpracov´n´ instrukc´ jazyka IL pro porovn´v´n´ aktu´ln´ stavu
     ca         y a        a ım         ı                     a a ı     a ıho
z´sobn´ a operandu. Pˇehled jednotliv´ch instrukc´ je uveden v tab.5.2.
 a     ıku              r              y           ı
    Vˇechny instrukce modifikuj´ aktu´ln´ hodnotu z´sobn´ na logickou hodnotu
     s                          ı    a ı             a     ıku
TRUE nebo FALSE dle v´sledku porovn´n´
                         y             a ı.
    Uk´zka 5.5 uv´d´ k´d, kter´ odpov´ a vybran´m porovn´vac´ instrukc´ jazyka
       a          a ı o       y      ıd´        y          a ım           ım
IL.


5.5     Instrukce ˇ´
                  rızen´ toku programu
                       ı
Tato ˇ´st se zab´v´ pˇehledem a zpracov´n´ instrukc´ pro ˇ´ ı toku programu. Jedn´
     ca         y a r                  a ım        ı     rızen´                  a
se o instrukce umoˇnuj´ ı prov´dˇt skoky v r´mci programu, volat jin´ programov´
                    zˇ ıc´     a e           a                        e          e

                                        34
ZPRACOVAN´ JAZYKA IL
       ´ I                                               Instrukce ˇızen´ toku programu
                                                                   r´ ı


        Instrukce     Popis
           GT         Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
                          a    ık      z                         y
                      porovn´n´ (Z´sobn´ > Operand).
                            a ı a       ık
            GE        Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
                          a    ık      z                         y
                      porovn´n´ (Z´sobn´ >= Operand).
                            a ı a       ık
            EQ        Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
                          a    ık      z                         y
                      porovn´n´ (Z´sobn´ = Operand).
                            a ı a       ık
            NE        Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
                          a    ık      z                         y
                      porovn´n´ (Z´sobn´ = Operand).
                            a ı a       ık
            LE        Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
                          a    ık      z                         y
                      porovn´n´ (Z´sobn´ <= Operand).
                            a ı a       ık
            LT        Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku
                          a    ık      z                         y
                      porovn´n´ (Z´sobn´ < Operand).
                            a ı a       ık


               Tabulka 5.4: Pˇehled porovn´vac´ instrukc´ jazyka IL.
                             r            a ıch         ı


{   //GT counter
    result = (result > m_counter);
}
{   // NE 10
    result = (result != 10);
}



       Uk´zka 5.5: Generovan´ C++ k´d pro porovn´vac´ instrukce jazyka IL.
         a                  y      o            a ı

bloku a prov´st n´vrat z volan´ho bloku. Pˇehled instrukc´ je uveden v tab.5.5.
               e    a             e          r                 ı
    K´d generovan´ pro jednotliv´ instrukce z tab.5.5 je uveden v uk´zce 5.6. Jak je
      o              y               e                                     a
patrno, instrukce JMP, JMPN a JMPC jsou nahrazeny v jazyce C++ konstrukc´ goto     ı
LABEL;, pˇiˇemˇ n´vˇˇt´ v PLC programu je pˇevedeno do programu v jazyce C++.
             r c z a es ı                         r
Instrukce RET, RETC a RETN jsou nahrazeny C++ vol´n´ return;. a ım
    Sloˇitˇjˇ´ situace nast´v´ v pˇ´ e pouˇit´ instrukc´ CAL, CALC a CALN, kter´
        z e sı               a a    rıpadˇ   z ı            ı                          e
umoˇnuj´ volat instance funkˇn´ blok˚, nebot
     zˇ ı                        c ıch     u       ’ je tˇeba zajistit tak´ pˇed´n´ hod-
                                                         r                 e r a ı
not parametr˚. Dle [5] lze hodnoty parametr˚ pro funkˇn´ bloky pˇed´vat 3 r˚zn´mi
                u                              u             c ı        r a      u y
zp˚soby, tak jak je definov´no v tab.5.6.
  u                           a
    Vytvoˇen´ software podporuje moˇnosti ˇ. 1 a 2. V pˇ´ e referenˇn´ argument˚
           r y                          z    c              rıpadˇ        c ıch        u
funkˇn´ blok˚, kter´ nejsou specifikov´ny, lze takov´ funkˇn´ blok volat s t´ ˇe
     c ıch        u      e                 a               y      c ı             ım, z
se pouˇije implicitn´ hodnota parametru, pˇiˇemˇ pˇ´
        z              ı                     r c z rıpadnou navracenou hodnotu jiˇ     z
nelze z programu z´   ıskat.
    Uk´zka 5.6 uv´d´ k´d vygenerovan´ pˇi vol´n´ instance funkˇn´ bloku.
       a            a ı o                y r     a ı                c ıho


                                          35
ZPRACOVAN´ JAZYKA IL
       ´ I                                             Instrukce ˇızen´ toku programu
                                                                 r´ ı


         Instrukce    Popis
            JMP       Skok na n´vˇˇt´ definovan´ v r´mci programov´ho bloku.
                                 a es ı           e a              e
            CAL       Vol´n´ funkˇn´ bloku.
                          a ı      c ıho
            RET       N´vrat z volan´ho programov´ho bloku.
                        a             e                 e
           JMPN       Podm´ en´ skok na n´vˇˇt´ v r´mci programov´ho bloku
                             ınˇ y            a es ı a              e
                      v pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je FALSE.
                          rıpadˇ z         a ı        a     ıku
           CALN       Podm´ en´ vol´n´ funkˇn´
                             ınˇ e      a ı      c ıho bloku v pˇ´ e, ˇe je
                                                                rıpadˇ z
                      aktu´ln´ stav z´sobn´ FALSE.
                            a ı       a      ıku
           RETN       Podm´ en´ n´vrat z volan´ho programov´ho bloku v
                             ınˇ y a                 e           e
                      pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je FALSE.
                       rıpadˇ z          a ı        a     ıku
           JMPC       Podm´ en´ skok na n´vˇˇt´ v r´mci programov´ho bloku
                             ınˇ y            a es ı a              e
                      v pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je TRUE.
                          rıpadˇ z         a ı        a     ıku
           CALC       Podm´ en´ vol´n´ funkˇn´
                             ınˇ e      a ı      c ıho bloku v pˇ´ e, ˇe je
                                                                rıpadˇ z
                      aktu´ln´ stav z´sobn´ TRUE.
                            a ı       a      ıku
           RETC       Podm´ en´ n´vrat z volan´ho programov´ho bloku v
                             ınˇ y a                 e           e
                      pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je TRUE.
                       rıpadˇ z          a ı        a     ıku


          Tabulka 5.5: Pˇehled instrukc´ pro ˇ´ ı toku programu jazyka IL.
                        r              ı     rızen´
           ˇ ıslo
           C´       Popis/uk´zka
                               a
              1     CAL se vstupn´ parametry:
                                   ımi
                    CAL C10(CU := %IX10, PV := 15)
             2      CAL + LD a ST pro nastaven´ vstup˚:
                                               ı     u
                    LD 15
                    ST C10.PV
                    LD %IX10
                    ST C10.CU
                    CAL C10
             3      Pouˇit´ vstupn´ oper´tor˚:
                       z ı        ıch   a u
                    LD 15
                    PV C10
                    LD %IX10
                    CU C10


        Tabulka 5.6: Moˇnosti pˇed´v´n´ parametr˚ pˇi vol´n´ funkˇn´ blok˚.
                       z       r a a ı          u r      a ı     c ıch   u

5.5.1     Vol´n´ funkc´
             a ı      ı
Funkce lze volat tak, ˇe na m´
                       z      ısto instrukce se zap´se n´zev funkce, pˇiˇemˇ jako
                                                    ıˇ a                rc z
prvn´ argument funkce je pˇed´na aktu´ln´ hodnota z´sobn´
    ı                      r a         a ı            a    ıku. Pˇ´
                                                                  rıpadn´ dalˇ´ hod-
                                                                        e    sı
noty parametr˚ lze zadat oddˇlen´ ˇ´rkou v r´mci argumentu instrukce. N´vratov´
             u               e e ca          a                             a       a
hodnota funkce je uloˇena jako aktu´ln´ hodnota z´sobn´
                     z             a ı            a     ıku. Uk´zka 5.7 uv´d´ PLC
                                                                a          a ı

                                         36
ZPRACOVAN´ JAZYKA IL
       ´ I                                               Instrukce ˇızen´ toku programu
                                                                   r´ ı



{   // CAL controler(P := 2)
    g_controler.p = 2;
    g_controler.Function();
}
   // RETC
if (result != 0)
   RETURN();
{ // JMP ahoj
   goto ahoj;
}



 Uk´zka 5.6: Generovan´ k´d pro vybran´ instrukce ˇ´ ı toku programu jazyka IL.
   a                  y o             e           rızen´

k´d pro vol´n´ funkce.
 o         a ı


LD      10    (* Vol´n´ funkce MAX(X, Y) *)
                    a ı
MAX     20    (* Akt´ln´ hodnota z´sobn´ku je 20 *)
                    a ı           a    ı



                    Uk´zka 5.7: Uk´zka vol´n´ funkce z jazyka IL.
                      a           a       a ı

    Uk´zka 5.8 uv´d´ k´d vygenerovan´ bˇhem vol´n´ funkce. Nejprve je deklarov´na
      a           a ı o                y e          a ı                            a
instance objektu, kter´ funkci reprezentuje, n´slednˇ je vyplnˇn prvn´ parametr funkce
                      y                       a     e         e       ı
aktu´ln´ hodnotou z´sobn´ a pot´ jsou vyplnˇny pˇ´
     a ı            a     ıku      e            e    rıpadn´ dalˇ´ parametry. Po vol´n´
                                                            e   sı                  a ı
funkce je nastavena nov´ aktu´ln´ hodnota z´sobn´
                        a      a ı            a    ıku.


{   // MIN 33
    MIN f_function;
    result.GetValue(f_function.parm0);
    f_function.parm1 = 33;
    f_function.Function();
    result = f_function.GetResult();
}



          Uk´zka 5.8: Generovan´ C++ k´d pˇi vol´n´ funkce v jazyce IL.
            a                  y      o r       a ı


                                          37
Kapitola 6

Zpracov´n´ programov´ch blok˚
       a ı          y       u

Tato ˇ´st se zab´v´ zpracov´n´ z´kladn´ blok˚, kter´ se pouˇ´ ı pro z´pis pro-
     ca          y a        a ım a       ıch    u      e   zıvaj´    a
gramu.
   Dle [5] jsou definov´ny tˇi typy programov´ch blok˚:
                      a    r                 y      u

  1. Funkˇn´ bloky - umoˇnuj´ vyuˇ´ vstupn´ parametry, v´stupn´ parametry a
          c ı                zˇ ı      zıt      ı             y      ı
     parametry vstupnˇ-v´stupn´ Pˇi pouˇit´ funkˇn´ bloku je tˇeba nejprve defi-
                       e y        ı. r     z ı     c ıho          r
     novat jeho instanci. Vnitˇn´ promˇnn´ jsou platn´ po dobu platnosti instance.
                              r ı      e e            e

  2. Programov´ bloky - obdoba funkˇn´ blok˚. Liˇ´ se t´ ˇe existuje pouze
                 e                         c ıch     u   sı    ım, z
     jedna glob´lnˇ platn´ instance jej´z vnitˇn´ promˇnn´ jsou platn´ po celou dobu
               a e       a             ıˇ     r ı      e e           e
     bˇhu programu.
       e

  3. Funkce - podporuj´ pouze vstupn´ parametry, vˇdy pouˇ´ ı n´vratovou hod-
                        ı             ı            z       zıvaj´ a
     notu. Vnitˇn´ promˇnn´ jsou platn´ pouze po dobu jednoho vol´n´ funkce.
               r ı     e e            e                          a ı

    Jednotliv´ bloky, jejich v´znam a pouˇit´ jsou pops´ny v n´sleduj´ ıch ˇ´stech t´to
               e              y             z ı            a       a      ıc´ ca     e
kapitoly. Veˇker´ uveden´ informace jsou z´ any z [5].
              s e         e                  ısk´
    K´d generovan´ pro jednotliv´ druhy programov´ch blok˚ odpov´ a vˇdy vygen-
      o             y               e                    y         u       ıd´ z
erovan´ tˇ´ e v jazyce C++. N´zev vygenerovan´ tˇ´ je vˇdy rozˇ´ren o prefix, kter´
        e rıdˇ                   a                 e rıdy        z     sıˇ             y
    s’
zajiˇt uje, ˇe je moˇn´ shodnˇ pojmenovat funkci, funkˇn´ blok i blok typu program.
            z       z e        e                             c ı
Konverzn´ program vˇdy podle kontextu, ve kter´m je n´zev vyuˇit pouˇije spr´vn´ pre-
           ı          z                           e        a         z     z     a y
fix a t´ i spr´vn´ blok. Pro kaˇd´ z uveden´ch blok˚ je vˇdy vygenerov´n hlaviˇkov´
       ım       a y              z y           y        u      z              a     c y
soubor a soubor s implementac´ tˇ´ Hlaviˇkov´ soubor je n´slednˇ automaticky in-
                                  ı rıdy.      c y                 a     e
cludov´n do generovan´ho k´du v pˇ´ e, ˇe je pˇ´ sn´ blok v programu vyuˇit.
        a               e     o        rıpadˇ z      rısluˇ y                      z


6.1     Funkˇn´ bloky
            c ı
Funkˇn´ bloky svou podstatou odpov´ ı objekt˚m jazyka C++. Kaˇd´ funkˇn´ blok
     c ı                          ıdaj´     u                    z y     c ı
pˇedt´ neˇ je moˇn´ ho volat mus´ m´ deklarov´nu svoji instanci pomoc´ promˇnn´
 r ım, z          z e            ı ıt         a                      ı       e e
s datov´m typem odpov´ ıc´ n´zvu funkˇn´ bloku (viz. uk´zka 6.1).
       y              ıdaj´ ım a        c ıho               a


                                          38
ZPRACOVAN´ PROGRAMOVYCH BLOKU
       ´ I          ´       ˚                                                Funkˇn´ bloky
                                                                                 c ı


    Jin´mi slovy, kaˇd´ funkˇn´ blok m˚ˇe m´ v´ instanc´ kter´ jsou reprezentov´ny
       y            z y      c ı       uz  ıt ıce       ı,   e                 a
r˚zn´mi promˇnn´mi (bud’ glob´ln´ nebo lok´ln´
 u y           e y               a ımi       a ımi). Z´nikem promˇnn´ zanik´ tak´
                                                      a           e e        a   e
instance pˇ´ sn´ho funkˇn´ bloku.
          rısluˇ e        c ıho


...
VAR
   ...
   pid1: PID; (* deklarace instance FB pro PID regul´tor *)
                                                    a
   ...
END_VAR
...
CAL pid1
...



       Uk´zka 6.1: Deklarace instance funkˇn´ bloku a jeho n´sledn´ vol´n´
         a                                c ıho             a     e    a ı.

   Princip z´pisu k´du pro definici tˇla funkˇn´ bloku je patrn´ z uk´zky 6.2.
             a       o               e         c ıho              y       a
Deklarace jednotliv´ch blok˚ promˇnn´ch je nepovinn´. V´znam a vyuˇit´ jednotliv´ch
                   y       u     e y                 a y          z ı           y
blok˚ promˇnn´ch je detailnˇ pops´n v ˇ´sti 4.
    u      e y              e     a   ca
   Blok lok´ln´ promˇnn´ch m´ nasleduj´ ı v´znam:
            a ıch      e y      a         ıc´ y

   • M˚ˇe obsahovat tak´ deklarace instanc´ dalˇ´ funkˇn´ blok˚.
      uz               e                  ı    sıch   c ıch   u

   • Vˇechny lok´ln´ promˇnn´ si udrˇuj´ svoji hodnotu po celou dobu existence in-
       s         a ı     e e        z ı
     stance funkˇn´ bloku.
                c ıho

    Norma [5] umoˇnuje pˇed´vat v parametrech funkˇn´ bloku tak´ odkazy na in-
                      zˇ      r a                         c ıho              e
stanci jin´ho funkˇn´ bloku. Tato moˇnost nen´ ve vytvoˇen´m softwarov´m PLC
            e         c ıho                 z        ı           r e                e
dostupn´. V nˇkter´ch pˇ´
          a       e    y     rıpadech by totiˇ bylo nutn´ zajistit kop´
                                              z          e              ırovac´ konstruktor
                                                                                ı
objektu, kter´m je funkˇn´ blok reprezentov´n. Problematick´ by t´ˇ bylo chov´n´ v
                y           c ı                  a                e       ez            a ı
pˇ´ e pˇiˇazen´ instance funkˇn´ bloku deklarovan´ v r´mci jin´ho bloku programu
 rıpadˇ r r         ı              c ıho                 e a           e
do v´stupn´ nebo vstupnˇ/v´stupn´ promˇnn´.
     y        ı              e y       ı      e e
    Uk´zka 6.4 obsahuje vygenerovan´ k´d pro funkˇn´ blok z uk´zky 6.3. Z uk´zky je
        a                                 y o          c ı           a                a
patrn´, ˇe vygenerovan´ k´d je rozdˇlen na hlaviˇkov´ soubor s definic´ tˇ´ reprezen-
       e z                y o           e          c y                      ı rıdy
tuj´ ı funkˇn´ blok a zdrojov´ soubor s implementac´ t´to tˇ´
   ıc´       c ı                y                      ı e     rıdy.
    N´zev tˇ´ kter´ funkˇn´ blok reprezentuje je ve vygenerovan´m k´du rozˇ´ren o
      a       rıdy,     a      c ı                                      e      o      sıˇ
prefix ”plcfb ”. To umoˇnuje deklarovat v r´mci programu r˚zn´ typy blok˚ se stejn´m
                          zˇ                   a              u e                 u       y
n´zvem.
 a




                                            39
ZPRACOVAN´ PROGRAMOVYCH BLOKU
       ´ I          ´       ˚                                    Funkˇn´ bloky
                                                                     c ı



FUNCTION_BLOCK name
   VAR_INPUT
      ... deklarace jednotliv´ch vstupn´ch promˇnn´ch ...
                             y         ı       e y
   END_VAR
   VAR_OUTPUT
      ... deklarace jednotliv´ch v´stupn´ch promˇnn´ch ...
                             y    y     ı       e y
   END_VAR
   VAR_IN_OUT
      ... deklarace jednotliv´ch vstupnˇ/v´stupn´ch promˇnn´ch ...
                             y         e y      ı       e y
   END_VAR
   VAR
      ... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ...
                             y      a ı        e y
   END_VAR
   ...
   k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL)
    o                    e              s    rı   e
   ...
END_FUNCTION_BLOCK



                         Uk´zka 6.2: Deklarace funkˇn´ bloku.
                           a                       c ıho


FUNCTION_BLOCK ukazka
   VAR_INPUT
      x: INT;
   END_VAR
   VAR_OUTPUT
      y: INT;
   END_VAR
   VAR
      state: INT := 1;
   END_VAR

   LD state
   ADD 1
   ST state
   MUL x
   ST y
END_FUNCTION_BLOCK




   Uk´zka 6.3: Vstupn´ soubor pro uk´zku vygenerovan´ho k´du funkˇn´ bloku.
     a               ı              a               e    o       c ıho




                                         40
ZPRACOVAN´ PROGRAMOVYCH BLOKU
       ´ I          ´       ˚                                      Funkˇn´ bloky
                                                                       c ı


                                       // soubor s implementac´ tˇ´dy
                                                              ı rı
                                       #include "ukazk.h"
                                       #include "plcfb_ukazka.h"

                                       #define RETURN() {ExitCall();return;}

                                       plcfb_ukazka :: plcfb_ukazka(void)
                                       {
                                       #line 3 "fb.plc"
                                          x = CPropertyIn<INT> (&m_x);
                                       #line 6 "fb.plc"
                                          y = CPropertyOut<INT> (&m_y);
// deklarace tˇ´dy,
              rı
                                       #line 9 "fb.plc"
// hlaviˇkov´ soubor
        c   y
                                          m_state = CVariable<INT> ((INT) 1);
#include <plc.h>
                                       }
                                       void plcfb_ukazka :: ExitCall(void)
class plcfb_ukazka
                                       {
{
                                       }
   private:
                                       plcfb_ukazka :: ~plcfb_ukazka(void)
#line 3 "fb.plc"
                                       {
      CVariable<INT> m_x;
                                       }
#line 6 "fb.plc"
                                       void plcfb_ukazka :: Function(void)
      CVariable<INT> m_y;
                                       {
#line 9 "fb.plc"
                                          CResult result;
      CVariable<INT> m_state;
                                       #line 12 "fb.plc"
   public:
                                          {
#line 3 "fb.plc"
                                             result = m_state;
      CPropertyIn<INT> x;
                                          }
#line 6 "fb.plc"
                                       #line 13 "fb.plc"
      CPropertyOut<INT> y;
                                          {
      plcfb_ukazka(void);
                                             result = result + 1;
      virtual ~plcfb_ukazka(void);
                                          }
      void Function(void);
                                       #line 14 "fb.plc"
      void ExitCall(void);
                                          {
};
                                             result.GetValue(m_state);
                                          }
                                       #line 15 "fb.plc"
                                          {
                                             result = result * m_x;
                                          }
                                       #line 16 "fb.plc"
                                          {
                                             result.GetValue(m_y);
                                          }
                                          RETURN();
                                       }


           Uk´zka 6.4: Vygenerovan´ k´d funkˇn´ bloku z uk´zky 6.3.
             a                    y o       c ıho         a




                                     41
ZPRACOVAN´ PROGRAMOVYCH BLOKU
       ´ I          ´       ˚                                      Programov´ bloky
                                                                            e


6.2     Programov´ bloky
                 e
Programov´ bloky jsou obdobou funkˇn´ blok˚ popsan´ch v pˇedchoz´ ˇ´sti. Hlavn´
            e                          c ıch   u         y      r        ı ca       ı
rozd´ spoˇ´ a v tom, ˇe tento typ blok˚ m´ automaticky generov´nu svoji unik´tn´
     ıl    cıv´         z                 u a                       a            a ı
instanci, kter´ je platn´ po celou dobu bˇhu PLC. Tato instance samozˇejmˇ uchov´v´
              a         a                 e                           r     e    a a
hodnoty lok´ln´ promˇnn´ch.
             a ıch        e y
    Programov´ bloky jsou urˇeny zejm´na pro spouˇtˇn´ jednotliv´ch vl´ken PLC pro-
                e              c        e          se ı           y     a
gramu, pˇ´rıpadnˇ pro jednor´zov´ spouˇtˇn´ napˇ. pˇi n´bˇˇn´ hranˇ sign´lu. Nicm´nˇ
                  e           a e       se ı   r r a ez e           e     a       e e
je lze volat i pˇ´
                 rımo v programu obdobnˇ jako funkˇn´ bloky, pˇiˇemˇ jako parametr
                                           e        c ı         rc z
instrukce CAL se pouˇije pˇ´
                       z     rımo n´zev programov´ho bloku.
                                    a            e
    Struktura z´pisu programov´ho bloku je patrn´ z uk´zky 6.5 a je obdobn´ jako
                 a                e                a      a                    a
struktura funkˇn´ bloku.
                c ıho


PROGRAM name
   VAR_INPUT
      ... deklarace jednotliv´ch vstupn´ch promˇnn´ch ...
                             y         ı       e y
   END_VAR
   VAR_OUTPUT
      ... deklarace jednotliv´ch v´stupn´ch promˇnn´ch ...
                             y    y     ı       e y
   END_VAR
   VAR_IN_OUT
      ... deklarace jednotliv´ch vstupnˇ/v´stupn´ch promˇnn´ch ...
                             y         e y      ı       e y
   END_VAR
   VAR
      ... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ...
                             y      a ı        e y
   END_VAR
   ...
   k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL)
    o                    e              s    rı   e
   ...
END_PROGRAM



                    Uk´zka 6.5: Deklarace programov´ho bloku.
                      a                            e

   Vygenerovan´ k´d odpov´ a k´du funkˇn´ bloku z uk´zky 6.3, pouze prefix v
              y o           ıd´ o         c ıho             a
n´zvu tˇ´ je nahrazen ”plcp ” a v hlaviˇkov´m souboru je nadefinov´na glob´ln´
 a     rıdy                               c e                       a    a ı
promˇnn´ deklaruj´ ı instanci bloku pro vyuˇit´ v generovan´m k´du.
    e a          ıc´                       z ı             e   o




                                         42
ZPRACOVAN´ PROGRAMOVYCH BLOKU
       ´ I          ´       ˚                                                            Funkce


6.3      Funkce
Funkce jsou nejjednoduˇˇ´ jednotky pro z´pis programu. Umoˇnuj´ pˇed´vat pouze vs-
                        ssı              a                   zˇ ı r a
                 1
tupn´ parametry pˇiˇemˇ jako prvn´ parametr funkce je pˇed´na aktu´ln´ hodnota
     ı               rc z            ı                      r a         a ı
z´sobn´
 a      ıku. Funkce mus´ pˇed´vat n´vratovou hodnotu, kter´ se stane aktu´ln´ hodno-
                       ı r a       a                      a              a ı
tou z´sobn´
      a     ıku.
   Zp˚sob deklarace funkce je patrn´ z uk´zky 6.6. Prvn´ ˇ´dek deklarace definuje
       u                              y     a             ı ra
                                                       2
kromˇ n´zvu funkce tak´ datov´ typ n´vratov´ hodnoty .
      e a                e     y       a      e


FUNCTION name:DATATYPE
   VAR_INPUT
      ... deklarace jednotliv´ch vstupn´ch promˇnn´ch ...
                             y         ı       e y
   END_VAR
   VAR
      ... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ...
                             y      a ı        e y
   END_VAR
   ...
   k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL)
    o                    e              s    rı   e
   ...
END_FUNCTION



                               Uk´zka 6.6: Deklarace funkce.
                                 a

    N´vratov´ hodnota funkce se nastav´ tak, ˇe se uloˇ´ hodnota do promˇnn´ s n´zvem
      a       a                            ı      z    zı                e e a
shodn´m s n´zvem funkce (viz. uk´zka 6.7).
       y      a                       a
    Kaˇd´ funkci deklarovan´ v k´du softwarov´ho PLC odpov´ a vygenerovan´ tˇ´
        z e                    e    o               e             ıd´           a rıda
v jazyce C++. Vol´n´ funkce n´slednˇ spoˇ´ a ve vytvoˇen´ jednor´zov´ instance t´to
                    a ı           a      e     cıv´        r ı        a e           e
tˇ´
 rıdy. Tato instance tˇ´ zanikne po ukonˇen´ vol´n´ a pˇed´n´ n´vratov´ hodnoty
                        rıdy                     c ı  a ı      r a ı a      e
do aktu´ln´ hodnoty z´sobn´
          a ı            a     ıku. Jednor´zovost instance tˇ´ reprezentuj´ ı funkci je
                                             a               rıdy         ıc´
zajiˇtˇna vytvoˇen´ speci´ln´ name-space v jazyce C++3 .
    se          r ım         a ıho
    Uk´zka 6.9 uv´d´ vygenerovan´ k´d pro funkci z uk´zky 6.8. Jak je patrno, princip
        a          a ı               y o                  a
generov´n´ k´du je shodn´ s generov´n´ k´du pro pˇedchoz´ programov´ bloky. N´zev
          a ı o            y            a ım o        r        ı        e         a
vygenerovan´ tˇ´ je rozˇ´ren o prefix ”plcf ”.
              e rıdy       sıˇ




  1
     Ze zp˚sobu pˇed´v´n´ hodnot parametr˚ vypl´v´, ˇe kaˇd´ funkce mus´ m´ alespoˇ jeden vstupn´
           u     r a a ı                     u     y a z    z a           ı ıt    n             ı
parametr.
   2
     Jedn´ se o poloˇku DATATYPE, kter´ je oddˇlena od n´zvu funkce pomoc´ ”:”.
          a         z                      a        e        a                 ı
   3
                    s’
     Namespace zajiˇt uje platnost instanc´ vˇech tˇ´ a je ohraniˇen pomoc´ {}
                                          ı s      rıd           c         ı


                                               43
ZPRACOVAN´ PROGRAMOVYCH BLOKU
       ´ I          ´       ˚                                            Funkce




FUNCION exp:INT
   VAR_INPUT
      int Value;
   END_VAR
   LD Value
   ...
   ST exp (* Aktu´ln´ hodnotu z´sobn´ku vloˇ´m do n´vratov´ *)
                 a ı           a    ı      zı      a      e
          (* hodnoty funkce *)
   ...
END_FUNCTION



               Uk´zka 6.7: Zp˚sob nastaven´ n´vratov´ hodnoty funkce.
                 a           u            ı a       e




FUNCTION min: DINT
   VAR_INPUT
      val1: DINT;
      val2: DINT;
   END_VAR

  LD val1
  ST min
  LT val2
  RETC

   LD val2
   ST min
END_FUNCTION




          Uk´zka 6.8: Vstupn´ k´d pro uk´zku generovan´ho k´du funkce.
            a               ı o         a             e    o




                                        44
ZPRACOVAN´ PROGRAMOVYCH BLOKU
       ´ I          ´       ˚                                              Funkce




                                         // Soubor s implementac´ tˇ´dy
                                                                 ı rı
                                         #define RETURN() return;
                                         plcf_min :: plcf_min(void)
                                         {
                                         #line 3 "function.plc"
                                            parm0 = CPropertyIn<DINT> (&m_val1);
                                         #line 4 "function.plc"
                                            parm1 = CPropertyIn<DINT> (&m_val2);
                                         }
                                         plcf_min :: ~plcf_min(void)
                                         {
// deklarace tˇ´dy,
               rı
                                         }
// hlaviˇkov´ soubor
        c   y
                                         const CVariable<DINT> &plcf_min ::
#include <plc.h>
                                                  GetResult(void)
class plcf_min
                                         {
{
                                            return(this->m_min);
   private:
                                         }
      CVariable<DINT> m_min;
                                         void plcf_min :: Function(void)
#line 3 "function.plc"
                                         {
      CVariable<DINT> m_val1;
                                            CResult result;
#line 4 "function.plc"
                                         #line 7 "function.plc"
      CVariable<DINT> m_val2;
                                            {
   public:
                                               result = m_val1;
#line 3 "function.plc"
                                            }
      CPropertyIn<DINT> parm0;
                                         #line 8 "function.plc"
#line 4 "function.plc"
                                            {
      CPropertyIn<DINT> parm1;
                                               result.GetValue(m_min);
                                            }
      plcf_min(void);
                                         #line 9 "function.plc"
      virtual ~plcf_min(void);
                                            {
      void Function(void);
                                               result = (result < m_val2);
      const CVariable<DINT>&
                                            }
            GetResult(void);
                                         #line 10 "function.plc"
};
                                            if (result != 0)
                                               RETURN();
                                         #line 12 "function.plc"
                                            {
                                               result = m_val2;
                                            }
                                         #line 13 "function.plc"
                                            {
                                               result.GetValue(m_min);
                                            }
                                         }


                Uk´zka 6.9: Vygenerovan´ k´d funkce z uk´zky 6.8.
                  a                    y o              a




                                       45
Kapitola 7

Konfigurace softwarov´ho PLC
                    e

Tato ˇ´st se zab´v´ speci´ln´ blokem CONFIGURATION definovan´m v [5]. Tento
     ca         y a      a ım                              y
blok slouˇ´
         zı:

   • K deklaraci glob´ln´ promˇnn´ch dostupn´ch v programu.
                     a ıch    e y           y

   • K definici uloh (definuj´ parametry pro spouˇtˇn´ blok˚ typu program).
               ´           ı                   se ı      u

   • K pˇiˇazen´ uloh k jednotliv´m blok˚m typu program.
        rr     ı´                y      u

    Uk´zka 7.1 uv´d´ strukturu bloku typu CONFIGURATION se z´kladn´ pod-
       a           a ı                                                 a   ımi
bloky, kter´ jsou vybr´ny pro implementaci v softwarov´m PLC. Norma [5] definuje
             e         a                                   e
jeˇtˇ dalˇ´ podbloky, kter´ nejsou pro bˇh softwarov´ho PLC tˇeba.
  se      sı              e             e            e            r
    Blok s glob´ln´ promˇnn´mi obsahuje deklarace glob´ln´ promˇnn´ch tak, jak
                a ımi       e y                              a ıch     e y
je pops´no v kapitole 4. Promˇnn´ mohou b´t bud
        a                      e e            y    ’ standardn´ datov´ch typ˚, nebo
                                                                 ıch    y   u
se m˚ˇe jedna o glob´ln´ deklarace funkˇn´ blok˚.
     uz               a ı                c ıch     u
    Blokem RESOURCE se podrobnˇji zab´v´ n´sleduj´ ı ˇ´st 7.1.
                                     e       y a a       ıc´ ca
    Blok CONFIGURATION v generovan´m k´du m´ tedy za ukol definovat podklady
                                          e     o     a           ´
pro vytvoˇen´ funkc´ potˇebn´ch pro spuˇtˇn´ a ukonˇen´ softwarov´ho PLC (zaveden´
            r ı     ı    r    y           se ı        c ı            e            ı
kernel modulu softwarov´ho PLC do pamˇti a jeho vyjmut´
                         e                 e                 ı).


7.1     Struktura bloku RESOURCE
Tato ˇ´st se zab´v´ v´znamem a obsahem bloku RESOURCE. Informace zde uveden´
      ca         y a y                                                           e
jsou ˇerp´ny z [5].
     c a
    Jak je patrno z uk´zky 7.1, m˚ˇe i tento blok obsahovat deklaraci glob´ln´
                        a           uz                                      a ıch
promˇnn´ch stejnˇ jako pˇ´
      e y         e       rımo blok CONFIGURATION.
    Po pˇ´
         rıpadn´ deklaraci glob´ln´ promˇnn´ch jiˇ n´sleduje definice uloh (TASK)
               e               a ıch     e y     z a                 ´
a pˇiˇazen´ tˇchto uloh jednotliv´m blok˚m typu program. To zajist´ spuˇtˇn´ soft-
    rr     ı e      ´             y     u                          ı    se ı
warov´ho PLC.
       e




                                        46
´
KONFIGURACE SOFTWAROVEHO PLC                            Struktura bloku RESOURCE



CONFIGURATION name
   VAR_GLOBAL
      ...
      variable
      ...
   END_VAR
   RESOURCE xx ON yy
      VAR_GLOBAL
         ...
         variable
         ...
      END_VAR
      ...
      TASK TaskName(INTERVAL:=T#0.1ms);
      ...
      ...
      PROGRAM p1 WITH TaskName: ProgramName();
      ...
   END_RESOURCE
END_CONFIGURATION



                 Uk´zka 7.1: Struktura bloku CONFIGURATION.
                   a

7.1.1    Struktura blok˚ TASK
                       u
Bloky TASK definuj´ vlastnosti pro spouˇtˇn´ blok˚ PROGRAM. Jedn´ se tedy o
                     ı                    se ı      u                    a
parametry, dle kter´ch budou n´slednˇ vytvoˇeny real-time vl´kna v r´mci RT-Linuxov´ho
                   y          a     e      r                a       a              e
j´dra. Blok˚m tud´z pˇ´
 a         u       ıˇ rımo neodpov´ a ˇ´dn´ generovan´ k´d.
                                   ıd´ za y             y o
   V uk´zce 7.2 je uveden pˇehled vˇech parametr˚, kter´ se mohou v definici TASK
        a                   r       s             u      e
bloku vyskytnout.


TASK name([INTERVAL := T#50ms][, PRIORITY := 2][, SINGLE := %Q2.1]);



                  Uk´zka 7.2: Struktura bloku TASK a jeho z´pis.
                    a                                      a

   Tab.7.1 obsahuje popis jednotliv´ch parametr˚ bloku a jejich v´znam v r˚zn´ch
                                   y           u                 y        u y
kontextech.



                                        47
´
KONFIGURACE SOFTWAROVEHO PLC                                  Struktura bloku RESOURCE


      Parametr       Popis
      name           N´zev bloku, pouˇit´ v okamˇiku pˇiˇazen´ TASK bloku typu
                       a                z y            z     rr     ı
                     PROGRAM.
      INTERVAL       Definuje interval, se kter´m je spouˇtˇno vl´kno, kter´ m´
                                                   y            se      a         e a
                     pˇiˇazeno tento TASK.
                      rr
      PRIORITY       Priorita vl´kna, kter´mu je TASK pˇiˇazen. Hodnota v rozsahu
                                a         e                  rr
                     0−50, 0 odpov´ a nejvyˇˇ´ prioritˇ, 50 odpov´ a nejvyˇˇ´ prioritˇ.
                                    ıd´       s sı        e         ıd´     ssı      e
      SINGLE         Pokud je hodnota parametru INTERVAL r˚zn´ od 0, pak defin-
                                                                   u a
                     uje, ˇe blok typu PROGRAM m´ b´t spouˇtˇn periodicky pouze
                          z                              a y       se
                     v pˇ´ e, ˇe hodnota vstupu SINGLE je log.0. Jestliˇe INTER-
                         rıpadˇ z                                           z
                     VAL je 0, pak blok je spouˇtˇn pouze v pˇ´ e, ˇe na vstupu
                                                     se            rıpadˇ z
                     SINGLE byla detekov´na n´bˇˇn´ hrana. Hodnota vstupu m˚ˇe
                                            a       a ez a                         uz
                     b´t reprezentov´na bud’ pˇ´ adresou nebo glob´ln´ promˇnnou.
                      y              a           rımo                   a ı     e


                   Tabulka 7.1: V´znam a popis parametr˚ bloku TASK.
                                 y                     u

7.1.2       Struktura blok˚ PROGRAM
                          u
Bloky typu PROGRAM v r´mci deklarace RESOURCE slouˇ´ k pˇiˇazen´ blok˚ TASK
                               a                             zı    rr     ı      u
k jednotliv´m programov´m blok˚m PROGRAM1 . V´sledkem je pro vˇechny bloky
             y               y      u                   y                   s
typu PROGRAM, kter´ jsou zde uvedeny, vygenerov´n´ samostatn´ho real-time vl´kna,
                          e                         a ı            e                 a
kter´ dle parametr˚ uveden´ch v bloku TASK spouˇt´ pˇ´ sn´ blok PROGRAM.
    e                 u        y                    s ı rısluˇ y
    Pokud v deklaraci chyb´ pˇiˇazen´ bloku TASK, mˇl by b´t blok dle [5] spouˇtˇn
                               ı rr    ı                e       y                      se
trvale s nejniˇˇ´ moˇnou prioritou vˇdy, kdyˇ m´ procesor voln´ ˇas. Podm´
               zsı    z              z      z a                 yc           ınka t´kaj´ ı
                                                                                   y ıc´
se spouˇtˇn´ vˇdy, kdyˇ m´ procesor voln´ ˇas mus´ b´t pro vytv´ˇen´ softwarov´ PLC
        se ı z           z a              yc       ı y            ar e             e
modifikov´na.
           a
    V pˇ´ e, ˇe by totiˇ vˇdy existovalo nˇjak´ RT-Linuxov´ vl´kno, kter´ m´ bˇˇet
        rıpadˇ z            z z             e e               e a              e a ez
a tud´z by nez˚stal ˇ´dn´ voln´ procesorov´ ˇas, nedostalo by se ke slovu p˚vodn´
      ıˇ          u     za y      y           y c                                  u      ı
Linuxov´ j´dra. To by vedlo k ”zatuhnut´ cel´ho syst´mu. Proto jsou i tyto ulohy
         e a                               ı”    e        e                          ´
spouˇtˇny periodicky s t´ ˇe periodu spouˇtˇn´ je moˇn´ zvolit z pˇ´
     se                     ım, z            se ı       z e           rıkazov´ho ˇ´dku.
                                                                               e ra
    Deklarace pˇiˇazen´ TASK k bloku PROGRAM je patrna z uk´zky 7.3. V´znam
                   rr    ı                                           a             y
jednotliv´ch parametr˚ je uveden v tab.7.2.
          y              u


PROGRAM Name [WITH TaskName]: ProgramName([Parm1 := value1[, ...]]);



Uk´zka 7.3: Pˇiˇazen´ definovan´ho TASK k bloku typu PROGRAM v r´mci bloku
  a          rr     ı         e                                a
RESOURCE.

  1
      Ve v´znamu bloku pro z´pis programu z kapitoly 6.
          y                 a



                                                48
´
KONFIGURACE SOFTWAROVEHO PLC                             Struktura bloku RESOURCE


    N´zev
      a              Popis
    Name             Unik´tn´ n´zev definovan´ho vl´kna.
                          a ı a              e    a
    TaskName         N´zev bloku TASK, jehoˇ parametry se pouˇij´ pˇi definici
                       a                     z                  z ı r
                     vl´kna.
                       a
    ProgramName      N´zev bloku typu PROGRAM, kter´ bude spouˇtˇn s
                       a                                  y            se
                     parametry TASK.
    Parm1            Pokud m´ blok parametry, obsahuje ˇ´rkou oddˇlen´
                               a                             ca         e e
                     parametry s pˇiˇazenou hodnotou. Hodnota m˚ˇe b´t bud’
                                   rr                             uz y
                     konstanta, adresa v pamˇti PLC nebo glob´ln´ promˇnn´.
                                            e                a ı      e a


      Tabulka 7.2: Popis a v´znam parametr˚ pˇi definici spouˇtˇn´ programu.
                            y             u r               se ı

   Uk´zka 7.5 uv´d´ vygenerovan´ k´d v C++, kter´ odpov´ a definici z uk´zky 7.4.
       a            a ı          y o                 y        ıd´          a
Je z n´ patrn´, ˇe kaˇd´ vytvoˇen´ real-time vl´kno je oznaˇeno pro pl´novaˇ proces˚
       ı      e z      z e    r e              a            c         a    c        u
jako vyuˇ´ ıc´ FPU. D˚vodem je moˇnost vyuˇit´ datov´ho typu real kdekoliv v r´mci
         zıvaj´ ı         u          z         z ı      e                       a
PLC programu. Z toho plyne nutnost zajistit bezkonfliktn´ vyuˇit´ FPU v r´mci cel´ho
                                                          ı     z ı      a        e
operaˇn´ syst´mu.
      c ıho       e


PROGRAM init
   VAR_INPUT
      stav: INT;
   END_VAR
END_PROGRAM

CONFIGURATION test
   RESOURCE xx ON yy
      TASK pok1(INTERVAL:=T#20ms, SINGLE:=%QX1.0);
      PROGRAM p1 WITH pok1: init(stav := %QB0);
   END_RESOURCE
END_CONFIGURATION




                    Uk´zka 7.4: Definice spouˇtˇn´ PLC vl´ken.
                      a                     se ı        a




                                         49
´
KONFIGURACE SOFTWAROVEHO PLC                              Struktura bloku RESOURCE



#include <rtl_cpp.h>
CMemory<PLC_MEMORY_SIZE> g_KernelPLCMemory;
static void *PCallp1(void *pParms)
{
   struct sched_param p;

    p.sched_priority = 50;
    pthread_setschedparam(pthread_self(), SCHED_FIFO, &p);
    pthread_make_periodic_np(pthread_self(), gethrtime(), 20000000);

    while(1)
    {
       pthread_wait_np();
       if (CVariable<BOOL>("QX1.0", 0) != 0)
       {
          gprog_plcp_init.stav = CVariable<BIT>("QB0");
          gprog_plcp_init.Function();
       }
    }
    return NULL;
}

#define THREADS_COUNT 1
static pthread_t threads[THREADS_COUNT];
extern "C" {
int init_module(void)
{
   int iRetv = 0, iCount = 0;
   pthread_attr_t attr;

    __do_global_ctors_aux();
    pthread_attr_init(&attr);
    pthread_attr_setfp_np(&attr);
    iRetv += pthread_create(&threads[iCount++], attr, PCallp1, NULL);

   return iRetv;
}
void cleanup_module(void)
{
   for (int i = 0; i < THREADS_COUNT; i++)
   {
      pthread_delete_np(threads[i]);
   }
   __do_global_dtors_aux();
}
}
MODULE_LICENSE("GPL");




               Uk´zka 7.5: Vygenerovan´ k´d odpov´ ıc´ uk´zce 7.4.
                 a                    y o        ıdaj´ ı a

                                           50
Kapitola 8

Podpora pro RT-Linux

Tato kapitola se zab´v´ vytvoˇenou podporou pro RT-Linux. V ˇ´sti 8.1 je pops´na
                    y a        r                                   ca              a
podp˚rn´ knihovna potˇebn´ pro kompilaci modul˚ softwarov´ho PLC, ˇ´st 8.2 se
     u a                r    a                      u            e          ca
zab´v´ tvorbou ovladaˇ˚ pro vstupn´ a v´stupn´ zaˇ´ ı. C´
   y a                cu           ı y        ı rızen´   ˇ ast 8.3 se zab´v´ potˇebnou
                                                                         y a    r
podporou pˇ´
           rımo v j´dˇe RT-Linuxu.
                   a r
   Obr.8.1 uv´d´ pro uplnost schematick´ n´ˇrt cel´ho vytvoˇen´ho softwarov´ho PLC.
              a ı    ´                 y ac       e         r e               e
   ˇ
   Sipky v obr´zku naznaˇuj´ jak´m zp˚sobem prob´ a vnitˇn´ komunikace mezi jed-
               a          c ı,   y     u             ıh´     r ı
notliv´mi ˇ´stmi softwarov´ho PLC.
      y ca                 e


8.1        Knihovna
Podp˚rn´ knihovna umoˇnuj´ ı kompilaci k´du vygenerovan´ho pomoc´ konverzn´
      u a                 zˇ ıc´              o              e         ı          ıho
programu plc2cpp se skl´d´ z nˇkolika ˇ´st´ kter´ spolu navz´jem souvisej´ Jednotliv´
                        a a    e       ca ı,     e          a            ı.         e
ˇ´sti, kter´ jsou implementov´ny v r´mci podp˚rn´ knihovny, jsou na obr.8.1 oznaˇeny
ca         e                 a      a           u e                             c
v r´meˇc´ s ˇed´m podkladem.
   a c ıch s y
   Tab.8.1 uv´d´ pˇehled jednotliv´ch tˇ´ kter´ podp˚rn´ knihovna implementuje.
                a ı r              y     rıd,     e     u a
Ke kaˇd´ tˇ´ e je z´roveˇ uveden jej´ kr´tk´ popis a v´znam.
       z e rıdˇ     a    n          ı a y             y

8.1.1       Emulace pamˇti PLC
                       e
Emulace pˇ´   rıstupu do pamˇti pomoc´ adres tak, jak je definov´no v [5] implemen-
                               e         ı                        a
tuje tˇ´ CMemory1 . Ta pro pˇ´
        rıda                      rıstup do pamˇti umoˇnuje adresaci dle normy vˇetnˇ
                                                  e     zˇ                        c e
pˇ´
  rıstupu na digit´ln´ vstupy/v´stupy. V pˇ´ e, ˇe se jedn´ o adresu v intern´ PLC
                    a ı          y            rıpadˇ z       a                  ı
pamˇti, je pˇ´
      e        rıstup zpracov´n pˇ´
                              a rımo tˇ´rıdou CMemory.
     Pokud se jedn´ o pˇ´
                    a rıstup do pamˇti odpov´ ıc´ adresaci digit´ln´ vstup˚/v´stup˚,
                                      e         ıdaj´ ı          a ıch        u y    u
je ˇ´ ı pˇed´no ovladaˇi definovan´mu tˇ´
    rızen´ r a              c           e     rıdou CPLCDrivers. Podrobnˇjˇ´ popis lze
                                                                         e sı
nal´zt v ˇ´sti 8.2.
    e      ca
  1
      Implementace v souboru cmemory.h




                                         51
PODPORA PRO RT-LINUX                                                        Knihovna




                   Obr´zek 8.1: Schema vytvoˇen´ho softwarov´ho PLC.
                      a                     r e             e

8.1.2       Podpora promˇnn´ch PLC
                        e y
Podpora promˇnn´ch je implementov´na v template tˇ´ CVariable2 . Tato template
            e y                    a             rıde
tˇ´ implementuje n´sleduj´ ı operace:
 rıda             a      ıc´

      • Specifikovat datov´ typ promˇnn´ tak, jak je definov´no v [5].
                         y         e e                    a

      • Specifikovat inicializaˇn´ hodnotu promˇnn´ pˇi deklaraci.
                              c ı             e e r

                                  e’ e
      • Specifikovat adresu v pamˇt ov´m prostoru emulovan´ho PLC. Tato adresa samozˇejmˇ
                                                            e                          r e
        m˚ˇe b´t i adresa vstupu nebo v´stupu, je-li k t´to adrese zaregistrov´n nˇkter´
          uz y                          y               e                     a e      y
        ovladaˇ ve spr´vci zaˇ´ ı (viz. d´le).
              c       a      rızen´      a
  2
      Implementace v souboru cvariable.h




                                           52
PODPORA PRO RT-LINUX                                                                     Knihovna


     N´zev tˇ´
      a      rıdy      Popis
     CVariable         Tˇ´
                         rıda vyuˇ´ a k deklaraci promˇnn´ch ve vygen-
                                     zıvan´                           e y
                       erovan´m C++ k´du. Podporuje adresaci PLC pamˇti,
                                e              o                                          e
                       pokud m´ promˇnn´ tuto adresu v deklaraci speci-
                                   a          e a
                       fikov´nu.
                             a
     CPropertyIn       Tˇ´
                         rıda pouˇ´ a ve vygenerovan´m C++ k´du pro
                                     zıvan´                         e               o
                       reprezentaci vstupn´        ıch parametr˚ funkc´ funkˇn´
                                                                    u         ı,        c ıch
                       blok˚ a programov´ch blok˚.
                             u                   y         u
     CPropertyOut      Tˇ´
                         rıda vyuˇ´ a ve vygenerovan´m C++ k´du pro
                                     zıvan´                         e               o
                       reprezentaci v´stupn´ parametr˚ funkˇn´ blok˚ a
                                         y          ıch             u       c ıch         u
                       programov´ch blok˚.
                                     y           u
     CPropertyIO       Tˇ´
                         rıda vyuˇ´ a ve vygenerovan´m C++ k´du pro
                                     zıvan´                         e               o
                       reprezentaci vstupnˇ-v´stupn´ parametr˚ funkˇn´
                                                   e y        ıch              u        c ıch
                       blok˚ a programov´ch blok˚.
                             u                   y         u
     CMemory           Tˇ´
                         rıda, kter´ implementuje emulaci PLC pamˇti, za-
                                      a                                              e
                       pouzdˇuje funkcionalitu pro pˇ´
                                r                              rıstup k adres´m vnitˇn´
                                                                                 a         r ı
                       pamˇti, vstup˚m a v´stup˚m. Pro pˇ´
                             e           u          y     u           rıstup k vstup˚m au
                       v´stup˚m vyuˇ´ a instanci tˇ´ CDeviceManager.
                         y       u       zıv´               rıdy
     CResult           Tˇ´ reprezentuj´ ı aktu´ln´ hodnotu z´sobn´
                         rıda                  ıc´       a ı              a       ıku.
     CDeviceDriver     Virtu´ln´ tˇ´ vyuˇ´ a pro tvorbu ovladaˇ˚ vstup˚ a
                               a ı rıda          zıvan´                         cu        u
                       v´stup˚.
                         y       u
     CDeviceManager    Tˇ´
                         rıda spravuj´ ı instance jednotliv´ch ovladaˇ˚ a
                                           ıc´                          y              cu
                            s ’ ıc´
                       zajiˇt uj´ ı mapov´n´ adresy vstupu/v´stupu na
                                                 a ı                           y
                       pˇ´ sn´ ovladaˇ zaˇ´ ı.
                         rısluˇ y            c rızen´
     CMutex            Tˇ´ zapouzdˇuj´ ı funkcionalitu mutex˚ pro zamyk´n´
                         rıda             r ıc´                           u               a ı
                       kritick´ch ˇ´st´ ovladaˇ˚ PLC zaˇ´ ı.
                                y ca ı                cu          rızen´
     CSpinLock         Tˇ´
                         rıda zapouzdˇuj´ ı funkcionalitu mutex˚ pro za-
                                            r ıc´                               u
                       myk´n´ kritick´ch ˇ´st´ ovladaˇ˚ PLC zaˇ´ ı (spin-
                             a ı           y ca ı                cu           rızen´
                       lock je funkˇnˇ podobn´ mutexu. Rozd´ je v tom,
                                        c e              y                   ıl
                       ˇe po uzamˇen´ oblasti pomoc´ spinlocku je zak´z´no
                       z               c ı                      ı                      a a
                       pˇeruˇen´ a tud´z prov´dˇn´ k´d nem˚ˇe b´t pˇeruˇen
                         r s ı              ıˇ        a e y o           uz y r s
                       schedulerem).


    Tabulka 8.1: Pˇehled tˇ´ implementovan´ch v podp˚rn´ knihovnˇ pro PLC.
                  r       rıd             y         u e         e

8.1.3    Podpora parametr˚ pro vol´n´ programov´ch blok˚
                         u        a ı          y       u
Podpora pro pˇed´v´n´ parametr˚ programov´m blok˚ je implementov´na v template
              r a a ı          u           y      u                a
tˇ´ ach CPropertyIn, CPropertyOut a CPropertyIO. Pˇi deklaraci parametru se defin-
 rıd´                                              r
uje typ parametru (vstupn´ v´stupn´ vstupnˇ-v´stupn´ a d´le se parametru pˇiˇazuje
                         ı, y     ı,      e y      ı)   a                 rr




                                            53
PODPORA PRO RT-LINUX                              Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
                                                        c             a ıch     u y     u


                      a rıdou CVariable3 , kter´ se pouˇ´ a v r´mci vygenerovan´ho
promˇnn´ reprezentovan´ tˇ´
    e a                                        a       zıv´ a                  e
C++ k´du v programovac´ jazyce PLC pro pˇ´
      o                 ım                   rıstup k hodnotˇ parametru.
                                                             e

8.1.4      Emulace aktu´ln´ hodnoty z´sobn´
                       a ı           a    ıku
Aktu´ln´ hodnota z´sobn´ nebo t´ˇ tzv. current-result je reprezentov´na tˇ´
      a ı         a    ıku,       ez                                a    rıdou CRe-
    4
sult . Tato tˇ´ m´ n´sleduj´ ı vlastnosti:
             rıda a a       ıc´

      • Uchov´v´ v´sledek posledn´ proveden´ operace vˇetnˇ informace o jej´ datov´m
              a a y              ı         e          c e                  ım     e
        typu.

      • Implementuje oper´tory pro matematick´ a porovn´vac´ operace.
                         a                   e         a ı

      • Umoˇnuje nastavit aktu´ln´ hodnotu z´sobn´ na hodnotu PLC promˇnn´(template
             zˇ               a ı           a    ıku                  e e
        tˇ´ CVariable).
         rıda

      • Umoˇnuje nastavit aktu´ln´ hodnotu z´sobn´ na hodnotu PLC parametru
            zˇ                a ı           a    ıku
        funkˇn´ nebo programov´ho bloku.
            c ıho               e


8.2       Ovladaˇe karet digit´ln´ vstup˚ ystup˚
                c             a ıch     u/v´   u
Pˇ´
  rıstup na hardwarov´ karty pro digit´ln´ vstupy/v´stupy je rozdˇlen na dvˇ urovnˇ
                           e                  a ı              y              e          e´      e
(viz. obr.8.1). Nejvyˇˇ´ uroveˇ je reprezentov´na tˇ´
                         ssı ´       n                  a      rıdou CDeviceManager, kter´ je  a
vol´na z objektu CMemory (objekt pro emulaci pamˇti PLC).
    a                                                          e
    Tato tˇ´ udrˇuje seznam aktivn´ ovladaˇ˚ karet pro PLC, pˇiˇemˇ zajiˇt uje
             rıda      z                     ıch          cu                      rc z        s’
pˇed´n´ vol´n´ ovladaˇi pˇ´ sn´ho hardwarov´ho zaˇ´ ı a zpracov´n´ poˇadavku.
  r a ı         a ı        c rısluˇ e                   e        rızen´            a ı   z
Vlastn´ seznam ovladaˇ˚ je vytvoˇen jako pole statick´ velikosti obsahuj´ ı odkazy
         ı                   cu            r                        e                  ıc´
na jednotliv´ registrovan´ ovladaˇe5 . Pˇi vyhled´v´n´ ovladaˇe odpov´ ıc´
                e              e        c     r          a a ı          c       ıdaj´ ımu zadan´ e
adrese se cyklicky proch´z´ toto pole a ovladaˇ je zde vyhled´n. Pokud by bylo pouˇito
                              a ı                    c                 a                       z
vˇtˇ´ mnoˇstv´ aktivn´ ovladaˇ˚, pak by bylo moˇno vytvoˇit seznam ovladaˇ˚ jako
  e sı       z ı          ıch          cu                    z           r                 cu
vyhled´vac´ strom pro zv´ˇen´ rychlosti vyhled´n´ zaˇ´ ı, kter´ odpov´ a poˇadovan´
         a ı                   ys ı                    a ı rızen´           e      ıd´ z         e
adrese. Vzhledem k tomu, ˇe lze pˇedpokl´dat za norm´ln´ okolnost´ pouze jednotky
                                 z       r       a               a ıch           ı
pouˇit´ch ovladaˇ˚, lze pouˇit´ ˇeˇen´ povaˇovat za dostateˇnˇ efektivn´
     z y              cu           z er s ı        z                   c e          ı.
               e          e’ e
    N´slednˇ je v pamˇt ov´m kontextu linuxov´ho j´dra k dispozici instance tohoto ob-
       a                                              e      a
jektu s n´zvem g KernelPLCDrivers, kter´ je vyuˇ´ ana vytvoˇen´m softwarov´m PLC
           a                                     a        zıv´            r y             y
i zaregistrovan´mi ovladaˇi. Tato instance je vytvoˇena zaveden´ modulu plc devicemanager.o
                   y           c                           r               ım
do linuxov´ho j´dra a mus´ b´t dostupn´ pˇed nahr´n´
              e     a            ı y            a r           a ım:

      • Vlastn´ modulu, kter´ reprezentuje emulovan´ PLC.
              ıho           y                      e
  3
     Obˇ template tˇ´ jsou deklarov´ny se stejn´m parametrem ˇablony (stejn´m vnitˇn´ datov´m
        e          rıdy             a          y             s             y      r ım     y
typem).
   4
     Implementace v souboru cresult.h
   5
     Je tedy tˇeba bˇhem pˇekladu modul˚ odhadnout, kolik ovladaˇ˚ bude maxim´lnˇ pouˇito a
               r     e      r            u                        cu             a e    z
velikost pole spr´vnˇ nastavit.
                 a e


                                             54
PODPORA PRO RT-LINUX                              Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
                                                        c             a ıch     u y     u


      • Jak´hokoliv pouˇ´ eho ovladaˇe.
           e           zıvan´       c
      Modul lze zav´st do pamˇti jedn´ z n´sleduj´ ıch zp˚sob˚6 :
                   e         e       ım   a      ıc´     u u
      • V pˇ´ e, ˇe je softwarov´ PLC nainstalov´no a modul je dostupn´ ve stan-
            rıpadˇ z            e               a                     y
        dardn´ adres´ˇi modul˚ j´dra:
              ım     ar      u a

           ]# modprobe plc_devicemanager

      • V pˇ´ e, ˇe se modul nach´z´ v jin´m adres´ˇi7 :
           rıpadˇ z              a ı      e       ar

           ]# insmod cesta/plc_devicemanager.o

8.2.1       Tvorba ovladaˇe I/O karty
                         c
Tvorbu ovladaˇe I/O zaˇ´ ı lze rozdˇlit na dvˇ ˇ´sti:
             c        rızen´       e         e ca
   1. Nejprve je tˇeba vytvoˇit odvozenou tˇ´ od tˇ´ CDeviceDriver, kter´ imple-
                  r         r              rıdu   rıdy                  a
      mentuje virtu´ln´ metody tˇ´ z uk´zky 8.1 volan´ pˇi pˇ´
                    a ı           rıdy     a           e r rıstupu na zaˇ´ ı.
                                                                          rızen´
      Popis virtu´ln´ metod je uveden v tab.8.2.
                 a ıch
   2. Pot´ je tˇeba vytvoˇit modul j´dra RT-Linuxu, kter´ bˇhem sv´ho zav´dˇn´ do
         e      r        r           a                     y e       e    a e ı
      pamˇti provede registraci instance tˇ´ vytvoˇen´ v pˇedchoz´ kroku do spr´vce
          e                                rıdy      r e   r      ım           a
      PLC zaˇ´ ı. Registrac´ do spr´vce zaˇ´ ı ovladaˇ ozn´m´ kter´ adresn´ rozsahy
              rızen´         ı       a        rızen´     c   a ı,    e     ı
      vstup˚ a v´stup˚ obsluhuje a maj´ mu tedy b´t pˇed´ny. Registraci lze prov´st
            u     y   u                   ı           y r a                      e
      metodou RegisterDriver() z´kladn´ objektu CDeviceDriver.
                                  a      ıho

        N´zev metody
         a
        ReadAddress()     Virtu´ln´ metoda volan´ v pˇ´ e, ˇe je tˇeba ze
                                a ı               a      rıpadˇ z          r
                          zaˇ´ ı pˇeˇ´ aktu´ln´ hodnotu zadan´ adresy.
                            rızen´ r cıst     a ı                 e
        SetAddress()      Virtu´ln´ metoda volan´ v pˇ´ e, ˇe je tˇeba z pro-
                                a ı              a     rıpadˇ z       r
                          gramu nastavit hodnotu nˇkter´ adresy, kter´ odpov´ a
                                                    e    e             a        ıd´
                          tomuto ovladaˇi.
                                        c
        DriverInfo()      Metoda vracej´ ı n´zev a popis ovladaˇe. Je vyuˇ´ ana
                                        ıc´ a                    c           zıv´
                          pˇi zobrazov´n´ informac´ t´kaj´ ıch se ovladaˇe.
                           r          a ı         ı y ıc´                c


       Tabulka 8.2: Popis virtu´ln´ metod definovan´ch ve tˇ´ e CDeviceDriver.
                               a ıch              y       rıdˇ

   Jako pˇ´
          rıklad pro tvorbu ovladaˇe lze vyuˇ´ komentovan´ zdrojov´ k´dy vytvoˇen´ch
                                   c         zıt            e     e o         r y
ovladaˇ˚, kter´ jsou pops´ny n´ze.
      cu       e           a    ıˇ
   Kaˇd´ z n´sleduj´ ıch ovladaˇ˚ umoˇnuje pˇi zav´dˇn´ modulu specifikovat tak´
      z y      a       ıc´         cu      zˇ     r     a e ı                      e
PLC adresy, na kter´ch bude ovladaˇ dostupn´. Pˇehled je k dispozici v tab.8.3.
                      y               c          y r
   Ovladaˇ lze zav´st do pamˇti pomoc´ n´sleduj´ ıho pˇ´
           c        e          e          ı a       ıc´   rıkazu:
  6
    Pˇ´
      rıpadnˇ lze zaveden´ modulu zajistit napˇ. startovac´ skriptem pˇi spouˇtˇn´ operaˇn´
            e              ı                  r           ım             r     se ı     c ıho
syst´mu.
    e
   7ˇ
    C´st cesta v um´ en´ modulu m˚ˇe b´t absolutn´ nebo relativn´ cesta k modulu.
      a             ıstˇ ı        uz y            ı             ı

                                             55
PODPORA PRO RT-LINUX                           Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
                                                     c             a ıch     u y     u



class CDeviceDriver
{
...
public:
   virtual int ReadAddress(void *Value,
                           int iValueSize,
                           int iInputAddr,
                           int iByteAddress,
                           int iBitAddress
   ) = 0;
   virtual int SetAddress(void *Value,
                          int iValueSize,
                          int iInputAddr,
                          int iByteAddress,
                          int iBitAddress
   ) = 0;
   virtual const char* DriverInfo(void) = 0;
...
};




             Uk´zka 8.1: Virtu´ln´ metody pro implementaci ovladaˇe.
               a              a ı                                c

             Parametr     Popis
             iladdr       Parametr specifikuj´ ı z´kladn´ adresu, na
                                               ıc´ a     ı
                          kter´ bude ovladaˇ dostupn´ pˇi adresov´n´
                              e              c         y r          a ı
                          vstup˚. Pokud je tedy napˇ. hodnota
                                u                          r
                          iladdr=10, bude prvn´ adresa zaˇ´ ı dos-
                                                  ı          rızen´
                          tupn´ jako %IB10. Pokud parametr nen´
                               a                                      ı
                          specifikov´n, je zaˇ´ ı adresov´no od %IB0.
                                   a        rızen´       a
             oladdr       Parametr specifikuj´ ı z´kladn´ adresu, na
                                               ıc´ a     ı
                          kter´ bude ovladaˇ dostupn´ pˇi adresov´n´
                              e              c         y r          a ı
                          v´stup˚. Pokud je tedy napˇ. hodnota
                            y    u                         r
                          oladdr=7, bude prvn´ adresa zaˇ´ ı dos-
                                                 ı           rızen´
                          tupn´ jako %QB7. Pokud parametr nen´
                               a                                      ı
                          specifikov´n, je zaˇ´ ı adresov´no od
                                   a            rızen´          a
                          %QB0.


         Tabulka 8.3: Pˇehled spoleˇn´ch parametr˚ pro moduly ovladaˇ˚.
                       r           c y           u                  cu

   ]# insmod plc_lpt.o [iladdr=2] [oladdr=3]

   Parametry modulu jsou nepovinn´, pˇedpokl´d´ se, ˇe je jiˇ zaveden modul spr´vce
                                  e r       a a     z       z                  a
ovladaˇ˚ plc devicemanager.o. N´zev modulu plc lpt.o je tˇeba samozˇejmˇ nahradit
      cu                       a                         r           r   e

                                        56
PODPORA PRO RT-LINUX                           Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
                                                     c             a ıch     u y     u


pˇ´ sn´m n´zvem modulu, kter´ chceme nahr´t do pamˇti.
 rısluˇ y a                 y            a        e

Ovladaˇ PCI karty Advantech
      c
Ovladaˇ dodan´ karty Advantech PCI LabCard 1750 je vytvoˇen velice jednoduˇe.
       c       e                                                r                   s
Ovladaˇ si internˇ udrˇuje informace o vˇech aktu´ln´ hodnot´ch v´stup˚. Tyto
       c         e     z                   s         a ıch         a       y   u
hodnoty jsou pak ovladaˇem navr´ceny v pˇ´ e, ˇe uˇivatel z programu ˇte hodnotu
                         c       a         rıpadˇ z z                        c
v´stupu. Pokud uˇivatel zap´se na v´stup novou hodnotu, je intern´ informace aktual-
  y              z         ıˇ      y                                ı
izov´na a na v´stupy je okamˇitˇ zaps´na poˇadovan´ hodnota. V pˇ´ e, ˇe uˇivatel
    a         y              z e     a         z     a                rıpadˇ z z
ˇte hodnoty vstup˚, je aktu´ln´ hodnota z´ ana pˇi kaˇd´m poˇadavku.
c                 u        a ı            ısk´     r   z e     z
    Ovladaˇ by bylo moˇno upravit tak, ˇe by vzorkoval hodnoty pomoc´ vlastn´ real-
          c            z               z                                 ı     ıho
time vl´kna maxim´ln´ pˇ´
       a            a ı rıpustnou frekvenc´ a uˇivatel by vˇdy z´
                                             ı   z         z      ıskal pouze aktu´ln´
                                                                                   a ı
navzorkovanou hodnotu.

Ovladaˇ paraleln´ portu
      c         ıho
Ovladaˇ standardn´ paraleln´ portu je vytvoˇen s ohledem na ulohu ˇ´ ı ot´ˇek
      c           ıho       ıho                r                ´ rızen´ ac
motorku. Popis a v´znam jednotliv´ch adres je uveden v tab.8.4.
                  y              y

         Adresa     Velikost    V´znam
                                  y
         0x00          1byte    V´stupn´ adresa, pˇi z´pisu odpov´ a z´pisu
                                  y        ı        r a            ıd´ a
                                na adresu 0x378 (z´pisu na z´kladn´ adresu
                                                    a         a       ı
                                paraleln´ portu).
                                          ıho
         0x00          1byte    Vstupn´ adresa, pˇi ˇten´ odpov´ a ˇten´
                                        ı           r c ı           ıd´ c ı
                                adresy 0x379 (ˇten´ z´kladn´ adresy par-
                                                 c ı a         ı
                                aleln´ portu + 0x1).
                                     ıho
         0x01.0          1bit   Vstupn´ adresa, v pˇ´ e, ˇe obsahuje
                                        ı               rıpadˇ z
                                log.1, bylo vyvol´no pˇeruˇen´ od paraleln´
                                                 a    r s ı               ıho
                                portu. Po pˇeˇten´ hodnoty je automaticky
                                              r c ı
                                nastaveno zpˇt na log.0.
                                               e


        Tabulka 8.4: V´znam jednotliv´ch adres ovladaˇe paraleln´ portu.
                      y              y               c          ıho

    ´
   Uloha ˇ´ ı motorku tento ovladaˇ vyuˇ´ a k vytvoˇen´ PID regul´toru pro regulaci
         rızen´                   c    zıv´        r ı           a
ot´ˇek pomoc´ PID regul´toru.
  ac         ı         a
   N´zev modulu ovladaˇe paraleln´ portu je plc lpt.o.
      a                c         ıho

Ovladaˇ pro komunikaci s user-space Linuxu
      c
Tento ovladaˇ slouˇ´ ke komunikaci s user-space Linuxu. Pomoc´ vstupn´ adres lze
            c     zı                                          ı       ıch
nastavovat hodnoty PLC adres z user-space ˇ´sti Linuxu, pomoc´ adres v´stupn´ lze
                                           ca                ı        y     ıch
z´ avat z user-space ˇ´sti hodnoty promˇnn´ch PLC.
 ısk´                ca                e y



                                          57
PODPORA PRO RT-LINUX                                  Ovladaˇe karet digit´ln´ vstup˚/v´stup˚
                                                            c             a ıch     u y     u


   Pro komunikaci mezi kernel-space a user-space je vyuˇiv´no jedno RT-Linux FIFO
                                                         z a
pro z´pis promˇnn´ch do PLC, jedno pro ˇten´ promˇnn´ch z PLC a jedno pro nas-
     a          e y                        c ı        e y
tavov´n´ parametr˚ ovladaˇe.
     a ı          u       c
   Ovladaˇ poskytuje 64 adres pro vstupy a 64 adres pro v´stupy. Velikost pamˇti je
           c                                               y                  e
nastavov´na pˇi kompilaci modulu pomoc´ makra PLC USPACE MEMORY.
         a    r                          ı
   Tab.8.5 popisuje, k ˇemu slouˇ´ jednotliv´ real-time FIFO pouˇ´ a ovladaˇem.
                       c        zı          a                   zıvan´      c

   Index                  N´zev
                             a                 Popis
   F irstF IF O + 0       ˇ ıd´ ı
                          R´ ıc´ FIFO          Slouˇ´ k naprogramov´n´ intervalu, se
                                                    zı                       a ı
                                               kter´m je zas´ an obsah vnitˇn´ pamˇti
                                                   y             ıl´                 r ı       e
                                               ovladaˇe. Pro z´pis pˇ´
                                                       c         a       rıkazu slouˇ´ struktura
                                                                                     zı
                                               struct PLCUserSpaceControl deklarovan´            a
                                               v hlaviˇkov´m souboru plc uspace.h.
                                                           c e
                                               Do poloˇky struktury Command patˇ´
                                                           z                                    rı
                                               jedna z hodnot PLC SEND SET TIME,
                                               PLC SEND STOP, PLC RESET. Pokud
                                               je hodnota PLC SEND SET TIME, patˇ´               rı
                                               do poloˇky iTime ˇasov´ interval v [ms]
                                                         z             c     y
                                               s jak´m budou zas´ ana data. Popis jed-
                                                     y                 ıl´
                                               notliv´ch pˇ´ u je pops´n v hlaviˇkov´m
                                                      y      rıkaz˚           a           c e
                                               souboru.
   F irstF IF O + 1       Vstupn´ FIFO
                                ı              Slouˇ´ k z´pisu dat odpov´ ıch jed-
                                                    zı        a                     ıdaj´
                                               notliv´m vstupn´ adres´m ovladaˇe. Pˇi
                                                      y             ım        a            c     r
                                               z´pisu mus´ b´t zasl´no najednou hodnota
                                                a            ı y        a
                                               vˇech vstup˚.
                                                 s            u
   F irstF IF O + 2       V´stupn´ FIFO
                           y     ı             Slouˇ´ k z´ av´n´ hodnot vstup˚ a v´stup˚
                                                    zı ısk´ a ı                      u     y     u
                                               ovladaˇe (obsah vnitˇn´ pamˇti ovladaˇe).
                                                       c                 r ı      e          c
                                               Struktura zas´ ych dat je patrna z
                                                                 ılan´
                                               obr.8.2.


Tabulka 8.5: Popis jednotliv´ch RT FIFO vyuˇ´ ych ovladaˇem pro komunikaci s
                            y              zıvan´       c
user-space.

      Ovladaˇ je zaloˇen na n´sleduj´ ım principu:
            c        z       a      ıc´

      • Po zaveden´ modulu ovladaˇe (plc uspacedriver.o) do pamˇti se zaregistruje ve
                  ı              c                                 e
        spr´vci PLC zaˇ´ ı a otevˇe si 3 po sobˇ n´sleduj´ ı real-time fifo8 .
           a          rızen´     r             e a       ıc´

      • Pokud chce uˇivatel z´ avat hodnoty promˇnn´ch ze softwarov´ho PLC, otevˇe
                      z       ısk´                  e y               e          r
        si ˇ´ ıc´ FIFO a naprogramuje si interval, s jak´m m´ b´t do v´stupn´ FIFO
           rıd´ ı                                       y     a y     y     ıho
        zas´ an aktu´ln´ stav vnitˇn´ pamˇti ovladaˇe (adres).
            ıl´      a ı          r ı    e         c
  8
      Pomoc´ parametru FirstFIFO pˇi zav´dˇn´ modulu lze specifikovat, jak´ nejniˇˇ´ FIFO se pouˇije.
           ı                      r     a e ı                            e      zsı            z



                                                 58
PODPORA PRO RT-LINUX                             Podpora C++ v RT-Linuxov´m kernelu
                                                                         e


      • Pokud chce uˇivatel nastavit nˇkter´ ze vstup˚ ovladaˇe, otevˇe si vstupn´ FIFO
                      z                e   y         u       c       r           ı
        a zaˇle do nˇho nov´ stav vˇech vstup˚. Tj. mus´ zapsat takov´ mnoˇstv´ dat,
            s        e      y        s         u           ı            e      z ı
                                                        9
        kter´ odpov´ a velikosti vnitˇn´ pamˇti ovladaˇe .
            e       ıd´              r ı    e         c
    Obr.8.2 ukazuje strukturu dat, kter´ je zas´ ana ovladaˇem pˇi ˇten´ hodnot vstup˚
                                         a     ıl´          c    r c ı                u
                                                         10          11
a v´stup˚ ovladaˇe. Hlaviˇka nab´v´ vˇdy hodnoty ”I” nebo ”O” . Oba bloky jsou
    y    u       c         c        y a z
vˇdy zas´ any za sebou. Pokud hlaviˇka neobsahuje jednu z uveden´ch hodnot, pak
 z       ıl´                           c                               y
zˇejmˇ jsou data zas´ ana pˇ´ s rychle a proces v user-space Linuxu je nest´ a ˇ´
 r    e               ıl´     rıliˇ                                            ıh´ cıst.
D˚sledkem je, ˇe data v FIFO jsou zahazov´na. V tomto pˇ´ e je vhodn´ prov´st
  u            z                              a               rıpadˇ         e      e
reset ovladaˇe (viz. popis ˇ´ ıc´ FIFO).
             c             rıd´ ıho




           Obr´zek 8.2: Struktura bloku dat pˇi ˇten´ hodnot pamˇti ovladaˇe.
              a                              r c ı              e         c

   Ovladaˇ je urˇen zejm´na pro moˇnost vizualizace ˇ´ ıc´ procesu. Takto je tak´
          c     c       e           z               rıd´ ıho                    e
vyuˇ´ an v r´mci vzorov´ ulohy ˇ´ ı ot´ˇek motorku.
   zıv´     a          e´      rızen´ ac

Ovladaˇ pro ladˇn´ programu
      c        e ı
Ovladaˇ pro ladˇn´ programu emuluje vstupy a v´stupy pomoc´ vnitˇn´ pamˇti, pˇiˇemˇ
         c       e ı                           y              ı      r ı     e     rc z
pˇi zmˇnˇ hodnoty je vyps´na na aktu´ln´ konzoli Linuxu nov´ hodnota nastavovan´
  r     e e               a            a ı                      a                      e
promˇnn´ vˇetnˇ informace o adrese, na kter´ se zmˇna ud´la. Pˇi ˇten´ hodnoty je na
      e e c e                               e       e     a       r c ı
konzoli vyps´na informace o ˇten´ adrese a hodnotˇ, kter´ se na n´ pr´vˇ nach´z´
              a              c e                   e     a           ı a e        a ı.
    Tento ovladaˇ je vhodn´ vyuˇ´
                  c        e     zıvat pouze v pˇ´ e ladˇn´ pomalejˇ´ program˚
                                                 rıpadˇ    e ı           sıch          u
(nebo doˇasnˇ sn´zit frekvenci spouˇtˇn´ pˇ´ sn´ho RT vl´kna), nebot
           c e ıˇ                   s e ı rısluˇ e          a              ’ vzhledem k
ˇasov´ n´roˇnosti v´stupu na linuxovou konzoli m˚ˇe pˇi ˇast´m pˇ´
c     e a c          y                           uz r c e          rıstupu doj´ k nesta-
                                                                               ıt
bilitˇ cel´ho syst´mu.
     e e          e


8.3        Podpora C++ v RT-Linuxov´m kernelu
                                   e
Tato ˇ´st souvis´ s pouˇit´m pˇekladaˇem GCC a jeho vlastnostmi vyuˇiteln´mi pˇi
      ca         ı     z y     r      c                                z    y      r
pˇekladu programu. V pˇ´ e kompilace vygenerovan´ho C++ k´du jin´m pˇekladaˇem
  r                    rıpadˇ                        e       o      y     r      c
je moˇn´, ˇe se v´ˇet potˇebn´ch symbol˚ bude liˇit.
      z e z       yc     r   y           u      s
    Pro pˇekladaˇ GCC je tˇeba m´ v r´mci j´dra RT-Linuxu k dispozici modul rtl cpp,
         r      c          r     ıt a      a
kter´ implementuje symboly pro nˇkter´ funkce a oper´tory potˇebn´ k bˇhu zkom-
    y                               e   e              a       r    e     e
pilovan´ho k´du jazyka C++. Potˇebn´ symboly se mohou liˇit ze dvou d˚vod˚:
       e     o                    r   e                   s             u   u
  1. Je pouˇita odliˇn´ verze pˇekladaˇe GCC.
           z        s a        r      c
  9
    Hodnota makra PLC USPACE MEMORY pˇi pˇekladu ovladaˇe.
                                              r r      c
 10
    Pokud n´sleduje blok s hodnotami vstup˚.
           a                              u
 11
    Pokud n´sleduje blok s hodnotami v´stup˚.
           a                          y    u

                                           59
PODPORA PRO RT-LINUX                                 Podpora C++ v RT-Linuxov´m kernelu
                                                                             e


   2. Pˇekladaˇ GCC byl byl bˇhem sv´ kompilace zkompilov´n s jin´mi parametry.
       r      c              e      e                    a       y

    Souˇast´ distribuce RT-Linuxu je verze modulu, kter´ implementuje funkce fputs(),
        c´ ı                                                      a
  pure virtual(), cxa atexit(), this fixmap does not exist(), assert fail(), isnan().
    V bal´ RT-Linux Contrib je k dispozici novˇjˇ´ verze modulu, kter´ nav´ oproti
           ıku                                           e sı                      a   ıc
p˚vodn´ verzi implementuje oper´tory new, new[], delete, delete[]. Tyto oper´tory jsou
  u     ı                               a                                            a
v podstatˇ pouze pˇesmˇrov´ny tak, aby vyuˇ´
            e           r     e a                   zıvaly vol´n´ standardn´ linuxov´ho ker-
                                                              a ı          ıho          e
nelu pro dynamick´ alokace a dealokace pamˇti. Z toho plyne omezen´ ˇe je lze vyuˇ´
                        e                           e                         ı, z          zıt
pouze bˇhem inicializace a deinicializace modulu j´dra. Dostupnost tˇchto oper´tor˚ je
         e                                                a                 e           a u
proto podm´ ena existenc´ makra CPP INIT . Nav´ tato verze umoˇnuje linkov´n´
               ınˇ               ı                             ıc                zˇ         a ı
real-time modul˚ sloˇen´ch z v´ zdrojov´ch soubor˚.
                     u z y            ıce        y            u
    Na pˇiloˇen´m CD je upraven´ verze p˚vodn´ modulu rtl cpp z RT-Linux Contrib,
          r z e                        a       u       ıho
kter´ je vyzkouˇena s kompil´tory GCC 2.96 a GCC 3.2. Tato verze nav´ implementuje
    a              s               a                                            ıc
symbol cxa pure virtual().
    Vzhledem k tomu, ˇe kompil´tor GCC lze kompilovat s mnoha r˚zn´mi parametry,
                            z          a                                   u y
m˚ˇe se st´t, ˇe v jin´ verzi, pˇ´
  uz          a z          e         rıpadnˇ verzi z jin´ distribuce bude chybˇt nˇjak´ dalˇ´
                                           e             e                       e e y       sı
symbol. Obvykle se jedn´ o r˚zn´ funkce se speci´ln´ v´znamem, kter´ jsou v r´mci
                               a    u e                   a ım y                  e       a
norm´ln´ program˚ linkov´ny s defaultn´ funkcionalitou, lze je deklarovat podobnˇ
      a ıch               u        a              ı                                           e
jako v´ˇe uveden´ symboly.
       ys             e




                                              60
Kapitola 9

Pouˇit´ softwarov´ho PLC
   z ı           e

Tato kapitola se zab´v´ pouˇit´ vytvoˇen´ho software pro programov´n´ softwarov´ho
                       y a    z ım        r e                           a ı         e
PLC. Nejprve je v ˇ´sti 9.1 uveden n´vod na zprovoznˇn´ programu, ˇ´st 9.2 popisuje
                     ca                 a               e ı             ca
utilitu plc2cpp a jej´ parametry na pˇ´
                     ı               rıkazov´m ˇ´dku, ˇ´st 9.3 popisuje moˇnost vytv´ˇen´
                                            e ra      ca                   z        ar ı
knihoven funkc´ a funkˇn´ blok˚ pro znovuvyuˇit´ jiˇ hotov´ho k´du a ˇ´st 9.4 ob-
                ı         c ıch    u              z ı z         e     o      ca
sahuje jednoduch´ n´vod, jak vytvoˇit softwarov´ PLC.
                   y a                r           e


9.1      Instalace softwarov´ho PLC
                            e
V t´to ˇ´sti je uveden struˇn´ n´vod ke zprovoznˇn´ softwarov´ho PLC. Nejprve je vˇak
   e ca                    c y a                e ı          e                    s
tˇeba m´ k dispozici funkˇn´ instalaci RT-Linuxu. Kr´tk´ n´vod k jeho zprovoznˇn´ je
 r      ıt                 c ı                        a y a                     e ı
           rıloze A.
uveden v pˇ´
   V pˇ´ e, ˇe je RT-Linux uspˇˇnˇ nainstalov´n, postup je n´sleduj´ ı:
       rıpadˇ z                 ´ es e           a              a     ıc´

       r                  e o               ıskat je lze bud’ z pˇiloˇen´ho CD, nebo z
   1. Pˇipravte si zdrojov´ k´dy projektu. Z´                    r z e
      domovsk´ str´nky projektu [2].
              e a

   2. Rozbal´ zdrojov´ k´d do pracovn´ adres´ˇe1 :
            ıme      y o             ıho    ar

          ]# tar xzf SoftwarePLC-x.yy.tgz

   3. Zmˇn´ aktu´ln´ adres´ˇ na adres´ˇ se zdrojov´m k´dem:
        e ıme   a ı       ar         ar           y   o

          ]# cd SoftwarePLC-x.yy

   4. Spust´ konfiguraˇn´ skript2 :
           ıme       c ı

          ]# ./configure
  1
   Znaky x.yy znamenaj´ verzi programu.
                       ı
  2
   V pˇ´ e, ˇe chcete zmˇnit nˇkter´ v´choz´ nastaven´ programu, lze pˇidat parametr –help pro
       rıpadˇ z           e     e   e y    ı         ı                r
n´povˇdu o dostupn´ch parametrech.
 a   e            y


                                             61
POUZIT´ SOFTWAROVEHO PLC
   ˇ I           ´                                          Parametry pˇıkazov´ho ˇ´dku
                                                                       r´     e ra


  5. Nyn´ jiˇ m˚ˇeme spustit kompilaci programu a podp˚rn´ch modul˚ j´dra:
        ı z uz                                        u y         u a

          ]# make dep
          ]# make

  6. Pokud se kompilace zdaˇila, je m˚ˇeme pˇistoupit k instalaci programu:
                           r         uz     r

          ]# make install

      Instalace spoˇ´ a v nakop´ an´ modul˚ j´dra se spr´vcem ovladaˇ˚ zaˇ´ ı
                   cıv´         ırov´ ı        u a        a             cu rızen´
      a jednotliv´ch ovladaˇ˚ do syst´mov´ho adres´ˇe s moduly j´dra, instalaci po-
                 y         cu        e     e       ar           a
      mocn´ho skriptu mkplc.sh pro vytv´ˇen´ softwarov´ho PLC, instalaci preproce-
            e                             ar ı        e
      soru plc2cpp a instalaci pomocn´ch knihoven potˇebn´ch pro kompilaci PLC
                                       y               r  y
      programu do modulu j´dra pomoc´ C++.
                            a           ı

   V tuto chv´ m´me tedy k dispozici vˇe potˇebn´ pro vytv´ˇen´ uˇivatelsk´ch pro-
             ıli a                    s     r   e         ar ı z          y
gram˚ pro PLC.
    u


9.2      Parametry pˇ´
                    rıkazov´ho ˇ´dku
                           e   ra
Pˇehled a popis parametr˚ pˇ´
 r                      u rıkazov´ho ˇ´dku utility plc2cpp je uveden v tab.9.1.
                                 e ra

      Parametr       Popis
      -t directory   Adres´ˇ, do kter´ho se maj´ ukl´dat vygenerovan´ zdrojov´
                            ar          e            ı   a                 e       e
                     soubory v C++.
      -s source      N´zev vstupn´ souboru v jazyce Instruction List.
                       a            ıho
      -p project     N´zev projektu. Pouˇ´ a se pro n´zev vygenerovan´ho mod-
                       a                    zıv´           a                e
                     ulu j´dra, pro odvozen´ n´zvu hlaviˇkov´ho souboru s ex-
                           a                    ı a            c e
                     portem glob´ln´ promˇn´ch atp.
                                  a ıch          e y
      -r time        ˇ v [ns] urˇuj´ ı jak ˇasto bude detekov´na n´bˇˇn´ hrana
                     Cas           c ıc´      c                    a    a ez a
                     sign´lu pˇi spouˇtˇn´ uloh, kter´ nejsou spouˇtˇny periodicky.
                          a    r       s e ı´          e             se
      -n time        ˇ
                     Cas v [ns] urˇuj´ ı periodu spouˇtˇn´ uloh, kter´ nemaj´
                                     c ıc´                   se ı ´          e     ı
                     pˇiˇazen TASK.
                       rr
      -L libdirs     Dalˇ´ adres´ˇe oddˇlen´ ˇ´rkou pouˇ´ e pro hled´n´ kni-
                         sı      ar        e e ca             zıvan´           a ı
                     hoven.
      -h             Zobraz´ n´povˇdu k programu.
                             ı a     e
      -l listfile     Do souboru listfile uloˇ´ seznam vˇech vygenerovan´ch sou-
                                              zı            s                 y
                     bor˚ v C++ (vˇetnˇ hlaviˇkov´ch soubor˚).
                         u             c e         c y             u


          Tabulka 9.1: Pˇehled parametr˚ pˇ´
                        r              u rıkazov´ho ˇ´dku utility plc2cpp.
                                                e ra



                                           62
POUZIT´ SOFTWAROVEHO PLC
   ˇ I           ´                                                 Vytv´ˇen´ knihoven
                                                                       ar ı


9.3     Vytv´ˇen´ knihoven
            ar ı
Vytv´ˇen´ knihoven je velmi jednoduch´. Staˇ´ vytvoˇit zdrojov´ soubor s jedn´ nebo
     ar ı                              e     cı     r         y              ım
v´ bloky pro z´pis programu (funkce, funkˇn´ blok, blok typu program).
 ıce           a                            c ı
    Knihovny se hledaj´ v n´sleduj´ ıch adres´ˇ´
                      ı    a      ıc´        arıch:

   • Pokud je pˇi pˇekladu plc2cpp definov´na hodnota makra PLC LIBDIRS, je
                r r                       a
     jeho hodnota pˇedpokl´d´na jako : oddˇlen´ seznam dalˇ´ adres´ˇ˚, kde jsou
                   r       a a            e y             sıch    aru
     hled´ny objekty z knihoven.
         a

   • Pokud je deklarov´na promˇnn´ prostˇed´ PLC LIBDIR, je jej´ hodnota pˇedpokl´d´na
                      a       e a       r ı                    ı          r      a a
     jako : oddˇlen´ seznam dalˇ´ adres´ˇ˚, kde jsou hled´ny dalˇ´ objekty z kni-
               e y             sıch      aru             a        sı
     hoven.

   • Dalˇ´ moˇnost´ je parametr -L pˇ´
        sı    z   ı                 rıkazov´ho ˇ´dku(viz.tab.9.1), kter´ m˚ˇe obsa-
                                           e ra                        y uz
     hovat ˇ´rkou oddˇlen´ seznam adres´ˇ˚, kde se tak´ mohou nach´zet knihovn´
           ca         e y                aru           e               a          ı
     objekty.

   V pˇ´ e, ˇe knihovna pouˇ´ a jinou knihovnu, lze ve zdrojov´m k´du definovat
        rıpadˇ z             zıv´                             e   o
z´vislost zp˚sobem uveden´m v uk´zce 9.1.
 a          u            y       a


(* Include: min.plc,max.plc *)
(* Include: pid.plc *)
PROGRAM prg_control
...



         Uk´zka 9.1: Definice vyuˇit´ jin´ knihovny ve zdrojov´m k´du PLC.
           a                    z ı e                        e   o

   Tato vlastnost nen´ v [5] definov´na. Jedn´ se o rozˇ´ren´ vytvoˇen´ho softwarov´ho
                       ı            a       a         sıˇ ı       r e             e
PLC, kter´ je vytvoˇena za uˇelem komfortnˇjˇ´ vytv´ˇen´ knihoven i program˚ v
           a         r        ´c             e sıho      ar ı                     u
jazyce Instruction List.
   V pˇ´ e, ˇe je nalezena direktiva Include: v koment´ˇi, kter´ zaˇ´ a na nov´m
        rıpadˇ z                                           ar      y cın´          e
ˇ´dku, jsou uveden´ soubory zpracov´ny stejnˇ, jako by byly souˇ´st´ p˚vodn´ zdro-
ra                 e                  a      e                   ca ı u      ıho
jov´ho k´du. Za direktivou m˚ˇe n´sledovat jeden ˇi v´ zdrojov´ch soubor˚, jejichˇ
   e     o                     uz a                c ıce          y          u       z
jednotliv´ n´zvy jsou oddˇleny ˇ´rkou.
          e a             e      ca


9.4     Vytvoˇen´ softwarov´ho PLC
             r ı           e
V t´to ˇ´sti je uveden jednoduch´ n´vod k vytvoˇen´ softwarov´ho PLC za pomoci v´ˇe
    e ca                         y a           r ı           e                  ys
vytvoˇen´ho programu. Podm´
      r e                      ınkou pro spr´vnou funkci je samozˇejmˇ zprovoznˇn´
                                            a                     r   e         e e
softwarov´ PLC a funkˇn´ RT-Linux.
          e             c ı


                                         63
POUZIT´ SOFTWAROVEHO PLC
   ˇ I           ´                                                Vytvoˇen´ softwarov´ho PLC
                                                                       r ı           e


    Pˇedpokl´dejme, ˇe chceme vytvoˇit projekt, kter´ se bude jmenovat foo, bude se
     r       a       z              r               y
nach´zet v domovsk´m adres´ˇi uˇivatele v podadres´ˇi s n´zvem foo plc a bude se
     a              e          ar z                  ar    a
skl´dat ze dvou zdrojov´ch souboru foo1.plc a foo2.plc uloˇen´ch pˇ´
   a                     y                                 z y     rımo v adres´ˇi
                                                                                ar
projektu.
    Postup je tedy n´sleduj´ ı:
                    a      ıc´
   1. Zaloˇ´ nov´ projekt
          zıme  y

      tmp]# mkplc.sh --create foo --target-dir ~/foo_plc

   2. Nyn´ pˇid´me zdrojov´ soubory do Makefile. Najdeme v adres´ˇi /foo plc soubor
         ı r a            e                                    ar
      Makefile. Otevˇeme ho v obl´ em textov´m editoru a najdeme ˇ´dek:
                   r            ıben´        e                     ra

          # FILES=deps/filename.plc

      Tento ˇ´dek zmˇn´ na:
            ra      e ıme

          FILES=deps/foo1.plc deps/foo2.plc

   3. Nyn´ vytvoˇ´ soubory obsahuj´ ı zdrojov´ k´dy pro PLC v jazyce instruction
            ı      rıme           ıc´        e o
      list foo1.plc a foo2.plc

   4. Chceme-li prov´st kompilaci programu zad´me na pˇ´
                    e                         a       rıkazov´m ˇ´dku v adres´ˇi
                                                             e ra            ar
      projektu:

          foo_plc]# make


   5. Pro spuˇtˇn´ vytvoˇen´ho softwarov´ho PLC staˇ´ zadat3 :
             se ı       r e             e          cı

          foo_plc]# make start

   6. Pro zastaven´ softwarov´ho PLC lze pouˇ´
                  ı          e              zıt:

          foo]# make stop


   Skript pro vytv´ˇen´ softwarov´ho PLC je koncipov´n tak, aby byl co nejjednoduˇˇ´
                  ar ı           e                  a                             ssı.
Pˇedpokl´d´, ˇe zdrojov´ k´dy pro PLC se budou nach´zet pˇ´ v adres´ˇi projektu,
 r       a a z          e o                          a     rımo         ar
vygenerovan´ soubory budou ukl´d´ny do podadres´ˇe sources v adres´ˇi projektu a vy-
            e                   a a              ar                 ar
generovan´ modul j´dra se bude jmenovat plc projekt.o. D´le je tˇeba, aby v nˇkter´m
          y        a                                    a       r            e    e
zdrojov´m souboru pro PLC byl definov´n blok typu CONFIGURATION s n´zvem
       e                               a                                       a
  3
    Pˇedpokl´d´ se, ˇe je spuˇtˇn RT-Linux a zaveden modul plc devicemanager.o, pˇ´
      r     a a     z        se                                                  rıpadnˇ ovladaˇe
                                                                                       e       c
zaˇ´ ı, kter´ bude program vyuˇ´
  rızen´    e                    zıvat.

                                               64
POUZIT´ SOFTWAROVEHO PLC
   ˇ I           ´                                              Vytvoˇen´ softwarov´ho PLC
                                                                     r ı           e


shodn´m s n´zvem projektu (v naˇem pˇ´ e by to tedy byl blok CONFIGURATION
      y     a                      s    rıpadˇ
foo.
    V seznamu soubor˚, ze kter´ch se projekt skl´d´ je tˇeba uv´dˇt n´zev souboru
                      u          y                 a a     r      a e a
vˇetnˇ podadres´ˇe deps. D˚vodem je, ˇe v tomto podadres´ˇi je uloˇen pomocn´
 c e             ar           u           z                    ar     z             y
                                                              4
soubor, kter´ obsahuje seznam dˇ´ vygenerovan´ch soubor˚ a z´roveˇ je vyuˇ´ an
            y                     rıve             y         u     a  n        zıv´
programem make, pro udrˇov´n´ z´vislost´ v projektu.
                           z a ı a         ı
    Uk´zka 9.2 uv´d´ z´kladn´ kostru zdrojov´ho k´du PLC. V k´du je definov´n jeden
       a          a ı a        ı             e    o             o           a
blok typu program vyuˇ´ ıc´ glob´ln´ promˇnnou out, konfiguraˇn´ blok (s n´zvem
                        zıvaj´ ı     a ı       e                  c ı         a
stejn´m jako n´zev projektu - tedy foo) a spouˇtˇn´ programov´ho bloku prg rotace s
     y         a                                 se ı           e
periodou 0.5s. Z´roveˇ je v r´mci koment´ˇe na prvn´ ˇ´dku uvedeno pouˇit´ knihovny
                a    n       a           ar          ım ra             z ı
pid.plc.


(* Include: pid.plc *)
PROGRAM prg_rotace
   VAR_EXTERNAL
      out: BYTE;
   END_VAR

   LD   out
   ...
END_PROGRAM

CONFIGURATION foo
VAR_GLOBAL
out AT %QB0: BYTE := 1;
END_VAR

RESOURCE xx ON yy
TASK rotaceTask(INTERVAL:=T#0.5s);

PROGRAM p1 WITH rotaceTask: prg_rotace();
END_RESOURCE
END_CONFIGURATION




                        Uk´zka 9.2: Uk´zka kostry PLC programu.
                          a           a

   V pˇ´ e sloˇitˇjˇ´ projektu lze samozˇejmˇ vygenerovan´ Makefile upravit ruˇnˇ,
      rıpadˇ z e sıho                     r  e           y                   c e
nebo vytvoˇit zcela nov´ soubor odpov´ ıc´ poˇadavk˚m.
          r            y             ıdaj´ ı z     u




  4
      Tento seznam je pouˇ´ an pro smaz´n´ dˇ´ vygenerovan´ch soubor˚ v pˇ´ e rekompilace.
                         zıv´          a ı rıve           y         u    rıpadˇ


                                              65
Z´vˇr
 a e

´
Ukolem diplomov´ pr´ce bylo vytvoˇit pro operaˇn´ syst´m RT-Linux softwarov´ vy-
                         e a                          r                  c ı          e                              e
baven´ umoˇnuj´ ı spouˇtˇt program zapsan´ v nˇkter´m jazyce pro PLC, kter´ je
        ı        zˇ ıc´             se                             y        e       e                                  y
definovan´m v normˇ IEC-1131-3.
              e               e
     C´ pr´ce se podaˇilo splnit. Bylo vytvoˇeno softwarov´ PLC s takov´mi z´kladn´
       ıl a                   r                               r                      e                  y     a         ımi
vlastnostmi, jak je definov´no v normˇ IEC-1131-3. Pro implementaci byl zvolen jazyk
                                       a                e
Instruction List. Funkcionalita vytvoˇen´ho PLC odpov´ a poˇadavk˚m normy. V´bˇr
                                                       r e                         ıd´ z             u                y e
vlastnost´ byl proveden tak, aby bylo moˇno vyuˇ´ vˇechny instrukce, bloky pro z´pis
             ı                                              z           zıt s                                          a
programu, promˇnn´ reprezentovan´ z´stupn´m jm´nem i pˇ´
                        e e                           e a           y         e                rımou adresou. D´le je
                                                                                                                    a
moˇno vyuˇ´ vˇechny zp˚soby spouˇtˇn´ vl´ken PLC. Umyslnˇ nebyla implementov´na
    z           zıt s                u               se ı a                     ´            e                         a
moˇnost vyuˇ´
    z              zıvat z´vorkov´n´ aritmetick´ch operac´ D´le se nepodaˇ´ implemento-
                             a          a ı                  y               ı. a                     rılo
vat pˇed´v´n´ funkˇn´ blok˚ v parametrech funkc´ funkˇn´ blok˚ a blok˚ typu
       r a a ı               c ıch          u                                  ı,          c ıch       u          u
program. V pˇ´      rıloze B je uveden pˇehled vlastnost´ definovan´ch v [5], kter´ vytvoˇen´
                                                  r                      ı                  y              e          r y
syst´m podporuje, pˇ´
     e                        rıpadnˇ nepodporuje.
                                        e
     Vzhledem k potˇebˇ vytv´ˇet knihovny, je moˇn´ pomoc´ direktivy Include:, um´ en´
                            r e           ar                           z e              ı                            ıstˇ e
uvnitˇ koment´ˇe definovat z´vislost zdrojov´ho k´du na pˇ´ sn´ knihovnˇ. A to jak
       r             ar                    a                      e       o               rısluˇ e          e
v r´mci koncov´ho programu uˇivatele, tak v r´mci kter´koliv knihovn´ funkce. Bliˇˇ´
    a                 e                       z                      a               e                   ı               zsı
informace o t´to vlastnosti lze nal´zt v ˇ´sti 9.3.
                    e                              e       ca
     Softwarov´ PLC bylo vytvoˇeno jako utilita (preprocesor) jazyka Instruction List
                    e                         r
do jazyka C++. Pro kompilaci do strojov´ho k´du je vyuˇit standardn´ linuxov´ kom-
                                                             e       o                z                ı          y
pil´tor. Pro kompilaci vygenerovan´ho C++ k´du je tˇeba pomocn´ knihovna, kter´
   a                                                 e               o            r                 a                     a
je souˇ´st´ softwarov´ho PLC.
        ca ı                   e
     Vzhledem k volbˇ pˇev´dˇt PLC program na program v jazyce C++, byla z´roveˇ
                              e r a e                                                                              a      n
ovˇˇena moˇnost vyuˇ´ k tvorbˇ RT-Linuxov´ch aplikac´ C++. Je vˇak tˇeba se v
   er            z               zıt             e                   y                  ı                s     r
programu drˇet omezen´ uveden´ch v ˇ´sti 2.2.
                  z                ı            y        ca
     V r´mci PLC programu je moˇn´ tak´ vyuˇ´
          a                                        z e        e       zıvat FPU pro matematick´ operace s  e
pohyblivou ˇ´dovou ˇ´rkou. Toho je doc´
                 ra           ca                           ıleno t´ ˇe kaˇd´ vygenerovan´ vl´kno m´ ve
                                                                    ım, z         z e                   e a            a
sv´ch parametrech pˇi zakl´d´n´ uvedeno, ˇe vyuˇ´ a FPU.
   y                           r        a a ı                   z        zıv´
     Souˇast´ vytvoˇen´ho PLC je tak´ n´vrh pro modul´rn´ tvorbu ovladaˇ˚, kter´
          c´ ı             r e                          e a                            a ı                      cu         e
umoˇnuj´ z PLC programu pˇistupovat na extern´ zaˇ´ ı. Modularita ovladaˇ˚ umoˇnuje
      zˇ ı                               r                            ı rızen´                               cu         zˇ
libovolnˇ pouˇ´ e PLC konfigurovat dle dostupn´ho hardware. V r´mci projektu byly
           e       zıvan´                                                e                         a
vytvoˇeny ovladaˇe pro paraleln´ port, ovladaˇ umoˇnuj´ ı komunikaci mezi uˇivatelskou
        r               c                     ı                   c        zˇ ıc´                            z
ˇ´st´ linuxu a softwarov´m PLC s vyuˇit´ pro visualizaci ˇ´ eho procesu. D´le byl
ca ı                                y                     z ım                             rızen´                  a
vytvoˇen ovladaˇ pro PCI kartu s digit´ln´ vstupy/v´stupy.
        r              c                                  a ımi                   y
     Funkˇnost cel´ho syst´mu byla ovˇˇena na PLC programu pro ˇ´ ı ot´ˇek mo-
            c            e            e                  er                                         rızen´ ac

                                                          66
POUZIT´ SOFTWAROVEHO PLC
   ˇ I           ´                                      Vytvoˇen´ softwarov´ho PLC
                                                             r ı           e


        ˇ ıd´ ı
torku. R´ ıc´ program komplexnˇ demonstruje vlastnosti a moˇnosti vytvoˇen´ho soft-
                               e                             z           r e
warov´ho PLC. Vyuˇ´ a moˇnost spouˇtˇn´ ulohy na z´kladˇ n´bˇˇn´ hrany (mˇˇen´
      e               zıv´  z          se ı ´          a    e a ez e           er ı
aktu´ln´ ot´ˇek motorku), periodick´ spouˇtˇn´ programu pro regulaci ot´ˇek pomoc´
     a ıch ac                        e       se ı                       ac         ı
PID regul´toru. Z´roveˇ je vyuˇit ovladaˇ pro komunikaci s user-space RT-Linuxu.
            a       a    n    z          c
    Na vzorov´m ˇ´ ıc´ programu byly tak´ otestov´ny rychlostn´ moˇnosti softwarov´ho
                e rıd´ ım                  e        a          ı    z             e
PLC. Na poˇ´ ci Intel Pentium 3 700MHz bylo vyykouˇeno cyklick´ spouˇtˇn´ vl´ken
              cıtaˇ                                    s           e    se ı a
PLC programu s periodou kratˇ´ neˇ 100[µs].
                              sı z
    Vytvoˇen´ softwarov´ PLC je um´ eno na internetov´ adrese [2] jako projekt pod
           r e            e         ıstˇ                 e
licenc´ GPLv2. Na t´to adrese je t´ˇ moˇn´ nal´zt pˇ´
      ı                e           ez     z e     e   rıpadnˇ dalˇ´ upravy a opravy
                                                            e    sı ´
programu.




                                        67
Dodatek A

Instalace RT-Linuxu

Tato ˇ´st v kr´tkosti uv´d´ n´vod k instalaci RT-Linuxu. Pˇedpokl´daj´ se alespoˇ
       ca         a           a ı a                               r       a ı          n
ˇ´steˇn´ znalosti potˇebn´ pro spr´vu Linuxu a instalaci uˇivatelsky kompilovan´ho
ca c e                   r     e        a                       z                    e
j´dra. Pro podrobnˇjˇ´ informace je tˇeba si prostudovat pˇ´ snou dokumentaci na
 a                     e sı               r                    rısluˇ
n´ze uveden´ch adres´ch.
  ıˇ          y          a
     K instalaci je tˇeba z adresy http://www.rtlinux.org st´hnout distribuci RT-Linuxu.
                     r                                      a
Souˇ´st´ staˇen´ho bal´ je i tzv. patch1 pro vybran´ verze p˚vodn´ linuxov´ho
     ca ı     z e           ıku                           e           u    ıho       e
j´dra. Ten provede v p˚vodn´ zdrojov´m k´du linuxu zmˇny potˇebn´ k bˇhu RT-
 a                          u      ım       e   o              e        r   e   e
Linuxu.
     Nyn´ je moˇn´ si z adresy ftp://ftp.linux.org st´hnout zdrojov´ k´d linuxov´ho
         ı        z e                                  a                 y o         e
j´dra. Je tˇeba vybrat takovou verzi, kter´ je podporov´na RT-Linuxem (tj. existuje
 a          r                                 a            a
patch na tuto verzi linuxov´ho j´dra).
                                 e    a
     M´me-li k dispozici oba bal´ popsan´ v pˇedchoz´ odstavc´ m˚ˇeme pˇistoupit
       a                            ıky     e r        ıch          ıch, uz     r
k vlastn´ instalaci:
          ı

      • Budeme pˇedpokl´dat, ˇe vˇechny operace budeme prov´dˇt na cestˇ /usr/src:
                r      a     z s                           a e         e

            ]# cd /usr/src

      • Nyn´ rozbal´ staˇen´ linuxov´ j´dro (pokud se staˇen´ soubor jmenuje linux-
             ı       ıme z e        e a                  z y
        2.4.20.tar.gz):

            ]# tar xzf linux-2.4.20.tar.gz

      • Rozbal´ staˇen´ zdrojov´ k´dy RT-Linuxu (pokud se staˇen´ soubor jmenuje
               ıme     z e        e o                        z y
        rtlinux-3.2-pre1.tar.gz):

            ]# tar xzf rtlinux-3.2-pre1.tar.gz

      • Nyn´ vytvoˇ´
           ı        rıme symblick´ link na nov´ zdrojov´ soubory j´dra (t´ zajist´
                                 y            e        e          a      ım      ıme
        pouˇit´ spr´vn´ch hlaviˇkov´ch soubor˚ bˇhem kompilace):
           z ı     a y         c y           u e
  1
      Tj. soubor jehoˇ aplikac´ na p˚vodn´ linuxov´ j´dro z´ ame j´dro s podporou real-time extenze.
                     z        ı     u    ı        e a      ısk´   a

                                                 68
INSTALACE RT-LINUXU



           ]# rm -f /usr/src/linux
           ]# ln -s /usr/src/linux-2.4.20 /usr/src/linux

      • Nyn´ najdeme v adres´ˇi rtlinux-3.2-pre1/patches patch na pouˇitou verzi j´dra.
           ı                ar                                       z            a

      • Nyn´ aplikujeme patch (za pˇedpokladu, ˇe jsme naˇli soubor kernel patch-2.4.20-
             ı                     r           z         s
        rtl3.2-pre1):

           ]# cd linux-2.4.20
           ]# patch -p1 < ../rtlinux-3.2-pre1/patches/kernel_patch-
              2.4.20-rtl3.2-pre1

      • Provedeme konfiguraci linuxov´ho j´dra (je tˇeba vybrat vˇechny potˇebn´ ovladaˇe
                                    e    a         r            s         r   e       c
                        2
        a podporu modul˚ )
                       u

           ]# make menuconfig

      • Nyn´ jiˇ m˚ˇeme prov´st kompilaci j´dra a nainstalovat nov´ moduly:
           ı z uz           e              a                      e

           ]# make bzImage modules modules_install

      • Zb´v´ jeˇtˇ nakonfigurovat RT-Linuxovou extenzi a nainstalovat jej´ moduly:
          y a se                                                         ı

           ]#   cd ../rtlinux-3.2-pre1
           ]#   make menuconfig
           ]#   make dep
           ]#   make all
           ]#   make install

     Nyn´ jiˇ m´me k dispozici zkompilovanou verzi linuxov´ho j´dra s podporou real-
        ı z a                                              e   a
time extenze a moduly RT-Linuxu, kter´ po zaveden´ do j´dra linuxu aktivuj´ real-time
                                       e           ı    a                 ı
rozˇ´ren´ (a tedy tak´ RT-Linux). Zaveden´ tˇchto modul˚ lze prov´st napˇ. pomoc´
    sıˇ ı            e                    ı e             u        e       r        ı
        3
pˇ´
  rıkazu :

/etc/rc.d/rtlinux start

   Dalˇ´ informace lze nal´zt kromˇ internetu tak´ v souborech README, pˇ´
      sı                  e       e              e                        rıpadnˇ
                                                                                e
INSTALL, kter´ se nach´zej´ v adres´ˇ´ s Linuxem, pˇ´
               e        a ı         arıch             rıpadnˇ RT-Linuxem.
                                                            e



  2
   Podpora modul˚ je tˇeba pro kompilaci RT-Linuxov´ch modul˚.
                  u    r                              y          u
  3
   Cesta ke spouˇtˇc´
                s e ımu skriptu se m˚ˇe liˇit v z´vislosti na parametrech zvolen´ch pˇi kompilaci
                                       uz s      a                              y    r
RT-Linuxu a na pouˇit´ distribuci linuxu
                   z e


                                               69
Dodatek B

Kompatibilita s normou IEC-1131-3

N´ze uveden´ tabulka obsahuje pˇehled podporovan´ch vlastnost´ softwarov´ho PLC
  ıˇ         a                      r                y          ı           e
vzhledem k poˇadovan´m vlastnostem, kter´ jsou uv´dˇny v [5]. V tabulce je vˇdy
               z        y                    e         a e                       z
uv´dˇno ˇ´ tabulky z [5], ˇ´ vlastnosti, kr´tk´ charakteristika (obvykle pro celou
   a e cıslo                  cıslo            a a
skupinu vlastnost´ informace o tom, zda je vlastnost podporov´na a pˇ´
                  ı),                                         a     rıpadnˇ pozn´mku
                                                                          e     a
k implementaci.
    Nˇkter´ vlastnosti, kter´ nesouvis´ pˇ´ s programovac´ jazykem Instruction List,
     e     e                e         ı rımo               ım
nejsou n´ze uvedeny.
        ıˇ

    Tab.-ˇ.
         c      Popis                  Podporov´no
                                               a        Pozn´mka
                                                              a
       1-1      Znakov´ sady
                      e                                 Podporov´ny ASCII
                                                                  a
                                                        znaky,       diakritika
                                                        podporov´na v r´mci
                                                                  a       a
                                                        koment´ˇ˚.
                                                                aru
        1-2     Mal´ p´
                   a ısmena            Ano              Podporov´na v r´mci
                                                                  a       a
                                                        n´zv˚ promˇnn´ch,
                                                         a u           e y
                                                        funkc´ a funkˇn´
                                                             ı           c ıch
                                                        blok˚.
                                                            u      V    tˇchto
                                                                         e
                                                        pˇ´
                                                         rıpadech je rozd´    ıl
                                                        v mal´ch a velk´ch
                                                               y            y
                                                        p´
                                                         ısmenech ignorov´n.
                                                                           a
        1-3a                           Ano
        1-3b                           Ne
        1-4a                           Ne
        1-4b                           Ne
        1-5a                           Ne               Programov´n´a ı     po-
                                                        moc´ı      ˇebˇ´ckov´ch
                                                                   z rıˇ y
                                                        diagram˚ nen´ k
                                                                u         ı
                                                        dispozici.
        1-5b
        1-6a    Z´vorkov´ operace
                 a      e              Ne               Viz. pozn´mka v kapi-
                                                                 a
                                                        tole 5.

                                        70
KOMPATIBILITA S NORMOU IEC-1131-3


    Tab.-ˇ.
         c     Popis                 Podporov´no
                                             a     Pozn´mka
                                                       a
       1-6b    Z´vorkov´ operace
                a      e             Ne
       2-1                           Ano
       2-2                           Ano
       2-3                           Ano
       3-1     Koment´ˇe
                     ar              Ano           Na       samostatn´m e
                                                   ˇ´dku i na ˇ´dku s
                                                   ra             ra
                                                   k´dem
                                                    o           programu.
                                                   Z´roveˇ vyuˇito k
                                                    a     n        z
                                                   definici       z´vislosti
                                                                  a
                                                   na knihovn´ch (viz.
                                                                a
                                                   kapitola 9).
        4-1                          Ano
        4-2                          Ano
        4-3                          Ano
        4-4                          Ano
        4-5                          Ano
        4-6                          Ano
        4-7                          Ano
        4-8                          Ano
        5-1    ˇ e
               Retˇzcov´ konstanty
                       e             Ne
        6-1    Kombinace znak˚ v
                               u     Ne
               ˇetˇzc´
               r e ıch
        6-2                          Ne
        6-3                          Ne
        6-4                          Ne
        6-5                          Ne
        6-6                          Ne
        6-7                          Ne
        6-8                          Ne
        7-1a   ˇ
               Casov´ konstanty
                    e                Ano
        7-1b                         Ano
        7-2a                         Ano
        7-2b                         Ano
        8-1    Konstanty pro datum   Ne            Pˇ´ sn´ datov´ typy
                                                    rısluˇ e     e
               a denn´ ˇas
                     ıc                            nejsou podporov´ny.
                                                                  a
        8-2                          Ne
        8-3                          Ne
        8-4                          Ne
        8-5                          Ne
        8-6                          Ne


                                     71
KOMPATIBILITA S NORMOU IEC-1131-3


    Tab.-ˇ.
         c     Popis                      Podporov´no
                                                  a     Pozn´mka
                                                            a
      10-1     Element´rn´
                      a ı       datov´
                                     e    Ano
               typy
       10-2                               Ano
       10-3                               Ano
       10-4                               Ano
       10-5                               Ano
       10-6                               Ano
       10-7                               Ano
       10-8                               Ano
       10-9                               Ano
       10-10                              Ano
       10-11                              Ne
       10-12                              Ano
       10-13                              Ne
       10-14                              Ne
       10-15                              Ne
       10-16                              Ne
       10-17                              Ano
       10-18                              Ano
       10-19                              Ano
       10-20                              Ano
       12-1    Odvozen´ uˇivatelsk´
                       e z        e       Ne
               datov´ typy
                    e
       12-2                               Ne
       12-3                               Ne
       12-4                               Ne
       12-5                               Ne
       14-1    Inicializace               Ne
               uˇivatelsk´ch
                z         y         da-
               tov´ch typ˚
                  y        u
       14-2                               Ne
       14-3                               Ne
       14-4                               Ne
       14-5                               Ne
       14-6                               Ne
       15-1    Pˇ´ a adresace
                rım´                      Ano
       15-2                               Ano
       15-3                               Ano
       15-4                               Ano
       15-5                               Ano
       15-6                               Ano


                                          72
KOMPATIBILITA S NORMOU IEC-1131-3


    Tab.-ˇ.
         c     Popis                Podporov´no
                                            a     Pozn´mka
                                                      a
      15-7                          Ano
      15-8                          Ano
      15-9                          Ano
      16-1     Bloky promˇnn´ch
                         e y        Ano
      16-2                          Ano
      16-3                          Ano
      16-4                          Ano
      16-5                          Ano
      16-6                          Ano
      16-7                          Ne
      16-8                          Ano           Kl´cov´ slovo je ig-
                                                    ıˇ e
                                                  norov´no,
                                                       a       p˚vodn´
                                                                u    ı
                                                  v´znam je ztracen.
                                                   y
       16-9                         Ano
       16-10                        Ano
       17-1    Deklarace            Ano
               promˇnn´ch
                    e y
       17-2                         Ano           Studen´   y       restart
                                                  nen´ moˇn´ bˇˇn´mi
                                                      ı       z e ez y
                                                  prostˇedky v RT-
                                                         r
                                                  Linuxu           zpraco-
                                                  vat. Kl´cov´ slovo
                                                              ıˇ e
                                                  RETAIN         je     ig-
                                                  norov´no, promˇnn´
                                                          a           e e
                                                  si po restartu neza-
                                                  chov´vaj´ svoji hod-
                                                        a ı
                                                  notu.
       17-3                         Ano
       17-4                         Ne            Pole nejsou        pod-
                                                  porov´na.
                                                       a
       17-5                         Ano
       17-6                         Ne
       17-7                         Ne
       17-8                         Ne
       18-1    Inicializace         Ano
               promˇnn´ch
                     e y
       18-2                         Ano           Viz. pozn´mka o RE-
                                                           a
                                                  TAIN promˇnn´ch.
                                                             e y
       18-3                         Ano
       18-4                         Ne



                                    73
KOMPATIBILITA S NORMOU IEC-1131-3


    Tab.-ˇ.
         c     Popis                  Podporov´no
                                              a     Pozn´mka
                                                          a
      18-5                            Ano           S           vyj´
                                                                   ımkou
                                                    ˇetˇzcov´ch
                                                    r e     y
                                                    promˇnn´ch.
                                                         e y
       18-6                           Ne
       18-7                           Ano
       18-8                           Ne
       18-9                           Ano
       33-1    Moˇnosti
                  z       deklarace   Ano           Kl´cov´
                                                      ıˇ e      slovo RE-
               funkˇn´ blok˚
                    c ıch   u                       TAIN je   ignorov´no.
                                                                     a
       33-2                           Ano           Kl´cov´
                                                      ıˇ e      slovo RE-
                                                    TAIN je   ignorov´no.
                                                                     a
       33-3                           Ano           Kl´cov´
                                                      ıˇ e      slovo RE-
                                                    TAIN je   ignorov´no.
                                                                     a
       33-4a                          Ano
       33-4b                          Ne            Grafick´ programovac´
                                                           e           ı
                                                    jazyky nejsou pod-
                                                    porov´ny.
                                                         a
       33-5a                          Ne
       33-5b                          Ne
       33-6a                          Ne
       33-6b                          Ne
       33-7a                          Ne
       33-7b                          Ne
       33-8a                          Ne
       33-8b                          Ne
       33-9a                          Ne
       33-9b                          Ne
       49-1    Moˇnosti
                  z      deklarace    Ano
               blok˚ CONFIGURA-
                    u
               TION a RESOURCE
       49-2                           Ano
       49-3                           Ano
       49-4                           Ano
       49-5a                          Ano
       49-5b                          Ano           Spouˇtˇn´
                                                          se ı           je
                                                    ve          skuteˇnosti
                                                                      c
                                                    nahrazeno       period-
                                                    ick´m
                                                       y       spouˇtˇn´
                                                                    s e ım.
                                                    Bliˇˇ´ informace lze
                                                       z sı
                                                    nal´zt v kapitole 7.
                                                       e
       49-6a                          Ano
       49-6b                          Ne

                                      74
KOMPATIBILITA S NORMOU IEC-1131-3


    Tab.-ˇ.
         c      Popis                 Podporov´no
                                              a     Pozn´mka
                                                        a
      49-6c                           Ano
      49-7                            Ne            Deklaraci lze nahra-
                                                    dit        pomocnou
                                                    promˇnnou.
                                                         e
       49-8a                          Ano
       49-8b                          Ano
       49-9a                          Ano
       49-9b                          Ano
       49-10a                         Ne
       49-10b                         Ne
       49-10c                         Ne
       49-10d                         Ne
       49-10e                         Ne
       49-10f                         Ne
       50-1a    Parametry deklarace   Ano
                blok˚ TASK
                    u
       50-1b                          Ano
       50-2a                          Ne            Grafick´ jazyky nejsou
                                                          e
                                                    podporov´ny.
                                                             a
       50-2b                          Ne
       50-3a                          Ano
       50-3b                          Ne
       50-4a                          Ne
       50-4b                          Ne
       50-5a                          Ne
       50-5b                          Ano
       51-1                           Ano
       52-1     Instrukce jazyka IL   Ano
       52-2                           Ano
       52-3                           Ano
       52-4                           Ano
       52-5                           Ano
       52-6                           Ano
       52-7                           Ano
       52-8                           Ano
       52-9                           Ano
       52-10                          Ano
       52-11                          Ano
       52-12                          Ano
       52-13                          Ano
       52-14                          Ano


                                      75
KOMPATIBILITA S NORMOU IEC-1131-3


    Tab.-ˇ.
         c     Popis                   Podporov´no
                                               a     Pozn´mka
                                                         a
      52-15                            Ano
      52-16                            Ano
      52-17                            Ano
      52-18                            Ano
      52-19                            Ano
      52-20                            Ano
      52-21                            Ne            ˇ e ı
                                                     Retˇzen´ operac´ po-
                                                                    ı
                                                     moc´ z´vorek nen´
                                                         ı   a          ı
                                                     podporov´no.
                                                              a
       53-1    Vol´n´
                  a ı      funkˇn´
                               c ıch   Ano
               blok˚
                   u
       53-2                            Ano
       53-3                            Ne
       54-4                            Ne            Funkˇn´ bloky jako
                                                         c ı
                                                     parametry    nejsou
                                                     podporov´ny.
                                                             a
       54-5                            Ne
       54-6                            Ne
       54-7                            Ne
       54-8                            Ne
       54-9                            Ne
       54-10                           Ne
       54-11                           Ne
       54-12                           Ne
       54-13                           Ne




                                       76
Dodatek C
ˇ ızen´ motorku pomoc´
R´    ı              ı
softwarov´ho PLC
         e

V t´to ˇasti je kr´tce pops´na vzorov´ aplikace, kter´ ukazuje, jak lze softwarov´ PLC
   e c´           a         a        a               a                           e
vyuˇ´ Jedn´ se o ˇ´ ı motorku, kter´ je pˇipojen k PC pomoc´ paraleln´ portu.
   zıt.      a       rızen´            y     r                    ı          ıho
   Aplikace se skl´d´ ze dvou nez´visl´ch ˇ´st´
                    a a           a y ca ı:

  1. Vlastn´ ˇ´ ıc´ program napsan´ v jazyce Instruction List pro PLC. Ten pomoc´
            ı rıd´ ı              y                                             ı
     PID regul´toru ˇ´ ı motorek, kter´ je pˇipojen k poˇ´ ci pomoc´ paraleln´
                 a    rıd´             y     r            cıtaˇ       ı       ıho
     portu.

  2. Jednoduch´ uk´zkov´ vizualizace pro X-Windows naprogramovan´ v jazyce C++,
                a a      a                                         a
     zobrazuj´ ı aktu´ln´ ot´ˇky motorku a umoˇnuj´ ı nastavit poˇadovan´ ot´ˇky
             ıc´     a ı ac                   zˇ ıc´             z      e ac
     motorku.


C.1      ˇ ıd´ ı
         R´ ıc´ program motorku
ˇ ıd´ ı
R´ ıc´ program motorku je koncipov´n jako program pro PLC v jazyce Instruction List
                                       a
a jako takov´ je zpracov´n vytvoˇenou utilitou plc2cpp. N´slednˇ je zkompilov´n do
             y            a         r                       a      e             a
modulu RT-Linuxov´ho kernelu. Rychlost ot´ˇen´ je ˇ´
                     e                        ac ı rızena gener´torem PWM.
                                                                  a
    Sn´ an´ smˇru a rychlosti ot´ˇen´ i vlastn´ ˇ´ ı prob´ a pomoc´ paraleln´ portu
        ım´ ı e                   ac ı        ı rızen´    ıh´        ı       ıho
(je tedy vyuˇ´ an vytvoˇen´ ovladaˇ paraleln´ portu).
             zıv´       r y           c        ıho
    Velikost ot´ˇek (ˇ´dan´ veliˇina) se nastavuje z user-space s vyuˇit´ pˇ´ sn´ho
               ac    za     a    c                                     z ım rısluˇ e
ovladaˇe. Lze ji tedy dynamicky mˇnit za bˇhu programu. Stejnˇ tak jsou pˇed´v´ny
         c                            e      e                    e          r a a
aktu´ln´ mˇˇen´ ot´ˇky do user-space RT-Linuxu.
     a ı er e ac
    Program se skl´d´ ze tˇ´ periodicky spouˇtˇn´ch program˚ s n´leduj´ ım v´znamem:
                  a a     rı                se y            u a         ıc´ y

  1. Sn´ an´ poˇtu impulz˚ vygenerovan´ch inkrement´ln´ ˇidlem um´ en´m na
        ım´ ı c            u            y              a ım c          ıstˇ y
     hˇ´
      rıdelce motorku. Z generovan´ch impuls˚ je z´roveˇ urˇov´n smˇr ot´ˇen´
                                  y         u     a    n c a       e     ac ı.

  2. Pravideln´ pˇevod poˇtu vygenerovan´ch impuls˚ na ot´ˇky za sekundu. Hodnota
               y r        c               y        u     ac
     ot´ˇek je kladn´ pro jeden smˇr a z´porn´ pro smˇr druh´.
       ac           a             e     a    a       e      y

                                         77
R´
ˇ IZEN´ MOTORKU POMOC´ SOFTWAROVEHO PLC
      I              I          ´                                            Vizualizaˇn´ program
                                                                                      c ı


  3. Vlastn´ v´poˇet ˇ´ ıc´ veliˇin. Skl´d´ se z vyhodnocen´ regulaˇn´ odchylky,
           ı y c rıd´ ıch       c       a a                ı       c ı
     v´poˇtu PID regul´toru a generov´n´ PWM.
      y c              a             a ı

  Cel´ ˇ´ ıc´ program lze nal´zt v podadres´ˇi plc/motorek v archivu se softwarov´m
     y rıd´ ı                e             ar                                    y
PLC.


C.2         Vizualizaˇn´ program
                     c ı
Vizualizaˇn´ program je vytvoˇen jako jednoduch´ aplikace pro X-Windows. Ke sv´
          c ı                 r                 a                             e
ˇinnosti vyuˇ´ a objektovou aplikaˇn´ knihovnu wxWindows (viz. adresa [3]).
c             zıv´                c ı
   Program demonstruje moˇnosti vyuˇit´ PLC, pˇiˇemˇ m´ tyto vlastnosti:
                            z          z ı       rc z a

      • Umoˇnuje nastavit poˇadovan´ ot´ˇky motorku (tj. s vyuˇit´ ovladaˇe pro ko-
             zˇ              z      e ac                      z ım        c
                                                                      e’ e
        munikaci PLC s user-space RT-Linuxu zap´se tuto hodnotu do pamˇt ov´ho pros-
                                               ıˇ
                               1
        toru softwarov´ho PLC ).
                      e

      • Graficky zobrazuje aktu´ln´ ot´ˇky motorku tak jak je mˇˇ´ softwarov´ PLC (tj.
                                 a ı ac                           erı          e
                         c          e’ e
        tyto ot´ˇky jsou ˇteny z pamˇt ov´ho prostoru softwarov´ho PLC). D´le zobrazuje
               ac                                              e             a
        aktu´ln´ poˇadovanou hodnotu ot´ˇek, tak jak ji nastavil uˇivatel. Vzhled aplikace
             a ı z                        ac                      z
        je patrn´ z obr.C.1.
                y

      Vizualizaˇn´ program je dostupn´ v podadres´ˇi visualisation softwarov´ho PLC.
               c ı                   y           ar                         e




  1
                                 a      e’ y
      Z pohledu RT-Linuxu se jedn´ o pamˇt ov´ prostor linuxov´ho kernelu.
                                                              e


                                                78
R´
ˇ IZEN´ MOTORKU POMOC´ SOFTWAROVEHO PLC
      I              I          ´                          Vizualizaˇn´ program
                                                                    c ı




           Obr´zek C.1: Uk´zka jednoduch´ho vizualizaˇn´ rozhran´
              a           a             e            c ıho      ı.




                                     79
Dodatek D

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

Souˇ´st´ diplomov´ pr´ce je CD, jehoˇ obsah a struktura jsou patrny z tab.D.1.
   ca ı          e a                z

         Adres´ˇ
               ar    Obsah adres´ˇe ar
         dokument    Text diplomov´ pr´ce ve form´tu PDF a Postscript.
                                    e a            a
         linux       Zdrojov´ k´dy linuxov´ho j´dra s aplikovan´m patchem
                            e o             e    a               y
                     RT-Linuxu verze 3.2-pre1. Jedn´ se o verzi, na kter´ bylo
                                                    a                   e
                     PLC vyv´ ıjeno a testov´no.
                                            a
         rtlinux     Staˇen´ bal´ pro RT-Linux a RT-Linux Contrib.
                        z e      ıky
         plc         Obsahuje vytvoˇen´ softwarov´ PLC.
                                     r e           e


                   Tabulka D.1: Obsah a struktura pˇiloˇen´ho CD.
                                                   r z e




                                          80
Literatura

[1] Domovsk´ str´nky projektu RT-Linux [online].
           e a
    <http://www.rtlinux.org>.

[2] Domovsk´ str´nky projektu Softwarov´ PLC pro RT-Linux [online].
           e a                         e
    <http://sourceforge.net/projects/softwareplc>.

[3] Domovsk´ str´nky projektu wxWindows [online].
           e a
    <http://www.wxwindows.org>.

[4] Charles Donnelly and Stallman Richard. Bison. Free Software Foundation, 1995.

[5] In IEC-1131-3 - Programmable controlers - Part3, Bˇezen 1993.
                                                      r

[6] A.M. Kuchling. Regular Expression HOWTO [online].
    <http://www.amk.ca/python/howto/regex>.
              ˇ s
[7] Melichar, Ceˇka, Jeˇek, and Richta. Konstrukce pˇekladaˇ˚ 1,2. Vydavatelstv´
                       z                            r      cu                  ı
    ˇ
    CVUT, 1999.

[8] Thomas Niemann. A Compact Guide To Lex&Yacc. ePaper Press.

[9] Victor Yodaiken, Duben 1999. The RTLinux Manifesto [online].
    <http://www.fsmlabs.com/developers/white_papers/rtmanifesto.pdf>.




                                        81

Diplomka2

  • 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´ motorkupomoc´ softwarov´ho PLC C R´ ı ı e 77 ˇ ıd´ ı C.1 R´ ıc´ program motorku . . . . . . . . . . . . . . . . . . . . . . . . . . 77 C.2 Vizualizaˇn´ program . . . . . . . . . . . . . . . . . . . . . . . . . . . . c ı 78 D Obsah pˇiloˇen´ho CD r z e 80 Literatura 81 iii
  • 8.
    ´ Uvod C´ılem t´to pr´ceje vytvoˇit takzvan´ Softwarov´ PLC. Pod pojmem Softwarov´ PLC e a r e e e si v naˇem pˇ´ e pˇedstavujeme softwarov´ emul´tor programov´ k´du urˇen´ho s rıpadˇ r y a e o c e pro PLC. Tento emul´tor by mˇl b´t vytvoˇen pod operaˇn´ syst´mem RT-Linux a e y r c ım e na procesorov´ platformˇ Intel, mˇl by podporovat vybran´ programovac´ jazyk pro e e e y ı PLC a komunikovat s PCI kartou digit´ln´ vstup˚/v´stup˚. PLC by mˇlo splˇovat a ıch u y u e n vlastnosti definovan´ normou IEC-1131[5]. e PLC je zkratka pro programovateln´ logick´ automat. Jedn´ se o zaˇ´ ı urˇen´ y y a rızen´ c e zejm´na pro ˇ´ ıc´ a regulaˇn´ techniku. V podstatˇ je to mikroprocesorem osazen´ e rıd´ ı c ı e y syst´m obvykle umoˇnuj´ ı rozˇ´ren´ o dalˇ´ moduly (napˇ. moduly digit´ln´ vstup˚/v´- e zˇ ıc´ sıˇ ı sı r a ıch u y stu-p˚, A/D a D/A pˇevodn´ u r ıky, moduly pro pr˚myslov´ sbˇrnice atd.). Ve vˇtˇinˇ u e e es e pˇ´ u lze tyto syst´my programovat pomoc´ tˇech z´kladn´ programovac´ jazyk˚: rıpad˚ e ı r a ıch ıch u IL (instruction list - obdoba assembleru, ST (structured text - obdoba jazyka Pascal) a tzv. ˇebˇ´ckov´ch diagram˚. Instrukˇn´ soubor je velmi jednoduch´ se zamˇˇen´ na z rıˇ y u c ı y er ım ˇ´ ı a regulaci. Programovac´ jazyky pro PLC jsou detailnˇ pops´ny v [5]. rızen´ ı e a Operaˇn´ syst´m Linux je volnˇ ˇiˇiteln´ syst´m Unix dostupn´ vˇetnˇ zdrojov´ch c ı e esr y e y c e y k´d˚. Vlastn´ Linux je pouze j´dro operaˇn´ syst´mu. Operaˇn´ syst´m je ˇ´ren v o u ı a c ıho e c ı e sıˇ distribuc´ 1 , kter´ kromˇ j´dra operaˇn´ syst´mu obsahuj´ tak´ dalˇ´ utility a pro- ıch e e a c ıho e ı e sı gramy. Na z´kladˇ klasick´ho j´dra (kernelu) byl n´slednˇ vytvoˇen tzv. RT-Linux. a e e a a e r Jedn´ se o rozˇ´ren´ kernelu o vlastnosti hard real-time operaˇn´ syst´mu, pˇiˇemˇ a sıˇ ı c ıho e rc z jsou zachov´ny pˇedchoz´ v´hody norm´ln´ j´dra a pˇ´ a r ı y a ıho a rıpadn´ zvolen´ distribuce ve e e smyslu existence a pouˇitelnosti ovladaˇ˚ zaˇ´ ı a utilit. Vlastn´ real-time ukoly pot´ z cu rızen´ ı ´ e bˇˇ´ s vyˇˇ´ prioritou neˇ linuxov´ j´dro jako real-time vl´kna v pamˇt ov´m prostoru ezı ssı z e a a e’ e j´dra. a V ˇasti 1 je uveden rozbor ˇeˇen´ a volba n´sledn´ implementace. Kapitola 2 se c´ r s ı a e v kr´tkosti zab´v´ histori´ a vlastnostmi operaˇn´ syst´mu RT-Linux a moˇnostmi a y a ı c ıho e z jazyka C++ pˇi vyuˇit´ v RT-Linuxu. Kapitola 3 se zab´v´ zp˚sobem zpracov´n´ zdro- r z ı y a u a ı jov´ho programu pro PLC pomoc´ koneˇn´ho stavov´ho automatu. Kapitoly 4, 5, 6 a 7 e ı c e e se vˇnuj´ zpracov´n´ jednotliv´ch ˇ´st´ zdrojov´ho k´du. Kapitola 2.1 popisuje zp˚sob e ı a ı y ca ı e o u implementace a podpory v operaˇn´ syst´mu RT-Linux, vˇetnˇ vytv´ˇen´ ovladaˇ˚ c ım e c e ar ı cu zaˇ´ ı pro vyuˇit´ v softwarov´m PLC. Kapitola 9 popisuje vlastn´ utilitu plc2cpp a rızen´ z ı e ı jej´ vyuˇit´ pˇi tvorbˇ softwarov´ho PLC. Pˇ´ ı z ı r e e rıloha B uv´d´ celkov´ pˇehled vlastnost´ a ı y r ı vytvoˇen´ho softwarov´ho PLC v porovn´n´ s normou IEC-1131-3. V pˇ´ r e e a ı rıloze A je uve- 1 Napˇ. RedHat Linux, Debian, Slackware atp. r 1
  • 9.
    OBSAH OBSAH den kr´tk´ n´vod na zprovoznˇn´ RT-Linuxu. Pˇ´ a y a e ı rıloha C se kr´tce zab´v´ vytvoˇen´m a y a r y uk´zkov´m PLC programem pro ˇ´ ı ot´ˇek stejnosmˇrn´ho motorku. a y rızen´ ac e e 2
  • 10.
    Kapitola 1 N´vrh ˇeˇen´ a r s ı Norma IEC-1131-3 zab´vaj´ ı se problematikou programovac´ jazyk˚ pro PLC defin- y ıc´ ıch u uje z´kladn´ programovac´ jazyky uveden´ v tab.1.1. Jazyky IL, ST a LD maj´ tu a ı ı e ı v´hodu, ˇe jsou mezi sebou navz´jem pˇevoditeln´, pro vlastn´ kompilaci programu y z a r e ı staˇ´ implementace libovoln´ho z nich a n´sledn´ vytvoˇen´ konverzn´ utility z ostatn´ cı e a e r ı ı ıch programovac´ jazyk˚. ıch u N´zev jazyka a Popis IL Instruction List - jednoduch´ programovac´ y ı jazyk, obdoba assembleru. ST Structured Text - pokroˇilejˇ´ programovac´ c sı ı jazyk, obdoba jazyka Pascal ˇi C. c LD Ladder diagram - grafick´ n´stroj pro pro- y a gramov´n´ PLC, automat se v tomto pˇ´ e a ı rıpadˇ programuje pomoc´ rel´ov´ho schematu. ı e e Tabulka 1.1: Pˇehled programovac´ jazyk˚ pro PLC dle IEC-1131-3. r ıch u Pro z´pis programov´ho k´du PLC byl zvolen jazyk IL s podporou standardn´ a e o ıch datov´ch typ˚, ˇ´ y u cıseln´ch typ˚ (pro cel´ i desetinn´ ˇ´ y u a a cısla) a datov´ho typu pro uloˇen´ e z ı 1 ˇasu . Z blok˚ pro z´pis vlastn´ PLC programu byly vybr´ny bloky uveden´ v tab.1.2. c u a ıho a e D´le se budeme zab´vat anal´zou moˇn´ch ˇeˇen´ a n´slednou volbou vlastn´ im- a y y z y r s ı a ı plementace. Celkovˇ lze probl´m ˇeˇit bud’ jako interpret zdrojov´ho k´du pro PLC nebo jako e e r s e o pˇekladaˇ PLC k´du do jin´ho programovac´ jazyka, ze kter´ho bude n´slednˇ zkom- r c o e ıho e a e pilov´na bin´rn´ podoba programu, kter´ odpov´ a programu PLC. a a ı y ıd´ 1. Interpret PLC k´du - v´hodou tohoto ˇeˇen´ je jednoduˇˇ´ pouˇit´ z hlediska o y r s ı ssı z ı uˇivatele. Odpad´ totiˇ nutnost po kaˇd´ zmˇnˇ programu prov´dˇt jeho rekom- z a z z e e e a e pilaci. 1 Tento datov´ typ je tˇeba zejm´na kv˚li definici spouˇtˇn´ PLC program˚ v konfiguraˇn´ bloku. y r e u se ı u c ım 3
  • 11.
    NAVRH RESEN´ ´ ˇ ˇ I N´zev bloku a Popis FUNCTION Blok typu funkce. Jedn´ se o blok umoˇnuj´ ı a zˇ ıc´ volat k´d PLC programu s alespoˇ jedn´ o n ım vstupn´ parametrem a n´vratovou hodno- ım a tou, kter´ se po n´vratu z vol´n´ uloˇ´ jako a a a ı zı aktu´ln´ pracovn´ hodnota na z´sobn´ a ı ı a ıku. Pˇi r kaˇd´m vol´n´ jsou opˇtovnˇ inicializov´ny z e a ı e e a vˇechny promˇnn´. s e e FUNCTION BLOCK Funkˇn´ blok. Jedn´ se o blok, kter´ m˚ˇe c ı a y uz m´ libovoln´ poˇet vstupn´ v´stupn´ a ıt y c ıch, y ıch vstupnˇ-v´stupn´ parametr˚. Pˇi pouˇit´ e y ıch u r z ı funkˇn´ bloku se nejprve deklaruje jeho in- c ıho stance jako lok´ln´ promˇnn´. Vnitˇn´ stav a ı e a r ı instance funkˇn´ bloku z˚st´v´ zachov´n c ıho u a a a po dobu existence promˇnn´, kterou je tato e e instance reprezentov´na. a PROGRAM Programov´ blok. Jedn´ se o obdobu bloku y a typu FUNCTION BLOCK s t´ rozd´ ım ılem, ˇe existuje pouze jedna instance tohoto z bloku, kter´ je platn´ po celou dobu a a bˇhu programu. V programu nen´ tˇeba e ı r deklarovat promˇnnou, kterou je reprezen- e tov´na pouˇ´ a instance. a zıvan´ CONFIGURATION Konfiguraˇn´ blok. Hlavn´ blok definuj´ ı c ı ı ıc´ glob´ln´ promˇnn´ a obsahuj´ ı definici a ı e e ıc´ spouˇtˇn´ jednotliv´ch blok˚ typu program. se ı y u Tento blok nelze vyuˇ´ pro z´pis pro- zıt a gramov´ho k´du v ˇ´dn´m z programovac´ e o za e ıch jazyk˚. u Tabulka 1.2: Programov´ bloky zvolen´ pro implementaci. e e Hlavn´ nev´hodou ˇeˇen´ je velk´ n´roˇnost na interpret z hlediska jeho stability ı y r s ı a a c a odolnosti v˚ˇi chyb´m v PLC programu. Interpret by totiˇ v tomto pˇ´ e uc a z rıpadˇ musel fungovat v r´mci kernel-space RT-Linuxu. a 2. Pˇekladaˇ PLC k´du - v´hododou tohoto ˇeˇen´ je zejm´na moˇnost vytvoˇit r c o y r s ı e z r pouze preprocesor do jin´ho jazyka a pro vlastn´ generov´n´ bin´rn´ podoby PLC e ı a ı a ı programu vyuˇ´ tento programovac´ jazyk. zıt ı Nev´hodou tohoto ˇeˇen´ je nutnost po kaˇd´ zmˇnˇ PLC programu tento pro- y r s ı z e e e gram znovu kompilovat. Pro implementaci softwarov´ho PLC zvol´ e ıme variantu ˇ.2. D˚vodem je moˇnost c u z 4
  • 12.
    NAVRH RESEN´ ´ ˇ ˇ I vyuˇ´ jiˇ existuj´ ı kompil´tor jazyka C nebo C++, kter´ je standardnˇ vyuˇ´ an pro zıt z ıc´ a y e zıv´ programov´n´ ˇ´st´ Linuxov´ho a RT-Linuxov´ho j´dra. a ı ca ı e e a Po anal´ze [5] je zˇejm´, ˇe zp˚sob z´pisu programu pro PLC lze nejl´pe reprezen- y r e z u a e tovat k´dem v jazyce C++ (podobnost funkˇn´ blok˚ s objekty, moˇnost definovat o c ıch u z velk´ mnoˇstv´ funkc´ pomoc´ pˇet´zen´ch oper´tor˚ v podp˚rn´ knihovnˇ atp.). e z ı ı ı r ıˇ y a u u e e Zvolen´ ˇeˇen´ odpov´ a funkˇn´ e r s ı ıd´ c ımu diagramu na obr.1.1. C´ ılem diplomov´ pr´ce e a tedy bude vytvoˇit konvertor programu pro PLC do jazyka C++. Vygenerovan´ k´d r y o bude n´slednˇ pˇeloˇen do modulu j´dra bˇˇ´ ıho v RT-Linuxu. Pro zjednoduˇen´ kon- a e r z a ezıc´ s ı verze bude jeˇtˇ tˇeba vytvoˇit podp˚rnou knihovnu pouˇitelnou v oblasti j´dra, kter´ se r r u z a a bude vyuˇita pˇi pˇekladu C++ k´du. z r r o Obr´zek 1.1: Funkˇn´ diagram softwarov´ho PLC a c ı e Z obr´zku je patrn´, ˇe softwarov´ PLC bude rozdˇleno na dvˇ hlavn´ ˇ´sti, pˇiˇemˇ a e z e e e ı ca rc z pˇeklad programu bude spouˇtˇn v user-space RT-Linuxu a vlastn´ softwarov´ PLC r se ı e pobˇˇ´ jako real-time vl´kna RT-Linuxu v r´mci kernel-space. Kr´tk´ rozbor jed- ezı a a a y notliv´ch vlastnost´ je uveden v ˇ´stech 1.1 a 1.2. y ı ca Bliˇˇ´ informace o RT-Linuxu a nˇkter´ch pouˇit´ch term´ zsı e y z y ınech z pˇedchoz´ ˇ´sti lze r ı ca nal´zt v kapitole 2.1, pˇ´ e rıpadnˇ v manu´lov´ch str´nk´ch RT-Linuxu. e a y a a 5
  • 13.
    NAVRH RESEN´ ´ ˇ ˇ I Funkˇn´ ˇ´st pro user-space c ı ca 1.1 Funkˇn´ ˇ´st pro user-space c ı ca User-space, nebo-li kontext ve kter´m bˇˇ´ uˇivatelsk´ programy bude vyuˇit pro bˇh e ezı z e z e preprocesoru (konvertoru) zdrojov´ho k´du. Tento konvertor by mˇl splˇovat n´sleduj´ ı e o e n a ıc´ poˇadavky: z • Umoˇnit pˇedzpracov´n´ k´du ve zvolen´m jazyce pro PLC do jazyka C++ v z r a ı o e takov´m tvaru, aby bylo moˇn´ tento k´d zkompilovat do modulu bˇˇ´ ıho v e z e o ezıc´ RT-Linuxu. • Moˇnost tvorby a n´sledn´ho vyuˇit´ knihoven funkc´ a funkˇn´ blok˚ pro z a e z ı ı c ıch u opakovan´ vyuˇit´ e z ı. 1.2 Funkˇn´ ˇ´st pro kernel-space c ı ca Kernel-space, neboli kontext j´dra operaˇn´ syst´mu RT-Linux bude vyuˇit pro a c ıho e z vlastn´ bˇh vytvoˇen´ho softwarov´ho PLC. Vygenerovan´ k´d v C++ bude zkom- ı e r e e y o pilov´n jako modul j´dra RT-Linuxu. Pro kompilaci bude tˇeba vytvoˇit podp˚rnou a a r r u knihovnu, kter´ bude m´ n´sleduj´ ı vlastnosti: a ıt a ıc´ ˇ s ı • Reˇen´ emulace aktu´ln´ hodnoty z´sobn´ (tzv. current result), kde je uloˇena a ı a ıku z hodnota posledn´ proveden´ operace. ı e • Emulace adresov´n´ pˇ´ a ı rıstupu do pamˇti ve stylu PLC vˇetnˇ pˇ´ e c e rıstupu na extern´ ı zaˇ´ ı dle adresy. rızen´ • Moˇnost deklarace promˇnn´ch ve stylu PLC, tj. vˇetnˇ pˇ´ z e y c e rıpadn´ specifikace e absolutn´ adresy, na kter´ se promˇnn´ nach´z´ ı e e a a ı. • Moˇnost deklarovat parametry funkc´ funkˇn´ blok˚ a programov´ch blok˚ z ı, c ıch u y u tak, aby bylo moˇn´ je pˇiˇazovat dle syntaxe PLC. z e rr • Moˇnost modul´rnˇ vytv´ˇet ovladaˇe zaˇ´ ı a tyto ovladaˇe n´slednˇ reg- z a e ar c rızen´ c a e istrovat na konkr´tn´ adresy vstup˚/v´stup˚ softwarov´ho PLC. e ı u y u e 6
  • 14.
    Kapitola 2 RT-Linux Tato kapitolauv´d´ v ˇ´sti 2.1 z´kladn´ informace t´kaj´ ı se RT-Linuxov´ modifikace a ı ca a ı y ıc´ e j´dra a v ˇ´sti 2.2 diskutuje moˇnosti a omezen´ vyuˇit´ jazyka C++ v r´mci RT- a ca z ı z ı a Linuxu. 2.1 Princip ˇinnosti RT-Linuxu c V t´to ˇ´sti bude v kr´tkosti pops´n princip ˇinnosti RT-Linuxu. Informace zde uveden´ e ca a a c e jsou z´ any zejm´na z [9], pˇ´ ısk´ e rıpadnˇ z [1]. e 2.1.1 Definice hard real-time syst´mu e Tzv. hard real-time syst´m je syst´m, ve kter´m je zaruˇeno ˇasovˇ pˇesn´ spouˇtˇn´ e e e c c e r e se ı jednotliv´ch uloh. Kaˇd´ uloha m´ definov´nu svoji prioritu, se kterou je spouˇtˇna a y ´ z a´ a a se periodu spouˇtˇn´ s e ı. Perioda spouˇtˇn´ je v podstatˇ tzv. dead-line, tj. nejpozdˇjˇ´ ˇas, do kter´ho mus´ se ı e e sı c e ı b´t dan´ real-time uloha dokonˇena, aby mohla b´t opˇt spuˇtˇna. y a ´ c y e se Priorita ulohy definuje ”d˚leˇitost” ulohy z hlediska pl´novaˇe proces˚. ´ u z ´ a c u 2.1.2 Popis RT-Linuxu RT-Linux je hard real-time operaˇn´ syst´m urˇen´ pro ˇ´ ı robot˚ a technologick´ch c ı e c y rızen´ u y proces˚, ˇasovˇ n´roˇn´ mˇˇen´ a jin´ ulohy n´roˇn´ na ˇas. u c e a c a er ı e´ a c e c Dle n´roˇnosti vykon´van´ ulohy a mnoˇstv´ spouˇtˇn´ch vl´ken lze dos´hnout a c a e ´ z ı se y a a periody spouˇtˇn´ v ˇ´du mikrosekund. s e ı ra V´hodou RT-Linuxu je, ˇe rozˇiˇuje moˇnosti pouˇit´ klasick´ho unixov´ho syst´mu y z sr z z ı e e e o hard real-time vlastnosti pˇi zachov´n´ p˚vodn´ funkˇnosti syst´mu. r a ı u ı c e 7
  • 15.
    RT-LINUX Princip ˇinnosti RT-Linuxu c 2.1.3 Princip ˇinnosti c Vlastn´ syst´m je implementov´n jednak jako patch1 klasick´ho Linuxov´ho j´dra, kter´ ı e a e e a y s’ zajiˇt uje obsluhu pˇeruˇen´ pˇed vlastn´ Linuxov´m kernelem. Druh´ ˇ´st jsou dy- r s ı r ım y a ca e e ı s’ ı namicky nahr´van´ moduly, kter´ po sv´m zaveden´ zajiˇt uj´ vlastn´ hard real-time a e ı funkcionalitu (pl´nov´n´ proces˚, poskytnut´ synchronizaˇn´ primitiv, moˇnosti ko- a a ı u ı c ıch z munikace s user-space ˇ´st´ linuxu atd.). ca ı Jak vlastn´ RT-Linuxov´ syst´m funguje je dobˇe patrn´ z obr.2.1. ı y e r e Obr´zek 2.1: Blokov´ schema funcionality RT-Linuxov´ extenze. a e e Cel´ syst´m funguje n´sledovnˇ: y e a e • Po zaveden´ RT-Linuxov´ch modul˚ jsou vˇechna pˇeruˇen´ odchyt´v´na RT- ı y u s r s ı a a Linuxem. • Pokud je vyvol´no pˇeruˇen´ je zpracov´no RT-Linuxem, v pˇ´ e, ˇe je pˇeruˇen´ a r s ı, a rıpadˇ z r s ı vyuˇ´ ano nˇkterou real-time ulohou, je vyvol´n handler pˇeruˇen´ t´to ulohy. zıv´ e ´ a r s ı e ´ 1 Patchem je obvykle naz´v´na soubor, obsahuj´ ı upravu ˇi oprava zdrojov´ho k´du nˇjak´ho y a ıc´ ´ c e o e e programu. Aplikac´ patche na zdrojov´ soubory p˚vodn´ programu je pak z´ ana nov´, upraven´ ı e u ıho ısk´ a a verze. 8
  • 16.
    RT-LINUX RT-Linux a C++ • Pokud existuj´ napl´novan´ real-time ulohy ˇekaj´ ı na voln´ ˇas procesoru, pak ı a e ´ c ıc´ yc jsou spuˇtˇny (v z´vislosti na prioritˇ). se a e • Pokud nen´ ve frontˇ ˇ´dn´ real-time uloha a procesor je voln´, je pˇed´no ˇ´ ı ı e za a ´ y r a rızen´ p˚vodn´ u ımu linuxov´mu j´dru. e a • P˚vodn´ linuxov´ j´dro vyuˇ´ a pˇeruˇen´ kter´ jsou emulov´na RT-Linuxem2 . u ı e a zıv´ r s ı, a a 2.1.4 Vyuˇit´ matematick´ho koprocesoru z ı e V pˇ´ e, ˇe real-time vl´kno chce vyuˇ´ rıpadˇ z a zıvat matematick´ koprocesor (d´le jen FPU), y a 3 je nutno tuto skuteˇnost ozn´mit pl´novaˇi proces˚ . Pl´novaˇ n´slednˇ zajist´ pˇi c a a c u a c a e ı r pˇep´ an´ takov´ho vl´kna uloˇen´ stavu registr˚ FPU a jejich pˇ´ r ın´ ı e a z ı u rıpadn´ obnoven´ ve e ı chv´ kdy vl´kno pokraˇuje ve sv´m bˇhu. ıli, a c e e Pokud pl´novaˇ proces˚ nen´ informov´n, ˇe vl´kno vyuˇ´ a FPU m˚ˇe doch´zet a c u ı a z a zıv´ uz a k navracen´ chybn´ch v´sledk˚ v´poˇtu. K tomu m˚ˇe doj´ z n´sleduj´ ıch d˚vod˚: ı y y u y c uz ıt a ıc´ u u 1. FPU v jeden okamˇik vyuˇ´ a program z user-space a z´roveˇ real-time vl´kno. z zıv´ a n a 2. FPU v jeden okamˇik vyuˇ´ ı alespoˇ dvˇ real-time vl´kna. z zıvaj´ n e a 3. FPU je v jeden okamˇik poˇadov´no nˇkolika real-time vl´kny i programy z user- z z a e a space. 2.2 RT-Linux a C++ V RT-Linuxu je moˇno vyuˇ´ z zıvat programovac´ jazyka C++ pro tvorbu real-time ıho vl´ken. Pouˇit´ vˇak m´ jist´ omezen´ kter´ vypl´vaj´ jiˇ pˇ´ a z ı s a a ı, a y ı z rımo z principu, jak´my syst´m funguje. e N´sleduj´ ı ˇ´sti se postupnˇ zab´vaj´ jednotliv´mi konstrukcemi jazyka C++ a je- a ıc´ ca e y ı y jich pouˇit´ v RT-Linuxu. C´ z ım ˇ ast 2.2.1 diskutuje pouˇit´ dynamick´ alokace pamˇti, z ı e e ˇ´st 2.2.2 kr´tce diskutuje pouˇit´ exceptions4 a ˇ´st 2.2.3 diskutuje pouˇit´ tem- ca a z ı ca z ı plates(ˇablon). s 2.2.1 Dynamick´ alokace pamˇti a e Probl´m pouˇit´ dynamick´ alokace pamˇti lze rozdˇlit na ˇ´st, kter´ se t´k´ alokov´n´ e z ı e e e ca a y a a ı pamˇti bˇhem inicializace real-time modulu a problematiku dynmick´ alokace pamˇti e e e e bˇhem vlastn´ bˇhu real-time procesu (tj. alokace pamˇti pˇ´ z bˇˇ´ ıho RT vl´kna). e ıho e e rımo ezıc´ a 2 V podstatˇ lze ˇinnost p˚vodn´ linuxov´ho j´dra pˇirovnat ke zvl´ˇtn´ e c u ıho e a r as ımu real-time vl´knu RT- a Linuxu, bˇˇ´ ımu s nejniˇˇ´ real-time prioritou. ezıc´ zsı 3 To je moˇn´ zajistit bud’ informac´ pˇi zakl´d´n´ real-time vl´kna nebo nastaven´ stejn´ho z e ı r a a ı a ım e parametru za bˇhu real-time vl´kna. e a 4 Tj. vyj´ ımek pro oˇetˇen´ chybov´ch stav˚ pˇi bˇhu programu s r ı y u r e 9
  • 17.
    RT-LINUX RT-Linux a C++ Oba tyto probl´my lze ˇeˇit za pomoci pˇet´zen´ C++ oper´toru new a delete, e r s r ıˇ ı a pˇ´ rıpadnˇ oper´tor˚ new[] a delete[] pro alokace a uvolˇov´n´ pamˇti dynamick´ch pol´ e a u n a ı e y ı. V pˇ´ e, ˇe potˇebujeme dynamicky alokovat pamˇt e rıpadˇ z r e ’ bˇhem inicializace, pˇ´ rıpadnˇe deinicializace modulu, staˇ´ pˇet´zit standardn´ C++ oper´tory uveden´ v´ˇe na vol´n´ cı r ıˇ ı a e ys a ı linuxov´ho j´dra kalloc(), pˇ´ e a rıpadnˇ kfree(). Toto pˇet´zen´ je jiˇ standardnˇ provedeno e r ıˇ ı z e v souboru rtl cpp.h, kter´ je souˇ´st´ distribuce RT-Linux. y ca ı z r e’ Za pˇedpokladu, ˇe je tˇeba dynamicky alokovat pamˇt za bˇhu real-time vl´kna, r e a je tˇeba si vytvoˇit vlastn´ spr´vu dynamick´ pamˇti. D˚vodem je zejm´na moˇnost r r ı a e e u e z vzniku kolize pˇi vol´n´ standardn´ syst´mov´ch vol´n´ r a ı ıch e y a ı. Vlastn´ dynamick´ spr´va pamˇti by mˇla fungovat n´sleduj´ ım zp˚sobem: ı a a e e a ıc´ u z e’ 1. V okamˇiku inicializace RT modulu naalokuje pamˇt z oblasti j´dra pomoc´ vol´n´ a ı a ı kmalloc(). Velikost takto alokovan´ pamˇti by mˇla odpov´ e e e ıdat alespoˇ maxim´ln´ n a ı potˇebn´ velikosti pamˇti, kterou budeme cht´ dynamicky alokovat. Bloky t´to r e e ıt e pamˇti mus´ b´t alokov´n ve fyzick´ pamˇti poˇ´ ce. e ı y a e e cıtaˇ r ıˇı a s ’ ıc´ 2. Pˇet´z´ oper´tory new, new[], delete, delete[] tak, aby volaly funkce zajiˇt uj´ ı a e’ e alokaci a dealokaci pamˇti v r´mci pamˇt ov´ho bloku naalokovan´ho bˇhem e e e zav´dˇn´ RT modulu (viz. krok 1). a e ı e ı e’ e 3. Bˇhem deaktivace modulu provede uvolnˇn´ pamˇt ov´ho bloku, kter´ byl z´ an e y ısk´ e ’ov´ oblasti linuxov´ho j´dra v okamˇiku zaveden´ modulu do pamˇti. z pamˇt e e a z ı e 2.2.2 Oˇetˇen´ chyb - exceptions s r ı Vyj´ e z e’ e ımky, nebo tak´ exceptions, nelze bohuˇel v pamˇt ov´m prostoru linuxov´ho j´dra e a a tedy ani v oblasti, kter´ je vyuˇ´ ana RT rozˇ´ren´ vyuˇ´ Hlavn´ d˚vodem je, a zıv´ sıˇ ım zıt. ım u ˇe linker optimalizuje k´d pro vol´n´ vyj´ z o a ı ımek. Proto by bˇhem linkov´n´ modulu j´dra e a ı a musely b´t zn´my vˇechny moduly, kter´ se budou v pamˇti nach´zet. y a s e e a Dalˇ´ d˚vodem je, ˇe linuxov´ j´dro je ps´na ˇistˇ v jazyce C a jiˇ bˇhem jeho sım u z e a a c e z e kompilace jsou vyj´ımky zak´zany pomoc´ parametru pˇekladaˇe. a ı r c 2.2.3 Pouˇit´ C++ templates z ı ıˇı zıt, ’ e Templates jako vlastnost jazyka C++ lze bez obt´z´ vyuˇ´ nebot bˇhem kompilace je takov´ k´d nahrazen skuteˇn´m datov´m typem vˇetnˇ vˇech kontrol bˇhem kompi- y o c y y c e s e lace. Bohuˇel nelze jednoduˇe vyuˇ´ tˇ´ implementovan´ch v knihovnˇ STL5 . D˚vodem z s zıt rıd y e u jsou dynamick´ alokace pamˇti, kter´ jsou v tˇchto tˇ´ ach vyuˇ´ e e e e rıd´ zıvany. Omezen´ z toho ı plynouc´ jsou uvedena v ˇ´sti 2.2.1. Urˇitou moˇnost´ jak t´to knihovny vyuˇ´ by ı ca c z ı, e zıt zˇejmˇ byla vlastn´ rekompilace ze zdrojov´ch k´d˚ se spr´vnˇ pˇet´zen´mi oper´tory r e ı y o u a e r ıˇ y a pro spr´vu pamˇti. a e 5 Standard Template Library. 10
  • 18.
    Kapitola 3 Lexik´ln´ anal´zazdrojov´ho k´du a ı y e o V t´to ˇ´sti se budeme zab´vat vlastn´ zpracov´n´ zdrojov´ho k´du v jazyce IL, e ca y ım a ım e o tedy vytvoˇen´ kompil´toru (pˇekladaˇe). Dle [7] lze pˇekladaˇ reprezentovat pomoc´ r ım a r c r c ı koneˇn´ho stavov´ho automatu. V UNIXov´ch syst´mech jsou k dispozici programy c e e y e LEX a YACC, kter´ umoˇnuj´ takov´ stavov´ automat pro zpracov´n´ zdrojov´ho e zˇ ı y y a ı e k´du vytvoˇit na z´kladˇ z´pisu pravidel v pˇ´ sn´m tvaru. C´ o r a e a rısluˇ e ˇ ast 3.1 t´to kapitoly se e zab´v´ popisem programu LEX, kter´ se vyuˇ´ a pro vytvoˇen´ lexik´ln´ analyzeru y a y zıv´ r ı a ıho ˇa (viz. obr.3.1). C´st 3.2 se zab´v´ popisem jazyka pomoc´ pravidel zadan´ch programu y a ı y YACC (na obr.3.1 to odpov´ a syntaktick´mu analyzeru). C´ ıd´ e ˇ ast 3.3 popisuje princip, jak´m oba v´ˇe uveden´ programy spolupracuj´ pˇi tvorbˇ pˇekladaˇe. y ys e ı r e r c Obr´zek 3.1: Kompilaˇn´ sekvence. a c ı 11
  • 19.
    LEXIKALN´ ANALYZA ZDROJOVEHOKODU ´ I ´ ´ ´ Lexik´ln´ anal´za zdrojov´ho k´du a ı y e o 3.1 Lexik´ln´ anal´za zdrojov´ho k´du a ı y e o Pro lexik´ln´ anal´zu zdrojov´ho k´du bude vyuˇit program LEX. Informace, kter´ jsou a ı y e o z e uvedeny v t´to ˇ´sti jsou ˇerp´ny z [8] a [4]. Program LEX slouˇ´ k vytvoˇen´ parseru e ca c a zı r ı zdrojov´ho k´du a pˇevodu kl´cov´ch slov na tzv. tokeny. Z´roveˇ umoˇnuje vytvoˇit e o r ıˇ y a n zˇ r stavov´ automat definuj´ ı moˇnou n´slednost r˚zn´ch kl´cov´ch slov ve zdrojov´m y ıc´ z a u y ıˇ y e k´du. o Vytvoˇen´ stavov´ automat m˚ˇe pracovat dvˇma zp˚soby: r y y uz e u 1. Stavov´ automat pˇi pˇechodu do dalˇ´ stavu pˇedchoz´ stav zapomene. y r r sıho r ı 2. Stavov´ automat ukl´d´ stavy na z´sobn´ Zmˇna stavu je moˇn´ dvˇma smˇry: y a a a ık. e z a e e • Pˇechod do nov´ho stavu, p˚vodn´ stav je uloˇen na z´sobn´ r e u ı z a ık. • Z aktu´ln´ stavu se pˇech´z´ do stavu uloˇen´ho na z´sobn´ a ıho r a ı z e a ıku, aktu´ln´ a ı stav je zapomenut. 3.1.1 Struktura zdrojov´ho k´du pro LEX e o Vstupn´ soubor pro LEX je rozdˇlen do tˇech ˇ´st´ tak, jak je patrno z uk´zky 3.1. ı e r ca ı a Jednotliv´ ˇ´sti jsou od sebe oddˇleny pomoc´ znaˇek %%. e ca e ı c ... definice maker a vlastnost´ analyz´toru ... ı a %% ... definice pravidel ... %% ... funkce v jazyce C/C++ ... Uk´zka 3.1: Struktura vstupn´ souboru pro LEX. a ıho Prvn´ ˇ´st obsahuje makra pro zjednoduˇen´ definiˇn´ regul´rn´ v´raz˚ pro vyh- ı ca s ı c ıch a ıch y u led´v´n´ kl´cov´ch slov, parametry parseru a pˇ´ a a ı ıˇ y rıpadnˇ zdrojov´ k´d v jazyce C/C++. e y o V tab.3.1 je uveden pˇehled kl´cov´ch slov, kter´ mohou b´t v prvn´ ˇ´sti obsaˇeny. r ıˇ y e y ı ca z Druh´ ˇ´st vstupn´ souboru obsahuje pravidla ve tvaru regul´rn´ v´raz˚ pro a ca ıho a ıch y u zpracov´n´ zdrojov´ho k´du a definici akc´ v jazyce C/C++, kter´ pravidlu odpov´ ı. a ı e o ı e ıdaj´ Pravidlo m˚ˇe b´t aktivn´ pouze v definovan´ch stavech, akce m˚ˇe obsahovat pˇechod uz y ı y uz r do stavu nov´ho nebo do stavu uloˇen´ho na z´sobn´ e z e a ıku. Struktura pravidel je patrn´a z uk´zky 3.2. a Prvn´ ˇ´st pravidla je nepovinn´ a definuje stavy, ve kter´ch je pravidlo platn´, ı ca a y e pˇ´ rıpadnˇ stavy, ve kter´ch platn´ nen´ Zde z´leˇ´ na tom, jak je definov´n stav v prvn´ e y e ı. a zı a ı ˇ´sti vstupn´ souboru. ca ıho 12
  • 20.
    LEXIKALN´ ANALYZA ZDROJOVEHOKODU ´ I ´ ´ ´ Lexik´ln´ anal´za zdrojov´ho k´du a ı y e o Definice Popis N´zev reg. v´raz a y Pˇeddefinovan´ regul´rn´ v´razy, kter´ lze r e a ı y e pouˇ´ d´le pro zjednoduˇen´ definiˇn´ zıt a s ı c ıch pravidel pro vyhled´v´n´ token˚ ve zdro- a a ı u jov´m k´du. e o %s Definice stav˚, ve kter´ch se m˚ˇe nach´zet u y uz a vygenerovan´ stavov´ automat. Na jednom y y ˇ´dku se m˚ˇe nach´zet deklarace v´ stav˚ ra uz a ıce u jejichˇ jm´na jsou oddˇlena mezerou. z e e %{ ... %} Ohraniˇen´ zdrojov´ho k´du v jazyce c ı e o C/C++, kter´ bude vloˇen tak, jak je y z naps´n, na zaˇ´tek vygenerovan´ho zdro- a ca e jov´ho k´du parseru. e o %option ... Parametry vygenerovan´ho parseru, pokud e obsahuje kl´cov´ slovo stack, jsou stavy ıˇ e parseru ukl´d´ny na z´sobn´ a a a ık. Tabulka 3.1: Pˇehled kl´cov´ch slov pouˇiteln´ch v prvn´ ˇ´sti definiˇn´ souboru pro r ıˇ y z y ı ca c ıho LEX. [<stav1[,stav2[,...]]>]reg.v´raz { y akce v jazyce C; } Uk´zka 3.2: Struktura pravidel pro anal´zu zdrojov´ho k´du. a y e o Druh´ ˇ´st je regul´rn´ v´raz, kter´ definuje, jak dan´ kl´cov´ slovo, konstanta a ca a ı y y e ıˇ e ˇi jin´ souˇ´st zdrojov´ho k´du je zaps´na. Z´kladn´ struktura regul´rn´ v´raz˚ je c a ca e o a a ı a ıch y u pops´na v tab. 3.2, podrobnˇjˇ´ informace o regul´rn´ v´razech lze z´ a e sı a ıch y ıskat napˇ. v [6]. r V pˇ´ e, ˇe zdrojov´ text obsahuje ˇ´st, kter´ odpov´ a pˇ´ sn´mu regul´rn´ rıpadˇ z y ca a ıd´ rısluˇ e a ımu v´razu, je tento text uloˇen do promˇnn´ YYTEXT a lze ho pouˇ´ v ˇ´sti pro z´pis y z e e zıt ca a pˇ´ sn´ akce, kter´ se vyvol´ pro dan´ v´raz. rısluˇ e a a y y V ˇ´sti pro z´pis akce lze zapsat libovolnou akci nebo nepsat nic, pokud se m´ vˇe, ca a a s co odpov´ a dan´mu regul´rn´ v´razu ignorovat. V pˇ´ e, ˇe chceme spolupracovat ıd´ e a ımu y rıpadˇ z s programem YACC, m˚ˇe akce vypadat napˇ. jako v uk´zce 3.3. uz r a Uk´zka 3.4 uv´d´ cel´ vstupn´ soubor pro LEX obsahuj´ ı konkr´tn´ pravidlo, vˇetnˇ a a ı y ı ıc´ e ı c e akce v jazyce C. Pravidlo detekuje token jako celoˇ´ cıselnou konstantu ve zdrojov´m e k´du, pokud se stavov´ automat nach´z´ ve stavu any value. o y a ı 13
  • 21.
    LEXIKALN´ ANALYZA ZDROJOVEHOKODU ´ I ´ ´ ´ Lexik´ln´ anal´za zdrojov´ho k´du a ı y e o Regul´rn´ v´raz a ı y Popis LD Regul´rn´ v´raz je slovo LD. a ı y ˆLD Regul´rn´ v´raz je slovo LD na zaˇ´tku a ı y ca ˇ´dku. ra LD$ Regul´rn´ v´raz je slovo LD na konci ˇ´dku. a ı y ra LD/([ ]+) Regul´rn´ v´raz je slovo LD n´sledovan´ li- a ı y a e bovoln´m poˇtem mezer nebo tabul´tor˚, y c a u ˇ´st za znakem / nen´ uloˇena v promˇnn´ ca ı z e e YYTEXT a je ponech´na v bufferu pro dalˇ´ a sı zpracov´n´ a ı. ([0-9]+) Regul´rn´ v´raz je ˇ´ skl´daj´ ı se z libo- a ı y cıslo a ıc´ voln´ho poˇtu ˇ´ e c cıslic. {SPACE} Regul´rn´ v´raz odpov´ a definici z prvn´ a ı y ıd´ ıho bloku zdrojov´ho souboru s n´zvem SPACE. e a Tabulka 3.2: Struktura regul´rn´ v´raz˚ v definici pravidel pro LEX. a ıch y u // pokud se pr´vˇ nach´z´m ve stavu var_declaration a e a ı if (YY_START == var_declaration) { // vyzvedni aktu´ln´ stav ze z´sobn´ku (dojde k pˇesunu a ı a ı r // do stavu pˇedchoz´ho) r ı yy_pop_state(); // a uloˇ na z´sobn´k stav var_data_type z a ı yy_push_state(var_data_type); // uloˇ hodnotu nalezen´ho regul´rn´ho v´razu do promˇnn´ z e a ı y e e // pro YACC yylval.string = strdup(yytext); ’ // a vrat informaci, ˇe jsi nalezl datov´ typ z y // promˇnn´ e e return TOK_VAR_DATATYPE; } // nejsem v bloku deklarac´ promˇnn´ch, ı e y // ale oˇek´v´m deklaraci datov´ho typu c a a e // funkce yylval.string = strdup(yytext); return TOK_FUNCTION_DATATYPE; } Uk´zka 3.3: Z´pis akce pro nalezen´ regul´rn´ v´raz ze zdrojov´ho k´du. a a y a ı y e o 14
  • 22.
    LEXIKALN´ ANALYZA ZDROJOVEHOKODU ´ I ´ ´ ´ Popis gramatiky jazyka %{ #include <stdio.h> // odkaz na poˇ´tadlo ˇ´dk˚ cı ra u extern int iLineCount; %} // pouˇij z´sobn´k pˇi zmˇnˇ stavu z a ı r e e %option stack // definice povolen´ch stav˚ y u %s var_init %% // pokud jsi ve stavu, kdy je oˇek´v´na inicializace c a a // promˇnn´, povol detekci cel´ho ˇ´sla. e e e cı <var_init>[-+]?([0-9]+) { ’ yylval.number = atoi(yytext); // hodnotu vrat jako ˇ´slo cı return VAL_INTEGER; } // pokud jde o konec ˇ´dku, zvyˇ poˇ´tadlo a jinak ra s cı // nic nedˇlej e n ++iLineCount; %% Uk´zka 3.4: Uk´zka definice pravidla pro program LEX. a a 3.2 Popis gramatiky jazyka Pro popis gramatiky jazyka lze vyuˇ´ syst´m YACC, kter´ umoˇnuje ve spolupr´ci zıt e y zˇ a s programem LEX definovat velmi jednoduˇe pravidla , jak dan´ programovac´ jazyk s y ı vypad´, tj. jak´ umoˇnuje vytv´ˇet program´torsk´ konstrukce a z´pisy. a e zˇ ar a e a Informace zde uveden´ jsou ˇerp´ny z [8] a [4]. e c a 3.2.1 Struktura zdrojov´ho souboru pro YACC e Struktura zdrojov´ho souboru pro syst´m YACC je opˇt rozdˇlena do tˇech ˇ´st´ tak, e e e e r ca ı jak je patrno z obr´zku 3.5. Jednotliv´ ˇ´sti jsou od sebe oddˇleny pomoc´ znaˇek %%. a e ca e ı c Prvn´ ˇ´st obsahuje definici token˚ pro vyhled´v´n´ (z tˇchto definic jsou pot´ ı ca u a a ı e e vygenerov´ny unik´tn´ identifik´tory jejichˇ symbolick´ n´zvy odpov´ ı n´zv˚m to- a a ı a z e a ıdaj´ a u ken˚), prioritu oper´tor˚ apod. V tab.3.3 je uveden pˇehled z´kladn´ pˇ´ u, kter´ u a u r a ıch rıkaz˚ e mohou b´t v t´to ˇ´sti obsaˇeny. y e ca z ˇ ast pro definici pravidel obsahuje jiˇ pˇ´ C´ z rımo jednotliv´ pravidla, kter´ odpov´ ı a a ıdaj´ konstrukc´ kter´ lze v jazyce vytvoˇit. Kaˇd´ takov´ pravidlo m´ strukturu dle ım, e r z e e a obr.3.6. V´znam jednotliv´ch prvk˚ je n´sleduj´ ı: y y u a ıc´ | Definuje, ˇe n´sleduj´ ı ˇ´st pravidla je nepovinn´. z a ıc´ ca a 15
  • 23.
    LEXIKALN´ ANALYZA ZDROJOVEHOKODU ´ I ´ ´ ´ Popis gramatiky jazyka ... definice ... %% ... definice pravidel pro gramatiku jazyka ... %% ... funkce v jazyce C ... Uk´zka 3.5: Struktura vstupn´ souboru pro program YACC. a ıho Definice Popis %token jm´no e Definice tokenu s n´zvem jm´no a e %{...%} Blok obsahuj´ ı k´d v jazyce C/C++, kter´ ıc´ o y bude po zpracov´n´ vloˇen na zaˇ´tek vygen- a ı z ca erovan´ho k´du. e o %union{int iData;char *pData;} N´vratov´ hodnota yylval je typu union a je a a urˇena nˇkter´m datov´m typem uveden´m c e y y y v unionu. %token <iData> TOK INTEGER Definuje token s datov´m typem iData (dle y definice v unionu). %left ’,’ Definice priority oper´toru. a %right ’,’ Definice priority oper´toru. a Tabulka 3.3: Z´kladn´ pˇ´ a ı rıkazy pouˇiteln´ v bloku definic vstupn´ souboru pro YACC. z e ıho nazev: [|] nazev2 [{ ... programov´ k´d v jazyce C/C++ ... y o }] [[|] nazev3] ; Uk´zka 3.6: Struktura pravidel pro definici jazyka v programu YACC. a nazev N´zev pravidla (bez diakritiky) oddˇlen´ dvojteˇkou od jeho definice. a e y c nazev2 N´zev tokenu definovan´ho v ˇ´sti definic na zaˇ´stku vstupn´ souboru pro a e ca ca ıho 16
  • 24.
    LEXIKALN´ ANALYZA ZDROJOVEHOKODU ´ I ´ ´ ´ Princip spolupr´ce program˚ LEX a YACC a u YACC nebo n´zev jin´ho pravidla. Pro vytv´ˇen´ rekurzivn´ pravidel m˚ˇe b´t a e ar ı ıch uz y stejn´ i jako nazev. y { ... } Ohraniˇuje blok obsahuj´ ı k´d v jazyce C/C++, kter´ bude vykon´n v pˇ´ e, c ıc´ o y a rıpadˇ ˇe pravidlo bude obsaˇeno ve vstupn´ zdrojov´m souboru. z z ım e ; Oznaˇen´ konce bloku, kter´ definuje pravidlo nazev. c ı y Programov´ k´d v jazyce C/C++ definuje akce, kter´ budou pˇi aplikaci pravidla y o e r vyvol´ny. V pˇ´ e, ˇe nalezen´ token m´ definov´n datov´ typ, lze k hodnotˇ pˇedan´ a rıpadˇ z y a a y e r e z programu LEX pˇistupovat pomoc´ konstrukce $x, kde x je ˇ´ definuj´ ı poˇad´ r ı cıslo ıc´ r ı tokenu v definici pravidla. V pˇ´ e pravidla z obr.3.6 by pro token nazev2 s defi- rıpadˇ novan´m typem odpov´ y ıdala hodnota $1. Do ˇ´ cıslov´n´ poˇad´ se zahrnuj´ i programov´ a ı r ı ı e bloky uzavˇen´ mezi {}. r e Na obr.3.7 je uvedena kr´tk´ komentovan´ uk´zka definice nˇkolika jednoduch´ch a a a a e y pravidel. 3.3 Princip spolupr´ce program˚ LEX a YACC a u Tato ˇ´st popisuje spolupr´ci program˚ LEX a YACC pˇi vytv´ˇen´ pˇekladaˇe navrˇen´ho ca a u r ar ı r c z e jazyka. Princip ˇinnosti je vysvˇtlen na obr.3.2 pomoc´ vytv´ˇen´ho softwarov´ho PLC c e ı ar e e (v´sledkem bude program plc2cpp, kter´ bude pˇev´dˇt k´d ve zvolen´m jazyce pro y y r a e o e PLC do jazyka C/C++). Princip spolupr´ce obou program˚ lze popsat n´sledovnˇ: a u a e 1. Nejprve vytvoˇ´ rıme lexik´ln´ analyzer pomoc´ programu LEX, kter´ vyhled´ ve a ı ı y a zdrojov´m textu tzv. tokeny (tj. definovan´ kl´cov´ slova). e a ıˇ a 2. N´slednˇ definujeme pomoc´ programu YACC syntaxi navrˇen´ho jazyka (tj. a e ı z e moˇn´ kombinace vyhledan´ch token˚). z e y u 3. Zkompilujeme vstupn´ soubor pro program YACC. V´sledkem je hlaviˇkov´ sou- ı y c y bor y.tab.h, kter´ definuje pro jednotliv´ n´zvy token˚ ˇ´ y e a u cıseln´ hodnoty (makra) e v jazyce C/C++ a soubor y.tab.c, kter´ obsahuje vlastn´ syntaktick´ analyz´tor y ı y a jazyka. 4. Zkompilujeme vstupn´ soubor pro program LEX. Ten ve vygenerovan´m k´du ı e o vyuˇ´ a soubor y.tab.h vygenerovan´ v pˇedchoz´ kroku. V´sledkem je soubor zıv´ y r ım y lex.yy.c, kter´ obsahuje lexik´ln´ analyzer v jazyce C/C++. y a ı 5. Zkompilov´n´ soubor˚ vygenerovan´ch v pˇedchoz´ krok˚ spolu s dalˇ´ a ım u y r ıch u sımi podp˚rn´mi ˇ´stmi z´ ame poˇadovan´ kompil´tor. V naˇem pˇ´ e plc2cpp. u y ca ısk´ z y a s rıpadˇ 6. Zkompilovan´ program z pˇedchoz´ krok˚ je jiˇ vytv´ˇen´m kompil´torem, y r ıch u z ar y a kter´ lze vyuˇ´ ke kompilaci zdrojov´ho k´du ve vytv´ˇen´m jazyce. V naˇem y zıt e o ar e s pˇ´ e tedy zdrojov´ k´d v implementovan´m programovac´ jazykem pro PLC. rıpadˇ y o y ım 17
  • 25.
    LEXIKALN´ ANALYZA ZDROJOVEHOKODU ´ I ´ ´ ´ Princip spolupr´ce program˚ LEX a YACC a u // Definuj token pro pˇiˇazen´ hodnoty r r ı %token TOK_SET // Pˇiˇazovan´ hodnota je bud’ cel´ ˇ´slo r r a e cı // nebo nulou ukonˇen´ ˇetˇzec c y r e %union { int number; char *string; } // Definuj token s urˇen´m datov´m typem pro n´vrat c y y a // celoˇ´seln´ hodnoty cı e %token <number> VAL_INT // Definuj token s urˇen´m datov´m typem pro n´vrat c y y a // nulou ukonˇen´ho ˇetˇzce c e r e %token <string> VAL_STR %% // Definuj z´kladn´ pravidlo pro detekci jednotliv´ch a ı y // blok˚ ve vstupn´m souboru. u ı blocks: // ˇ´dn´ z n´sleduj´c´ch blok˚ v pravidle nen´ povinn´ Za y a ı ı u ı y | // Po nalezen´ bloku pro pˇiˇazen´ cel´ho ˇ´sla m˚ˇe n´sledovat ı r r ı e cı uz a // dalˇ´ vstupn´ blok (rekurze)) sı ı set_int blocks | // Po prvn´m bloku pˇiˇazuj´c´m ˇetˇzec jiˇ nen´sleduje ı r r ı ı r e z a // ˇadn´ dalˇ´ blok z´ y sı set_string ; set_int: TOK_SET VAL_INT { printf("ˇ´seln´ hodnota: %d", $1); Cı a } ; set_string: TOK_SET VAL_STR { printf("ˇetˇzcov´ hodnota: %s", $1); R e a } ; %% Uk´zka 3.7: Uk´zka definice pravidla ve zdrojov´m k´du pro YACC. a a e o 18
  • 26.
    LEXIKALN´ ANALYZA ZDROJOVEHOKODU ´ I ´ ´ ´ Princip spolupr´ce program˚ LEX a YACC a u Obr´zek 3.2: Princip tvorby a funkce pˇekladaˇe jazyka definovan´ho pomoc´ program˚ a r c e ı u LEX a YACC. Zde uveden´ vlastnosti a konstrukce obsahuj´ pouze malou ˇ´st moˇnost´ kter´ pro- e ı ca z ı, e gramy YACC a LEX nab´ ı. V podstatˇ shrnuje vlastnosti vyuˇit´ bˇhem konstrukce ızej´ e z e e softwarov´ho PLC. Podrobnˇjˇ´ informace lze nal´zt v uveden´ literatuˇe. e e sı e e r 19
  • 27.
    Kapitola 4 Zpracov´n´ promˇnn´chPLC a ı e y programu Tato ˇ´st se zab´v´ zpracov´n´ promˇnn´ch a parametr˚ funkc´ funkˇn´ blok˚ a ca y a a ım e y u ı, c ıch u u ˇa programov´ch blok˚. C´st 4.1 nastiˇuje princip zpracov´n´ promˇnn´ch v programu, y n a ı e y ˇ´st 4.2 se zab´v´ deklarac´ jednotliv´ch promˇnn´ch, ˇ´st 4.3 rozeb´ a jednotliv´ ca y a ı y e y ca ır´ e moˇn´ bloky promˇnn´ch a ˇ´st 4.4 uv´d´ z´kladn´ principy t´kaj´ ı se implementace z e e y ca a ı a ı y ıc´ a zpracov´n´ promˇnn´ch v softwarov´m PLC. a ı e y e 4.1 Princip zpracov´n´ promˇnn´ch a ı e y Promˇnn´ v PLC programu se zapisuj´ v r´mci blok˚ promˇnn´ch. Kaˇd´ blok promˇnn´ch e e ı a u e y z y e y m´ jin´ v´znam a ve sv´m tˇle obsahuje deklaraci jedn´ nebo v´ promˇnn´ch tak, jak a y y e e e ıce e y je patrno z uk´zky 4.1. V´znamem jednotliv´ch blok˚ promˇnn´ch se zab´vaj´ dalˇ´ a y y u e y y ı sı ˇ´sti t´to kapitoly. ca e Princip zpracov´n´ promˇnn´ch v r´mci PLC programu prob´ a n´sleduj´ ım zp˚sobem: a ı e y a ıh´ a ıc´ u 1. Detekuj blok deklaruj´ ı promˇnn´ (viz. ˇ´st 4.2). ıc´ e e ca 2. Najdi deklaraci promˇnn´ a ukl´dej jej´ parametry do kontejneru CContainer- e e a ı Variable: (a) Separuj n´zev promˇnn´, pˇeved’ ho na mal´ p´ a e e r a ısmena a vloˇ do kontejneru. z (b) Detekuj, zda deklarace promˇnn´ obsahuje specifikaci adresy, pokud ano, e e uloˇ adresu v kontejneru. z (c) Identifikuj datov´ typ promˇnn´, pokud se jedn´ o funkˇn´ blok, sdˇl kon- y e e a c ı e tejneru poˇadavek na vloˇen´ hlaviˇkov´ho souboru s pˇ´ sn´m funkˇn´ z z ı c e rısluˇ y c ım blokem. (d) Pokud se jedn´ o standardn´ datov´ typ, detekuj pˇ´ a ı y rıpadnou deklaraci inicial- izaˇn´ hodnoty. V pˇ´ e, ˇe je promˇnn´ inicializov´na, uloˇ inicializaˇn´ c ı rıpadˇ z e a a z c ı hodnotu do kontejneru. 20
  • 28.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Deklarace promˇnn´ch e y 3. Existuje-li deklarace dalˇ´ promˇnn´, opakuj vˇe od bodu 2. sı e e s 4. Detekuj konec bloku promˇnn´ch, uzavˇi kontejner promˇnn´ch a pˇidej ho do e y r e y r kontejneru obsahuj´ ıho jednotliv´ kontejnery promˇnn´ch platn´ch v aktu´ln´ ıc´ e e y y a ım programov´m bloku. e 4.2 Deklarace promˇnn´ch e y Jednotliv´ promˇnn´ se deklaruj´ v nˇkolika typech blok˚ s r˚zn´m v´znamem. Jed- e e e ı e u u y y notliv´ druhy blok˚ promˇnn´ch jsou povoleny v r˚zn´ch kontextech PLC k´du. Promˇnn´ e u e y u y o e e se zapisuj´ zp˚sobem uveden´m v uk´zce 4.1. ı u y a ... Zaˇ´tek bloku promˇnn´ch ca e y ... typ [AT adresa]: N´zev promˇnn´ [:= hodnota]; a e e ... Konec bloku promˇnn´ch e y ... Uk´zka 4.1: Deklarace promˇnn´ a e e Kaˇd´ promˇnn´ mus´ obsahovat datov´ typ a n´zev. Pokud je datov´ typ promˇnn´ z a e a ı y a y e e 1 jeden ze z´kladn´ datov´ch typ˚ uveden´ch v tab.4.1 , m˚ˇe deklarace promˇnn´ ob- a ıch y u y uz e e sahovat jeˇtˇ kl´cov´ slovo AT n´sledovan´ adresou ve tvaru uveden´m v tab.4.3. D´le s e ıˇ e a e e a v tomto pˇ´ e m˚ˇe deklarace obsahovat inicializaˇn´ hodnotu promˇnn´ oddˇlenou rıpadˇ uz c ı e e e pomoc´ :=. ı Jako datov´ typ m˚ˇe b´t pouˇit tak´ n´zev funkˇn´ bloku, zde je tedy tˇeba y uz y z e a c ıho r tak´ zajistit, aby se vygeneroval ˇ´dek pro proveden´ include pˇ´ sn´ho hlaviˇkov´ho e ra ı rısluˇ e c e souboru obsahuj´ ıho deklaraci funkˇn´ bloku. Cel´ deklarace je ukonˇena pomoc´ ;. ıc´ c ıho a c ı Uk´zka 4.2 uv´d´ pˇ´ a a ı rıklad deklarace nˇkolika promˇnn´ch tak,aby byl patrn´ konkr´tn´ e e y y e ı z´pis promˇnn´ v programu. Pro vˇtˇ´ n´zornost jsou zaps´ny v r´mci bloku lok´ln´ a e e e sı a a a a ıch promˇnn´ch. e y 4.2.1 Pˇ´ e adresy rım´ V tab.4.2 je uvedeno nˇkolik uk´zek pˇ´ ych adres pro PLC. Adresa se vˇdy skl´d´ z e a rım´ z a a a y ıc´ e’ e prefixu, kter´ definuje typ adresy n´sledovan´ prefixem, definuj´ ım velikost pamˇt ov´ho y bloku, kter´mu adresa odpov´ a. e ıd´ 1 V tabulce jsou uvedeny pouze datov´ typy podporovan´ ve vytv´ˇen´m softwarov´m PLC. e e ar e e 21
  • 29.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Deklarace promˇnn´ch e y Datov´ typ y Velikost Pozn´mka a BOOL 1 SINT 8 INT 16 DINT 32 USINT 8 UINT 16 UDINT 32 REAL TIME 64 Dostupn´ pouze jako konstanta urˇuj´ ı pe- y c ıc´ riodu spouˇtˇn´ programu. se ı BYTE 8 WORD 16 DWORD 32 Tabulka 4.1: Pˇehled z´kladn´ datov´ch typ˚ pouˇiteln´ch v PLC. r a ıch y u z y VAR current: DINT; otacky: DINT := 0; rps AT %QB10: DINT := 0; sp AT %IB10: DINT; forward AT %Q0.0: BOOL := FALSE; backward AT %Q0.1: BOOL := FALSE; END_VAR Uk´zka 4.2: Uk´zka deklarace jednotliv´ch promˇnn´ch. a a y e y Adresa Pozn´mka a %QX35, %Q35 V´stupn´ bit 37 y ı %MX3.5 5 bit 3 bytu ve vnitˇn´ pamˇti r ı e %IW23 Vstupn´ slovo 23 ı Tabulka 4.2: Uk´zky z´pisu adres pro PLC. a a y u e’ y Pˇehled jednotliv´ch prefix˚ pro adresaci pamˇt ov´ch m´ PLC je uveden v tab.4.3. r ıst 22
  • 30.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Pˇehled blok˚ pro deklaraci promˇnn´ch r u e y Adresa Pozn´mka a Typ Q Adresa v´stupu y I Adresa vstupu M Adresa ve vnitˇn´ pamˇti r ı e Velikost X Adresa specifikuje jeden bit Nic Adresa specifikuje jeden bit B Adresa specifikuje jeden byte (8bit˚) u W Adresa specifikuje jedno slovo (16bit˚) u D Adresa specifikuje dvojit´ slovo (32bit˚) e u L Adresa specifikuje dlouh´ slovo (64bit˚) e u Tabulka 4.3: Zp˚sob z´pisu pˇ´ ych adres pro PLC. u a rım´ 4.3 Pˇehled blok˚ pro deklaraci promˇnn´ch r u e y N´sleduj´ ı ˇ´st se zab´v´ v´znamem a zp˚sobem z´pisu jednotliv´ch typ˚ blok˚ a ıc´ ca y a y u a y u u promˇnn´ch. Informce zde uveden´ jsou ˇerp´ny z [5]. e y e c a Norma [5] definuje n´sleduj´ ı typy promˇnn´ch: a ıc´ e y • Glob´ln´ promˇnn´ - pouˇ´ ı se pro z´pis promˇnn´ch dostupn´ch v cel´m a ı e e zıvaj´ a e y y e PLC programu. • Lok´ln´ promˇnn´ - pouˇ´ ı se pro deklaraci lok´ln´ promˇnn´ch v r´mci a ı e e zıvaj´ a ıch e y a funkce, funkˇn´ bloku nebo bloku program. c ıho • Extern´ promˇnn´ - pouˇ´ ı se k definici odkazu na glob´ln´ promˇnn´ v ı e e zıvaj´ a ı e e r´mci blok˚ funkce, funkˇn´ blok nebo blok program. a u c ı • Vstupn´ promˇnn´ - pouˇ´ ı se pro deklaraci vstupn´ parametr˚ funkc´ ı e e zıvaj´ ıch u ı, funkˇn´ blok˚ nebo blok˚ typu program. c ıch u u • V´stupn´ promˇnn´ - pouˇ´ ı se pro deklaraci v´stupn´ parametr˚ funkˇn´ y ı e e zıvaj´ y ıch u c ıch blok˚ a blok˚ typu program. u u • Vstupnˇ/v´stupn´ promˇnn´ - zastupuj´ ulohu parametr˚ pˇed´van´ch ref- e y ı e e ı´ u r a y erenc´ v r´mci blok˚ program a funkˇn´ blok˚. ı a u c ıch u 4.3.1 Glob´ln´ promˇnn´ a ı e e Glob´ln´ promˇnn´ je moˇn´ deklarovat v r´mci bloku CONFIGURATION, pˇ´ a ı e e z e a rıpadnˇ e v r´mci podbloku konfigurace RESOURCE. Glob´ln´ promˇnn´ jsou n´slednˇ dos- a a ı e e a e tupn´ v cel´m PLC programu, pˇiˇemˇ z blok˚ typu FUNCTION, PROGRAM a e e rc z u 23
  • 31.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Pˇehled blok˚ pro deklaraci promˇnn´ch r u e y FUNCTION BLOCK je tˇeba se na nˇ odk´zat pomoc´ deklarace VAR EXTERNAL r e a ı (viz.4.3.2). Zp˚sob deklarace bloku glob´ln´ promˇnn´ch je patrn´ z uk´zky 4.3. u a ıch e y y a ... nadˇazen´ blok ... r y VAR_GLOBAL ... Deklarace jednotliv´ch promˇnn´ch; y e y ... END_VAR ... pokraˇov´n´ nadˇazen´ho bloku ... c a ı r e Uk´zka 4.3: Deklarace glob´ln´ promˇnn´ch v programu. a a ıch e y 4.3.2 Extern´ promˇnn´ ı e e Blok extern´ promˇnn´ch se vyuˇ´ a k odkazu na glob´ln´ promˇnnou, kterou chceme ıch e y zıv´ a ı e vyuˇ´ v r´mci blok˚ PROGRAM, FUNCTION a FUNCTION BLOCK. V tomto zıt a u bloku lze pouˇ´ pouze deklaraci promˇnn´ bez specifikace adresy, kde se nach´z´ ani zıt e e a ı, deklarovat inicializaˇn´ hodnotu - tu je moˇno specifikovat v r´mci deklarace promˇnn´ c ı z a e e v bloku VAR GLOBAL. Zp˚sob deklarace bloku glob´ln´ promˇnn´ch je patrn´ z u a ıch e y y uk´zky 4.4. a ... nadˇazen´ blok ... r y VAR_EXTERNAL ... Deklarace jednotliv´ch promˇnn´ch; y e y ... END_VAR ... pokraˇov´n´ nadˇazen´ho bloku ... c a ı r e Uk´zka 4.4: Deklarace extern´ promˇnn´ch v programu. a ıch e y 4.3.3 Lok´ln´ promˇnn´ a ı e e Lok´ln´ promˇnn´ lze pouˇ´ pouze v r´mci programov´ch blok˚ PROGRAM, FUNC- a ı e e zıt a y u TION a FUNCTION BLOCK. Promˇnn´ deklarovan´ jako lok´ln´ maj´ platnost pouze e e e a ı ı v programov´m bloku, kde jsou deklarov´ny. e a 24
  • 32.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Pˇehled blok˚ pro deklaraci promˇnn´ch r u e y V pˇ´ e funkˇn´ blok˚ a blok˚ typu program si lok´ln´ promˇnn´ uchov´vaj´ rıpadˇ c ıch u u a ı e e a ı svoji hodnotu z pˇedchoz´ vol´n´ po celou dobu existence instance funkˇn´ bloku. r ıho a ı c ıho Zp˚sob deklarace bloku lok´ln´ promˇnn´ch je patrn´ z uk´zky 4.5. u a ıch e y y a ... nadˇazen´ blok ... r y VAR ... Deklarace jednotliv´ch promˇnn´ch; y e y ... END_VAR ... pokraˇov´n´ nadˇazen´ho bloku ... c a ı r e Uk´zka 4.5: Deklarace lok´ln´ promˇnn´ch v programu. a a ıch e y 4.3.4 Vstupn´ promˇnn´ ı e e Bloky vstupn´ promˇnn´ch lze vyuˇ´ ıch e y zıvat v r´mci blok˚ PROGRAM, FUNCTION a u a FUNCTION BLOCK. V jejich deklaraci nelze specifikovat adresu a vyuˇ´ ı se jako zıvaj´ vstupn´ parametry v´ˇe uveden´ch blok˚. Zp˚sob deklarace bloku vstupn´ promˇnn´ch ı ys y u u ıch e y je patrn´ z uk´zky 4.6. y a ... nadˇazen´ blok ... r y VAR_INPUT ... Deklarace jednotliv´ch promˇnn´ch; y e y ... END_VAR ... pokraˇov´n´ nadˇazen´ho bloku ... c a ı r e Uk´zka 4.6: Deklarace vstupn´ promˇnn´ch v programu. a ıch e y 4.3.5 V´stupn´ promˇnn´ y ı e e V´stupn´ promˇnn´ lze pouˇ´ pouze v r´mci blok˚ PROGRAM a FUNCTION BLOCK. y ı e e zıt a u V jejich deklaraci nelze specifikovat adresu a vyuˇ´ ı se pro pˇed´v´n´ hodnot z zıvaj´ r a a ı aktu´ln´ programov´ho bloku do bloku nadˇazen´ho. Zp˚sob deklarace bloku v´stupn´ a ıho e r e u y ıch promˇnn´ch je patrn´ z uk´zky 4.7. e y y a 25
  • 33.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Implementace promˇnn´ch e y ... nadˇazen´ blok ... r y VAR_OUTPUT ... Deklarace jednotliv´ch promˇnn´ch; y e y ... END_VAR ... pokraˇov´n´ nadˇazen´ho bloku ... c a ı r e Uk´zka 4.7: Deklarace v´stupn´ promˇnn´ch v programu. a y ıch e y 4.3.6 Vstupnˇ/v´stupn´ promˇnn´ e y ı e e Bloky vstupnˇ/v´stupn´ promˇnn´ch lze pouˇ´ pouze v r´mci blok˚ PROGRAM e y ıch e y zıt a u a FUNCTION BLOCK. V deklaraci jednotliv´ch promˇnn´ch nelze specifikovat adresu y e y a zastupuj´ ulohu parametr˚ pˇed´van´ch referenc´ Tyto parametry lze vyuˇ´ jak pro ı´ u r a y ı. zıt pˇed´n´ hodnoty do volan´ho bloku, tak pro z´ an´ t´to hodnoty po ukonˇen´ vol´n´ r a ı e ısk´ ı e c ı a ı pˇ´ sn´ho bloku. Zp˚sob deklarace bloku vstupnˇ/v´stupn´ promˇnn´ch je patrn´ rısluˇ e u e y ıch e y y z uk´zky 4.8. a ... nadˇazen´ blok ... r y VAR_IN_OUT ... Deklarace jednotliv´ch promˇnn´ch; y e y ... END_VAR ... pokraˇov´n´ nadˇazen´ho bloku ... c a ı r e Uk´zka 4.8: Deklarace v´stupn´ promˇnn´ch v programu. a y ıch e y 4.4 Implementace promˇnn´ch e y Implementace promˇnn´ch mus´ splˇovat vˇechny poˇadavky, kter´ vypl´vaj´ z pˇedchoz´ e y ı n s z e y ı r ı ˇ´sti: ca 1. Spolupr´ce se vˇemi datov´mi typy zvolen´mi pro implementaci. a s y y 2. Moˇnost specifikovat absolutn´ adresu, na kter´ se promˇnn´ nach´z´ z ı e e a a ı. 26
  • 34.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Implementace promˇnn´ch e y 3. Moˇnost specifikovat inicializaˇn´ hodnotu promˇnn´. z c ı e e 4. Pro vstupnˇ/v´stupn´ promˇnn´ umoˇnit pˇedat hodnotu promˇnn´ do bloku, e y ı e e z r e e kter´ provedl vol´n´ pˇ´ sn´ho funkˇn´ nebo programov´ho bloku. y a ı rısluˇ e c ıho e C´ılem tedy bude vytvoˇit pˇ´ sn´ knihovn´ tˇ´ kter´ umoˇn´ akce definovan´ v r rısluˇ e ı rıdy, e z ı e pˇedchoz´ pˇehledu a vypl´vaj´ ı z pˇedchoz´ ˇ´st. Pˇehled navrˇen´ch tˇ´ a poˇadavky r ım r y ıc´ r ı ca r z y rıd z na jejich funkcionalitu jsou uvedeny v tab.4.4. Tˇ´ rıda Funkcionalita CVariable Template tˇ´rıda implementuj´ ı vlastnosti ıc´ promˇnn´ch pro vˇechny z´kladn´ datov´ e y s a ı e typy z tab.4.1. CPropertyIn Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti r ıc´ promˇnn´ch deklarovan´ch v r´mci bloku e y y a VAR INPUT. CPropertyOut Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti r ıc´ promˇnn´ch deklarovan´ch v r´mci bloku e y y a VAR OUTPUT. CPropertyInOut Template tˇ´ rıda zapouzdˇuj´ ı vlastnosti r ıc´ promˇnn´ch deklarovan´ch v r´mci bloku e y y a VAR IN OUT, vˇetnˇ pˇ´ c e rıpadn´ho pˇed´n´ e r a ı hodnoty promˇnn´ do bloku, kter´ provedl e e y vol´n´ pˇ´ sn´ho funkˇn´ a ı rısluˇ e c ıho nebo pro- gramov´ho bloku. e Tabulka 4.4: Pˇehled tˇ´ pro implementaci promˇnn´ch v softwarov´m PLC. r rıd e y e 4.4.1 Parser zdrojov´ho k´du e o V r´mci parseru zdrojov´ho k´du pro PLC budou v generovan´m C++ k´du vyuˇity a e o e o z objekty z tab.4.4. Pro vlastn´ zpracov´n´ k´du bude vytvoˇen kontejner CContainer- ı a ı o r Variable pro udrˇov´n´ informac´ o aktu´ln´ zpracov´van´ promˇnn´ (informace o da- z a ı ı a ı a e e e tov´m typu, n´zvu, adrese, inicializaˇn´ hodnotˇ atp.). D´le bude vytvoˇena template e a c ı e a r tˇ´ CContainerContainer, kter´ bude slouˇit ke sdruˇov´n´ kontejner˚ patˇ´ ıch do rıda a z z a ı u rıc´ jednoho bloku PLC programu. 4.4.2 Vygenerovan´ zdrojov´ k´d y y o Vygenerovan´ zdrojov´ k´d v C++ je rozdˇlen do n´sleduj´ ıch ˇ´st´ y y o e a ıc´ ca ı: • V pˇ´ e, ˇe se nejedn´ o glob´ln´ promˇnn´: rıpadˇ z a a ı e e 27
  • 35.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Implementace promˇnn´ch e y 1. Povinn´ ˇ´st deklarace vlastn´ promˇnn´ v private nebo public ˇ´sti deklarace a ca ı e e ca objektu, kter´ reprezentuje dan´ blok z programu. y y a ca rıdy s ’ ıc´ 2. Nepovinn´ ˇ´st v konstruktoru tˇ´ zajiˇt uj´ ı inicializaci promˇnn´. Gen- e e erov´no pouze v pˇ´ e, ˇe promˇnn´ m´ definov´nu inicializaˇn´ hodnotu. a rıpadˇ z e a a a c ı 3. Pro v´stupn´ a vstupnˇ-v´stupn´ promˇnn´ je jeˇtˇ generov´n k´d resetuj´ ı y ı e y ı e e se a o ıc´ promˇnnou pro dalˇ´ pouˇit´ e sı z ı. • V pˇ´ e, ˇe se jedn´ o glob´ln´ promˇnnou, je vygenerov´na deklarace promˇnn´ rıpadˇ z a a ı e a e e typu CVariable s pˇ´ sn´m datov´m typem a pˇ´ rısluˇ y y rıpadnou inicializaˇn´ hodnotou c ı promˇnn´. e e Po zpracov´n´ zdrojov´ho k´du je pro lok´ln´ promˇnnou vygenerov´n k´d odpov´ ıc´ a ı e o a ı e a o ıdaj´ ı uk´zce 4.9. Ve vygenerovan´m k´du je vyuˇita template tˇ´ CVariable. a e o z rıda // deklarace tˇ´dy, rı // hlaviˇkov´ soubor c y // counter AT %QB3: INT := 3; // konstruktor tˇ´dy rı class init // counter AT %QB3: INT := 3; { init :: init(void) ... { private: #line 3 "test.plc" #line 3 "test.plc" m_counter = CVariable<INT> ((INT) 3, "QB3"); CVariable<INT> m_counter; } ... }; Uk´zka 4.9: Uk´zka k´du vygenerovan´ho pro lok´ln´ promˇnn´. a a o e a ı e e K´d generovan´ pro parametry funkc´ funkˇn´ blok˚ nebo program˚ je patrn´ o y ı, c ıch u u y z uk´zky 4.10. Ve vygenerovan´m k´du je vyuˇita jedna z template tˇ´ CPropertyIn, a e o z rıd CPropertyOut nebo CPropertyInOut dle typu parametru pro pˇ´ rıstup k parametru z m´ısta, odkud je provedeno vol´n´ a template tˇ´ CVariable, kter´ je pˇiˇazena k a ı rıda a rr objektu a je vyuˇ´ ana k pˇ´ zıv´ rıstupu k parametru uvnitˇ programu. r 28
  • 36.
    ZPRACOVAN´ PROMENNYCH PLCPROGRAMU ´ I ˇ ´ Implementace promˇnn´ch e y // deklarace tˇ´dy, rı // hlaviˇkov´ soubor c y // vstup: INT; class init // soubor s implementac´ tˇ´dy ı rı { // konstruktor tˇ´dy rı private: // vstup: INT; #line 6 "test.plc" init :: init(void) CVariable<INT> m_vstup; { ... #line 6 "test.plc" public: vstup = CPropertyIn<INT> (&m_vstup); #line 6 "test.plc" } CPropertyIn<INT> vstup; ... }; Uk´zka 4.10: Uk´zka k´du vygenerovan´ho pro parametry funkc´ funkˇn´ blok˚ nebo a a o e ı, c ıch u program˚. u 29
  • 37.
    Kapitola 5 Zpracov´n´ jazykaIL a ı Tato ˇ´st uv´d´ pˇehled jednotliv´ch instrukc´ jazyka IL, zab´v´ se jejich zpracov´n´ ca a ı r y ı y a a ım a vykon´v´n´ v softwarov´m PLC. Informace zde uveden´ jsou ˇerp´ny z [5]. a a ım e e c a Jednotliv´ instrukce jazyka IL m˚ˇeme rozdˇlit dle funkˇn´ v´znamu do n´sleduj´ ıch e uz e c ıho y a ıc´ kategori´ ı: 1. Pˇiˇazovac´ instrukce - instrukce pro nastaven´ aktu´ln´ hodnoty z´sobn´ rr ı ı a ı a ıku, promˇnn´ch nebo adres. e y 2. Logick´ instrukce - instrukce umoˇnuj´ ı logick´ operace mezi promˇnn´mi. e zˇ ıc´ e e y 3. Aritmetick´ instrukce - instrukce pro n´soben´ dˇlen´ sˇ´ an´ atd. e a ı, e ı, cıt´ ı 4. Porovn´vac´ instrukce - instrukce slouˇ´ ı k porovn´n´ argumentu a aktu´ln´ a ı zıc´ a ı a ıho stavu na z´sobn´ a ıku. 5. Instrukce ˇ´rızen´ toku programu - instrukce pro podm´ en´ skoky, vol´n´ ı ınˇ e a ı funkc´ a funkˇn´ blok˚. ı c ıch u Kaˇd´ z kategori´ uveden´ch v´ˇe je vˇnov´na samostatn´ ˇ´st v t´to kapitole z e ı y ys e a a ca e popisuj´ ı kr´tce vlastnosti a specifika jednotliv´ch ˇ´st´ ıc´ a y ca ı. Dle [5] by mˇl aktu´ln´ datov´ typ na z´sobn´ odpov´ e a ı y a ıku ıdat datov´u typu operandu. e Vzhledem k vyuˇit´ vlastnost´ jazyka C++ jsou zajiˇtˇny implicitn´ konverze mezi z ı ı se ı vˇtˇinou dostupn´ch datov´ch typ˚. Pokud poˇadovan´ konverze neexistuje, je chyba es y y u z a hl´ˇena v okamˇiku kompilace vygenerovan´ho C++ souboru. as z e Dle [5] lze logick´, aritmetick´ a porovn´nac´ instrukce ˇetˇzit pomoc´ z´vorek, e e a ı r e ı a pˇiˇemˇ prav´ z´vorka m´ vˇdy v´znam vyhodnocen´ v´razu od lev´ z´vorky. Uk´zka rc z a a a z y ı y e a a 5.1 uv´d´ takov´ vol´n´ Tato vlastnost nen´ v implementovan´m softwarov´m PLC dos- a ı e a ı. ı e e ’ z y y tupn´, nebot kaˇd´ v´raz lze nahradit takovou posloupnost´ operac´ kter´ z´vorkov´n´ a ı ı, a a a ı zcela nahrad´ ı. 30
  • 38.
    ZPRACOVAN´ JAZYKA IL ´ I Pˇiˇazovac´ instrukce rr ı MUL ( input1 SUB input2 ) (* V´sledek je interpretov´n jako: y a *) (* result := result * (input1 - input2) *) Uk´zka 5.1: Pouˇit´ z´vorkovan´ch v´raz˚ v instrukc´ a z ı a y y u ıch. 5.1 Pˇiˇazovac´ instrukce rr ı Tato ˇ´st se zab´v´ zpracov´n´ instrukc´ kter´ umoˇnuj´ pˇiˇazovat hodnoty promˇnn´ch ca y a a ım ı, e zˇ ı r r e y a adres. Jednotliv´ instrukce, kter´ do t´to ˇ´sti spadaj´ a jejich v´znamje uveden v e e e ca ı y tab.5.1. Instrukce Popis LD Nastav´ aktu´ln´ hodnotu na z´sobn´ ı a ı a ıku. Argumentem m˚ˇe b´t promˇnn´, adresa nebo konstanta. uz y e a LDN Nastav´ aktu´ln´ hodnotu na z´sobn´ ı a ı a ıku, pˇiˇemˇ ne- rc z jprve provede negaci hodnoty. Argumentem m˚ˇe b´t uz y promˇnn´, adresa nebo konstanta. e a ST Uloˇ´ aktu´ln´ hodnotu ze z´sobn´ zı a ı a ıku do poˇadovan´ z e promˇnn´ nebo na poˇadovanou adresu. e e z STN Uloˇ´ aktu´ln´ hodnotu ze z´sobn´ zı a ı a ıku do poˇadovan´ z e promˇnn´ nebo na poˇadovanou adresu, pˇiˇemˇ nejprve e e z rc z provede negaci hodnoty. S Nastav´ obsah boolean promˇnn´ nebo adresy v argu- ı e e mentu na 1, prov´d´ se pouze v pˇ´ e, ˇe aktu´ln´ a ı rıpadˇ z a ı stav z´sobn´ je TRUE. a ıku R Nastav´ obsah boolean promˇnn´ nebo adresy v argu- ı e e mentu na 0, prov´d´ se pouze v pˇ´ e, ˇe aktu´ln´ a ı rıpadˇ z a ı stav z´sobn´ je TRUE. a ıku Tabulka 5.1: Pˇehled pˇiˇazovac´ instrukc´ jazyka IL. r rr ıch ı Vygenerovan´ k´d pro vybran´ instrukce je patrn´ z uk´zky 5.2. y o e y a Instrukce, kter´ nastavuj´ aktu´ln´ hodnotu z´sobn´ (ve vygenerovan´m k´du e ı a ı a ıku e o promˇnn´ result, definovan´ jako instance tˇ´ CResult) pouˇ´ ı pˇet´zen´ konstruk- e a a rıdy zıvaj´ r ıˇ y tor objektu pro pˇ´ sn´ datov´ typ. rısluˇ y y 31
  • 39.
    ZPRACOVAN´ JAZYKA IL ´ I Logick´ instrukce e { // LD 10 result = 10; } { // ST vstup result.GetValue(m_vstup); } { // STN %QB3 CVariable<BYTE> tmp0 = CVariable<BYTE>("QB3", 0); result.GetValueNeg(tmp0); } // S %QX1.1 if (result == true) { CVariable<BIT> tmp0 = CVariable<BIT>("QX1.1", 0); tmp0 = 1; } Uk´zka 5.2: Generovan´ C++ k´d pro pˇiˇazovac´ instrukce jazyka IL. a y o rr ı 5.2 Logick´ instrukce e Tato ˇ´st se zab´v´ zpracov´n´ logick´ch instrukc´ jazyka IL. Pˇehled jednotliv´ch ca y a a ım y ı r y logick´ch instrukc´ je uveden v tab.5.2. y ı Vˇechny instrukce spadaj´ ı do t´to ˇ´sti pouˇ´ ı jako prvn´ argument aktu´ln´ s ıc´ e ca zıvaj´ ı a ı ıku y ıt ’ ˇ´ hodnotu z´sobn´ a jako druh´ argument (operand instrukce) mohou m´ bud cıselnou a konstantu, promˇnnou (pˇ´ e rıpadnˇ parametr funkce/funkˇn´ bloku) nebo pˇ´ e c ıho rımou adresu. V´sledek proveden´ operace je vˇdy uloˇen na z´sobn´ jako jeho aktu´ln´ hodnota y e z z a ık, a ı (ve vygenerovan´m k´du promˇnn´ result). e o e a Jednotliv´ operace jsou implementov´ny jako pˇet´zen´ oper´tor template tˇ´ e a r ıˇ y a rıdy CResult z podp˚rn´ PLC knihovny. u e Uk´zka 5.3 uv´d´ pˇ´ a a ı rıklad C++ k´du, kter´ je vygenerov´n pro logick´ instrukce. o y a e 5.3 Aritmetick´ instrukce e Tato ˇ´st se zab´v´ zpracov´n´ aritmetick´ch instrukc´ jazyka IL. Pˇehled jednotliv´ch ca y a a ım y ı r y instrukc´ je uveden v tab.5.3. Z´kladn´ sada aritmetick´ch instrukc´ jazyka IL obsahuje ı a ı y ı instrukce pro sˇ´ an´ odˇ´ an´ n´soben´ a dˇlen´ vˇech z´kladn´ datov´ch typ˚. cıt´ ı, cıt´ ı, a ı e ı s a ıch y u Jako prvn´ operand pˇ´ sn´ aritmetick´ operace je vˇdy pouˇita aktu´ln´ hodnota ı rısluˇ e e z z a ı z´sobn´ a ıku, jako druh´ operand je pouˇit parametr instrukce. y z V´sledek aritmetick´ operace je vˇdy uloˇen zpˇt na z´sobn´ jako jeho aktu´ln´ y e z z e a ık a ı 32
  • 40.
    ZPRACOVAN´ JAZYKA IL ´ I Aritmetick´ instrukce e Instrukce Popis AND Na z´sobn´ je uloˇen v´sledek logick´ operace a ık z y e (Z´sobn´ AND Operand), operand mus´ m´ stejn´ da- a ık ı ıt y tov´ typ jako aktu´ln´ hodnota z´sobn´ y a ı a ıku. OR Na z´sobn´ je uloˇen v´sledek logick´ operace a ık z y e (Z´sobn´ OR Operand), operand mus´ m´ stejn´ da- a ık ı ıt y tov´ typ jako aktu´ln´ hodnota z´sobn´ y a ı a ıku. XOR Na z´sobn´ je uloˇen v´sledek logick´ operace a ık z y e (Z´sobn´ XOR Operand), operand mus´ m´ stejn´ da- a ık ı ıt y tov´ typ jako aktu´ln´ hodnota z´sobn´ y a ı a ıku. ANDN Na z´sobn´ je uloˇen v´sledek logick´ operace a ık z y e (Z´sobn´ AND NOT Operand), operand mus´ m´ a ık ı ıt stejn´ datov´ typ jako aktu´ln´ hodnota z´sobn´ y y a ı a ıku. ORN Na z´sobn´ je uloˇen v´sledek logick´ operace a ık z y e (Z´sobn´ OR NOT Operand), operand mus´ m´ stejn´ a ık ı ıt y datov´ typ jako aktu´ln´ hodnota z´sobn´ y a ı a ıku. XORN Na z´sobn´ je uloˇen v´sledek logick´ operace a ık z y e (Z´sobn´ XOR NOT Operand), operand mus´ m´ a ık ı ıt stejn´ datov´ typ jako aktu´ln´ hodnota z´sobn´ y y a ı a ıku. Tabulka 5.2: Pˇehled logick´ch instrukc´ jazyka IL. r y ı { // AND 2#0101_0101 result = result & 85; } { // XORN 8#07_02 result = result ^ ~(450); } Uk´zka 5.3: Generovan´ C++ k´d pro logick´ instrukce jazyka IL. a y o e hodnota. Instrukce DIV (dˇlen´ uloˇ´ v pˇ´ e dˇlen´ nulou na z´sobn´ jako aktu´ln´ hod- e ı) zı rıpadˇ e ı a ık a ı notu 0 a informace o chybˇ je vyps´na jako hl´ˇen´ do logu j´dra operaˇn´ syst´mu. e a as ı a c ıho e Uk´zka 5.4 uv´d´ C++ k´d, kter´ je pro tyto instrukce generov´n. a a ı o y a 33
  • 41.
    ZPRACOVAN´ JAZYKA IL ´ I Porovn´vac´ instrukce a ı Instrukce Popis ADD Na z´sobn´ je uloˇen v´sledek aritmetick´ operace a ık z y e (Z´sobn´ + Operand), operand mus´ m´ stejn´ datov´ a ık ı ıt y y typ jako aktu´ln´ hodnota z´sobn´ a ı a ıku. SUB Na z´sobn´ je uloˇen v´sledek aritmetick´ operace a ık z y e (Z´sobn´ - Operand), operand mus´ m´ stejn´ datov´ a ık ı ıt y y typ jako aktu´ln´ hodnota z´sobn´ a ı a ıku. MUL Na z´sobn´ je uloˇen v´sledek aritmetick´ operace a ık z y e (Z´sobn´ * Operand), operand mus´ m´ stejn´ datov´ a ık ı ıt y y typ jako aktu´ln´ hodnota z´sobn´ a ı a ıku. DIV Na z´sobn´ je uloˇen v´sledek aritmetick´ operace a ık z y e (Z´sobn´ / Operand), operand mus´ m´ stejn´ datov´ a ık ı ıt y y typ jako aktu´ln´ hodnota z´sobn´ a ı a ıku. Tabulka 5.3: Pˇehled aritmetick´ch instrukc´ jazyka IL. r y ı { // ADD 16#0F result = result + 15; } { // MUL %IW4 CVariable<WORD> tmp0 = CVariable<WORD>("IW4", 0); result = result * tmp0; } Uk´zka 5.4: Generovan´ C++ k´d pro aritmetick´ instrukce jazyka IL. a y o e 5.4 Porovn´vac´ instrukce a ı Tato ˇ´st se zab´v´ zpracov´n´ instrukc´ jazyka IL pro porovn´v´n´ aktu´ln´ stavu ca y a a ım ı a a ı a ıho z´sobn´ a operandu. Pˇehled jednotliv´ch instrukc´ je uveden v tab.5.2. a ıku r y ı Vˇechny instrukce modifikuj´ aktu´ln´ hodnotu z´sobn´ na logickou hodnotu s ı a ı a ıku TRUE nebo FALSE dle v´sledku porovn´n´ y a ı. Uk´zka 5.5 uv´d´ k´d, kter´ odpov´ a vybran´m porovn´vac´ instrukc´ jazyka a a ı o y ıd´ y a ım ım IL. 5.5 Instrukce ˇ´ rızen´ toku programu ı Tato ˇ´st se zab´v´ pˇehledem a zpracov´n´ instrukc´ pro ˇ´ ı toku programu. Jedn´ ca y a r a ım ı rızen´ a se o instrukce umoˇnuj´ ı prov´dˇt skoky v r´mci programu, volat jin´ programov´ zˇ ıc´ a e a e e 34
  • 42.
    ZPRACOVAN´ JAZYKA IL ´ I Instrukce ˇızen´ toku programu r´ ı Instrukce Popis GT Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku a ık z y porovn´n´ (Z´sobn´ > Operand). a ı a ık GE Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku a ık z y porovn´n´ (Z´sobn´ >= Operand). a ı a ık EQ Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku a ık z y porovn´n´ (Z´sobn´ = Operand). a ı a ık NE Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku a ık z y porovn´n´ (Z´sobn´ = Operand). a ı a ık LE Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku a ık z y porovn´n´ (Z´sobn´ <= Operand). a ı a ık LT Na z´sobn´ je uloˇeno TRUE nebo FALSE dle v´sledku a ık z y porovn´n´ (Z´sobn´ < Operand). a ı a ık Tabulka 5.4: Pˇehled porovn´vac´ instrukc´ jazyka IL. r a ıch ı { //GT counter result = (result > m_counter); } { // NE 10 result = (result != 10); } Uk´zka 5.5: Generovan´ C++ k´d pro porovn´vac´ instrukce jazyka IL. a y o a ı bloku a prov´st n´vrat z volan´ho bloku. Pˇehled instrukc´ je uveden v tab.5.5. e a e r ı K´d generovan´ pro jednotliv´ instrukce z tab.5.5 je uveden v uk´zce 5.6. Jak je o y e a patrno, instrukce JMP, JMPN a JMPC jsou nahrazeny v jazyce C++ konstrukc´ goto ı LABEL;, pˇiˇemˇ n´vˇˇt´ v PLC programu je pˇevedeno do programu v jazyce C++. r c z a es ı r Instrukce RET, RETC a RETN jsou nahrazeny C++ vol´n´ return;. a ım Sloˇitˇjˇ´ situace nast´v´ v pˇ´ e pouˇit´ instrukc´ CAL, CALC a CALN, kter´ z e sı a a rıpadˇ z ı ı e umoˇnuj´ volat instance funkˇn´ blok˚, nebot zˇ ı c ıch u ’ je tˇeba zajistit tak´ pˇed´n´ hod- r e r a ı not parametr˚. Dle [5] lze hodnoty parametr˚ pro funkˇn´ bloky pˇed´vat 3 r˚zn´mi u u c ı r a u y zp˚soby, tak jak je definov´no v tab.5.6. u a Vytvoˇen´ software podporuje moˇnosti ˇ. 1 a 2. V pˇ´ e referenˇn´ argument˚ r y z c rıpadˇ c ıch u funkˇn´ blok˚, kter´ nejsou specifikov´ny, lze takov´ funkˇn´ blok volat s t´ ˇe c ıch u e a y c ı ım, z se pouˇije implicitn´ hodnota parametru, pˇiˇemˇ pˇ´ z ı r c z rıpadnou navracenou hodnotu jiˇ z nelze z programu z´ ıskat. Uk´zka 5.6 uv´d´ k´d vygenerovan´ pˇi vol´n´ instance funkˇn´ bloku. a a ı o y r a ı c ıho 35
  • 43.
    ZPRACOVAN´ JAZYKA IL ´ I Instrukce ˇızen´ toku programu r´ ı Instrukce Popis JMP Skok na n´vˇˇt´ definovan´ v r´mci programov´ho bloku. a es ı e a e CAL Vol´n´ funkˇn´ bloku. a ı c ıho RET N´vrat z volan´ho programov´ho bloku. a e e JMPN Podm´ en´ skok na n´vˇˇt´ v r´mci programov´ho bloku ınˇ y a es ı a e v pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je FALSE. rıpadˇ z a ı a ıku CALN Podm´ en´ vol´n´ funkˇn´ ınˇ e a ı c ıho bloku v pˇ´ e, ˇe je rıpadˇ z aktu´ln´ stav z´sobn´ FALSE. a ı a ıku RETN Podm´ en´ n´vrat z volan´ho programov´ho bloku v ınˇ y a e e pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je FALSE. rıpadˇ z a ı a ıku JMPC Podm´ en´ skok na n´vˇˇt´ v r´mci programov´ho bloku ınˇ y a es ı a e v pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je TRUE. rıpadˇ z a ı a ıku CALC Podm´ en´ vol´n´ funkˇn´ ınˇ e a ı c ıho bloku v pˇ´ e, ˇe je rıpadˇ z aktu´ln´ stav z´sobn´ TRUE. a ı a ıku RETC Podm´ en´ n´vrat z volan´ho programov´ho bloku v ınˇ y a e e pˇ´ e, ˇe aktu´ln´ stav z´sobn´ je TRUE. rıpadˇ z a ı a ıku Tabulka 5.5: Pˇehled instrukc´ pro ˇ´ ı toku programu jazyka IL. r ı rızen´ ˇ ıslo C´ Popis/uk´zka a 1 CAL se vstupn´ parametry: ımi CAL C10(CU := %IX10, PV := 15) 2 CAL + LD a ST pro nastaven´ vstup˚: ı u LD 15 ST C10.PV LD %IX10 ST C10.CU CAL C10 3 Pouˇit´ vstupn´ oper´tor˚: z ı ıch a u LD 15 PV C10 LD %IX10 CU C10 Tabulka 5.6: Moˇnosti pˇed´v´n´ parametr˚ pˇi vol´n´ funkˇn´ blok˚. z r a a ı u r a ı c ıch u 5.5.1 Vol´n´ funkc´ a ı ı Funkce lze volat tak, ˇe na m´ z ısto instrukce se zap´se n´zev funkce, pˇiˇemˇ jako ıˇ a rc z prvn´ argument funkce je pˇed´na aktu´ln´ hodnota z´sobn´ ı r a a ı a ıku. Pˇ´ rıpadn´ dalˇ´ hod- e sı noty parametr˚ lze zadat oddˇlen´ ˇ´rkou v r´mci argumentu instrukce. N´vratov´ u e e ca a a a hodnota funkce je uloˇena jako aktu´ln´ hodnota z´sobn´ z a ı a ıku. Uk´zka 5.7 uv´d´ PLC a a ı 36
  • 44.
    ZPRACOVAN´ JAZYKA IL ´ I Instrukce ˇızen´ toku programu r´ ı { // CAL controler(P := 2) g_controler.p = 2; g_controler.Function(); } // RETC if (result != 0) RETURN(); { // JMP ahoj goto ahoj; } Uk´zka 5.6: Generovan´ k´d pro vybran´ instrukce ˇ´ ı toku programu jazyka IL. a y o e rızen´ k´d pro vol´n´ funkce. o a ı LD 10 (* Vol´n´ funkce MAX(X, Y) *) a ı MAX 20 (* Akt´ln´ hodnota z´sobn´ku je 20 *) a ı a ı Uk´zka 5.7: Uk´zka vol´n´ funkce z jazyka IL. a a a ı Uk´zka 5.8 uv´d´ k´d vygenerovan´ bˇhem vol´n´ funkce. Nejprve je deklarov´na a a ı o y e a ı a instance objektu, kter´ funkci reprezentuje, n´slednˇ je vyplnˇn prvn´ parametr funkce y a e e ı aktu´ln´ hodnotou z´sobn´ a pot´ jsou vyplnˇny pˇ´ a ı a ıku e e rıpadn´ dalˇ´ parametry. Po vol´n´ e sı a ı funkce je nastavena nov´ aktu´ln´ hodnota z´sobn´ a a ı a ıku. { // MIN 33 MIN f_function; result.GetValue(f_function.parm0); f_function.parm1 = 33; f_function.Function(); result = f_function.GetResult(); } Uk´zka 5.8: Generovan´ C++ k´d pˇi vol´n´ funkce v jazyce IL. a y o r a ı 37
  • 45.
    Kapitola 6 Zpracov´n´ programov´chblok˚ a ı y u Tato ˇ´st se zab´v´ zpracov´n´ z´kladn´ blok˚, kter´ se pouˇ´ ı pro z´pis pro- ca y a a ım a ıch u e zıvaj´ a gramu. Dle [5] jsou definov´ny tˇi typy programov´ch blok˚: a r y u 1. Funkˇn´ bloky - umoˇnuj´ vyuˇ´ vstupn´ parametry, v´stupn´ parametry a c ı zˇ ı zıt ı y ı parametry vstupnˇ-v´stupn´ Pˇi pouˇit´ funkˇn´ bloku je tˇeba nejprve defi- e y ı. r z ı c ıho r novat jeho instanci. Vnitˇn´ promˇnn´ jsou platn´ po dobu platnosti instance. r ı e e e 2. Programov´ bloky - obdoba funkˇn´ blok˚. Liˇ´ se t´ ˇe existuje pouze e c ıch u sı ım, z jedna glob´lnˇ platn´ instance jej´z vnitˇn´ promˇnn´ jsou platn´ po celou dobu a e a ıˇ r ı e e e bˇhu programu. e 3. Funkce - podporuj´ pouze vstupn´ parametry, vˇdy pouˇ´ ı n´vratovou hod- ı ı z zıvaj´ a notu. Vnitˇn´ promˇnn´ jsou platn´ pouze po dobu jednoho vol´n´ funkce. r ı e e e a ı Jednotliv´ bloky, jejich v´znam a pouˇit´ jsou pops´ny v n´sleduj´ ıch ˇ´stech t´to e y z ı a a ıc´ ca e kapitoly. Veˇker´ uveden´ informace jsou z´ any z [5]. s e e ısk´ K´d generovan´ pro jednotliv´ druhy programov´ch blok˚ odpov´ a vˇdy vygen- o y e y u ıd´ z erovan´ tˇ´ e v jazyce C++. N´zev vygenerovan´ tˇ´ je vˇdy rozˇ´ren o prefix, kter´ e rıdˇ a e rıdy z sıˇ y s’ zajiˇt uje, ˇe je moˇn´ shodnˇ pojmenovat funkci, funkˇn´ blok i blok typu program. z z e e c ı Konverzn´ program vˇdy podle kontextu, ve kter´m je n´zev vyuˇit pouˇije spr´vn´ pre- ı z e a z z a y fix a t´ i spr´vn´ blok. Pro kaˇd´ z uveden´ch blok˚ je vˇdy vygenerov´n hlaviˇkov´ ım a y z y y u z a c y soubor a soubor s implementac´ tˇ´ Hlaviˇkov´ soubor je n´slednˇ automaticky in- ı rıdy. c y a e cludov´n do generovan´ho k´du v pˇ´ e, ˇe je pˇ´ sn´ blok v programu vyuˇit. a e o rıpadˇ z rısluˇ y z 6.1 Funkˇn´ bloky c ı Funkˇn´ bloky svou podstatou odpov´ ı objekt˚m jazyka C++. Kaˇd´ funkˇn´ blok c ı ıdaj´ u z y c ı pˇedt´ neˇ je moˇn´ ho volat mus´ m´ deklarov´nu svoji instanci pomoc´ promˇnn´ r ım, z z e ı ıt a ı e e s datov´m typem odpov´ ıc´ n´zvu funkˇn´ bloku (viz. uk´zka 6.1). y ıdaj´ ım a c ıho a 38
  • 46.
    ZPRACOVAN´ PROGRAMOVYCH BLOKU ´ I ´ ˚ Funkˇn´ bloky c ı Jin´mi slovy, kaˇd´ funkˇn´ blok m˚ˇe m´ v´ instanc´ kter´ jsou reprezentov´ny y z y c ı uz ıt ıce ı, e a r˚zn´mi promˇnn´mi (bud’ glob´ln´ nebo lok´ln´ u y e y a ımi a ımi). Z´nikem promˇnn´ zanik´ tak´ a e e a e instance pˇ´ sn´ho funkˇn´ bloku. rısluˇ e c ıho ... VAR ... pid1: PID; (* deklarace instance FB pro PID regul´tor *) a ... END_VAR ... CAL pid1 ... Uk´zka 6.1: Deklarace instance funkˇn´ bloku a jeho n´sledn´ vol´n´ a c ıho a e a ı. Princip z´pisu k´du pro definici tˇla funkˇn´ bloku je patrn´ z uk´zky 6.2. a o e c ıho y a Deklarace jednotliv´ch blok˚ promˇnn´ch je nepovinn´. V´znam a vyuˇit´ jednotliv´ch y u e y a y z ı y blok˚ promˇnn´ch je detailnˇ pops´n v ˇ´sti 4. u e y e a ca Blok lok´ln´ promˇnn´ch m´ nasleduj´ ı v´znam: a ıch e y a ıc´ y • M˚ˇe obsahovat tak´ deklarace instanc´ dalˇ´ funkˇn´ blok˚. uz e ı sıch c ıch u • Vˇechny lok´ln´ promˇnn´ si udrˇuj´ svoji hodnotu po celou dobu existence in- s a ı e e z ı stance funkˇn´ bloku. c ıho Norma [5] umoˇnuje pˇed´vat v parametrech funkˇn´ bloku tak´ odkazy na in- zˇ r a c ıho e stanci jin´ho funkˇn´ bloku. Tato moˇnost nen´ ve vytvoˇen´m softwarov´m PLC e c ıho z ı r e e dostupn´. V nˇkter´ch pˇ´ a e y rıpadech by totiˇ bylo nutn´ zajistit kop´ z e ırovac´ konstruktor ı objektu, kter´m je funkˇn´ blok reprezentov´n. Problematick´ by t´ˇ bylo chov´n´ v y c ı a e ez a ı pˇ´ e pˇiˇazen´ instance funkˇn´ bloku deklarovan´ v r´mci jin´ho bloku programu rıpadˇ r r ı c ıho e a e do v´stupn´ nebo vstupnˇ/v´stupn´ promˇnn´. y ı e y ı e e Uk´zka 6.4 obsahuje vygenerovan´ k´d pro funkˇn´ blok z uk´zky 6.3. Z uk´zky je a y o c ı a a patrn´, ˇe vygenerovan´ k´d je rozdˇlen na hlaviˇkov´ soubor s definic´ tˇ´ reprezen- e z y o e c y ı rıdy tuj´ ı funkˇn´ blok a zdrojov´ soubor s implementac´ t´to tˇ´ ıc´ c ı y ı e rıdy. N´zev tˇ´ kter´ funkˇn´ blok reprezentuje je ve vygenerovan´m k´du rozˇ´ren o a rıdy, a c ı e o sıˇ prefix ”plcfb ”. To umoˇnuje deklarovat v r´mci programu r˚zn´ typy blok˚ se stejn´m zˇ a u e u y n´zvem. a 39
  • 47.
    ZPRACOVAN´ PROGRAMOVYCH BLOKU ´ I ´ ˚ Funkˇn´ bloky c ı FUNCTION_BLOCK name VAR_INPUT ... deklarace jednotliv´ch vstupn´ch promˇnn´ch ... y ı e y END_VAR VAR_OUTPUT ... deklarace jednotliv´ch v´stupn´ch promˇnn´ch ... y y ı e y END_VAR VAR_IN_OUT ... deklarace jednotliv´ch vstupnˇ/v´stupn´ch promˇnn´ch ... y e y ı e y END_VAR VAR ... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ... y a ı e y END_VAR ... k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL) o e s rı e ... END_FUNCTION_BLOCK Uk´zka 6.2: Deklarace funkˇn´ bloku. a c ıho FUNCTION_BLOCK ukazka VAR_INPUT x: INT; END_VAR VAR_OUTPUT y: INT; END_VAR VAR state: INT := 1; END_VAR LD state ADD 1 ST state MUL x ST y END_FUNCTION_BLOCK Uk´zka 6.3: Vstupn´ soubor pro uk´zku vygenerovan´ho k´du funkˇn´ bloku. a ı a e o c ıho 40
  • 48.
    ZPRACOVAN´ PROGRAMOVYCH BLOKU ´ I ´ ˚ Funkˇn´ bloky c ı // soubor s implementac´ tˇ´dy ı rı #include "ukazk.h" #include "plcfb_ukazka.h" #define RETURN() {ExitCall();return;} plcfb_ukazka :: plcfb_ukazka(void) { #line 3 "fb.plc" x = CPropertyIn<INT> (&m_x); #line 6 "fb.plc" y = CPropertyOut<INT> (&m_y); // deklarace tˇ´dy, rı #line 9 "fb.plc" // hlaviˇkov´ soubor c y m_state = CVariable<INT> ((INT) 1); #include <plc.h> } void plcfb_ukazka :: ExitCall(void) class plcfb_ukazka { { } private: plcfb_ukazka :: ~plcfb_ukazka(void) #line 3 "fb.plc" { CVariable<INT> m_x; } #line 6 "fb.plc" void plcfb_ukazka :: Function(void) CVariable<INT> m_y; { #line 9 "fb.plc" CResult result; CVariable<INT> m_state; #line 12 "fb.plc" public: { #line 3 "fb.plc" result = m_state; CPropertyIn<INT> x; } #line 6 "fb.plc" #line 13 "fb.plc" CPropertyOut<INT> y; { plcfb_ukazka(void); result = result + 1; virtual ~plcfb_ukazka(void); } void Function(void); #line 14 "fb.plc" void ExitCall(void); { }; result.GetValue(m_state); } #line 15 "fb.plc" { result = result * m_x; } #line 16 "fb.plc" { result.GetValue(m_y); } RETURN(); } Uk´zka 6.4: Vygenerovan´ k´d funkˇn´ bloku z uk´zky 6.3. a y o c ıho a 41
  • 49.
    ZPRACOVAN´ PROGRAMOVYCH BLOKU ´ I ´ ˚ Programov´ bloky e 6.2 Programov´ bloky e Programov´ bloky jsou obdobou funkˇn´ blok˚ popsan´ch v pˇedchoz´ ˇ´sti. Hlavn´ e c ıch u y r ı ca ı rozd´ spoˇ´ a v tom, ˇe tento typ blok˚ m´ automaticky generov´nu svoji unik´tn´ ıl cıv´ z u a a a ı instanci, kter´ je platn´ po celou dobu bˇhu PLC. Tato instance samozˇejmˇ uchov´v´ a a e r e a a hodnoty lok´ln´ promˇnn´ch. a ıch e y Programov´ bloky jsou urˇeny zejm´na pro spouˇtˇn´ jednotliv´ch vl´ken PLC pro- e c e se ı y a gramu, pˇ´rıpadnˇ pro jednor´zov´ spouˇtˇn´ napˇ. pˇi n´bˇˇn´ hranˇ sign´lu. Nicm´nˇ e a e se ı r r a ez e e a e e je lze volat i pˇ´ rımo v programu obdobnˇ jako funkˇn´ bloky, pˇiˇemˇ jako parametr e c ı rc z instrukce CAL se pouˇije pˇ´ z rımo n´zev programov´ho bloku. a e Struktura z´pisu programov´ho bloku je patrn´ z uk´zky 6.5 a je obdobn´ jako a e a a a struktura funkˇn´ bloku. c ıho PROGRAM name VAR_INPUT ... deklarace jednotliv´ch vstupn´ch promˇnn´ch ... y ı e y END_VAR VAR_OUTPUT ... deklarace jednotliv´ch v´stupn´ch promˇnn´ch ... y y ı e y END_VAR VAR_IN_OUT ... deklarace jednotliv´ch vstupnˇ/v´stupn´ch promˇnn´ch ... y e y ı e y END_VAR VAR ... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ... y a ı e y END_VAR ... k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL) o e s rı e ... END_PROGRAM Uk´zka 6.5: Deklarace programov´ho bloku. a e Vygenerovan´ k´d odpov´ a k´du funkˇn´ bloku z uk´zky 6.3, pouze prefix v y o ıd´ o c ıho a n´zvu tˇ´ je nahrazen ”plcp ” a v hlaviˇkov´m souboru je nadefinov´na glob´ln´ a rıdy c e a a ı promˇnn´ deklaruj´ ı instanci bloku pro vyuˇit´ v generovan´m k´du. e a ıc´ z ı e o 42
  • 50.
    ZPRACOVAN´ PROGRAMOVYCH BLOKU ´ I ´ ˚ Funkce 6.3 Funkce Funkce jsou nejjednoduˇˇ´ jednotky pro z´pis programu. Umoˇnuj´ pˇed´vat pouze vs- ssı a zˇ ı r a 1 tupn´ parametry pˇiˇemˇ jako prvn´ parametr funkce je pˇed´na aktu´ln´ hodnota ı rc z ı r a a ı z´sobn´ a ıku. Funkce mus´ pˇed´vat n´vratovou hodnotu, kter´ se stane aktu´ln´ hodno- ı r a a a a ı tou z´sobn´ a ıku. Zp˚sob deklarace funkce je patrn´ z uk´zky 6.6. Prvn´ ˇ´dek deklarace definuje u y a ı ra 2 kromˇ n´zvu funkce tak´ datov´ typ n´vratov´ hodnoty . e a e y a e FUNCTION name:DATATYPE VAR_INPUT ... deklarace jednotliv´ch vstupn´ch promˇnn´ch ... y ı e y END_VAR VAR ... deklarace jednotliv´ch lok´ln´ch promˇnn´ch ... y a ı e y END_VAR ... k´d programu ve zvolen´m jazyce (v naˇem pˇ´padˇ IL) o e s rı e ... END_FUNCTION Uk´zka 6.6: Deklarace funkce. a N´vratov´ hodnota funkce se nastav´ tak, ˇe se uloˇ´ hodnota do promˇnn´ s n´zvem a a ı z zı e e a shodn´m s n´zvem funkce (viz. uk´zka 6.7). y a a Kaˇd´ funkci deklarovan´ v k´du softwarov´ho PLC odpov´ a vygenerovan´ tˇ´ z e e o e ıd´ a rıda v jazyce C++. Vol´n´ funkce n´slednˇ spoˇ´ a ve vytvoˇen´ jednor´zov´ instance t´to a ı a e cıv´ r ı a e e tˇ´ rıdy. Tato instance tˇ´ zanikne po ukonˇen´ vol´n´ a pˇed´n´ n´vratov´ hodnoty rıdy c ı a ı r a ı a e do aktu´ln´ hodnoty z´sobn´ a ı a ıku. Jednor´zovost instance tˇ´ reprezentuj´ ı funkci je a rıdy ıc´ zajiˇtˇna vytvoˇen´ speci´ln´ name-space v jazyce C++3 . se r ım a ıho Uk´zka 6.9 uv´d´ vygenerovan´ k´d pro funkci z uk´zky 6.8. Jak je patrno, princip a a ı y o a generov´n´ k´du je shodn´ s generov´n´ k´du pro pˇedchoz´ programov´ bloky. N´zev a ı o y a ım o r ı e a vygenerovan´ tˇ´ je rozˇ´ren o prefix ”plcf ”. e rıdy sıˇ 1 Ze zp˚sobu pˇed´v´n´ hodnot parametr˚ vypl´v´, ˇe kaˇd´ funkce mus´ m´ alespoˇ jeden vstupn´ u r a a ı u y a z z a ı ıt n ı parametr. 2 Jedn´ se o poloˇku DATATYPE, kter´ je oddˇlena od n´zvu funkce pomoc´ ”:”. a z a e a ı 3 s’ Namespace zajiˇt uje platnost instanc´ vˇech tˇ´ a je ohraniˇen pomoc´ {} ı s rıd c ı 43
  • 51.
    ZPRACOVAN´ PROGRAMOVYCH BLOKU ´ I ´ ˚ Funkce FUNCION exp:INT VAR_INPUT int Value; END_VAR LD Value ... ST exp (* Aktu´ln´ hodnotu z´sobn´ku vloˇ´m do n´vratov´ *) a ı a ı zı a e (* hodnoty funkce *) ... END_FUNCTION Uk´zka 6.7: Zp˚sob nastaven´ n´vratov´ hodnoty funkce. a u ı a e FUNCTION min: DINT VAR_INPUT val1: DINT; val2: DINT; END_VAR LD val1 ST min LT val2 RETC LD val2 ST min END_FUNCTION Uk´zka 6.8: Vstupn´ k´d pro uk´zku generovan´ho k´du funkce. a ı o a e o 44
  • 52.
    ZPRACOVAN´ PROGRAMOVYCH BLOKU ´ I ´ ˚ Funkce // Soubor s implementac´ tˇ´dy ı rı #define RETURN() return; plcf_min :: plcf_min(void) { #line 3 "function.plc" parm0 = CPropertyIn<DINT> (&m_val1); #line 4 "function.plc" parm1 = CPropertyIn<DINT> (&m_val2); } plcf_min :: ~plcf_min(void) { // deklarace tˇ´dy, rı } // hlaviˇkov´ soubor c y const CVariable<DINT> &plcf_min :: #include <plc.h> GetResult(void) class plcf_min { { return(this->m_min); private: } CVariable<DINT> m_min; void plcf_min :: Function(void) #line 3 "function.plc" { CVariable<DINT> m_val1; CResult result; #line 4 "function.plc" #line 7 "function.plc" CVariable<DINT> m_val2; { public: result = m_val1; #line 3 "function.plc" } CPropertyIn<DINT> parm0; #line 8 "function.plc" #line 4 "function.plc" { CPropertyIn<DINT> parm1; result.GetValue(m_min); } plcf_min(void); #line 9 "function.plc" virtual ~plcf_min(void); { void Function(void); result = (result < m_val2); const CVariable<DINT>& } GetResult(void); #line 10 "function.plc" }; if (result != 0) RETURN(); #line 12 "function.plc" { result = m_val2; } #line 13 "function.plc" { result.GetValue(m_min); } } Uk´zka 6.9: Vygenerovan´ k´d funkce z uk´zky 6.8. a y o a 45
  • 53.
    Kapitola 7 Konfigurace softwarov´hoPLC e Tato ˇ´st se zab´v´ speci´ln´ blokem CONFIGURATION definovan´m v [5]. Tento ca y a a ım y blok slouˇ´ zı: • K deklaraci glob´ln´ promˇnn´ch dostupn´ch v programu. a ıch e y y • K definici uloh (definuj´ parametry pro spouˇtˇn´ blok˚ typu program). ´ ı se ı u • K pˇiˇazen´ uloh k jednotliv´m blok˚m typu program. rr ı´ y u Uk´zka 7.1 uv´d´ strukturu bloku typu CONFIGURATION se z´kladn´ pod- a a ı a ımi bloky, kter´ jsou vybr´ny pro implementaci v softwarov´m PLC. Norma [5] definuje e a e jeˇtˇ dalˇ´ podbloky, kter´ nejsou pro bˇh softwarov´ho PLC tˇeba. se sı e e e r Blok s glob´ln´ promˇnn´mi obsahuje deklarace glob´ln´ promˇnn´ch tak, jak a ımi e y a ıch e y je pops´no v kapitole 4. Promˇnn´ mohou b´t bud a e e y ’ standardn´ datov´ch typ˚, nebo ıch y u se m˚ˇe jedna o glob´ln´ deklarace funkˇn´ blok˚. uz a ı c ıch u Blokem RESOURCE se podrobnˇji zab´v´ n´sleduj´ ı ˇ´st 7.1. e y a a ıc´ ca Blok CONFIGURATION v generovan´m k´du m´ tedy za ukol definovat podklady e o a ´ pro vytvoˇen´ funkc´ potˇebn´ch pro spuˇtˇn´ a ukonˇen´ softwarov´ho PLC (zaveden´ r ı ı r y se ı c ı e ı kernel modulu softwarov´ho PLC do pamˇti a jeho vyjmut´ e e ı). 7.1 Struktura bloku RESOURCE Tato ˇ´st se zab´v´ v´znamem a obsahem bloku RESOURCE. Informace zde uveden´ ca y a y e jsou ˇerp´ny z [5]. c a Jak je patrno z uk´zky 7.1, m˚ˇe i tento blok obsahovat deklaraci glob´ln´ a uz a ıch promˇnn´ch stejnˇ jako pˇ´ e y e rımo blok CONFIGURATION. Po pˇ´ rıpadn´ deklaraci glob´ln´ promˇnn´ch jiˇ n´sleduje definice uloh (TASK) e a ıch e y z a ´ a pˇiˇazen´ tˇchto uloh jednotliv´m blok˚m typu program. To zajist´ spuˇtˇn´ soft- rr ı e ´ y u ı se ı warov´ho PLC. e 46
  • 54.
    ´ KONFIGURACE SOFTWAROVEHO PLC Struktura bloku RESOURCE CONFIGURATION name VAR_GLOBAL ... variable ... END_VAR RESOURCE xx ON yy VAR_GLOBAL ... variable ... END_VAR ... TASK TaskName(INTERVAL:=T#0.1ms); ... ... PROGRAM p1 WITH TaskName: ProgramName(); ... END_RESOURCE END_CONFIGURATION Uk´zka 7.1: Struktura bloku CONFIGURATION. a 7.1.1 Struktura blok˚ TASK u Bloky TASK definuj´ vlastnosti pro spouˇtˇn´ blok˚ PROGRAM. Jedn´ se tedy o ı se ı u a parametry, dle kter´ch budou n´slednˇ vytvoˇeny real-time vl´kna v r´mci RT-Linuxov´ho y a e r a a e j´dra. Blok˚m tud´z pˇ´ a u ıˇ rımo neodpov´ a ˇ´dn´ generovan´ k´d. ıd´ za y y o V uk´zce 7.2 je uveden pˇehled vˇech parametr˚, kter´ se mohou v definici TASK a r s u e bloku vyskytnout. TASK name([INTERVAL := T#50ms][, PRIORITY := 2][, SINGLE := %Q2.1]); Uk´zka 7.2: Struktura bloku TASK a jeho z´pis. a a Tab.7.1 obsahuje popis jednotliv´ch parametr˚ bloku a jejich v´znam v r˚zn´ch y u y u y kontextech. 47
  • 55.
    ´ KONFIGURACE SOFTWAROVEHO PLC Struktura bloku RESOURCE Parametr Popis name N´zev bloku, pouˇit´ v okamˇiku pˇiˇazen´ TASK bloku typu a z y z rr ı PROGRAM. INTERVAL Definuje interval, se kter´m je spouˇtˇno vl´kno, kter´ m´ y se a e a pˇiˇazeno tento TASK. rr PRIORITY Priorita vl´kna, kter´mu je TASK pˇiˇazen. Hodnota v rozsahu a e rr 0−50, 0 odpov´ a nejvyˇˇ´ prioritˇ, 50 odpov´ a nejvyˇˇ´ prioritˇ. ıd´ s sı e ıd´ ssı e SINGLE Pokud je hodnota parametru INTERVAL r˚zn´ od 0, pak defin- u a uje, ˇe blok typu PROGRAM m´ b´t spouˇtˇn periodicky pouze z a y se v pˇ´ e, ˇe hodnota vstupu SINGLE je log.0. Jestliˇe INTER- rıpadˇ z z VAL je 0, pak blok je spouˇtˇn pouze v pˇ´ e, ˇe na vstupu se rıpadˇ z SINGLE byla detekov´na n´bˇˇn´ hrana. Hodnota vstupu m˚ˇe a a ez a uz b´t reprezentov´na bud’ pˇ´ adresou nebo glob´ln´ promˇnnou. y a rımo a ı e Tabulka 7.1: V´znam a popis parametr˚ bloku TASK. y u 7.1.2 Struktura blok˚ PROGRAM u Bloky typu PROGRAM v r´mci deklarace RESOURCE slouˇ´ k pˇiˇazen´ blok˚ TASK a zı rr ı u k jednotliv´m programov´m blok˚m PROGRAM1 . V´sledkem je pro vˇechny bloky y y u y s typu PROGRAM, kter´ jsou zde uvedeny, vygenerov´n´ samostatn´ho real-time vl´kna, e a ı e a kter´ dle parametr˚ uveden´ch v bloku TASK spouˇt´ pˇ´ sn´ blok PROGRAM. e u y s ı rısluˇ y Pokud v deklaraci chyb´ pˇiˇazen´ bloku TASK, mˇl by b´t blok dle [5] spouˇtˇn ı rr ı e y se trvale s nejniˇˇ´ moˇnou prioritou vˇdy, kdyˇ m´ procesor voln´ ˇas. Podm´ zsı z z z a yc ınka t´kaj´ ı y ıc´ se spouˇtˇn´ vˇdy, kdyˇ m´ procesor voln´ ˇas mus´ b´t pro vytv´ˇen´ softwarov´ PLC se ı z z a yc ı y ar e e modifikov´na. a V pˇ´ e, ˇe by totiˇ vˇdy existovalo nˇjak´ RT-Linuxov´ vl´kno, kter´ m´ bˇˇet rıpadˇ z z z e e e a e a ez a tud´z by nez˚stal ˇ´dn´ voln´ procesorov´ ˇas, nedostalo by se ke slovu p˚vodn´ ıˇ u za y y y c u ı Linuxov´ j´dra. To by vedlo k ”zatuhnut´ cel´ho syst´mu. Proto jsou i tyto ulohy e a ı” e e ´ spouˇtˇny periodicky s t´ ˇe periodu spouˇtˇn´ je moˇn´ zvolit z pˇ´ se ım, z se ı z e rıkazov´ho ˇ´dku. e ra Deklarace pˇiˇazen´ TASK k bloku PROGRAM je patrna z uk´zky 7.3. V´znam rr ı a y jednotliv´ch parametr˚ je uveden v tab.7.2. y u PROGRAM Name [WITH TaskName]: ProgramName([Parm1 := value1[, ...]]); Uk´zka 7.3: Pˇiˇazen´ definovan´ho TASK k bloku typu PROGRAM v r´mci bloku a rr ı e a RESOURCE. 1 Ve v´znamu bloku pro z´pis programu z kapitoly 6. y a 48
  • 56.
    ´ KONFIGURACE SOFTWAROVEHO PLC Struktura bloku RESOURCE N´zev a Popis Name Unik´tn´ n´zev definovan´ho vl´kna. a ı a e a TaskName N´zev bloku TASK, jehoˇ parametry se pouˇij´ pˇi definici a z z ı r vl´kna. a ProgramName N´zev bloku typu PROGRAM, kter´ bude spouˇtˇn s a y se parametry TASK. Parm1 Pokud m´ blok parametry, obsahuje ˇ´rkou oddˇlen´ a ca e e parametry s pˇiˇazenou hodnotou. Hodnota m˚ˇe b´t bud’ rr uz y konstanta, adresa v pamˇti PLC nebo glob´ln´ promˇnn´. e a ı e a Tabulka 7.2: Popis a v´znam parametr˚ pˇi definici spouˇtˇn´ programu. y u r se ı Uk´zka 7.5 uv´d´ vygenerovan´ k´d v C++, kter´ odpov´ a definici z uk´zky 7.4. a a ı y o y ıd´ a Je z n´ patrn´, ˇe kaˇd´ vytvoˇen´ real-time vl´kno je oznaˇeno pro pl´novaˇ proces˚ ı e z z e r e a c a c u jako vyuˇ´ ıc´ FPU. D˚vodem je moˇnost vyuˇit´ datov´ho typu real kdekoliv v r´mci zıvaj´ ı u z z ı e a PLC programu. Z toho plyne nutnost zajistit bezkonfliktn´ vyuˇit´ FPU v r´mci cel´ho ı z ı a e operaˇn´ syst´mu. c ıho e PROGRAM init VAR_INPUT stav: INT; END_VAR END_PROGRAM CONFIGURATION test RESOURCE xx ON yy TASK pok1(INTERVAL:=T#20ms, SINGLE:=%QX1.0); PROGRAM p1 WITH pok1: init(stav := %QB0); END_RESOURCE END_CONFIGURATION Uk´zka 7.4: Definice spouˇtˇn´ PLC vl´ken. a se ı a 49
  • 57.
    ´ KONFIGURACE SOFTWAROVEHO PLC Struktura bloku RESOURCE #include <rtl_cpp.h> CMemory<PLC_MEMORY_SIZE> g_KernelPLCMemory; static void *PCallp1(void *pParms) { struct sched_param p; p.sched_priority = 50; pthread_setschedparam(pthread_self(), SCHED_FIFO, &p); pthread_make_periodic_np(pthread_self(), gethrtime(), 20000000); while(1) { pthread_wait_np(); if (CVariable<BOOL>("QX1.0", 0) != 0) { gprog_plcp_init.stav = CVariable<BIT>("QB0"); gprog_plcp_init.Function(); } } return NULL; } #define THREADS_COUNT 1 static pthread_t threads[THREADS_COUNT]; extern "C" { int init_module(void) { int iRetv = 0, iCount = 0; pthread_attr_t attr; __do_global_ctors_aux(); pthread_attr_init(&attr); pthread_attr_setfp_np(&attr); iRetv += pthread_create(&threads[iCount++], attr, PCallp1, NULL); return iRetv; } void cleanup_module(void) { for (int i = 0; i < THREADS_COUNT; i++) { pthread_delete_np(threads[i]); } __do_global_dtors_aux(); } } MODULE_LICENSE("GPL"); Uk´zka 7.5: Vygenerovan´ k´d odpov´ ıc´ uk´zce 7.4. a y o ıdaj´ ı a 50
  • 58.
    Kapitola 8 Podpora proRT-Linux Tato kapitola se zab´v´ vytvoˇenou podporou pro RT-Linux. V ˇ´sti 8.1 je pops´na y a r ca a podp˚rn´ knihovna potˇebn´ pro kompilaci modul˚ softwarov´ho PLC, ˇ´st 8.2 se u a r a u e ca zab´v´ tvorbou ovladaˇ˚ pro vstupn´ a v´stupn´ zaˇ´ ı. C´ y a cu ı y ı rızen´ ˇ ast 8.3 se zab´v´ potˇebnou y a r podporou pˇ´ rımo v j´dˇe RT-Linuxu. a r Obr.8.1 uv´d´ pro uplnost schematick´ n´ˇrt cel´ho vytvoˇen´ho softwarov´ho PLC. a ı ´ y ac e r e e ˇ Sipky v obr´zku naznaˇuj´ jak´m zp˚sobem prob´ a vnitˇn´ komunikace mezi jed- a c ı, y u ıh´ r ı notliv´mi ˇ´stmi softwarov´ho PLC. y ca e 8.1 Knihovna Podp˚rn´ knihovna umoˇnuj´ ı kompilaci k´du vygenerovan´ho pomoc´ konverzn´ u a zˇ ıc´ o e ı ıho programu plc2cpp se skl´d´ z nˇkolika ˇ´st´ kter´ spolu navz´jem souvisej´ Jednotliv´ a a e ca ı, e a ı. e ˇ´sti, kter´ jsou implementov´ny v r´mci podp˚rn´ knihovny, jsou na obr.8.1 oznaˇeny ca e a a u e c v r´meˇc´ s ˇed´m podkladem. a c ıch s y Tab.8.1 uv´d´ pˇehled jednotliv´ch tˇ´ kter´ podp˚rn´ knihovna implementuje. a ı r y rıd, e u a Ke kaˇd´ tˇ´ e je z´roveˇ uveden jej´ kr´tk´ popis a v´znam. z e rıdˇ a n ı a y y 8.1.1 Emulace pamˇti PLC e Emulace pˇ´ rıstupu do pamˇti pomoc´ adres tak, jak je definov´no v [5] implemen- e ı a tuje tˇ´ CMemory1 . Ta pro pˇ´ rıda rıstup do pamˇti umoˇnuje adresaci dle normy vˇetnˇ e zˇ c e pˇ´ rıstupu na digit´ln´ vstupy/v´stupy. V pˇ´ e, ˇe se jedn´ o adresu v intern´ PLC a ı y rıpadˇ z a ı pamˇti, je pˇ´ e rıstup zpracov´n pˇ´ a rımo tˇ´rıdou CMemory. Pokud se jedn´ o pˇ´ a rıstup do pamˇti odpov´ ıc´ adresaci digit´ln´ vstup˚/v´stup˚, e ıdaj´ ı a ıch u y u je ˇ´ ı pˇed´no ovladaˇi definovan´mu tˇ´ rızen´ r a c e rıdou CPLCDrivers. Podrobnˇjˇ´ popis lze e sı nal´zt v ˇ´sti 8.2. e ca 1 Implementace v souboru cmemory.h 51
  • 59.
    PODPORA PRO RT-LINUX Knihovna Obr´zek 8.1: Schema vytvoˇen´ho softwarov´ho PLC. a r e e 8.1.2 Podpora promˇnn´ch PLC e y Podpora promˇnn´ch je implementov´na v template tˇ´ CVariable2 . Tato template e y a rıde tˇ´ implementuje n´sleduj´ ı operace: rıda a ıc´ • Specifikovat datov´ typ promˇnn´ tak, jak je definov´no v [5]. y e e a • Specifikovat inicializaˇn´ hodnotu promˇnn´ pˇi deklaraci. c ı e e r e’ e • Specifikovat adresu v pamˇt ov´m prostoru emulovan´ho PLC. Tato adresa samozˇejmˇ e r e m˚ˇe b´t i adresa vstupu nebo v´stupu, je-li k t´to adrese zaregistrov´n nˇkter´ uz y y e a e y ovladaˇ ve spr´vci zaˇ´ ı (viz. d´le). c a rızen´ a 2 Implementace v souboru cvariable.h 52
  • 60.
    PODPORA PRO RT-LINUX Knihovna N´zev tˇ´ a rıdy Popis CVariable Tˇ´ rıda vyuˇ´ a k deklaraci promˇnn´ch ve vygen- zıvan´ e y erovan´m C++ k´du. Podporuje adresaci PLC pamˇti, e o e pokud m´ promˇnn´ tuto adresu v deklaraci speci- a e a fikov´nu. a CPropertyIn Tˇ´ rıda pouˇ´ a ve vygenerovan´m C++ k´du pro zıvan´ e o reprezentaci vstupn´ ıch parametr˚ funkc´ funkˇn´ u ı, c ıch blok˚ a programov´ch blok˚. u y u CPropertyOut Tˇ´ rıda vyuˇ´ a ve vygenerovan´m C++ k´du pro zıvan´ e o reprezentaci v´stupn´ parametr˚ funkˇn´ blok˚ a y ıch u c ıch u programov´ch blok˚. y u CPropertyIO Tˇ´ rıda vyuˇ´ a ve vygenerovan´m C++ k´du pro zıvan´ e o reprezentaci vstupnˇ-v´stupn´ parametr˚ funkˇn´ e y ıch u c ıch blok˚ a programov´ch blok˚. u y u CMemory Tˇ´ rıda, kter´ implementuje emulaci PLC pamˇti, za- a e pouzdˇuje funkcionalitu pro pˇ´ r rıstup k adres´m vnitˇn´ a r ı pamˇti, vstup˚m a v´stup˚m. Pro pˇ´ e u y u rıstup k vstup˚m au v´stup˚m vyuˇ´ a instanci tˇ´ CDeviceManager. y u zıv´ rıdy CResult Tˇ´ reprezentuj´ ı aktu´ln´ hodnotu z´sobn´ rıda ıc´ a ı a ıku. CDeviceDriver Virtu´ln´ tˇ´ vyuˇ´ a pro tvorbu ovladaˇ˚ vstup˚ a a ı rıda zıvan´ cu u v´stup˚. y u CDeviceManager Tˇ´ rıda spravuj´ ı instance jednotliv´ch ovladaˇ˚ a ıc´ y cu s ’ ıc´ zajiˇt uj´ ı mapov´n´ adresy vstupu/v´stupu na a ı y pˇ´ sn´ ovladaˇ zaˇ´ ı. rısluˇ y c rızen´ CMutex Tˇ´ zapouzdˇuj´ ı funkcionalitu mutex˚ pro zamyk´n´ rıda r ıc´ u a ı kritick´ch ˇ´st´ ovladaˇ˚ PLC zaˇ´ ı. y ca ı cu rızen´ CSpinLock Tˇ´ rıda zapouzdˇuj´ ı funkcionalitu mutex˚ pro za- r ıc´ u myk´n´ kritick´ch ˇ´st´ ovladaˇ˚ PLC zaˇ´ ı (spin- a ı y ca ı cu rızen´ lock je funkˇnˇ podobn´ mutexu. Rozd´ je v tom, c e y ıl ˇe po uzamˇen´ oblasti pomoc´ spinlocku je zak´z´no z c ı ı a a pˇeruˇen´ a tud´z prov´dˇn´ k´d nem˚ˇe b´t pˇeruˇen r s ı ıˇ a e y o uz y r s schedulerem). Tabulka 8.1: Pˇehled tˇ´ implementovan´ch v podp˚rn´ knihovnˇ pro PLC. r rıd y u e e 8.1.3 Podpora parametr˚ pro vol´n´ programov´ch blok˚ u a ı y u Podpora pro pˇed´v´n´ parametr˚ programov´m blok˚ je implementov´na v template r a a ı u y u a tˇ´ ach CPropertyIn, CPropertyOut a CPropertyIO. Pˇi deklaraci parametru se defin- rıd´ r uje typ parametru (vstupn´ v´stupn´ vstupnˇ-v´stupn´ a d´le se parametru pˇiˇazuje ı, y ı, e y ı) a rr 53
  • 61.
    PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚ c a ıch u y u a rıdou CVariable3 , kter´ se pouˇ´ a v r´mci vygenerovan´ho promˇnn´ reprezentovan´ tˇ´ e a a zıv´ a e C++ k´du v programovac´ jazyce PLC pro pˇ´ o ım rıstup k hodnotˇ parametru. e 8.1.4 Emulace aktu´ln´ hodnoty z´sobn´ a ı a ıku Aktu´ln´ hodnota z´sobn´ nebo t´ˇ tzv. current-result je reprezentov´na tˇ´ a ı a ıku, ez a rıdou CRe- 4 sult . Tato tˇ´ m´ n´sleduj´ ı vlastnosti: rıda a a ıc´ • Uchov´v´ v´sledek posledn´ proveden´ operace vˇetnˇ informace o jej´ datov´m a a y ı e c e ım e typu. • Implementuje oper´tory pro matematick´ a porovn´vac´ operace. a e a ı • Umoˇnuje nastavit aktu´ln´ hodnotu z´sobn´ na hodnotu PLC promˇnn´(template zˇ a ı a ıku e e tˇ´ CVariable). rıda • Umoˇnuje nastavit aktu´ln´ hodnotu z´sobn´ na hodnotu PLC parametru zˇ a ı a ıku funkˇn´ nebo programov´ho bloku. c ıho e 8.2 Ovladaˇe karet digit´ln´ vstup˚ ystup˚ c a ıch u/v´ u Pˇ´ rıstup na hardwarov´ karty pro digit´ln´ vstupy/v´stupy je rozdˇlen na dvˇ urovnˇ e a ı y e e´ e (viz. obr.8.1). Nejvyˇˇ´ uroveˇ je reprezentov´na tˇ´ ssı ´ n a rıdou CDeviceManager, kter´ je a vol´na z objektu CMemory (objekt pro emulaci pamˇti PLC). a e Tato tˇ´ udrˇuje seznam aktivn´ ovladaˇ˚ karet pro PLC, pˇiˇemˇ zajiˇt uje rıda z ıch cu rc z s’ pˇed´n´ vol´n´ ovladaˇi pˇ´ sn´ho hardwarov´ho zaˇ´ ı a zpracov´n´ poˇadavku. r a ı a ı c rısluˇ e e rızen´ a ı z Vlastn´ seznam ovladaˇ˚ je vytvoˇen jako pole statick´ velikosti obsahuj´ ı odkazy ı cu r e ıc´ na jednotliv´ registrovan´ ovladaˇe5 . Pˇi vyhled´v´n´ ovladaˇe odpov´ ıc´ e e c r a a ı c ıdaj´ ımu zadan´ e adrese se cyklicky proch´z´ toto pole a ovladaˇ je zde vyhled´n. Pokud by bylo pouˇito a ı c a z vˇtˇ´ mnoˇstv´ aktivn´ ovladaˇ˚, pak by bylo moˇno vytvoˇit seznam ovladaˇ˚ jako e sı z ı ıch cu z r cu vyhled´vac´ strom pro zv´ˇen´ rychlosti vyhled´n´ zaˇ´ ı, kter´ odpov´ a poˇadovan´ a ı ys ı a ı rızen´ e ıd´ z e adrese. Vzhledem k tomu, ˇe lze pˇedpokl´dat za norm´ln´ okolnost´ pouze jednotky z r a a ıch ı pouˇit´ch ovladaˇ˚, lze pouˇit´ ˇeˇen´ povaˇovat za dostateˇnˇ efektivn´ z y cu z er s ı z c e ı. e e’ e N´slednˇ je v pamˇt ov´m kontextu linuxov´ho j´dra k dispozici instance tohoto ob- a e a jektu s n´zvem g KernelPLCDrivers, kter´ je vyuˇ´ ana vytvoˇen´m softwarov´m PLC a a zıv´ r y y i zaregistrovan´mi ovladaˇi. Tato instance je vytvoˇena zaveden´ modulu plc devicemanager.o y c r ım do linuxov´ho j´dra a mus´ b´t dostupn´ pˇed nahr´n´ e a ı y a r a ım: • Vlastn´ modulu, kter´ reprezentuje emulovan´ PLC. ıho y e 3 Obˇ template tˇ´ jsou deklarov´ny se stejn´m parametrem ˇablony (stejn´m vnitˇn´ datov´m e rıdy a y s y r ım y typem). 4 Implementace v souboru cresult.h 5 Je tedy tˇeba bˇhem pˇekladu modul˚ odhadnout, kolik ovladaˇ˚ bude maxim´lnˇ pouˇito a r e r u cu a e z velikost pole spr´vnˇ nastavit. a e 54
  • 62.
    PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚ c a ıch u y u • Jak´hokoliv pouˇ´ eho ovladaˇe. e zıvan´ c Modul lze zav´st do pamˇti jedn´ z n´sleduj´ ıch zp˚sob˚6 : e e ım a ıc´ u u • V pˇ´ e, ˇe je softwarov´ PLC nainstalov´no a modul je dostupn´ ve stan- rıpadˇ z e a y dardn´ adres´ˇi modul˚ j´dra: ım ar u a ]# modprobe plc_devicemanager • V pˇ´ e, ˇe se modul nach´z´ v jin´m adres´ˇi7 : rıpadˇ z a ı e ar ]# insmod cesta/plc_devicemanager.o 8.2.1 Tvorba ovladaˇe I/O karty c Tvorbu ovladaˇe I/O zaˇ´ ı lze rozdˇlit na dvˇ ˇ´sti: c rızen´ e e ca 1. Nejprve je tˇeba vytvoˇit odvozenou tˇ´ od tˇ´ CDeviceDriver, kter´ imple- r r rıdu rıdy a mentuje virtu´ln´ metody tˇ´ z uk´zky 8.1 volan´ pˇi pˇ´ a ı rıdy a e r rıstupu na zaˇ´ ı. rızen´ Popis virtu´ln´ metod je uveden v tab.8.2. a ıch 2. Pot´ je tˇeba vytvoˇit modul j´dra RT-Linuxu, kter´ bˇhem sv´ho zav´dˇn´ do e r r a y e e a e ı pamˇti provede registraci instance tˇ´ vytvoˇen´ v pˇedchoz´ kroku do spr´vce e rıdy r e r ım a PLC zaˇ´ ı. Registrac´ do spr´vce zaˇ´ ı ovladaˇ ozn´m´ kter´ adresn´ rozsahy rızen´ ı a rızen´ c a ı, e ı vstup˚ a v´stup˚ obsluhuje a maj´ mu tedy b´t pˇed´ny. Registraci lze prov´st u y u ı y r a e metodou RegisterDriver() z´kladn´ objektu CDeviceDriver. a ıho N´zev metody a ReadAddress() Virtu´ln´ metoda volan´ v pˇ´ e, ˇe je tˇeba ze a ı a rıpadˇ z r zaˇ´ ı pˇeˇ´ aktu´ln´ hodnotu zadan´ adresy. rızen´ r cıst a ı e SetAddress() Virtu´ln´ metoda volan´ v pˇ´ e, ˇe je tˇeba z pro- a ı a rıpadˇ z r gramu nastavit hodnotu nˇkter´ adresy, kter´ odpov´ a e e a ıd´ tomuto ovladaˇi. c DriverInfo() Metoda vracej´ ı n´zev a popis ovladaˇe. Je vyuˇ´ ana ıc´ a c zıv´ pˇi zobrazov´n´ informac´ t´kaj´ ıch se ovladaˇe. r a ı ı y ıc´ c Tabulka 8.2: Popis virtu´ln´ metod definovan´ch ve tˇ´ e CDeviceDriver. a ıch y rıdˇ Jako pˇ´ rıklad pro tvorbu ovladaˇe lze vyuˇ´ komentovan´ zdrojov´ k´dy vytvoˇen´ch c zıt e e o r y ovladaˇ˚, kter´ jsou pops´ny n´ze. cu e a ıˇ Kaˇd´ z n´sleduj´ ıch ovladaˇ˚ umoˇnuje pˇi zav´dˇn´ modulu specifikovat tak´ z y a ıc´ cu zˇ r a e ı e PLC adresy, na kter´ch bude ovladaˇ dostupn´. Pˇehled je k dispozici v tab.8.3. y c y r Ovladaˇ lze zav´st do pamˇti pomoc´ n´sleduj´ ıho pˇ´ c e e ı a ıc´ rıkazu: 6 Pˇ´ rıpadnˇ lze zaveden´ modulu zajistit napˇ. startovac´ skriptem pˇi spouˇtˇn´ operaˇn´ e ı r ım r se ı c ıho syst´mu. e 7ˇ C´st cesta v um´ en´ modulu m˚ˇe b´t absolutn´ nebo relativn´ cesta k modulu. a ıstˇ ı uz y ı ı 55
  • 63.
    PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚ c a ıch u y u class CDeviceDriver { ... public: virtual int ReadAddress(void *Value, int iValueSize, int iInputAddr, int iByteAddress, int iBitAddress ) = 0; virtual int SetAddress(void *Value, int iValueSize, int iInputAddr, int iByteAddress, int iBitAddress ) = 0; virtual const char* DriverInfo(void) = 0; ... }; Uk´zka 8.1: Virtu´ln´ metody pro implementaci ovladaˇe. a a ı c Parametr Popis iladdr Parametr specifikuj´ ı z´kladn´ adresu, na ıc´ a ı kter´ bude ovladaˇ dostupn´ pˇi adresov´n´ e c y r a ı vstup˚. Pokud je tedy napˇ. hodnota u r iladdr=10, bude prvn´ adresa zaˇ´ ı dos- ı rızen´ tupn´ jako %IB10. Pokud parametr nen´ a ı specifikov´n, je zaˇ´ ı adresov´no od %IB0. a rızen´ a oladdr Parametr specifikuj´ ı z´kladn´ adresu, na ıc´ a ı kter´ bude ovladaˇ dostupn´ pˇi adresov´n´ e c y r a ı v´stup˚. Pokud je tedy napˇ. hodnota y u r oladdr=7, bude prvn´ adresa zaˇ´ ı dos- ı rızen´ tupn´ jako %QB7. Pokud parametr nen´ a ı specifikov´n, je zaˇ´ ı adresov´no od a rızen´ a %QB0. Tabulka 8.3: Pˇehled spoleˇn´ch parametr˚ pro moduly ovladaˇ˚. r c y u cu ]# insmod plc_lpt.o [iladdr=2] [oladdr=3] Parametry modulu jsou nepovinn´, pˇedpokl´d´ se, ˇe je jiˇ zaveden modul spr´vce e r a a z z a ovladaˇ˚ plc devicemanager.o. N´zev modulu plc lpt.o je tˇeba samozˇejmˇ nahradit cu a r r e 56
  • 64.
    PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚ c a ıch u y u pˇ´ sn´m n´zvem modulu, kter´ chceme nahr´t do pamˇti. rısluˇ y a y a e Ovladaˇ PCI karty Advantech c Ovladaˇ dodan´ karty Advantech PCI LabCard 1750 je vytvoˇen velice jednoduˇe. c e r s Ovladaˇ si internˇ udrˇuje informace o vˇech aktu´ln´ hodnot´ch v´stup˚. Tyto c e z s a ıch a y u hodnoty jsou pak ovladaˇem navr´ceny v pˇ´ e, ˇe uˇivatel z programu ˇte hodnotu c a rıpadˇ z z c v´stupu. Pokud uˇivatel zap´se na v´stup novou hodnotu, je intern´ informace aktual- y z ıˇ y ı izov´na a na v´stupy je okamˇitˇ zaps´na poˇadovan´ hodnota. V pˇ´ e, ˇe uˇivatel a y z e a z a rıpadˇ z z ˇte hodnoty vstup˚, je aktu´ln´ hodnota z´ ana pˇi kaˇd´m poˇadavku. c u a ı ısk´ r z e z Ovladaˇ by bylo moˇno upravit tak, ˇe by vzorkoval hodnoty pomoc´ vlastn´ real- c z z ı ıho time vl´kna maxim´ln´ pˇ´ a a ı rıpustnou frekvenc´ a uˇivatel by vˇdy z´ ı z z ıskal pouze aktu´ln´ a ı navzorkovanou hodnotu. Ovladaˇ paraleln´ portu c ıho Ovladaˇ standardn´ paraleln´ portu je vytvoˇen s ohledem na ulohu ˇ´ ı ot´ˇek c ıho ıho r ´ rızen´ ac motorku. Popis a v´znam jednotliv´ch adres je uveden v tab.8.4. y y Adresa Velikost V´znam y 0x00 1byte V´stupn´ adresa, pˇi z´pisu odpov´ a z´pisu y ı r a ıd´ a na adresu 0x378 (z´pisu na z´kladn´ adresu a a ı paraleln´ portu). ıho 0x00 1byte Vstupn´ adresa, pˇi ˇten´ odpov´ a ˇten´ ı r c ı ıd´ c ı adresy 0x379 (ˇten´ z´kladn´ adresy par- c ı a ı aleln´ portu + 0x1). ıho 0x01.0 1bit Vstupn´ adresa, v pˇ´ e, ˇe obsahuje ı rıpadˇ z log.1, bylo vyvol´no pˇeruˇen´ od paraleln´ a r s ı ıho portu. Po pˇeˇten´ hodnoty je automaticky r c ı nastaveno zpˇt na log.0. e Tabulka 8.4: V´znam jednotliv´ch adres ovladaˇe paraleln´ portu. y y c ıho ´ Uloha ˇ´ ı motorku tento ovladaˇ vyuˇ´ a k vytvoˇen´ PID regul´toru pro regulaci rızen´ c zıv´ r ı a ot´ˇek pomoc´ PID regul´toru. ac ı a N´zev modulu ovladaˇe paraleln´ portu je plc lpt.o. a c ıho Ovladaˇ pro komunikaci s user-space Linuxu c Tento ovladaˇ slouˇ´ ke komunikaci s user-space Linuxu. Pomoc´ vstupn´ adres lze c zı ı ıch nastavovat hodnoty PLC adres z user-space ˇ´sti Linuxu, pomoc´ adres v´stupn´ lze ca ı y ıch z´ avat z user-space ˇ´sti hodnoty promˇnn´ch PLC. ısk´ ca e y 57
  • 65.
    PODPORA PRO RT-LINUX Ovladaˇe karet digit´ln´ vstup˚/v´stup˚ c a ıch u y u Pro komunikaci mezi kernel-space a user-space je vyuˇiv´no jedno RT-Linux FIFO z a pro z´pis promˇnn´ch do PLC, jedno pro ˇten´ promˇnn´ch z PLC a jedno pro nas- a e y c ı e y tavov´n´ parametr˚ ovladaˇe. a ı u c Ovladaˇ poskytuje 64 adres pro vstupy a 64 adres pro v´stupy. Velikost pamˇti je c y e nastavov´na pˇi kompilaci modulu pomoc´ makra PLC USPACE MEMORY. a r ı Tab.8.5 popisuje, k ˇemu slouˇ´ jednotliv´ real-time FIFO pouˇ´ a ovladaˇem. c zı a zıvan´ c Index N´zev a Popis F irstF IF O + 0 ˇ ıd´ ı R´ ıc´ FIFO Slouˇ´ k naprogramov´n´ intervalu, se zı a ı kter´m je zas´ an obsah vnitˇn´ pamˇti y ıl´ r ı e ovladaˇe. Pro z´pis pˇ´ c a rıkazu slouˇ´ struktura zı struct PLCUserSpaceControl deklarovan´ a v hlaviˇkov´m souboru plc uspace.h. c e Do poloˇky struktury Command patˇ´ z rı jedna z hodnot PLC SEND SET TIME, PLC SEND STOP, PLC RESET. Pokud je hodnota PLC SEND SET TIME, patˇ´ rı do poloˇky iTime ˇasov´ interval v [ms] z c y s jak´m budou zas´ ana data. Popis jed- y ıl´ notliv´ch pˇ´ u je pops´n v hlaviˇkov´m y rıkaz˚ a c e souboru. F irstF IF O + 1 Vstupn´ FIFO ı Slouˇ´ k z´pisu dat odpov´ ıch jed- zı a ıdaj´ notliv´m vstupn´ adres´m ovladaˇe. Pˇi y ım a c r z´pisu mus´ b´t zasl´no najednou hodnota a ı y a vˇech vstup˚. s u F irstF IF O + 2 V´stupn´ FIFO y ı Slouˇ´ k z´ av´n´ hodnot vstup˚ a v´stup˚ zı ısk´ a ı u y u ovladaˇe (obsah vnitˇn´ pamˇti ovladaˇe). c r ı e c Struktura zas´ ych dat je patrna z ılan´ obr.8.2. Tabulka 8.5: Popis jednotliv´ch RT FIFO vyuˇ´ ych ovladaˇem pro komunikaci s y zıvan´ c user-space. Ovladaˇ je zaloˇen na n´sleduj´ ım principu: c z a ıc´ • Po zaveden´ modulu ovladaˇe (plc uspacedriver.o) do pamˇti se zaregistruje ve ı c e spr´vci PLC zaˇ´ ı a otevˇe si 3 po sobˇ n´sleduj´ ı real-time fifo8 . a rızen´ r e a ıc´ • Pokud chce uˇivatel z´ avat hodnoty promˇnn´ch ze softwarov´ho PLC, otevˇe z ısk´ e y e r si ˇ´ ıc´ FIFO a naprogramuje si interval, s jak´m m´ b´t do v´stupn´ FIFO rıd´ ı y a y y ıho zas´ an aktu´ln´ stav vnitˇn´ pamˇti ovladaˇe (adres). ıl´ a ı r ı e c 8 Pomoc´ parametru FirstFIFO pˇi zav´dˇn´ modulu lze specifikovat, jak´ nejniˇˇ´ FIFO se pouˇije. ı r a e ı e zsı z 58
  • 66.
    PODPORA PRO RT-LINUX Podpora C++ v RT-Linuxov´m kernelu e • Pokud chce uˇivatel nastavit nˇkter´ ze vstup˚ ovladaˇe, otevˇe si vstupn´ FIFO z e y u c r ı a zaˇle do nˇho nov´ stav vˇech vstup˚. Tj. mus´ zapsat takov´ mnoˇstv´ dat, s e y s u ı e z ı 9 kter´ odpov´ a velikosti vnitˇn´ pamˇti ovladaˇe . e ıd´ r ı e c Obr.8.2 ukazuje strukturu dat, kter´ je zas´ ana ovladaˇem pˇi ˇten´ hodnot vstup˚ a ıl´ c r c ı u 10 11 a v´stup˚ ovladaˇe. Hlaviˇka nab´v´ vˇdy hodnoty ”I” nebo ”O” . Oba bloky jsou y u c c y a z vˇdy zas´ any za sebou. Pokud hlaviˇka neobsahuje jednu z uveden´ch hodnot, pak z ıl´ c y zˇejmˇ jsou data zas´ ana pˇ´ s rychle a proces v user-space Linuxu je nest´ a ˇ´ r e ıl´ rıliˇ ıh´ cıst. D˚sledkem je, ˇe data v FIFO jsou zahazov´na. V tomto pˇ´ e je vhodn´ prov´st u z a rıpadˇ e e reset ovladaˇe (viz. popis ˇ´ ıc´ FIFO). c rıd´ ıho Obr´zek 8.2: Struktura bloku dat pˇi ˇten´ hodnot pamˇti ovladaˇe. a r c ı e c Ovladaˇ je urˇen zejm´na pro moˇnost vizualizace ˇ´ ıc´ procesu. Takto je tak´ c c e z rıd´ ıho e vyuˇ´ an v r´mci vzorov´ ulohy ˇ´ ı ot´ˇek motorku. zıv´ a e´ rızen´ ac Ovladaˇ pro ladˇn´ programu c e ı Ovladaˇ pro ladˇn´ programu emuluje vstupy a v´stupy pomoc´ vnitˇn´ pamˇti, pˇiˇemˇ c e ı y ı r ı e rc z pˇi zmˇnˇ hodnoty je vyps´na na aktu´ln´ konzoli Linuxu nov´ hodnota nastavovan´ r e e a a ı a e promˇnn´ vˇetnˇ informace o adrese, na kter´ se zmˇna ud´la. Pˇi ˇten´ hodnoty je na e e c e e e a r c ı konzoli vyps´na informace o ˇten´ adrese a hodnotˇ, kter´ se na n´ pr´vˇ nach´z´ a c e e a ı a e a ı. Tento ovladaˇ je vhodn´ vyuˇ´ c e zıvat pouze v pˇ´ e ladˇn´ pomalejˇ´ program˚ rıpadˇ e ı sıch u (nebo doˇasnˇ sn´zit frekvenci spouˇtˇn´ pˇ´ sn´ho RT vl´kna), nebot c e ıˇ s e ı rısluˇ e a ’ vzhledem k ˇasov´ n´roˇnosti v´stupu na linuxovou konzoli m˚ˇe pˇi ˇast´m pˇ´ c e a c y uz r c e rıstupu doj´ k nesta- ıt bilitˇ cel´ho syst´mu. e e e 8.3 Podpora C++ v RT-Linuxov´m kernelu e Tato ˇ´st souvis´ s pouˇit´m pˇekladaˇem GCC a jeho vlastnostmi vyuˇiteln´mi pˇi ca ı z y r c z y r pˇekladu programu. V pˇ´ e kompilace vygenerovan´ho C++ k´du jin´m pˇekladaˇem r rıpadˇ e o y r c je moˇn´, ˇe se v´ˇet potˇebn´ch symbol˚ bude liˇit. z e z yc r y u s Pro pˇekladaˇ GCC je tˇeba m´ v r´mci j´dra RT-Linuxu k dispozici modul rtl cpp, r c r ıt a a kter´ implementuje symboly pro nˇkter´ funkce a oper´tory potˇebn´ k bˇhu zkom- y e e a r e e pilovan´ho k´du jazyka C++. Potˇebn´ symboly se mohou liˇit ze dvou d˚vod˚: e o r e s u u 1. Je pouˇita odliˇn´ verze pˇekladaˇe GCC. z s a r c 9 Hodnota makra PLC USPACE MEMORY pˇi pˇekladu ovladaˇe. r r c 10 Pokud n´sleduje blok s hodnotami vstup˚. a u 11 Pokud n´sleduje blok s hodnotami v´stup˚. a y u 59
  • 67.
    PODPORA PRO RT-LINUX Podpora C++ v RT-Linuxov´m kernelu e 2. Pˇekladaˇ GCC byl byl bˇhem sv´ kompilace zkompilov´n s jin´mi parametry. r c e e a y Souˇast´ distribuce RT-Linuxu je verze modulu, kter´ implementuje funkce fputs(), c´ ı a pure virtual(), cxa atexit(), this fixmap does not exist(), assert fail(), isnan(). V bal´ RT-Linux Contrib je k dispozici novˇjˇ´ verze modulu, kter´ nav´ oproti ıku e sı a ıc p˚vodn´ verzi implementuje oper´tory new, new[], delete, delete[]. Tyto oper´tory jsou u ı a a v podstatˇ pouze pˇesmˇrov´ny tak, aby vyuˇ´ e r e a zıvaly vol´n´ standardn´ linuxov´ho ker- a ı ıho e nelu pro dynamick´ alokace a dealokace pamˇti. Z toho plyne omezen´ ˇe je lze vyuˇ´ e e ı, z zıt pouze bˇhem inicializace a deinicializace modulu j´dra. Dostupnost tˇchto oper´tor˚ je e a e a u proto podm´ ena existenc´ makra CPP INIT . Nav´ tato verze umoˇnuje linkov´n´ ınˇ ı ıc zˇ a ı real-time modul˚ sloˇen´ch z v´ zdrojov´ch soubor˚. u z y ıce y u Na pˇiloˇen´m CD je upraven´ verze p˚vodn´ modulu rtl cpp z RT-Linux Contrib, r z e a u ıho kter´ je vyzkouˇena s kompil´tory GCC 2.96 a GCC 3.2. Tato verze nav´ implementuje a s a ıc symbol cxa pure virtual(). Vzhledem k tomu, ˇe kompil´tor GCC lze kompilovat s mnoha r˚zn´mi parametry, z a u y m˚ˇe se st´t, ˇe v jin´ verzi, pˇ´ uz a z e rıpadnˇ verzi z jin´ distribuce bude chybˇt nˇjak´ dalˇ´ e e e e y sı symbol. Obvykle se jedn´ o r˚zn´ funkce se speci´ln´ v´znamem, kter´ jsou v r´mci a u e a ım y e a norm´ln´ program˚ linkov´ny s defaultn´ funkcionalitou, lze je deklarovat podobnˇ a ıch u a ı e jako v´ˇe uveden´ symboly. ys e 60
  • 68.
    Kapitola 9 Pouˇit´ softwarov´hoPLC z ı e Tato kapitola se zab´v´ pouˇit´ vytvoˇen´ho software pro programov´n´ softwarov´ho y a z ım r e a ı e PLC. Nejprve je v ˇ´sti 9.1 uveden n´vod na zprovoznˇn´ programu, ˇ´st 9.2 popisuje ca a e ı ca utilitu plc2cpp a jej´ parametry na pˇ´ ı rıkazov´m ˇ´dku, ˇ´st 9.3 popisuje moˇnost vytv´ˇen´ e ra ca z ar ı knihoven funkc´ a funkˇn´ blok˚ pro znovuvyuˇit´ jiˇ hotov´ho k´du a ˇ´st 9.4 ob- ı c ıch u z ı z e o ca sahuje jednoduch´ n´vod, jak vytvoˇit softwarov´ PLC. y a r e 9.1 Instalace softwarov´ho PLC e V t´to ˇ´sti je uveden struˇn´ n´vod ke zprovoznˇn´ softwarov´ho PLC. Nejprve je vˇak e ca c y a e ı e s tˇeba m´ k dispozici funkˇn´ instalaci RT-Linuxu. Kr´tk´ n´vod k jeho zprovoznˇn´ je r ıt c ı a y a e ı rıloze A. uveden v pˇ´ V pˇ´ e, ˇe je RT-Linux uspˇˇnˇ nainstalov´n, postup je n´sleduj´ ı: rıpadˇ z ´ es e a a ıc´ r e o ıskat je lze bud’ z pˇiloˇen´ho CD, nebo z 1. Pˇipravte si zdrojov´ k´dy projektu. Z´ r z e domovsk´ str´nky projektu [2]. e a 2. Rozbal´ zdrojov´ k´d do pracovn´ adres´ˇe1 : ıme y o ıho ar ]# tar xzf SoftwarePLC-x.yy.tgz 3. Zmˇn´ aktu´ln´ adres´ˇ na adres´ˇ se zdrojov´m k´dem: e ıme a ı ar ar y o ]# cd SoftwarePLC-x.yy 4. Spust´ konfiguraˇn´ skript2 : ıme c ı ]# ./configure 1 Znaky x.yy znamenaj´ verzi programu. ı 2 V pˇ´ e, ˇe chcete zmˇnit nˇkter´ v´choz´ nastaven´ programu, lze pˇidat parametr –help pro rıpadˇ z e e e y ı ı r n´povˇdu o dostupn´ch parametrech. a e y 61
  • 69.
    POUZIT´ SOFTWAROVEHO PLC ˇ I ´ Parametry pˇıkazov´ho ˇ´dku r´ e ra 5. Nyn´ jiˇ m˚ˇeme spustit kompilaci programu a podp˚rn´ch modul˚ j´dra: ı z uz u y u a ]# make dep ]# make 6. Pokud se kompilace zdaˇila, je m˚ˇeme pˇistoupit k instalaci programu: r uz r ]# make install Instalace spoˇ´ a v nakop´ an´ modul˚ j´dra se spr´vcem ovladaˇ˚ zaˇ´ ı cıv´ ırov´ ı u a a cu rızen´ a jednotliv´ch ovladaˇ˚ do syst´mov´ho adres´ˇe s moduly j´dra, instalaci po- y cu e e ar a mocn´ho skriptu mkplc.sh pro vytv´ˇen´ softwarov´ho PLC, instalaci preproce- e ar ı e soru plc2cpp a instalaci pomocn´ch knihoven potˇebn´ch pro kompilaci PLC y r y programu do modulu j´dra pomoc´ C++. a ı V tuto chv´ m´me tedy k dispozici vˇe potˇebn´ pro vytv´ˇen´ uˇivatelsk´ch pro- ıli a s r e ar ı z y gram˚ pro PLC. u 9.2 Parametry pˇ´ rıkazov´ho ˇ´dku e ra Pˇehled a popis parametr˚ pˇ´ r u rıkazov´ho ˇ´dku utility plc2cpp je uveden v tab.9.1. e ra Parametr Popis -t directory Adres´ˇ, do kter´ho se maj´ ukl´dat vygenerovan´ zdrojov´ ar e ı a e e soubory v C++. -s source N´zev vstupn´ souboru v jazyce Instruction List. a ıho -p project N´zev projektu. Pouˇ´ a se pro n´zev vygenerovan´ho mod- a zıv´ a e ulu j´dra, pro odvozen´ n´zvu hlaviˇkov´ho souboru s ex- a ı a c e portem glob´ln´ promˇn´ch atp. a ıch e y -r time ˇ v [ns] urˇuj´ ı jak ˇasto bude detekov´na n´bˇˇn´ hrana Cas c ıc´ c a a ez a sign´lu pˇi spouˇtˇn´ uloh, kter´ nejsou spouˇtˇny periodicky. a r s e ı´ e se -n time ˇ Cas v [ns] urˇuj´ ı periodu spouˇtˇn´ uloh, kter´ nemaj´ c ıc´ se ı ´ e ı pˇiˇazen TASK. rr -L libdirs Dalˇ´ adres´ˇe oddˇlen´ ˇ´rkou pouˇ´ e pro hled´n´ kni- sı ar e e ca zıvan´ a ı hoven. -h Zobraz´ n´povˇdu k programu. ı a e -l listfile Do souboru listfile uloˇ´ seznam vˇech vygenerovan´ch sou- zı s y bor˚ v C++ (vˇetnˇ hlaviˇkov´ch soubor˚). u c e c y u Tabulka 9.1: Pˇehled parametr˚ pˇ´ r u rıkazov´ho ˇ´dku utility plc2cpp. e ra 62
  • 70.
    POUZIT´ SOFTWAROVEHO PLC ˇ I ´ Vytv´ˇen´ knihoven ar ı 9.3 Vytv´ˇen´ knihoven ar ı Vytv´ˇen´ knihoven je velmi jednoduch´. Staˇ´ vytvoˇit zdrojov´ soubor s jedn´ nebo ar ı e cı r y ım v´ bloky pro z´pis programu (funkce, funkˇn´ blok, blok typu program). ıce a c ı Knihovny se hledaj´ v n´sleduj´ ıch adres´ˇ´ ı a ıc´ arıch: • Pokud je pˇi pˇekladu plc2cpp definov´na hodnota makra PLC LIBDIRS, je r r a jeho hodnota pˇedpokl´d´na jako : oddˇlen´ seznam dalˇ´ adres´ˇ˚, kde jsou r a a e y sıch aru hled´ny objekty z knihoven. a • Pokud je deklarov´na promˇnn´ prostˇed´ PLC LIBDIR, je jej´ hodnota pˇedpokl´d´na a e a r ı ı r a a jako : oddˇlen´ seznam dalˇ´ adres´ˇ˚, kde jsou hled´ny dalˇ´ objekty z kni- e y sıch aru a sı hoven. • Dalˇ´ moˇnost´ je parametr -L pˇ´ sı z ı rıkazov´ho ˇ´dku(viz.tab.9.1), kter´ m˚ˇe obsa- e ra y uz hovat ˇ´rkou oddˇlen´ seznam adres´ˇ˚, kde se tak´ mohou nach´zet knihovn´ ca e y aru e a ı objekty. V pˇ´ e, ˇe knihovna pouˇ´ a jinou knihovnu, lze ve zdrojov´m k´du definovat rıpadˇ z zıv´ e o z´vislost zp˚sobem uveden´m v uk´zce 9.1. a u y a (* Include: min.plc,max.plc *) (* Include: pid.plc *) PROGRAM prg_control ... Uk´zka 9.1: Definice vyuˇit´ jin´ knihovny ve zdrojov´m k´du PLC. a z ı e e o Tato vlastnost nen´ v [5] definov´na. Jedn´ se o rozˇ´ren´ vytvoˇen´ho softwarov´ho ı a a sıˇ ı r e e PLC, kter´ je vytvoˇena za uˇelem komfortnˇjˇ´ vytv´ˇen´ knihoven i program˚ v a r ´c e sıho ar ı u jazyce Instruction List. V pˇ´ e, ˇe je nalezena direktiva Include: v koment´ˇi, kter´ zaˇ´ a na nov´m rıpadˇ z ar y cın´ e ˇ´dku, jsou uveden´ soubory zpracov´ny stejnˇ, jako by byly souˇ´st´ p˚vodn´ zdro- ra e a e ca ı u ıho jov´ho k´du. Za direktivou m˚ˇe n´sledovat jeden ˇi v´ zdrojov´ch soubor˚, jejichˇ e o uz a c ıce y u z jednotliv´ n´zvy jsou oddˇleny ˇ´rkou. e a e ca 9.4 Vytvoˇen´ softwarov´ho PLC r ı e V t´to ˇ´sti je uveden jednoduch´ n´vod k vytvoˇen´ softwarov´ho PLC za pomoci v´ˇe e ca y a r ı e ys vytvoˇen´ho programu. Podm´ r e ınkou pro spr´vnou funkci je samozˇejmˇ zprovoznˇn´ a r e e e softwarov´ PLC a funkˇn´ RT-Linux. e c ı 63
  • 71.
    POUZIT´ SOFTWAROVEHO PLC ˇ I ´ Vytvoˇen´ softwarov´ho PLC r ı e Pˇedpokl´dejme, ˇe chceme vytvoˇit projekt, kter´ se bude jmenovat foo, bude se r a z r y nach´zet v domovsk´m adres´ˇi uˇivatele v podadres´ˇi s n´zvem foo plc a bude se a e ar z ar a skl´dat ze dvou zdrojov´ch souboru foo1.plc a foo2.plc uloˇen´ch pˇ´ a y z y rımo v adres´ˇi ar projektu. Postup je tedy n´sleduj´ ı: a ıc´ 1. Zaloˇ´ nov´ projekt zıme y tmp]# mkplc.sh --create foo --target-dir ~/foo_plc 2. Nyn´ pˇid´me zdrojov´ soubory do Makefile. Najdeme v adres´ˇi /foo plc soubor ı r a e ar Makefile. Otevˇeme ho v obl´ em textov´m editoru a najdeme ˇ´dek: r ıben´ e ra # FILES=deps/filename.plc Tento ˇ´dek zmˇn´ na: ra e ıme FILES=deps/foo1.plc deps/foo2.plc 3. Nyn´ vytvoˇ´ soubory obsahuj´ ı zdrojov´ k´dy pro PLC v jazyce instruction ı rıme ıc´ e o list foo1.plc a foo2.plc 4. Chceme-li prov´st kompilaci programu zad´me na pˇ´ e a rıkazov´m ˇ´dku v adres´ˇi e ra ar projektu: foo_plc]# make 5. Pro spuˇtˇn´ vytvoˇen´ho softwarov´ho PLC staˇ´ zadat3 : se ı r e e cı foo_plc]# make start 6. Pro zastaven´ softwarov´ho PLC lze pouˇ´ ı e zıt: foo]# make stop Skript pro vytv´ˇen´ softwarov´ho PLC je koncipov´n tak, aby byl co nejjednoduˇˇ´ ar ı e a ssı. Pˇedpokl´d´, ˇe zdrojov´ k´dy pro PLC se budou nach´zet pˇ´ v adres´ˇi projektu, r a a z e o a rımo ar vygenerovan´ soubory budou ukl´d´ny do podadres´ˇe sources v adres´ˇi projektu a vy- e a a ar ar generovan´ modul j´dra se bude jmenovat plc projekt.o. D´le je tˇeba, aby v nˇkter´m y a a r e e zdrojov´m souboru pro PLC byl definov´n blok typu CONFIGURATION s n´zvem e a a 3 Pˇedpokl´d´ se, ˇe je spuˇtˇn RT-Linux a zaveden modul plc devicemanager.o, pˇ´ r a a z se rıpadnˇ ovladaˇe e c zaˇ´ ı, kter´ bude program vyuˇ´ rızen´ e zıvat. 64
  • 72.
    POUZIT´ SOFTWAROVEHO PLC ˇ I ´ Vytvoˇen´ softwarov´ho PLC r ı e shodn´m s n´zvem projektu (v naˇem pˇ´ e by to tedy byl blok CONFIGURATION y a s rıpadˇ foo. V seznamu soubor˚, ze kter´ch se projekt skl´d´ je tˇeba uv´dˇt n´zev souboru u y a a r a e a vˇetnˇ podadres´ˇe deps. D˚vodem je, ˇe v tomto podadres´ˇi je uloˇen pomocn´ c e ar u z ar z y 4 soubor, kter´ obsahuje seznam dˇ´ vygenerovan´ch soubor˚ a z´roveˇ je vyuˇ´ an y rıve y u a n zıv´ programem make, pro udrˇov´n´ z´vislost´ v projektu. z a ı a ı Uk´zka 9.2 uv´d´ z´kladn´ kostru zdrojov´ho k´du PLC. V k´du je definov´n jeden a a ı a ı e o o a blok typu program vyuˇ´ ıc´ glob´ln´ promˇnnou out, konfiguraˇn´ blok (s n´zvem zıvaj´ ı a ı e c ı a stejn´m jako n´zev projektu - tedy foo) a spouˇtˇn´ programov´ho bloku prg rotace s y a se ı e periodou 0.5s. Z´roveˇ je v r´mci koment´ˇe na prvn´ ˇ´dku uvedeno pouˇit´ knihovny a n a ar ım ra z ı pid.plc. (* Include: pid.plc *) PROGRAM prg_rotace VAR_EXTERNAL out: BYTE; END_VAR LD out ... END_PROGRAM CONFIGURATION foo VAR_GLOBAL out AT %QB0: BYTE := 1; END_VAR RESOURCE xx ON yy TASK rotaceTask(INTERVAL:=T#0.5s); PROGRAM p1 WITH rotaceTask: prg_rotace(); END_RESOURCE END_CONFIGURATION Uk´zka 9.2: Uk´zka kostry PLC programu. a a V pˇ´ e sloˇitˇjˇ´ projektu lze samozˇejmˇ vygenerovan´ Makefile upravit ruˇnˇ, rıpadˇ z e sıho r e y c e nebo vytvoˇit zcela nov´ soubor odpov´ ıc´ poˇadavk˚m. r y ıdaj´ ı z u 4 Tento seznam je pouˇ´ an pro smaz´n´ dˇ´ vygenerovan´ch soubor˚ v pˇ´ e rekompilace. zıv´ a ı rıve y u rıpadˇ 65
  • 73.
    Z´vˇr a e ´ Ukolemdiplomov´ pr´ce bylo vytvoˇit pro operaˇn´ syst´m RT-Linux softwarov´ vy- e a r c ı e e baven´ umoˇnuj´ ı spouˇtˇt program zapsan´ v nˇkter´m jazyce pro PLC, kter´ je ı zˇ ıc´ se y e e y definovan´m v normˇ IEC-1131-3. e e C´ pr´ce se podaˇilo splnit. Bylo vytvoˇeno softwarov´ PLC s takov´mi z´kladn´ ıl a r r e y a ımi vlastnostmi, jak je definov´no v normˇ IEC-1131-3. Pro implementaci byl zvolen jazyk a e Instruction List. Funkcionalita vytvoˇen´ho PLC odpov´ a poˇadavk˚m normy. V´bˇr r e ıd´ z u y e vlastnost´ byl proveden tak, aby bylo moˇno vyuˇ´ vˇechny instrukce, bloky pro z´pis ı z zıt s a programu, promˇnn´ reprezentovan´ z´stupn´m jm´nem i pˇ´ e e e a y e rımou adresou. D´le je a moˇno vyuˇ´ vˇechny zp˚soby spouˇtˇn´ vl´ken PLC. Umyslnˇ nebyla implementov´na z zıt s u se ı a ´ e a moˇnost vyuˇ´ z zıvat z´vorkov´n´ aritmetick´ch operac´ D´le se nepodaˇ´ implemento- a a ı y ı. a rılo vat pˇed´v´n´ funkˇn´ blok˚ v parametrech funkc´ funkˇn´ blok˚ a blok˚ typu r a a ı c ıch u ı, c ıch u u program. V pˇ´ rıloze B je uveden pˇehled vlastnost´ definovan´ch v [5], kter´ vytvoˇen´ r ı y e r y syst´m podporuje, pˇ´ e rıpadnˇ nepodporuje. e Vzhledem k potˇebˇ vytv´ˇet knihovny, je moˇn´ pomoc´ direktivy Include:, um´ en´ r e ar z e ı ıstˇ e uvnitˇ koment´ˇe definovat z´vislost zdrojov´ho k´du na pˇ´ sn´ knihovnˇ. A to jak r ar a e o rısluˇ e e v r´mci koncov´ho programu uˇivatele, tak v r´mci kter´koliv knihovn´ funkce. Bliˇˇ´ a e z a e ı zsı informace o t´to vlastnosti lze nal´zt v ˇ´sti 9.3. e e ca Softwarov´ PLC bylo vytvoˇeno jako utilita (preprocesor) jazyka Instruction List e r do jazyka C++. Pro kompilaci do strojov´ho k´du je vyuˇit standardn´ linuxov´ kom- e o z ı y pil´tor. Pro kompilaci vygenerovan´ho C++ k´du je tˇeba pomocn´ knihovna, kter´ a e o r a a je souˇ´st´ softwarov´ho PLC. ca ı e Vzhledem k volbˇ pˇev´dˇt PLC program na program v jazyce C++, byla z´roveˇ e r a e a n ovˇˇena moˇnost vyuˇ´ k tvorbˇ RT-Linuxov´ch aplikac´ C++. Je vˇak tˇeba se v er z zıt e y ı s r programu drˇet omezen´ uveden´ch v ˇ´sti 2.2. z ı y ca V r´mci PLC programu je moˇn´ tak´ vyuˇ´ a z e e zıvat FPU pro matematick´ operace s e pohyblivou ˇ´dovou ˇ´rkou. Toho je doc´ ra ca ıleno t´ ˇe kaˇd´ vygenerovan´ vl´kno m´ ve ım, z z e e a a sv´ch parametrech pˇi zakl´d´n´ uvedeno, ˇe vyuˇ´ a FPU. y r a a ı z zıv´ Souˇast´ vytvoˇen´ho PLC je tak´ n´vrh pro modul´rn´ tvorbu ovladaˇ˚, kter´ c´ ı r e e a a ı cu e umoˇnuj´ z PLC programu pˇistupovat na extern´ zaˇ´ ı. Modularita ovladaˇ˚ umoˇnuje zˇ ı r ı rızen´ cu zˇ libovolnˇ pouˇ´ e PLC konfigurovat dle dostupn´ho hardware. V r´mci projektu byly e zıvan´ e a vytvoˇeny ovladaˇe pro paraleln´ port, ovladaˇ umoˇnuj´ ı komunikaci mezi uˇivatelskou r c ı c zˇ ıc´ z ˇ´st´ linuxu a softwarov´m PLC s vyuˇit´ pro visualizaci ˇ´ eho procesu. D´le byl ca ı y z ım rızen´ a vytvoˇen ovladaˇ pro PCI kartu s digit´ln´ vstupy/v´stupy. r c a ımi y Funkˇnost cel´ho syst´mu byla ovˇˇena na PLC programu pro ˇ´ ı ot´ˇek mo- c e e er rızen´ ac 66
  • 74.
    POUZIT´ SOFTWAROVEHO PLC ˇ I ´ Vytvoˇen´ softwarov´ho PLC r ı e ˇ ıd´ ı torku. R´ ıc´ program komplexnˇ demonstruje vlastnosti a moˇnosti vytvoˇen´ho soft- e z r e warov´ho PLC. Vyuˇ´ a moˇnost spouˇtˇn´ ulohy na z´kladˇ n´bˇˇn´ hrany (mˇˇen´ e zıv´ z se ı ´ a e a ez e er ı aktu´ln´ ot´ˇek motorku), periodick´ spouˇtˇn´ programu pro regulaci ot´ˇek pomoc´ a ıch ac e se ı ac ı PID regul´toru. Z´roveˇ je vyuˇit ovladaˇ pro komunikaci s user-space RT-Linuxu. a a n z c Na vzorov´m ˇ´ ıc´ programu byly tak´ otestov´ny rychlostn´ moˇnosti softwarov´ho e rıd´ ım e a ı z e PLC. Na poˇ´ ci Intel Pentium 3 700MHz bylo vyykouˇeno cyklick´ spouˇtˇn´ vl´ken cıtaˇ s e se ı a PLC programu s periodou kratˇ´ neˇ 100[µs]. sı z Vytvoˇen´ softwarov´ PLC je um´ eno na internetov´ adrese [2] jako projekt pod r e e ıstˇ e licenc´ GPLv2. Na t´to adrese je t´ˇ moˇn´ nal´zt pˇ´ ı e ez z e e rıpadnˇ dalˇ´ upravy a opravy e sı ´ programu. 67
  • 75.
    Dodatek A Instalace RT-Linuxu Tatoˇ´st v kr´tkosti uv´d´ n´vod k instalaci RT-Linuxu. Pˇedpokl´daj´ se alespoˇ ca a a ı a r a ı n ˇ´steˇn´ znalosti potˇebn´ pro spr´vu Linuxu a instalaci uˇivatelsky kompilovan´ho ca c e r e a z e j´dra. Pro podrobnˇjˇ´ informace je tˇeba si prostudovat pˇ´ snou dokumentaci na a e sı r rısluˇ n´ze uveden´ch adres´ch. ıˇ y a K instalaci je tˇeba z adresy http://www.rtlinux.org st´hnout distribuci RT-Linuxu. r a Souˇ´st´ staˇen´ho bal´ je i tzv. patch1 pro vybran´ verze p˚vodn´ linuxov´ho ca ı z e ıku e u ıho e j´dra. Ten provede v p˚vodn´ zdrojov´m k´du linuxu zmˇny potˇebn´ k bˇhu RT- a u ım e o e r e e Linuxu. Nyn´ je moˇn´ si z adresy ftp://ftp.linux.org st´hnout zdrojov´ k´d linuxov´ho ı z e a y o e j´dra. Je tˇeba vybrat takovou verzi, kter´ je podporov´na RT-Linuxem (tj. existuje a r a a patch na tuto verzi linuxov´ho j´dra). e a M´me-li k dispozici oba bal´ popsan´ v pˇedchoz´ odstavc´ m˚ˇeme pˇistoupit a ıky e r ıch ıch, uz r k vlastn´ instalaci: ı • Budeme pˇedpokl´dat, ˇe vˇechny operace budeme prov´dˇt na cestˇ /usr/src: r a z s a e e ]# cd /usr/src • Nyn´ rozbal´ staˇen´ linuxov´ j´dro (pokud se staˇen´ soubor jmenuje linux- ı ıme z e e a z y 2.4.20.tar.gz): ]# tar xzf linux-2.4.20.tar.gz • Rozbal´ staˇen´ zdrojov´ k´dy RT-Linuxu (pokud se staˇen´ soubor jmenuje ıme z e e o z y rtlinux-3.2-pre1.tar.gz): ]# tar xzf rtlinux-3.2-pre1.tar.gz • Nyn´ vytvoˇ´ ı rıme symblick´ link na nov´ zdrojov´ soubory j´dra (t´ zajist´ y e e a ım ıme pouˇit´ spr´vn´ch hlaviˇkov´ch soubor˚ bˇhem kompilace): z ı a y c y u e 1 Tj. soubor jehoˇ aplikac´ na p˚vodn´ linuxov´ j´dro z´ ame j´dro s podporou real-time extenze. z ı u ı e a ısk´ a 68
  • 76.
    INSTALACE RT-LINUXU ]# rm -f /usr/src/linux ]# ln -s /usr/src/linux-2.4.20 /usr/src/linux • Nyn´ najdeme v adres´ˇi rtlinux-3.2-pre1/patches patch na pouˇitou verzi j´dra. ı ar z a • Nyn´ aplikujeme patch (za pˇedpokladu, ˇe jsme naˇli soubor kernel patch-2.4.20- ı r z s rtl3.2-pre1): ]# cd linux-2.4.20 ]# patch -p1 < ../rtlinux-3.2-pre1/patches/kernel_patch- 2.4.20-rtl3.2-pre1 • Provedeme konfiguraci linuxov´ho j´dra (je tˇeba vybrat vˇechny potˇebn´ ovladaˇe e a r s r e c 2 a podporu modul˚ ) u ]# make menuconfig • Nyn´ jiˇ m˚ˇeme prov´st kompilaci j´dra a nainstalovat nov´ moduly: ı z uz e a e ]# make bzImage modules modules_install • Zb´v´ jeˇtˇ nakonfigurovat RT-Linuxovou extenzi a nainstalovat jej´ moduly: y a se ı ]# cd ../rtlinux-3.2-pre1 ]# make menuconfig ]# make dep ]# make all ]# make install Nyn´ jiˇ m´me k dispozici zkompilovanou verzi linuxov´ho j´dra s podporou real- ı z a e a time extenze a moduly RT-Linuxu, kter´ po zaveden´ do j´dra linuxu aktivuj´ real-time e ı a ı rozˇ´ren´ (a tedy tak´ RT-Linux). Zaveden´ tˇchto modul˚ lze prov´st napˇ. pomoc´ sıˇ ı e ı e u e r ı 3 pˇ´ rıkazu : /etc/rc.d/rtlinux start Dalˇ´ informace lze nal´zt kromˇ internetu tak´ v souborech README, pˇ´ sı e e e rıpadnˇ e INSTALL, kter´ se nach´zej´ v adres´ˇ´ s Linuxem, pˇ´ e a ı arıch rıpadnˇ RT-Linuxem. e 2 Podpora modul˚ je tˇeba pro kompilaci RT-Linuxov´ch modul˚. u r y u 3 Cesta ke spouˇtˇc´ s e ımu skriptu se m˚ˇe liˇit v z´vislosti na parametrech zvolen´ch pˇi kompilaci uz s a y r RT-Linuxu a na pouˇit´ distribuci linuxu z e 69
  • 77.
    Dodatek B Kompatibilita snormou IEC-1131-3 N´ze uveden´ tabulka obsahuje pˇehled podporovan´ch vlastnost´ softwarov´ho PLC ıˇ a r y ı e vzhledem k poˇadovan´m vlastnostem, kter´ jsou uv´dˇny v [5]. V tabulce je vˇdy z y e a e z uv´dˇno ˇ´ tabulky z [5], ˇ´ vlastnosti, kr´tk´ charakteristika (obvykle pro celou a e cıslo cıslo a a skupinu vlastnost´ informace o tom, zda je vlastnost podporov´na a pˇ´ ı), a rıpadnˇ pozn´mku e a k implementaci. Nˇkter´ vlastnosti, kter´ nesouvis´ pˇ´ s programovac´ jazykem Instruction List, e e e ı rımo ım nejsou n´ze uvedeny. ıˇ Tab.-ˇ. c Popis Podporov´no a Pozn´mka a 1-1 Znakov´ sady e Podporov´ny ASCII a znaky, diakritika podporov´na v r´mci a a koment´ˇ˚. aru 1-2 Mal´ p´ a ısmena Ano Podporov´na v r´mci a a n´zv˚ promˇnn´ch, a u e y funkc´ a funkˇn´ ı c ıch blok˚. u V tˇchto e pˇ´ rıpadech je rozd´ ıl v mal´ch a velk´ch y y p´ ısmenech ignorov´n. a 1-3a Ano 1-3b Ne 1-4a Ne 1-4b Ne 1-5a Ne Programov´n´a ı po- moc´ı ˇebˇ´ckov´ch z rıˇ y diagram˚ nen´ k u ı dispozici. 1-5b 1-6a Z´vorkov´ operace a e Ne Viz. pozn´mka v kapi- a tole 5. 70
  • 78.
    KOMPATIBILITA S NORMOUIEC-1131-3 Tab.-ˇ. c Popis Podporov´no a Pozn´mka a 1-6b Z´vorkov´ operace a e Ne 2-1 Ano 2-2 Ano 2-3 Ano 3-1 Koment´ˇe ar Ano Na samostatn´m e ˇ´dku i na ˇ´dku s ra ra k´dem o programu. Z´roveˇ vyuˇito k a n z definici z´vislosti a na knihovn´ch (viz. a kapitola 9). 4-1 Ano 4-2 Ano 4-3 Ano 4-4 Ano 4-5 Ano 4-6 Ano 4-7 Ano 4-8 Ano 5-1 ˇ e Retˇzcov´ konstanty e Ne 6-1 Kombinace znak˚ v u Ne ˇetˇzc´ r e ıch 6-2 Ne 6-3 Ne 6-4 Ne 6-5 Ne 6-6 Ne 6-7 Ne 6-8 Ne 7-1a ˇ Casov´ konstanty e Ano 7-1b Ano 7-2a Ano 7-2b Ano 8-1 Konstanty pro datum Ne Pˇ´ sn´ datov´ typy rısluˇ e e a denn´ ˇas ıc nejsou podporov´ny. a 8-2 Ne 8-3 Ne 8-4 Ne 8-5 Ne 8-6 Ne 71
  • 79.
    KOMPATIBILITA S NORMOUIEC-1131-3 Tab.-ˇ. c Popis Podporov´no a Pozn´mka a 10-1 Element´rn´ a ı datov´ e Ano typy 10-2 Ano 10-3 Ano 10-4 Ano 10-5 Ano 10-6 Ano 10-7 Ano 10-8 Ano 10-9 Ano 10-10 Ano 10-11 Ne 10-12 Ano 10-13 Ne 10-14 Ne 10-15 Ne 10-16 Ne 10-17 Ano 10-18 Ano 10-19 Ano 10-20 Ano 12-1 Odvozen´ uˇivatelsk´ e z e Ne datov´ typy e 12-2 Ne 12-3 Ne 12-4 Ne 12-5 Ne 14-1 Inicializace Ne uˇivatelsk´ch z y da- tov´ch typ˚ y u 14-2 Ne 14-3 Ne 14-4 Ne 14-5 Ne 14-6 Ne 15-1 Pˇ´ a adresace rım´ Ano 15-2 Ano 15-3 Ano 15-4 Ano 15-5 Ano 15-6 Ano 72
  • 80.
    KOMPATIBILITA S NORMOUIEC-1131-3 Tab.-ˇ. c Popis Podporov´no a Pozn´mka a 15-7 Ano 15-8 Ano 15-9 Ano 16-1 Bloky promˇnn´ch e y Ano 16-2 Ano 16-3 Ano 16-4 Ano 16-5 Ano 16-6 Ano 16-7 Ne 16-8 Ano Kl´cov´ slovo je ig- ıˇ e norov´no, a p˚vodn´ u ı v´znam je ztracen. y 16-9 Ano 16-10 Ano 17-1 Deklarace Ano promˇnn´ch e y 17-2 Ano Studen´ y restart nen´ moˇn´ bˇˇn´mi ı z e ez y prostˇedky v RT- r Linuxu zpraco- vat. Kl´cov´ slovo ıˇ e RETAIN je ig- norov´no, promˇnn´ a e e si po restartu neza- chov´vaj´ svoji hod- a ı notu. 17-3 Ano 17-4 Ne Pole nejsou pod- porov´na. a 17-5 Ano 17-6 Ne 17-7 Ne 17-8 Ne 18-1 Inicializace Ano promˇnn´ch e y 18-2 Ano Viz. pozn´mka o RE- a TAIN promˇnn´ch. e y 18-3 Ano 18-4 Ne 73
  • 81.
    KOMPATIBILITA S NORMOUIEC-1131-3 Tab.-ˇ. c Popis Podporov´no a Pozn´mka a 18-5 Ano S vyj´ ımkou ˇetˇzcov´ch r e y promˇnn´ch. e y 18-6 Ne 18-7 Ano 18-8 Ne 18-9 Ano 33-1 Moˇnosti z deklarace Ano Kl´cov´ ıˇ e slovo RE- funkˇn´ blok˚ c ıch u TAIN je ignorov´no. a 33-2 Ano Kl´cov´ ıˇ e slovo RE- TAIN je ignorov´no. a 33-3 Ano Kl´cov´ ıˇ e slovo RE- TAIN je ignorov´no. a 33-4a Ano 33-4b Ne Grafick´ programovac´ e ı jazyky nejsou pod- porov´ny. a 33-5a Ne 33-5b Ne 33-6a Ne 33-6b Ne 33-7a Ne 33-7b Ne 33-8a Ne 33-8b Ne 33-9a Ne 33-9b Ne 49-1 Moˇnosti z deklarace Ano blok˚ CONFIGURA- u TION a RESOURCE 49-2 Ano 49-3 Ano 49-4 Ano 49-5a Ano 49-5b Ano Spouˇtˇn´ se ı je ve skuteˇnosti c nahrazeno period- ick´m y spouˇtˇn´ s e ım. Bliˇˇ´ informace lze z sı nal´zt v kapitole 7. e 49-6a Ano 49-6b Ne 74
  • 82.
    KOMPATIBILITA S NORMOUIEC-1131-3 Tab.-ˇ. c Popis Podporov´no a Pozn´mka a 49-6c Ano 49-7 Ne Deklaraci lze nahra- dit pomocnou promˇnnou. e 49-8a Ano 49-8b Ano 49-9a Ano 49-9b Ano 49-10a Ne 49-10b Ne 49-10c Ne 49-10d Ne 49-10e Ne 49-10f Ne 50-1a Parametry deklarace Ano blok˚ TASK u 50-1b Ano 50-2a Ne Grafick´ jazyky nejsou e podporov´ny. a 50-2b Ne 50-3a Ano 50-3b Ne 50-4a Ne 50-4b Ne 50-5a Ne 50-5b Ano 51-1 Ano 52-1 Instrukce jazyka IL Ano 52-2 Ano 52-3 Ano 52-4 Ano 52-5 Ano 52-6 Ano 52-7 Ano 52-8 Ano 52-9 Ano 52-10 Ano 52-11 Ano 52-12 Ano 52-13 Ano 52-14 Ano 75
  • 83.
    KOMPATIBILITA S NORMOUIEC-1131-3 Tab.-ˇ. c Popis Podporov´no a Pozn´mka a 52-15 Ano 52-16 Ano 52-17 Ano 52-18 Ano 52-19 Ano 52-20 Ano 52-21 Ne ˇ e ı Retˇzen´ operac´ po- ı moc´ z´vorek nen´ ı a ı podporov´no. a 53-1 Vol´n´ a ı funkˇn´ c ıch Ano blok˚ u 53-2 Ano 53-3 Ne 54-4 Ne Funkˇn´ bloky jako c ı parametry nejsou podporov´ny. a 54-5 Ne 54-6 Ne 54-7 Ne 54-8 Ne 54-9 Ne 54-10 Ne 54-11 Ne 54-12 Ne 54-13 Ne 76
  • 84.
    Dodatek C ˇ ızen´motorku pomoc´ R´ ı ı softwarov´ho PLC e V t´to ˇasti je kr´tce pops´na vzorov´ aplikace, kter´ ukazuje, jak lze softwarov´ PLC e c´ a a a a e vyuˇ´ Jedn´ se o ˇ´ ı motorku, kter´ je pˇipojen k PC pomoc´ paraleln´ portu. zıt. a rızen´ y r ı ıho Aplikace se skl´d´ ze dvou nez´visl´ch ˇ´st´ a a a y ca ı: 1. Vlastn´ ˇ´ ıc´ program napsan´ v jazyce Instruction List pro PLC. Ten pomoc´ ı rıd´ ı y ı PID regul´toru ˇ´ ı motorek, kter´ je pˇipojen k poˇ´ ci pomoc´ paraleln´ a rıd´ y r cıtaˇ ı ıho portu. 2. Jednoduch´ uk´zkov´ vizualizace pro X-Windows naprogramovan´ v jazyce C++, a a a a zobrazuj´ ı aktu´ln´ ot´ˇky motorku a umoˇnuj´ ı nastavit poˇadovan´ ot´ˇky ıc´ a ı ac zˇ ıc´ z e ac motorku. C.1 ˇ ıd´ ı R´ ıc´ program motorku ˇ ıd´ ı R´ ıc´ program motorku je koncipov´n jako program pro PLC v jazyce Instruction List a a jako takov´ je zpracov´n vytvoˇenou utilitou plc2cpp. N´slednˇ je zkompilov´n do y a r a e a modulu RT-Linuxov´ho kernelu. Rychlost ot´ˇen´ je ˇ´ e ac ı rızena gener´torem PWM. a Sn´ an´ smˇru a rychlosti ot´ˇen´ i vlastn´ ˇ´ ı prob´ a pomoc´ paraleln´ portu ım´ ı e ac ı ı rızen´ ıh´ ı ıho (je tedy vyuˇ´ an vytvoˇen´ ovladaˇ paraleln´ portu). zıv´ r y c ıho Velikost ot´ˇek (ˇ´dan´ veliˇina) se nastavuje z user-space s vyuˇit´ pˇ´ sn´ho ac za a c z ım rısluˇ e ovladaˇe. Lze ji tedy dynamicky mˇnit za bˇhu programu. Stejnˇ tak jsou pˇed´v´ny c e e e r a a aktu´ln´ mˇˇen´ ot´ˇky do user-space RT-Linuxu. a ı er e ac Program se skl´d´ ze tˇ´ periodicky spouˇtˇn´ch program˚ s n´leduj´ ım v´znamem: a a rı se y u a ıc´ y 1. Sn´ an´ poˇtu impulz˚ vygenerovan´ch inkrement´ln´ ˇidlem um´ en´m na ım´ ı c u y a ım c ıstˇ y hˇ´ rıdelce motorku. Z generovan´ch impuls˚ je z´roveˇ urˇov´n smˇr ot´ˇen´ y u a n c a e ac ı. 2. Pravideln´ pˇevod poˇtu vygenerovan´ch impuls˚ na ot´ˇky za sekundu. Hodnota y r c y u ac ot´ˇek je kladn´ pro jeden smˇr a z´porn´ pro smˇr druh´. ac a e a a e y 77
  • 85.
    R´ ˇ IZEN´ MOTORKUPOMOC´ SOFTWAROVEHO PLC I I ´ Vizualizaˇn´ program c ı 3. Vlastn´ v´poˇet ˇ´ ıc´ veliˇin. Skl´d´ se z vyhodnocen´ regulaˇn´ odchylky, ı y c rıd´ ıch c a a ı c ı v´poˇtu PID regul´toru a generov´n´ PWM. y c a a ı Cel´ ˇ´ ıc´ program lze nal´zt v podadres´ˇi plc/motorek v archivu se softwarov´m y rıd´ ı e ar y PLC. C.2 Vizualizaˇn´ program c ı Vizualizaˇn´ program je vytvoˇen jako jednoduch´ aplikace pro X-Windows. Ke sv´ c ı r a e ˇinnosti vyuˇ´ a objektovou aplikaˇn´ knihovnu wxWindows (viz. adresa [3]). c zıv´ c ı Program demonstruje moˇnosti vyuˇit´ PLC, pˇiˇemˇ m´ tyto vlastnosti: z z ı rc z a • Umoˇnuje nastavit poˇadovan´ ot´ˇky motorku (tj. s vyuˇit´ ovladaˇe pro ko- zˇ z e ac z ım c e’ e munikaci PLC s user-space RT-Linuxu zap´se tuto hodnotu do pamˇt ov´ho pros- ıˇ 1 toru softwarov´ho PLC ). e • Graficky zobrazuje aktu´ln´ ot´ˇky motorku tak jak je mˇˇ´ softwarov´ PLC (tj. a ı ac erı e c e’ e tyto ot´ˇky jsou ˇteny z pamˇt ov´ho prostoru softwarov´ho PLC). D´le zobrazuje ac e a aktu´ln´ poˇadovanou hodnotu ot´ˇek, tak jak ji nastavil uˇivatel. Vzhled aplikace a ı z ac z je patrn´ z obr.C.1. y Vizualizaˇn´ program je dostupn´ v podadres´ˇi visualisation softwarov´ho PLC. c ı y ar e 1 a e’ y Z pohledu RT-Linuxu se jedn´ o pamˇt ov´ prostor linuxov´ho kernelu. e 78
  • 86.
    R´ ˇ IZEN´ MOTORKUPOMOC´ SOFTWAROVEHO PLC I I ´ Vizualizaˇn´ program c ı Obr´zek C.1: Uk´zka jednoduch´ho vizualizaˇn´ rozhran´ a a e c ıho ı. 79
  • 87.
    Dodatek D Obsah pˇiloˇen´hoCD r z e Souˇ´st´ diplomov´ pr´ce je CD, jehoˇ obsah a struktura jsou patrny z tab.D.1. ca ı e a z Adres´ˇ ar Obsah adres´ˇe ar dokument Text diplomov´ pr´ce ve form´tu PDF a Postscript. e a a linux Zdrojov´ k´dy linuxov´ho j´dra s aplikovan´m patchem e o e a y RT-Linuxu verze 3.2-pre1. Jedn´ se o verzi, na kter´ bylo a e PLC vyv´ ıjeno a testov´no. a rtlinux Staˇen´ bal´ pro RT-Linux a RT-Linux Contrib. z e ıky plc Obsahuje vytvoˇen´ softwarov´ PLC. r e e Tabulka D.1: Obsah a struktura pˇiloˇen´ho CD. r z e 80
  • 88.
    Literatura [1] Domovsk´ str´nkyprojektu RT-Linux [online]. e a <http://www.rtlinux.org>. [2] Domovsk´ str´nky projektu Softwarov´ PLC pro RT-Linux [online]. e a e <http://sourceforge.net/projects/softwareplc>. [3] Domovsk´ str´nky projektu wxWindows [online]. e a <http://www.wxwindows.org>. [4] Charles Donnelly and Stallman Richard. Bison. Free Software Foundation, 1995. [5] In IEC-1131-3 - Programmable controlers - Part3, Bˇezen 1993. r [6] A.M. Kuchling. Regular Expression HOWTO [online]. <http://www.amk.ca/python/howto/regex>. ˇ s [7] Melichar, Ceˇka, Jeˇek, and Richta. Konstrukce pˇekladaˇ˚ 1,2. Vydavatelstv´ z r cu ı ˇ CVUT, 1999. [8] Thomas Niemann. A Compact Guide To Lex&Yacc. ePaper Press. [9] Victor Yodaiken, Duben 1999. The RTLinux Manifesto [online]. <http://www.fsmlabs.com/developers/white_papers/rtmanifesto.pdf>. 81