HMI - ovládání, zobrazování, vizualizace

HMI-AUTOMATIZACE - ŘÍZENÍ - SW GENERÁTOR
Provoz webu zajišťuje:

www.hapesoft.cz

Softwarový generátor znaků

Charakteristika

Pokud nepoužíváme nějaké sofistikované řešení pro zobrazování hodnot, textů a pod. je potřeba převést binární informaci ze systému na zobrazovač. Zpravidla je v jednoduchých případech binární informace uložena v kódu BCD nebo podle kódu tabulky ASCII. Generátor znaků, znakový dekodér, je technický prostředek, který provádí dekódování informace uložené v binárním tvaru (BCD, ASCII) a převádí ji na grafickou informaci, jejíž podání odpovídá (přibližuje se) běžnému psanému podání znaku. Generátor znaků je možno realizovat jako softwarový (též programový) nebo hardwarový podle konkrétní aplikace a použití.

Programový generátor znaků

Programový generátor znaků je realizován programovými instrukcemi v řídícím systému (funkcemi). Tvar zobrazení znaků závisí na dispozicích zobrazovače podle počtu, tvaru a rozmístění indikačních bodů i představivosti programátora, konkrétně se může například jednat o 7 nebo 16 segmentový zobrazovač.

Programový generátor pro 7 segmentové zobrazovače

Funkci znakového generátoru si popíšeme na nejjednodušším zobrazovači se 7 segmenty. Pro aplikace se v praxi ustálilo zapojení, že segmentu A odpovídá bit 0, segmentu B pak bit 1 atd..., bit 7 je pak využíván pro řízení desetinné tečky. 7 segmentový zobrazovač s rozmístěním znaků je uveden na obrázku 1. Na obrázku je zároveň naznačeno zapojení ochranných odporů pro omezení proudu, nastavení intenzity jasu a směr protékajícího proudu, v tomto případě se jedná o zobrazovač se společnou katodou.

7 segmentový zobrazovač, rozmístění a
        označení segmentů
Obrázek 1
7 segmentový zobrazovač, rozmístění a označení segmentů.

Programový generátor generuje informaci o tom, které segmenty zobrazovače mají být rozsvíceny, tato informace je přiváděna na výstupní bitové signály (bit 0-6) a tím řídí svit jednotlivých segmentů zobrazovače podle požadovaného znaku.

Nejprve je ale potřeba si připravit tabulku, která bude definovat, které segmenty mají být rozsvíceny pro konkrétní znak. Tabulka obsahuje tolik řádků, kolik znaků chceme zobrazovat a pořadí řádku určuje hodnotu kódu znaku. Hodnota "1" bitu/segmentu v tabulce určuje, které segmenty mají být pro konkrétní znak rozsvíceny. Praktický příklad pro znaky 0-9 je uveden v tabulce 1a.

řádekznakbin.
kód
segmentkód
HGFEDCBA
bit
76543210
100000--1111113Fh
210001-----11-06h
320010-1-11-115Bh
430011-1--11114Fh
540100-11--1--64h
540100-11--11-66h
650101-11-11-16Dh
760110-11111-17Dh
760110-11111--7Ch
870111-----11107h
981000-11111117Fh
1091001-11-11116Fh
1091001-11--11167h

Tabulka 1a
Tabulka pro generování znaků 0-9 na 7 segmentovém zobrazovači.

Poznámka
V tabulce jsou zvýrazněny 3 řádky (4, 6, 9), které představují alternativu pro zobrazení znaku, prakticky se použije pouze jeden řádek pro jednu hodnotu.

Samotný počet 7 segmentů dovoluje zobrazení i dalších znaků, které zpravidla rozšiřují použití zobrazovače pro zobrazení hexadecimální soustavy, tedy znaků A-F. Pro tento případ postačí rozšíření předchozí tabulky o další řádky s kódem pro další znaky, tak jak je uvedeno v tabulce 1b.

řádekznakbin.
kód
segmentkód
HGFEDCBA
bit
76543210
11A1010-111-11177h
12b1011-11111--7Ch
13C1100--111--139h
14d1101-1-1111-5Eh
15E1110-1111--179h
16F1111-111---171h

Tabulka 1b
Rozšířená tabulka pro zobrazování znaků A-F na 7 segmentovém zobrazovači.

Pokud je potřeba zobrazovat jiné znaky, je možno si tabulku upravit a tyto znaky naprogramovat místo stávajících znaků A-F (např. znak ° nebo t. Pokud je ale potřeba zobrazovat i předchozí znaky, je nutno rozšířit počet řádků tabulky a zároveň přidat potřebný počet adresových bitů tabulky (kód).

Poznámka
Pokud je potřeba zobrazovat více znaků než z dekadické/hexadecimální soustavy (0-9/A-F), kde postačí BCD/HEX kód, je při větším počtu znaků vhodné použít kódování podle ASCII tabulky.

Upozornění
Na 7 segmentovém zobrazovači nelze relevantně zobrazit ani všechny základní znaky abecedy. V případě požadavku na odpovídající zobrazování více znaků je vhodné použít alespoň 14/16 segmentový zobrazovač nebo raději zobrazovač maticový.

Tabulky neobsahují aktivaci segmentu H, respektive 7 bitu, protože tento je určen pro zobrazení desetinné tečky. Tato však není součástí znaku ale reprezentace hodnoty. Desetinnou tečku je tedy nutno do zobrazení doplnit použitím samostatné programové instrukce.

Programová obsluha pro 7 segmentů

Při zpracování v programu je potřeba číslo (např. teplota) vyjádřené v binárním tvaru převést do tvaru BCD, kdy funkce zajistí to, že na každé čtveřici bitů je vyjádřena jedna číslovka čísla ve formátu BCD. Tato čtveřice bitů (kód BCD) je potom adresou řádku v tabulce, na které se nachází kód pro aktivaci odpovídajících segmentů. Separaci jednotlivých čtveřic bitů s kódem BCD je možno realizovat posuvným registrem nebo rotací a s následným maskováním nepotřebných bitů.

Pro zjednodušení je možné zpracovávat požadovanou hodnotu v násobcích hodnoty 10. Taková informace, která má reálnou hodnotu např. 17,3°C je interně zpracovávána jako hodnota 173 a při zobrazení je desetinná tečka doplněna na vhodné místo. Tímto se vyhneme složité konverzi reálného čísla na BCD, pokud tuto funkci nemá systém v sobě integrovánu. Při zobrazování záporných hodnot je potřeba tyto hodnoty převést v binární formě na kladné a následně zpracovat jako výše. Záporné znaménko je pak nutno dodatečně zobrazit na samostatném indikačním prvku nebo separátně aktivovat segment G na nejvyšší pozici zobrazovače. Pokud budeme uvažovat o zobrazování hodnot přímo binární soustavy je převod na BCD zbytečný a dostaneme hexadecimální zobrazení binární hodnoty.

Programové příklady, viz dále, představují realizaci softwarového generátoru znaků pro jeden konkrétní znak, nikoliv převod binární soustavy na BCD a separaci jednotlivých čtveřic bitů.

Programový příklad 7.a

Jedním z programových způsobů, který by měl zvládnout každý řídící systém je sestavení programu pomocí podmíněných skoků:

        
  // POROVNÁNÍ HODNOTY K ZOBRAZENÍ  
  L"Hodnota"// binární kód znaku  
  L0  
  ==I// je hodnota = 0 ?  
  JCN_0// skok pro načtení segmentů pro hodnotu 0  
  L"Hodnota"// binární kód znaku  
  L1  
  ==I// je hodnota = 1 ?  
  JCN_1// skok pro načtení segmentů pro hodnotu 1  
  L"Hodnota"// binární kód znaku  
  L2  
  ==I// je hodnota = 2 ?  
  JCN_2// skok pro načtení segmentů pro hodnotu 2  
  ...// ...  
  ...// porovnání pro hodnoty 3...8  
  ...// ...  
  L"Hodnota"// binární kód znaku  
  L9  
  ==I// je hodnota = 9 ?  
  JCN_9// skok pro načtení segmentů pro hodnotu 9  
  JUWRONG// shoda nenalezena  
     
  // PŘIŘAZENÍ SEGMENTŮ  
  N_0:L16#3F// 2#00111111 ... segmenty pro hodnotu 0  
  JUEND  
  N_1:L16#06// 2#00000110 ... segmenty pro hodnotu 1  
  JUEND  
  N_2:L16#5B// 2#01011011 ... segmenty pro hodnotu 2  
  JUEND  
  ...// ...  
  ...// přiřazení pro hodnoty 3...8  
  ...// ...  
  N_9:L16#6F// 2#01101111 ... segmenty pro hodnotu 9  
  JUEND  
  WRONG:L16#00// 2#00000000 ... při chybné hodnotě zobrazovač zhasne  
     
  // ZÁPIS NA VÝSTUPY  
  END:T"Vystup bit 0-7"// zápis na výstupy  
        
Programový příklad 7.b

Výše uvedený zápis je poměrně zdlouhavý, proto, pokud to systém dovolí, je možno jako náhradu použít instrukci "seznam skoků" ...

        
  // POROVNÁNÍ HODNOTY K ZOBRAZENÍ  
  L"Hodnota"// binární kód znaku  
  JL RANGE  
  JUN_0// skok pro načtení segmentů pro hodnotu 0  
  JUN_1// skok pro načtení segmentů pro hodnotu 1  
  JUN_2// skok pro načtení segmentů pro hodnotu 2  
  ...// ...  
  ...// skok pro načtení segmentů pro hodnotu 3...8  
  ...// ...  
  JUN_9// skok pro načtení segmentů pro hodnotu 9  
  RANGE:JUWRONG// shoda nenalezena  
     
  // PŘIŘAZENÍ SEGMENTŮ  
  N_0:L16#3F// 2#00111111 ... segmenty pro hodnotu 0  
  JUEND  
  N_1:L16#06// 2#00000110 ... segmenty pro hodnotu 1  
  JUEND  
  N_2:L16#5B// 2#01011011 ... segmenty pro hodnotu 2  
  JUEND  
  ...// ...  
  ...// přiřazení pro hodnoty 3...8  
  ...// ...  
   
  N_9:L16#6F// 2#01101111 ... segmenty pro hodnotu 9  
  JUEND  
  WRONG:L16#00// 2#00000000 ... při chybné hodnotě zobrazovač zhasne  
     
  // ZÁPIS NA VÝSTUPY  
  END:T"Vystup bit 0-7"// zápis na výstupy  
        
Programový příklad 7.c

Ačkoliv použití instrukce "seznam skoků" výrazně zkrátí zápis, elegantním způsobem programového algoritmu je ale využití strukturované datové oblasti (nebo obdobného řešení podle typu použitého procesoru), v které je po řádcích nadefinovaná tabulka, stejně jako tabulka 1 ....

          
  DB_GENERATOR// TABULKA HODNOT K ZOBRAZENÍ
  VALUEArray[0..9]of Byte
  VALUE[0]Byte16#3F // 2#00111111 ... segmenty pro hodnotu 0  
  VALUE[1]Byte16#06// 2#00000110 ... segmenty pro hodnotu 1  
  VALUE[2]Byte16#5B// 2#01011011 ... segmenty pro hodnotu 2  
  ...
  ...// přiřazení pro hodnoty 3...8  
  ...
  VALUE[9]Byte16#6F// 2#01101111 ... segmenty pro hodnotu 9  
  END  
         

Programový kód je pak velmi jednoduchý ...

        
  L  "Hodnota"// binární kód znaku  
  T#INDEX// inicializace ukazatele  
  L"DB_GENERATOR".VALUE[#INDEX] // načtené hodnoty z tabulky  
  T"Vystup bit 0-7"// zápis na výstupy  
       

Upozornění
Ačkoliv je programový zápis podle příkladu 3 efektivní, má tu nevýhodu, že při hodnotě, která je "mimo" tabulku bude indikována chyba "Out of range", proto je nutno před čtením z tabulky ověřit, je-li hodnota platná (v rozsahu počtu řádků tabulky).
Programový příklad 7.d

Ne každý systém se vyrovná se zápisem podle předchozího případu, proto ještě jedno řešení. Předpokladem je opět po řádcích nadefinovaná tabulka, stejně jako tabulka 1 ....

       
 Adresa
(HEX)
Data
(HEX)
// TABULKA HODNOT K ZOBRAZENÍ  
 A000// bázová adresa umístění tabulky v paměti  
 A0003F// 2#00111111 ... segmenty pro hodnotu 0  
 A00106// 2#00000110 ... segmenty pro hodnotu 1  
 A0025B// 2#01011011 ... segmenty pro hodnotu 2  
 ...  
 ...// přiřazení pro hodnoty 3...8  
 ...  
 A0096F// 2#01101111 ... segmenty pro hodnotu 9  
    

Programový kód je pak následující ...

       
 L  "Hodnota"// (OFFSET) binární kód znaku  
 L1// velikost dat: 1 = 1Byte, 2 = 2Byte (word)  
 MUL// výsledný OFFSET podle velikosti dat  
 LA000H// (BASE) bázová adresa tabulky v paměti  
 ADD// vytvoření adresy v paměti jako BASE + OFFSET  
 LACC0// načtení hodnoty z adresy fyzické paměti, kde adresa paměti je v ACC0  
 T"Vystup bit 0-7" // zápis na výstupy  
      

Programový generátor pro více segmentové zobrazovače

Programový generátor pro více segmentové zobrazovače (9, 14,16 segmentů) se od předchozího logicky liší větším počtem použitých segmentů pro zobrazení znaku a od tohoto se odvíjí počet bitů, které je nutno obsluhovat (9, 14, 16). S vyšším počtem segmentů došlo i potřebě upravit jejich značení, segmenty, které byly rozděleny, dostaly rozšířené označení 1 a 2, nové (další doplněné segmenty) pak označení podle dalších písmen abecedy.

Dále je uveden popis pro 16 segmentový zobrazovač. Pro aplikace se v praxi ustálilo zapojení, že segmentu a1 odpovídá bit 0, segmentu a2 pak bit 1 atd..., bitu 15 segment m. Řízení desetinné tečky je zde nutno řešit samostatně. 16 segmentový zobrazovač s rozmístěním znaků je uveden na obrázku 2. Na obrázku je zároveň naznačeno zapojení ochranných odporů pro omezení proudu, nastavení intenzity jasu a směr protékajícího proudu, v tomto případě se jedná o zobrazovač se společnou katodou.

16 segmentový zobrazovač, rozmístění a
        označení segmentů
Obrázek 1
16 segmentový zobrazovač, rozmístění a označení segmentů.

Vzhledem k tomu, že 16 segmentový zobrazovač poskytuje možnost přiměřeného zobrazení všech běžných znaků, budeme pro realizaci programového znakového generátoru již uvažovat kódování podle ASCII tabulky.

Stejně jako pro 7 segmentové zobrazovače, je potřeba si připravit tabulku, která bude definovat, které segmenty mají být rozsvíceny pro konkrétní znak. Tabulka obsahuje tolik řádků, kolik znaků chceme zobrazovat a pořadí řádku určuje hodnotu kódu znaku. Hodnota "1" bitu/segmentu v tabulce určuje, které segmenty mají být pro konkrétní znak rozsvíceny. V tabulce 2 je uveden příklad pro 16 segmentový zobrazovač a některé vybrané znaky (pro praktické využití je potřeba nadefinovat všechny potřebné znaky).

řádek znak kód ASCII segment segmentový
kód (hex)
m l k j i h g2 g1 f e d2 d1 c b a2 a1
bit
dec. hex. bin. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 řídící
znaky
0 00 00000000 nezobrazují se X
... ... ... ... X
32 31 1F 00011111 X
33 mezera 32 20 0010000 - - - - - - - - - - - - - - - - 0000
34 ! 33 21 00100001 - - - - - - - - - - - - 1 1 - - 000C 1)
35 " 34 22 00100010 - 1 - - - - - - 1 - - - - - - - 4080 2)
36 # 35 23 00100011 - 1 - - 1 - 1 1 1 1 1 1 - - - - 4BF0
... ... ... ... ... ... ...
49 0 48 30 00110000 1 - - 1 - - - - 1 1 1 1 1 1 1 1 90FF 3)
50 1 49 31 00110001 - - - 1 - - - - - - - - 1 1 - - 100C
51 2 50 32 00110010 1 - - - - - 1 - - - 1 1 - 1 1 1 8237
52 3 51 33 00110011 - - - 1 - - 1 - - - 1 1 1 - 1 1 123B
... ... ... ... ... ... ...
66 A 65 41 01000001 - - - - - - 1 1 1 1 - - 1 1 1 1 03CF
67 B 66 42 01000010 - 1 - - 1 - 1 - - - 1 1 1 1 1 1 4A3F
68 C 67 43 01000011 - - - - - - - - 1 1 1 1 - - 1 1 00F3
69 D 68 44 01000100 - 1 - - 1 - - - - - 1 1 1 1 1 1 483F
... ... ... ... ... ... ...
98 a 97 61 01100001 - 1 - - - - - 1 - 1 1 1 - - - - 4170
99 b 98 62 01100010 - - - - - - 1 1 1 1 1 1 1 - - - 03F8
100 c 99 63 01100011 - - - - - - 1 1 - 1 1 1 - - - - 0370
101 d 100 64 01100100 - - - - - - 1 1 - 1 1 1 1 1 - - 037C
... ... ... ... ...                                 ...
 
Poznámky: 1) k tomuto znaku (!) se rozsvěcuje desetinná tečka, vpravo od znaku
2) možnost variabilního zobrazení na pozici (vlevo a střed / střed a vpravo)
3) znak 0 (nula) se zobrazuje jako proškrtnutá, aby se odlišila od znaku O (Ó)

Tabulka 2
Příklad generování znaků pro 16 segmentový zobrazovač.

Tabulka neobsahuje aktivaci segmentu DP (desetinné tečky) a tuto je nutno obsluhovat samostatně, v případě číslice jako oddělovač desetinných míst, u znaku "!" (vykřičník) jako součást tohoto znaku.

Programová obsluha pro 16 segmentů

Programová obsluha pro zobrazovač se 16 segmenty je principiálně stejná jako pro zobrazovač 7 segmentový, pracujeme pouze s větším počtem bitů pro segmenty. Vzhledem k tomu, že se u 16 segmentového zobrazovače předpokládá zobrazování většího počtu znaků, je použití příkladů 7.a a 7.b již nepraktické (ale není zakázané) z důvodu velkého počtu programových řádků a tím i nepřehlednosti.

Pro 16 segmentové zobrazovače je tedy vhodné použít některý z příkladů 7.c nebo 7.d upravené pro 16 segmentový zobrazovač. Prakticky to znamená místo dat velikosti Byte (8 bitů) pracovat s velikostí dat Word (16 bitů). 

Programový generátor pro maticové zobrazovače

Programový generátor pro maticový zobrazovač je samozřejmě možno realizovat i s použitím PLC. Toto řešení je však velmi náročné na časovou obsluhu zobrazovače, respektive několika zobrazovačů (protože řízení pouze jednoho znaku zobrazovače je méně pravděpodobné). Konkrétní řešení by v tomto případě směřovalo k použití jednočipového počítače specializovaného právě na toto řízení maticového zobrazovače.


HMI-AUTOMATIZACE - ŘÍZENÍ - SW GENERÁTOR

 
Publikovaný obsah je určen pouze pro individuální studium.
Není povolena distribuce, prodej, přetisk a použití textu a/nebo vyobrazení (úplný, dílčí a/nebo částečný), použití ke školení a/nebo výuce (hromadné, skupinové nebo zadávané), veřejné a/nebo skupinové prezentace a ani jiné formy šíření v hmotné a/nebo nehmotné podobě.