FOK-GYEM kijelzők protokollja és működése

A Wikipédiából, a szabad enciklopédiából

Ez a szócikk a FOK-GYEM szövetkezet által gyártott, általuk Mobilinformnak [1]nevezett termékcsaládba tartozó utastájékoztató kijelzők működését, illetve a kijelzők által használt kommunikáció felépítését mutatja be.

A FOK-GYEM szövetkezet számos szabadalmat bejegyzett a kijelzők felépítésével, működésével és vezérlésével kapcsolatban, a 1980-as években. Kísérleztek többek között 3, illetve 4 színű képpont gyártásával is, a gyakorlatban azonban ezek nem voltak gyakoriak.

Ezek a kijezők a kétezres évek elején terjedtek el, a BKV Zrt és több vidéki közlekedési vállalat járművein. Utasforgalomban a mai napig megtalálhatóak olyan járművek, melyeket ezekkel a kijelzőkkel szereltek fel.

A technológiából eredő limitációk, a kijelzők elavult vezérlése, és a gyártói támogatás megszűnése miatt azonban számuk rohamosan csökken.

A képpontok felépítése[szerkesztés]

Ezek a kijelzők elektromechanikus úton, mátrix alakban elrendezett, billenőlemezekkel alkotnak képet. A billenőlemezek egyik oldala világos, élénk sárgás-zöld színt kapott, a másik oldala fekete. Egyes kijelzőkön, az adott járat számát jelző képpontok körül piros színű volt a billenőlemezek "világos" oldala, ezzel jelezve a járat gyors vagy expressz mivoltát. Ritkább esetben a teljes kijelző piros színű képpontokat kapott.

Minden egyes képpont áll egy billenőlapból, mely tartalmaz egy bárium-ferrit mágnest. A billenőlap mögött, arra merőleges elrendezésben helyezkezik el az adott képponthoz tartozó tekercs.

A tekercs 15 Ohm ellenállású, 0.1mm² kereszmetszetű rézdrótból épül fel. A billenőlemezek átfordításához a kijelzők vezérlőelektronikája, csak rövid időre, néhány miliszekundum erejéig helyezi feszültség alá a tekercset. Ez a rendkívül rövid idő elég ahhoz, hogy a tekercs végén található vasmagot átpolarizálja, és a billenőlemezt átfordítsa.

A billenőlemezekben található mágnes polaritása, egyes kijelzők esetében, oszlopról oszlopra, más kijelzőkben viszont sakktábla elrendezésben váltakozik.

A képpontokat jellemzően mátrix alakba rendezték el, mely könnyen alkalmazható szöveges illetve grafikus ábrák megjelenítésére is. Az így felépült kijelzőmodulok általában 16 képpont széles, és 7 vagy 16 képpont magas felbontással rendelkeztek, de létezett 8 képpont magas is, mely optimálisabb volt az ékezetes karakterek megjelenítésére is.

A kijelzők hardveres felépítése[szerkesztés]

A kijelzők vezérlése, alkalmazkodva a használati körülményekhez, 24V egyenáramról történik. A kommunikáció a járművön található központi vezérlőegység felé, RS-485 soros buszon történik. Ennek az előnye a szimmetrikus adatátvitelből eredő, közös módusú elektromos zavarelnyomás, hátránya viszont a fél-duplex adatátvitel.

Az RS485 kommunikáció beállításai:[szerkesztés]

  • Baud rate (szimbólumsebesség): 19200
  • Parítás: szóköz (space)
  • adatbitek: 8
  • stopbitek: 2

A központi vezérlőegység, és a kijelzők is a 80C32 típusú 8 bites mikroprocesszor köré épülnek fel. A processzor, és a működéséhez szükséges EPROM, RAM, és egyéb digitális logikai integrált áramkörök egy központi panelen kaptak helyet a kijezőn belül.

Régebbi kivitelű központi paneleken, külön EPROM található meg a kijelzőt vezérlő program, illetve az önteszt funkcióhoz szükséges képek tárolására. AZ EPROM típusa lehet 27C256 vagy 27C512.

A régebbi kivitelű kijelzőkben, a képpontokat tartalmazó modulok még nem tartalmaznak semmiféle vezérlő elektronikát, csupán a képpontok tekercseit, a vezérlésükhöz elengedhetetlen diódákat (1N4002). Ebben az esetben a modulhoz csatlakoztatva van egy úgynevezett "kiírókártya", szakszerűbben multiplexer kártya. Ez a kártya felelős a kijelzőmodul sorainak meghajtására, míg az oszlopok meghajtása, ebben az esetben is közvetlenül a fő vezérlőpanelről érkeznek.

Újabb kivitelű kijelzők esetén a vezérlőpanelen csak egy a processor és egyéb működtető áramkörök mellett, EPROM található meg ebben van eltárolva mikroprocesszor programja és a képteszthez szükséges adatok is. Elhagyták a multiplex kártyákat is, helyette a kijezőmodulra került jellemzően 4 darab meghajtó IC, a sor és oszlopvezérlés ezekhez közvetlenül a vezérlőpanelről történik.

A DIP-kapcsolók[szerkesztés]

A vezérlőpanelen található meg a kijelzők konfigurációjához szükséges kapcsolósor, ún. DIP-kapcsolók.

1 2 3 4 5 6 7 8
Címzés Orientáció Önteszt 1 Önteszt 2

1-5ig a címzést lehet beállítani, a felkapcsolt kapcsolókat bináris 1-nek, a lekapcsolatakat bináris 0-nak értelmezve. Ez a kijelző vezérlőn futó szoftver verzióktól függően lehet invertálva is. Az orientációval a kijelző modulokon a kép 90°-al elforgatható.

A DIP kapcsolók beállítása után kijelzőt újra kell indítani, vagy a vezérlőpanelen lévő reset gombot meg kell nyomni.

Az önteszt kapcsolókat felkapcsolva a kijelző bekapcsolás vagy reset után egy tesztprogramot fog futtatni, amivel könnyen kideríthetőek a hibás pixelek pontos helye, illetve a mechanikusan szoruló pixelek fellazíthatók. Egyes típusokon létezik képteszt is, mely során a beépített EEPROM memóriából kiolvasott képeket jelenít meg egymás után a kijelző.

Az adatstruktúra felépítése[szerkesztés]

Fontos megérteni, hogy a kijelzők csak az ASCII tábla karaktereit tudják értelmezni. Tehát ha bármilyen karaktert küldünk a kijelző felé, akkor nem egyszerűen az adott karaktert küldjük ki soros porton, hanem a karakter ASCII tábla szerinti hexadecimális értékét.  Az adatstruktúra két féle lehet, ebből az egyszerűbbik az, amikor nem küldünk ki képet, csak például a kijelző törlésére, vagy az önteszt elindítására utasítjuk a kijelzőt. Ebben az esetben a felépítés a következő:

STX ADDRESS COMMAND CHECKSUM ETX
  • STX – start of text, az ASCII tábla szerinti 0x02. Minden üzenet ezzel kezd, egy byte hosszú.
  • ADDRESS – kijelző címzése, kiszámítási módját későbbiekben részletezem, két byte hosszú
  • COMMAND –lásd lenti táblázat
  • CHECKSUM – ellenőrző kód, a kiküldött üzenet alapján számolva, 2 byte hosszú
  • ETX – end of text, ASCII tábla szerinti 0x03, minden üzenet ezzel zárul, egy byte hosszú.

A parancsok a következők lehetnek:

Clear Kijelzőkép törlése 0x30, 0x30, 0x30, 0x32, 0x30, 0x42
Self test „hardveres” önteszt 0x30, 0x30, 0x30, 0x34, 0x31, 0x46, 0x30, 0x31
Picture test képteszt 0x30, 0x30, 0x30, 0x34, 0x31, 0x46, 0x30, 0x32
Image upload start képfeltöltés kezdete 0x30, 0x30, 0x30, 0x32, 0x30, 0x43
Image upload end képfeltöltés vége 0x30, 0x30, 0x30, 0x32, 0x31, 0x34

A kijelzőcímzés[szerkesztés]

Mivel a járműveken átlalában több kijelző is megtalálható volt, eltérő funkciókkal, így szükséges minden kijelzőnek egyedi címet adni, mely alapján a központi vezérlőegység meg tudja őket különböztetni.

A kijelzőcímzés átszámítását egy példán keresztül a legegyszerűbb bemutatni. Ha a kijelző címe, a DIP kapcsolók alapján 4-es (általában belső, utastéri kijelző), nevezzük ezt fizikai címnek, akkor, ha csak simán a 4-et, mint egy byte (0x04) küldenénk ki, akkor az az ASCII tábla szerinti EOT, end of transmission lenne. Ez a kijelző számára értelmezhetetlen, emiatt a protokoll előírja a kijelző címek átszámítását.

A példában vett kijelzőnk fizikai címéhez (4) hozzá kell adni 32-t, majd a kapott számot meg kell szorozni 4-el.

(Fizikai cím + 32) * 4 = számított cím

               (4   + 32) * 4 = 144 (decimális) = 0x90(hexadecimális)

Mivel ez az érték (90) két karakter hosszú, így ennek kiküldésére két btye-ra lesz szükség. A protokoll ezt a hexadecimális számot felbontja a két karakterre, és kikeresi a karakterekhez tartozó ASCII tábla szerinti hexadecimális értéket. Előbbi példánkkal élve, így a címzés két byte-ja a következők lesznek: 0x39, 0x30

szemléltető ábra a bájtfelbontáshoz

Létezik egy közös címzés, nevezhetnénk „broadcast” címnek, melyre az RS485-ös buszon lévő összes kijelző reagál, ez pedig a 31-es fizikai cím:

(31+32) * 4 = 252(decimális) = 0xFC(hex) -> 0x46, 0x43 cím bájtok

A checksum (ellenőrzőösszeg) számítása[szerkesztés]

Az adatátviteli hibák kiküszöbölése érdekében, minden üzenetben, annak lezárása előtt a protokoll kiküld egy két byte hosszú ellenőrzőösszeget.

A cheksum-ba a STX és ETX byte-ok nem számítanak bele, csak a kijelző címe, és a parancs. Amikor kijelző felé képet küldünk akkor a címzés, illetve a blokk száma, és a blokkhoz tartozó képinformáció bytejai is beleszámítanak.

Az ellenőrzőösszeg számítása:[szerkesztés]

Azokat a byteokat, amik a beleszámítanak az ellenőrzőösszegbe, összeadjuk és ezt az értéket 256-tal csökkentjük. Ha az így kapott (hexadecimális) szám hosszabb, mint két karakter, akkor a szám utolsó két karakterét (két legkisebb helyiérték) vesszük csak figyelembe. Ezeket a karaktereket a címzésnél bemutatott módon felbontjuk az ASCII tábla szerinti megfelelő értékre. Az így kapott két byte az ellenőrzőösszeg, melyet az üzenet végéhez, az ETX – end of text byte elé illesztünk be.

Példa[szerkesztés]

31-es címre küldjünk egy törlés parancsot, így a teljes üzenet:

0x02, 0x46, 0x43, 0x30, 0x30, 0x30, 0x32, 0x30, 0x42, [checksum 1. byte], [checksum 2. byte], 0x03

A ellenőrzőösszeg számításába csak a vastaggal jelölt byte-ok számítanak bele. Ezeket a számokat először összeadjuk, összegük hexadecimálisan 0x1BD, ezt csökkenteni kell decimális 256-al (hexa 0x100), így a checksum összege 0xBD. Ezt a két karakter hosszú számot felbontjuk az ASCII tábla alapján, így a ellenőrzőösszeg bytejai: 0x42, 0x44 Így a teljes üzenet cheksummal:

0x02, 0x46, 0x43, 0x30, 0x30, 0x30, 0x32, 0x30, 0x42, 0x42, 0x44, 0x03
STX, --ADDRESS--, ------------- COMMAND ------------, -Checksum-, ETX  

A kijelzőkép felépítése[szerkesztés]

A kijelzőkép felépítése a protokoll legbonyolultabb része. A kijelzőkép feltöltése során az adatstruktúra felépítése a következő:

STX ADDRESS BLOCK ID BLOCK LENGTH IMAGE DATA CHECKSUM ETX

Az STX és az ADDRESS a korábban leírtaknak megfelel ez esetben is. Ezt követi a BLOCK ID és a BLOCK LENGTH adatok. Mindegyik adat két-két byte hosszú.

Blokkokra bontás[szerkesztés]

A blokkok mérete és elhelyezkedése

Ha kijelző mérete (felbontása) túl nagy, akkor a kijelzőképet blokkokra kell bontani. A blokkokra bontást a következő esetekben kell megtenni:

1.       Ha a kijelző vízszintes felbontása nagyobb, mint 96 képpont

2.       Ha a kijelző függőleges felbontása nagyobb, mint 8 képpont

A blokkok elhelyezése táblázatos, az első blokk mindig bal fent, az utolsó mindig jobb lent helyezkedik el.

A blokkok számát a kijelzőkép kiküldése során meg kell jelölni. Az adatfolyamban az adott blokk száma a kijelzőcím mögött helyezkedik el. Itt nincs semmilyen átszámítás, az 1-es blokk értelemszerűen hexában 0x01, ennek az ASCII tábla szerinti felbontása a korábban ismertetettek alapján 0x30, 0x31, és így tovább a többi blokkal. A blokk száma után annak hosszát (horizontális felbontását) is meg kell jelölni, itt viszont a valós értéket szorozni kell kettővel, majd az ismert módon az ASCII átváltást elvégezni. A blokkok szélessége bármekkora lehet.

Ha a kijelző keskenyebb, vagy pontosan 96 képpont széles, akkor a blokk szélessége egyenlő a kijező teljes szélességével. Ha a kijelző szélesebb, mint 96, például a homlokfali kijelzők, akkor érdemes blokk szélességet 96 pixel alatt tartani, célszerűen a kijelző teljes horizontális felbontásának felénél meghúzni a két blokk közti határt.

Egyes esetekben, ha a kijelző több blokkot várna, tehát pl 96 széles x 16 pixel magas kijelzőre küldünk adatot, tehát a kijelzőképet két blokkra kéne osztani, akkor az egyik blokk elhagyható. A képfeltöltés kezdete után, az első blokk képinformációja után, a második blokk helyett egyből küldhető a képfelöltés vége üzenet, és a kijelző ez esetben is meg fogja jeleníteni a képet, és csak a kiküldött blokk helyén fog frissülni a megjelenített tartalom.

Régebbi típusú, ún. „volános” kijelzők esetében, a teljes kép elrendezése más. A kijelző oszlopainak első 32 tagja kerül kiküldésre legkésőbb. Az első oszlop, amely elsőnek kiküldésre kerül, az a teljes kijelzőkép 33. oszlopa, innen halad a kép felépítése a kijelző legutolsó (jobb szélső) oszlopáig, majd visszaugrik és folytatja a kijelző első oszlopával.

A pixelmátrix felépítése[szerkesztés]

A képpontok kiolvasásának sorrendje

A minden blokkon belül a kijelzőkép első képpontja a bal alsó sarokban lesz. Innen felfele haladva épül fel az első oszlop. Ha a blokkon belüli első oszlop felépítése kész, akkor az oszlop számát egyel növelve, a második oszlop alsó képpontjával folytatódik a kép.

Ez így megy míg a blokk végére nem értünk, utána a blokk számát egyel növelve folytatódik a teljes kijelzőkép felépítése. A kijelzőkép adatfolyama hordozza a pixelek állását jelölő bájtokat. Ez a teljes protokoll leghosszabb része, mert minden esetben az adott blokk összes képpontjának állását ki kell küldeni.

Mivel minden képpontnak csak két állása lehet, így kézre eső minden pixel állását egy bittel jelezni. Ha egy adott képpontot, a világos oldalára akarunk állítani, akkor az a protokoll szerint egy bináris egyesnek felel meg, ha a sötétre, akkor bináris 0. Az így kialakult bináris számot, az adott oszlop aljáról kezdve, felfele olvassuk ki.

A képpontok állásának kiolvasása, helyiértékek és átváltás

Itt fontos megjegyezni, hogy a 7 pixel magas kijelzőknél, az alsó bájt csonka maradna. Ezt elkerülendő, a protokoll a legalsó alatti, valóságban nem létező, „fantom” pixelt mindig 0-nak értelmezi. Ezeket az ábrán szürkével jelöltem.

Az ábrán látható példával tehát, ha lentről felfele olvassuk ki a két bájtot, MSB (most significant bit) értelmezésben, a 8-as helyiérték lesz az első pixel, ami a képet felépíti, akkor az alsó bájt decimális értéke 7, az hexában szintén 0x07, az ASCII megfelelője pedig 0x37.

A felső bájté pedig decimális 12, tehát hexában 0x0C. A „C” karakter ASCII megfelelője pedig a 0x43-as hexadecimális szám.

A konkrét képinfromációt hordozó üzenetnek nincs külön parancsa, csak a szokásos STX, a kijelző címe átszámítva az ismertetett módon, majd a blokk száma és hossza, majd maga a képinformációt hordozó bájtok, majd checksum és ETX.

Ellenben, minden képfeltöltés kezdetét és végét külön paranccsal kell jelezni a kijelző felé. Ezeket a parancsokat egyenként, valamint minden képtartalmat hordozó üzenetet, ugyanúgy el kell látni STX és ETX bájtokkal, ellenőrzőösszegel és címzéssel.

Képfeltölés kezdete 0x30, 0x30, 0x30, 0x32, 0x30, 0x43
Képinformáció (blokk(ok)) lásd fent
Képfeltöltés vége 0x30, 0x30, 0x30, 0x32, 0x31, 0x34

Egy kép felöltése tehát legalább 3 különálló üzenet a kijelző felé, amennyiben csak egy blokkból áll a kijelző. Ha több blokkot is tartalmaz, a blokkokat ugyan különálló üzenetekre kell osztani, de közöttük nem kell ismételten más parancsot küldeni. Egyes üzenetek között legalább 0.2-0.3 másodperc szünetet illik tartani, ellenkező esetben a kijelző lefagyhat.

Nyugtázás kérése[szerkesztés]

Ez az egyetlen eset, amikor a kijelző küld a vezérlőegység felé adatot. A nyugtázási kérelem során kiküldött adatfolyam más felépítésű, mint a többi, ez a legrövidebb.

Ebben az esetben az adatcsomag felépítése a következő:

Az adatcsomat itt is STX bájttal kezd, és ETX bájttal zárul. A kettő között csupán a kijelző címe található meg, egyel növelve. Korábbi példákkal élve, a kijelzőnk címe 4-es volt, a protokoll szerinti átalakítás után ez 0x39, 0x30 bájtoknak felel meg, de mivel itt nyugtázási kérelmet küldünk a kijelző felé, ezért ennek az értékét egyel növelve lett 0x39, 0x31 a kijelző cím.

02 39 31 03

A nyugtázásra, ha a kijelző elérhető az adott kommunikációs vonalon, akkor küld egy nyugta üzenetet, mely minden esetben:

30 36

Ezt ugyanúgy kell értelmezni, mint a korábbi adatokat:

A 0x30 az ASCII tábla szerint 0-nak felel meg, a 0x36 pedig 6-nak. Az üzenet tartalma így 06, amely az ASCII tábla szerinti jelentésében "acknowledgement", avagy nyugtázás.

Példák[szerkesztés]

A könnyebb érthetőség miatt, a későbbiekben néhány példa látható. Az adatfolyamban egyes bájtok jelentését színkóddal láttam el.

Az adatfolyam felépítése egy 7x96 felbontású kijelzőre küldött kép esetén
Szín jelentés
Zöld STX vagy ETX byte
világoskék Címzés
piros Blokk száma
sötétkék Blokk hossza
citromsárga Parancs
fehér Képtartalom
rózsaszín Ellenőrzőösszeg

Nyers képadat (7x96, 31-es cím):[szerkesztés]

02 46 43 30 30 30 32 30 43 42 45 03
02 46 43 30 31 43 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 37 46 30 39 30 39 30 39 30 33 30 30 33 45 34 31 34 31 34 31 33 45 30 30 37 46 30 38 31 34 32 32 34 31 30 30 30 38 30 38 30 38 30 38 30 30 33 45 34 31 34 31 34 39 33 41 30 30 30 37 30 38 37 30 30 38 30 37 30 30 37 46 34 39 34 39 34 39 36 33 30 30 37 46 30 32 30 34 30 32 37 46 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 03
02 46 43 30 30 30 32 31 34 42 30 03

Nyers képadat (16x96, 31-es cím):[szerkesztés]

02 46 43 30 30 30 32 30 43 42 45 03
02 46 43 30 31 43 30 30 33 46 39 30 34 43 32 43 32 43 32 43 32 42 41 34 41 43 41 46 41 46 32 45 32 43 32 38 32 30 34 46 38 30 30 30 32 30 32 30 41 46 41 46 41 38 41 38 41 31 41 33 32 30 32 45 32 46 32 31 41 30 41 31 41 46 32 45 32 30 32 30 41 46 41 46 41 38 41 43 32 45 41 33 41 31 41 30 41 30 32 30 32 30 32 30 32 30 32 30 32 30 32 38 32 30 32 30 32 45 32 46 32 31 41 30 41 30 41 33 41 37 32 30 32 30 41 33 41 37 41 45 41 43 32 45 41 37 41 33 41 30 41 30 32 30 41 46 41 46 41 38 41 38 41 31 41 33 32 30 32 30 32 30 41 46 41 46 41 38 41 30 32 38 41 46 41 46 41 30 41 30 32 30 32 30 34 46 39 30 33 33 41 03
02 46 43 30 32 43 30 43 30 39 46 32 30 34 31 34 33 34 37 34 46 35 46 35 33 35 32 35 44 34 33 34 33 34 33 34 33 32 30 31 46 30 30 34 30 34 30 35 30 35 46 35 46 35 30 34 30 34 31 34 30 34 30 34 37 34 46 35 38 35 30 35 38 34 46 34 37 34 30 35 30 35 46 35 46 35 31 34 30 35 33 35 46 35 43 35 30 34 30 34 30 34 36 34 33 34 33 34 33 34 33 34 31 34 30 34 30 34 37 34 46 35 38 35 31 35 46 35 46 35 31 34 30 34 30 34 30 34 30 35 30 35 46 35 46 35 30 34 30 34 30 34 30 35 30 35 46 35 46 35 30 35 30 35 39 34 43 34 30 35 30 35 46 35 46 35 30 34 33 34 45 34 33 35 30 35 46 35 46 35 30 34 30 32 30 39 46 43 30 44 45 03
02 46 43 30 30 30 32 31 34 42 30 03

Törlés (31-es cím):[szerkesztés]

02 46 43 30 30 30 32 30 42 42 44 03

Önteszt (31-es cím):[szerkesztés]

02 46 43 30 30 30 34 31 46 30 31 32 35 03
  1. Mobilinform kijelzők városi járműveken (magyar nyelven). iho.hu. (Hozzáférés: 2024. május 11.)