Datové elementy a výrazy

Každý algoritmus musí mít k dispozici oblast (obyčejně v paměti počítače), ve které jsou uloženy jeho výpočetní stavy. I velmi jednoduché programy musí uložit svá vstupní data, mezivýsledky výpočtů a nakonec (případně) výsledek — bez dat programy zkrátka nemohou pracovat. Musí tudíž existovat způsob, jak data za chodu aplikace (programu) jednoduše schovávat a opět používat.

O datových elementech

Systém Control Web nabízí hned několik druhů dat. Obecnou strukturní i funkční jednotkou všech těchto druhů dat je datový element. Jednotlivé druhy elementů se od sebe navzájem liší významem i použitím — jejich společnou vlastností zůstává pouze to, že slouží k zaznamenání údajů.

Pojem datového elementu je dosti široký a různá místa vysvětlující různé vlastnosti systému Control Web na něj nahlížejí z několika mírně odlišných úhlů. Jednotlivé úhly pohledu vždy vyzdvihují (na úkor ostatních) některý z typických rysů elementu, což významně zjednodušuje a zpřehledňuje popis. Zároveň tak nenásilně vznikla kategorizace datových elementů podle jejich vlastností:

Pokud uvedené čtyři body (pohledy) shrnete, vznikne datový element, který uchovává obraz nějaké veličiny, patří nějakému objektu (mimo něj není element dostupný), nemusí být ve všech časových okamžicích stejně kvalitní a navíc může být pouze jednosměrný (určený jen pro vstup nebo výstup).

Identifikátory

Každý datový element v aplikaci musí mít své jednoznačné pojmenování, které umožní jeho přesnou identifikaci. Sytém Control Web používá pro jména datových elementů (a také pro jména modulů, přístrojů a procedur) identifikátory. Identifikátor je skupina znaků která:

Mezi separátory Control Web počítá následující znaky:

<Tabulátor> <LF> <CR> <EOF> <Mezera> + - * / : \ , : ( ) [ ] { } ^ = #

Identifikátor tudíž může obsahovat všechny ostatní znaky, včetně znaků s diakritickými znaménky. Identifikátory používané v nejrůznějších programovacích jazycích bývají zpravidla omezenější — například identifikátory v jazycích Pascal a C mohou obsahovat pouze písmena, číslice (ovšem ne na začátku identifikátoru) a podtržítko. Control Web je benevolentnější, avšak množina všech v současnosti povolených znaků (kromě písmen, číslic a podtržítka) může být v některé z pokročilejších verzí zúžena.

Datové typy

Datový element slouží k uchování dat, přičemž význam těmto datům vždy přisuzujete vy — tvůrci aplikace (s malou výjimkou systémových datových elementů). Význam veličiny obyčejně přesně ukazuje na datový typ elementu, neboli na strukturu a podobu dat v něm uchovávaných. Control Web rozeznává čtyři hlavní skupiny typů dat:

Jednotlivé datové typy odpovídající popsaným skupinám jsou přesně definovány. Pro každý typ je předem znám jeho rozsah, způsob zápisu (konstruktor), binární vyjádření i konkrétní symbolický název (klíčové slovo) používaný v aplikaci. Všechny datové elementy jsou v paměti uspořádány shodně ve formátu "Little Endian", tedy v pořadí, kdy byte (slabika) s nižším významem obsazuje v paměti místo s nižší adresou. Desetinná čísla systém Control Web zapisuje ve formátu IEEE.754, což je formát používaný například v procesorech Intel. Možné datové typy i s jejich charakteristikami ukazuje následující tabulka:

Datové typy

Datové typy

Údaje o velikostech typů přesně odpovídají popsanému rozsahu hodnot, bohužel však neříkají nic o skutečné velikosti obsazené paměti. Systém Control Web uchovává veškeré datové elementy ve speciální datové struktuře TValue (pro zájemce je jeho definice uvedena v kapitole Komunikace, ovladače a kanály, která má délku 12 byte. Všechny elementy jsou proto dlouhé nejméně 12 byte. Navíc, každý datový element má své unikátní jméno, údaje o inicializačních hodnotách, poznámku, a mnoho dalších údajů nutných pro jeho správnou funkci. Dohromady proto každý datový element zabírá v paměti řádově desítky byte.

Druhy datových elementů

Control Web rozeznává tři druhy datových elementů — konstanty, proměnné a kanály.

Konstanty

Konstanty jsou datové elementy určené pouze pro čtení. Mohou obsahovat data (s výjimkou datového typu buffer) jakéhokoli typu, jsou dostupné neustále a mají tudíž vždy platnou hodnotu. Konstanty mohou být globální (definované v aplikační sekci const, lokální v přístroji (definované v sekci const přístroje) a lokální v proceduře (definované v sekci const procedury).

Konstanty slouží hlavně člověku — umožňují symbolicky pojmenovat jinak nezřetelné číslo nebo umožňují vícekrát použít jednu hodnotu zadanou na jediném místě (v definici konstanty). Typickými konstantami jsou například Ludolfovo číslo (tato konstanta je dokonce systémová) nebo převodní koeficienty jednotek (například 0,017453292 pro převod ze stupňů na radiány). Konstanta určuje svůj typ automaticky ze své hodnoty, takže typ konstanty není nutné zadávat explicitně. Příklad zápisu konstant všech základních typů můžete použít na všech možných místech výskytu — v aplikaci, přístroji i proceduře (ukončení sekce end_const se v procedurách nepoužívá, je nutné ho uvádět pouze při definici globálních a přístrojových konstant):

const
  Odmocnina2 = 1.4142;
  CelýNázev = 'Hlavní plynová kotelna v Horní-Dolní';
  Zapnuto = true;
end_const;

Číselné konstanty dokáží automaticky přispůsobit svůj typ jiným číselným typům podle kontextu použití. Konstantu Odmocnina2 můžete použít ve výrazu (tehdy bude mít skutečně hodnotu 1,4142, neboť výpočty výrazů vždy probíhají v desetinných číslech) nebo v definici parametru access_level (a tehdy nabude hodnoty 1, neboť uvedený parametr přijímá pouze celá čísla). Je možné říci, že z konstanty se použije vždy maximum informace. Pokud není možné využít informaci celou (jako v našem případě), dojde k úpravě hodnoty tak, aby byla v daném místě přijatelná — je-li místo desetinného čísla vyžadováno číslo celé, je desetinná část čísla odřezána.

Konstanty je možné použít ve výrazech kdekoli místo literálu odpovídajícího typu. Stejně dobře je možné konstanty použít na většině míst, která jsou statickými parametry objektů aplikace. Konstantu proto využijete například v definici kanálů (jako parametr timeout nebo v definici přístroje (parametry timer, access_level, ...).

Proměnné

Proměnné jsou datové elementy obousměrné (pro zápis i čtení), jakéhokoli datového typu, dostupné okamžitě. Stejně jako konstanty mohou být proměnné globální, nebo lokální na různých úrovních. Proměnné slouží primárně k úschově vnitřních stavů aplikace. Obyčejně se proměnných používá také pro zpřehlednění výpočtů: nejprve se vypočítají mezivýsledky, které se uloží do pomocných proměnných, a teprve poté se provede hlavní výpočet již s hodnotami mezivýsledků uloženými v pomocných proměnných.

Proměnné musejí při startu aplikace získat počáteční hodnotu, která musí být do proměnné zapsána ještě před rozběhem — aby bylo zaručeno, že přístroje vždy vyčtou z proměnné definovanou hodnotu (místo hodnoty nedefinovné a tedy potenciálně velmi nevhodné). Zápis první hodnoty se nazývá inicializace, počáteční hodnota je potom inicializační hodnota. Veškeré proměnné jsou inicializovány alespoň jedenkrát. Podle příslušnosti proměnné k určitému objektu (aplikaci, přístroji nebo proceduře) může proměnná být za běhu aplikace inicializována i vícekrát. V prvém přiblížení je možné říci, že proměnné, které jsou inicializovány vícekrát jsou proměnné normální (variable), zatímco proměnné, které systém inicializuje jen jednou, jsou proměnné statické (static). Situaci znázorňuje obrázek:

Inicializace proměnných

Inicializace proměnných

Podrobný popis použití lokálních elementů včetně popisů inicializací a potenciálních problémů nabízí kapitola Programování a procedury — OCL. Je možné říci, že statické proměnné "přežívají" a vždy obsahují poslední hodnotu, kterou do nich aplikace zapsala, zatímco normální proměnné jsou vždy před použitím v definovaném místě (podle tabulky) inicializovány.

Obě dvě varianty proměnných — variable a static — mají shodnou syntaxi zápisu. Sekce var může být umístěna do aplikace, přístroje nebo procedury, sekce static pouze do přístroje nebo procedury, na globální úrovni její použití nemá význam, neboť globální proměnné jsou tak jako tak inicializovány jen jednou při startu aplikace. Příklad ukazuje zápis proměnných všech skupin typů:

var
  TeplotaVody = real, 10;
  JménoUživatele = string, 'nikdo nezapsán';
  SvítíSe = boolean, true;
  Buffer1 = buffer, 10, cardinal;
end_var;

Stejně jako v případě konstant je klíčové slovo end_var na globální a přístrojpvé úrovni vyžadováno a v procedurách odmítáno, end_static je přípustné jen na úrovni přístrojů. Jistě jste zaznamenali, že proměnná má explicitně zadán svůj datový typ. To je nutné, neboť proměnná (na rozdíl od konstanty) dokáže hodnotu i přijmout, přičemž je nutné rozlišit, jestli se někdo nepokouší do proměnné uschovat data nevhodného typu. Například, je nesmysl ukládat výsledek číselného výpočtu do řetězcové proměnné — nicméně bez udání typu proměnné by takovému chybnému přiřazení nebylo možné zabránit, protože by systém nemohl posoudit, že si typy dat navzájem neodpovídají.

Proměnné využijete nejspíše mnohem častěji než ostatní elementy, protože jsou nejméně omezeny dodatečnými pravidly. Většina údajů předávaných uvnitř aplikace mezi přístroji bude uschována právě v proměnných.

Kanály

Kanály jsou datové elementy s určeným směrem (mohou být vstupní — input, výstupní — output nebo obousměrné — bidirectional), libovolného datového typu, mohou být pouze globální (nemůže existovat kanál definovaný jen v určité proceduře) a nejsou kdykoli volně dosažitelné.

Naposled jmenovaná vlastnost kanálů je asi nejdůležitější, a také bohužel nejkomplikovanější. Asi nebude daleko od pravdy tvrzení, že celý problém průmyslové automatizace sestává ze dvou úloh (navzájem propojených) — první, jak efektivně a účinně sbírat data a posílat je zpět, a druhé, jak efektivně a účinně data zpracovat — vizualizace a archivace a výsledky aplikovat — řízení. Kanály spolu s ovladači v aplikaci systému Control Web řeší úlohu první — komunikační.

Každý kanál v aplikaci je projekcí nějakého fyzicky existujícího signálu nebo řídicího prvku. Obojí (signál i řídicí prvek) je přímo svázáno s fyzikální podstatou konkrétní veličiny a kanály tak uvnitř aplikace symbolizují a modelují reálný svět. Spojení kanálu s konkrétním snímačem obstarává ovladač, který nějakým způsobem dokáže ze snímačů přečíst(nebo do řídicích prvků zapsat) aktuální hodnotu veličiny. Ovladač nabízí podle své konfigurace množinu dostupných vstupů a výstupů a každý takový vstup nebo výstup může být v aplikaci použit jako kanál:

Signály a kanály

Signály a kanály

Povolené vstupy a výstupy ovladače definuje mapovací soubor ('*.dmf'). Údaje z toho souboru používá během překladu Control Web pro ověření správnosti definice kanálu. '*.dmf' soubor se tedy uplatňuje jen při překladu a není s ovladačem fyzicky svázán (jeden '*.dmf' můžete použít pro různé ovladače). Skutečný konfigurační soubor, který zpravidla obsahuje i přesné definice vstupů a výstupů ovladače, je soubor parametrický ('*.par'). Oba soubory, mapovací i parametrický, jsou součástí definice ovladače.

Kanál použitý v aplikaci je svázán s různými konfiguračními soubory takto (popsané schéma je ilustrační a nemusí vždy platit, přesto však v 95 % případů odpovídá skutečnosti):

Z bodů 1, 3 a 4 bezprostředně vyplývá, že soubory '*.dmf' a '*.par' musí být ve vzájemném souladu. Dostupné ovladače většinou v mapovacím souboru nabízejí jakousi maximální množinu kanálů, která je potom v parametrickém souboru použita jen z části (jako podmnožina). Konkrétní zápisy konfigurací ovladačů jsou vždy součástí jeho dokumentace.

Kanály mají směr, mohou být vstupní (input), výstupní (output) nebo obousměrné (bidirectional). První varianty jsou přirozené — vstup slouží ke sběru dat a výstup k ovládání. Pokud kanály přímo reprezentují skutečné snímače a řídicí prvky, je zřejmé, že snímač bude vstupem a řídicí prvek výstupem. V určitých případech může být výhodné použít kanál, který je obousměrný. Dosti často se tento druh kanálů používá při komunikacích s průmyslovými automaty, kdy je kanál projekcí nějakého vnitřního registru automatu — přímá vazba na snímač nebo ovládací prvek je zde přetržena. Použití obousměrného kanálu může zjednodušit některé aplikační operace. Ale pozor. Z hlediska programátorské čistoty, přehlednosti aplikace a elegance návrhu je velmi dobré obousměrné kanály nepoužívat. Obousměrný kanál sice umožňuje zápis i čtení, nicméně tento fakt nijak neovlivňuje základní vlastnost kanálů — potenciální nedostupnost. Obousměrný kanál proto může současně čekat na výsledek měření i na potvrzení zápisu hodnoty do ovladače (a tím i do technologie). Tehdy se ve vnitřní datové oblasti a v technologii mohou vyskytnout různé hodnoty, přičemž analýza toho, která hodnota se kde ocitne je téměř neuskutečnitelná. Mechanizmus komunikace přístrojů, jádra systému Control Web a ovladačů je sice přesně definován a dodržován, ale při narůstajícím množství komunikací je kvantitativní složitost analyzovaných procesů tak velká, že se nevyplatí (finačně ani časově) o analýzu ani pokoušet. Použití obousměrných kanálů je proto třeba dobře promyslet, zejména v situacích, kdy mohou kriticky ovlivnit chování automatizační úlohy.

Vstupní kanály jsou systémem Control Web měřeny podle potřeb aplikace. V principu je schéma měřicí komunikace následující:

Kanály výstupní nemusejí být měřeny, většinou stačí požadavek zapsat do ovladače, který již zajistí skutečný přenos až na konečné místo. Nicméně i na výsledek zápisu dat je možné počkat:

Hlavní rozdíl mezi vstupy a výstupy je následující: vstupní kanál je správný v techologii a aplikace by na jeho změření měla počkat, aby také pracovala se správnou hodnotou; výstupní kanál je správný v aplikaci a do techologie se pouze přenáší — aplikace vlastní správnou hodnotu a nemusí proto čekat na dokončení komunikace.

V obou případech byla zmíněna prodleva komunikace, která ovlivňuje vzájemné chování ovladače a jádra systému. Prodleva může být nastavena v systému globálně — pro všechny kanály najednou, nebo pro každý kanál individuálně v jeho parametru timeout. Oba způsoby individuální i globální je možné kombinovat, takže můžete globálně ovlivnit všechny kanály najednou a jen u některých z nich komunikační parametry ovlivnit speciálně.

Obousměrné kanály se chovají jako vstupní kanály s možností zápisu, a přijímají proto veškerá nastavení vstupních kanálů.

O způsobech komunikace, časovém kroku, prodlevách a mechanizmu překryvů u obousměrných kanálů pojednává velmi podrobně kapitola Časování aplikací reálného času.

Ukázka zápisu kanálů může být například následující (připomínám, že kanály mohou být definovány pouze na globální úrovni — není možné vytvořit kanál pouze pro proceduru):

channel
  TeplotaKotle1 = real, 1005, Simatic, input;
  OtevřeníKlapky = real, 2001, Simatic, output, 0.5;
  HořákHoří = boolean, 3010, Simatic, input;
  Buffer2 = buffer, 4000, cardinal, 10, LabCard, input;
end_channel;

Parametry kanálů za sebou následují v pořadí: datový typ (real), číslo kanálu v ovladači (1005), symbolické jméno ovladače (Simatic) a směr (input). Výstupní kanály navíc potřebují (stejně jako proměnné) inicializační hodnotu (0.5). Výstupní kanály po inicializaci zapisují svou (inicializační) hodnotu do ovladače (a tím i do technologie), čímž se zaručí, že na obou místech (reálném i aplikačním) budou shodná data. Samozřejmě, chování systému při inicializaci můžete téměř libovolně ovlivnit, například popisovaný zápis inicializačních hodnot je možné ovlivnit pomocí parametru aplikace skip_init_outputs. Popis a chování parametrů časování a inicializace najdete v kapitole Časování aplikací reálného času.

Podobně jako proměnné můžete kanály použít kdekoli na vstupu přístroje, výstupu přístroje nebo ve výrazu. Překladač přitom hlídá (a odmítá) pokusy zapsat do vstupních kanálů.

V aplikaci kanály vždy představují živá data, která mění svou hodnotu nezavisle na aplikaci.

Číselné datové typy

Čísla mohou být v principu desetinná, nebo celá. Člověk mezi nimi zase až takový rozdíl nedělá, ale pro počítač to jsou dvě zcela rozdílné oblasti problémů — desetinná čísla jsou komplikovanější, zato ale dokáží pokrýt mnohem větší rozsah hodnot.

Pozor na odlišné konvence zápisu desetinných čísel v našich a anglosaských zemích. Zatímco u nás je obvyklé oddělovat desetinnou část čísla čárkou, v anglosaských zemích se používá tečka. Control Web používá stejně jako všechny ostatní vývojové systémy a programovací jazyky desetinnou tečku. Pokud v přístroji použijete zápis expression = a * 1,9;, systém ohlásí chybu. Pokud ale stejné číslo zapíšete u klíčového slova timer, žádná chyba hlášena nebude, systém údaj akceptuje jako časování s periodou 1 a posunutím 9.

Jednotlivé číselné typy jsou v systému Control Web navzájem kompatibilní (zástupné) a můžete je používat bez obav z kolize typů. Číselné datové elementy se v aplikaci vyskytují na různých místech, přičemž jejich vzájemnou kompatibilitu je ve všech takových případech třeba zajistit (kompatibilita není samozřejmá věc). V systému Control Web přicházejí v úvahu následující způsoby použití číselných elementů:

Popsaná pravidla platí v celém systému Control Web univerzálně. Aplikování těchto pravidel vede k tomu, že při běžné práci není programátor nucen nad čísly nijak přemýšlet — výsledné chování systému je intuitivní. Uvedení přesného popisu pravidel však bylo nutné, neboť v určitých speciálních případech programátor potřebuje přesně vědět, jak se výpočet nebo datový element zachová.

Poslední zmínka v oddíle o číselných datových typech je věnována bitovým operacím, pro které jsou v systému Control Web definovány speciální funkce. Všechny takové bitové funkce nejprve převedou vstupní číselnou hodnotu na datový typ longcard (celé 32bitové bezznaménkové číslo), nad touto hodnotou posléze provedou patřičnou operaci a výsledek vrátí v datovém typu real. Konverze na celé bezznaménkové číslo probíhá automaticky uvnitř funkcí, a proto například volání funkce bitget( 128.21, 7 ) správně skončí výsledkem 1,0. Číslo 128,21 je nejprve převedeno na číslo 128 a teprve poté je v něm testován bit 7. Popis všech funkcí (nejen bitových) je součástí posledního oddílu této kapitoly.

Pole

Všechny datové typy (kromě typu buffer) umožňují vytvoření souvislé oblasti dat, která najednou obsáhne řadu elementů stejného typu. Jednotlivé prvky takové struktury jsou přístupné pomocí indexu, jakéhosi pořadového čísla, celá struktura se nazývá pole. Počáteční a koncový index je u proměnných libovolně volitelný, u kanálů musí odpovídat mapovacímu souboru. Snadno tedy sestrojíte jak pole elementů s indexy 52..54 tak s indexy 0..2. Obě pole budou v paměti zabírat oblast o velikosti třech hodnot datových elementů. Pole jsou v paměti skladována efektivněji než samostatné datové elementy, neboť jedno pole s jedním typem a jedním jménem zahrnuje několik elementů (které již nemusejí být samostatně pojmenovávány ani typovány). Číselná pole jsou skladována v blocích po 8 byte (velikost typu real, který, jak již víte, slouží k vnitřní úschově čísel) a logická pole v blocích po 1 byte. Ilustrační obrázek ukazuje organizaci několika samostatných elementů a pole:

Pole a skaláry

Pole a skaláry

Není dost dobře možné říci, kdy použít pole a kdy samostatnou proměnnou. Obyčejně se programátor intuitivně přikloní k variantě, která mu lépe vyhovuje.

Prvek pole je možné použít stejně jako jednoduchý datový element. Je lhostejné, napíšete-li místo elementu var1 element pole ar[1]. Navíc, zápis prvku pole může být velmi mocnou zbraní, protože index (v ukázce a) je také výrazem, a může za běhu aplikace nabývat různých hodnot. Proto lze zkonstruovat následující sekvenci výrazů:

a = b + c;
výsledek[a] = teplota[a];

Z obou polí (výsledekteplota) bude vždy použit prvek s indexem odpovídajícím hodnotě datového elementu a.

Definice polí je velmi jednoduchá, do zápisu definic proměnných a kanálů musí pouze přibýt indexy a klíčové slovo array (pole):

var
  výsledek = array [0..49] of real, 0;
end_var;

channel
  teplota = array [0..49] of real, Simatic, input;
end_channel;

Externí datové elementy

Control Web dokáže najednou provozovat více modulů (na více počítačích) v rámci jednoho projektu. Jednotlivé moduly navzájem mohou přistupovat na svá data, ať už se jedná o proměnné nebo kanály. Systém přitom standardně zajišťuje vzájemnou synchronizaci modulů — například kanály budou vždy korektně změřeny i ve vzdáleném modulu. Přenos dat po síti probíhá skrytě, v aplikaci samotné se použití externího datového elementu projevuje pouze zápisem jména modulu před jeho jméno:

...
a = b + c; (* lokální elementy *)
a = modul1.b + modul2.c; (* externí elementy *)
...

Prvý výraz používá elementů b a c přítomných přímo v modulu, druhý výraz potom element b vyčítá z modulu modul1 a element c z modulu modul2. Vyčítání a zápis vzdálených datových elementů probíhá (podobně jako komunikace u kanálů) s určitým časovým zpožděním. Proto jsou (stejně jako u kanálů) definovány prodlevy a nastavení, která mohou komunikaci ovlivnit nejrůznějším způsobem. Rozdíl mezi komunikací kanálů a externích elementů spočívá v okamžiku uskutečnění komunikace. Kanály se vždy měří před rozběhem přístrojů v časovém kroku, externí datové elementy se komunikují podle potřeby za chodu přístrojů. Obecně platí, že kanály jsou zpracovávány i komunikovány skupinově, zatímco externí elementy jsou zpracovávány sekvenčně a komunikovány skupinově. Nepromyšlená komunikace externích datových elementů proto může aplikaci zatížit více, než nepromyšlená komunikace kanálů.

Externí datové elementy primárně existují v cizím modulu, který nemusí být vždy dostupný. Systém Control Web zajišťuje jejich dostupnost automaticky při startu aplikace (například tak, že sám na jiných počítačích systémy Control Web spouští). Pokud však aplikace neběží, není možné se vzdáleným modulem navázat komunikaci, a není možné zjistit, jaké má požadovaný element vlastnosti — jestli to je pole, jakého je datového typu a případně jestli to je kanál, nebo proměnná.

Externí datové elementy jsou proto při vývoji aplikace ve výrazech a přístrojích akceptovány "tak jak jsou" a překladač nad nimi neprovádí žádné kontroly. Z toho vyplývá, že je možné při vývoji používat chybné nebo neexistující externí datové elementy, aniž by byla jakákoli možnost chybu odhalit. Vše se zkontroluje až při spouštění aplikace, neboť až tehdy dokáže Control Web získat všechny potřebné údaje.

Modulům, mezimodulárním komunikacím a externím elementům se samostatně věnuje kapitola Modulární a distribuované aplikace.

Atributy

Kanály a externí datové elementy jsou natolik komplexní, že pro přesné sledování dějů mnohdy jejich samotná hodnota nestačí. Control Web proto u těchto elementů nabízí prostředek, s jehož pomocí můžete o každém kanálu nebo externím elementu zjistit mnoho podružných informací — například statistické údaje o komunikaci.

Atributy se chovají podobně jako proměnné a jsou kdykoli k dosažení (nevynucují žádnou komunikaci). Některé z atributů jsou navíc určeny pouze pro čtení, takže pokus o zápis způsobí chybu překladu. Syntaxe zápisu atributu ve zdrojovém textu vyžaduje připojení znaku : se jménem atributu za jméno datového elementu:

...
kanál:fix = true;
...

Atributů je celá řada, některé jsou společné pro kanály i externí elementy, některé jsou jen pro čtení. Control Web podporuje následující atributy (v hranatých závorkách je zapsáno [K] či [E], je-li atribut platný pro kanály nebo externí element, a [R], je-li atribut určen pouze pro čtení):

Výrazy

S daty uchovanými v datových elementech je nutné pracovat. Jakýkoli výpočet, konstrukce řetězce s příkazem nebo vyhodnocení několika vzájemně se ovlivňujících stavů vždy představují nějakou operaci nad vstupními datovými elementy, přičemž výsledek této operace je obyčejně uchováván pro další použití.

Výraz slouží k vyřešení všech nastíněných úloh. Výrazy se v aplikaci vyskytují na nejrůznějších místech, především na vstupech přístrojů, v podmínkách nebo v procedurách v přiřazovacím příkazu a při předávání parametrů do jiných procedur. Výraz obecně reprezentuje pouze výpočet, takže například v příkazu přiřazení je výrazem jen jeho pravá část — část za rovnítkem.

Prvky výrazu mohou být datové elementy, operátory a funkce. Výraz není v principu nijak omezen typy použitých datových elementů — jeden výraz může obsahovat současně řetězcové i číselné elementy. Nicméně, každý operátor i funkce přesně určují, s jakými typy elementů pracují, a těmto podmínkám samozřejmě musí výraz plně odpovídat. Můžete proto vytvořit následující správný výraz:

length( Command ) + 1 = 50

přičemž Command je řetězec, 1 a 50 jsou čísla a výsledkem operátoru = (a tedy i celého výrazu) je logická hodnota. Výraz je možné vytvořit, neboť:

Naopak chybný by byl výraz:

Command + 1 = 'ahoj' (* toto je chybný výraz *)

neboť operátor + vyžaduje na své levé straně číslo (není splněno) a operátor = na své pravé straně také vyžaduje číslo (opět není splněno).

Control Web podporuje následující operátory

a následující funkce (zápis funkcí je uveden včetně typů parametrů):

Následující odstavec popisuje souhrnně výrazy systému Control Web pomocí gramatiky. Gramatika je zapsána jako sled přepisovacích pravidel, přičemž velkými písmeny jsou zapsány neterminální symboly EXPR, malými terminální symboly number, pomocí závorek [] je zapsán opakovaný výskyt 0..n-krát, pomocí závorek {} je zapsán opakovaný výskyt 1..n-krát a symbol | odděluje možné varianty:

  EXPR         -> SIMPLEEXPR [ RELOP SIMPLEEXPR ]
  RELOP        -> '=' | '#' | '<' | '>' | '<=' | '>=' | '<>'
  SIMPLEEXPR   -> TERM { ADDOP TERM }
  ADDOP        -> '+' | '-' | 'or' | 'xor'
  TERM         -> FACTOR { MULOP FACTOR }
  MULOP        -> '*' | '/' | 'and'
  FACTOR       -> '(' EXPR ')' | 'not' FACTOR | [ SIGNOP ] FACTOR |
                  REALFUNCTION '(' SIMPLEEXPR ')' |
                  REALFUNCTION2 '(' SIMPLEEXPR ',' SIMPLEEXPR ')' |
                  REALFUNCTION3 '(' FACTOR ',' SIMPLEEXPR ')' |
                  STRFUNCTION '(' FACTOR ')' |
                  STRFUNCTION2 '(' FACTOR ',' FACTOR ')' |
                  STRFUNCTION3 '(' FACTOR ',' FACTOR ',' SIMPLEEXPR ')' |
                  STRFUNCTION4 '(' FACTOR ',' SIMPLEEXPR ',' SIMPLEEXPR ')' |
                  STRFUNCTION5 '(' SIMPLEEXPR ',' SIMPLEEXPR ')' |
                  VALUE |
                  arrayelement '[' SIMPLEEXPR ']' |
                  channelarray '[' SIMPLEEXPR ']'
 SIGNOP        -> '+' | '-'
 VALUE         -> number | constant | variable | channel | 
                  modulename '.' external
 REALFUNCTION  -> 'sqrt' | 'sin'  | 'cos'  | 'tan'   |
                  'asin' | 'acos' | 'atan' | 'sinh'  |
                  'cosh' | 'tanh' | 'log'  | 'ln'    | 
                  'exp'  | 'abs'  | 'sgn'  | 'trunc' |
                  'bitnot' 
 REALFUNCTION2 -> 'pow'    | 'atan2'  | 'min2'   | 'max2' |
                  'bitset' | 'bitclr' | 'bitget' |
                  'bitand' | 'bitor'  | 'bitxor' |
                  'bitshr' | 'bitshl'
 REALFUNCTION3 -> 'val'
 STRFUNCTION   -> 'length' | 'caps'   | 'lows'
 STRFUNCTION2  -> 'pos'    | 'concat'
 STRFUNCTION3  -> 'insert' | 'item'
 STRFUNCTION4  -> 'slice'  | 'delete'
 STRFUNCTION5  -> 'str'

Shrnutí