Takze, pokial ide o tu akoze moju cast, "Riadiaci system" ci take

volaco, rozdelil som si to na dve casti:

1.) prekladac zdrojoveho textu riadiaceho programu

2.) samotny regulator fungujuci podla vystupu z 1. (teda z toho

kompilatora)

Takze vstupom do prekladaca je cosi ako konfiguracny subor, ktory

bude (ako sme sa ja a Juro dohodli) jeden jediny pre cely ten

uzasny system. Takze kazdy z nasich troch modulov v nom bude mat

svoju cas¯. Ta moja by mala pripominat nejaky jazyk, pomocou

ktoreho by malo byt mozne popisat algoritmus riadenia riadeneho

systemu. Syntax tohoto jazyka som navrhnul takto:::

PROGRAM::=

program NAME

begin

STATE_DEFINITION ,

STATE_DEFINITION

}

end

 

STATE_DEFINITION::=

state label waits  XVAR_NAME , XVAR_NAME}

[VAR_STATEMENT

 VAR_STATEMENT}]

VAR_STATEMENT::=

VAR_NAME : COMMAND |

 | VAR_NAME:(

 COMMAND

 COMMAND

 )

COMMAND::=

SET VAR_NAME |

RST VAR_NAME |

START VAR_NAME, NUMBER |

STOP VAR_NAME |

NEXT label |

ERROR "STRING"

LABEL::=CHAR{CHAR}

VAR_NAME::=label

XVAR_NAME::=+|-VAR_NAME

NUMBER::=DIGIT{DIGIT}

STRING::={CHAR|SPACE}

CHAR::=LETTER|DIGIT|OTHER

LETTER::=A..Z,a..z

DIGIT::=0..9

OTHER::=_

SPACE::=' '

NAME::=STRING

Pre ilustraciu navrhujem do hrubeho navrhu pridat aj subor

POK.TXT, v ktorom je vidiet cosi, co by mohlo niest nazov "prva

verzia riadiaceho algoritmu", pricom jednym dychom treba

poznamenat, ze zatial sa tento algoritmus nedokaze vysporiadat so

vsetkymi chybami. Niektore neodhali a ak nejaku odhali tak len o

tom vypise spravu a prestane regulovat; ak mam parafrazovat

klasicky vyrok "to je dosti podstatna zavada u REGULOVACIHO

stroje". V tom programe je dobre upozornit na to, ze cely program

je vlastne skovany v prikazoch STATE za ktorym nasleduje meno

prave popisovaneho stavu a potom WAITS za ktorym je v brutalnych

zatvorkach zoznam premennych ktore mozu veci pohut tak, ze sa

volaco alebo volakto dostane do ineho stavu. Mena tychto

premennych sa skladaju z mena instancie objektu, bodky a mena

premennej tohoto objektu. Pred tymto menom je vzdy plus alebo

minus. Ak je tam + caka sa na to, ze tato premenna nadobudne

hodnotu 1; lahko kazdy uhadne na co sa caka ak je tam -. Za

riadkom so slovom STATE mozu nasledovat riadky popisujuce akcie

ktore sa maju vykonat, podla toho ktora premenna ten cirkus

vyprovokovala. Vynimkou je situacia, ked sa caka len na jednu

jedinu premennu. potom uz nemusi byt uvedene nic a znamena to, ze

sa iba prejde do nasledujuceho stavu. A teraz pozor, nasleduje

popis prikazov:::

SET - nastavenie uvedenej premennej na hodnotu 1

RST - no hadaj! (ak si softverista mozes 3 krat :-)

START - odstartovanie casovaca s danym menom na urcenu dobu

STOP - zrusenie casovaca pred jeho uplynutim

NEXT - nasledujuci stav do ktoreho sa teraz system dostane

ERROR - zatial ma len funkciu PRINTu, napise dany retazec zatial

 neviem kam, a s regulaciou je koniec

Tolko teda syntax. V skutocnosti je to o dost zlozitejsie pokial

ide o nazvy premennych. Bude totiz treba rozlisovat medzi nazvami

premennych ktore patria objektom a medzi nazvami premennych ktore

su casove konstanty. Tak isto bude treba pred samotnym algoritmom

uviest niektore deklaracie, ako napriklad deklaracie prototypov

objektov v ktorych bude povedane, ake premenne maju jednotlive

objekty a ci ide o vstupy alebo vystupy. Potom treba deklarovat

konkretne instancie objektov pouzitych v nasom modely. Ale do

hrubej specifikacie je to uz aj tak moc tenke. Prekladac teda

musi zabezpecit najskor skontrolovanie vstupneho suboru vzhladom

na uvedenu syntax. S tym tiez suvisi kontrolovanie takych

konkretnosti ako ci su pouzite iba premenne ktore boli

deklarovane, ale to uz je asi semanticka analyza (neviem,

nevyznam sa v tom). Samozrejme treba tiez skontrolovat, ci

v menach premennych su len take znaky, ake tam byt mozu (toto je

zase asi lexikalna analyza). Kedze ide o nechutnu pracu s textom,

implementovat sa to bude :-) v PERLe, ktory z toho robi prechadzu

ruzovou zahradou, aspon pre toho kto sa skamarati s regularnymi

vyrazmi. Tiez to umoznuje spojit lexikalnu, syntakticku a cast

semantickej analyzy do hromady, takze mi zatial stacil jediny

prechod cez vstupny subor. Aktualny stav je teda taky ze prve dve

analyzy su implementovane kompletne, dorobit treba kontrolu

pouzitych casovych premennych. Potom pride na rad samotny

preklad, ktory zo vstupneho textoveho suboru s riadiacim

algoritmom urobi binarny subor, ktory bude obsahovat struktury.

Tieto struktury budu prakticky popisovat stavovy automat. Druha

cast, teda samotny regulator uz bude podla tychto struktur

vediet, co ma robit (podla toho textu by to vedel tazko, aj ked

dalo by sa :-).

Tu asi zacina popis casti 2.), teda regulatora. Tak teda

strukturky (pokial si spominam na PSI, toto by asi malo patrit az

do navrhu, ale co uz :-(

struct sublabel_item

{ command_item *first_command;

 variable var_name;

}

struct command_item

{ unsigned char command; // 1:SET, 2:RST, 3:STOP, 4:NEXT, 5:ERROR

 unsigned int parameter2;

 void *parameter1;

 command_item *next_command;

}

struct variable

{ unsigned int object; // cislo podla poradia deklaracie v subore

 unsigned int var; // cislo premennej v objekte podla deklaracie v subore

 unsigned char /*Bool*/ value;

}

Automat bude popisany polom s polozkami typu sublabel_item. Kazda

tato polozka ma poiter na zretazeny zoznam akcii ktore sa maju

vykonat, ak premenna urcena strukturou VARIABLE nadobudla tu

spravnu hodnotu. V tomto zozname musi byt minimalne prikaz NEXT,

ktory urci nasledujuci stav (to by mal zabezpecit prekladac).

Kazdy stav je tvoreny niekolkymi takymito strukturami. pokial ide

o strukturu comman_item, tak ta je myslim jasna. Akurat ten druhy

parameter ktory sa vola parameter1 je nic nehovoriaci pointer a

to preto, ze podla typu prikazu to moze byt pointer napr. na

string (teda pole charov) v pripade prikazu ERROR, alebo na

nejake cislo. Strukturu typu variable sme si uz s Jurom dohodli

ako spolocnu. Pomocou nej budeme spolu komunikovat. On (teda

model riadeneho systemu) mi takto bude posielat stavy (stavovych)

premennych ktore sa prave zmenili a ja mu budem takto posielat

hodnoty (akcnych) premennych, ktore si regulator zela nastavit.

Myslim ze aj Moorgyho prostredie by mu pomocou tejto istej

struktury mohlo posielat, ktore premenne a ako sa maju pokazit.

Ale asi potom bolo lepsie mat polozku VALUE typu unsigned char a

nie Bool - ale to nech si dohodnu oni.

Regulator bude fungovat tak, ze za normalnych okolnosti sa bude

flakat a ak pride sprava od Jura o tom, ze nejaka premenna sa

zmenila, pozrie sa do svojich struktur. Ak tak prichodivsiu

premennu nenajde, tak narobi kraval. Inak postupne vykona

predpisane akcie, posledna z nich ho privedie do noveho stavu a

on zase zachrape. Prebudit ho tiez moze uplynutie casu casovaca

na ktory caka, ak ho predtym v ramci nejakej akcie odstartoval.

To¯ fsjo rybjata - That's all folks