
Pikat kryesore ose për çfarë flet ky artikull
Tema e artikullit është programimi vizual i PLC ShIoTiny për shtëpinë inteligjente, e përshkruar këtu: .
Shumë shkurt janë shqyrtuar koncepte të tilla si nyjet, lidhet, ngjarje, si dhe veçoritë e ngarkimit dhe ekzekutimit të programit vizual në ESP8266, i cili është baza e PLC ShIoTiny.
Hyrje ose disa pyetje organizative
Në artikullin e mëparshëm lidhur me zhvillimin tim, bëra një përmbledhje të shkurtër të mundësive të kontrolluesit ShIoTiny.
Çuditerisht, publiku shfaqi një interes të konsiderueshëm dhe më bëri shumë pyetje. Disa njerëz madje më propozuan menjëherë ta blejnë kontrolluesin. Jo, unë nuk kam asnjë problem të fitoj pak, por ndërgjegjja nuk më lejon të shes diçka që është ende mjaft e papërfunduar në aspektin programues.
Prandaj, kam postuar në GitHub binarët e firmware-it dhe diagramin e pajisjes: .
Tani secili mund ta programojë ESP-07 dhe të luajë vetë me firmware-in. Nëse dikujt i intereson një pllaka si ajo në foto — kam disa të tilla. Shkruani në emailin shiotiny@yandex.ru. Por, siç thoshte i paharruari Ogurcov: «Unë nuk marr asnjë përgjegjësi!».
Pra, le të kalojmë në esencë: çfarë është «nyje» (noda) dhe «ngjarje«? Si ekzekutohet programi?
Si zakonisht — le të fillojmë sipas rendit: nga ngarkimi i programit.
Si ngarkohet programi
Le të fillojmë me atë që ndodh kur ne klikojmë butonin Upload në redaktorin ElDraw dhe diagrami ynë-program, i përbërë nga katrorë të bukur, dërgohet në pajisje.
Së pari, në bazë të diagramit të vizatuar prej nesh, krijohet përshkrimi i tij në formë tekstuale.
Së dyti, kontrollohet — a janë të gjitha hyrjet e nyjeve të lidhura me daljet. Nuk duhet të ketë hyrje "duke hangër". Nëse një hyrje e tillë zbulohet — diagrami në ShIoTiny nuk do të ngarkohet, dhe redaktori do të japë një paralajmërim përkatës.
Nëse gjithçka shkon mirë, atëherë redaktori dërgon në ShIoTiny përshkrimin tekstual të diagramit një nyje njëherësh. Sigurisht, diagrami ekzistues nga ShIoTiny fshihet paraprakisht. Përshkrimi tekstual ruhet në memorien FLASH.
Më interesante, nëse dëshironi të fshini diagramin nga pajisja, thjesht ngarkoni një diagram bosh (pa ndonjë element-nyje).
Gjatë gjithë procesit, programi i ngarkuar në PLC ShIoTiny fillon "të ekzekutohet". Çfarë do të thotë kjo?
Vlen të përmendet se proceset e ngarkimit të diagramit nga memoria FLASH gjatë aktivizimit të energjisë dhe gjatë marrjes së diagramit nga redaktori — janë identike.
Së pari, ndodhi krijimi i objekteve-nyje në bazë të përshkrimit të tyre.
Më pas, bëhet vendosja e lidhjeve midis nyjeve. Kjo do të thotë se krijohen lidhjet e daljeve në hyrje dhe hyrjeve në dalje.
Dhe vetëm pas gjithë kësaj fillon cikli kryesor i ekzekutimit të programit.
Kam shkruar gjatë, por i gjithë procesi - nga 'ngarkimi' i diagramit nga memorja FLASH deri në fillimin e ciklit kryesor - zë disa sekonda për një diagram me 60-80 nyje.
Si funksionon cikli kryesor? Shumë thjeshtë. Fillimisht ai pret që të ndodhë ngjarje në një nyje, më pas e përpunon këtë ngjarje. Dhe kështu përherë. Ose derisa të ngarkohet një diagram i ri në ShIoTiny.
Kam përmendur disa herë gjëra të tilla si ngjarje, nyjet dhe lidhet. Por çfarë është kjo nga këndvështrimi programor? Për këtë do të flasim sot.
Nyjet, lidhjet dhe ngjarjet
Mjafton një shikim në shembujt e diagramit-programit për ShIoTiny, për të kuptuar se diagrama përbëhet vetëm nga dy entitete — nyje (ose elemente) dhe lidhje midis tyre.
Nyja, noda ose element i diagramit — është një përfaqësim virtual i ndonjë veprime për të dhënat. Kjo mund të jetë një operacion aritmetik, një operacion logjik ose çfarëdo operacioni tjetër që na vjen në mend. E rëndësishme është që nyja të ketë një hyrje dhe një dalje.
Hyrje — është vendi ku nyja pranon të dhëna. Pamjet e hyrjeve janë pika që ndodhen gjithmonë në anën e majtë të nyjes.
Dalja — është vendi ku merret rezultati i punës së nyjes. Pamjet e daljeve janë pika që ndodhen gjithmonë në anën e djathtë të nyjes.
Disa nyje nuk kanë hyrje. Këto nyje gjenerojnë rezultatin brenda vetes. Për shembull, nyja-constante ose nyja-sensor: ato nuk kanë nevojë për të dhëna nga nyje të tjera për të raportuar rezultatin.
Të tjerët, përkundrazi, nuk kanë dalje. Këto janë nyje që përfaqësojnë, për shembull, pajisje ekzekutive (relais ose ndonjë gjë tjetër të ngjashme). Ato pranojnë të dhëna, por nuk gjenerojnë rezultat të llogaritjeve që janë të qasshme për nyje të tjera.
Përveç kësaj, ka edhe një nyje unike-koment. Ajo nuk bën asgjë, nuk ka as hyrje as dalje. Qëllimi i saj është të jetë një shpjegim në diagram.
Çfarë është «ngjarje»? Ngjarja — është shfaqja e të dhënave të reja në ndonjë nyje. Për shembull, ngjarjet përfshijnë: ndryshimi i gjendjes së hyrjes (nyja Input), marrja e të dhënave nga një pajisje tjetër (nyjet MQTT dhe UDP), përfundimi i një kohe të caktuar (nyjet Timer dhe Delay) dhe kështu me radhë.
Pse janë ngjarjet? Ato janë të nevojshme për të përcaktuar se në cilin nyje janë krijuar të dhëna të reja dhe cilat gjendje nyjesh duhet të ndryshohen për shkak të marrjes së të dhënave të reja. Ngjarja, si të thuash, «kalon» përmes zinxhirit të nyjeve derisa të përfshijë të gjitha nyjet, të cilat gjendjet e të cilave duhet të kontrollohen dhe ndryshohen.
Të gjitha nyjet mund të ndahen në dy kategori.
Nyjet që mund të gjenerojnë ngjarje do t’i quajmë «nyje aktive».
Nyjet që nuk mund të gjenerojnë ngjarje do t’i quajmë «nyje pasive».
Kur një nyje gjeneron një ngjarje (dmth. rezultati i saj është një grup të dhënash të reja), atëherë ndryshohet në përgjithësi gjendja e gjithë zinxhirit të nyjeve të lidhura me daljen e nyjës që gjeneron ngjarjen.
Për ta bërë më të qartë, le ta shohim një shembull në figurë.

Nyjet aktive këtu janë – Input1, Input2 dhe Input3. Nyjet e tjera janë pasive. Le të shohim se çfarë ndodh kur lidhim këtë apo atë hyrje. Rezultatet janë përmbledhur për lehtësi në një tabelë.

Siç e shohim, kur ndodh një ngjarje, ndërtohet një zinxhir nga nyja burim i ngjarjes deri te nyja fundore. Gjendja e nyjeve që nuk përfshihen në zinxhir nuk ndryshohet.
Ngrihet një pyetje legjitime, çfarë ndodh kur ndodhin dy ose madje disa ngjarje njëkohësisht?
Si një dashamirës i krijimtarisë së Gleb Anfilov, më tërheq të dërgoj pyetësin kurioz te libri i tij «Shkëputja nga befasitë». Është një «teori relativiteti për më të vegjlit», në të cilin tregohet si funksionon nocioni i «njëkohshmërisë» dhe si të jetosh me të.
Por në praktikë, gjithçka është shumë më e thjeshtë: kur ndodhin dy ose disa ngjarje, ndërtohen dhe përpunohen secilat zinxhirë nga çdo burim ngjarje një nga një, pa ndodhur ndonjë mrekulli.
Një tjetër pyetje legjitime e lexuesit kurioz është: çfarë do të ndodhë nëse nyjet lidhen në një unazë? Ose, siç mësohet të thuhet midis këtyre që quhen të mençur – të krijohet një kthim tërësor. Kjo do të thotë, të lidhësh daljen e një nyje me hyrjen e nyjës përpara, në mënyrë që gjendja e daljes së kësaj nyje të ndikojë në gjendjen e hyrjes së saj. Redaktori nuk do të lejojë që të lidhësh drejtpërdrejt daljen e nyjës me hyrjen e saj. ElDrawPor, indirekt, siç shikohet në figurën më poshtë – kjo është e mundur.
Tani, çfarë do të ndodhë në këtë rast? Përgjigjja do të jetë "e qartë": varet nga se cilat nyje. Le të shohim një shembull në figurë.

Kur kontaktet e hyrjes Input1 janë të hapura në hyrjen e sipërme të nyjës A – 0. Në daljen e nyjës A, gjithashtu 0. Në daljen e nyjës B – 1. Dhe, përfundimisht, në hyrjen e poshtme të nyjës A – 1. E gjithë kjo është e qartë. Por për ata që nuk e kuptojnë – shihni përshkrimin më poshtë për mënyrën e funksionimit të nyjeve «DHE» dhe «JO».
S tani, le të lidhim kontaktet e hyrjes Input1, dmth. të japim një njësi në hyrjen e sipërme të nyjës A. Ata që janë njohur me elektronikën e dinë se faktikisht do të kemi një skemë klasike gjeneratori me elementë logjikë. Dhe në teori, një skemë e tillë duhet të ofrojë pafundësisht në daljen e elementeve A dhe B sekuenca 1-0-1-0-1-0... dhe 0-1-0-1-0-1.... Sepse ngjarja duhet të ndryshojë vazhdimisht gjendjen e nyjeve A dhe B, duke ecur në rreth 2-3-2-3...!
Por në të vërtetë, kjo nuk ndodh. Skema do të bjerë në një gjendje të rastësishme – ose releu do të mbetet i ndezur ose i fikur, ose ndoshta do të ndizet-fike disa herë radhazi. Gjithçka varet nga moti në jug të Marsit. Dhe kjo është arsyeja pse ndodh kështu.
Ngjarja me nyjën Input1 ndryshon gjendjen e nyjës A, pastaj nyjës B dhe kështu në rreth disa herë. Programi e përcakton «rrethi» e ngjarjes dhe e ndalon këtë karneval për forcë. Pas kësaj, ndryshimi i gjendjes së nyjeve A dhe B ndalohet deri sa të ndodhë një ngjarje e re. Momentin kur programi do të vendosë – "mjafton të rrotullohemi rreth!" – në përgjithësi varet nga shumë faktorë dhe mund të konsiderohet e rastësishme.
Kini kujdes kur lidhni nyjet në një rreth – efektet nuk do të jenë gjithmonë të dukshme! Bëni mirë të kuptoni çfarë dhe përse po bëni!
A është e mundur që të ndërtohet një gjenerator me nyjet që kemi në dispozicion? Po, është e mundur! Por për këtë nevojitet një nyje që vetë di të gjenerojë ngjarje. Dhe një nyje e tillë ekziston – ajo është «linja e vonesës». Le të shohim si funksionon gjeneratori me një periudhë prej 6 sekondash në figurën më poshtë.

Elementi kyç i gjeneratorit është nyja A – linja e vonesës. Nëse ndryshoni gjendjen e hyrjes së linjës së vonesës nga 0 në 1, atëherë 1 në dalje do të shfaqet jo menjëherë, por vetëm pas një kohe të caktuar. Në rastin tonë, kjo është 3 sekonda. Po ashtu, nëse ndryshoni gjendjen e hyrjes së linjës së vonesës nga 1 në 0, atëherë 0 në dalje do të shfaqet pas po atyre 3 sekondave. Koha e vonesës jepet në pesëdhjetë pjesë sekonde. Pra, vlera 30 do të thotë – 3 sek.
Karakteristika e linjës së vonesës është se ajo gjeneron një ngjarje pas përfundimit të kohës së vonesës.
Le të supozojmë se fillimisht në daljen e linjës së vonesës ishte 0. Pas kalimit në nyjën B — invertori — kjo 0 shndërrohet në 1 dhe hyn në linjën e vonesës. Fillimisht, nuk ndodh asgjë. Në daljen e linjës së vonesës siç ishte 0 ashtu mbetet, por fillon gjithashtu numërimi i kohës së vonesës. Kalojnë 3 sekonda. Dhe menjëherë linja e vonesës gjeneron një ngjarje. Në daljen e saj shfaqet 1. Ky njëri, pas kalimit në nyjën B — invertori — shndërrohet në 0 dhe hyn në linjën e vonesës. Kalojnë edhe 3 sekonda… dhe procesi përsëritet. Pra, çdo 3 sekonda, gjendja e daljes së linjës së vonesës ndryshon nga 0 në 1 dhe më pas nga 1 në 0. Rele vjen në jetë. Generatori punon. Periudha e impulsve është 6 sekonda (3 sekonda për daljen zero dhe 3 sekonda — njësi).
Por, në skemat reale, zakonisht nuk është e nevojshme të përdoret edhe ky shembull. Ekzistojnë nyje-timer speciale, të cilat shkëlqejnë dhe pa ndihmë të jashtme gjenerojnë një sekuencë impulsesh me periudhë të caktuar. Kohëzgjatja e «zero» dhe «një» në këto impulse është e barabartë me gjysmën e periudhës.
Për të caktuar veprime periodike, përdorni nyje-timer.
Vërej që sinjalet dixhitale, ku kohëzgjatja e «zero» dhe «një» janë të barabarta, quhen «meandër».
Shpresoj se e kam sqaruar pak çështjen se si ndodhin përhapjet e ngjarjeve midis nyjave dhe çfarë nuk duhet të bëhet?
Përfundimi dhe lidhjet
Artikulli doli të jetë i shkurtër, por ky është një artikull-ndërgjegjësim për pyetjet që kanë lindur lidhur me nyjat dhe ngjarjet.
Me zhvillimin e firmware-ve dhe shfaqjen e shembujve të rinj, do të shkruaj për se si të programoj ShIoTiny artikuj të vegjël, saherë që kjo do të jetë e interesuar për njerëzit.
Si më parë, skemat, firmware, shembuj, përshkrimi i nyjave dhe gjithçka .
Pyetje, dëshira, kritikë — kjo këtu: shiotiny@yandex.ru
Burimi: habr.com
