Předcházející díl seriálu, jehož dvě části vyšly v minulém a předminulém čísle, obsahoval řešené příklady jednoduchých programů zapsané ve třech jazycích – v textovém ST a grafických LD a CFC. Řešily základní úlohy kombinační logiky. Byly uváděny bez jakéhokoliv vysvětlení a zdůvodnění postupu, jen předkládány k uvěření a empirickému ověření správnosti – spíše jako ukázka možností programovacích jazyků a jako podklad pro nápodobu při intuitivním přístupu k řešení podobných úloh. Nyní následuje teoretická pasáž s minimální mírou teorie, která je nutná k hlubšímu pochopení a k systematickému řešení úloh kombinační logiky.
Výroková a aplikovaná logika
Logika je věda, která se zabývá usuzováním, pravdivostí, dokazatelností a vyvratitelností tvrzení. V podstatě je studiem argumentace. Snaží se kodifikovat správné postupy, pomocí nichž vyvozujeme platné závěry z daných informací. Při svém uvažování obvykle dodržujeme základní logická pravidla, ale přesto je vhodné se snažit o jejich formalizaci, která nám pomáhá ve složitějších situacích, kdy je nutné se vyznat ve velkém množství logických vztahů. Používají se dvě základní úrovně klasické logiky: zde se budeme zabývat výrokovou logikou, která představuje nižší úroveň, vyšší úroveň (širší a teoreticky náročnější) je predikátová logika.
Logikou se zabývali již filozofové v antice. Nejznámější byl Aristotelés ze Stageiry (384–322 př. n. l), který logiku povýšil na úroveň vědecké disciplíny – jako nauku o správném myšlení, o formách a metodách myšlení (tedy nikoliv o obsahu myšlení). Logika je tak návodem, jak musíme v myšlení postupovat, abychom od daných předpokladů dospěli ke správným závěrům. Logika tehdy sloužila především filozofům, řečníkům, politikům a právníkům, a to až dodnes – kéž by ji důsledně používali všichni naši politici a novináři.
Významnou osobností moderní logiky byl anglický matematik a filozof George Boole (1815–1864), který je zakladatelem algebraické logiky. Navrhl postup, při kterém jsou logické problémy, výroky a věty vyjádřeny jako logické rovnice a z nich je možné analyzovat platnost logických závěrů. Booleova algebra pracuje s dvouhodnotovými (binárními, booleovskými) výroky, které mohou nabývat jen dvou hodnot (pravda – nepravda), jež jsou obvykle reprezentované logickými číslicemi 1, 0 (neoznačují žádné číslo nebo množství, ale mají pouze rozlišující funkci). S dvouhodnotovými výroky operují tři základní booleovské operátory: logického součtu, součinu a negace (OR, AND, NOT). S nimi lze realizovat jakoukoliv logickou závislost (složený výrok, logickou funkci). Tyto operátory tak tvoří úplný logický soubor a pro jejich použití platí soubor pravidel – Booleova algebra. Základní booleovské operátory lze doplnit dalšími, které jejich možnosti rozšiřují. Lze použít i jiný úplný soubor operátorů, např. NAND, NOR (negace AND a OR), s nimiž je možné vytvořit jinou algebru.
V roce 1930 Claude Shannon (1916–2001, americký elektronik a matematik, „otec teorie informace“), napsal diplomovou práci, kde předvedl, jak lze aplikovat Booleovu algebru na systém elektromechanických relé. Na těchto základech vytvořil teorii logických obvodů, která se stala základem pro číslicovou techniku a informatiku. Shannonova práce měla široký vliv na návrh elektronických logických obvodů, vývoj mikroelektroniky, počítačů, řídicích systémů, jejich programů a aplikací v nejrůznějších oborech. Právě takto vytvořená metodika je předmětem aplikované (konstruktérské) logiky, které je věnován následující text. Jejím cílem není studium argumentace a vyvozování platných závěrů, ale navrhování technických systémů, které využívají pravidla Booleovy logiky a jsou řešeny pevnou logikou nebo programem. Takto vytvořené logické a číslicové systémy jsou využívány k výpočtům, automatickému řízení, technické diagnostice a komunikacím. Dnes se používají ve všech oborech našeho života.
Hardware, software a aplikovaná logika
Logické systémy jsou obvykle viditelné jako počítače (PC, IPC) a řídicí systémy (např. PLC, CNC). Jejich technické vybavení (hardware) je v současné době řešeno s využitím mikroelektronických obvodů, zejména mikroprocesorů a mikrořadičů – univerzálních či specializovaných mikroelektronických obvodů s funkcí počítače. Řeší nejenom funkce centrálních modulů, ale i pomocné funkce spolupracující elektroniky, např. obvodů vstupů a výstupů, modulů pro komunikaci, měření polohy a řízení pohonů, pro obsluhu a komunikaci s operátorem nebo pro technickou diagnostiku. Jsou základem funkce přídavných zařízení, např. tiskáren, skenerů, klávesnic a operátorských panelů. Lze se s nimi setkat i ve specializovaných přístrojích, třeba ve čtečkách karet, ve snímačích biometrických údajů, senzorech pohybu osob, kvality vzduchu, koncentrace CO2 a v ostatních modulech „inteligentní elektroinstalace“. Jsou nezbytnou součástí domácích spotřebičů, komunikačních a multimediálních přístrojů, ale i dětských hraček.
Na úrovni programového vybavení počítačů, řídicích systémů a mikrořadičů, popř. skrytých pevných programů jsou vytvářeny softwarové logické systémy, které „oživují“ svůj hardware a poskytují mu nové funkce a vyšší úroveň „inteligence“. Také k tvorbě softwaru a firmwaru je účelné využívat aplikovanou (konstruktérskou) logiku. Znalost pravidel Booleovy algebry a metodiky řešení logických systémů poskytuje programátorům výkonný a názorný aparát pro produktivní práci s minimem chyb a časových ztrát – tedy konkurenční výhodu. Přesto je při výuce programování její znalost opomíjena, mnohdy přímo ignorována. K úspěšnému zvládnutí profese programátora nestačí pouhá znalost programovacího jazyka, jeho příkazů a syntaxe, ale jsou potřebné především dovednosti v tvorbě algoritmů – pro logické systémy to je aplikovaná logika. Je užitečná nejenom pro produktivní tvorbu spolehlivých programů, ale i pro efektivní a bezchybnou komunikaci se zadavatelem a uživatelem systému. Ta se odehrává na slovní úrovni, v duchu výrokové logiky. Znalost aplikované logiky není pro práci programátora nezbytná, ale je výhodná. Její kurz nevnucujeme, jen nabízíme – rozhodnutí je na čtenáři.
Výroky a výroková logika
Výrok je tvrzení (sdělení), o němž lze rozhodnout, zda je pravdivé, nebo nepravdivé. Má formu oznamovací věty. Výroky nejsou zvolání, rozkazy, otázky a věty, které jsou samy se sebou v rozporu, např. „kolikátého je dnes? kdybych tohle tušil! odejděte! vstupte! tato věta není pravdivá“. Výroku přiřazujeme jednu ze dvou pravdivostních hodnot: ano, pravda, true, logická 1 nebo jen 1 – ne, nepravda, false, logická 0 nebo jen 0. Výrok musí splňovat dvě základní podmínky:
je buď pravdivý, nebo nepravdivý, jiná možnost neexistuje, nemůže být současně pravdivý i nepravdivý.
Jednoduchý výrok
Jednoduchý (atomický) výrok nelze rozložit na více dílčích výroků, např.: „prší; svítí slunce; číslo 7 je prvočíslo; číslo 7 je liché; číslo 8 je sudé; číslo 8 je dělitelné třemi; bylo 8:30 hodin; ještě není 10 hodin; je horko; teplota je 21 °C; rameno manipulátoru je nahoře; čelisti manipulátoru jsou sevřené“. O pravdivosti některých výroků lze jednoznačně rozhodnout vždy a bez jakýchkoliv dalších podmínek, např. číslo 7 je vždy prvočíslem a je liché, 8 je vždy sudé a není nikdy dělitelné třemi. Naproti tomu pravdivost některých výroků závisí na situaci, ve které je hodnotíme, obvykle na čase a místě. Většinou předpokládáme, že pravdivost výroků je posuzována v situaci „tady a teď“ (na tomto místě a v současnosti), např. výroky o teplotě. Podobně lze předpokládat, že časové údaje platí pro dnešní den. V opačném případě by bylo nutné formulaci výroku upřesnit, aby odpověď mohla být jednoznačná. U výroku „prší“ může být potřebné uvést údaj o místě a čase vyhodnocení, popř. ještě upřesnit (kvantifikovat) intenzitu – od jaké hodnoty lze srážky již považovat za déšť, popř. jak jej odlišit od sněžení či krupobití. U výroku „svítí slunce“ může být účelné upřesnit intenzitu slunečního svitu nebo míru oblačnosti. Pro „horko“ je rovněž potřebné uvést teplotní hranice pro tento pojem. Požadavek na dvouhodnotový charakter výroku může být omezující, např. v situaci, kdy odpověď na otázku může být neznámá nebo nejednoznačná a spíše by vyhovovala hodnota „nevím“, „pravda asi z poloviny“, „pravda asi na 75 %“. Tomu by ale odpovídala vícehodnotová logika (se třemi nebo několika stupni pravdivosti), popř. fuzzy logika (se spojitým rozložením pravdivosti mezi 0 až 1) – „to už je ale jiná pohádka“, zde zůstaneme u tradiční booleovské, tedy dvouhodnotové logiky.
Složený výrok
Složený výrok (logická formule) je tvořen jednoduchými výroky, které jsou spojeny slovními spojkami (logickými operátory) – booleovská logika používá jen tři: logický součet (nebo, OR), logický součin (a, současně, AND) a negace (popření, ne, není pravda, NOT). Takto je možné vytvořit např. složené výroky: „prší a současně svítí slunce; prší nebo svítí slunce; neprší a nesvítí slunce; číslo 7 je prvočíslo a současně je liché; bylo 8:30 a ještě není 10 hodin; ještě nebylo 8:30 nebo už bylo 10 hodin; číslo 8 není dělitelné třemi; číslo 8 je sudé a není dělitelné třemi“. Nad rámec booleovské logiky existují další operátory, např. buď – nebo, ani – ani.
Negace v logice a v češtině
Negace ve výrokové logice znamená prostý zápor, popření pravdivosti negovaného výroku. Z toho vyplývá, že negace negovaného výroku má pravdivost původního výroku. V hovorovém vyjadřování to ale takto jednoznačné nebývá. Například český výrok „nikdo tam není“ sice obsahuje dva zápory (nikdo, není), takže striktně podle výrokové logiky bychom jej měli chápat ve významu „někdo tam je“, ale my (Češi) jej podvědomě chápeme opačně, tedy ve významu „je tam prázdno“. V němčině by stejnou situaci vyjádřili jako „niemand ist dort“ – doslovně přeloženo: „je tam nikdo“. S nejednoznačnostmi v chápání záporů se setkáváme i v jiných jazycích. Například v angličtině sloveso „must“ znamená muset, ale „must not“ znamená nesmět, nikoliv nemuset. (Pozn. red.: Nad tím se ovšem pozastaví jen český mluvčí, pro anglicky mluvícího je zcela přirozeným a logickým opakem k „muset“ „nesmět“.) V detektivním příběhu (obvykle přeloženém z angličtiny) vyšetřovatel pokládá sugestivní otázku „není pravda, že jste tam byl?“, ale ve skutečnosti otázkou myslí opak: „je pravda, že jste tam byl?“. Podobně problematická je otázka „byl jste tam, nebo ne?“. Pokud vyšetřovaný odpoví „ano“ nebo „ne“, není jasné, jak lze jeho odpověď správně chápat – jakkoliv. Jednoznačným řešením by zde byla odpověď celou větou, např. „ano, byl jsem tam“ nebo „ne, nebyl jsem tam“.
Obr. 1. Příklad úrovní vstupních napětí pro logický signál v rozsahu 24 V (červeně je označena logická 1, modře logická 0)
Jak třeba chápat tvrzení „nic není nemožné“ se třemi zápory? V českém jazyce podvědomě jeho význam chápeme ve významu „všechno (cokoliv) je možné“. Ale zkusme jej rozebrat po částech v duchu výrokové logiky: „nic není“ by mělo znamenat „něco je“ – takže „něco je nemožné“?, nebo snad „není nemožné“ znamená „je možné“ – takže „nic je možné“? (Pozn. red.: Takto zrádná je ovšem jen čeština, anglicky se daný výrok řekne logicky správněji: „nothing is impossible“.) S podobně nahromaděnými zápory se setkáváme často, např. v písni V+W: „nikdo nic nikdy nemá míti za definitivní“. Situaci mnohdy komplikují zápory podstatných nebo přídavných jmen, které jsou „poněkud neostré“. Často chybně ztotožňujeme negaci za protiklad k původnímu výroku. Například negací výroku „x je záporné číslo“ není výrok „x je kladné číslo“, ale „x je nezáporné číslo“ (může být i nula). Podobně negováním výroku „není vpravo“ neříkáme „je vlevo“ – může být i uprostřed nebo kdekoliv v prostoru.
Není naším úkolem řešit zde problémy lingvistiky. Jen je třeba upozornit na rozpory mezi významem negace (popření) ve striktním chápání výrokové logiky a její podvědomou interpretací v hovorovém vyjadřování. Proto bychom se při popisu logických systémů (při zadávání požadavků na jejich funkci nebo při interpretaci jejich chování) měli vyhýbat formulacím se zápory nebo je alespoň používat velmi opatrně a obezřetně. V běžné mezilidské komunikaci lze případné nepochopení okamžitě rozpoznat a vysvětlit. Naproti tomu chybné porozumění požadavku zadavatele systému (na řešení hardwaru nebo softwaru) má za následek chybu ve funkci systému, kterou objevíme až při jeho uvádění do chodu nebo v průběhu jeho používání. Zjištění příčiny nebývá snadné, je spojeno se stresem, časovými ztrátami, vícenáklady, popř. ztrátou dobré pověsti – vše lze vyčíslit finančně.
Logický signál, pevná logika, hardware
Jako signál je označována fyzikální veličina, která nese informaci – měronosná veličina. Může to být hodnota odporu snímače teploty nebo síly (spíše napětí na něm), napětí na vodičích termočlánku, elektrické napětí nebo proud, přiváděné na vstupní svorky řídicího systému nebo odváděné z jeho výstupních svorek. Někdy jde o spojitě se měnící veličiny – analogové signály, např. o napětí v normalizovaném rozsahu –3 až +3 V, –10 až +10 V, 0 až 10 V, proud v normalizovaném rozsahu 0 až 20 mA nebo 4 až 20 mA.
Často se používají dvouhodnotové (binární) signály – poněkud nepřesně označované jako číslicové či digitální. Jejich zdrojem bývají kontakty tlačítek, relé, stykačů, spínací obvody senzorů nebo výstupní obvody řídicích systémů. Většinou jde o napěťové signály, jejichž hodnoty se mohou vyskytovat ve dvou pásmech. Například pro vstupy a výstupy programovatelných automatů (PLC) jsou obvyklé binární signály v rozsahu 24 V. Logické nule zde odpovídá nízká úroveň napětí (typicky 0 až 12 V) a logické jedničce odpovídá vyšší úroveň napětí (typicky 15 až 24 V). Mezi nimi se nachází „zakázané pásmo“ (pásmo neurčitosti, rozhodovací oblast) s hodnotami, kterých by logický signál neměl dlouhodobě nabývat – nebylo by možné mu přiřadit logickou hodnotu. Nad horní úrovní leží další „zakázané pásmo“ (pásmo destrukce). Napětí této hodnoty již může způsobit poškození vstupních obvodů řídicího systému nebo akčního členu (obr. 1). Jiné úrovně mají binární signály používané v mikroelektronických obvodech s integrovanými obvody – TTL (typicky 0 až 5 V) nebo unipolární (obvykle s nižší úrovní napětí).
V logických systémech s pevnou logikou (hardwarových) odpovídají výrokům logické signály. Jsou zpracovány logickými obvody, a vytvářejí tak logické funkce. Ty jsou ekvivalentem složených výroků. Je praktické jednotlivým logickým signálům přiřadit jména, která stručně vystihují jejich význam (např. „tlačítko start“, „jeď vpravo“, „jede vpravo“, „pravý koncový spínač“). Chování systému (při zadávání nebo při vysvětlování jeho funkce) potom má podobu vyprávění příběhu podle zásad výrokové logiky, např. „stiskem tlačítka start aktivujeme pohon posuvu vpravo a po dosažení pravého koncového spínače pohyb zastavíme“.
Při realizaci starších systémů byly používány soubory relé a stykačů. Logické funkce zde vznikaly propojením jejich kontaktů do kontaktní sítě. Někdy se používají i logické systémy na bázi pneumatických obvodů. V současnosti je k řešení logických systémů téměř výhradně používána mikroelektronika. Logické signály jsou zpracovávány logickými členy (hradly), které řeší dílčí logické funkce (např. AND, OR, negaci, NAND, NOR, XOR a další). Jejich propojením do sítě (mnohdy velmi rozsáhlé) vznikají požadované logické funkce. Skupiny logických členů bývají zapouzdřeny jako integrované obvody. Hustota jejich integrace postupně narůstala. První integrované obvody malé hustoty integrace (SSI – Small Scale Integration) obsahovaly jen několik logických členů, v současné době je stupeň integrace o několik řádů vyšší. Integrovanými obvody (popř. ještě dalšími součástkami) jsou osazovány desky plošných spojů. U složitějších systémů jsou desky umísťovány do rámů. S rozvíjející se technologií se zmenšují rozměry logických členů a roste hustota integrace. V pouzdru integrovaného obvodu se tak daří umístit stále větší počet logických členů. K realizaci složitých logických systémů tak postačuje jen několik pouzder, popř. jsou všechny funkce realizovány uvnitř jednoho integrovaného obvodu. Tradičně byly integrované obvody navrhovány pro konkrétně zadanou funkci – jejich vnitřní struktura a propojení logických členů byly neměnné. V současné době se převážně používají programovatelné logické obvody. Mají univerzální strukturu a uspořádání logických členů. Jejich konkrétní propojení (a tedy i výsledná logická funkce) je realizováno programováním. Používají se různé druhy programovatelných logických obvodů, např. na principu přepalovaných propojek nebo programovatelné elektrickým nábojem. Někdy je naprogramované propojení trvalé (nevratné), u některých typů lze naprogramované propojení vymazat a obvod znovu naprogramovat.
Logická proměnná, program, software
Při řešení programem jsou zpracovávané signály přivedeny na vstupy programovatelného systému (PC, IPC, PLC, mikrořadiče) a jeho výstupy jsou pak připojeny k akčním členům nebo jiným prvkům výstupního charakteru. Program ale pracuje se vstupními a výstupními proměnnými, na které se vnější signály transformují. Zatímco vstupní a výstupní signály systému jsou fyzikální a měřitelné veličiny, jsou proměnné programu datové objekty charakterizované adresou, kde jsou uloženy. Syntaxe programovacího jazyka určuje typy proměnných a zásady pro jejich jména. Analogové vstupní signály jsou v analogově číslicových (A-D) převodnících převedeny do číslicové formy a uloženy v některém z formátů pro zobrazení číselných proměnných. Norma IEC EN 61131-3 definuje formáty celých čísel (integer) v rozsahu 8, 16 a 32 bitů se znaménkem nebo bez něj. Pro složitější výpočty je výhodnější formát s plovoucí řádovou čárkou (real) v rozsahu 32 nebo 64 bitů. Existují i formáty pro časové údaje. Dvouhodnotové vstupní signály jsou převedeny na logické proměnné typu (BOOLE), které mohou být používány samostatně nebo uspořádané do bitových řetězců v délce 8 (BYTE), 16 (WORD), 32 (DWORD) nebo 64 bitů (LWORD). Podobně jako u logických signálů je výhodné proměnné programu pojmenovat krátkými a výstižnými názvy (identifikátory proměnných). Je ale nutné dodržovat pravidla syntaxe pro identifikátory: mohou obsahovat číslice, malá a velká písmena z anglické abecedy (bez háčků a čárek), znak „_“ (podtržítko), nesmí obsahovat mezery, musí začínat písmenem nebo podtržítkem. Proměnné musí být deklarovány dříve, než budou použity (příklad deklarace je na obr. 5 v druhé části prvního dílu seriálu v č. 10 na str. 12).
Vstupní logické proměnné jsou obvykle obrazem stavu binárních prvků z okolí řídicího systému (tlačítka, kontakty spínačů nebo stav jiných dvouhodnotových senzorů). Mohou být ale vytvářeny programem, např. jako výsledek vyhodnocení číselných proměnných. O stavu stroje obvykle informují spínače, signalizující dosažení význačné polohy jeho pohyblivých částí, např. koncových poloh, zón redukce rychlosti posuvu nebo referenční polohy. Je-li k dispozici číselný údaj o poloze, lze z něj odvodit další binární proměnné, které charakterizují důležité situace – pouhým porovnáním (operacemi rovností nebo nerovností). Podobně lze binární proměnné odvodit z číselného údaje o rychlosti pohybu, teplotě apod. Doplňkové binární proměnné mohou mít význam: „dosažena poloha výměny nástroje“, „teplota 23 °C je dosažena“, „ještě nebylo 10 h“, „počet výrobků je právě deset“. Program zpracovává jednotlivé logické proměnné a vytváří zadané logické funkce, které mají opět formát logických proměnných. Jsou uloženy jako vnitřní proměnné pro další použití nebo jsou jako výstupní proměnné převedeny na výstupní logické signály systému. Vně systému pak mohou ovládat akční členy dvouhodnotového charakteru, např. ve významu: „sepni spojku pro osu +X“, „zapni topení“, „rozsviť žlutou signálku“. Podobně jako u systémů s pevnou logikou je i zde možné popsat algoritmus logického systému jako „vyprávění příběhu podle zásad výrokové logiky“.
(Dokončení v příštím čísle.)
Ing. Ladislav Šmejkal, CSc., Teco, a. s., a externí redaktor časopisu Automa