ShIoTiny: nodes, connexions i esdeveniments o característiques dels programes de dibuix

ShIoTiny: nodes, connexions i esdeveniments o característiques dels programes de dibuix

Punts principals o de què tracta aquest article

El tema de l'article és la programació visual de PLC ShIoTiny per a la casa intel·ligent que es descriu aquí: ShIoTiny: petita automatització, Internet de les coses o "sis mesos abans de vacances".

Molt breument conceptes com ara nusos, comunicacions, esdeveniments, així com característiques de càrrega i execució d'un programa visual ESP8266, que és la base del PLC ShIoTiny.

Introducció o un parell de preguntes organitzatives

A l'article anterior sobre el meu desenvolupament, vaig donar una breu visió general de les capacitats del controlador ShIoTiny.

Curiosament, el públic va mostrar un interès força fort i em va fer moltes preguntes. Alguns amics fins i tot em van oferir immediatament a comprar-me un controlador. No, no estic en contra de guanyar una mica de diners, però la meva consciència no em permet vendre quelcom que encara és molt cru pel que fa a programari.

Per tant, vaig publicar els binaris del firmware i el diagrama del dispositiu a GitHub: firmware + instruccions més breus + diagrama + exemples.

Ara tothom pot flashejar l'ESP-07 i jugar amb el microprogramari. Si algú realment vol exactament el mateix tauler que a la foto, en tinc diversos. Escriu per correu electrònic [protegit per correu electrònic]. Però, com deia l'inoblidable Ogurtsov: "No sóc responsable de res!"

Per tant, anem al punt: què és "nus" (node) i "esdeveniment"? Com s'executa el programa?

Com és habitual, comencem per ordre: descarregant el programa.

Com es carrega el programa

Comencem pel que passa quan premem un botó Pujar a l'editor ElDraw i el nostre programa de circuit, format per bells quadrats, vola al dispositiu.

En primer lloc, a partir del diagrama que hem dibuixat, es construeix la seva descripció en forma de text.
En segon lloc, comprova si totes les entrades del node estan connectades a les sortides. No hi hauria d'haver entrades "penjants". Si es detecta aquesta entrada, el circuit no es carregarà a ShIoTiny i l'editor mostrarà un avís corresponent.

Si tot ha anat bé, l'editor envia una descripció de text del circuit node per node a ShIoTiny. Per descomptat, primer s'elimina el circuit existent de ShIoTiny. La descripció de text resultant s'emmagatzema a la memòria FLASH.

Per cert, si voleu eliminar un circuit d'un dispositiu, només heu de carregar-hi un circuit buit (que no conté un sol element de node).

Un cop carregat tot el programa del circuit al PLC ShIoTiny, comença a "executar-se". Què vol dir?

Tingueu en compte que els processos per carregar un circuit des de la memòria FLASH quan s'engega l'alimentació i quan es rep un circuit de l'editor són idèntics.

En primer lloc, els objectes node es creen a partir de la seva descripció.
Després es fan connexions entre nodes. És a dir, es generen enllaços de sortides a entrades i entrades a sortides.

I només després de tot això comença el cicle principal d'execució del programa.

Vaig escriure durant molt de temps, però tot el procés, des de "carregar" el circuit des de la memòria FLASH fins a iniciar el cicle principal, triga una fracció de segon per a un circuit de 60-80 nodes.

Com funciona el bucle principal? Molt simple. Primer espera l'aparició esdeveniments en algun node, després processa aquest esdeveniment. I així sense fi. Bé, o fins que pengin un nou esquema a ShIoTiny.

Diverses vegades ja he esmentat coses com esdeveniments, nusos и comunicacions. Però, què és això des del punt de vista del programari? Avui en parlarem.

Nodes, connexions i esdeveniments

Només cal veure els exemples de programes de circuits per ShIoTinyper entendre que el diagrama consta només de dues entitats: nodes (o elements) i les connexions entre ells.

Node, però sí o element del circuit és una representació virtual d'alguns activitat sobre les dades. Aquesta pot ser una operació aritmètica, una operació lògica o qualsevol operació que ens vingui al cap. El més important és que el node tingui una entrada i una sortida.

Entrada - aquest és el lloc on el node rep les dades. Les imatges d'entrada són punts que sempre estan al costat esquerre del node.

Sortida - aquest és el lloc on es recupera el resultat de l'operació del node. Les imatges de sortida són punts que sempre es troben al costat dret del node.

Alguns nodes no tenen entrades. Aquests nodes generen el resultat internament. Per exemple, un node constant o un node sensor: no necessiten dades d'altres nodes per informar del resultat.

Altres nodes, per contra, no tenen sortides. Són nodes que mostren, per exemple, actuadors (relés o alguna cosa semblant). Accepten dades però no generen un resultat computacional disponible per a altres nodes.

A més, també hi ha un node de comentari únic. No fa res, no té entrades ni sortides. La seva finalitat és ser una explicació sobre el diagrama.

Què ha passat "esdeveniment"? Esdeveniment és l'aparició de noves dades en qualsevol node. Per exemple, els esdeveniments inclouen: canvi en l'estat d'entrada (node entrada), rebent dades d'un altre dispositiu (nodes MQTT и UDP), caducitat d'un període de temps especificat (nodes Timer и Retard) etcètera.

Per a què serveixen els esdeveniments? Sí, per determinar en quin node han sorgit noves dades i quins estats s'han de canviar en relació amb la recepció de noves dades. L'esdeveniment, per dir-ho, "passa" al llarg de la cadena de nodes fins que passa per alt tots els nodes l'estat dels quals s'ha de comprovar i canviar.

Tots els nodes es poden dividir en dues categories.
Anem a cridar nodes que poden generar esdeveniments "nodes actius».
Anomenarem nodes que no poden generar esdeveniments "nodes passius».

Quan un node genera un esdeveniment (és a dir, apareixen noves dades a la seva sortida), aleshores, en el cas general, l'estat de tota la cadena de nodes connectats a la sortida del node generador d'esdeveniments canvia.

Per aclarir-ho, considereu l'exemple de la figura.

ShIoTiny: nodes, connexions i esdeveniments o característiques dels programes de dibuix

Els nodes actius aquí són Input1, Input2 i Input3. La resta de nodes són passius. Considerem què passa quan es tanca una o altra entrada. Per comoditat, els resultats es resumeixen en una taula.

ShIoTiny: nodes, connexions i esdeveniments o característiques dels programes de dibuix

Com podeu veure, quan es produeix un esdeveniment, es construeix una cadena des del node font de l'esdeveniment fins al node final. L'estat d'aquells nodes que no cauen a la cadena no canvia.

Sorgeix una pregunta legítima: què passarà si dos o fins i tot diversos esdeveniments ocorren simultàniament?

Com a amant de l'obra de Gleb Anfilov, estic temptat d'enviar un curiós interrogador al seu llibre "Escape from Surprise". Es tracta d'una “teoria de la relativitat per als més petits”, que explica bé què vol dir “simultani” i com conviure-hi.

Però pràcticament tot és molt més senzill: quan es produeixen dos o fins i tot diversos esdeveniments, totes les cadenes de cada font d'esdeveniments es construeixen i es processen seqüencialment al seu torn, i no es produeixen miracles.

La següent pregunta completament legítima d'un lector curiós és què passarà si els nodes estan connectats en un anell? O, com diuen entre aquests nois intel·ligents, introduïu comentaris. És a dir, connecteu la sortida d'un dels nodes a l'entrada del node anterior de manera que l'estat de sortida d'aquest node afecti l'estat de la seva entrada. L'editor no us permetrà connectar directament la sortida d'un node a la seva entrada. ElDraw. Però indirectament, com a la figura següent, això es pot fer.

Aleshores, què passarà en aquest cas? La resposta serà molt "definida": segons quins nodes. Vegem l'exemple de la figura.

ShIoTiny: nodes, connexions i esdeveniments o característiques dels programes de dibuix

Quan els contactes d'entrada de l'entrada1 estan oberts, l'entrada superior del node A és 0. La sortida del node A també és 0. La sortida del node B és 1. I, finalment, l'entrada inferior del node A és 1. Tot és XNUMX. clar. I per a aquells que no ho tinguin clar, busqueu a continuació una descripció de com funcionen els nodes "I" i "NO".

Ara tanquem els contactes de l'entrada Input1, és a dir, n'apliquem un a l'entrada superior del node A. Els que estiguin familiaritzats amb l'electrònica saben que de fet obtindrem un circuit generador clàssic amb elements lògics. I en teoria, aquest circuit hauria de produir sense parar la seqüència 1-0-1-0-1-0... a la sortida dels elements A i B. i 0-1-0-1-0-1-…. Al cap i a la fi, l'esdeveniment ha de canviar constantment l'estat dels nodes A i B, corrent en un cercle 2-3-2-3-...!

Però en realitat això no passa. El circuit caurà en un estat aleatori, o el relé romandrà encès o apagat, o potser s'encendrà i s'apagarà lleugerament diverses vegades seguides. Tot depèn del clima al pol sud de Mart. I per això passa això.

Un esdeveniment del node Input1 canvia l'estat del node A, després del node B, i així successivament en un cercle diverses vegades. El programa detecta el "looping" de l'esdeveniment i atura per la força aquest carnaval. Després d'això, els canvis en l'estat dels nodes A i B es bloquegen fins que es produeix un nou esdeveniment. El moment en què el programa decideix "para de girar en cercles!" - en general, depèn de molts factors i es pot considerar aleatori.

Aneu amb compte quan connecteu nusos en un anell: els efectes no sempre seran evidents! Fes una bona idea de què i per què estàs fent!

Encara és possible construir un generador als nodes disponibles? Si, tu pots! Però això requereix un node que pugui generar esdeveniments per si mateix. I hi ha aquest node: aquesta és la "línia de retard". Vegem com funciona un generador amb un període de 6 segons a la figura següent.

ShIoTiny: nodes, connexions i esdeveniments o característiques dels programes de dibuix

L'element clau del generador és el node A: la línia de retard. Si canvieu l'estat d'entrada de la línia de retard de 0 a 1, 1 no apareixerà immediatament a la sortida, sinó només després d'un temps especificat. En el nostre cas són 3 segons. De la mateixa manera, si canvieu l'estat d'entrada de la línia de retard d'1 a 0, apareixerà 0 a la sortida després dels mateixos 3 segons. El temps de retard s'estableix en dècimes de segon. És a dir, el valor 30 significa 3 segons.

Una característica especial de la línia de retard és que genera un esdeveniment després d'haver expirat el temps de retard.

Suposem que inicialment la sortida de la línia de retard era 0. Després de passar el node B, l'inversor, aquest 0 es converteix en 1 i passa a l'entrada de la línia de retard. No passa res de seguida. A la sortida de la línia de retard, romandrà 0, però començarà el compte enrere del temps de retard. Passen 3 segons. I llavors la línia de retard genera un esdeveniment. A la seva sortida apareix 1. Aquesta unitat, després de passar pel node B -l'inversor- es converteix en 0 i va a l'entrada de la línia de retard. Passen 3 segons més... i el procés es repeteix. És a dir, cada 3 segons l'estat de la sortida de la línia de retard canvia de 0 a 1 i després d'1 a 0. El relé fa clic. El generador està funcionant. El període de pols és de 6 segons (3 segons a la sortida zero i 3 segons a la sortida).

Però, en circuits reals, normalment no cal utilitzar aquest exemple. Hi ha nodes de temporitzadors especials que perfectament i sense ajuda externa generen una seqüència de polsos amb un període determinat. La durada de "zero" i "un" en aquests polsos és igual a la meitat del període.

Per establir accions periòdiques, utilitzeu nodes de temporitzador.

Observo que aquests senyals digitals, on la durada de "zero" i "un" són iguals, s'anomenen "meandre".

Espero haver aclarit una mica la pregunta sobre com es propaguen els esdeveniments entre nodes i què no cal fer?

Conclusió i referències

L'article va resultar ser breu, però aquest article és una resposta a les preguntes que han sorgit sobre nodes i esdeveniments.

A mesura que es desenvolupi el firmware i apareguin nous exemples, escriuré sobre com programar ShIoTiny articles petits sempre que siguin interessants per a la gent.

Com abans, diagrama, firmware, exemples, descripció de components i tot la resta és aquí.

Preguntes, suggeriments, crítiques: aneu aquí: [protegit per correu electrònic]

Font: www.habr.com

Afegeix comentari