Untitled - REMAX CZ sro
Transkript
SIMPLE 4 Popis programovacího jazyka SIMPLE verze 4 pro vývoj aplikací s PLC MICROPEL edice 03.2004 2. verze dokumentu doplnìn popis editorù doplnìn popis spec. funkcí doplnìn popis sdílených síových promìnných © MICROPEL 03.2004 vechna práva vyhrazena kopírování publikace dovoleno pouze bez zmìny textu a obsahu http://www.micropel.cz SIMPLE V4 - popis jazyka 03.2004 94 stran OBSAH 5 1. Programovací jazyk SIMPLE V4 1.1 Mùj první pøíklad 5 1.2 Mezní stavy a vlastnosti promìnných 9 1.3 Promìnné a mezní stavy 10 12 2. Konstrukce programu 2.1 Lexikální symboly 12 2.2 Identifikátory 13 2.3 Celoèíselné literály 14 2.4 Èíselné literály v pohyblivé øádové èárce 15 2.5 Klíèová slova 15 2.6 Typy promìnných 15 2.7 Klíèová slova a speciální znaky logických výrazù 17 2.8 Klíèová slova pro podprogramy a funkce 18 2.9 Dalí vyhrazená slova a jejich významy 19 2.10 Komentáøe 20 2.11 Oddìlovaèe øádek 21 22 3. Sémantika 3.1 Identifikátory a jejich vlastnosti 22 3.2 Celoèíselné promìnné 25 3.3 Aritmetické promìnné 26 3.4 Jednoduché promìnné 26 3.5 Pole 27 3.6 String 27 3.7 Výrazy 28 3.8 Kompatibitita typù promìnných 30 4. Zápis zdrojového textu v SIMPLE V4 33 ! 4.1 Deklarace konstant 33 4.2 Deklarace promìnných 33 4.3 Pole promìnných a jejich deklarace 34 4.4 Definice typù 34 4.5 Deklarace tabulek 35 4.6 Deklarace podprogramù a funkcí 36 SIMPLE V4 - popis jazyka 03.2004 94 stran ! 4.7 Pøíkazy jazyka SIMPLE V4 37 4.8 Umìle zavedené pøíkazy 40 4.9 Makra 42 44 5. Chyby 5.1 Chybová hláení generovaná pøekladaèem 44 6. Syntaktické diagramy 67 7. Vstupy/výstupy, speciální registry 82 " 7.1 RESET 82 7.2 Rychlost systému 82 7.3 Èasovaèe 82 7.4 Reálný èas 83 7.5 A/D pøevodník 85 7.6 Obsluha displeje a klávesnice 85 7.7 Funkce DISPLAY 87 7.8 Formátování tisku hodnot na displej 88 7.9 Formát pro tisk znakù 90 7.10 Definování vlastních grafických symbolù 90 7.11 Jak funguje zobrazování 91 7.12 Editace hodnot 93 7.13 Síové promìnné 93 7.14 Seznam speciálních funkèních promìnných 94 SIMPLE V4 - popis jazyka 03.2004 94 stran " 1. Programovací jazyk SIMPLE V4 Programovací jazyk SIMPLE V4 byl navren pro programování prùmyslových øídících automatù MICROPEL øady MPC300, PES-K a vyích. Jazyk v maximální míøe usnadòuje vývoj øídících algoritmù a jejich implementaci ve zmínìných automatech. Pomocí programovacího jazyka SIMPLE V4 je moné nyní plnì vyuít technických prostøedkù implementovaných v automatech. Jazyk umoòuje s vysokým programovacím komfortem navrhnout a odladit i takové aplikace, jejich øeení pomocí jazyka Simple V2 (pøedchùdce verze 4) bylo znaènì komplikované a vyadovalo pomìrnì vysokou erudici programátora. Jazyk pøebírá od svých pøedchùdcù (Simple) vechny pozitivní rysy a ve znaèné míøe je roziøuje a pøináí s sebou i nìkterá novátorská øeení mezních situací vyskytujících se v oblasti programování. Vzhledem k tomu, e jazyk SIMPLE V4 je navren pro øeení prùmyslových øídících algoritmù, zachovává si vechny charakteristiky jazyka bezpeèného programování a bìhu programu v reálném èase. Program je vdy vykonáván od zaèátku a do pøíkazu END odkud se bìh programu vrací zpìt na první pøíkaz. Vzhledem k tomu, e jazyk SIMPLE V4 není syntakticky vybaven na programování interních programových smyèek a neumoòuje programovat ádné skoky, je program vytvoøený v tomto jazyce imunní vùèi vzniku tzv. fatálních chyb jako je napø. zacyklení èi bloudìní. Z výe uvedeného vyplývá, e kadý programový øádek, vyjma speciálních konstrukcí, se vdy v prùbìhu hlavní programové smyèky vyhodnocuje. Konstrukce jazyka tak nutí programátora pouívat programovací obraty, které odpovídají struktuøe tzv. stavového stroje. Výsledný program se pak znaènì blíí konstrukci logického automatu z klasických logických obvodù, pøi zachování znaèné variability øeení dané právì programovými nástroji jazyka SIMPLE V4. 1.1 Mùj první pøíklad Ukame si obecné vlastnosti jazyka SIMPLE V4 na jednoduchém pøíkladu. Pøedstavme si, e mìøíme výkon èerpacího zaøízení a podle hodnoty tohoto výkonu øídíme nìjakou pomocnou pumpu apod. Pøíklad je pouze ilustrativní a kolský. Postaèí vak na demostrování stylu zápisu jazyka a ukázání jeho nìkterých specifických vlastností. # SIMPLE V4 - popis jazyka 03.2004 94 stran # Pøíklad I0 # Mereni_vykonu ; Oznaèení pøeddefinované promìnné jménem var word Vykon ; Promìnná pro pomocný výpocet výkonu var safe word Pumpa ; Promìnná pro stanovení øízení pomocné pumpy /* Funkce pro výpoèet a pøekalibrování výkonu */ Function word Zjisti_Vykon (word Vstup) return ( Vstup * 5 / 3 + 15 ) ; ; Zde zaèíná hlavní smyèka Vykon = Zjisti_Vykon (Mereni_vykonu) ; Uloení pøekalibrované hodnoty výkonu do promìnné Výkon if (Vykon < 50) then pumpa = pumpa+1 else pumpa = pumpa-1 ;podmínìný pøíkaz pro nastavení øídící velièiny pomocné pumpy end V zápisu zdrojového textu uvedeného pøíkladu mùeme najít nìkolik oddílù. Nejprve je nutné zapsat s jakými promìnnými budeme v programu pracovat. V aplikacích s automaty MICROPEL máme kromì obyèejných promìnných pro potøeby výpoètù a uchování hodnot i promìnné, pøes které jsou navázána nìkterá data z interních obvodù automatù. Tyto speciální promìnné jsou pøeddefinovány v tzv. konfiguraèních souborech standardními jmény. Tìmto standardním pojmenováním promìnných jdou, pro pøehlednost pøi zápisu zdrojového textu, pøiøadit jména smysluplnìjího významu, která více odpovídají povaze aplikace. Abychom nastínili vlastnosti programovacího jazyka SIMPLE V4 uvedeme podrobný komentáø jednotlivých øádkù zdrojového textu programu. Tyto komentáøe mají poslouit k základnímu nástinu a rozhodnì nejsou vyèerpávajícím popisem jazyka. Komentáø k øádku "I0 # Mereni_vykonu" Zápis na tomto øádku realizuje oznaèení pøeddefinované vstupní promìnné I0 jménem Mereni_vykonu. Je samozøejmì moné pøistupovat k hodnotì vstupní promìnné pøes její jméno I0, ale z hlediska pøehlednosti a pochopitelnosti programu i po delí odmlce, je taková praxe nevýhodná. Promìnná se standardním oznaèením I0 obsahuje v automatu hodnotu analogovì-digitálního pøevodu z pøísluné vstupní svorky automatu. Dá se tedy $ SIMPLE V4 - popis jazyka 03.2004 94 stran $ øíci, e nás informuje o velikosti analogového napìtí na svorce I0. O to, aby v této promìnné byla vdy platná hodnota, se stará mikroprocesor automatu. Komentáø k øádku "var word Vykon" a øádku "var safe word Pumpa" Jak je ji moná zøejmé ze zápisu øádkù zdrojového textu, jedná se o tzv deklaraci promìnných. Toto zdánlivì sloité slovní spojení oznaèuje skuteènost, e si pøejeme pracovat s promìnnými typu "word" a typu "safe word". Oznaèit pouze typ promìnné vak nestaèí. Abychom tu èi onu promìnnou mohli odliit my i pøekladaè zdrojového textu od jiné stejného typu, musíme ji pojmenovat. Jak je z obou øádkù vidìt, tak jsme jedné promìnné pøisoudili jméno Vykon a druhé jméno Pumpa. Pøed kadou deklarací promìnné èi bloku promìnných je nutné uvést slovo var. Toto slovo oznaèuje v deklaraci tzv. sekci promìnných. Mimo sekce promìnných má jazyk SIMPLE V4 jetì dalí deklaraèní sekce, pro které je také vyhrazeno pøísluné klíèové slovo. Komentáø k øádku /* Funkce....*/ Vechny texty uvedené mezi dvojicí dvojznakù /* a */ nejsou do pøekladu zdrojového textu zahrnuty a jsou urèeny pro umístìní tzv. blokového èi víceøádkového komentáøe. Komentáø slouí k vepsání poznámek programátora. Komentáø obvykle zpøehledòuje a vysvìtluje pouité programové konstrukce. Kromì blokového komentáøe existuje v jazyce SIMPLE V4 i jednoduchý komentáø tj. komentáø, který zaèíná znakem ";" a konèí s pøechodem na dalí øádku zdrojového textu. Komentáø k øádku "Funciton word ...." Na tomto øádku deklarujeme tzv. funkci. Funkce je programová konstrukce, s její pomocí obvykle øeíme èasto se opakující programové konstrukce tj. posloupnosti jednotlivých pøíkazù. Funkce mùe mít deklarovány parametry tj. promìnné, které potøebuje pro øeení zapsaných pøíkazù. V uvedeném zápisu má funkce jeden parametr, který je nazván Vstup. Toto jméno mùe být zcela libovolné a slouí pouze k identifikaci parametru, pokud ho pouijeme pro výpoèty uvnitø funkce. Je-li moné parametry pøipodobnit vstupùm, pak funkèní hodnota (tj. výsledek, který se ve funkci vypoèítá a z funkce pøedá dál) je obdobou výstupu. Komentáø k øádku "return ( Vstup * 5 / 3 + 15 )" Na tomto øádku se specifikují souèasnì dvì vìci. První z nich je aritmetický výraz (výpoèet) uvedený v závorkách. Tohoto výpoètu se zùèastòují konstanty 5, 3 a 15 a aktuální hodnota parametru Vstup. Druhou specifikací je pak pøedání vypoèítané hodnoty z výrazu. Pøedání specifikujeme (spoutíme) pomocí slova return. % SIMPLE V4 - popis jazyka 03.2004 94 stran % Komentáø k øádku "Vykon = Zjisti_Vykon (Mereni_vykonu)" Tento øádek je ji souèástí hlavní programové smyèky. Vystupuje zde volání funkce Zjisti_Vykon, které se pøedává jako parametr hodnota promìnné Mereni_vykonu tj. hodnota analogovì digitálního pøevodu ze svorky I0. Výstupní hodnota z funkce je pomocí pøiøazovacího pøíkazu "Výkon = ...." zapsána do promìnné Výkon. Komentáø k øádku "if (Vykon < 50) then......" Øádek je zápisem tzv. podmínìného pøíkazu. Podmínìný pøíkaz je jedna z nejdùleitìjích konstrukcí jazyka SIMPLE V4. Pomocí podmínìného pøíkazu realizujeme logiku rozhodování v konstruovaném programu. Pro podmínìný pøíkaz jsou vyhrazena tzv. klíèová slova "if", "then", "else". Klíèové slovo "if" uvozuje podmínìný pøíkaz a za tímto slovem je oèekáván tzv. logický výraz. Logický výraz je oddìlen od dalí èásti podmínìného pøíkazu slovem then. V pøípadì, e výsledek vyhodnocení logického výrazu je pravdivý vykoná se èást programu mezi klíèovým slovem then a else. V opaèném pøípadì se vykoná èást podmínky za klíèovým slovem else. Schematicky to situaci mùeme vyjádøit takto: if [logický výraz] then [pravdivá èást] else [nepravdivá èást] K uvedenému zápisu je nutné jetì podotknout, e nepravdivá èást podmínìného pøíkazu není pro jeho zápis povinná a tudí je moné ji v pøípadì potøeby vynechat vèetnì klíèového slova else, které ji uvozuje. Pravdivá a nepravdivá èást se mùe skládat z vìtího poètu samostatných pøíkazù a ty pak musí být uzavøeny mezi klíèová slova "begin" a "end". Komentáø k øádku "end" Øádek end je ukonèovacím øádkem celé programové smyèky. Od tohoto bodu se vrací vykonávání programu opìt na první øádek hlavní programové smyèky. Kometáø k pøiøazovacím pøíkazùm Ve zdrojovém textu je pouit mimo jiné i pøiøazovací pøíkaz "pumpa = pumpa+1" a pøíkaz "pumpa = pumpa-1". V zásadì se jedná o triviální aritmetické výpoèty pøièítání a odeèítání jedné. Na tìchto výpoètech by nebylo nic zajímavého, pokud by nebyly realizovány s promìnnou typu "safe". Tento typ promìnné je specialitou jazyka SIMPLE V4 a jedná se o tzv. bezpeènou promìnnou. Pomocí bezpeèné promìnné jsou øeeny tzv. mezní stavy. Podívejme se na mezní stavy a vlastnosti promìnných ponìkud podrobnìji. & SIMPLE V4 - popis jazyka 03.2004 94 stran & 1.2 Mezní stavy a vlastnosti promìnných Velkou skupinou tzv. klíèových slov jazyka je skupina pouívaná pro oznaèení typu promìnných. Promìnnou mùeme chápat jako pamìové místo pro uloení aktuální (pro jednoduchost) èíselné hodnoty. Øíkáme obvykle, e promìnná nabývá hodnoty. V øadì pøípadù nepotøebujeme ukládat do promìnné velký èíselný rozsah a spokojíme se napø. s rozsahem hodnot od 0 do 255. Uvedenému rozsahu pøesnì odpovídá kapacita jedné pamìové buòky tak, jak je obvodovì realizována. V tomto pøípadì, je pak pamìová buòka stoprocentnì vyuita. Pøedstavme si, e pro uloení hodnoty promìnné vyuijeme dvì pamìové buòky. Co tím získáme ? V první øadì se rozíøí rozsah hodnot, které jsme schopní v tìchto buòkách zobrazit na rozsah od 0 do 65535. V druhé øadì se vak musíme smíøit s potøebou pouít pro zobrazení hodnot dvou pamìových bunìk. Pøedstavme si nyní, e pøi bìhu naeho programového algoritmu se nestane, e by hodnota uvaované promìnné pøekroèila 255. Jak bude v takovém pøípadì vyuit pamìový prostor vyhrazený pro tuto promìnnou ? Jedna pamìová buòka reprezentující vyí øády hodnot bude po celou dobu bìhu programu obsahovat nulu a tudí bude konstantní. Z tohoto dùvodu pak mùeme hodnotu této pamìové buòky kdykoliv urèit, ani bychom ji potøebovali neustále v pamìti udrovat. Dá se tedy øíci, e pro uvedený pøípad je pamì pro uloení specifických hodnot promìnné vyuita velmi neefektivnì. Existuje vak i druhý extrém, který mùe v prùbìhu programu nastat. Jedná se o situaci, kdy je vyhrazené místo v pamìti pro uloení hodnoty nedostateèné. V takovém pøípadì dochází k tzv. pøeteèení. Ukame si pøeteèení na jednoduchém pøíkladu. Pøedstavme si, e nae promìnná má pro zobrazení hodnoty vyhrazenu právì jednu pamìovou buòku a pojme tedy zobrazení èísel v rozsahu od 0 do 255. Pøedpokládejme, e aktuální hodnota promìnné je 255. Pøièteme-li k této hodnotì èíslo 1, mìla by promìnná obsahovat hodnotu 256. Tuto hodnotu vak ve vyhrazeném pamìovém prostoru naí promìnné zobrazit nelze. Jakou hodnotu bude tedy obsahovat promìnná ? Hodnota bude odpovídat výsledku po pøeteèení. Princip pøeteèení mùeme vyjádøit v uvaovaném pøípadì vzoreèkem: Y = X-256 ,kde X je hodnota vìtí ne 255 a vznikla napø. výe uvedeným souètem èísla 255 a 1, Y je pak výsledná hodnota zobrazená v uvaované promìnné. Dosadíme-li do vzorce naí výslednou hodnotu 256 obdríme výsledek 0. To znamená, e hodnota naí promìnné bude najednou nulová. Jetì horí pøípad nastane, kdy stejného principu vyuijeme pro ' SIMPLE V4 - popis jazyka 03.2004 94 stran ' zobrazení znaménkových èísel. V takovém pøípadì mùe napø. pøi souètu dvou kladných èísel dojít k pøeteèení a výsledná hodnota bude najednou èíslo záporné. Jak takovou situaci mùeme øeit ? Jsou v zásadì dvì základní monosti. Buï se s touto vlastností smíøíme (a nìkdy to mùe být i výhodné) a nebo pro kadou pouitou promìnnou vyhradíme dostatek prostoru v pamìti. Co vak znamená pojem dostatek prostoru v pamìti ? Tato otázka je neøeitelná, nebo pamìové obvody jsou zatím stále koneèné kapacity a o nekoneènosti si mùeme nechat jenom zdát. V naich pøíkladech tedy naráíme na problematiku zobrazení èísel v koneèném rozsahu vzhledem k výsledkùm výpoètù, které mohou tento rozsah pøekroèit. Situace s pøekroèením rozsahu zobrazení je známa od ranných poèítaèových dob a není nièím výjimeèným. V rùzných programovacích jazycích je tato situace øeena rùznì popø. není øeena vùbec a je ponecháno zcela na vùli programátora jak, tyto mezní stavy v pouité aritmetice oetøí. Shròme nyní výhody a nevýhody zavedení rùzných typù promìnných. Hlavní nevýhodou zavedení typù promìnných je (promìnných s omezeným a rùzným rozsahem zobrazení èísel), jak u bylo nastínìno, problematika mezních stavù. Naproti tomu vak pøináejí typy promìnných øadu výhod. Poèítáme mezi nì monost optimálního vyuití pamìového prostoru (ten je vdy nìjak omezen), výrazného urychlení výpoètu v celoèíselném zobrazení ne v zobrazení napø. v plovoucí øádové èárce. Monosti zpracovávat velièiny v takovém formátu v nìm se s nimi dobøe poèítá apod. 1.3 Promìnné a mezní stavy V programovacím jazyce SIMPLE V4 jsou zavedeny rùzné typy promìnných od tìch nejjednoduích tzv. bitových, kdy promìnná mùe nabývat pouze dvou hodnot 0 nebo 1 a po promìnné zobrazované v plovoucí øádové èárce pokrývající rozsah v exponentu od 10E-38 po 10E38. Tím se jazyk principiálnì nelií od vyích programovacích jazykù typu C nebo Pascal apod. Výraznì vìtí odlinost jsou vak v øeení tzv. mezních stavù. Nìkteré z tìchto stavù jsme popsali v pøedchozí kapitole. "Bezpeèné" typy promìnných V jazyce jsou zavedeny tzv. bezpeèné typy promìnných, které se svými vlastnostmi více blíí realitì reálného svìta regulací. Má-li pøi aritmetické operaci dojít k pøeteèení, dosadí se do promìnné maximální zobrazitelná hodnota v daném typu. Analogicky je pak øeeno i tzv. podteèení, kdy se do promìnné dosadí nejnií moná hodnota. SIMPLE V4 - popis jazyka 03.2004 94 stran Dalí zajímavou mezní situací z hlediska programování je dìlení nulou. V poèítaèích typu PC lze tuto situaci programátorsky øeit obsluhou tzv. vyjímky. Porozhlédneme-li se po rùzných aplikaèních programech na tento typ poèítaèù najdeme mizivé procento programù, které tento problém øeí. V daleko vìtí míøe se programátoøi spoléhají na to, e zmínìná situace nenastane. Programovací jazyk SIMPLE V4 øeí tento problém automaticky pøi pouití bezpeèných typù promìnných. Pouijeme-li bezpeèné typy promìnných, pak je dìlení nulou povolená operace a její výsledek je buï kladná nebo záporná maximální hodnota zobrazitelná v daném typu promìnné. O znaménku výsledku v tomto pøípadì dìlení rozhoduje znaménko èitatele (dìlence). S dìlením nulou vak souvisí i dalí mezní stav. Jedná se o pøípad, kdy nulu dìlíme nulou. Je-li znám trend hodnot èi funkèní závislost èitatele a jmenovatele, pak se ve vyí matematice poèítá tzv. limita. V pøípadì, e nejsou známy zmínìné závislosti, tak se úloha neøeí. V naem pøípadì tyto závislosti nejsou známy nebo do dìlení vstupují vdy pouze dvì konkrétní hodnoty. Z tohoto dùvodu je v jazyce SIMPLE V4 výsledek dìlení nuly nulou striktnì definován jako nulový. Tento výsledek simuluje napø. elektrický zkrat dìlièe napìtí apod. V daném pøípadì se nedá øíci, e by takto definovaný výsledek byl matematicky správnì, ale zdá se, e jako oetøení popisovaného mezního stavu je vhodný. SIMPLE V4 - popis jazyka 03.2004 94 stran 2. Konstrukce programu Následující odstavce jsou vìnovány zápisu a konstrukci programu. Kapitoly jsou èlenìny podle struktury jazyka a postupují od popisu jednotlivých výrazových prostøedkù urèených pro zápis programových øádek a po popis chyb, speciálních konstrukcí a pravidel. 2.1 Lexikální symboly Pojmem lexikální symboly oznaèujeme základní konstrukèní prvky jazyka pomocí nich, za vyuití definovaných pravidel (gramatiky), vytváøíme zápis algoritmu programu. Pod pojmem program míníme textový soubor, který se skládá z tzv. øádek zdrojového textu a obvykle ho oznaèujeme pojmem zdrojový text. Kadý zdrojový øádek mùe být maximálnì 512 znakù dlouhý a je sloen právì z lexikálních symbolù oddìlených oddìlovaèi. Pojmem oddìlovaè oznaèujeme vyhrazený znak èi vyhrazenou skupinu znakù uívanou k oddìlení jednotlivých lexikálních symbolù. Oddìlovaè není urèen pouze k jakémusi estetickém uspoøádání øádky, ale jeho význam je hlubí. Umoòuje toti rozpoznat jednotlivé lexikální symboly. Jeho funkce je obdobná jako funkce mezer mezi slovy tohoto textu. V jazyce SIMPLE V4 jsou definovány tyto oddìlovaèe (separátory) : mezera tabulátor komentáø oddìlovaèe øádek V jazyce SIMPLE V4 jsou definovány následující lexikální symboly: identifikátory celoèíselné literály èíselné literály zapsané v pohyblivé øádové èárce øetìzce znakové literály speciální symboly klíèová slova oddìlovaèe øádek (pouze v nìkterých konstrukcích) Klíèové slovo, identifikátor a èíslo musí být od jiného klíèového slova, identifikátoru nebo èísla oddìleno oddìlovaèem. SIMPLE V4 - popis jazyka 03.2004 94 stran 2.2 Identifikátory Identifikátory jsou posloupnosti písmen, èíslic a znaku podtrítko. Písmena pøedstavující èeskou diakritiku nejsou pro zápis identifikátorù povolena. Identifikátory musí zaèínat vdy písmenem nebo podtrítkem. K èemu identifikátory slouí ? V zápise programu je vdy nutné oznaèit nìjaké èásti èi prvky srozumitelným jménem. Jedná se napøíklad o promìnné, funkce, podprogramy apod. S takto oznaèenými programovými prvky je pak moné pracovat v symbolickém tvaru. Uveïme jednoduchý pøíklad s ním se dozajista kadý setkal. V matematice je pro výpoèet obvodu èi plochy kruhu pouíváno Ludolfovo èíslo. Hodnota tohoto èísla je obecnì známa alespoò na dvì desetinná místa, tedy 3.14. Ve vzorcích pro zmínìné výpoèty se vak tato konstanta oznaèuje øeckým písmenem pí. Je to èásteènì z dùvodu jednoduího zápisu, ale podstatné je to, e Ludolfovo èíslo je moné uvádìt na rùzný poèet desetinných míst a jak víme jeho koneèná hodnota dodnes není pøesnì známa. Tento problém vak pøenecháme matematikùm a vezmeme si pouze jedno ponauèení. Urèitou hodnotu mùeme vyjádøit snadno zapamatovatelným symbolem a jako symbol ji pak vyjadøovat ve zdrojovém textu programu. Pozastavme se jetì nad významem podtrítka, které je zaøazeno do výètu znakù pouívaných pøi zápisu identifikátorù. Pøi konstrukci sloitìjích algoritmù popøípadì pøi øeení problémù s mnoha vstupními a výstupními promìnnými nevystaèíme obvykle s jednoslovným oznaèením. Vzhledem k tomu, e mezera má vyhrazený význam oddìlovaèe a nelze ji tak ve jménu identifikátoru pouít, vypomùeme si u víceslovných názvù právì symbolem podtrítka. Uveïme pøíklad zápisu víceslovného identifikátoru bez a s pouitím podtrítka: totojeidentifikátorprogramu toto_je_identifikátor_programu Z uvedeného pøíkladu je význam podtrítka pro zpøehlednìní zápisu zcela zøejmý. Uveïme praktiètìjí pøíklad. Pøedstavme si, e regulujeme dva identické stroje tj. stroje stejného typu, které se od sebe lií pouze svým umístìním v místnosti. Hodnoty potøebné k øízení tìchto strojù je nutné nejprve vypoèítat a pak je pøedat. Pro výpoèet mùeme uít totoného algoritmu pro oba stroje s tím, e do výpoètu zadáme vdy hodnoty pro øízení prvního nebo druhého stroje. Získáme tak dva výsledky výpoètu a pro jejich uloení pouijeme dvì výstupní promìnné symbolicky oznaèené napø. takto: motor_dolniho_stroje motor_horniho_stroje ;pro první stroj ;pro druhý stroj Takto oznaèené promìnné, v nich udrujeme výsledky výpoètù øídícího algoritmu, se pak mnohem hùøe zamìní s jinými promìnnými, které s uvedeným stroji tøeba vùbec nesouvisí. ! SIMPLE V4 - popis jazyka 03.2004 94 stran ! Identifikátory, jak je zøejmé z uvedených v pøíkladù, tedy pouíváme pro identifikaci jednotlivých prvkù programu, jako jsou promìnné, podprogramy, konstanty a typy. 2.3 Celoèíselné literály Obecnì oznaèujeme pojmem literál zápis konstantního prvku programu tj. prvku, jeho hodnota èi tvar se nemìní v celém zdrojovém textu. Pøíkladem mùe být libovolná konstanta. Celoèíselné literály jsou tedy zápisy konstant z celoèíselné øady èísel. Pojmovì je rozliujeme hlavnì proto, e je moné zapsat i literály jiných typù a pøekladaè musí porozumìt, jaký druh literálu máme na mysli. Jak pøekladaè pozná ná úmysl bude zøejmé v kapitolách vìnovaných klíèovým slovùm a speciálnì typùm promìnných. V tomto okamiku berme na vìdomí, e celoèíselné literály jsou zápisy èísel z øady celých èísel tj. nejblií èísla se lií o 1 a neobsahují desetinnou èást. Pro zápis celoèíselných literálù mùeme pouít buï dekadického nebo hexadecimálního formátu. V dekadickém zápisu je dovoleno pouít èíslic od 0 do 9. Uveïme pøíklady zápisu èísla 12 jako celoèíselného literálu v dekadické soustavì: 012 00012 pozn. znaménka + a - napsaná pøed èíslem nejsou souèástí literálu, ale patøí k tzv. unárním operátorùm Pouijeme-li pro zápis celoèíselných literálù soustavu hexadecimální mùeme v zápisu pouít èíslice od 0 do 9, písmena od A do F (od a do f). Znakù pro vyjádøení znaménka v této soustavì pouít nemùeme nebo nejsou pro zápis literálù definována. Souèasnì hexadecimální zápis musí mít takový formát, aby bylo moné ze zápisu literálu jednoznaènì urèit v jaké soustavì je zapsán. Co se týèe hodnoty, tak je rozdíl zapíeme-li 12 v soustavì dekadické a 12 v soustavì hexadecimální. Porovnáme-li tyto hodnoty pøes soustavu dekadickou zjistíme, e dekadických 12 je skuteènì 12, ale hexadecimálních 12 je dekadicky 18 a to je ponìkud rozdíl. Z uvedeného dùvodu pro zøejmou identifikaci hexadecimálních èísel byl zvolen odliný formát zápisu. Vzorem byl zápis implementovaný v dnes hojnì pouívaném programovacím jazyce C. Hexadecimální zápis celoèíselného literálu je vdy uvozen dvojicí znakù 0x nebo 0X, za ní pak následuje zápis hexadecimálního èísla. Tím je jednak odlieno, e se jedná o hexadecimální formát a souèasnì se tím automaticky dodruje syntaktické pravidlo o zápisu celoèíselných literálù a to, e zápis celoèíselného literálu musí zaèínat èíslicí. Uveïme nyní pøíklad zápisu celoèíselného literálu v hexadecimální soustavì: 0x12 0xC (18 dekadicky) (12 dekadicky) Dalím dùleitým parametrem zápisu celoèíselných literálù je dovolený èíselný rozsah v nìm se musí zápis nacházet. Pro zápis hodnot celoèíselných literálù je v jazyce SIMPLE V4 definován èíselný rozsah oznaèovaný symbolicky jako 4G resp. 0xFFFFFFFF. " SIMPLE V4 - popis jazyka 03.2004 94 stran " Uvedené zápisy oznaèují shodnì, e zapsaná èísla musí být z intervalu -2147483648 do +2147483647 decimálnì tj. 0x00000000 a 0xFFFFFFFF hexadecimálnì. 2.4 Èíselné literály v pohyblivé øádové èárce Obdobnì, jako mùeme ve zdrojovém textu programu pouívat zápisu celoèíselných literálù, mùeme pouít i konstanty zapsané ve formátu pohyblivé øádové èárky. Pro vyjádøení hodnot v plovoucí øádové èárce je dovoleno pouívat èíslic od 0 do 9, znaku desetinné teèky . znamének + a - a znaku E pro oddìlení exponentu. Znaménko + je implicitní a není nutné ho psát pro vyjádøení kladných hodnot. Zápis literálu v pohyblivé øádové èárce musí vyhovovat formálnímu tvaru zápisu: zx.xEzxx ,kde písmeno x zastupuje posloupnost èíslic od 0 do 9, písmeno z oznaèuje znaménko. Nìkteré èásti zápisu nejsou povinné. Jedná se o kladné znaménko pro vyjádøení kladných èísel. Desetinnou teèku v pøípadì, e za ní následují pouze nulové èíslice a èást obsahující zápis exponentu v pøípadì, e hodnota exponentu je rovna nule. Uveïme nìkteré monosti zápisu literálù v pohyblivé øádové èárce. Èíslo 0.125 mùeme zapsat napø. tìmito zpùsoby: 0.125 1.25E-1 12.5E-2 125E-3 2.5 Klíèová slova Klíèová slova jsou vyhrazená jména, které není moné pouít pro zápis jiných prvkù programu. Klíèová slova mají pøiøazen zcela pevný a jednoznaèný význam. Jsou vyhrazena pro oznaèení typu promìnných, uvození a ukonèení rùzných logických konstrukcí zdrojového textu, oznaèují i nìkteré operace s èísly, oznaèují v øadì pøípadù i speciální vlastnosti programových prvkù pøedevím promìnných. 2.6 Typy promìnných Zavedení rùzných typù promìnných má v programovacích jazycích zcela zøejmé odùvodnìní. Výsledný pøeloený program je vdy psán se zámìrem, aby mohl být sputìn na tom èi onom poèítaèi (programovatelném automatu). Kadý poèítaè disponuje výpoèetním výkonem takovým na jaký byl zkonstruován. Vzhledem k tomu, e tento výkon není nikdy neomezený, snaíme se obvykle program psát tak, aby rychlost zpracování vstupních dat pøevyovala rychlost s jakou tato data do systému pøicházejí. Teorie øíká, e musíme mít k dispozici takový výkon, aby rychlost zpracování dat byla v nejhorím pøípadì # SIMPLE V4 - popis jazyka 03.2004 94 stran # rovna rychlosti jejich toku. Pouze v takovém pøípadì jsme schopni zpracovat vechny pøíchozí zmìny dat (uvaujeme zcela asynchronní tok dat vùèi jejich vzorkování systémem). Z uvedeného plyne, e program píeme tak, abychom vyuili optimálnì výpoèetní výkon procesoru, který bude program zpracovávat. Velmi jednoduchým zpùsobem je moné takou optimalizaci zajistit právì výbìrem vhodných typù promìnných. Vycházíme z toho, e zpracování napø. souètu trvá napø. pro promìnnou typu byte výraznì kratí dobu ne pro promìnnou typu long apod. Vìtinou platí, e èím mení je èíselný rozsah typu promìnné, tím rychleji s ní procesor pracuje. Programovací jazyk rozliuje typy promìnných uvedené v následující tabulce. TYP (Klíèové slovo) bit ÈÍSELNÝ ROZSAH 0/1 byte 0 - 255 word 0 - 65535 int longword -32768 - 32767 0 - 4294967296 longint -2147483648 - 2147483647 float -10E38 - 10E38 string (má specifické vlastnosti) Nìkteré typy z popisovaného výètu promìnných jsou svázány s klíèovým slovem "safe". Tímto klíèovým slovem sdìlujeme pøekladaèi, e má k takto oznaèené promìnné pøistupovat s uváením øeení mezních stavù a vyjímek tak, jak bylo popsáno výe v odstavci "Promìnné a mezní stavy". Klíèové slovo safe je moné pouít spoleènì s typy word, int, longword, a longint. Pro ostatní typy tj. pro typ bit, byte, float a string nemá toto klíèové slovo význam nebo typ bit je vlastnì logická promìnná (nìkdy té relé), typ byte je prioritnì zaveden pro pouití v kontextu jednotlivého znaku textových øetìzcù, implementovaná aritmetika promìnných typu float se sama o sobì chová jako bezpeèná a typ string jde pouít pouze jako vstupní typ promìnné tj. není moné do promìnné tohoto typu zapsat a dopustit se tak nìjakého problému. $ SIMPLE V4 - popis jazyka 03.2004 94 stran $ 2.7 Klíèová slova a speciální znaky logických výrazù Pod pojmem logický výraz máme na mysli zápis, který se vyhodnocuje tak, e se zkoumá jeho pravdivost èi nepravdivost. Podle výsledku vyhodnocení se pak v programu rozhodujeme, jaký pøíkaz se má vykonat. Logický výraz tak úzce souvisí s (rozhodovacími) podmínìnými pøíkazy. Klíèovými slovy svazujeme do logických podmínek výrazy u nich je moné rozhodnout, zda jsou pravdivé èi ne. Speciální symboly jsou, pak urèeny pro vyhodnocení jednotlivých výrazù vstupujících do logického výrazu. Uveïme jednoduché pøíklady. Pøedstavme si, e máme k dispozici promìnnou typu byte. Jak ji víme, mùe tato promìnná nabývat hodnotu v rozmezí od 0 do 255. Z tìchto hodnot není obecnì zøejmé, která je z hlediska logického vyhodnocení pravdivá èi nepravdivá. O pravdivosti hodnoty je moné rozhodnout pouze na základì nìjakého typu porovnání. Porovnáme-li napø. aktuální hodnotu promìnné vùèi hodnotì 100, pak podle typu porovnání umíme rozhodnout zda hodnota promìnné porovnání vyhovuje nebo ne tj. zda je hodnota pravdivá nebo ne. Uveïme pøíklad. Zapime porovnání napø. takto: PROMENNA > 100 ,kde promìnná oznaèuje aktuální hodnotu promìnné, která vstupuje do porovnání. V uvedeném pøíkladì je tedy aktuální hodnota promìnné porovnána vùèi hodnotì 100. Uvedený výraz je pak vyhodnocen jako pravdivý tehdy, kdy aktuální hodnota promìnné je vìtí jak hodnota 100. V opaèném pøípadì je výraz vyhodnocen jako nepravdivý. Pro zápis porovnání jsou vyhrazeny speciální znaky uvedené v následující tabulce: ZNAK VÝZNAM < mení ne <= mení nebo rovno > vìtí >= vìtí nebo rovno <> rùzný Jednotlivé výrazy vstupující do logických podmínek pak sváeme pomocí klíèových slov logických operací. % SIMPLE V4 - popis jazyka 03.2004 94 stran % V následující tabulce jsou uvedeny klíèová slova pro zápis logických podmínek: KLÍÈOVÉ SLOVO VÝZNAM and logický souèin výsledkù vyhodnocených výrazù or logický souèet výsledkù vyhodnocených výrazù not negace výsledku vyhodnoceného výrazu Uveïme na tomto místì pouze pro ilustraci jednoduchý pøíklad zápisu logického výrazu (detailní popis je uveden v odstavcích vìnovaných syntaxi jazyka): if TEPLOTA < 20 and VYKON < 50 then V uvedeném pøíkladì je mezi klíèovými slovy if a then uveden logický výraz, který je vyhodnocen jako pravdivý tehdy, kdy aktuální hodnota promìnné TEPLOTA je nií ne 20 a ve stejném okamiku je aktuální hodnota výkonu topení mení jak 50. V ostatních pøípadech je výraz nepravdivý. Na výsledek vyhodnocení tj. na pravdivost èi nepravdivost výrazu jsou pak navázány jednotlivé výkonné èásti podmínìného pøíkazu if-then-else. 2.8 Klíèová slova pro podprogramy a funkce Podprogram a funkce jsou èásti programu tj. posloupnosti pøíkazù. Oznaèíme-li takovou posloupnost ve shodì se syntaxí jazyka SIMPLE V4 jménem, definujeme buï podprogram nebo funkci. V podprogramu nebo funkci mùeme deklarovat tzv. lokální promìnné tj. takové promìnné jejich platnost je omezena pouze na pøísluný podprogram nebo funkci. Mimo tìlo podprogramu je lokální promìnná neznámá a tudí i neplatná. Podprogram èi funkce dobøe poslouí v okamiku, kdy v nìkolika èástech hlavního programu potøebujeme vykonat stejné posloupnosti pøíkazù. Výhoda slouèení pøíkazù do podprogramu nebo funkce tedy spoèívá v tom, e tyto posloupnosti pøíkazù jsou umístìny v pamìti pouze jednou a pøesto je moné jejich vykonání z rùzných míst programu. Kdyby vak nebylo moné takto zapsané posloupnosti pøíkazù ovlivòovat bylo by pouití podprogramù èi funkcí znaènì omezeno. Aby lo vykonávání pøíkazù uvnitø podprogramù èi funkcí ovlivòovat, je moné pøedat do podprogramu nebo funkce tzv. parametry. Pod pojmem parametry máme na mysli aktuální hodnoty zvolených promìnných. Uvnitø podprogramù èi funkcí pak mùeme za pouití podmínìných pøíkazù ovlivòovat zpracování jednotlivých pøíkazù. & SIMPLE V4 - popis jazyka 03.2004 94 stran & Z hlediska pouití pak rozliujeme podprogram a funkci. Odlinost spoèívá v tom, e funkce tzv. vrací hodnotu tj. z hlediska syntaxe jazyka mùe být pouita (volána) na místì operandu výrazu. Podprogram hodnotu nevrací a tudí nemùe stát volání podprogramu ve výrazu. S pouitím funkcí a podprogramù souvisí následující klíèová slova: KLÍÈOVÉ SLOVO VÝZNAM subroutine oznaèuje, e následuje jméno podprogramu function oznaèuje, e následuje jméno funkce return oznaèuje konec, návrat z podprogramu, funkce exit oznaèuje pøeruení provádìní pøíkazù podprogramu a tím jeho pøedèasné ukonèení var v souvislosti s definicí parametrù oznaèujepromìnnou její hodnotu je moné uvnitø podprogramu mìnit const oznaèuje promìnnou, kterou není moné pouít na levé stranì pøiøazovacího pøíkazu 2.9 Dalí vyhrazená slova a jejich významy Syntaxe jazyka SIMPLE V4 obsahuje dalí klíèová slova a symboly, které jsou nezbytné pro zápisy nìkterých speciálních podmínek zpracování pøíkazù jazyka. Jedná se o klíèová slova: library absolute table type ' oznaèuje, e pro pøeklad se mají uvaovat definice, podprogramy, funkce apod. uvedené v knihovnì specifikovaného jména. oznaèuje e dvì nebo více specifikovaných promìnných má pøekladaè umístit na spoleènou adresu v datové pamìti. Zmìníme-li hodnotu jedné z takto oznaèených promìnných zmìní se hodnota i ve vech ostatních umístìných na zmínìnou spoleènou adresu v datové promìnné. klíèovém slovo pro deklaraci tabulek konstant v kódové pamìti. Konstanta typu table je vdy chápána jako pole konstantních hodnot zvoleného typu. Typem mùe být libovolný ze základních pøedefinovaných typù nebo struktura definovaná na jejich základì. klíèové slovo umoòující definovat promìnné tzv. vlastních typù. Jedná se pøedevím o struktury dat sloené z více promìnných standardního (základního) typu. SIMPLE V4 - popis jazyka 03.2004 94 stran ' Dalí speciální znaky definované v jazyce SIMPLE V4 jsou uvedeny v tabulce: ZNAK VÝZNAM ( uvozující znak deklarace seznamu, parametrù podprogramu a funkce, závorkování výrazù ) ukonèující znak deklarace seznamu, parametrù podprogramu a funkce, závorkování výrazù [ uvozující znak pro urèení poloky datového pole ] ukonèující znak pro urèení poloky datového pole 0 oddìlovací znak seznamu deklarací a seznamù : oddìlovací znak pøíkazù ? znak odkazu na bit v promìnné napø. byte apod. ! bitová inverze v promìnné napø. byte apod. ' bitová negace # oznaèení makropøíkazu & znak pro operaci bitového logického souèinu ^ znak bitové logické operace výhradní nebo (exclusive-or) | znak bitové operace nebo (bitový logický souèet) ~ znak bitové logické operace pro bitovou negaci + znak aritmetického souètu - znak aritmetického rozdílu * znak aritmetického souèinu / znak aritmetického podílu % znak pro zbytek po deloèíselném podílu << znak pro aritmetický posun vlevo >> znak pro aritmetický posun vpravo 2.10 Komentáøe Komentáøe jsou dùleitou souèástí jazyka. Umoòují zpøehlednit zápis programu a mnohdy jsou jediným vodítkem programátora k pochopení zápisu programu pøi jeho revizi po uplynutí dostateènì dlouhé doby. V jazyce jsou definovány dva typy komentáøù. Prvnímu z nich mùeme øíkat øádkový. Tento typ komentáøe je uvozen znakem ";" a od tohoto znaku do konce øádku je pøekladaèem text ignorován. Druhým typem komentáøe je blokový komentáø tj. libovolný text vèetnì oddìlovaèù øádek umístìný mezi dvojice znakù "/*" (zaèátek komentáøe) a "*/" (konec komentáøe). SIMPLE V4 - popis jazyka 03.2004 94 stran Uveïme si pøíklady obou druhù komentáøù: ;toto je øádkový komentáø a platí dokud neskonèí øádek /* toto je blokový komentáø a platí do nalezení ukonèovacího dvojznaku tøeba i pøes více øádkù jako v tomto pøíkladu */ Zde vak pozor. Z dùvodù zpìtné kompatibility vùèi jazyku Simple V2 je nutné se smíøit s urèitým zlem. V první øádce blokového komentáøe se nesmí vyskytnout znak #. Pokud se tak stane, pøekladaè hlásí chybu v znak # makropøíkazu v první øádce komentáøe. Tato vìc není zámìrnì odstranìna, nebo se poèítá s postupným odbouráváním syntaktických prohøekù starí verze jazyka Simple. Tyto prohøeky jsou umìle a zámìrnì zachovány i v jazyce SIMPLE V4 jen a jen z dùvodu zpìtné kompatibility zdrojových textù. Umoòujeme tak stávajícím uivatelùm bezbolestný pøechod k nové syntaxi jazyka SIMPLE V4. 2.11 Oddìlovaèe øádek Oddìlovaèe øádek jsou znaky, které obvykle textové editory nezobrazují, ale pøi jejich zpracování posouvají kurzor na dalí øádek. V moderních programovacích jazycích se pøedpokládá, e programátor formátuje text programu podle svých potøeb tj. dìlá si nové øádky v místech, kde to potøebuje a ne kde to naøizuje syntaxe jazyka. V tìchto pøípadech se znaku nového øádku povaují za nevýznamné. Vzhledem k tomu, e pøedchozí jazyky pro programování PLC neodpovídaly této moderní koncepci, byli jsme nuceni pøi snaze dosáhnout pøenositelnosti zdrojových textù, udìlat urèité vyjímky pøi nich jsou oddìlovaèe øádkù povaovány za významné znaky. Zmínìné vyjímky se týkají napø. konstrukce podmínìného pøíkazu if then. SIMPLE V4 - popis jazyka 03.2004 94 stran 3. Sémantika V jazyce SIMPLE V4 je definována celá øada typù promìnných, které mùeme podle vlastností utøídit do skupin. Tyto skupiny jsou sestaveny obvykle podle jejich významu pro konstrukci jazyka a podle spoleèných aritmetických vlastností jednotlivých typù. Rozdìlení se následnì pouívá pro identifikaci skupiny promìnných pøi zápisu jednotlivých definovaných operací jazyka. 3.1 Identifikátory a jejich vlastnosti Jak ji bylo vysvìtleno výe pod pojmem identifikátor si pøedstavíme zjednoduenì jméno (název) nìjakého prvku programu pøes nìj se na potøebný prvek odvoláváme. Pro identifikátory platí nìkolik jednoduchých pravidel. V první øadì musí být kadý pouitý identifikátor (pojmenování) pøekladaèi pochopitelný tj. musí být tzv. deklarován. Nevyaduje se ve shodì s moderními koncepcemi programovacích jazykù, aby byl identifikátor deklarován pøed tím, ne se pouije. Je tedy moné umístit napø. podprogram na libovolné místo zdrojového textu tj. napø. za øádek na nìm je od zaèátku textu poprvé zavolán svým identifikátorem tj. jménem. Tato vlastnost identifikátorù odstraòuje mnohdy pracný zápis podprogramù, které se volají v takovém poøadí, aby to vyhovovalo tzv. dopøedné deklaraci. Dopøedná deklarace je princip, e ne nìjaký identifikátor pouiji, musí být ji deklarován (urèen, znám). Dùleitou vlastností identifikátorù je jejich zastiòování. Uveïme si jednoduchý pøíklad. V programátorské praxi se velmi èasto uívá písmenka "j" nebo "i" ve významu indexu do nìjakého pole. Tyto promìnné mají v jednotlivých èástech programu obvykle jepièí ivot. Máme tím na mysli, e jejich hodnotu potøebujeme napø. na pár programových øádkù a pak, u nás nezajímá. Vzhledem, k tomu, e takovou promìnnou musíme deklarovat, je po jedné deklaraci symbol obsazen. Kdyby tedy identifikátory nemìly vlastnost zastiòování, pak bychom nemohli pouít identifikátor stejného jména v rùzných úrovních programu. Uveïme si jednoduchý pøíklad. V hlavním programu deklarujeme identifikátor "i" pro promìnnou typu int a pouíváme ji ve smyslu indexace pole promìnných. Pak napíeme podprogram, kde je opìt nìjaká promìnná pro indexaci. V pøípadì, e neplatí vlastnost zastiòování identifikátorù, správný zápis situace bude: var int i subroutine nastav() var int j . .... . return Z pøíkladu je zøejmé, e jsme nemohli pouít identifikátor i podruhé, nebo byl ji deklarován v hlavním programu. SIMPLE V4 - popis jazyka 03.2004 94 stran Jak se situace zmìní, kdy je zastiòovámí identifikátorù umonìno ? Zápis bude vypadat takto: var int i subroutine nastav() var int i . .... . return Je patrné, e lze pouít stejný identifikátor v hlavním programu i podprogramu. Jak je to moné a jak si s tím pøekladaè poradí ? V daném pøípadì rozlií pøekladaè, e podruhé je identifikátor "i" deklarován v podprogramu. Podprogram je tzv. jiná programová úroveò a pro promìnné deklarované uvnitø podprogramu platí, e jsou známy pouze lokálnì. Z takto vyhodnoceného kontextu deklarací je zøejmé, e pøekladaè vyhodnotí dva rùzné identifikátory "i", nebo jeden je deklarován v hlavním programu a je tzv. globální a druhý je deklarován v podprogramu a je lokální. Je zøejmé, e pøekladaè oba identifikátory rozlií. Programátor vak musí mít na pamìti, e pouije-li identifikátor "i" v podprogramu v nìjakém aritmetickém výrazu mìní tím pouze lokální promìnnou identifikátoru "i". Chce-li se naopak odvolat na hodnotu globální promìnné identifikátoru "i" není to v podprogramu moné, protoe význam globálního identifikátoru "i" je zastínìn právì významem lokálního "i". Posledním pravidlem je to, e v jedné úrovni smí být identifikátor deklarován pouze jednou. Z tohoto pravidla vak platí jediná vyjímka a ta se týká identifikátorù podprogramù. Identifikátory podprogramù mohou být v jedné úrovni totoné. Kdy se nad uvedenou skuteèností zamyslíme zjistíme jednu významnou vlastnost, kterou tato vyjímka pøináí. Jedná se o tzv. pøetìování podprogramù. K èemu pøetìování podprogramù slouí ? Zde je nasnadì typický pøíklad. Jedná se o sadu podprogramù, které budou zajiovat napø. výpis hodnot na displej. Jak víme, na displeji automatu je moné zobrazit alfanumerické znaky. Je tedy moné zobrazovat nejen texty, ale i hodnoty promìnných. Hodnoty promìnných vak není moné zapsat na displej pøímo. Pøed jejich výpisem se musí zkonvertovat na text tj. na posloupnost znakù èíslic. Text je ale moné zobrazovat pøímo. Chceme-li tedy problém øeit musíme navrhnout dva podprogramy. Jeden na výpis øetìzce a druhý na výpis hodnoty. ! SIMPLE V4 - popis jazyka 03.2004 94 stran ! V klasickém pojetí zápisu tj. bez pouití pøetíení musíme oba podprogramy zapsat napø. takto: subroutine Display_text ( const string S ) . . return subroutine Display_value ( int i ) . . return /* zde je kousek hlavního programu */ Display_text ( text ) Display_value ( promenna ) V hlavním programu pak musíme podle potøeby volat buï jeden podprogram nebo druhý. Oba podprogramy vak øeí principiálnì jeden a ten samý úkol, kterým je zobrazení na displej. Vyjdeme-li z úvahy, e podprogramy se svou funkcí principiálnì nelií, je pøímo nasnadì nazvat je stejným jménem a pouít tudí pøetíení identifikátoru. Uveïme nyní pøíklad zápisu subroutine Display ( const string S ) . . . return subroutine Display ( int i ) . . return /* zde je kousek hlavního programu */ Display ( text ) Display ( promenna ) Oba podprogramy jsme nazvali stejným jménem. Tím jsme provedli tzv. pøetíení identifikátoru, které je v øadì programovacích jazykù zcela nepøípustné. Zvykneme-li si je pouívat, tìko si budeme odvykat. Jak pøekladaè øeí situaci pøetíených identifikátorù. Pro " SIMPLE V4 - popis jazyka 03.2004 94 stran " øeení takové úlohy musí pøekladaè vykazovat urèitou míru inteligence. V první fázi si poznamená, e existují pøetíené identifikátory. Pøi volání podprogramù s pøetíeným identifikátory pak rozhodne podle typu parametu pøedávaného do podprogramu, který z podprogramù mìl asi programátor na mysli. Proè je zde uvedeno slùvko asi ? V uvedeném pøíkladì je rozhodování zcela jasné. Pøedstavme si ale, e máme jetì tøetí podprogram displej na výpis promìnné typu long. Uveïme deklaraci: subroutine Display ( long i ) . . return A do této chvíle je vechno jasné. Pøedstavme si, e zapíeme nyní volání podprogramu takto: Display(1250) Hodnota 1250 je celoèíselný literál a vyhoví v obou pøípadech podprogramù pro zobrazení hodnoty tj. pro hodnotu typu int i typu long. V kolizních èi neurèitých pøípadech volání podprogramu s pøetíeným identifikátorem, pouije pøekladaè pravidlo pro kompatibilitu typù. Detailnì je uvedena kompatibilita typù níe. Zatím pouze telegraficky. Podle zjitìné hodnoty literálu pouije pøekladaè volání podprogramu jeho typ nejblíe odpovídá zadané hodnotì. V naem pøípadì bude zavolán podprogram, jeho parametrem je hodnota typu int. 3.2 Celoèíselné promìnné Mezi celoèíselné promìnné poèítáme typy byte, word, int, longword, longint vèetnì jejich bezpeèných variant oznaèovaných klíèovým slovem safe. Pro tento typ promìnných jsou definovány vechny základní typy aritmetických, bitových logických a relaèních operátorù. Základní spoleènou vlastností tìchto typù je jejich celoèíselnost tj. není moné v tìchto typech uvaovat desetinná èísla. Tyto typy jsou mikroprocesoru pouitém v automatech nejblií a proto s nimi probíhají vekeré operace pomìrnì rychle. Nejmarkantnìji se vlastnost celoèíselnosti tìchto typù projeví pøi aritmetické operaci dìlení. Pouijeme-li operaci dìlení na celoèíselný typ dostáváme celoèíselný výsledek a tzv. zbytek po dìlení. Mnohdy bývá programátor zaskoèen tím, e po vydìlení dostává výsledek, který je z hlediska celoèíselného dìlení správný, ale který neoèekával. # SIMPLE V4 - popis jazyka 03.2004 94 stran # Uveïme si pro názornost pøíklad: 10 / 11 = 0 zbytek 10 Uvedený pøíklad zapsaný v èíselné podobì vypadá zcela triviálnì. Uvaujeme-li operaci dìlení pro obecné promìnné tj. napø. podle zápisu: A = A / B mùe dojít ke znaènému údivu v pøípadì, e výsledek bude v programu trvale nula i kdy hodnoty promìnných jsou znaènì velké. Musíme tedy mít pøi programování vdy na pamìti uvedenou vlastnost celoèíselných typù resp. celoèíselného dìlení. V øadì pøípadù mùe být celoèíselné dìlení výhodné zvlátì je-li pouito ve spolupráci z operací pro zjitìní zbytku po dìlení. Pøedstavme si pøípad, e chceme celoèíselnou hodnotu promìnné "A" zaokrouhlit napø. na desítky. V takovém pøípadì mùeme pouít jednoduchého triku a napíeme: A = ( A + 5 ) / 10 * 10 Výsledek z uvedeného pøíkladu v promìnné "A" bude vdy zaokrouhlen na celé desítky a ponecháváme laskavému ètenáøi prostor pro promylení tohoto tvrzení. 3.3 Aritmetické promìnné Mezi aritmetické promìnné poèítáme promìnné celoèíselné spoleènì s promìnnými typu float. Aritmetické promìnné jsou tedy promìnné které mohou vstupovat do aritmetických operací tj. jsou pro nì definovány vechny základní aritmetické a relaèní operátory. Odlinost této tøídy promìnných oproti celoèíselným promìnným spoèívá právì v doplnìní typu float tj. typu urèeného pro výpoèty v pohyblivé øádové èárce. Vimnìme si e pro aritmetické promìnné nejsou definovány bitové logické operátory. Proè ? Je patrnì zcela nesmyslné zjiovat napø. hodnotu tøetího bitu promìnné float. 3.4 Jednoduché promìnné Pojmem jednoduché promìnné oznaèujeme vechny aritmetické promìnné doplnìné o promìnnou typu bit. $ SIMPLE V4 - popis jazyka 03.2004 94 stran $ 3.5 Pole Pojem pole byl do jazyka pro zaveden s cílem umonit konstrukci promìnné, která sestává z jednotlivých poloek stejného typu. Jednotlivé poloky takové promìnné je moné jednoduchým zpùsobem indexovat a zpracovávat poloku po poloce a nebo zajistit obecný pøístup k poloce promìnné nastavením indexu. Uveïme jednoduchý pøíklad deklarace pole bajtù: var byte[3] moje V uvedeném pøíkladu jsme zavedli pole, které obsahuje tøi poloky typu byte. Poloky jsou èíslovány ( indexace ) od 0 a nejvyí platný index je pak roven 2. Pro indexaci je moné pouít nejen konstantu, konstantní výraz ale i celoèíselnou promìnnou (vyjma bitových polí). Promìnnou typu pole mùeme deklarovat z libovolného typu promìnné. Maximální poèet prvkù pole je dán hodnotou 32768 a je vnitønì omezen. Není dovoleno deklarovat pole neznámé délky a délku pole pak urèovat pøi bìhu programu. 3.6 String String je do jisté míry speciální typ promìnné typu pole bajtù. String jako takový mùe existovat ve tøech podobách. První podobou je string zapsaný jako literál a mùe být pouit buï v inicializaci konstatního øetìzce znakù nebo mùe být pøedán jako parametr funkce nebo procedury. Druhou podobou je string definovaný jako konstanta napø. const s = "text" V takto uvedeném zápisu zavádíme konstantu "s" a inicializujeme ji literálem "text". Zde tedy vystupuje string jako konstanta, která oznaèuje string (literál) "text". Takto zapsaná konstanta "s" je uloena do kódové pamìti tj. spoleènì s programem jako posloupnost znakù zakonèená nulou a její hodnota je tvoøena adresou na právì tuto posloupnost znakù. Aby bylo moné pøedávat øetìzec do podprogramu nebo funkce a tam s ním pracovat, byl vytvoøen speciální typ promìnné string. Zde nám tedy string vystupuje ve tøetí podobì tj. v podobì formálního parametru jinak øeèeno v podobì formální promìnné. Dále je nutné poznamenat, e string je kompatibilní, a to je do jisté míry zvlátnost, s polem bajtù o libovolné délce. Je-li tedy string formálním parametrem podprogramu, je moné do tohoto parametru pøedat libovolnì dlouhé pole bajtù. Uveïme si pøíklad pouití stringu jako formálního parametru procedury. Nejprve deklarace procedury Tiskni. subroutine Tiskni (var string s1, const string s2) . . return % SIMPLE V4 - popis jazyka 03.2004 94 stran % A nyní monosti volání: var byte a[20] : byte b[30] Tiskni ( a, "text" ) Tiskni ( b, "jiny text") Dalí monost pro pouití stringu skýtají tabulky. Zde se vak stringy pøipoutìjí pouze jako literály. Uveïme pøíklad takové tabulky stringù: table string[2] text = ("text","jiny text") nebo s volným formátováním textu table string[2] text = ( "text", "jiny text" ) 3.7 Výrazy Výrazy v jazyce SIMPLE V4 se skládají z operandù spojených rùznými aritmetickými, logickými a relaèními operátory. Pøíklady výrazù: A+B B+C-C A*B+C/D A*(B+C) - (D-E)*F (A ^ B) kde +, -, *, a / jsou aritmetické operátory pro sèítání, odèítání, násobení a dìlení, operátor ^ pak patøí logické operaci exclusive or, A, B, C, D, E, F pak pøedstavují operandy (promìnné). Závorky slouí k seskupování operandù a operátorù tak, jako v obyèejné algebøe. Z programátorského hlediska je pak dùleité jak bude zapsaný výraz vyhodnocen a jakým postupem výraz zapsat. V programovacím jazyce SIMPLE V4 jsou dodrena pravidla o vyhodnocování (výpoètu) výrazu známá z algebry. Zápisy výrazù jsou pak, co se týèe formátu, jednoznaènì a pøesnì definovány tzv. syntaktickými diagramy, nicménì se neodliují od bìných pravidel a zvyklostí v ostatních programovacích jazycích. Pro vyhodnocování logických výrazù v podmínìných pøíkazech je moné pouít jeden ze dvou postupù. První z nich spoèívá v tom, e se celý logický výraz vyhodnotí a podle výsledku vyhodnocení se podmínìná èást pøíkazu vykoná nebo nevykoná. Druhá varianta øeení vyhodnocování logický výrazù je taková, e v okamiku, kdy je výsledek výrazu ji zøejmý, se jeho vyhodnocování zastaví a podmínìná èást pøíkazu se podle výsledku vykoná nebo nevykoná. Vzhledem k tomu, e v øadì pøípadù je druhá varianta pøi & SIMPLE V4 - popis jazyka 03.2004 94 stran & zpracování procesorem rychlejí, byla pouita v implementaci jazyka SIMPLE V4. Uveïme jednoduchý pøíklad pro osvìtlení principu vyhodnocování logických výrazù. Mìjme logický výraz podmínìného pøíkazu v následujícím tvaru if A > 20 and B < 30 then .... Pøedpokládejme pro uvedený pøíklad, e promìnné mají tyto hodnoty: A = 20 , B = 10 V první variantì øeení vyhodnocování výrazu se nejprve vyhodnotí obì porovnání tj. pro hodnotu "A" je porovnání neplatné a pro hodnotu "B" je porovnání platné. Po tomto vyhodnocení se vyhodnotí logické výsledky pøes logickou funkci and a vyjde výsledek, e logický výraz je neplatný a tudí podmínìný pøíkaz nebude vykonán. V druhé variantì (implementované v jazyce SIMPLE V4) se postupuje ve vyhodnocení ponìkud odlinì. Zjistí se logická hodnota porovnání pro promìnnou "A". Ta, jak víme, vyjde jako nepravdivá. Vzhledem, k tomu e dalí podmínka výrazu je navázána logickou funkcí and je zøejmé, e výsledky dalích porovnání u celkový výsledek výrazu neovlivní a proto se vyhodnocení dále neprovádí a rovnou je rozhodnuto, e podmínìný pøíkaz nebude proveden. Dalí typ výrazu, který je do jisté míry specifický, je typ aritmetická hodnota v logickém výrazu. V jazyce SIMPLE V4 je moné napø. zapsat logický výraz takto: if A and B then ... pøièem promìnná "A" a "B" jsou aritmetického typu. Takto zapsaný výraz se chápe jako relace nonekvivalence vùèi nulové hodnotì. Zápis je tedy rovnocenný s: if A <> 0 and B <> 0 then ... Do zápisu výrazù, mimo ji uvedených typù, patøí i operátor aritmetického posunu bitù celoèíselných promìnných vlevo nebo vpravo ( oznaèuje se dvojznaky "<<" pro posun vlevo a ">>" pro posun vpravo ). V tìchto typech výrazù je umonìn pouze posun o konstantní pøedem známý poèet bitù. Není tedy moné øídit posun bitù promìnnou. Dovolený zápis výrazu je napø. A << 3 nebo mùeme zapsat napø. const MAX = 3 A << MAX Jak je patrné i v druhém pøípadì se jedná o konstantní posun bitù, by je tento posun zapsán symbolicky. ' SIMPLE V4 - popis jazyka 03.2004 94 stran ' 3.8 Kompatibitita typù promìnných Kompatibilita typù promìnných je vdy promìnné-operátory a typ promìnné-typ promìnné. øeena na úrovni typ Kompatibilita na úrovni typ promìnné-operátor vyjadøuje, zda je moné daný typ promìnné pouít ve vazbì na daný operátor. Unární operátor " ' " (apostrof - bitová negace) je povolen pouze nad celoèíselnými promìnnými a hodnotou typu bit. Binární operátory "^", "&", "|", "%", ">>" a "<<" povoleny pouze nad celoèíselnými hodnotami (promìnnými). Unární operátor "-" a binární operátory "+", "-", "*", "/", "=", "<=", ">=", "<", ">", a "<>" jsou povoleny pouze nad aritmetickými hodnotami. V uvedené vìtì není pøeklep v operátoru "-". Tento operátor je skuteènì jak unární, tak binární. Pøíkladem pouití unárního operátoru "-" mùe být zápis: B = - A Podobný pøíklad pro binární operátor "-" je: B = C - A pro aritmetické promìnné. Kompatibilita typu typ promìnné-typ promìnné je øeena na základì pøíbuznosti typù a na základì zobrazitelnosti hodnoty jednoho typu v typu druhém. Operandy binární operace jsou z tohoto pohledu kompatibilní pouze tehdy, jestlie jeden z typù operandu je nadmnoinou druhého typu operandu. Tento typ se stává typem výsledku operace. V jazyce SIMPLE V4 jsou vzájemnì nekompatibilní napø. tyto dvojice typù: int-word int-longword word-int word-longint Stejné pravidlo o kompatibilitì platí i pro pøiøazování hodnoty do promìnné a pro pøedávání parametrù do podprogramù a funkcí. Pro typy, které jsou kompatibilní je definována tzv. "vzdálenost". Co si pod takovým pojmem mùeme pøedstavit ? Pojmem "vzdálenost" definujeme míru vzájemné kompatibility typù. Podle této míry se napø. øídí volba nejvhodnìjí pøetìované funkce pro zadanou posloupnost pøedávaných parametrù. O pøetìovaných funkcích jsme se zmínili v odstavcích vìnovaných identifikátorùm a jejich totonosti na stejné úrovni pro podprogramy a funkce. Vzdálenost vyjadøující kompatibilitu nebo chceme-li pøíbuznost typù je dobøe patrná v následující tabulce. ! SIMPLE V4 - popis jazyka 03.2004 94 stran ! Bit Byte 32K Word Int 2G LWord LInt Float Bit 0 -1 -1 -1 -1 -1 -1 -1 -1 Byte -1 0 -1 -1 -1 -1 -1 -1 -1 Word -1 2 0 0 -1 -1 -1 -1 -1 Int -1 3 1 -1 0 -1 -1 -1 -1 LWord -1 4 2 2 -1 0 0 -1 -1 LInt -1 5 3 3 3 1 -1 0 -1 Float -1 6 4 4 4 2 2 2 0 Sloupce tabulky vyjadøují typ promìnné a øádky vyjadøují typ výrazu. Hodnoty uvedené v jednotlivých políèkách tabulky, pak urèují míru kompatibility typu promìnné s výrazem. Hodnota -1 znamená nekompatibilitu, hodnota 0 úplnou kompatibilitu a hodnoty od 1 do 6 míru kompatibility ve stupnici od nejvìtí po nejmení pøíbuznost typù. Pro úplnost je tøeba dodat, e kromì definovaných typù jazyka jsou v tabulce uvedeny i interní typy pøekladaèe, které nejsou veøejnì dostupné (míníme tím dostupné v zápisu zdrojového textu programu). V souvislosti s tìmito typy mùe ètenáøe napadnout k èemu se interní neveøejné typy pouívají. Na takovou otázku je v podstatì jednoduchá odpovìï. Situaci ukame na pøíkladu. Definujme dvì promìnné, jednu typu word a jednu typu int. var word w var int i nyní proveïme inicializaci promìnných hodnotou 1000 tj. zapíeme pøiøazovací pøíkazy napø. takto: w = 1000 i = 1000 Hodnota 1000 je pøiøazována jednou promìnné typu word a jednou promìnné typu int. Pro hodnotu 1000 v uvedeném pøípadì není zøejmý typ, nebo jak je uvedeno výe, typ výrazu odpovídá nejvìtímu typu (musí být ovem kompatibilní) z tìch typù, které jsou ve výrazu pouity. Ze zápisu vak nejde urèit, zda chceme pøiøazovat 1000 typu word nebo typu int do té èi oné promìnné. Dále je nutné zdùraznit, e promìnné typu word a int nejsou kompatibilní. Prohlásíme-li èíslo 1000 za typ word, pak bychom druhý øádek museli zapsat takto: i = int (1000) Museli bychom tudí pouít pøetypování. Zkusme to z druhé strany. Prohlásíme 1000 za typ int. Pak vyjde druhý øádek bez problémù, ovem první øádek musíme díky nekompatibilitì typù v pøiøazovacím výrazu zapsat: w = word (1000) tj. s pøetypováním. ! SIMPLE V4 - popis jazyka 03.2004 94 stran ! Jak je vidìt oba pøístupy vedou ke stejnì absurdnímu øeení, nebo jsme nuceni neustále pøetypovávat èíslo 1000 na opaèný typ. Zaveïme tedy pro konstantní výrazy, které se vyèíslují ve fázi pøekladu interní typ promìnné, nazvìme ho 32K a prohlame, e je kompatibilní s typem int i word. Tento typ rozliuje èísla pod hodnotu 32767 a nad ni. V pøípadì, jako je ten uvedený, se nejprve zjistí typ výrazu do nìho spadá i pøiøazení typu èíslu 1000. Vzhledem k tomu, e èíslo 1000 je mení ne èíslo 32767 je prohláeno za interní typ 32K, který je kompatibilní s typem int i s typem word. Je tedy nyní zøejmé, e mùeme zapsat pøiøazení z uvedeného pøíkladu zcela prostì a tak, jak bychom pøirozenì oèekávali: w = 1000 i = 1000 Z obdobných dùvodù je zaveden i interní typ 2G. Konstatní výrazy Konstantní výrazy jsou takové, které mohou být vyhodnoceny ve fázi pøekladu. Operandem konstantního výrazu nemùe být prvek tabulky a naopak prvkem tabulky mùe být pouze konstantní výraz. Typ konstantního výrazu je dán jeho hodnotou. Po vyèíslení je tato hodnota porovnána s èíselnými rozsahy typù a za typ je zvolen typ s nejmením rozsahem do nìho se hodnota výrazu jetì vejde. Uveïme pøíklady konstantních výrazù vèetnì typù, které jim pøekladaè pøidìlí po jejich vyhodnocení. -1 ; typ int 60000 ; typ word 2000000000 ; typ 2G ! SIMPLE V4 - popis jazyka 03.2004 94 stran ! 4. Zápis zdrojového textu v SIMPLE V4 Následující odstavce jsou vìnovány popisu deklarací a definic, pouívání pøíkazù, podmínìných pøíkazù, volání podprogramù a funkcí. Pro vìtí názornost jsou jsou zápisy jednotlivých prvkù zdrojového textu komentovány pomocí pøíkladù. 4.1 Deklarace konstant V deklaraci konstant se identifikátorùm pøiøazují hodnoty dané polohou nebo konstantním výrazem. Pokud není hodnota konstanty explicitnì zadána, má první identifikátor v deklaraci hodnotu 0 a kadý dalí pak hodnotu o n vìtí, kde n je pozic identifikátoru v seznamu. Pøíklad Zápis const a,b,c je ekvivalentním zápisem deklarace const a = 0, b = 1, c = 2 Zápis const d = 1.5, , e, f = "abcd" je ekvivalentním zápisem deklarace const d = 1.5, e = 3.5, f = "abcd" Hodnota konstanty e bude 3.5, nebo v pùvodním zápisu je uvedeno o jednu èárku navíc mezi deklarací konstanty d a e. 4.2 Deklarace promìnných V sekci deklarace promìnných uvádíme typ a jméno promìnné. Promìnné mùeme rozdìlit podle pouití do dvou skupin. Skupina globálních promìnných deklarovaná v hlavním programu obsahuje pouze výèet promìnných. Skupinu lokálních promìnných je moné deklarovat pouze uvnitø tìla funkcí a podprogramù. Skupina lokálních promìnných obsahuje výèet promìnných a mùe obsahovat, tím se lií od skupiny globálních promìnných, inicializaèní výrazy. Význam inicializaèního výrazu spoèívá v tom, e pøekladaè automaticky zajistí vygenerování poèáteèního kódu podprogramu nebo funkce. Pomocí tohoto poèáteèního kódu se pøísluné promìnné na zaèátku podprogramu nebo funkce nastaví na poadované hodnoty. Pøíklad !! SIMPLE V4 - popis jazyka 03.2004 94 stran !! Deklarace globálních promìnných var byte B1, B2 : int i,j,k var longint L1, L2 : float F1 dvojteèka je pouita jako symbol pro pokraèování øádku Deklarace lokálních promìnných v podprogramu subroutine Proc (longword Lw) var byte B = byte(Lw) . . return V deklaraci je pouita inicializace promìnné byte hodnotou z promìnné typu longword. Aby bylo moné pøiøadit hodnotu z longword promìnné do promìnné typu byte je nutné provést tzv. pøetypování. Pøetypování zapíeme tak, e nový typ uvedeme do okrouhlých závorek pøed pøetypovávanou promìnnou. 4.3 Pole promìnných a jejich deklarace Pro kadý typ promìnné je moné deklarovat tzv. pole. Pole je indexovaný seznam promìnných stejného typu zaèínající indexem 0. V deklaraci pole uvádíme jeho rozmìr a vzhledem k tomu, e pole indexujeme od nulového indexu je maximální pøípustný index poloky pole o jednièku nií ne rozmìr pole. Rozmìr pole musí být konstantní výraz a uvádíme ho uvnitø hranatých závorek. Pøíklad deklarace pole promìnných const MAX = 3 var int[20] Pole float[MAX] Jine_pole V prvním pøípadì deklarujeme promìnou pole typu int o rozmìru 20 poloek, tj. platný index pole je od 0 do 19. Druhý pøíklad uvádí promìnnou Jine_pole obsahující tøi hodnoty typu float. 4.4 Definice typù Programovací jazyk umoòuje definici vlastních specifických typù promìnných a konstant. Definice vlastních typù je omezena tím, e nový typ mùe být konstruován ze základních nebo ji definovaných uivatelských typù. Novému typu je pøiøazen identifikátor, který je mono dále pouít pøi deklaracích. Dále platí, e identifikátor typu nesmí být sám zadán identifikátorem typu. Pøíklad !" SIMPLE V4 - popis jazyka 03.2004 94 stran !" type float[3] float_pole type int[2] complex_int: float_pole[3] float_matice V pøíkladu jsou zadefinovány typy pro oznaèení vícerozmìrných polí. V pøípadì typu complex_int je zadefinována promìnná obsahující dva prvky typu int a mùeme ji povaovat za promìnnou pro zobrazení komplexního èísla. První z obou prvkù mùeme vyhradit reálné èásti a druhý èásti imaginární. Pro takovou promìnnou pak mùeme napsat celou øadu podprogramù realizujících aritmetiku komplexních èísel. V druhém pøípadì jsme zadefinovali typ odpovídající matici o rozmìrech 3 krát 3 prvky typu float s pomocí ji definovaného jednorozmìrného pole s tøemi prvky typu float. Pøíklad pouití definovaných typù v deklaraci promìnných var complex_int z const R = 0 const J = 1 a následnì pouití promìnných x,y, a z typu complex_int v programu z[R] = x[R] * y[R] - x[J] * y[J] z[J] = x[J] * y[R] + x[R] * y[J] Z uvedeného zápisu deklarací konstant R a J plyne, e R je pouívána pro odkaz na reálné sloky komplexních èísel a J pro odkaz na sloku imaginárních èísel. Uvedené dva programové øádky realizují souèin dvou komplexních èísel x a y s následným pøiøazením výsledku do promìnné z. Podobnì mùeme realizovat aritmetiku matic pro promìnné typu matice. 4.5 Deklarace tabulek Deklarace tabulek slouí k definování konstant, které se uloí do kódové pamìti procesoru. Tabulka je vdy typu pole konstantní výrazy uvedené v seznamu výrazù nesmí být v závorkách a jednotlivé parametry musí být oddìleny èárkou. table string[3] jmena = ( "Petr", "Pavel", "Jan" ) Pøíklad deklaruje tabulku textových øetìzcù køestních jmen. Jednotlivá jména z tabulky mùeme tisknout napø. na displej èi jinak vyhodnocovat. !# SIMPLE V4 - popis jazyka 03.2004 94 stran !# 4.6 Deklarace podprogramù a funkcí Pro podprogramy a funkce deklarujeme identifikátor a seznam parametrù uzavøený do kulatých závorek. Pro funkce dále definujeme typ pøedávané hodnoty. Pøedávaná hodnota z funkce mùe být aritmetického typu. V deklaraci funkce musí být za závìreèným slovem return výraz kompatibilní s typem výstupní pøedávané hodnoty. Deklarace podprogramù je ukonèena samostatným slovem return. Podprogramy a funkce mohou obsahovat vnoøené podprogramy a funkce nemohou vak být volány rekurzivnì a poèet vnoøení nesmí pøesáhnout povolenou úroveò. Rozliujeme parametry podprogramù a funkcí volané tzv. hodnotou a parametry volané odkazem. V pøípadì parametrù volaných hodnotou je do funkce èi podprogramu pøedávána pøímo hodnota promìnné a pro toto volání platí stejná pravidla jako pro pøiøazování promìnné. V pøípadì parametrù volaných odkazem je do podprogramu nebo funkce pøedávána adresa promìnné. Skuteèný parametr tj. promìnná musí být v stejného typu jako formální parametr. Pokud je promìnná pole, pak musí mít stejný poèet dimenzí, stejné rozmìry i typ elementu jako formální parametr. Pro promìnnou pøedávanou odkazem není povolen typ bit. Do podprogramù a funkcí je moné pøedávat konstantní parametry. Pokud je skuteèný parametr aritmetický, pak se pøedává jako volaný hodnotou. V opaèném pøípadì tj. pøi volání odkazem musí být skuteèný parametr tabulka shodného typu jako je formální parametr. Parametry volané odkazem (resp. konstantní parametry) mohou být typu string. V tomto pøípadì musí být skuteèný parametr pole bytù (resp. tabulka bytù nebo stringový literál). Formální parametry string se v tìle podprogramù a funkcí chovají jako pole bytù. Do polí tohoto typu není moné pøiøazovat, pouze z nich èíst jednotlivé byty. Hodnota indexu se nekontroluje. Pøetìování podprogramù a funkcí Pokud je identifikátor podprogramu nebo funkce pøetíen, provádí se výbìr podprogramu èi funkce na základì urèení vzdáleností z tabulky vzdáleností typù ( viz výe ). Pokud existuje více funkcí, které mají pro dané volání stejný poèet vzdáleností skuteèných a formálních parametrù, pak je tento stav vyhodnocen jako chyba. Je tedy moné zapsat deklarace takto: subroutine s ( float f : byte b ) subroutine s ( byte b : float f) V tomto pøípadì vak musíme dávat pozor, abychom do podprogramu s nepøedali parametry tak, e není moné rozhodnout, která z uvedených deklarací se má pouít. Uvedeme pøíklady volání podprogramu s. ss(1,1) !$ ;volání je vyhodnoceno jako chybné, protoe nelze ;rozhodnout, která z uvedených deklarací se má pro ;pøeklad pouít SIMPLE V4 - popis jazyka 03.2004 94 stran !$ ss(1,1.0) ;volání je vyhodnoceno jako korektní a pouije se ;druhá z uvedených deklarací ss(1, float(1));i v tomto pøípadì je volání vyhodnoceno jako ;správné nebo je moné o nìm rozhodnout podle ;pøetypování druhého parametru na typ float 4.7 Pøíkazy jazyka SIMPLE V4 V jazyce SIMPLE V4 existují tyto typy pøíkazù: pøíkaz pøiøazení podmínìný pøíkaz pøíkaz exit pøíkaz výraz pøíkaz not pøíkaz vykøièník pøíkaz øádka Z tohoto seznamu pøíkazù je moné vydìlit pøíkazy, které byly do verze V4 umìle zavedeny z dùvodù kompatibility s pøedchozím programovacím jazykem Simple V2. Jedná se o tyto pøíkazy: pøíkaz výraz pøíkaz not pøíkaz vykøièník pøíkaz øádka Tyto pøíkazy nedoporuèujeme pouívat v nových zápisech zdrojového textu programù, nebo s jejich implementací se v dalích verzích jazyka nepoèítá. !% SIMPLE V4 - popis jazyka 03.2004 94 stran !% Pøíkaz pøiøazení Pøiøazovací pøíkaz odpovídá svou konstrukcí a významem obvyklým zvyklostem v programovacích jazycích. Jedná se o pøiøazení hodnoty výrazu do zvolené promìnné. Na rozdíl napø. od jazyka C nesmí být pøíkaz pøiøazení pouit v podmínkové èásti podmínìného výrazu. Pøíklad var int i : int j i = j + 2 Podmínìný pøíkaz Podmínìný pøíkaz se skládá z podmínkové èásti, èásti pro pravdivou podmínku a èásti pro nepravdivou podmínku. Podmínkovou èást pøíkazu tvoøí logický výraz. Na základì vyhodnocení podmínky se vykoná buï èást odpovídající pravdivému vyhodnocení podmínky nebo èást odpovídající vyhodnocení nepravdivému. Zápis podmínìného pøíkazu odpovídá formálnímu zápisu: if podmínka then pravdivá_èást [else nepravdivá_èást] Nepravdivá èást není v zápisu pøíkazu povinná a proto je ve formálním zápisu uvedena v hranatých závorkách. Výe uvedený zápis je pouze ilustrativní pøièem pøesný tvar zápisu mùeme zjistit ze syntaktických diagramù. Pøíklad var int i : int j if j > 0 then i = 0 else i = 1 Pøíkaz exit Pøíkazem exit je moné pøedèasnì ukonèit vykonávání podprogramu nebo funkce. Pro pøípad funkce musí být doplnìn o kompatibilní výraz s typem funkce, aby bylo moné pøedat návratovou hodnotu. Kdy je vhodné pøíkaz nasadit? Pøedstavme si, e v podprogramu zpracováváme nìkteré pøíkazy za vech okolností a zbylé pøíkazy vykonáme pouze tehdy, je-li splnìna podmínka podmínìného pøíkazu splnìna. Pøedpokládejme, e se jedná o podmínku typu "i <> 0", kde "i" je napø. promìnná typu int, která je spojena s podmínkou "j = 0" a "j <> 0" pro promìnnou "j" typu int. Dále poadujeme, aby se v pøípadì, e bude splnìna podmínka "i <> 0", vykonal "pøíkaz1" pro podmínku "j = 0" a "pøíkaz2" pro podmínku "j <> 0". Pro ostatní varianty se nemá vykonat ani "pøíkaz1" a ani "pøíkaz2". !& SIMPLE V4 - popis jazyka 03.2004 94 stran !& Pouijeme-li standardní postup dojdeme ke konstrukci podprogramu je formálnì odpovídá zápisu subroutine zkus ( int i ) prikaz_a prikaz_b if i <> 0 and j = 0 then prikaz1 if i <> 0 and j <> 0 then prikaz2 return Vimnìme si, e logický výraz v podmínce je navázán jednak na promìnnou i a jednak na výraz podle nìho se rozhoduje zda se pøíkaz následující za klíèovým slovem vykonat má, který se má plnit, kdy je podmínka splnìna. V tìchto pøípadech nelze pro jednotlivé øádky programu pouít èásti else v podmínìném pøíkazu. Proè ? Modelujme si napø. situaci na prvním podmínìném pøíkazu podprogramu a zapime si ji tak, e pouijeme èást else. Takto zapsaný podmínìný výraz bude formálnì vypadat takto: if i <> 0 and vyraz then prikaz1 else prikaz2 Rozebereme-li nyní vlastnosti podmínky v podmínìném pøíkazu zjistíme následující. V pøípadì, e promìnná i bude skuteènì rùzná od nuly, pak první èást podmínky platí. A rozhodování, který z pøíkazù se vykoná, je øízeno platností podmínky "i=0". Z uvedeného vyplývá, e za této situace se podmínìný pøíkaz chová podle zadání. Zkusme nyní pro vyhodnocení uvaovat, e je splnìna podmínka "i=0". Za tohoto pøedpokladu se vdy vykoná "pøíkaz2" nezávisle na hodnotì promìnné "i". V této situaci u uvedené øeení nesouhlasí s poadavky zadání. Dalí moností jak situaci øeit je pouití sloeného pøíkazu pro splnìnou podmínku "i <> 0". Zápis nyní bude vypadat takto. if i <> 0 then begin if j = 0 then prikaz1 else prikaz2 end Takto zapsané øeení úlohy se bude chovat podle zadání. Nyní budeme demonstrovat zápis pomocí pøíkazu exit. subroutine zkus ( int i ) prikaz_a prikaz_b if i = 0 then exit if j = 0 then prikaz1 else prikaz2 return !' SIMPLE V4 - popis jazyka 03.2004 94 stran !' Uvedené øeení s pøíkazem exit vede po pøekladu k nejrychlejímu generovanému kódu programu, nebo pøi stejném poètu podmínek neobsahuje zápis podmínku sloenou ze dvou výrazù popø. vloený podmínìný pøíkaz do jiného podmínìného pøíkazu. Z hlediska funkce jsou tedy øeení ekvivalentní. Z hlediska rychlosti a v øadì takových pøípadù i délky kódu je nejlepí zápis právì s pøíkazem exit. 4.8 Umìle zavedené pøíkazy Pomocí umìle zavedených pøíkazù do jazyka SIMPLE V4 se øeí syntaktické prohøeky z jazyka Simple. Vechny syntaktické konstrukce, které odpovídají zavedeným umìlým pøíkazùm nebudou v budoucnosti podporovány. Proè jsou tedy podporovány nyní? Dùvod je prostý. Pøi jejich konstrukci jsme byli vedeni snahou zachovat zpìtnou kompatibilitu zdrojových textù smìrem k jazyku Simple a usnadnit tak pøechod na nové syntaktické konstrukce. Pro tyto vyjímky vak platí, e v okamiku, kdy pøi rozvoji jazyka zaènou syntakticky vadit a znemoòovat tak udrení syntaktické èistoty, budou ze syntaktických konstrukcí odstranìny. Z tohoto dùvodu doporuèujeme pøejít v nových aplikacích na novou syntaxi jazyka SIMPLE V4. Pøíkaz výraz Jedná se o umìlý pøíkaz zavedený z dùvodu zpìtné kompatibility zdrojových textù psaných pro jazyk Simple. V nových aplikacích doporuèujeme místo tohoto pøíkazu pouívat novou syntaxi zápisu, protoe tento pøíkaz (stará syntaktická konstrukce) nebude v budoucnu podporován. Pøíkaz výraz je zápis pro nastavení bitové promìnné na hodnotu 1. Pøíklad var bit vystup Stará syntaxe zápisu vvystup ;stará syntaxe jazyka simple nastaví bitovou ;promìnnou na hodnotu 1 Nová syntaxe zápisu vystup = 1 Pøíkaz not Jedná se opìt o umìlý pøíkaz zavedený obdobnì jako pøíkaz výraz z dùvodu zpìtné kompatibility zdrojových textù. Pøíkaz not kopíruje starou syntaxi zápisu nulování bitové promìnné. V nových zdrojových textech aplikací doporuèujeme opìt pouívat nové syntaxe, nebo pøíkaz not nebude v budoucnu podporován. " SIMPLE V4 - popis jazyka 03.2004 94 stran " Pøíklad var bit vystup Stará syntaxe zápisu 'vystup ;provede vynulování bitové promìnné vystup Nová syntaxe zápisu nulování bitu vystup = 0 Pøíkaz vykøièník Dalí z umìlých pøíkazù zavedený z dùvodu zpìtné kompatibility. Ve staré syntaxi se jednalo o zápis negace bitové promìnné tj. o operaci, kdy se hodnota bitu zmìnila na opaènou. Pøíklad var bit vystup Stará syntaxe zápisu !vystup nová syntaxe zápisu vystup = vystup' Pøíkaz øádka Jedná se o umìlý pøíkaz zavedený do jazyka pro z dùvodu zpìtné kompatibility s jazykem SIMPLE V2, postaveném na principu øádkového pøekladaèe (povaujícího znak nového øádku, tj. konec øádku pøedchozího, za oddìlovaè). Syntaxe moderních jazykù povaují pøechod na novou øádku za bezvýznamný syntaktický prvek. Tento moderní pohled pak umoòuje uivateli volné formátování zdrojového textu a odstraòuje omezení délky pøíkazu standardní 80-ti znakovou délkou øádku. V øadì pøípadù se podaøilo v nové syntaxi vyøeit problematiku konce øádky bezbolestnì. Jsou vak pøípady, kdy to nebylo moné a v tìchto pøípadech je pøíkaz konce øádky implementován. Vechny pøíklady implementace pøíkazu øádka jsou zahrnuty v syntaktických diagramech v následující podkapitole tohoto manuálu. Pro jednoduchost uveïme alespoò jeden typický pøíklad. V jazyce Simple V2 byl zaveden pokraèovací pøíkaz tj. znak ":" pouívaný na jedné øádce k oddìlení jednotlivých pøíkazù. " SIMPLE V4 - popis jazyka 03.2004 94 stran " Uveïme typický pøíklad: if KBCODE=K_ENT then NewID=0100 : POINTER=OFS+10 : STACK=CurrID V zápisu vidíme oddìlovaèe ":", které reprezentují vlastnì pokraèovací pøíkaz. V jazyce SIMPLE V4 byl zaveden místo pokraèovacího pøíkazu pøíkaz sloený ohranièený klíèovými slovy begin a end. V uvedeném zápisu pak konec øádky vystupuje ve významu ukonèení podmínìného pøíkazu. Z dùvodu kompatibility byla tato syntaxe zachována. Z uvedeného vyplývá, e v syntaxi jazyka SIMPLE V4 je tento zápis moný tj. mùeme opìt zapsat: if KBCODE=K_ENT then NewID=0100 : POINTER=OFS+10 : STACK=CurrID Do budoucna vak bude podporována pouze následující konstrukce: if KBCODE=K_ENT then begin NewID=0100 POINTER=OFS+10 STACK=CurrID end Z uvedeného zápisu nové syntaxe je zøejmé, e omezení a hlavnì nepøehlednost zápisu vyplývající z délky øádku je novou syntaxí potlaèeno. 4.9 Makra Jazyk SIMPLE V4 zavádí novì jazykovou konstrukci tzv. Makra. V jazyce Simple byla byla umonìna obdobná konstrukce pro pøiøazování symbolù skuteèných vstupù a výstupù a specifikovaném automatu vùèi identifikátorùm programu. Makro je oznaèeno speciálním znakem "#", který nesmí být uveden v øetìzci znakù a v komentáøi. Makro musí být døíve deklarované, ne jej pouijeme ve zdrojovém textu. Na rozdíl od ostatních identifikátorù napø. jmen promìnných je dovoleno vzájemné volání maker. Makro pøíkaz v jazyce SIMPLE V4 je pøekládán formou nahrazení øetìzce. Makro musí být vyèíslitelné ve fázi pøekladu a jeho zápis funguje v pøípadì pøiøazení promìnných obdobnì jako v jazyce Simple. Z uvedeného vyplývá, e konstrukce pøiøazení jmen pøeddefinovaných promìnných tj. napø. síové promìnné D, zùstává zachována a vypadá nadále napø. takto: D32 # Moje_promenna_D Zápis Makra tedy odpovídá formálnímu tvaru: jméno_makra # identifikátor " SIMPLE V4 - popis jazyka 03.2004 94 stran " Pragma Jedná se o speciální zápis doplòujících informací pro vlastní prùbìh pøekladu. Pragmata jsou uvozena znakem "$". Slouí ke specifikaci pouitého konfiguraèního souboru pøekladaèe a souboru vnoøeného. Uveïme pøíklady zápisu: $config (cesta\jméno_souboru) $include (cesta\jméno_souboru) Jak je vidìt z uvedeného zápisu, pragmata zajiují lokální návaznost daného zdrojového textu na dalí soubory. Pragma config specifikuje návaznost pøekládaného textu na typ automatu a programovací prostøedí jej do projektu doplòuje automaticky. Není tedy nutné se jím nikterak zabývat. Dalím typem pragmatu mùe být pragma include. Tímto pragmatem oznamujeme pøekladaèi, které soubory má pro následný prùbìh povaovat za související. Pouití tohoto pragmatu mùeme pøipodobnit k funkci vloit, kterou dnes podporuje ji snad kadý textový editor. Jinak øeèeno soubor uvedený v pragmatu include se pøi pøekladu zaèlení do pøekládaného zdrojového textu od místa jeho uvedení v pragmatu include. "! SIMPLE V4 - popis jazyka 03.2004 94 stran "! 5. Chyby Následující kapitola je vìnována chybovým hláením, které mohou vznikat pøi pøekladu. Chyby generované pøekladaèem mùeme rozdìlit na pìt následujících skupin: Interní chyba pøekladaèe generuje se v okamiku, kdy pøekladaè neví jak pøeloit zdrojový text. Abort tento typ chyby je generován pøi nestandardním ukonèení pøekladu. Typickou situací pøi ní nastane je okamik, kdy je nalezena konstrukce generující "chybu v chybì". Fatal chyba se generuje v pøípadì, e v pøekladu není moné pokraèovat díky známým omezením. Typické je pro tento pøípad pøekroèení rozsahu volné pamìti. Syntaktická chyba je generována pøi nalezení konstrukce, která neodpovídá syntaktickým diagramùm jazyka SIMPLE V4. V tomto pøípadì se pøekladaè pokusí nastartovat dalí pokraèování pøekladu od nìkterého jednoznaènì odliitelného bodu zdrojového textu. Ne se mu to podaøí, mùe dojít ke generování tzv. zavleèených chyb, které pramení z první nalezené chyby. Je tedy tøeba opravit první chybu a spustit znovu pøeklad, nebo není vylouèeno, e dalí chyby byly jen zavleèené a oprava první chyby opraví i chyby následující. Sémantická chyba jedná se o typ chyby, která je generována pøi nalezené nekompatibilitì v operaci. 5.1 Chybová hláení generovaná pøekladaèem Chybová hláení generovaná v prùbìhu pøekladu mají nìkolik úrovní poèínaje chybou pøi ní pøeklad ani nezaène, pøes chyby ukonèující pøeklad a po chyby obecné, které nezpùsobí zastavení pøekladu. V soupisu jsou pouívány tyto symboly: oznaèuje chybové hláení oznaèuje popis vzniku chyby oznaèuje monost jak chybu opravit. "" SIMPLE V4 - popis jazyka 03.2004 94 stran "" Chyby závané (typu Abort). Chybný (neznámý) soubor zdrojového textu Fatální chyba diskové operace pøi otevírání vstupního souboru zdrojového textu. Ovìøte, e vstupní soubor zdrojového není otevøen v nìjakém jiném editoru napø. WordPAD apod. Dvojitá chyba. Fatální chyba pøekladu. Dolo k dvojímu volání pøedèasného ukonèení bìhu pøekladaèe z dùvodu vzniku dvojiho generování fatální chyby. Tato chyba mùe vzniknout pouze za situace, kdy dolo k nepøedvídatelné reakci pøekladaèe. S nejvìtí pravdìpodobností zpùsobil pøekladaè chybu v dynamickém alokování pamìti nebo v rekurzivních operacích bìhem pøekladu. Operaèní systém mùe být v nestabilním stavu. Doporuèujeme provést uzavøení a opìtovné nové otevøení programovacího prostøedí. Vhodný je té reset operaèního systému, nebo systémová operace provádìjící bezpodmíneèné ukonèení procesu neprobìhla v poøádku. Pokud by se chyba opakovala doporuèujeme kontaktovat firmu Micropel sro. Nekompatibilní 'object' soubor Soubor vzniklý v prvním bìhu pøekladu není kompatibilní se vstupním souborem pro generátor kódu. Proveïte upgrade vaeho vývojového prostøedí popøípadì konzultujte problém s firmou Micropel sro. Nekompatibilní model pamìti Generátor kódu v druhé fázi pøekladu byl sputìn se vstupním souborem v nevhodném nebo neznámém modelu pamìti cílového automatu. Proveïte upgrade vaeho vývojového prostøedí popøípadì konzultujte problém s firmou MICROPEL. Nedostupný generátortor kódu Generátor kódu nebyl nalezen a nelze vygenerovat výstupní DNL soubor. Pokud chyba vznikla po pøedchozím pokusu o pøeklad a ten skonèil "Dvojitou chybou", proveïte restart poèítaèe. Pokud tomu tak není, chybí ve vaí instalaci odpovídal¨jící dynamická knihovna obsahující pøísluný generátor kódu. Proveïte upgrade vaeho vývojového prostøedí. "# SIMPLE V4 - popis jazyka 03.2004 94 stran "# Zdrojový soubor nenalezen Soubor se zdrojovým textem nebyl nalezen Ovìøte zda se nachází pøísluný soubor na disku. K chybì mùe té dojít tehdy kdy se uvedený soubor nepodaøí vygenerovat z nadstavbových editorù vývojového prostøedí (grafický editor apod.). Pøeklad není moné spustit, kdy dolo k chybì preprocesu v nìkterém z tìchto editorù. Pøíli mnoho vnoøených 'include' (pravdìpodobnì rekurze) Pøekladaè umoòuje vnoøit maximálnì 50ti souborù pomocí direktivy include. Poèet vnoøení byl pøekroèen. Provìøte poèet vnoøení a provìøte zda nedochází k rekurzi pøi pouití direktivy include. Pøíli mnoho 'include' souborù V prùbìhu pøekladu bylo vloeno více jak 50 souborù direktivou include. Proveïte slouèení nìkterých souborù volaných direktivou include tak aby celkový poèet vkládaných souborù nepøesáhl poèet 50. Chyba v souboru Pøi ètení souboru zdrojového textu dolo k chybì. Provìøte zda soubor skuteènì obsahuje zdrojový text. Provìøte zda soubor není otevøen v jiném editoru. Provìøte obsah pevného disku pomocí programu ScanDisk. Soubor (adresáø) poadovaného jména neexistuje Pøekladaè nemùe najít a otevøít soubor zadaného jména. Problém mùe být zpùsoben pøi kopírování projektu na jiný disk nebo do jiného adresáøe. Pøi kopírování projektu jsou pøekopírovány pouze soubory, o kterých manaer projektu ví tj. ty, které jsou vloeny do projektu právì pomocí projekt manaeru. Soubory, které jsou do zdrojového textu vloeny pomocí direktivy include, nejsou automaticky kopírovány. Provìøte zda daný soubor existuje. Pokud tomu tak není doplòte soubor. Pokud soubor existuje opravte cestu ve volání souboru pomocí direktivy include. Pøíli mnoho otevøených souborù Je otevøeno pøíli mnoho souborù a dalí soubory není moné otevøít. Provìøte hloubku volání direktivy include, provìøte pøípadnou rekurzi této direktivy. Zkuste uzavøít ostatní sputìné programy. "$ SIMPLE V4 - popis jazyka 03.2004 94 stran "$ Neznámé nastavení Bylo provedeno volání pøekladaèe s chybným nebo neznámým parametrem. Kontaktujte firmu MICROPEL a proveïte pøíp. upgrade vývojového prostøedí. Pøístup odepøen Systém odepøel pøístup k souboru poadovaného jména. Provìøte zda není soubor otevøen v jiném programu. Pokud ano program uzavøete. Pokud ne, zkuste restartovat operaèní systém. Nespecifikovaná chyba pøi otevøení souboru Pøi otevírání souboru dolo k nespecifikované chybì. Objeví-li se nespecifikovaná chyba pøi otevøení souboru, zkuste zavøít a znovu spustit vývojové prostøedí. Provìøte není-li soubor otevøen v jiném programu. Pamì dostupná pro pøekladaè byla pøekroèena Velikost pamìti, kterou má pøekladaè od systému k dispozici není dostateèná k dokonèení pøekladu. Uzavøete ostatní sputìné programy a zkuste pøeklad znovu. Provìøte zda není ve zdrojovém textu rekurze. Vkládaný soubor nebyl nalezen (chyba include) Nebyl nalezen soubor specifikovaný direktivou include. Provìøte a pøíp. opravte direktivu include tj. jméno souboru a cestu. Jméno vkládaného souboru není specifikováno Jméno souboru v direktivì include není specifikováno nebo nebylo nalezeno. Provìøte jméno souboru a syntaxi direktivy include. Pokud je pouito, odstraòte odøádkování v direktivì include. Chybná klazule include Pouití èi syntaxe klauzule (direktivy) include chybnì Provìøte zda zápis odpovídá tvaru: $include (cesta\soubor.pøípona) Pøíli sloitý výraz Oznaèený výraz není schopen pøekladaè pøeloit, protoe svou sloitostí pøekroèil povolený poèet rekurzivních volání vyhodnocení výrazu. Výraz rozdìlte na dva kratí výrazy. "% SIMPLE V4 - popis jazyka 03.2004 94 stran "% Chyby lexikální a syntaktické V definici makra chybí jméno makra Za øídícím znakem # definice makroinstrukce chybí nebo nebylo nalezeno jméno makra. Doplòte jméno makra, popøípadì odstraòte odøádkování pøed tímto jménem. Pøíli mnoho vnoøených maker V zápisu makroinstrukcí jste pouili více ne 8 úrovní vnoøení. Provìøte poèet vnoøení maker a sledujte zda se nejedná o rekurzivní volání. Nekompatibilní verze knihovny Verze knihovny vkládaná pomocí direktivy $Library je nekompatibilní a tudí ji není moné zpracovat. Provìøte zda soubor vkládaný pomocí direktivy $Library je skuteènì souborem obsahujícím knihovnu tj. souborem který vygeneroval pøekladaè sputìný s parametrem LIB. Pokud pouíváte knihovnu z neovìøených zdrojù konzultujte problém s firmou Micropel sro pøípadnì proveïte upgrade svého pøekladaèe èi vývojového prostøedí. Klauzule include byla pouita pro soubor knihovny Provádíte generování knihovny ze zdrojového souboru, který obsahuje klauzuli (direktivu) $Include. Pouití této direktivy není v tomto pøípadì dovoleno. Pokud potøebujete pro definici knihovních datových struktur nìkteré informace obsaené ve vkládaném souboru, zkopírujte tyto informace do souboru, z nìho generujete knihovnu. Tím budou tyto definice souèástí knihovny. Tyto úpravy jsou nutné z dùvodu pøenositelnosti výsledné knihovny. Konec souboru v komentáøi Jedná se o chybu, která èasto vzniká jako chyba zavleèená, tj. chyba vzniklá z dùvodu vzniku pøedchozích chyb. V takovém pøípadì se nìkdy nepodaøí, aby pøekladaè správnì odhadl dalí ji bezchybnì napsaný pøíkaz nebo øádek. Jen v minimu pøípadù se jedná o skuteènì neuzavøený blokový komentáø zdrojového textu. Pokud je chyba hláena samostatnì tj. jako jediná, doplòte ukonèovací znaky blokového komentáøe */. Pokud se pøed touto chybou objevily chyby dalí, odstraòte nejprve pøedcházející chyby a proveïte pøeklad znovu. Chyba s nejvìtí pravdìpodobností zmizí. "& SIMPLE V4 - popis jazyka 03.2004 94 stran "& Nedovolený znak Oznaèený znak zdrojového textu je v daném pøípadì znak nedovolený. Opravte zápis zdrojového textu dle syntaktických pravidel. Konec øádky v øetìzci Pøekladaè nenalezl ukonèení øetìzce znakù na zpracovávané øádce zdrojového textu. Ukonèete øetìzec znakù znakem ". Mùe se jednat té o vnesenou chybu z chyb pøedchozích. Pøíli velká hodnota celoèíselné konstanty Oznaèený zápis celoèíselné konstanty dává pøi jejím vyhodnocení pøíli velkou hodnotu. Hodnota je sledována i z hlediska typu promìnné nebo parametru funkce kam je pøedávána. Opravte zápis konstanty. Chyba v èíselné konstantì Chybou je nejèastìji oznaèen znak, který není moné pouít pøi zápisu konstanty. Opravte zápis konstanty dle syntaktických pravidel jazyka. Pozor, mùe jít té o vnesenou chybu z chyb pøedchozích. Výraz musí být aritmetický Pouitý výraz je zapsán tak, e se jedná ve skuteènosti o výraz logický. Výraz je pouit na místì, kde je vyadován výraz aritmetický. Opravte zápis výrazu. Mùe jít té o vnesenou chybu z chyb pøedchozích nebo o patnou syntaxi zápisu podmínìného pøíkazu, kdy se výkonná èást podmínìného pøíkazu vyhodnocuje jako podmínka tj. chybí klíèové slovo "then". Oèekává se symbol [symbol] Chyba je hláena v okamiku, kdy pøekladaè oèekává v zápisu zdrojového textu symbol. Oèekávaný symbol je uveden spoleènì s chybovým hláením (viz. hranaté závorky). Pokud uvedený symbol v zápisu skuteènì chybí, doplòte jej. Chyba mùe být vnesená a tudí je moné, e vznikla z chyb pøedchozích. Pokud se zdá, e symbol na uvedeném místì nechybí, opravte pøedchozí chyby a proveïte nový pøeklad. "' SIMPLE V4 - popis jazyka 03.2004 94 stran "' Neoèekávaný symbol [symbol] Pøekladaè nalezl ve zdrojovém textu symbol, klíèové slovo, které na daném místì zdrojového textu neoèekával. Symbol je uveden spoleènì s chybovým hláením. Mùe jít o vnesenou chybu nebo pøeklep èi omyl. Provìøte zda se jedná o pøeklep a pokud ano, opravte jej. V ostatních pøípadech opravte pøedchozí chyby a proveïte nový pøeklad zdrojového textu. Po znaku otazník musí následovat èíslo bitu V zápisu zdrojového textu je pouit znak otazník "?", který realizuje pøístup ke zvolenému bitu v celoèíselné promìnné. Bit vak musí být specifikován konstantním výrazem. Opravte výraz urèující pozici bitu tak, aby byl konstatní tj. napø. sepni ? 3 Chyby v deklaraci funkcí Rekurzivní volání funkce V rozvoji volání funkce nalezl pøekladaè její rekurzivní volání. Rekurzivní volání není dovoleno. Opravte volání funkce tak, aby rekurze byla vylouèena. VXEURXWLQHDLQWL EL ]GHYROiPHSRGSURJUDPE UHWXUQ VXEURXWLQHELQWL DL ]GHYROiPH]SWSRGSURJUDPD UHWXUQ Volání procedury ve výrazu V oznaèeném výrazu je volána procedura. Vzhledem k tomu, e procedura nevrací hodnotu není moné pouít volání procedury v libovolném typu výrazu nebo v podmínce pøíkazu "if". Odstraòte volání procedury ve výrazu nebo zmìòte deklaraci procedury na funkci a do tìla této funkce vlote pøíkaz "return" doplnìný o návratovou hodnotu. # SIMPLE V4 - popis jazyka 03.2004 94 stran # Identifikátor není funkce V zápisu zdrojového textu je uveden identifikátor doplnìný o blok pøedávání parametrù. Uvedený identifikátor vak nebyl deklarován jako funkce èi procedura. Opravte jméno funkce nebo odstraòte blok parametrù, popøípadì doplòte aritmetický výraz o aritmetickou operaci. Napø. test ( 9 + vykon) zmìòte na test * ( 9 + vykon) Jiná monost chybného zápisu: YDULQWDLQWELQWSDU E DSDU "a" je promìnná nikoliv funkce. Pøíli mnoho parametrù funkce (max 32) Ve zdrojovém textu byl pøekroèen maximální dovolený poèet 32 parametrù pøedávaných do funkce. Pøepracujte funkci tak, aby nebyl tento poèet pøekroèen. Pouijte napø. globální promìnné nebo strukturované promìnné vlastního typu. Parametr musí být aritmetického typu Parametr pøedávaný do funkce hodnotou musí být aritmetického typu, tj. nesmí to být struktura nebo pole nebo jiný kombinovaný datový typ. Je-li tøeba pøedat sloený typ do funkce, pouijte pøedání odkazem (v deklaraci parametrù pouijte pøed typem promìnné klíèové slovo "var".) Chyby v kompatibilitì typù Pøiøazením mùe dojít ke ztrátì hodnoty Ve zdrojovém textu jste pouili pøiøazení znaménkové promìnné do neznaménkové promìnné a nebo promìnné s vìtím rozsahem hodnot do promìnné s mením rozsahem hodnot. Pøiøazením mùe skuteènì dojít ke ztrátì nebo zmatení hodnoty. Pokud chcete pøesto pøiøazení provést je nutné provést explicitní pøetypování promìnné nebo výrazu napø. VAR_BYTE = (byte) VAR_WORD Doporuèujeme striktnì dodrovat stejné typy promìnných pro vzájemné pøiøazení hodnot. # SIMPLE V4 - popis jazyka 03.2004 94 stran # Nekompatibilita v binární operaci Chyba vzniká tehdy pokud se v binární operaci (výrazu) vyskytnou datové typy, které nejsou kompatibilní pro pøiøazení tj. znaménkové a neznaménkové typy, typy s rùzným rozsahem hodnot. V nìkterých pøípadech nevadí pouití odliných datových typù ve výrazu. Jedná se napøíklad o souèet promìnné typu byte s promìnnou typu word. To vak platí pouze tehdy, kdy výsledek je operace pøiøazen do typy word. Pokud tomu tak není dojde k hláení této chyby. Ovìøte platnost operace z hlediska datových typù, které do operace vstupují a opravte zápis operace v souladu se znaménkovými a neznaménkovými typy promìnných a v souladu s rozsahem hodnot tìchto promìnných. Pomoci mùe i pøetypování nìkterého z operandù. Operandy musí být aritmetického typu Operandy výrazu neodpovídají aritmetickému typu. Operandy, které oznaèujeme za aritmetické, jsou typu "byte", "word", "int", "longword", "longint" vèetnì jejich bezpeèných variant typu safe. K uvedenému výètu pøidáváme jetì typ "float". Chyba nejèastìji vzniká opomenutím specifikace dané poloky u strukturovaných typù promìnných popø. polí nebo vlastních typù promìnných. Ovìøte zda pouité operandy odpovídají definicí aritmetickému typu. Operandy musí být typu int Ve výrazu jste pouili operandy, které nejsou celoèíselné. Typicky jsou celoèíselné operandy poadovány v indexu pole. Za celoèíselné operandy jsou vechny typy promìnných vyjma typu "float" a "bit". Ovìøte zda pouitý datový typ odpovídá celoèíselnému typu promìnné. Pozor na poloky strukturovaných typù promìnných a na pole. Levá strana pøiøazení není promìnná Chyba vznikne napøíklad tehdy pokud se pokouíte pøiøadit výsledek aritmetické operace do promìnné typu "const". Tento typ promìnné není moné pouít pro pøiøazení nebo promìnná je pøeloena do kódové pamìti (pamìti programu) a tuto pamì nelze mìnit. Stejnì tak je chyba hláena pokud se pokusíte pøiøadit výsledek do pole a nespecifikujete poloku pole. Obdobnì to platí i pro struktury a uivatelské typy promìnných. Opravte zápis pøiøazení tak, aby levá strana výrazu byla skuteènì promìnná základního typu. Pozor! Pokud pouíváte napøíklad vlastní typ pro oznaèení struktury nebo pole, musíte provést vzájemné pøiøazení tìchto struktur nebo polí poloku po poloce. # SIMPLE V4 - popis jazyka 03.2004 94 stran # Výraz není kompatibilní pro pøiøazení Chyba oznaèuje situaci, kdy není moné pøiøadit výsledek výrazu bìhem jeho zpracování. Pøíkladem mùe být pøiøazení výrazu aritmetického typu do promìnné typu bit. Takté je chyba hláena tehdy, pokud se pokouíme pouít direktivu "absolute" uvnitø funkce lokální promìnné této funkce. Opravte zápis výrazu. Pravý operand posunu musí být konstantní výraz Ve výrazu pro aritmetický posun je pouit na místì operandu, který urèuje délku posunu výraz, který není konstatní. Mezi výrazy, které nejsou konstantní øadíme i promìnné. Opravte zápis tak, aby vpravo od operandu posunu byl konstantní výraz nebo konstanta. Výraz musí být bez znaménka Chyba je hláena v pøípadì, e je výraz vyhodnocen jako znaménkový a ve skuteènosti je poadován výraz bez znaménka. Pøíkladem mùe být pokus inicializovat konstantu typu byte zápornou hodnotou. Dalím místem, kde tato chyba vzniká, je pøedávání výsledku funkce klíèovým slovem "return". Opravte zápis výrazu. Výraz musí být aritmetického typu Uvedený výraz musí poskytovat výsledek aritmetického typu. Chyba mùe vzniknout pøi zápisu výrazu v nìm se pouívají vlastní (uivatelské) typy promìnných, struktury nebo pole. Vìtinou se jedná o opomenutí specifikovat poloku struktury nebo pole. Pozor té na pouití promìnných typu "bit". Opravte výraz tak, aby byl aritmetického typu. Výraz musí být typu int Výraz je zapsán tak, e nevyhovuje poadavku na celoèíselný výraz. Chyba mùe být zpùsobena pouitím promìnné typu "float" v daném výrazu. Upravte výraz tak, aby byl celoèíselný. Výraz musí být konstantní Uvedený výraz musí být vyhodnotitelný u ve fázi pøekladu. Výraz tedy nesmí obsahovat promìnné. Pokud pouíváte makroinstrukce musí se jednat o jména maker, která specifikují konstanty. Opravte výraz tak, aby nepouíval promìnné. #! SIMPLE V4 - popis jazyka 03.2004 94 stran #! Operand musí být aritmetického typu Operand pouitý ve výrazu musí být aritmetického typu tj. nesmí být typu bit popø. uivatelského typu, strukturou nebo polem. V aritmetickém výrazu jste patrnì pouili typ "bit". Opravte datový typ operandu. Operand musí být typu int Oznaèený operand neodpovídá poadavku na celoèíselný typ opetrandu. Patrnì jste pouili operand typu "bit" nebo "float". Opravte zápis tak, aby oznaèený operand byl celoèíselného typu. Pomoci mùe napøíklad explicitní pøetypování. Pozor, vak na dùsledky operace pøetypování. Operand musí být typu bit Na uvedeném místì poaduje pøekladaè operand typu "bit". V zápise zdrojového textu je pouit jiný operand. Chyba se té mùe vyskytnout v logickém výrazu, pokud není pouit znak porovnání a operand je pouit bez pøísluného aritmetického výrazu. Opravte typ operandu. Mùete popøípadì pouít pøetypování. Operand musí být konstantní výraz Pouili jste promìnnou èi nekonstatní výraz na místì, kde je vyadován konstantní operand. Chyba se objevuje v zápisu direktivy "absolute", kdy na pravé stranì klíèového slova je pouito výrazu pro pole s indexem, který není konstantní. Opravte operand tak, aby byl konstantní. Operand není promìnná Pokouíte se napøíklad pøedat èíselnou konstantu do funkce, kde je oèekávána promìnná pøedávaná odkazem. Pokud se jedná o pøedávání této hodnoty do funkce, pøedejte hodnotu pøe pomocnou promìnnou a nebo odstraòte v deklaraci funkce u pøísluného parametru specifikaci pøedávání odkazem tj. odstraòte klíèové slovo "var". Dìlení nulou V konstantním výrazu se pokouíte dìlit nulou. Chyba vznikne nejèastìji tehdy pokud pouíváte makroinstrukce pro oznaèení konstantních hodnot. Opravte zápis tak, aby nedocházelo k dìlení nulou. #" SIMPLE V4 - popis jazyka 03.2004 94 stran #" Funkce musí být aritmetického typu Funkce, kterou jste pouili patrnì v aritmetickém výrazu není aritmetického typu. Opravte deklaraci a zápis funkce tak, aby odpovídala aritmetickému typy popøípadì proveïte pøetypování výsledku funkce pøímo ve výrazu. Chyby ve volání funkcí a procedur Nejednoznaèné volání funkce K této chybì dojde tehdy pokud pøekladaè neumí urèit, kterou ze stejnojmenných funkcí máte v zápisu na mysli. K tomu jevu dochází napøíklad tehdy pokud má funkce jeden parametr a vy pøi volání pouijete na místì parametru èíselnou konstantu. Chybu opravíte buï tak, e pouijete promìnnou a nebo tak, e konstantu explicitnì pøetypujete tak, aby pøekladaè mohl volanou funkci rozliit. Skuteèný parametr není promìnná Chyba vzniká pøi volání funkce její parametr je pøedáván odkazem tj. deklarován pomocí "var". Symbol který se pokouíte pøedat do funkce na místì tohoto parametru není ve skuteènosti promìnná a tudí ho není moné pøedat odkazem. Chybu opravíte buï tak, e k pøedání pouijete pomocnou promìnnou a nebo opravíte deklaraci parametru na pøedávání hodnotou tj. vypustíte klíèové slovo "var". Skuteèný parametr není stejného typu Na pozici parametru, pøi volání funkce, jste pouili výraz obsahující patrnì dalí volání funkce. Problém je v tom, e výsledek takto volané funkce není stejného typu jako je vyadováno typem parametru. Opravte volání funkce tak aby typ parametru a pøedávané promìnné èi výsledek funkce byl poadovaného typu. Mùete pouít té pøetypování. Skuteèný parametr není umístìn v kódu Pokud je daný parametr funkce deklarován jako konstantní a pøedávaný odkazem, dojde k této chybì pøi volání funkce s pouitím promìnné z datové pamìti a nebo konstanty na místì tohoto parametru. Odstraòte v deklaraci parametru funkce klíèové slovo "const" a nebo pouijte promìnnou deklarovanou jako konstantní tj. s umístìním v kódové pamìti. ## SIMPLE V4 - popis jazyka 03.2004 94 stran ## Pøedáno více skuteèných parametrù K chybì dojde tehdy pokud je daná funkce volána s vìtím poètem parametrù ne je deklarována. K chybì mùe té dojít v pøípadì, e máme deklarováno více funkcí stejného jména s rùzným poètem parametrù a pøekladaè vybere podle typu parametrù nevhodnou funkci. To se mùe stát tehdy pokud pøedáváme na místì parametrù èíselné konstanty. Upravte poèet parametrù popøípadì proveïte explicitní pøetypování èíselných konstant tak, aby pøekladaè mohl vybrat funkci s odpovídajícím poètem parametrù. Pøedáno ménì skuteèných parametrù K chybì dojde tehdy pokud je daná funkce volána s mením poètem parametrù ne je deklarována. K chybì mùe té dojít v pøípadì, e máme deklarováno více funkcí stejného jména s rùzným poètem parametrù a pøekladaè vybere podle typu parametrù nevhodnou funkci. To se mùe stát tehdy pokud pøedáváme na místì parametrù èíselné konstanty. Upravte poèet parametrù nebo proveïte explicitní pøetypování èíselných konstant tak, aby pøekladaè mohl vybrat funkci s odpovídajícím poètem parametrù. Neexistuje funkce, která odpovídá volání V prùbìhu pøekladu hledá pøekladaè mezi jednotlivými deklaracemi funkcí (v pøípadì pøetíených funkcí) tu, která odpovídá volání funkce jménem, poètem a typem parametrù. Z vech variant vybírá pøekladaè tu funkci, která má poèet parametrù shodný s voláním funkce a typy parametrù na odpovídajících místech volání co nejpodobnìjí typùm parametrù v deklaraci funkce. K této chybì dojde tehdy pokud pøekladaè není schopen rozhodnout, která z funkcí je nejblíe svou deklarací k volání funkce. Obvykle je chyba generována v okamiku, kdy voláme pøetìovanou funkci s èíselnými parametry. Upravte volání funkce tak, aby bylo moné jednoznaènì zvolit odpovídající funkci (v pøípadì pøetìovaných funkcí) nebo opravte typy pøedávaných promìnných tak, aby odpovídaly deklaraci funkce. Pøíli mnoho vzájemnì volaných funkcí Zdrojový text je napsán tak, e byl pøekroèen povolený limit 8 vzájemnì volaných funkcí. Pøepracujte zdrojový text tak, aby poèet vzájemnì volaných funkcí nepøekroèil 8. #$ SIMPLE V4 - popis jazyka 03.2004 94 stran #$ Deklarace typu promìnné nemùe být parametrem funkce Ve zdrojovém textu jste pøi zápisu parametru funkce pouili takovou konstrukci, která je ve skuteènosti deklarací nového typu promìnné. Tato jazyková konstrukce není dovolena. Pøepracujte parametry funkce tak, aby byl typ parametru deklarován mimo deklaraci parametrù funkce. Pro sloitìjí pøípady mùete vyuít definici vlastního typu promìnné s následnou deklarací parametru funkce, který bude vlastního (uivatelského) typu. Síová promìnná nemùe být pøedána odkazem Ve zdrojovém textu voláte funkci, její parametr je deklarován pro pøedání odkazem tj. je deklarován s klíèovým slovem "var". Na místì tohoto parametru se pokouíte pouít síovou promìnnou. Tato konstrukce není umonìna, z dùvodu, e by nebylo moné zajistit korektní sdílení hodnoty síové promìnné pro ostatní automaty na síti pesNet. Pokud potøebujete pracovat se síovou promìnnou uvnitø funkce pouijte ji pøímo. Vechny síové promìnné a speciální registry automatu jsou deklarovány jako globální promìnné a tudí jsou pøístupné kdekoliv ve zdrojovém textu. Jedinou moností jak pøedat síovou promìnnou do funkce je deklarovat parametr funkce jako pøedávaný hodnotou tj. musí být pouita deklarace parametru bez klíèového slova "var". Chyby obecné Posun je vìtí ne íøka operandu Ve zdrojovém textu pouíváte na pravé stranì operátoru posunu sice konstantní výraz nicménì s hodnotou vìtí ne je íøka operandu tj. napø. pro operand typu byte pouijete posun vìtí ne 7. Upravte hodnotu posunu. Index v poli bitù musí být konstantní výraz Pøístup do pole bitù je povolen pouze s pomocí konstantního indexu. Ve zdrojovém textu je skuteèný index promìnná. Opravte index pole bitù tak, aby byl vyjádøen konstantním výrazem. #% SIMPLE V4 - popis jazyka 03.2004 94 stran #% Operandy musí být explicitnì pøetypovány Ve výrazu jsou pouity operandy jejich implicitní pøetypování není dovoleno. Pro tento pøípad je nutné operandy pøetypovat explicitnì. Pokud pouíváte ve výrazu bezpeèné typy promìnných doporuèujeme výraz upravit tak, aby pøetypování nebylo nutné, tj. výraz napite s pouitím pouze bezpeèných promìnných totoného typu. Upravte operand ve výrazu pøetypováním nebo pøepracujte výraz tak, aby pouíval totoné typy promìnných. Relaèní operace mùe být provedena pouze s bity Ve vyhodnocení podmínky v podmínìném pøíkazu "if" dolo k situaci, e relaèní výraz specifikuje porovnání mezi výsledky vyhodnocení výrazù nebo promìnnými, které nejsou typu bit. Dotyèná chyba mùe vzniknout tehdy, kdy jsou pouity výrazy nekorektnì uzavøené do závorek apod. Upravte zápis podmínky v podmínìném pøíkazu. Relaèní operace mezi bity mùe být = nebo <> Pouitá relaèní operace (logický výraz podmínky) mezi operandy typu bit je odliná od typu "roven" nebo "rùzný". Pro typ bit není povolena jiná relaèní operace ne "roven" nebo "rùzný". Opravte zápis relaèní operace. Unární mínus je moné pouze se znaménkovými typy promìnných Unární mínus souvisí se zápisem ve zdrojovém textu typu: stav = - stav kde znaménko minus pøedstavuje tzv. unární mínus tj. pøevrácení znaménka promìnné. Tento typ zápisu je povolen pouze pro promìnné znaménkových typù tj. napø. "int" nebo "longint". Odstraòte znaménko minus nebo zmìòte typ promìnné z neznaménkového na znaménkový. Druhá deklarace identifikátoru V oznaèené deklaraci promìnné, symbolu nebo funkce je pouito pro oznaèení jméno, které je totoné se jménem pouitým na pøedchozích øádcích zdrojového textu. V deklaraci pouijte odliné jméno. #& SIMPLE V4 - popis jazyka 03.2004 94 stran #& Nedovolená hodnota poètu prvkù pole Ve zdrojovém textu deklarujete nebo se odkazujete do pole, pomocí indexu, který má hodnotu mimo povolený rozsah <1, 32767 >. Opravte volání nebo deklaraci pole. Pøíli velká hodnota celoèíselného výrazu Ve zdrojovém textu je pouit celoèíselný výraz, jeho výsledná hodnota pøesahuje monosti pouití tohoto výrazu. Pokud je výsledek pøedáván jako parametr do funkce, jedná se o pøíli velkou hodnotu parametru. Obdobnì toto platí napø. pro inicializaci promìnné apod. Opravte výraz tak, aby výsledná hodnota výrazu nebránila inicializaci parametru, promìnné apod. Rekurze pøi výpoètu konstantního výrazu V prùbìhu vyhodnocování konstantního výrazu nael pøekladaè rekurzi. Chyba mùe nastat napøíklad v pøípadì jsou-li ve výrazu pouity makra v úloze pøeddefinovaných hodnot a tato rekurze vychází z deklarace tìchto maker. Opravte deklaraci maker popøípadì odstraòte rekurzi ve výrazu. Pouití nepøiøazené promìnné Pøekladaè nalezl typickou chybu, která je obvykle opomenutím programátora. Deklarovali jste sice promìnnou, ale první pouití této promìnné je vpravo od operace pøiøazení tj. operátoru "=" nebo v podmínce podmínìného pøíkazu "if". Aby mìlo pouití promìnné smysl musí být její hodnota definována tj. nejprve musí být promìnná naplnìna tj. musí stát vlevo od operátoru pøiøazení. Pro síové a systémové promìnné toto pravidlo neplatí, nebo poèáteèní hodnotu zajiuje u tìchto promìnných pøímo automat. Doplòte inicializaci promìnné. Èíslo bitu je pøíli velké Chyba se mùe vyskytovat za operátorem pøístupu k bitu "?", kde je vyadován konstantní výraz specifikující èíslo bit v promìnné daného typu. Pro typ byte mùe být toto èíslo maximálnì 7. Bity jsou èíslovány od nuly. Obdobnì se mùe tato chyba vyskytnout i v deklaraci direktivy "absolute" a to na pravé stranì specifikující daný bit. Opravte výraz v operaci pøístupu k bitu, tak aby nebyl pøekroèen bitový rozsah promìnné daného typu. #' SIMPLE V4 - popis jazyka 03.2004 94 stran #' Promìnná není pole V zdrojovém textu, nejèastìji pøi volání funkce a pøedávání parametrù, jste vytvoøili jazykovou konstrukci, která neodporuje syntaxi jazyka nicménì ve svém dùsledku vede k pouití promìnné, která není pole na místì, kde je promìnná typu pole vyadována. Opravte zápis zdrojového textu, tak aby promìnná byla typu pole. Promìnná není struktura V zdrojovém textu, nejèastìji pøi volání funkce a pøedávání parametrù, jste vytvoøili jazykovou konstrukci, která neodporuje syntaxi jazyka nicménì ve svém dùsledku vede k pouití promìnné, která není struktura na místì, kde je promìnná typu struktura vyadována. Opravte zápis zdrojového textu, tak aby promìnná byla typu struktura. Index mimo meze pole Pouili jste index poloky pole, který je vìtí ne deklarovaný poèet poloek pole. Upravte velikost indexu nebo pøepracujte deklaraci pole. Inicializaèní výraz musí být string V tabulce konstantních øetìzcù je pouit inicializaèní výraz jiného typu ne string. Opravte inicializaèní výraz Oèekává se seznam inicializaèních výrazù Konstantní promìnná tj. promìnná umísovaná do kódu je sice deklarovaná, nicménì její inicializaèní výraz nebo výrazy pøekladaè nenalezl. Doplòte inicializaèní výraz nebo opravte syntaxi zápisu tak, aby výraz mohl být správnì pøiøazen konstantní promìnné. Neoèekávaný seznam inicializaèních výrazù Ve zdrojovém textu je pouit seznam inicializaèních výrazù v místì, kde to není oèekáváno. Chyba je hláena napøíklad tehdy, kdy se místo oèekávaného inicializaèního øetìzce pouije seznam øetìzcù. Opravte inicializaèní výraz tak, aby odpovídal typu inicializované konstantní promìnné. $ SIMPLE V4 - popis jazyka 03.2004 94 stran $ Pøíli málo inicializaèních výrazù V seznamu inicializaèních výrazù promìnné (èasto se jedná o pole stringù) jeden nebo více výrazù chybí. Promìnná by tedy zùstala z èásti neinicializovaná. Doplòte inicializaèní výrazy Pøíli mnoho inicializaèních výrazù V seznamu inicializaèních výrazù promìnné (èasto se jedná o pole stringù) jeden nebo více výrazù navíc. Promìnná by tedy byla inicializována a nìkteré výrazy by nebylo moné pouít z dùvodu malého rozsahu promìnné. Odstraòte pøebyteèné výrazy nebo zvìtete rozsah promìnné napø. u pole zvìtete index v deklaraci. Nedefinovaný identifikátor Oznaèený identifikátor není definován tj. pøekladaè nenael deklaraci identifikátoru èi jiný typ jeho urèení. Doplòte deklaraci identifikátoru nebo urèete identifikátor jinak napø. makrem. Síové promìnné mohou být pouze aritmetického typu Vzhledem k povaze chyby, by se chyba nemìla vyskytnout jinde ne v konfiguraèním souboru. Pøekladaè nael, e promìnná, která je deklarována jako síová je jiného ne aritmetického typu. Pokud je chyba hláena v konfiguraèním souboru, byl soubor zmìnìn (úmyslnì nebo neúmyslnì) a je nutné provést jeho obnovu. V dalích pøípadech, pokud pùvod chyby nebude zøejmý, kontaktuje firmu MICROPEL. V síové promìnné je povolen pouze konstantní index Pokouíte se o pøístup k síové promìnné pomocí indexu tvoøeného promìnnou. Tato konstrukce není u síových promìnných dovolena z dùvodu sdílení tìchto promìnných ostatními automaty na lince. Pouijte konstantní index síové promìnné. Nedovolené pouití typu string Typ string je moné pouít pouze jako parametr do procedury, funkce nebo systémové funkce napø. Display. Opravte pouití typu string. $ SIMPLE V4 - popis jazyka 03.2004 94 stran $ Nedeklarovaná poloka struktury Ve zdrojovém textu procujete s polokou struktury, která není deklarována. Nejèastìji se jedná o pøeklep. Opravte neznámé jméno poloky na odpovídající jméno uvedené v deklaraci. Identifikátor neoznaèuje typ V zápisu deklarace je pouito jméno oznaèující typ promìnné (patrnì uivatelský typ), které ve skuteènosti nebylo deklarováno jako typ promìnné. Èasto se jedná o pøeklep. Ovìøte jméno typu promìnné. Vícenásobné pouití hodnoty v oznaèení varianty V konstrukci programového pøepínaèe "switch" byla nalezena ta samá hodnota varianty tj. konstanta za klíèovým sloven "case" nìkolikrát. Odstraòte vícenásobné oznaèení varianty. Návìtí 'case' musí být typu int V konstrukci varianty programového pøepínaèe jste pouili výraz nebo konstanty, které není celoèíselného typu. Patrnì je uveden symbol nebo hodnota zapsaná ve tvaru reálného èísla. Opravte zápis varianty programového pøepínaèe. Nedostupný kód V konstrukci programového pøepínaèe jste umístili konkrétní variantu tj. klíèové slovo "case" a za variantu obecnou oznaèenou klíèovým slovem "default". Vzhledem k rozvoji programového pøepínaèe do výsledného kódu bude takto pouitá konkrétní varianta programovì nedostupná a kód který oznaèuje bude neproveditelný. Opravte konstrukci programového pøepínaèe. Absolutní adresa musí leet v datech Jedná se o chybu vìtinou na pravé stranì direktivy "absolute". Zde jste pouili symbol, který je deklarován jako konstantní nebo symbol oznaèuje jméno funkce. Výsledkem je, e se pokouíte adresovì pøekrýt promìnnou, která bude ve výsledném pøekladu umístìna do kódové pamìti. Opravte zápis tak, aby absolutní adresace smìøovala do pamìti dat tj. pouijte promìnné deklarované bez klíèového slova "const". $ SIMPLE V4 - popis jazyka 03.2004 94 stran $ Nesouhlas délek promìnných Chyba se vyskytuje v direktivì "absolute" v pøípadì, e promìnná vlevo od klíèového slova má vìtí rozsah (zabere vìtí poèet byte) ne promìnná vpravo od klíèového slova. Rozsah promìnných vlevo a vpravo od klíèového slova "absolute" musí být buï totoný a nebo promìnná vlevo musí mít rozsah mení ne promìnná vpravo. Upravte typy promìnných tak, aby vyhovìly zmínìným poadavkùm. Absolutní adresa je mimo rozsah promìnné Pøi pouití direktivy "absolute" jste pouili na levé stranì promìnnou její velikost v pamìti pøesáhne rozsah promìnné uvedené vpravo. Nejèastìji chyba vzniká pøi pouití výrazu pro posun adresy. Mìjme napø. promìnnou stav (longint) a promìnnou poslední_byte (byte). Tuto promìnnou chceme pøekrýt s nejniím byte promìnné stav. Pouijeme direktivu "absolute" a zapíeme mapování ve zdrojovém textu takto: var posledni_byte absolute stav + 4 Zde vznikne chyba, protoe zápis ve skuteènosti specifikuje adresu mapování mimo rozsah promìnné stav. Správný zápis musí vypadat takto: var posledni_byte absolute stav + 3 Opravte zápis direktivy absolute. Nedefinovaná adresa identifikátoru Chyba se vyskytuje s velkou pravdìpodobností pøi vícenásobném pouití direktivy "absolute". Chyba mùe vzniknout napøíklad v tomto pøípadì: var word stav var byte hi_b absolute lo_b + 1 var byte lo_b absolute stav Správný zápis tohoto pøípadu je: var word stav var byte lo_b absolute stav var byte hi_b absolute lo_b + 1 Opravte pouití direktivy "absolute". Nedovolené pouití typu safe v absolutní adrese V direktivì "absolute" jste pouili bezpeèný typ promìnné vpravo od klíèového slova "absolute". Ovem na bezpeènou promìnnou nelze mapovat jinou promìnnou. Opaèný tvar direktivy, (bezpeèná promìnná stojí vlevo), je povolen. V tomto pøípadì mapujete bezpeènou promìnnou do pamìového prostoru jiné promìnné a pøekladaè to respektuje. Pouití direktivy "absolute" pro bezpeèné typy promìnných se vak nedoporuèuje Opravte zápis direktivy "absolute". $! SIMPLE V4 - popis jazyka 03.2004 94 stran $! Vyèerpán datový adresní prostor Zdrojový text obsahuje pøíli mnoho deklarací promìnných. Je nutné uváit, e i lokální promìnné funkcí jsou alokovány separátnì do pamìti dat tj. nedochází k jejich pøekrývání. Snite rozsah a mnoství deklarovaných promìnných. Vyèerpán kódový adresní prostor Rozsah programu pøekroèil rozsah kódové pamìti. Program mùete optimalizovat odstranìním nepouitých pøetìovaných funkcí nebo napø. vyuitím konstrukce programového pøepínaèe (switch) místo vícenásobného podmínìného pøíkazu if.nebo vyputìním nepotøebných stringù. Zkrate a optimalizujte program. Popøípadì zolte typ automatu s vìtím rozsahem kódové pamìti. Vyèerpán datový prostor pracovních registrù modelu Programovací model pøekladaèe obsahuje tzv. pracovní registry tj. jakési skryté promìnné, které vyuívá pøekladaè pøi rozvoji algoritmù pro výpoèet jednotlivých výrazù uvnitø PLC. Poèet tìchto registrù byl pøekroèen a oznaèený výraz není moné v cílovém PLC za podmínek daných programovacím modelem vypoèítat. Zjednodute oznaèený výraz. Vyèerpán datový prostor funkce pro uloení pracovních registrù modelu Ve volané funkci dolo k pøekroèení velikosti datového prostoru vyhrazeného pro uloení pomocných výsledkù z pracovních registrù. Volání funkce je zaøazeno do pøíli sloitého výrazu, na jeho vyhodnocení je tøeba v cílovém PLC více registrù ne je specifikováno v programovacím modelu. Zjednodute výraz a volání funkce. Pouijte napøíklad pomocnou promìnnou na uloení mezivýsledku. Chyba generátoru kódu ádná z tìchto chyb by nemìla u uivatele vzniknout. Jedná se o chyby algoritmu pøekladaèe - v èásti tzv. generátoru kódu. Pøekladaè má zabudovány samokontrolní mechanismy, které tyto chyby identifikují. Proto u níe uvedených chyb není uvedeno øeení, je tøeba vdy kontaktovat firmu MICROPEL, popsat situaci v ní k chybì dolo a nejlépe zaslat zdrojový text, který chybu zpùsobil. Pro rychlou pomoc doporuèujeme napø. zkusit lokalizovat èást zdrojového textu zpùsobující problém a tu pøepracovat. $" SIMPLE V4 - popis jazyka 03.2004 94 stran $" Není definován poadovaný typ parametru Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neznámý kód binární operace Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neznámý kód unární operace Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Nenalezeno pravidlo pro generovaní kódu Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neznámý kód operace s ukazatelem Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neexistující kód operace Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neznámý kód adresovacího módu Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Nelze souèasnì naplnit modifikátor FC a AM Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neznámý datový typ Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neznámý typ zástupce parametru Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Pøedpis pro generování pøíkazu nenalezen Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neznámý kód operace porovnání Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Neznámý kód operace s bity Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. $# SIMPLE V4 - popis jazyka 03.2004 94 stran $# Hodnota operace rotace mimo meze Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Nìkteré odkazy pro skoky nenalezeny Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Není definován parametr skoku Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Nenalezen mikrokód [0x????X] pro generování pøíkazu [typ] Chyba v generátoru strojového kódu. K této chybì by nemìlo nikdy dojít. Compiler fail in source [file] [line] Jedná se o chybu fatální chybu v kódu pøekladaèe nebo generátoru. Podaøilo se vám vykonstruovat takový typ zdrojového textu, který je po formální stránce správnì tj. syntaxe a sémantika jsou v poøádku a pøesto si pøekladaè nebo generátor nedokázal se zdrojovým textem poradit. Chyba oznaèuje soubor zdrojového textu pøekladaèe a generátoru vèetnì øádku na nìm k chybì dolo. Z hlediska pokud mono rychlého odstranìní chyby èi závady je nutné kompletní text chyby poznamenat a uschovat v pùbvodní podobì zdrojový text pøi jeho pøekladu k chybì dolo. V tomto pøípadì je nutné zaznamenat celý text chyby a konzultovat problém s firmou MICROPEL. $$ SIMPLE V4 - popis jazyka 03.2004 94 stran $$ 6. Syntaktické diagramy Syntaktické diagramy jsou orientované grafy popisující syntaxi jazyka v grafickém tvaru. Jsou dobrým pomocníkem pøi zápisu sloitìjích konstrukcí a pøi odhalování chyb. V následujících odstavcích jsou uvedeny syntaktické diagramy jazyka SIMPLE V4 vèetnì jejich komentáøù. Základní filozofie grafické podoby diagramù spoèívá v nìkolika pravidlech. V kulatých a elipsových rámeècích jsou malými písmeny uvedeny základní symboly jazyka. Míníme tím symboly, které jsou ji koneèné a nejsou rozvíjeny dalími diagramy. V obdélnících se zakulacenými rohy jsou velkými písmeny uvedeny odkazy na navazující syntaktický diagram. U kadého diagramu je uvedeno vdy jeho jméno pouívané pro oznaèení právì takového odkazu. Struktura uvedených syntaktických diagramù je implementována v pøekladaèi a jakékoli odchýlení v zápisu programových konstrukcí od uvedených diagramù vede ke generování chybového hláení. Program Program, který je napsán v jazyce SIMPLE V4 se skládá ze seznamu deklarací a pøíkazù, pøièem tento seznam je ukonèen klíèovým slovem end. Ze syntaktického diagramu tedy vidíme, e po napsání seznamu deklarací a pøíkazù musíme program ukonèit klíèovým slovem end. Vzhledem k tomu, e diagram obsahuje pouze jediný prvek uvedený v obdélníku se zakulacenými rohy, mùeme pokraèovat z uvedeného diagramu pouze jedním PROGRAM SEZNAM DEKLARACÍ A PØÍKAZU° end smìrem a to do diagramu seznamu deklarací a promìnných Seznam deklarací a pøíkazù Diagram je tvoøen dvìma sekcemi a to seznamem deklarací a seznamem promìnných. Dále je patrné, e seznam deklarací mùe být následován posloupností pøíkazù a nebo také nemusí. $% SIMPLE V4 - popis jazyka 03.2004 94 stran $% Za seznamem deklarací a posloupností pøíkazù mùeme diagram buï opustit a vrátit se do syntaktického diagramu programu a nebo pokraèovat po návratové linii a vrátit se tak opìt pøed seznam deklarací a posloupnost pøíkazù. SEZNAM DEKLARACÍ A PØÍKAZU° SEZNAM DEKLARACÍ SEZNAM PØÍKAZU° Seznam deklarací Seznam deklarací je tvoøen sekcí konstant, typù, tabulek, promìnných a deklaracemi funkcí a podprogramù. Zpìtná cesta diagramu naznaèuje monost vrátit se z konce diagramu po zápisu jeho libovolné èásti a pokraèovat dalím zápisem a to opìt libovolné èásti. SEZNAM DEKLARACÍ SEKCE KONSTANT SEKCE TYPU° SEKCE TABULEK SEKCE PROMÌNNÝCH DEKLARACE FUNKCE DEKLARACE PODPROGRAMU° Sekce konstant Sekce konstant se v jazyce pro skládá z uvozujícího slova const a deklarace konstant, za kterou mùe být po uvedení oddìlovaè ":" mùe následovat dalí deklarace konstant SEKCE KONSTANT const DEKLARACE KONSTANT , $& SIMPLE V4 - popis jazyka 03.2004 94 stran $& Deklarace konstant Deklarace konstant se skládá z identifikátoru , který mùe být náskledován konstantním výrazem za znakem "=". Souèasnì mùe být pouiro oddìlovaèe "," pouívaného pøi deklaracích posloupností konstant. Pøíklad const A = 5,B = 1,,,C,,D DEKLARACE KONSTANT = IDENTIFIKÁTOR VÝRAZ Sekce typù Sekce typù musí zaèínat klíèovým slovem "type". Po tomto slovì musí být uveden identifikátor a za ním typ uvozený znakem "=". Poté mùe být zápis sekce typù ukonèen nebo mùeme v zápisu po uvedení oddìlovaèe ":" pokraèovat. ° SEKCE TYPU type IDENTIFIKÁTOR = TYP : TYP Typ byte Syntaktický diagram popisuje oznaèení typu v øadì programových konstrukcí a mimo jiné i v sekci typù. int safe word longint Pøíklad longword type muj = int[3] tvuj = safe int jeho = byte float bit string IDENTIFIKÁTOR TYPU TYP $' SIMPLE V4 - popis jazyka [ 03.2004 KONST. VÝRAZ 94 stran ] $' Sekce tabulek Sekce tabulek musí být uvozena klíèovým slovem table za ní následuje deklarace tabulky. Po uvedení deklarace tabulky buï sekci tabulek ukonèíme a nebo pokraèujeme dalí deklarací. SEKCE TABULEK table DEKLARACE TABULKY : Deklarace tabulky Deklaraci tabulky zaèínáme pouitím syntaktického diagramy Typ. Za uvedením typu pokraèujeme identifikátorem a poté dokonèujeme deklaraci tabulky v diagramu inicializaèního seznamu. Mezi identifikátorem tabulky a inicializaèním seznamem uvedeme znak "=". DEKLARACE TABULKY TYP IDENTIFIKÁTOR = INICIALIZAÈNÍ SEZNAM Inicializaèní seznam Inicializaèní seznam uzavíráme do kulatých závorek. U tohoto diagramu si povimnìme, e v inicializaèním seznamu mùeme uvést buï výraz nebo dalí inicializaèní seznam. Dalí inicializaèní seznam je vak moné pouít tehdy, kdy to odpovídá typu tabulky. Jednotlivé poloky seznamu oddìlujeme èárkami. Pøíklad a) table int[3] moje = (10,(20,30)) b) table int[2][3] moje = ((10,20,30),(1,2,3)) INICIALIZAÈNÍ SEZNAM ( INICIALIZAÈNÍ SEZNAM ) VÝRAZ , % SIMPLE V4 - popis jazyka 03.2004 94 stran % Sekce promìnných Syntaktický zápis sekce promìnných je tvoøen deklaracemi promìnných oddìlených oddìlovaèen ":". SEKCE PROMÌNNÝCH var DEKLARACE PROMÌNNÝCH : Deklarace promìnných Pro deklaraci promìnných pouijeme jeden ze dvou moných diagramù podle kontextu, ve kterém deklaraci uvádíme. Oba diagramy by bylo moné slouèit do jednoho, nicménì jsou pro pøehlednost rozkresleny. Jedná se o diagram pro lokální deklaraci promìnné, který se od globální deklarace promìnné lií pouze vìtví inicializaèního výrazu pro automatické generování úvodní inicializaèní sekvence pøíkazù. Deklarace promìnných mùe obsahovat i vìtev absolute. Tato vìtev je urèena pro pøekrývání promìnné. Konstantní výraz v tomto pøípadì znamená fyzickou adresu, zatímco pøístup k hodnotì oznaèuje diagram pomocí nìho mùeme pøekrytí promìnných zapsat symbolicky. DEKLARACE PROMÌNNÝCH - globální TYP IDENTIFIKÁTOR absolute KONSTANTNÍ VÝRAZ PØÍSTUP K HODNOTÌ DEKLARACE PROMÌNNÝCH - lokální TYP IDENTIFIKÁTOR absolute = VÝRAZ KONSTANTNÍ VÝRAZ PØÍSTUP K HODNOTÌ % SIMPLE V4 - popis jazyka 03.2004 94 stran % Pouití direktivy 'absolute' Direktiva absolute umoòuje mapování jednotlivých promìnných na stejnou adresovou lokaci. Pøestoe v pøedchozím pøíkladì odpovídá její pouití syntaktickému diagramu, je nutné uvést nìkterá omezení vyplývající z funkce této direktivy. Direktiva pracuje vlastnì s konstatním výrazem tj. s výrazem, který musí být vyèíslitelný ji v prùbìhu pøekladu. Tento výraz musí pøedstavovat adresu. Jedná se tedy o aritmetický výraz, který pracuje s konstantami typu adresa. Typ adresa není obecnì v jazyce Pro podporován a vystupuje zde èásteènì ve skryté formì. Pøíkladem mùe být pøedávání promìnné do podprogramu nebo funkce tzv. odkazem. Druhým pøíkladem mùe být právì direktiva absolute. Identifilátory promìnných, které vystupují ve výrazech na pravé stranì direktivy absolute, nyní nepovaujeme za promìnné obsahující nìjakou hodnotu, ale díváme se na nì jako na symboly oznaèující základní adresu a rozsah pamìti potøebný k uloehí hodnoty daného typu. Z uvedeného napøíklad plyne to, e promìnná " pole" z pøedchozího pøíkladu má pøidìlenu poèáteèní (bázovou adresu) a poèínaje touto adresou obsadí v datové pamìti automatu ètyøi byte. Obdobnì potøebujeme ètyøi byte k uloení hodnoty typu longint tj. hodnoty promìnné "výstup". Pokud tedy pouijeme zápis z pøedchozího pøíkladu var byte[4] pole var longint vystup absolute pole je ve v poøádku, protoe obì promìnné potøebují stejný rozsah datové pamìti. Zápis a mapování promìnné " int j" z pøedchozího pøíladu je také v poøádku, nebo promìnná "int j", potøebuje k uloení své hodnoty pouze 2 byte a tudí se tato promìnná vejde do pamìti vyhrazené promìnné pole. Obdobnì mùeme pouít zápis: nebo int j absolute pole[1] int j absolute pole[2] Pozor vak na zápis int j absolute pole[3] Pøestoe není v uvedeném zápisu syntaktická chyba, neprobìhne pøeklad bez chyb a uvedený zápis bude produkovat chybu nesouhlasu velikosti promìnných. Dùvod je evidentní. Promìnná "int j" pøesáhla svým spodním byte rozsah promìnné pole. Pøi pouití direktivy absolute mùeme ve výrazu na pravé stranì pouít i aritmetický výraz. Výraz je vak omezen pouze na souèet a bázovou adresu promìnné. Správnì je napøíklad výraz: int k absolute vystup + 2 patnì naopak int k absolute pole[0] + 2 % SIMPLE V4 - popis jazyka 03.2004 94 stran % Správnì je výraz int k absolute pole + 2 Ostatní typy výrazù jsou sice syntakticky správnì, ale pøekladaè je nevyhodnotí. Posledním povoleným typem výrazu je "pøístup k hodnotì". Pouití tohoto typu výrazu má smysl pøi pøekrývání promìnné bity. Z pøedchozího pøíkladu mùeme pouít zápis vyjadøující skuteènost, e bitová promìnná je mapována na nejvíce významný bit promìnné výstup, která je typu "longint". bit msb absolute vystup ? 7 Èíslo bitu 7 je skuteènì správnì, protoe bity jsou u èíslovány od niích adres k vyím a od niích bitù v byte k vyím. Nejménì významný bit mùe být mapován výrazem bit lsb absolute vystup ? 24 Pøístup k hodnotì Pøístup k hodnotì mùe být identifikátor nebo jak vyplývá z dalího rozboru odkaz na poloku pole nebo na èíslo bitu. Zde se dá uvést, e syntaktickému diagramu sice odpovídá následující zápis pro promìnou a typu word a?3?2 nicménì zápis se dostává do logického sporu nebo se pøi druhém odkazu, odkazujeme na druhý bit promìnné typu bit (tj. první odkaz a?3) a ten jak známo není v tomto pøípadì kde vzít. PØÍSTUP K HODNOTÌ IDENTIFIKÁTOR %! PØÍSTUP K HODNOTÌ [ PØÍSTUP K HODNOTÌ ? SIMPLE V4 - popis jazyka KONSTATNÍ VÝRAZ ] ÈÍSLO 03.2004 94 stran %! Deklarace funkce Skládá se z klíèového slova "function" za ním následuje identifikátor. Za identifikátorem je moné uvést formální parametry pokud jsou poadovány. Dále následuje seznam deklarací a pøíkazù. Deklaraci funkce ukonèujeme klíèovým slovem return. Následuje výraz stejného typu jakého je deklarovaná funkce DEKLARACE FUNKCE function IDENT. FORMÁLNÍ PARAMETRY ° SEZNAM DEKLARACÍ A PØÍKAZU return VÝRAZ Formální parametry Formální parametry uzavíráme do okrouhlých závorek. Jednotlivé rùzné typy promìnných oddìlujeme znakem ":". stejné typy promìnných mùeme uvést za sebou a pouít oddìlovaèe ",". Pøíklad Deklarace funkce pocitej. function int pocitej (int a,b) return (a+b) nebo function int pocitej (int a : int b) return (a+b) FORMÁLNÍ PARAMETRY ( TYP const IDENT. ) , var : %" SIMPLE V4 - popis jazyka 03.2004 94 stran %" Deklarace procedur Deklarace procedur je po formální stránce totoná s deklarací funkcí. Odlinost je pouze v klíèovém slovì subroutine a v tom, e za klíèovým slovem return nesmí být uveden výraz. DEKLARACE PROCEDURY subroutine IDENT. FORMÁLNÍ PARAMETRY ° SEZNAM DEKLARACÍ A PØÍKAZU return Posloupnost pøíkazù Posloupnost pøíkazù je tvoøena pøíkazy oddìlenými buï znakem ":" a nebo ukonèovaèem øádky (znaky CRLF, klávesa Enter). PØÍKAZ : CR POSLOUPNOST PØÍKAZU Pøíkaz Je tvoøen jednoduchým pøíkazem nebo sloeným pøíkazem. PØÍKAZ JEDNODUCHÝ PØÍKAZ SLOENÝ PØÍKAZ %# SIMPLE V4 - popis jazyka 03.2004 94 stran %# Jednoduchý pøíkaz Jednoduchý pøíkaz mùe být pøiøazovací pøíkaz, volání podprogramu (procedura nebo funkce), pøíkaz exit (pøedèasné ukonèení procedury nebo funkce), pøíkaz vykøièník a nebo nová obdoba syntaxe pro zápis bitové negace promìnné. JEDNODUCHÝ PØÍKAZ PØIØAZOVACÍ PØÍKAZ VOLÁNÍ PODPROGRAMU exit VÝRAZ VÝRAZ ' VÝRAZ ! Pøiøazovací pøíkaz Je tvoøen identifikátorem, znakem "=" za ním následuje výraz. PØIØAZOVACÍ PØÍKAZ = IDENT. VÝRAZ Volání podprogramu a funkce Volání podprogramu i funkce je zahájeno identifikátorem podprogramu. Za identifikátorem následují výrazy, které se mají pøedat na místa formálních parametrù. Výrazy jsou oddìlené èárkou a uzavøené v okrouhlých závorkách. Volání funkce a podprogramu je tedy totoné. Podprogram se od funkce lií tím, e nevrací ádnou hodnotu. Rozdíl tedy není po formální stránce ve volání podprogramu nebo funkce ale v tom, kde je toto volání pouito. Volání funkce mùe být pouito ve výrazu. Volání podprogramu nikoli. VOLÁNÍ PODPROGRAMU A FUNKCE IDENT. ( ) VÝRAZ , %$ SIMPLE V4 - popis jazyka 03.2004 94 stran %$ Pøíklad Volání funkce pocitej var int k k=1 k = pocitej(k,1) Pøíklad Pouití pøíkazu exit v modifikované funkci pocitej function int pocitej (int a,b) if (a > b) then exit (a-b) return (b-a) Sloený pøíkaz Sem poèítáme pøíkaz begin-end, pøíkaz øádka a podmínìný pøíkaz SLOENÝ PØÍKAZ BEGIN-END ØÁDKOVÝ PØÍKAZ PODMÍNÌNÝ PØÍKAZ Pøíkaz begin-end Pøíkaz slouí k oznaèení bloku pøíkazù, které se mají vykonat spoleènì. Typické vyuití pøíkazu je v konstrukci podmínìných pøíkazù. BEGIN-END begin LOGICKÝ VÝRAZ end Podmínìný pøíkaz Podmínìný pøíkaz tvoøí podmínka uvozená klíèovým slovem if a ukonèená klíèovým slovem then. Podmínku mùe tvoøit pouze logický výraz. Za klíèovým slovem then nesmí být pouit pøechod na novou øádku (dùvodem pro toto omezení je zpìtná kompatibilita zdrojových textù) a musí za ním následovat sloený pøíkaz. Nepovinou èástí %% SIMPLE V4 - popis jazyka 03.2004 94 stran %% pøíkazu je èást else. Pokud je vak uvedena musí za klíèovým slovem else následovat pøíkaz. CR PODMÍNÌNÝ PØÍKAZ if then LOG. VÝRAZ CHYBA SLOENÝ PØÍKAZ else PØÍKAZ Pøíklad Zápis sloeného pøíkazu if a > b and a < c then begin a = c + b b = b + 1 end else b = 0 Pøíkaz øádka Je zaveden z dùvodu zpìtné kompatibility zdrojových textù s verzí SIMPLE V2. JEDNODUCHÝ PØÍKAZ : CR PØÍKAZ ØÁDKA Logický výraz Logický výraz pouíváme v podmínìném pøíkazu mezi klíèovými slovy if a then. Podle pravdivosti logického výrazu se rozhodujeme, kterou vìtev podmínìného pøíkazu budeme vykonávat. V logickém výrazu nesmí být pouit pøíkaz. Logický výraz se skládá z jednotlivých termù oddìlených klíèovým slovem or. LOG. TERM LOG. VÝRAZ %& or SIMPLE V4 - popis jazyka 03.2004 94 stran %& Logický term Logický term se skládá z logických faktorù oddìlených klíèovým slovem and. LOG. FAKTOR and LOG. TERM Logický faktor Logický faktor se skládá z operátoru not, výrazu, dvojice výrazù spojených relaèním operátorem a nebo z logického výrazu uvedeného v okrouhlých závorkách LOG. FAKTOR not LOG. FAKTOR VÝRAZ RELAÈNÍ OP. ( VÝRAZ LOGICKÝ VÝRAZ ) Pøíklad Zápis logického výrazu a > b and a < c Výraz Výraz se skládá z termù oddìlených operátory + a -. + TERM VÝRAZ %' + - SIMPLE V4 - popis jazyka 03.2004 94 stran %' Term Term se skládá z faktorù oddìlených operátory *, /, %, >> a <<. FAKTOR TERM * / % >> << Faktor Faktor mùe být tvoøen bitovì negovaným faktorem, literály, voláním funkce, pøístupem k hodnotì nebo výrazem uzavøeným v okrouhlých závorkách FAKTOR ' INT-LITERÁL FLOAT-LITERÁL STRING-LITERÁL CHAR-LITERÁL VOLÁNÍ FUNKCE PØÍSTUP K HODNOTÌ ( VÝRAZ ) FAKTOR Pøíklad -a + b * ( c + d ) / c' Knihovna Pro úplnost uveïme jetì syntaktický diagram pro vloení knihovny do zdrojového textu. Knihovnu vloíme pomocí klíèového slova $library. KNIHOVNA $library & JMÉNO SOUBORU SIMPLE V4 - popis jazyka 03.2004 94 stran & Vkládání souborù Vkládání souborù je obdobou pouití knihovny ve zdrojovém textu ovem s tím rozdílem, e zdrojový text je pouit pøímo v textové formì zatímco knihovna v binárním pøedzpracovaném tvaru. Pro vkládání souboru je té pouito na rozdíl od knihovny klíèového slova $include. VKLÁDÁNÍ SOUBORU $include JMÉNO SOUBORU Jméno souboru Jméno souboru následuje za direktivou $include (pro vkládání souborù) nebo za direktivou $library (pro vkládání knihovny). Jméno souboru vèetnì pøípadné absolutní èi relativní cesty uvádíme do okrouhlých závorek, tak jak odpovídá syntaktickému diagramu. JMÉNO SOUBORU ( cesta soubor ) Cesta v syntaktickém diagramu naznaèuje jednu ze tøí moných variant, kde pøekladaè hledá soubor uvedeného jména. Situaci naznaèuje následující výèet sestavený podle priority cest urèených hledání souboru. & a) Absolutní cesta k souboru (je-li zadána) b) Cesta je brána jako relativní vùèi umístìní souboru v nìm je vládání souboru nebo knihovny pouito c) Cesta je brána jako relativní vùèi cestì k hlavnímu souboru projektu èi pøekladu d) Cesta je brána jako relativní vùèi adresáøi v nìm je pøekladaè nainstalován tj. vùèi domovskému adresáøiprogramu StudioWin. SIMPLE V4 - popis jazyka 03.2004 94 stran & 7. Vstupy/výstupy, speciální registry Jazyk SIMPLE V4 pøebírá z verze SIMPLE V2 kompletní soubor vech pøeddefinovaných názvù vstupù a výstupù i speciálních funkèních promìnných. Rovnì chování vech speciálních funkcí zajiovaných v automatu je identické s verzí SIMPLE V2. Kromì bìných prostøedkù pro práci se vstupy, výstupy a vnitøními promìnnými má SIMPLE jetì tzv. speciální funkce. Jsou to vnitøní èasovaèe, reálný èas ,informace o rychlosti systému .... Pro realizaci speciálních funkcí se vyuívají nìkteré bity ze sady B0...B127 a nìkteré registry ze sady W0...W127. Vechny promìnné, které mají speciální funkce, mají napevno pøiøazeny symbolické názvy. Doporuèujeme vude v programu pouívat tyto symboly - klesá potom monost omylù. I kdy vìtina bitù B a registrù W je zatím neobsazena, není vhodné je v programu vyuívat jako obecné promìnné (z dùvodù kompatibility s dalími verzemi pøekladaèe SIMPLE do budoucna). 7.1 RESET Je speciální funkèní bit, který je automaticky nastaven vdy po zapnutí automatu a té vdy po sputìní programu. Tento bit lze vyuít v programu na poèáteèní inicializace a pak jej vynulovat, nebo se mùe pouít i jinak, je vak tøeba poèítat s tím, e po kadém restartu automatu se tento bit nastaví. 7.2 Rychlost systému Pøi bìhu programu v automatu je prùbìnì aktualizována promìnná SPEED, ve které je uveden poèet prùchodù celým programem (tedy de-facto poèet obrátek hlavní smyèky) za sekundu. V aplikacích nároèných na rychlost odezvy lze napø. tento registr testovat a kontrolovat, zda se regulaèní program nedostává do èasového skluzu. 7.3 Èasovaèe Èasovaèe jsou reprezentovány speciálními funkèními registry (typu WORD) se symbolickými názvy T0 a T7. Vech osm èasovaèù je zcela nezávislých a se shodnými funkcemi. Kadý èasovaè lze kdykoliv pøeèíst, anebo do nìj kdykoliv zapsat (se zapsanou hodnotou pak opìt probíhá stejný proces èítání). & SIMPLE V4 - popis jazyka 03.2004 94 stran & Èinnost kadého èasovaèe souvisí se samostatnou esticí funkèních bitù TENn, TPAn, TOEn, TOFn, TDMn, kde n = 0~7 specifikuje pøísluný èasovaè. Tedy napø. èasovaè T4 má svoji sadu øídících bitù TEN4, TPA4, TOE4, TOF4, TDM4. Funkci tìchto bitù naznaèuje následující obrázek. Èasovaè T a jeho øídící bity : 10 ms 0 0 1 1 T ÈÍTAÈ 16 bitù 0 TOF 1 1 sec. TPA TEN TD M TOE TEN povolení èítání èasovaèe : TEN=0 èasovaè stojí, TEN=1 èasovaè èítá TPA zaøazuje pøeddìliè 1/100 : TPA=0 èasovaè èítá po 10ms, TPA=1 èítá po 1 s TOE povoluje èítání pøes pøeteèení TOE=0 èasovaè zastaví na 65535 (èítá-li nahoru), nebo na 0 (èítá-li dolù) TOE=1 èasovaè po dosaení meze nezastavuje, ale pøetéká pøes maximální rozsah èísla (pøi èítání nahoru 65535->0, pøi èítání dolù 0->65535) TOF informace o pøeteèení èasovaèe (musí být nulován programem) TDM smìr èítání èasovaèe : TDM=0 èasovaè èítá nahoru, TDM=1 èítá dolù 7.4 Reálný èas V jazyce SIMPLE mohou být programovány automaty systému PES, pokud mají osazen obvod reálného èasu (modifikace R). V tomto pøípadì jsou uivateli pøístupné ve speciálních funkèních registrech údaje o sekundách, minutách a hodinách reálného èasu. Kromì toho jsou k dispozici i registry s informací o dnech v mìsíci, o mìsících, letopoètu a dnech v týdnu. Hodinové údaje jsou v 24 hodinových cyklech. Kalendáø nectí pøestupné roky. Dny v týdnu nejsou závislé na datu, èili se jedná o nezávislý èítaè od 1 do 7. Je tedy na uivateli, kterým dnem bude zaèínat týden. Provede-li se vak nastavení podle systémového èasu osobního poèítaèe pomocí programu SETPES, potom týden zaèíná nedìlí (Ne=1, Po=2, Út=3...). Funkèní bit HOLD slouí k zachycení èasu. Po nastavení tohoto bitu se údaje v èasových registrech nemìní, èas vak nadále bìí na pozadí. Po vynulování tohoto bitu se opìt v registrech objeví údaje odpovídající reálnému èasu. Nastavením bitu CLRSEC se zaokrouhluje reálný èas na celé minuty. Je vynulován obsah sekundového registru, a pokud &! SIMPLE V4 - popis jazyka 03.2004 94 stran &! je pøed nulováním obsah sekundového registru vìtí ne 29, je zároveò inkrementován obsah minutového registru. Tento funkèní bit je po zaokrouhlení èasu automaticky nulován. Promìnné vyhrazené pro reálný èas: SECOND MINUTE HOUR DAY WEEK Funkèní bity: MONTH YEAR HOLD CLRSEC Sekundy reálného èasu Minuty reálného èasu Hodiny reálného èasu Den v mìsíci Den v týdnu Pondìlí=2....) Kalendáøní mìsíc Roky ve století (0 ... 59) (0 ... 59) (0 ... 23) (1 ... 31) (1 ... 7, Nedìle=1, (1 ... 12) (0 ... 99) Vzorkování reálného èasu HOLD=0 registry jsou neustále aktualizovány HOLD=1 registry "drí" poslední hodnoty Zaokrouhlení na minuty UPOZORNÌNÍ : Bity HOLD a CLRSEC nedoporuèujeme v nových programech vyuívat, nebo v dalích verzích pøekladaèù a operaèních systémù v PLC ji nemusí být podporovány. Pozn.: Pøi ètení registrù reálného èasu na automatech, kde není obvod reálného èasu osazen, je tøeba poèítat s tím, e v registrech budou nesmyslné hodnoty. Údaj letopoètu je pouze dvoumístný a obsáhne tedy pouze rozsah jednoho století. Je-li z nìjakých dùvodù tøeba obsáhnout vìtí úsek, je nutné naprogramovat adekvátní softwarovou podporu pro poèítání století. Pro inspiraci je zde pøíklad : D10 # TmpYear D11 # CENTURY subroutine PocitejStoleti preteceni roku pres nulu if (TmpYear > YEAR) then TmpYear = YEAR return ; detekujeme CENTURY = CENTURY+1 Pozn.: Promìnná CENTURY poèítá století, ale protoe se nikde neinicializuje (a ani to nelze, protoe proces èítání století nesmí být naruen vypínáním a zapínáním automatu) je tøeba ji jednorázovì nastavit (nejlépe pøi nastavování data a roku). &" SIMPLE V4 - popis jazyka 03.2004 94 stran &" 7.5 A/D pøevodník U automatù PES s analogovými vstupy se hodnoty tìchto vstupù objevují v promìnných I0, I1 ..... atd. Rozsah tìchto hodnot mùe být obecnì 0...65535, jednotky v kterých je daná velièina mìøena a její max. rozsah je dán typem analogového vstupu (tyto údaje jsou vdy uvedeny v technických údajích u jednotlivých typù automatù resp. modulù). U standardních analogových vstupù je provádìna automatická digitální filtrace. Krok jednoho mìøení pøes vechny vstupy trvá zhruba 700 ms. Analogové vstupy pro mìøení odporu mají tuto èasovou konstantu jetì delí. Aktuální hodnoty jsou do promìnných I0..Ix pøepsány vdy na zaèátku programové smyèky a v celém prùbìhu programu smyèkou se nemìní. U základních analogových vstupù (první 4 u MPC300, prvních 6 u PES-K1 a PES-K10, 6 vstupù u M66) je implementována monost kalibrace analogových vstupù. K tomuto úèelu slouí speciální funkèní promìnné CALIB0 a CALIB7. Po resetu programu je v tìchto promìnných vdy hodnota 10000. Tato hodnota je chápána jako 1.0000 - a mùe být mìnìna uivatelským programem od 0.0 do 1.6000 (zápisem hodnot 0..16000 do promìnných CALIB0 - CALIB7). Tato hodnota funguje jako násobná pro kadý kanál, lze tedy chápat pøevod kadého kanálu I N takto : IN = (nominální hodnota analog. vstupu) x (CALIB N / 10000) 7.6 Obsluha displeje a klávesnice Kompaktní automaty PES-K a modulární automaty MPC302 mají shodnou filosofii ovládání displeje a klávesnice - sada funkèních registrù a funkèních bitù vèetnì jejich øídících funkcí je vdy stejná. Klávesnice Vstupní informace z klávesnice je kódována do funkèního registru KBCODE tak, e kadému tlaèítku odpovídá urèitý èíselný kód. Pokud je stisknuto více kláves souèasnì, je v promìnné KBCODE èíselný kód jen jedné z nich. Tento kód se do KBCODE nastaví vdy na zaèátku programové smyèky a na jejím konci se automaticky vynuluje. Promìnná KBCODE je tedy po stisku klávesy aktivní právì po dobu jednoho prùchodu programovou smyèkou. K opìtovnému nastavení KBCODE je tøeba tlaèítko pustit a znovu stisknout (výjimkou je autorepeat - viz dále). Pokud je klávesnice v klidu, je KBCODE=0. Èíslice a desetinná teèka mají èíselný kód zvolen tak, aby pøesnì odpoovídal znakové tabulce ASCII, lze je tedy pod tímto kódem pøímo vytisknout na displej. &# SIMPLE V4 - popis jazyka 03.2004 94 stran &# POZN.: klávesa V tabulce je uvedeno vech 21 kláves, které jsou na automatu PES-K10. Typy s mení klávesnicí (MPC302) mají jen prvních 6 kláves, kódování je vak kompatibilní. Autorepeat Aby nebylo nutné pro urèité akce (napø. pro posuv kursoru, rolování menu apod.) vícekrát maèkat tuté klávesu, je moné nastavit "AUTOREPEAT". Pokud stiskneme nìkteré tlaèítko a dríme je stisknuté, potom po urèité (nastavitelné) prodlevì bude do KBCODE znovu nastavován kód tlaèítka (s nastavitelnou rychlostí opakování). Efekt je tentý jako bychom neustále rychle tiskli tlaèítko. Funkce se zapíná nastavením bitu KBREPEN, poèáteèní prodleva se nastavuje registrem KBDELAY (v desítkách milisekund) a délka intervalu mezi jednotlivými "pseudo-stisky" registrem KBREPEAT (v desítkách milisekund). kód v KBCODE ASCII znak ipka vlevo 1 ipka vpravo 2 ipka nahoru 5 ipka dolù 6 ESC 3 ENT 4 +/- 7 F1 8 F2 9 F3 10 0 48 "0" 1 49 "1" 2 50 "2" 3 51 "3" 4 52 "4" 5 53 "5" 6 54 "6" 7 55 "7" 8 56 "8" 9 57 "9" 46 "." . Zapnutí funkce autorepeat s poèáteèní prodlevou 1 sec. a opakováním po 0.2 sec. : KBREPEN : KBDELAY = 100 : KBREPEAT = 20 Akustická indikace Stisk tlaèítka (a pøípadnì i "pseudo-stisky" pøi zapnuté funkci AUTOREPEAT) je moné automaticky indikovat krátkým pípnutím vestavìného bzuèáku. Funkce se zapíná nastavením bitu KBSOUND (je automaticky nastaven vdy po zapnutí). &$ SIMPLE V4 - popis jazyka 03.2004 94 stran &$ Seznam funkèních promìnných, specifických pro klávesnici a displej: NÁZEV FUNKCE POÈ. HODNOTA TYP/ UMÍSTÌNÍ POSITION pozice znaku na obrazovce nedefinováno word W34 FORMAT formát pro tisk (vyjma textù) nedefinováno word W35 KBCODE kód stisknuté klávesy 0 word W36 KBDELAY autorepeat-startovací prodleva 100 word W37 KBREPEAT autorepeat-opakovací interval 10 word W38 KBREPEN zapnutí funkce autorepeat 0 (vypnuto) bit B50 KBSOUND zapnutí akustické indikace 1 (zapnuto) bit B51 7.7 Funkce DISPLAY Filosofie ovládání displeje je u vech automatù (obsahujících displej) stejná, i kdy mohou mít LCD s rùzným poètem øádkù a rùzným poètem znakù. Texty, èísla nebo uivatelské symboly se vdy tisknou na virtuální obrazovku velikosti 4 øádky x 40 znakù. Pozice znakù na obrazovce se poèítají od levého horního rohu poèínaje nulou. Ve skuteènosti je potom zobrazeno jen tolik øádkù a sloupcù z virtuální obrazovky, kolik umoòuje pouitý displej. Díky tomuto zpùsobu ovládání jsou programy navzájem pøenositelné. Vytvoøíme-li program pro displej s 4x20 znaky, pobìí úplnì stejnì i na displeji s 2x16 znaky, ovem spodní 2 øádky a poslední 4 znaky ji nebudou zobrazeny. Pro tisk na displej je vyhrazena speciální funkce DISPLAY, kterou lze kromì konstant a promìnných tisknout i text (píe se do uvozovek). Pozici, odkud se bude vypisovat, lze volnì nastavit pomocí funkèní promìnné POSITION. Pokud chceme tisknout poloky za sebou, není tøeba poèítat nové hodnoty do promìnné POSITION, nebo obsah této promìnné se automaticky po tisku kadého znaku zvìtí o 1. Tisk textù je pøímý, tj. to co je napsáno v uvozovkách je zobrazeno od pozice dané promìnnou POSITION. Èíslování pozic znakù na virtuální obrazovce 0 39 40 79 80 119 120 159 &% SIMPLE V4 - popis jazyka 03.2004 94 stran &% Pøíklady skuteèného zobrazení na rùzných typech terminálù displej 2 x 16 znakù displej 4 x 20 znakù Díky pøetìování funkcí je moné vechny datové typy tisknout na displej pouhým zápisem : DISPLAY(název_promìnné) Tedy podobným zpùsobem jako u starí verze SIMPLE V2 (která ovem pracovala pouze s datovým typem WORD). 7.8 Formátování tisku hodnot na displej o, jakým formátem se dané èíslo vytiskne, je jednoznaènì dáno kódem formátu v promìnné FORMAT. Kromì formátù pro tisk èísel je jetì formát pro tisk èísla ve formì znaku (podle tabulky znakù pouitého displeje) a formát pro definování vlastních znakù (viz dále). Výbìr formátu se provádí zápisem vhodného kódu do promìnné FORMAT (tak jako u pøedchozí verze SIMPLE2. Formáty pouívané v pøedchozí verzi - SIMPLE V2 fungují beze zmìny tak jako døíve, lze je pouít na celoèíselné promìnné typu WORD a té i LONGWORD. FORMÁT 0 Formát 0 má význam univerzálního formátu - s nastavením FORMAT=0 lze zobrazit vechny datové typy v pøijatelné podobì (není samozøejmì rezervována ádná konstantní délka pro výpis, v desetinné formì jsou zobrazovány pouze typy FLOAT). Automaty s podporou pro SIMPLE V4 podporují i rozíøené formátování pomocí promìnné FORMAT. Pro nastavení formátu se vyuívá hexadecimální zápis hodnot. Zápis v této formì má jasnìjí logiku, nebo èíslo má konstantní poèet pozic, kadá pozice má svùj pevný význam a rozsah hodnot 0-15 (na rozdíl od dekadického vyjádøení, kde kadá pozice má rozsah jen 0-9). Na nejvyí pozici èísla formátu je vdy 1. Pøíklad zápisu formátu v hexadecimální formì: FORMAT = 0x10A4 && SIMPLE V4 - popis jazyka 03.2004 94 stran && Pozn. k hexadecimálním èíslicím: kadá èíslice vyjadøuje hodnoty 0-15 a k jejich vyjádøení se pouívají tyto znaky: 0123456789ABCDEF Struktura promìnné FORMAT 0 x 1 X Y Z pole Z - poèet míst za desetinnou teèkou (hodnota 0..F) pole Y - poèet rezervovaných pozic pro tisk èísla (hodnota 0..F) pole X - zarovnání, tisk znaménka, módy tisku promìnných FLOAT Tabulka hodnot a jejich významù pro pole X Pozn.: pro tisk celých èísel (tedy ve kromì typu FLOAT) má smysl pouívat jen hodnoty 0..7 pole X zarovnání znaménko "+" 0 vlevo ne 1 vpravo ne 2 vlevo ano 3 vpravo ano 4 vlevo ne 5 vpravo ne 6 vlevo ano 7 vpravo ano 8 vlevo ne 9 vpravo ne A vlevo ano B vpravo ano C vlevo ne D vpravo ne E vlevo ano F vpravo ano tisk promìnných FLOAT tisk celoèíselných promìnných AUTO - automatický formát, DECI tisk buï v klasickém tvaru standardní dekadický tvar (±XXX.XXXX), nebo v exponenciálním (±X.XXXE±XX). Pole Z udává celkový poèet platných míst FIX - tisk s pevným poètem desetin tisk èísla ve tvaru ±XXX.XXXX pole Z = poèet desetinných míst HEX tisk èísla v hexadecimálním tvaru (desetinná místa se ignorují) EXP - exponenciální vyjádøení tisk èísla ve tvaru ±X.XXXXE±XX pole Z = poèet desetinných míst mantisy (exponent je vdy dvoumístný) DECI standardní dekadický tvar HEX tisk èísla v hexadecimálním tvaru (desetinná místa se ignorují) Pozn. k poli Y (rezervovaný poèet pozic): zde se rozumí poèet znakù vèetnì pøípadného znaménka. &' SIMPLE V4 - popis jazyka 03.2004 94 stran &' 7.9 Formát pro tisk znakù Formát 120 interpretuje vstupní hodnotu jako èíslo znaku a vytiskne na displej 1 znak daný tímto èíslem. Tento formát umoòuje tisknout i znaky, které nejsou bìnì dostupné a nelze je tedy pøi psaní programu napsat z klávesnice do zadání textu pro textový výstup. Kód znaku musí být v rozsahu 0 ... 255. KÓD TYPY ZNAKÙ 0...7 vlastní pøedefinovatelné znaky, grafické symboly 32...122 abecední a èíslicové znaky, kódované podle standardu ASCII 160...255 dalí uiteèné znaky, specifické pro daný displej (napø. japonská abeceda) Napø. znak C lze v jazyce SIMPLE vytisknout nìkolika zpùsoby : a) DISPLAY("C") b) FORMAT = 120 : DISPLAY(67) c) D1 = 67 : FORMAT = 120 : DISPLAY(D1) 7.10 Definování vlastních grafických symbolù Pouívané typy displejù umoòují vytvoøit a 8 vlastních grafických symbolù. Znaky jsou kódovány pod èísly 0 a 7 a lze je tisknout prostøednictvím formátu 120 (viz výe). Tuto zajímavou funkci mùeme vyuít napø. pro tvorbu a tisk znakù èeské abecedy. Vechny znaky jsou tvoøeny maticí z 8 grafických øádkù po 5 bodech. U standardní pevné sady znakù se spodní øádek nevyuívá. U sady programovatelných znakù mùeme vyuít vech 8 øádek. Celkem tedy mùeme definovat 64 øádkù, tvoøících 8 kompletních znakù. Umístìní pozic grafických øádkù : znak 0 znak 1 znak 2 znak 3 znak 4 znak 5 znak 6 znak 7 0 8 16 24 32 40 48 56 15 23 31 39 47 55 63 1 2 3 4 5 6 7 ' SIMPLE V4 - popis jazyka 03.2004 94 stran ' Definování znakù zaèíná nastavením hodnoty 121 do promìnné FORMAT. Tím se displej pøepne do reimu programování znakù. DISPLAY a POSITION mají nyní jinou funkci. Promìnná POSITION urèuje, který grafický øádek editujeme a funkcí DISPLAY zapisujeme data, urèující obsah øádku. POSITION se i v tomto reimu po zápisu øádku automaticky zvìtí o 1 a posune se tak na dalí øádek. Programování znakù ukonèíme nastavením promìnné FORMAT na jinou hodnotu. Po návratu z programovacího reimu se do promìnné POSITION nevrací pùvodní hodnota, je tedy nutné ji pøed dalím tiskem opìt nastavit. Kadý bod øádku má svoji numerickou váhu (odpovídá binárnímu kódování). Numerickou reprezentaci jednoho grafického øádku získáme seètením hodnot odpovídajících jednotlivým bodùm. Èíselné vyjádøení bodù na grafickém øádku : 16 8 4 2 1 GRAFICKÁ PODOBA Pøíklad Chceme zadefinovat grafický symbol (podle obr.) a zobrazit. Znak zadefinujeme napøíklad pod kódem 2. Nejprve spoèítáme numerické vyjádøení grafických øádkù (viz obr.), potom napíeme podprogram pro jazyk SIMPLE, který vykoná ve potøebné : subroutine TISKNI_OBLUDU FORMAT=121 POSITION=16 DISPLAY(14) DISPLAY(31) DISPLAY(21) DISPLAY(27) DISPLAY(31) DISPLAY(17) DISPLAY(10) DISPLAY(14) FORMAT=120 POSITION=0 DISPLAY(2) èíslo 2 return 7.11 DATA 14 31 21 27 31 17 10 14 ; formát pro definování znakù ; 0. grafický øádek znaku 2 ; zápis grafických øádkù ; budeme tisknout znak podle kódu ; na 1. pozici na 1. øádku ; bude se tisknout znak Jak funguje zobrazování Tisk na virtuální obrazovku a vlastní fyzický zápis dat do obvodù displeje jsou dva zcela nezávislé dìje, které bìí v automatu paralelnì. Odezva elektroniky displeje je toti pomalá a kdyby mìl uivatelský program èekat, a se skuteènì vytiskne na displej nìjaký ' SIMPLE V4 - popis jazyka 03.2004 94 stran ' delí text, dolo by v daném bodì k jeho nepøijatelnému zdrení. Celý tisk pomocí funkce DISPLAY se proto uloí do pamìti RAM (zde je ta virtuální obrazovka) a zároveò s programem bìí na pozadí automatický proces, který odtud stále ète znaky a posílá je na displej. Tato metoda vùbec nezdruje hlavní program, avak skýtá jednu záludnost. Chceme-li napøíklad smazat øádek displeje a vytisknout na nìj novou informaci, mùeme to provést napø. takto : subroutine NOVY_RADEK POSITION=40 DISPLAY(" POSITION=40 DISPLAY("NOVY TEXT") return ; budeme pracovat s 2. øádkem ") ; tisk mezer pøes celý øádek ; na zaèátek øádku nový text Pøepsání celého displeje trvá asi 200 ms. Pokud budeme tuto proceduru volat èasto (alespoò 3x a 4x za sekundu), mùe se stát, e zrovna po vytisknutí prázdného øádku se nìkolik tìchto znakù pøenese na displej a bude trvat asi 200 ms, ne dojde k jejich pøepisu novou hodnotou. A shodou náhod mùe být v tento okamik obsluný program zase v bodì, kdy do inkriminované oblasti opìt píe mezery... Obraz potom rùznì chaoticky problikává. Øeením je buï omezit frekvenci volání takové procedury (max. 2x za sekundu), nebo tisknout na displej tak, aby nedocházelo bezprostøednì po sobì k pøepisu tých pozic rùznou informací. Napø. takto : subroutine NOVY_RADEK POSITION=40 DISPLAY("NOVY TEXT return ; budeme pracovat s 2. øádkem ") ; tisk textu a mezer a do konce Dalí metodou, která tento problém zcela øeí, je dùsledné pouívání formátù rezervujících urèitý prostor pro tisk èísla (viz kap. Formátování tisku èíselných hodnot). Tím je zajitìno, e vytitìné èíslo zabere na displeji stále stejný poèet znakù (tisková funkce jej doplní mezerami) bez ohledu na svou momentální èíselnou velikost (pokud ovem zvolíme dostateènou rezervu). Pak mùeme jednotlivé textové a èíselné elementy naskládat na displej tìsnì vedle sebe. Tím pádem k ádnému pøepisování a mrkání nebude docházet ani kdy budeme zobrazování hodnot provádìt v kadém prùchodu smyèky. Napøíklad : subroutine ZobrazKusy POSITION=43 FORMAT=0x1130 ; DISPLAY("Pocet:") DISPLAY(Kusy) ; ; DISPLAY(" ks") ; return ' ; podprogram tisku na displej rezervuji se 3 znaky, zarovnani vpravo ; text cislo - promenna Kusy (predpoklad, ze je mensi nez 999) text SIMPLE V4 - popis jazyka 03.2004 94 stran ' Tento podprogram je mono volat jakkoli rychle, protoe vechny poloky mají své pevné poøadí a místo, nic se nepøekrývá (tedy a do okamiku, kdy promìnná Kusy bude vìtí ne 999). Je tøeba na druhou stranu poèítat s tím, e tisk na displej (pøiøazování do promìnné DISPLAY) zabere pomìrnì dost strojového èasu a pøíli mnoho tiskù v kadém prùchodu programové smyèky výraznì zvýí dobu prùchodu programu a sníí tak celkovou rychlost. 7.12 Editace hodnot Jazyk SIMPLE V4 (a firmware pro PLC od èísla verze 3.664) umoòují i editaci èísel na displeji pomocí integrované klávesnice na automatu. K tomuto úèelu lze pouít vestavìné funkce editorù, do kterých je pøedána hodnota a tato hodnota (pøíslunì upravená, pokud dolo k editaènímu zásahu z klávesnice) je na výstupu funkce. Pozn.: na klávesy reagují editaèní funkce tak, e ètou obsah promìnné KBCODE. Editaèní funkce zároveò tisknou na displej pøesnì stejnì jako funkce DISPLAY (je tedy tøeba pøed pouitím editoru nastavit i promìnnou FORMAT, aby èíslo zobrazené na displeji bylo v poadovaném tvaru). Pokud je volána nìkterá editaèní funkce, zobrazuje se automaticky na displeji blikající kurzor na editované pozici. funkce editorù vypadají takto: 7.13 function byte EditB(byte dato) - pro editaci typu byte function word EditW(word dato) - pro editaci typu word function int EditI(int dato) - pro editaci typu int function longword EditLW(longword dato) - pro editaci typu longword function longint EditLI(longint dato) - pro editaci typu longint function float EditF(float dato) - pro editaci typu float Síové promìnné Jazyk SIMPLE V4 zavádí kromì sdílených promìnných D32..D63 (word) a M64..M127 (bit) jetì dalí prostor: pole 256 4-bytových promìnných L[0]..L[255] typu longword (pro pøenos jiných typù ne longword staèí promìnnou jednodue pøetypovat). Vechny výe uvedené promìnné jsou sdílené vemi automaty v síti a díky nim je mobá snadná komunikace mezi PLC v síti. '! SIMPLE V4 - popis jazyka 03.2004 94 stran '! 7.14 Typ BIT WORD '" Seznam speciálních funkèních promìnných Symbol Umístìní Popis funkce TEN0..TEN7 B0..B7 povolení èítání TDM0..TDM7 B8..B15 èítání dolù TPA0..TPA7 B16..B23 pøeddìliè stem TOE0..TOE7 B24..B31 èítání pøes pøeteèení TOF0..TOF7 B32..B39 pøíznak pøeteèení CLK0..CLK7 B40..B47 asynchronní impuls na èasovaè HOLD B48 vzorkování reálného èasu. CLRSEC B49 zaokrouhlení na minuty. KBREPEN B50 zapnutí funkce autorepeat KBSOUND B51 zapnutí akustické indikace RESET B126 poèáteèní inicializace systému T0..T7 W0..W7 SECOND W8 sekundy reálného èasu. (0~59) MINUTE W9 minuty reálného èasu. (0~59) HOUR W10 hodiny reálného èasu. (0~23) DAY W11 dny v mìsíci. (1~28..31) MONTH W12 kalendáøní mìsíc. (1~12) YEAR W13 roky století. (0~99) WEEK W14 dny v týdnu (1~7) SPEED W15 rychlost systému STACK W16 aktuální poloka zásobníku POINTER W17 ukazatel do zásobníku CALIB0..CALIB7 W18..W25 ADCMODE W26 nastavení módu A/D pøevodníku POSITION W34 pozice znaku na obrazovce FORMAT W35 formát pro tisk (vyjma textù) KBCODE W36 kód stisknuté klávesy KBDELAY W37 autorepeat-startovací prodleva KBREPEAT W38 autorepeat-opakovací interval estnáctibitové èasovaèe kalibrace základních analogových vstupù SIMPLE V4 - popis jazyka 03.2004 94 stran '"
Podobné dokumenty
SIMPLE3 - Popis jazyka
Uživatelský program je tvořen, tak jak je běžné u programovacích jazyků,
sledem deklarací, definicí, direktiv a příkazů jazyka, zakončený klíčovým slovem
END. Textový soubor resp. soubory, obsahují...
Programovací jazyk Simple 4
zachovává si všechny charakteristiky jazyka bezpečného programování a běhu programu v
reálném čase. Program je vždy vykonáván od začátku až do posledního příkazu a od tohoto bodu
se vrací vykonáván...
Návrh aplikací průmyslového řídicího
zaøízení, obsahuje hlavnì informace odkud se mají zjiovat hodnoty vstupù
a kam se mají nastavovat hodnoty výstupù øídicího systému. Z hlediska projektování øídicího systému je nejdùleitìjí
jmén...
Nokia 7610
Abyste mohli pou¾ívat telefon, musíte mít od
provozovatele bezdrátových slu¾eb zaji¹tìnu odpovídající
slu¾bu. Provoz mnoha funkcí tohoto pøístroje je závislý na
funkcích v bezdrátové síti. Tyto Sí»...
Miniaturní programovatelnę terminál Uĺivatelská p íruţka 01.2007
Reálný èas/kalendáø a dostateèné kapacity pamìti pro uivatelský program i data
umoòují vyuít MT201 jako inteligentní terminál, nebo i jako hlavní øídicí automat systému. Mùe být i vhodnou náhra...
Vodní hospodářství
vodou splachovaných odpadù, se kterými si vodní
ekosystém poradí, ani by dolo k jeho naruení, se
nazývá únosnost. Je-li pøekroèena únosnost, ekosystém se
pokodí, nìkdy i nenávratnì a samoèistíc...
Modulární programovatelné automaty MPC300
zástavbu na lity DIN 35mm (jistièe, chránièe atd...) a lze je tedy pøímo pouít do
mnoha typù bìnì komerènì dostupných plastových rozvodnic s litami DIN.
Pro zástavbu do pøedního panelu zaøízení...