
Tezele principale sau despre ce este acest articol
Tema articolului - programarea vizuală a PLC-ului ShIoTiny pentru casa inteligentă, descrisă aici: .
Foarte pe scurt sunt abordate conceptele precum nodi, legături, evenimentele, precum și particularitățile încărcării și execuției programului vizual pe ESP8266, care stă la baza PLC-ului ShIoTiny.
Introducere sau câteva întrebări organizaționale
În articolul anterior despre dezvoltarea mea, am prezentat pe scurt capabilitățile controlerului ShIoTiny.
Cum era de așteptat, publicul a arătat un interes destul de mare și mi-a adresat multe întrebări. Unii oameni chiar mi-au propus pe loc să cumpere controlerul de la mine. Nu, nu sunt împotriva de a câștiga un pic, dar conștiința mea nu-mi permite să vând ceva ce este încă foarte nefinisat din punct de vedere software.
De aceea, am publicat pe GitHub binarele firmware-ului și schema dispozitivului: .
Acum oricine poate programa ESP-07 și să experimenteze cu firmware-ul. Dacă cineva își dorește cu adevărat un astfel de plăcuță ca în fotografie - am câteva bucăți. Scrieți-mi pe email shiotiny@yandex.ru. Dar, așa cum spunea neuitatul Ogurțov: «Nu răspund pentru nimic!».
Așadar, să trecem la esență: ce este «nod» (noda) și «eveniment«? Cum se execută programul?
Ca de obicei - să începem în ordine: cu încărcarea programului.
Cum se încarcă programul
Să începem cu ceea ce se întâmplă atunci când apăsăm butonul Upload în editorul ElDraw și schema noastră-programă, formată din pătrățele frumoase, este trimisă în dispozitiv.
În primul rând, pe baza schemei desenate de noi, se construiește o descriere a acesteia în format text.
În al doilea rând, se verifică - dacă toate intrările nodurilor sunt conectate la ieșiri. Nu ar trebui să existe intrări «suspendate». Dacă se descoperă o astfel de intrare - schema nu se va încărca în ShIoTiny, iar editorul va emite un avertisment corespunzător.
Dacă totul a decurs cu succes, editorul trimite în ShIoTiny descrierea textului schemei nod cu nod. Desigur, schema existentă din ShIoTiny este ștearsă în prealabil. Descrierea textului obținut este salvată în memoria FLASH.
Apropo, dacă doriți să ștergeți schema din dispozitiv, pur și simplu încărcați în el o schemă goală (care să nu conțină niciun element-nod).
Odată ce întreaga schemă-programă este încărcată în PLC ShIoTiny, aceasta începe să «se execute». Ce înseamnă asta?
Să menționăm că procesele de încărcare a schemei din memoria FLASH la pornire și la primirea schemei din editor sunt identice.
Mai întâi se creează obiecte-node pe baza descrierii lor.
Apoi se realizează stabilirea legăturilor între noduri. Asta înseamnă că se generează legături de ieșiri la intrări și de intrări la ieșiri.
Și abia după toate acestea se lansează ciclul principal de execuție al programului.
Am scris mult, dar întregul proces - de la "încărcarea" schemei din memoria FLASH până la lansarea ciclului principal - durează câteva fracțiuni de secundă pentru o schemă de 60-80 de noduri.
Cum funcționează ciclul principal? Foarte simplu. Mai întâi așteaptă apariția evenimentele într-un anumit nod, apoi procesează acest eveniment. Și așa fără sfârșit. Sau până când se încarcă o nouă schemă în ShIoTiny.
De mai multe ori am menționat astfel de lucruri ca evenimentele, nodi și legături. Dar ce reprezintă acestea din punct de vedere programatic? Despre aceasta vom discuta astăzi.
Noduri, legături și evenimente
Este suficient să aruncăm o privire asupra exemplelor de scheme-program pentru ShIoTiny, pentru a înțelege că schema constă doar din două entități - noduri (sau elemente) și legăturile dintre ele.
Nod, node sau element al schemei — este o reprezentare virtuală a unei acțiuni asupra datelor. Aceasta poate fi o operație aritmetică, o operație logică sau orice altă operație care ne-ar veni în minte. Principalul lucru este că nodul are o intrare și o ieșire.
Autentificare — este locul unde nodul primește date. Imaginea intrărilor - aceste puncte sunt întotdeauna pe partea stângă a nodului.
Ieșire — este locul din care se extrage rezultatul muncii nodului. Imaginea ieșirilor - aceste puncte sunt întotdeauna pe partea dreaptă a nodului.
Unele noduri nu au intrări. Aceste noduri generează rezultatul în interiorul lor. De exemplu, nodul-constant sau nodul-senzor: nu au nevoie de date de la alte noduri pentru a comunica rezultatul.
Alte noduri, dimpotrivă, nu au ieșiri. Acestea sunt noduri care afișează, de exemplu, dispozitive de acțiune (releu sau alte similare). Ele primesc date, dar nu generează rezultate ale calculelor disponibile pentru alte noduri.
În plus, există un nod unic-comentariu. Acesta nu face nimic, nu are intrări sau ieșiri. Scopul său este de a fi o explicație pe schemă.
Ce este "eveniment»? Eveniment — este apariția de noi date într-un anumit nod. De exemplu, evenimentele includ: schimbarea stării unei intrări (nodul Input), primirea datelor de la un alt dispozitiv (noduri MQTT și UDP), expirarea unui interval de timp stabilit (noduri Timer și Întârziere) și așa mai departe.
De ce sunt necesare evenimentele? Pentru a determina în care nod au apărut datele noi și ce stări ale nodurilor trebuie schimbate în urma primirii de noi date. Un eveniment „trece” printr-un șir de noduri, până când vizitează toate nodurile a căror stare trebuie verificată și modificată.
Toate nodurile pot fi împărțite în două categorii.
Nodurile care pot genera evenimente le vom numi „noduri active».
Nodurile care nu pot genera evenimente le vom numi „noduri pasive».
Când un nod generează un eveniment (adică îi apar date noi la ieșire), atunci, în general, se schimbă starea întregului lanț de noduri conectate la ieșirea nodului-generator de evenimente.
Pentru a fi clar, să luăm un exemplu din imagine.

Nodurile active aici sunt Input1, Input2 și Input3. Celelalte noduri sunt pasive. Să analizăm ce se întâmplă atunci când se închide o intrare sau alta. Rezultatele sunt prezentate pentru comoditate într-un tabel.

După cum se vede, în cazul unui eveniment, se construiește un lanț de la nodul sursă al evenimentului până la nodul final. Starea nodurilor care nu sunt incluse în lanț rămâne neschimbată.
Se ridică o întrebare legitimă: ce se întâmplă în cazul apariției a două sau chiar mai multe evenimente simultan?
Ca un apreciator al creativității lui Gleb Anfilov, sunt tentat să trimit curioasa întrebare la cartea sa „Evadarea din uimiri”. Este o „teorie a relativității pentru cei mai mici”, în care este explicat bine ce înseamnă „simultan” și cum să trăiești cu asta.
Dar, practic, totul este mult mai simplu: în cazul apariției a două sau mai multe evenimente, toate lanțurile sunt construite și procesate secvențial din fiecare sursă de eveniment pe rând, fără nicio minune.
Următoarea întrebare absolut firească a cititorului curios este: ce se întâmplă dacă nodurile sunt conectate într-un cerc? Sau, așa cum se spune printre acești intelectuali, să introducă feedback. Adică să conecteze ieșirea unuia dintre noduri la intrarea nodului anterior, astfel încât starea ieșirii acelui nod să influențeze starea intrării sale. Să conectezi direct ieșirea unui nod la intrarea sa nu va permite editorul ElDraw. Iată cum, indirect, așa cum se vede în imaginea de mai jos — este posibil.
Deci, ce se va întâmpla în acest caz? Răspunsul va fi foarte „definit”: depinde de ce noduri. Să luăm un exemplu din imagine.

Când contactele de intrare Input1 sunt deschise pe intrarea superioară a nodului A — 0. Pe ieșirea nodului A, de asemenea 0. Pe ieșirea nodului B — 1. Și, în cele din urmă, pe intrarea inferioară a nodului A — 1. Totul este clar. Pentru cei care nu înțeleg — consultați mai jos descrierea modului în care funcționează nodurile „ȘI” și „NU”.
Acum vom conecta contactele de intrare Input1, adică vom aplica 1 pe intrarea superioară a nodului A. Cei care sunt familiarizați cu electronica știu că, de fapt, vom obține o schemă clasică de generator folosind elemente logice. Și, în teorie, această schemă ar trebui să genereze continuu pe ieșirile elementelor A și B secvențe 1-0-1-0-1-0… și 0-1-0-1-0-1-…. Căci evenimentul ar trebui să schimbe constant starea nodurilor A și B, alergând în cerc 2-3-2-3-…!
Dar, în realitate, acest lucru nu se întâmplă. Schema va cădea într-o stare aleatorie — fie releul va rămâne activat, fie dezactivat, sau poate va clipocească ușor activându-se și dezactivându-se de mai multe ori la rând. Totul depinde de vremea de la polul sud al lui Marte. Iată de ce se întâmplă acest lucru.
Evenimentul de la nodul Input1 schimbă starea nodului A, apoi nodul B și așa mai departe, de câteva ori. Programul determină „ciclarea” evenimentului și oprește forțat acest carnaval. După aceea, modificarea stării nodurilor A și B este blocată până la apariția unui nou eveniment. Momentul în care programul va decide — „suficient cu rotirea în cerc!” — depinde în general de mulți factori și poate fi considerat aleatoriu.
Fiți atenți atunci când conectați noduri în cerc — efectele nu vor fi întotdeauna evidente! Aveți o idee clară despre ce faceți și de ce!
Este posibil să construim totuși un generator cu nodurile disponibile? Da, este posibil! Dar pentru aceasta este necesar un nod care să fie capabil să genereze evenimente. Și există un astfel de nod — acesta este „linia de întârziere”. Să vedem cum funcționează generatorul cu un periplu de 6 secunde, așa cum se vede în imaginea de mai jos.

Elementul cheie al generatorului este nodul A — linia de întârziere. Dacă schimbi starea intrării liniei de întârziere de la 0 la 1, atunci 1 la ieșire nu va apărea imediat, ci doar după un timp specificat. În cazul nostru, acesta este de 3 secunde. La fel, dacă schimbi starea intrării liniei de întârziere de la 1 la 0, atunci 0 la ieșire va apărea după aceleași 3 secunde. Timpul de întârziere este definit în zecimi de secundă. Astfel, valoarea 30 înseamnă — 3 sec.
Particularitatea liniei de întârziere este că aceasta generează un eveniment după expirarea timpului de întârziere.
Să presupunem că inițial la ieșirea liniei de întârziere era 0. După ce trece prin nodul B — invertorul — acest 0 se transformă în 1 și ajunge la intrarea liniei de întârziere. Imediat nu se întâmplă nimic. La ieșirea liniei de întârziere, așa cum era 0, așa va rămâne, dar se activează cronometrarea timpului de întârziere. Trece 3 secunde. Și imediat linia de întârziere generează un eveniment. La ieșirea sa apare 1. Această unitate, după ce trece prin nodul B — invertorul — se transformă în 0 și ajunge la intrarea liniei de întârziere. Trece încă 3 secunde… și procesul se repetă. Astfel, la fiecare 3 secunde starea ieșirii liniei de întârziere se schimbă de la 0 la 1 și apoi de la 1 la 0. Relèul clicăie. Generatorul funcționează. Perioada impulsurilor este de 6 secunde (3 secunde la ieșire 0 și 3 secunde — 1).
Dar, în schemele reale, de obicei nu este nevoie să folosești nici acest exemplu. Există noduri-timeri speciale, care generează minunat, fără ajutor extern, o secvență de impulsuri cu o perioadă definită. Durata „0” și „1” în aceste impulsuri este egală cu jumătate din perioadă.
Pentru a defini acțiuni periodice, folosiți noduri-timeri.
Voi menționa că aceste semnale digitale, unde durata „0” și „1” este egală, se numesc „meandru”.
Sper că am lămurit puțin întrebarea despre cum se propagă evenimentele între noduri și ce nu trebuie să faci.
Concluzie și linkuri
Articolul a ieșit scurt, dar este un articol-răspuns la întrebările apărute despre noduri și evenimente.
Pe măsură ce firmware-ul avansează și apar noi exemple, voi scrie despre cum să programez ShIoTiny articole scurte, atâta timp cât va fi interesant pentru oameni.
Așa cum am spus anterior, schema, firmware-ul, exemplele, descrierea nodurilor și tot .
Întrebări, sugestii, critici — acestea sunt pentru aici: shiotiny@yandex.ru
Sursa: habr.com
