Egy PO-824 szövegkijelző tesztelése

Adott egy régi olasz gép, aminek SIMATIC S5 PLC a vezérlője. Hogy a géphez ne kelljen "űrhajós pult" ezer kapcsolóval és lámpával, egy nyomógombos szövegkijelzőt is tett bele a gyártó.
Sajnos a sors úgy hozta, hogy szükségessé vált a kijelző kipróbálása valamilyen módon.  Erről szól ez az írás.
A kipróbáláshoz azonban ismerni kell a működését, amiről nem sok információt tartalmaz a gép gyári dokumentációja. Szerencsére a bekötési rajzot igen. Azokban az időkben még nem volt annyira egységes a Siemens PLC-khez illeszthető operátorpanelek (HMI-k) kínálata, ezért sok gyártó jött ki sokféle egyedi megoldással (leginkább merőben eltérőekkel). Ezen megoldások egy része a PLC soros kommunikációs csatlakozását használta ki a PLC-vel való kapcsolattartásra, más megoldások közönséges ki és bemeneteket használtak fel erre a célra. Ez a kijelző is ilyen. Típusa PO-824.



A különböző kijelzők és panelek sokféle hardver megoldása a szoftveres kezelés sokféleségét is magával hozta. Más szóval: ahány, annyi féle, minden tekintetben.

A PO-824 a PLC 8db 24V-os kimenetét és 8db 4V-os bemenetét használja fel a kommunikációra. Ezer szerencse, hogy a kijelző működése egyszerű, nem tartalmaz processzort és nem a soros porton kommunikál. Tehát nem intelligens. Annál nehezebb viszont a PLC-ből kezelni. A 8 ki és bemeneten keresztül olvasható a PO-824 24 billentyűje és ezek segítségével lehet karaktereket írni a 2x40 karakteres fluoreszens (VFD) kijelzőre. A kijelző kezelésére van elektronika a panelben, ezért nem pixelenként kell összerakni a betűket, 7 bites ASCII karakterkódokat kell neki küldeni.
A kijelző teszteléséhez egy S7 PLC-t használtam fel, aminek 8 be és kimenetére bekötöttem a kijelzőt az alábbi hevenyészett ábra szerint:

             

A kijelző hátulján egy 25 pólusú (DB25) csatlakozó van. A rajzon a kijelző kivezetéseinek számozása ennek a csatlakozónak a számozása szerint lettek feltüntetve. Az eszköz 24V DC tápfeszültséget igényel. A csatlakoztatás tehát egyszerű, bár felemészt néhány I/O pontot...



A képen látható taknyolás is jól mutatja mennyire próba jellegű a dolog :) A színes, sok eres, lógó kábel vezet a PO-824-hez. Ez az S7 PLC egy gyakorló példány, ami jelenleg kísérletezés célját szolgálja.
Miután a csatlakozás kész és a kijelző kap tápfeszültséget minden további lépés szoftveres kérdés. És ez valamivel nehezebb.

A billentyűzet olvasása

A PO-824 billentyűi mátrixba vannak kötve 8x3-as elrendezésben. A három billentyűsort egy-egy kiválasztó jellel lehet megszólítani, ami a PLC Q8.0, Q8.1 és Q8.2 kimenete. A 8 oszlop egyenesen kijön az eszköz 8 kimenetén, be a PLC I1.0-I1.7 bemeneteire.



Az ábrán látható sárga gombok az alattuk húzódó vonalak találkozási pontjait kötik össze amikor le vannak nyomva.
Ha tehát bekapcsoljuk a Q8.0 kimenetet, a mátrix első sora lesz +24V-os feszültség alatt. Ha nincs megnyomva egy gomb sem, akkor az össze bemenet 0 állapotú. Ha az első sorban megnyomnak egy gombot, akkor a gombhoz tartozó oszlopra a gomb az első sorban rákapcsolt 24V-ot átadja a gombnak megfelelő oszlopra, ami az oszlopnak megfelelő bemenetre fut be. Például ha az F4 gombot nyomják le, akkor az I1.4-es bemenet fog bekapcsolni.
A gombok beolvasásához tehát nem kell mást tenni, mint sorban egymás után kiadni a sorkiválasztó kimenetekre a 24V-ot, majd mindegyiknél beolvasni I1.0-I1.7 bemeneteket.

Két módszer is kézenfekvő a gombok olvasására.
Az egyik módszer szerint egymás után bekapcsolgatjuk a sorkiválasztó kimeneteket, mindegyik után beolvassuk az 1-es input byte-ot (IB1), és elraktározzuk egy külön byte-ban. Így lesz 3 byte-unk, bennük 24 bittel, ahol minden bit megfelel egy nyomógombnak. Ha az adott bit 1 állapotú, akkor a hozzá tartozó gomb le van nyomva. A harmadik csoport kiolvasása után kezdjük elölről.
A másik módszer annyiban tér el, hogy nem kapcsolgatjuk folyamatosan sorban a billentyűsorokat megállás nélkül, hanem bekapcsoljuk mindhárom csoportkiválasztás kimenetet és várunk :) Figyeljük az IB1 byte állapotát (IB1 tartalmazza I1.0-I1.7 bemeneteket). Amikor az IB1 tartalma nullától eltér, akkor megnyomtak egy (vagy több) gombot. Mivel ekkor még egyszerre több sor is ki van választva, nem lehet megállapítani melyik csoporthoz tartozik a lenyomott gomb. Ezután még ki kell adni egymás után a 3 csoportkiválasztást, mindegyik után beolvasni IB1-et, stb, éppen ahogy fent is, ám a 3 csoport beolvasása után nem kezdjük elölről az 1. csoporttal, hanem megint bekapcsoljuk mindhárom csoportkiválasztást és várunk amíg IB1 ismét nullától eltérő lesz.

A billentyűk olvasására a folyamatos szkennelés módszerét választottam, így erről lesz szó.
Van itt azonban egy probléma, ami a PLC működéséből adódik.
Nevezetesen az, hogy nem írhatjuk egymás után a csoportkiválasztó kimenetek bekapcsolását, majd a bemenet beolvasását, majd a következő csoportkiválasztás kiküldését, stb. így:
L 1
T QB8 //1-es csoportkiválasztás bekapcsolása
L IB 1 //A billentyű oszlopok beolvasása
T MB1 //Az 1-es billentyűcsoport bitjeinek tárolása MB1-ben
L 2
T QB8 //2-es csoportkiválasztás bekapcsolása
L IB 1 //A billentyű oszlopok beolvasása
T MB2 //A 2-es billentyűcsoport bitjeinek tárolása MB2-ben
L 4
T QB8 //3-as csoportkiválasztás bekapcsolása
L IB 1 //A billentyű oszlopok beolvasása
T MB3 //A 3-as billentyűcsoport bitjeinek tárolása MB3-ban
Ez így nem működőképes, mert a PLC csak a ciklus végén fogja a fizikai kimenetekre kiírni a QB1 tartalmát. Továbbá a programban egy cikluson belül hiába olvassuk be többször is egy bemenet állapotát, mindig ugyanazt fogjuk kapni, mert a PLC a ciklus elején (mielőtt elkezdené futtatni a felhasználói programot) először a rendszer szintű adminisztrációs tevékenységei során egyszer beolvassa a fizikai bemenetek állapotát és a program számára a cikluson belül mindig ezt a változatlan értéket adja vissza. Természetesen a következő ciklusban újra beolvassa, de a lényeg, hogy a cikluson belül egy bemenet állapota sem változik meg, történjen akármilyen változás is a PLC fizikai bemenetein.



Igaz ugyan, hogy vannak speciális utasítások amik lehetővé teszik a cikluson belül is a fizikai be és kimenetek közvetlen kezelését, de szerintem kár lenne ide azokat alkalmazni. Arról nem is beszélve, hogy használatukkal újabb probléma merülne fel; az időzítések problémája.
Amikor a programunk kiírja a soron következő csoportkiválasztó kimenetre az 1 állapotot, nem olvassuk be azonnal az IB1-et, hogy nyomtak-e meg gombot, mert úgy is nullát kapunk a fentebb tárgyalt okok miatt. Kiírás után meg kell várnunk a következő PLC ciklust és csak abban kapjuk meg az IB1 valós állapotát, amit már megfelelően elraktározhatunk. Ekkor megint várni kell egy ciklust, bekapcsolni a következő csoportkiválasztást, majd ismét várni egy ciklust, beolvasni az IB1-et, elraktározni egy másik változóba, várni egy ciklust, és így tovább.
A konkrét programrészlet megtalálható a letölthető Step7 projectben.

Írás a kijelzőre

A kijelzőre való írás annyiból áll, hogy 7 bites ASCII karaktereket küldünk a PLC-ből. A kijelzőnek van egy kurzora, a küldött karakter a kurzor pozíciójában jelenik meg, a kurzor pedig egyel jobbra mozdul. Ha a kurzor az első sor végén áll, akkor átlép a második sor elejére, ha a második sor végén áll, akkor az első sor első karakterére lép.
A kurzor alatt lévő karakter törlődik (ha van ott karakter). A kurzort alapesetben egy statikus aláhúzás karakter reprezentálja.
A kijelzőnek lehet küldeni speciális vezérlő karaktereket is, mint pl. a kurzor adott helyre pozicionálása, a kijelzőtartalom törlése, a kurzort elrejtése, megjelenítése, stb.

A kijelzőre a Q8.0-Q8.7 PLC kimenetekkel lehet karakter küldeni. A figyelmes olvasónak nyilván feltűnik, hogy a Q8.0, Q8.1 és Q8.2 kimeneteket a PO-824 a billentyűzet csoportok kiválasztására már használja. Ez így van, ennek a három bitnek kettős a funkciója. Ezért a kijelző írása közben nem lehet a billentyűzetet olvasni és viszont. Ez azonban különösebb problémát nem okoz.
A 7 bites ASCII kód bitjeit a Q8.0-Q8.6 kimeneti bitekre kell kiküldeni, majd a Q8.7 kimenettel beírni. A Q8.7-es kimenet a kijelző "strobe" kapuzó jele. Amikor a Q8.7 kimenet 0-ról 1-re vált (felfutó él) a kijelző beolvassa a Q8.0-Q8.6 kimenetek által kiküldött bit állapotokat, és az azoknak megfelelő ASCII karaktert kirakja a kijelzőre oda, ahol a kurzor éppen áll, majd a kurzort egyel tovább mozgatja.

Vegyünk egy egyszerű példát. Küldjük a kijelzőre A "Hejj" szöveget:
A jobb oldali ábrán látható kódokat kell kiküldeni egymás után a QB8 kimeneti byte-ra, minden küldés után  megvárva a következő PLC ciklust.

Ez kb. az alábbi idődiagramot eredményezi a kijelző adatbemenetein és beíró bemenetén:



A karakterek küldése alatt a billentyűzet letapogatását átmenetileg fel kell függeszteni a QB0-QB3 több funkciós adatbitek miatt!
A karaktereket tehát az ASCII kódjuk elküldésével lehet megjeleníteni. Egy 7 bites ASCII kódtábla az alábbi:

Bináris Dec Hex Karakter
0010 0000 32 20 szóköz
0010 0001 33 21 !
0010 0010 34 22 "
0010 0011 35 23 #
0010 0100 36 24 $
0010 0101 37 25 %
0010 0110 38 26 &
0010 0111 39 27 '
0010 1000 40 28 (
0010 1001 41 29 )
0010 1010 42 2A *
0010 1011 43 2B +
0010 1100 44 2C ,
0010 1101 45 2D -
0010 1110 46 2E .
0010 1111 47 2F /
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?
      
Bináris Dec Hex Karakter
0100 0000 64 40 @
0100 0001 65 41 A
0100 0010 66 42 B
0100 0011 67 43 C
0100 0100 68 44 D
0100 0101 69 45 E
0100 0110 70 46 F
0100 0111 71 47 G
0100 1000 72 48 H
0100 1001 73 49 I
0100 1010 74 4A J
0100 1011 75 4B K
0100 1100 76 4C L
0100 1101 77 4D M
0100 1110 78 4E N
0100 1111 79 4F O
0101 0000 80 50 P
0101 0001 81 51 Q
0101 0010 82 52 R
0101 0011 83 53 S
0101 0100 84 54 T
0101 0101 85 55 U
0101 0110 86 56 V
0101 0111 87 57 W
0101 1000 88 58 X
0101 1001 89 59 Y
0101 1010 90 5A Z
0101 1011 91 5B [
0101 1100 92 5C \
0101 1101 93 5D ]
0101 1110 94 5E ^
0101 1111 95 5F _
       
Bináris Dec Hex Karakter
0110 0000 96 60 `
0110 0001 97 61 a
0110 0010 98 62 b
0110 0011 99 63 c
0110 0100 100 64 d
0110 0101 101 65 e
0110 0110 102 66 f
0110 0111 103 67 g
0110 1000 104 68 h
0110 1001 105 69 i
0110 1010 106 6A j
0110 1011 107 6B k
0110 1100 108 6C l
0110 1101 109 6D m
0110 1110 110 6E n
0110 1111 111 6F o
0111 0000 112 70 p
0111 0001 113 71 q
0111 0010 114 72 r
0111 0011 115 73 s
0111 0100 116 74 t
0111 0101 117 75 u
0111 0110 118 76 v
0111 0111 119 77 w
0111 1000 120 78 x
0111 1001 121 79 y
0111 1010 122 7A z
0111 1011 123 7B {
0111 1100 124 7C |
0111 1101 125 7D }
0111 1110 126 7E ~

A táblázat csak a nyomtatható karaktereket tartalmazza. Nem zongoráztam végig az összes kódot a kijelzőn, így a speciális karaktereknél lehetnek eltérések, de nagy különbségre nem kell számítani, az ASCII az ASCII :)
Fontos azonban az a néhány vezérlő karakter, amit a kijelző értelmez. Ezek az alábbiak (decimálisan):

Kód (decimálisan) Funkció
10 Sor emelés (LF). A kurzor a kijelző második sorába ugrik abban az oszlopban ahol éppen van. Ha a kurzor már a második sorban van, akkor a felső sort törli, az alsót felülre gördíti és alulra behoz egy üres sort.
13 Kocsi vissza (CR). A kurzort a sor elejére teszi. A kijelzőtartalom változatlan marad
16 <n> Kurzor pozicionálása. n=1...80 A 16-os kód után egy számot kell küldeni, ami megadja hogy a kurzort hova kell elmozdítani. A második sor eleje a 41, a második sor második karaktere a 42-es, pozíció és így tovább...
19 Kurzor bekapcsolása. A kurzort megjeleníti. ha a kurzor már be van kapcsolva, akkor nincs hatása.
20 Kurzor kikapcsolása. A kurzort eltünteti. Ha már ki van kapcsolva, akkor a kódnak nincs hatása. A kurzor kikapcsolva is létezik, mozgatható, stb, csak nem jelenik meg a kijelzőn.
31 Törlés. Törli a kijelzőt és a kurzort az első sor elejére helyezi.

A teszt project

A kijelző tesztelésére készítettem egy Step7 projectet. A project tartalmaz egy ProTool projectet is, ami ProTool RT-n keresztül a fejlesztői PC-n biztosít egy kezelői felületet a kijelző kipróbálásához.
A projectben természetesen van egy S7 blokk, ami írja a kijelzőt és olvassa a nyomógomb mátrixot. Ha ezt a projectet letöltjük egy S7-be, aminek a megfelelő ki és bemeneteire rákötjük a PO-824 megfelelő kivezetésit (a rajzot lásd fent), a PO-824 tesztelhető.

Az FB12-es funkció blokk kezeli a kijelzőt és a billentyűzetet is:


Paraméterek:


A KB_B1, KB_B2, KB_B3 kijövő paraméter 3 byte, azaz 24 bit. E három byte minden bitje megfelel a PO824 egy-egy nyomógombjának. Amikor egy gomb le van nyomva, a hozzá tartozó bit 1 állapotú lesz.
Az FB12-es blokkba csak erős idegzetűek nézzenek bele, vagy inkább azok se, mert próba lévén, a kód kissé.. hmm... hevenyészett. Tele van meggondolatlanságokkal és fölösleges kacifántokkal.
Az S7 projectben A DB1-es adatblokk rejti a stringet amit a kijelzőnek küld, ezt a stringet a ProTool RT tölti fel azzal a tartalommal, amit beleírunk a PC-n.
Természetesen más ki és bemenetekre is rá lehet kötni a kijelzőt. Ilyenkor megfelelően át kell írni az FB12 blokk hívásánál a PO_In és PO_Out paramétereket, hogy arra a ki és bemeneti byte-ra mutassanak, amelyikre a kijelzőt kötöttük.

A ProTool rész három képernyőből áll. Az első képernyőn két input sor van, az egyikbe a szöveget írhatjuk, a másikba pedig vezérlő karaktert, amit a kijelzőnek el akarunk küldeni. A küldés a mező melletti "küldés" gomb megnyomásakor történik meg.
Alul a PO-824 nyomógombjait láthatjuk. Ha az S7-hez kapcsolt PO-824-en megnyomunk egy gombot, akkor a ProTool RT a megnyomott gombot inverzre váltja, amíg meg van nyomva. Így tesztelhető a billentyűzet. A rajz körül kevés magyarázat is látható, ami segít eligazodni a bitek és kódok között.



A másik képernyő a cikk elején is látható kapcsolási rajzot tartalmazza, a harmadik a billentyűzet mátrix elrendezését, ami ugyanúgy viselkedik az RT-ben mint az első képernyőn látható gombok. Vagyis a valós PO-824 gombnyomásai azon a képernyőn is láthatóak.

A project letölthető ZIP file-ban: PO824teszt.zip (kb: 400k)

Vissza

Szirty