
Pikat kryesore ose për çfarë është ky artikull
Tema e artikullit është programimi vizual i PLC-ve ShIoTiny për shtëpinë inteligjente, e përshkruar këtu: .
Shumë shkurt janë shqyrtuar konceptet si nyjat, lidhjet, ngjarjet, si dhe veçoritë e ngarkimit dhe ekzekutimit të programit vizual në ESP8266, i cili është baza e PLC-së ShIoTiny.
Hyrje ose disa çështje organizative
Në artikullin e mëparshëm për zhvillimin tim bëra një përmbledhje të mundësive të kontrolluesit ShIoTiny.
Çuditërisht, publiku tregoi një interes të fortë dhe më bëri shumë pyetje. Disa shokë madje më sugjeruan menjëherë të blinin kontrolluesin. Jo, nuk kam ndonjë problem të fitoj pak, por ndërgjegjja nuk më lejon të shes diçka ende shumë e papërpunuar nga ana programore.
Prandaj, unë e shpërndava në GitHub binarët e firmware-it dhe diagramin e pajisjes: .
Tani çdo njëri mund ta programojë ESP-07 dhe të luajë me firmware-in. Nëse dikujt i pëlqen pikërisht ky pllaka si në foto — unë kam disa të tilla. Shkruani në email shiotiny@yandex.ru. Por, siç thoshte i paharruari Ogurcov: “Nuk mbaj përgjegjësi për asgjë!”.
Pra, le të kalojmë në thelb: çfarë është "nyja" (noda) dhe "ngjarje"? Si ekzekutohet programi?
Si zakonisht - le të fillojmë nga e para: me ngarkimin e programit.
Si ngarkohet programi
Të fillojmë me atë që ndodh kur shtypim butonin Upload në redaktorin ElDraw dhe diagrami- programi ynë, i përbërë nga katrorë të bukur, niset për në pajisje.
Së pari, mbi bazën e diagramit të vizatuar nga ne, ndërtosh një përshkrim të saj në formë teksti.
Së dyti, kontrollohet - a janë të gjitha hyrjet e nyjave të lidhura me daljet. Nuk duhet të ketë hyrje "të lëna pa lidhje". 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ë, redaktori dërgon në ShIoTiny përshkrimin tekstual të diagramit një nyje në të njëjtën kohë. Sigurisht, diagrami ekzistues nga ShIoTiny fshihet paraprakisht. Përshkrimi tekstual i marrë ruhet në memorjen FLASH.
Për siguri, nëse dëshironi të fshini diagramin nga pajisja, thjesht ngarkoni një diagram të zbrazët (që nuk përmban asnjë element-nyje).
Sa herë që diagrami-programi ngarkohet në PLC ShIoTiny, ai fillon "të ekzekutohet". Çfarë do të thotë kjo?
Vlen të theksohet se proceset e ngarkimit të skemës nga memorja FLASH gjatë ndezjes dhe kur merret skema nga redaktori janë identike.
Fillimisht krijohen objekte-nod që bazohen në përshkrimin e tyre.
Pastaj vendosen lidhjet midis nodëve. Do të thotë se gjenerohen referencat e daljes në hyrje dhe hyrjeve në dalje.
Dhe vetëm pas të gjithë kësaj, fillon cikli kryesor i ekzekutimit të programit.
Kam shkruar për një kohë të gjatë, por e gjithë procedura - nga "ngarkimi" i skemës nga memoria FLASH deri në nisjen e ciklit kryesor - zë disa pjesë sekonde për një skemë me 60-80 nod.
Si funksionon cikli kryesor? Shumë thjesht. Fillimisht ai pret të ndodhë në ngjarjet në ndonjë nod, pastaj e përpunon këtë ngjarje. Dhe kështu pa fund. Ose derisa të ngarkojnë një skemë të re në ShIoTiny.
Kohëve të fundit kam përmendur disa gjëra, si ngjarjet, nyjat dhe lidhjet. Por çfarë është kjo nga pikëpamja programore? Do flasim për këtë sot.
Nodë, lidhje dhe ngjarje
Mjafton të shikosh shembujt e skemave-program për ShIoTiny, për të kuptuar se skema përbëhet vetëm nga dy entitete - nodët (ose elementët) dhe lidhjet midis tyre.
Nyja, nodë ose element i skemës — kjo është një përfaqësim virtual i diçkaje veprime në të dhëna. Kjo mund të jetë një operacion aritmetik, një operacion logjik ose ndonjë operacion tjetër që na vjen në mendje. E rëndësishme është që nodi ka një hyrje dhe një dalje.
Hyrja — është vendi ku nodi pranon të dhënat. Pamjet e hyrjeve janë pikë që gjithmonë ndodhen në anën e majtë të nodit.
Dalje — është vendi nga i cili nxirret rezultati i punës së nodit. Pamjet e daljeve janë pikë që gjithmonë ndodhen në anën e djathtë të nodit.
Disa nodë nuk kanë hyrje. Këto nodë gjenerojnë rezultatet brenda tyre. P.sh., nodi-konsistent ose nodi-sensor: ata nuk kanë nevojë për të dhëna nga nodë të tjera për të raportuar rezultatin.
Ndërsa nodët e tjera, përkundrazi, nuk kanë dalje. Këto janë nodë që shfaqin, p.sh., pajisje ekzekutimi (rele ose ndonjë gjë tjetër të ngjashme). Ata marrin të dhëna, por nuk gjenerojnë rezultate të llogaritjeve të disponueshme për nodët e tjera.
Përveç kësaj, ka një nodë-unik-koment. Ai nuk bën asgjë, nuk ka hyrje apo dalje. Qëllimi i tij është të jetë një shpjegim në skemë.
Çfarë është "ngjarje»? Ngjarja — është shfaqja e të dhënave të reja në ndonjë nod. P.sh., ngjarjet përfshijnë: ndryshimin e gjendjes së hyrjes (nod Input), marrja e të dhënave nga një pajisje tjetër (nyjat MQTT dhe UDP), kalimi i një periudhe të caktuar kohore (nyjat Timer dhe Vonesa) dhe kështu me radhë.
Për çfarë shërbejnë ngjarjet? Po për të përcaktuar se në cilën nyje janë krijuar të dhëna të reja dhe cilat gjendje nyjash duhet të ndryshohen pas marrjes së të dhënave të reja. Ngjarja, si të thuash, "kalon" përmes zinxhirit të nyjeve, derisa të kontrollojë dhe ndryshojë të gjitha nyjat që duhet.
Të gjitha nyjat mund të ndahen në dy kategori.
Nyjat që mund të gjenerojnë ngjarje do t'i quajmë "nyje aktive».
Nyjat që nuk mund të gjenerojnë ngjarje do t'i quajmë "nyje pasive».
Kur një nyje gjeneron një ngjarje (domethënë, dalin të dhëna të reja), atëherë në përgjithësi ndërlikohet gjendja e gjithë zinxhirit të nyjeve të lidhura me daljen e nyjës-gjenerator të ngjarjes.
Për ta bërë të qartë, le të shqyrtojmë një shembull në vizatim.

Nyjet aktive këtu janë Input1, Input2 dhe Input3. Nyjat e tjera janë pasive. Le të shohim se çfarë ndodh kur një nga hyrjet mbyllet. Rezultatet për lehtësi janë përmbledhur në një tabelë.

Siç e shohim, kur ndodh një ngjarje, ndërtohet një zinxhir nga nyja-burim e ngjarjes deri te nyja përfundimtare. Gjendja e atyre nyjave që nuk janë përfshirë në zinxhir mbetet e pandryshuar.
Lind një pyetje legjitime, çfarë do të ndodhë kur ndodhin dy ose madje disa ngjarje njëkohësisht?
Si një adhurues i krijimtarisë së Gleb Anfilov, më tërheq të dërgoj pyetësin kurioz te libri i tij "Ikja nga befasitë". Është një "teori relativiteti për të vegjlit", ku shpjegohet mirë se çfarë do të thotë "njëkohësisht" dhe si të jetosh me këtë.
Por në praktikë, gjithçka është shumë më e thjeshtë: kur ndodhin dy ose madje disa ngjarje, ndërtohen dhe përpunohen sekuencat radhazi nga çdo burim ngjarjeje dhe nuk ka asnjë mrekulli.
Pyetja tjetër plotësisht legjitime e një lexuesi kurioz është — çfarë do të ndodhte nëse nyjat lidheshin në një dyak? Ose, siç pranohet të thuhet midis këtyre intelektualëve — të futim një reagim pozitiv. Domethënë, të lidhim daljen e një nga nyjat me hyrjen e nyjës së mëparshme në mënyrë që gjendja e daljes së kësaj nyje të ndikonte në gjendjen e hyrjes së saj. Një lidhje direkte të daljes së nyjes me hyrjen e saj nuk do t'ju lejojë redaktori. ElDraw. Por ndërmjetësisht, siç ilustrohet më poshtë — kjo mund të bëhet.
Pra, çfarë do të ndodhë në këtë rast? Përgjigja do të jetë shumë "e përcaktuar": varet se çfarë nyjash kemi. Le të shqyrtojmë një shembull në figurën.

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ë. Për ata që nuk e kuptojnë — shikoni poshtë përshkrimin se si funksionojnë nyjat "DHE" dhe "JO".
Tani, le të mbyllim kontaktet e hyrjes Input1, domethënë të dërgojmë njësi në hyrjen e sipërme të nyjës A. Ata që janë të njohur me elektronikën e dinë se në fakt do të kemi një skemë klasike gjeneratori në elemente logjike. Dhe, në parim, një skemë e tillë duhet të japë pafundësisht në daljet e elementeve A dhe B sekuenca 1-0-1-0-1-0…. dhe 0-1-0-1-0-1-…. Sepse ngjarja duhet të ndryshojë gjendjen e nyjave A dhe B vazhdimisht, duke ecur në rreth 2-3-2-3-…!
Por në të vërtetë, kjo nuk ndodh. Skema do të bie në një gjendje të rastësishme — ose releu do të mbetet i ndezur ose i fikur, ose ndoshta do të zhurmojë duke u ndezur dhe fikur disa herë radhazi. Të gjitha varen nga moti në polin jugor të Marsit. Dhe ja pse ndodh kjo.
Ngjarja me nyjën Input1 ndryshon gjendjen e nyjës A, pastaj të nyjës B dhe kështu në rreth disa herë. Programi përcakton "ciklimin" e ngjarjes dhe e ndalon atë karneval. Pas kësaj, ndryshimi i gjendjes së nyjave A dhe B bllokohet deri në shfaqjen e një ngjarjeje të re. Momenti në të cilin programmi do të vendosë — "mjaft me rrotullime!" — në përgjithësi varet nga shumë faktorë dhe mund të konsiderohet rastësor.
Kujdes kur lidhni nyjat në një rreth — efektet nuk do të jenë gjithmonë të qarta! Keni një ide të mirë se çfarë dhe përse po bëni!
A është ende e mundur të ndërtojmë një gjenerator me nyjat që kemi? Po, është e mundur! Por për këtë na nevojitet një nyje që vetë mund të gjenerojë ngjarje. Dhe një nyje e tillë ekziston — kjo ë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 të njëjtës 3 sekonda. Koha e vonesës caktohet në dhjetëra të një sekondi. Pra, vlera 30 do të thotë — 3 sekunda.
Veçoria e linjës së vonesës është se ajo gjeneron një ngjarje pas skadimit të kohës së vonesës.
Supozoni se fillimisht në daljen e linjës së vonesës ishte 0. Pas kalimit përmes nyjës B — inverterit — ky 0 transformohet në 1 dhe hyn në hyrjen e linjës së vonesës. Fillimisht nuk ndodh asgjë. Në daljen e linjës së vonesës siç ishte 0, ashtu do të mbetet, por ndërkohë fillon të bëhet regjistrimi i kohës së vonesës. Kalojnë 3 sekonda. Dhe menjëherë linja e vonesës gjeneron një ngjarje. Në dalje i shfaqet 1. Kjo njësi pas kalimit përmes nyjës B — inverterit — transformohet në 0 dhe hyn në hyrjen e linjës së 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 pastaj nga 1 në 0. Reléja klikon. Gjeneratori punon. Periudha e impulsve është 6 sekonda (3 sekonda në dalje 0 dhe 3 sekonda — 1).
Por, në skemat reale, zakonisht nuk është e nevojshme të përdoret as ky shembull. Ekzistojnë nyje-timer që gjenerojnë në mënyrë të shkëlqyer dhe pa ndihmë të jashtme një sekuencë impulsesh me një periudhë të caktuar. Kohëzgjatja e "0" dhe "1" në këto impulse është e barabartë me gjysmën e periudhës.
Për të caktuar veprime periodike, përdorni nyje-timer.
Dua të theksoj se sinjalet digjitale ku koha e "0" dhe "1" është e barabartë quhen "meandër".
Shpresoj se kam sqaruar paksa pyetjen se si ndodh shpërndarja e ngjarjeve midis nyjave dhe çfarë nuk duhet të bëhet?
Përfundim dhe lidhje
Artikulli doli i shkurtër, por është një përgjigje ndaj pyetjeve të paraqitura mbi nyjat dhe ngjarjet.
Me zhvillimin e firmuerëve dhe shfaqjen e shembujve të rinj, do të shkruaj se si të programoni ShIoTiny artikuj të vegjël, sa herë që do të jetë e interesuar për njerëzit.
Ashtu si më parë, skema, firmueri, shembujt, përshkrimi i nyjave dhe gjithçka .
Pyetje, kërkesat, kritikat — këtu: shiotiny@yandex.ru
Burimi: habr.com
