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