Fórum témák
» Több friss téma |
Fórum » Nextion érintőképernyős HMI, UART kommunikációval
Témaindító: Lamprologus, idő: Máj 5, 2016
Témakörök:
Szuper...így működik, köszönöm.
![]() Viszont így felvetődik a kérdés, hogy mire való a Toolboxban létrehozott változó vscope paramétere(local/global)? És egy másik kérdés is: Jól látom, hogy csak 3db globális változó hozható létre? Ez nem kevés a gyakorlatban?
1: Jó kérdés.
2: Nem. A sys0 - sys2 változók gyári változók, kapod, mint szamár a füleket. 3: Én úgy látom, hogy gyakorlatban az a legjobb megoldás ha mindent a kontroller csinál, a kijelző csak mint egyszerű kijelző szerepel felvértezve az érintésérzékelés tudományával.
Szia
Pageneve.va0 -al tudsz rá hivatkozni, akkor bárhonnan eléred. pl.: page2.va0=10 Üdv.
Köszönöm, szintén működik.
![]() Bakman: 2. Azt értem, hogy kapom őket...inkább az volt kérdéses számomra, hogy nem-e kevés a 3db. Mert ahogy látom, ebből nincs több. 3.Az a terv nálam is, hogy a lehető legtöbb dolgot a kontroller végezzen. Ez a része majd most következik, gondolom ez lesz a neheze. ![]()
Ez így sajnos nem kezeli a változókat. De a vissza gomb megyomásával ellenőrizhted a váltózód értékét. (if..then...) és az értékétől függően oda ugrassz ahová kell.
Egy ideig én is azt a megoldást próbáltam, hogy a "kijelzőn belül" oldottam meg a lapváltásokat ... csak néha eltévedt a PIC, nem tudta épp melyik kijelző az aktuális, vagy csak még nem törtödött be teljesen az adott kijelző, de a PIC már küldte volna rá az adatokat, jött vissza hibaüzenet, hogy hibás parancs ... aztán átalakítottam az egészet, úgy, hogy a gombnyomás elmegy a PIC-nek, az meg visszaküldi hogy melyik lapot töltse be... azóta stabilabb a dolog, nincsenek eltévedések.
Idézet: „Viszont így felvetődik a kérdés, hogy mire való a Toolboxban létrehozott változó vscope paramétere(local/global)?” Ha jól tudom akkor globális változónál, ha kilépsz az oldalról akkor megtartja az értékét, és ha visszalépsz az adott lapra akkor nem 0 lesz az adott változó értéke, hanem ami előzőleg volt. Localis változónál nullázza.
"Én úgy látom, hogy gyakorlatban az a legjobb megoldás ha mindent a kontroller csinál, a kijelző csak mint egyszerű kijelző szerepel felvértezve az érintésérzékelés tudományával."
Ne haragudj, de ez egy nagy marhaság. Éppen az a lényege ennek a kijelzőnek, hogy ez egy intelligens kijelző, egy csomó mindent meg lehet vele csinálni. Én ami feladatot lehet, a kijelzőre bízom (képváltás, gombok teljeskörű kezelése, adatbetöltés-frissítés, billentyűzet, stb.) és a uC a lehető legkevesebb feladatot kapja a kijelző felé. És tökéletesen működik. Az egész programozás kérdése. Nem mondom, hogy nem hiányzik belőle jónéhány funkció, de már a mostani állapotában is nagyon sok minden megoldható kijelzőn belül.
Kinek a pap, kinek a paplan.
![]() A hozzászólás módosítva: Dec 9, 2016
Próbáld megoldani kijelzőről a lapváltás korrekt kezelését, ha pl. belépsz egy grafikont tartalmazó oldalra, a PIC meg elkezdi küldeni a grafikonnak az adatokat ( 4 görbe, görbénként 250 adatpont). Közben Te meg nyomsz egy gombot és a kijelző átlép a következő ablakra. A PIC meg csak tolja az adatokat, de azon az oldalon már nincs ami fogadja... és jönnek vissza a hibajelzések ... amit vagy fel tud dolgozni a PIC idejében és leállítja az adatküldést, vagy nem ... és ha esetleg közben újabb lapváltás jön, válogasd ki a hibajelzések közöl ... túlcsordulhat a puffer, elveszik a lapváltás infó, és a PIC már azt sem tudja mit mutat a kijelző...
Szóval én azt hiszem maradok annál a megoldásnál, hogy intézze a PIC a lapváltásokat!
Programozás kérdése az egész. Ha úgy működik, ahogy leírtad, az nem feltétlen a képernyő hibája, hanem, hogy rossz a megírt program.
Ha megnyomod a gombot, akkor először el kell küldeni a PIC-nek azt a parancsot, hogy állítsa le az adatküldést, majd attól függően, hogy hogyan van megírva az adatátvitel a PIC-ben, lehet képet váltani a kijelzőn. Nyilván az egész függ a PIC-en megírt programtól is. De persze mindenki úgy használja a kijelzőt, ahogy akarja. Ha valaki inkább PIC oldalról programoz le olyan dolgokat, ami beépítetten benne van, azzal szívjon ő. ![]() Kicsit olyan ez, mintha lenne egy full extrás autóm, de amikor használni akarom, akkor beülök, de nem használom a beépített "funkciókat", hanem megkérek két embert, hogy toljon már el a sarki boltig. ![]()
Én mindent, amit lehet a kijelzőn belül oldok meg: képernyőn történő adatbevitel, nyomógombokra történő események kezelése, állapotok eltárolása, lapváltás, adatok mentése, stb.
Van egy kezdeti adatfeltöltésem és ezeket az adatokat globális változókban tárolom (és úgy kezelem ezeket, mint egy struktúrált adatokat tartamazó tömb), míg egy részét a beépített eeprom-ba. Nekem a kijelzőn 6 olyan egységnek az adatai jelennek meg (nem egyszerre), amely egységek egyenként 4x2 hőmérsékleti adatokat kezelnek, a megadott adatok és a hőmérsékleti adatok alapján szivattyúkat, mágneskapcsolókat kapcsolnak, hiba esetén értesítést küldenek, stb. Ezek és a központ RS422-n kommunikálnak. A fentebb írt struktúrált tömb kezelés amiatt kell, mert a 6 egység adatainak nagy részét áttöltöm a kijelző memóriába (az adatstruktúra minden egység esetében megegyezik), amit csak akkor frissítek, amikor változás van, így nincs terhelve feleslegesen a PIC, az végezheti a saját feladatait, nem kell még a kijelzővel is foglalkoznia (pl. lapváltás, stb.).
Idézet: „Van egy kezdeti adatfeltöltésem és ezeket az adatokat globális változókban tárolom” Ezt hogyan csinálod? Pl. az 3-as lapon van egy szöveges változód azt globálissá teszed, az 5-ös lapon van egy másik szöveges változód, ami szintén globális, ezeket hogyan töltöd fel, anélkül, hogy az adott lapot kiválasztanád előtte? Idézet: „míg egy részét a beépített eeprom-ba.” Ahhoz hogyan férsz hozzá? Idézet: „nagy részét áttöltöm a kijelző memóriába” Ezt hogy csinálod? Milyen paranccsal?
Csak óvatosan szeretnék a témához szólni, lévén nem volt még szerencsém ehhez a kijelzőhöz, csak érdekel a téma. Viszont az adott problémával volt már dolgom.
GLCD kijelzők használata esetén a kijelzőt nálam külön PIC kezeli. Minden, a kijelzéssel kapcsolatos adatot ez a PIC tárol. Képernyőket, szöveges változókat, azok pozícióit, számváltozók karakterkészletét, a számváltozók képernyő-pozícióját, a megjelenítéshez szükséges műveletek rutinjait, stb. Valamint lekezeli a hozzá kapcsot billentyűzetet és a gombokat. Viszont maguk a számváltozók nincsenek a programjában. A főáramköri PIC 10msec-enként lekérdezi a billentyűzet és a gombok állapotát. Ez alig néhány byte-nyi információ, tehát hamar megvan. A továbbiakban csak akkor diskurál a kijelzővel, ha a rajta lévő tartalmat változtatni kell. Ezt pedig a következő képen teszi: Első byte a képernyő sorszáma. A kijelző vezérlőben minden sorszámhoz külön rutin tartozik, ami csak az adott képernyőn megjelenítendő adatokkal foglalkozik. Ha pl. a képernyő tartalmaz 3 db szöveges változót, és kettő db számváltozót, akkor a következő 3 byte a megjelenítendő szövegek sorszámait tartalmazza, majd érkezik újabb 2x3 byte, ami pedig a megjelenítendő 2 db 24 bites számváltozó. Így megint csak csekély mennyiségű adatot kell átküldeni. A többi a kijelzővezérlő dolga. Ugyanakkor a főáramkör mégis mindig tudja, mi van a kijelzőn.
Valószínűleg az ügyesebb (enhanced) HMI-t használja.
Nekem sokkal üzembiztosabbnak tűnik az, ha a kijelző csak annyi adatot küld a kontroller felé, amiből meg lehet állípítani, hogy hol történt az érintés. Gombonként két byte is bőven elég. A kontroller pedig az érintésből eldönti, mit küldjön a kijelző felé. Ebben a formában a kontrollerben gyerekjáték kezelni a kijelzőtől érkező adatokat akkor, amikor a kontroller ráér ezzel foglalkozni.
Lehet, hogy megköveztek, de egy kicsit én is így gondolom. Most estem bele egy olyan feladatba, ahol 1000 be-kijáratot kell kezelni, sok paraméterrel és időzítésekkel. Igen csak be vagyok csinálva, hogy a sok soros porti adat feldolgozásánál elcsúszok (1. HMI, 2: RS485, 3: külső LEDtábla, 4: tasztatúra, 5: GSM modem meg még ki fognak találni valamit...). ...és amilyen szerencsém lesz, egyszerre összecsúszik a sok adat...de csak néha...
Ha jól értem, akkor Te megírtál egy HMI-felületet. Anno én is csináltam ilyet, de mondjuk ez főleg bizonyítási kényszerből készült, mert azt mondták, hogy Basicben nem lehet gyors dolgot írni, aztán lett belőle univerzális kijelzővezérlő (az életben nem használtam a cuccot). Ha jól, barátságosan megírtad a felületet, akkor akár árulhatnád is! Nálam is volt átfedéses szöveg meg minden vacak, 3D vonalak stb. Atya Úr Isten, most látom, 4 éve tettem fel és fennmaradt
![]() Ha nem játszottál még ilyen kijelzővel, én a helyedben rááldoznék pár ezer Ft-ot egy kicsire és kipróbálnám. (és ha van jó ötleted még hozzá beleteszik a fiúk...szerintem ezért írtak ki most ötletpályázatot is) Na, meg meggondolandó, hogy egy sorozat project-be nem olcsóbb lenne egy FTDI-EVE a maga 1400Ft-os árával, mert az sem kutya. Idézet: „Ha jól értem, akkor Te megírtál egy HMI-felületet.” Azt azért nem mondanám. Jól lehet azt megoldottam, hogy egy GLCD kijelzőre pontonként tudjak rajzoni assemblyben, de a videódban látottakhoz hasonló készítésére asm-ben nem vállalkoznék. Annyi ráérő időm nincs. Ráadásul a GLCD nem képes 10Hz-nél nagyobb frissítési sebességre mint az OLED, és még azon is elmosódik a kép. De végül is a működése hasonló a HMI-hez. Csak a programozása babrásabb, mivel asm-ben készül.
"Ezt hogyan csinálod? Pl. az 3-as lapon van egy szöveges változód azt globálissá teszed, az 5-ös lapon van egy másik szöveges változód, ami szintén globális, ezeket hogyan töltöd fel, anélkül, hogy az adott lapot kiválasztanád előtte?"
Nem. Van két üres lapom, amin semmilyen grafikai elem sincs, csak a globális változók. Az egyiken vannak azok az általános globális változók, amelyeket adatátadásra használok pl. két lap között, vagy olyan adat állapotát tárolják, amelyek nem a megjelenítendő adathoz tartoznak. Pl. én egy sátusz sorban megjelenítem minden oldalon, hogy a hangszóró be van-e kapcsolva. Viszont a többi lapon egyetlen globális változom sincs. A másik táblán van az adatgyűjtők által begyűjtött stuktúrált adatok azon része, ami ritkán változik (azonosítók, beállítások, stb.). Pl. legyen a két lap neve 'a' a globális változóknak és 'x' az adattömbnek. Ha két lap között adatot adok át (pl. megnyomok egy gombot), akkor az egyik globális változóban beállítom a még aktuális lap sorszámát (hogy tudjam, hova kell visszatérni): a.vissza.val=1 és ezután meghívom az oldalt: page új_oldal (van, hogy egyéb változót is beállítok, pl. a billentyűzet egy külön oldalon van, oda az adatot ugyanígy adom át: a.vmi.txt="szöveg" Tehát ha egy szöveget kell bevinni/módosítani, akkor a gomb megnyomásra az alábbi kód van van írva: a.vissza.val=1 a.vmi.txt="szöveg" page bill. Ezután megváltoztatom a szövege a bill. oldalon, majd ha ott rányomok az 'ok' gombra, akkor a a.vmi.txt változóban berakja az új szöveget a bill. oldalon és a hívó oldalra visszaléptet (a a.vissza.val változóba ugye előtte lementettem a meghívó oldal sorszámát). És ehhez semmilyen PIC beavatkozásra nincs szükség, mindent a kijelző végez el. És tök felesleges is lenne a PIC, mivel ennek a kijelzőnek pont az a lényege, hogy programozható. A tömböt ugyanígy hívom meg, de címzéssel. Összesen 6 különböző külső egységnek tárolom a tömbe az adatait, egységenként 40byte-tot, így az 1. egység adatai az 1. változónál kezdődnek, a 2. egység adatai a 41. változónál, a 3. egység adatai a 81. változónál és így tovább. Ha meg akarom hívni a 3. egység adatait (pl. hogy kijelezzem), akkor beállítok egy változót 81-re: mutato.val=81 Ha a tömbön belül az 5. adatot kell megjeleníteni, akkor az meg így hívható meg ('x' lapon van a tömb, n0pedig egy szám elem a kijelzőn): n0.val=x.b[5+mutato.val].val Így a tömbön belül bármelyik eleme megcímezhető. Csak az a lényeg, hogy a változók azonosítója folyamatos legyen az oldalon. Én pont egy ilyen kijelzőre vártam már rég óta, hogy ne egy uC-nek, pl. egy PIC-nek kelljen a kijelzőt matatnia, hanem a foglalkozzon azzal, ami a lényeg és a kijelzős dolgokat meg rábízni magára a kiejlzőre. És ez a kijelző ugyan még elég gyerekcípőbe jár, de már most rengeteg dolgot meg lehet csinálni, és az is látszik, hogy elég jó tempóba fejlesztgetik. És amúgy igen, a fejlettebb verziót használom, abból is a 7"-at. A hozzászólás módosítva: Dec 10, 2016
Na, akkor ezt nem tudtam idáig, hogy lehet oldalnével kiegészítve hivatkozni a válltozóra.
Tehát ha az aktuális lapon a "b" de az "a"-n akarok egy változó értékét megváltoztatni akkor az simán megtehetem a a.homerseklet.val=25 formában, és ezt akár a soros porton is küldhetem a HMI-nek?
Így, és át.
A 7"-oson milyen TFT kontroller van a uC mellett? (elméletileg már útban van, de a csigaposta ugye...)
Sziasztok,
Használja valaki GPIO portot ezen a kijelzőn? A 0.38-as verziójú editorral nekem szépen működik, de az újabbakkal már nem. Másnál is van hasonló jelenség?
Amint kezemben lesz a cucc, kipróbálom, segítek, de addig is a legjobb dolog, amit tehetsz, hogy
csinálsz egy "hibás" HMI file-t és azt elküldöd a gyártónak. Ez nekik is sokat segít, mert a "jaj ez nem működik" az több levelezés, de a hibásan működő HMI/TFT file-ból nekik kiderül az igazi hiba. (én is megírtam, hogy vibrál egy dolog, elküldtem a HMI file-t, náluk is vacak volt. Ki is javították. A fórumuk nagyon jó szerintem. Szóval nyugodtan kérdezd meg, hogy "ez a HMI itt működik, itt meg nem, ki a hunyó". Ahogy elnéztem, a "hogyan törjük fel a programotokat" topic-okra is normálisan válaszoltak.
Sziasztok!
egy kérdésem lenne a kijelzőn lévő egy már működő HMI fájlt lelehet tölteni a pc-re tehát visszafelé működik a dolog vagy csak rátölteni lehet ? amúgy mi a külömbség a HMI és a TFT fájl között A hozzászólás módosítva: Dec 16, 2016
A HMI a forráskód, a TFT a kijelzőre töltendő program. Tudtommal csak feltölteni lehet a programot, kiolvasni nem.
Pedig van egy kijelzőm amin van egy jó kis program át kellene tenni többre is ,valahol pedig ott van a memóriába csak kiolvasni akkor nem lehet valami hack nem létezik rá?
Normál mintaprogram. Ugyan mi a hiba?
Üzenet: Error: Invalid command:else if (b26.txt=="START")( Double click to jump to code) Error: SYNTAX ERROR: Extra "{":{( Double click to jump to code)
Szia!
Ebben a sorban töröld a szóközt az if után. ![]() Üdv, Ati. A hozzászólás módosítva: Dec 19, 2016
|
Bejelentkezés
Hirdetés |