ShIoTiny: Nodoj, Ligiloj, kaj Eventoj aŭ Trajtoj de Desegnaj Programoj

ShIoTiny: Nodoj, Ligiloj, kaj Eventoj aŭ Trajtoj de Desegnaj Programoj

Ĉefaj punktoj aŭ pri kio temas ĉi tiu artikolo

La temo de la artikolo estas vida PLC-programado ŜIoTiny por la inteligenta hejmo priskribita ĉi tie: ShIoTiny: malgranda aŭtomatigo, Interreto de aferoj aŭ "ses monatoj antaŭ ferio".

Tre mallonge konceptoj kiel ekzemple nodoj, konektoj, okazaĵoj, kaj ankaŭ funkciojn de ŝarĝo kaj ekzekuto de vida programo sur ESP8266, kiu estas la bazo de la PLC ŜIoTiny.

Enkonduko aŭ kelkaj organizaj demandoj

En la antaŭa artikolo pri mia evoluo, mi donis mallongan superrigardon pri la kapabloj de la regilo ŜIoTiny.

Sufiĉe strange, la publiko montris sufiĉe fortan intereson kaj faris al mi sufiĉe multajn demandojn. Kelkaj amikoj eĉ tuj proponis aĉeti regilon de mi. Ne, mi ne kontraŭas gajni iom da mono, sed mia konscienco ne permesas al mi vendi ion, kio ankoraŭ estas tre kruda laŭ programaro.

Tial mi afiŝis la firmware-binarojn kaj aparatdiagramon sur GitHub: firmware + plej mallongaj instrukcioj + diagramo + ekzemploj.

Nun ĉiuj povas ekbrili la ESP-07 kaj ludi per la firmvaro mem. Se iu vere volas ĝuste la saman tabulon kiel en la foto, tiam mi havas plurajn el ili. Skribu retpoŝte [retpoŝte protektita]. Sed, kiel diris la neforgesebla Ogurcov: "Mi ne respondecas pri nenio!"

Do, ni iru al la afero: kio estas "nodo" (nodo) kaj "evento"? Kiel la programo estas ekzekutita?

Kiel kutime, ni komencu en ordo: elŝutante la programon.

Kiel la programo estas ŝarĝita

Ni komencu per kio okazas kiam ni premas butonon alŝuto en la redaktoro ElDraw kaj nia cirkvito-programo, konsistanta el belaj kvadratoj, flugas en la aparaton.

Unue, surbaze de la diagramo, kiun ni desegnis, ĝia priskribo en tekstformo estas konstruita.
Due, ĝi kontrolas ĉu ĉiuj nodaj enigaĵoj estas konektitaj al eliroj. Ne devus esti "pendantaj" enirejoj. Se tia enigo estas detektita, la cirkvito ne estos ŝarĝita en ShIoTiny, kaj la redaktilo montros respondan averton.

Se ĉio iris bone, la redaktisto sendas tekstan priskribon de la cirkvito po unu nodo al ShIoTiny. Kompreneble, la ekzistanta cirkvito de ShIoTiny unue estas forigita. La rezulta teksta priskribo estas konservita en FLASH-memoro.

Cetere, se vi volas forigi cirkviton de aparato, tiam simple ŝarĝu malplenan cirkviton en ĝin (ne enhavantan ununuran nodan elementon).

Post kiam la tuta cirkvitprogramo estas ŝarĝita en la ShIoTiny PLC, ĝi komencas "ekzekuti". Kion ĝi signifas?

Notu ke la procezoj por ŝarĝi cirkviton de FLASH-memoro kiam la potenco estas ŝaltita kaj kiam ricevas cirkviton de la redaktilo estas identaj.

Unue, nodaj objektoj estas kreitaj surbaze de sia priskribo.
Tiam ligoj estas faritaj inter nodoj. Tio estas, ligiloj de produktaĵoj al enigaĵoj kaj enigaĵoj al produktaĵoj estas generitaj.

Kaj nur post ĉio ĉi komenciĝas la ĉefa programa ekzekutciklo.

Mi skribis dum longa tempo, sed la tuta procezo - de "ŝarĝado" de la cirkvito de FLASH-memoro ĝis komenci la ĉefan ciklon - prenas frakcion de sekundo por cirkvito de 60-80 nodoj.

Kiel funkcias la ĉefa buklo? Tre simpla. Unue li atendas la aperon okazaĵoj ĉe iu nodo, tiam prilaboras tiun okazaĵon. Kaj tiel plu senfine. Nu, aŭ ĝis ili alŝutos novan skemon al ShIoTiny.

Plurfoje mi jam menciis aferojn kiel okazaĵoj, nodoj и konektoj. Sed kio estas ĉi tio el programara vidpunkto? Ni parolos pri tio hodiaŭ.

Nodoj, rilatoj kaj eventoj

Nur rigardu la ekzemplojn de cirkvitaj programoj por ŜIoTinykompreni, ke la diagramo konsistas el nur du estaĵoj - nodoj (aŭ elementoj) kaj la ligoj inter ili.

Nodo, sed jescirkvito-elemento estas virtuala reprezento de iuj ago super la datumoj. Ĉi tio povas esti aritmetika operacio, logika operacio aŭ ajna operacio, kiu venas al nia menso. La ĉefa afero estas, ke la nodo havas enirejon kaj elirejon.

eniro - ĉi tiu estas la loko kie la nodo ricevas datumojn. La enigbildoj estas punktoj kiuj ĉiam estas sur la maldekstra flanko de la nodo.

Eliro - ĉi tiu estas la loko kie la rezulto de la operacio de la nodo estas prenita. La eligbildoj estas punktoj, kiuj ĉiam troviĝas sur la dekstra flanko de la nodo.

Iuj nodoj ne havas enigaĵojn. Tiaj nodoj generas la rezulton interne. Ekzemple, konstanta nodo aŭ sensilnodo: ili ne bezonas datumojn de aliaj nodoj por raporti la rezulton.

Aliaj nodoj, male, ne havas elirojn. Ĉi tiuj estas nodoj, kiuj montras, ekzemple, aktuariojn (relajsoj aŭ io simila). Ili akceptas datenojn sed ne generas komputilan rezulton kiu estas havebla al aliaj nodoj.

Krome, ekzistas ankaŭ unika komenta nodo. Ĝi faras nenion, ne havas enirojn aŭ elirojn. Ĝia celo estas esti klarigo pri la diagramo.

Kio okazis "evento"?" Evento estas la apero de novaj datumoj en iu ajn nodo. Ekzemple, eventoj inkluzivas: ŝanĝo en eniga stato (nodo Eniro), ricevante datumojn de alia aparato (nodoj MQTT и UDP), eksvalidiĝo de difinita tempodaŭro (nodoj timer и Malfruo) kaj tiel plu.

Por kio estas eventoj? Jes, por determini en kiu nodo aperis novaj datumoj kaj la statoj de kiuj nodoj devas esti ŝanĝitaj lige kun la ricevo de novaj datumoj. La okazaĵo kvazaŭ "pasas" laŭ la ĉeno de nodoj ĝis ĝi preteriras ĉiujn nodojn, kies stato devas esti kontrolita kaj ŝanĝita.

Ĉiuj nodoj povas esti dividitaj en du kategoriojn.
Ni voku nodojn kiuj povas generi eventojn "aktivaj nodoj".
Ni nomos nodojn kiuj ne povas generi eventojn "pasivaj nodoj".

Kiam nodo generas okazaĵon (tio estas, novaj datumoj aperas ĉe sia eligo), tiam en la ĝenerala kazo la stato de la tuta ĉeno de nodoj ligitaj al la eligo de la okazaĵgeneratora nodo ŝanĝiĝas.

Por klarigi ĝin, konsideru la ekzemplon en la figuro.

ShIoTiny: Nodoj, Ligiloj, kaj Eventoj aŭ Trajtoj de Desegnaj Programoj

La aktivaj nodoj ĉi tie estas Input1, Input2 kaj Input3. La ceteraj nodoj estas pasivaj. Ni konsideru kio okazas kiam unu aŭ alia enigo estas fermita. Por komforto, la rezultoj estas resumitaj en tabelo.

ShIoTiny: Nodoj, Ligiloj, kaj Eventoj aŭ Trajtoj de Desegnaj Programoj

Kiel vi povas vidi, kiam okazaĵo okazas, ĉeno estas konstruita de la fontnodo de la evento ĝis la fina nodo. La stato de tiuj nodoj, kiuj ne falas en la ĉenon, ne ŝanĝiĝas.

Leĝa demando estiĝas: kio okazos se du aŭ eĉ pluraj eventoj okazas samtempe?

Kiel amanto de la verko de Gleb Anfilov, mi estas tentita sendi scivoleman demandanton al lia libro "Escape from Surprise". Ĉi tio estas "teorio de relativeco por la etuloj", kiu bone klarigas, kion signifas "samtempa" kaj kiel vivi kun ĝi.

Sed praktike ĉio estas multe pli simpla: kiam okazas du aŭ eĉ pluraj eventoj, ĉiuj ĉenoj de ĉiu okazaĵfonto estas sinsekve konstruitaj kaj prilaboritaj laŭvice, kaj neniuj mirakloj okazas.

La sekva tute legitima demando de scivolema leganto estas kio okazos se la nodoj estas konektitaj en ringon? Aŭ, kiel oni diras inter ĉi tiuj saĝaj viroj, enkonduku komentojn. Tio estas, ligu la eliron de unu el la nodoj al la enigo de la antaŭa nodo tiel ke la eligostato de ĉi tiu nodo influas la staton de sia enigo. La redaktilo ne permesos vin rekte konekti la eligon de nodo al ĝia enigo. ElDraw. Sed nerekte, kiel en la suba figuro, tio povas esti farita.

Kio do okazos en ĉi tiu kazo? La respondo estos tre "difina": depende de kiuj nodoj. Ni rigardu la ekzemplon en la figuro.

ShIoTiny: Nodoj, Ligiloj, kaj Eventoj aŭ Trajtoj de Desegnaj Programoj

Kiam la enirkontaktoj de Enigo1 estas malfermitaj, la supra enigo de nodo A estas 0. La eligo de nodo A ankaŭ estas 0. La eligo de nodo B estas 1. Kaj, finfine, la malsupra enigo de nodo A estas 1. Ĉio estas XNUMX. klara. Kaj por tiuj, kiuj ne estas klaraj, rigardu sube por priskribo pri kiel funkcias la nodoj "KAJ" kaj "NE".

Nun ni fermas la kontaktojn de la enigo Input1, tio estas, ni aplikas unu al la supra enigo de nodo A. Tiuj, kiuj konas elektronikon, scias, ke fakte ni ricevos klasikan generatoran cirkviton uzante logikaj elementoj. Kaj en teorio, tia cirkvito devus senfine produkti la sekvencon 1-0-1-0-1-0... ĉe la eligo de elementoj A kaj B. kaj 0-1-0-1-0-1-…. Post ĉio, la evento devas konstante ŝanĝi la staton de nodoj A kaj B, kurante en cirklo 2-3-2-3-...!

Sed fakte ĉi tio ne okazas. La cirkvito falos en hazardan staton - aŭ la relajso restos ŝaltita aŭ malŝaltita, aŭ eble iomete zumados plurfoje sinsekve. Ĉio dependas de la vetero ĉe la suda poluso de Marso. Kaj tial tio okazas.

Okazaĵo de nodo Enigo1 ŝanĝas la staton de nodo A, tiam nodo B, kaj tiel plu en cirklo plurfoje. La programo detektas la "buklon" de la evento kaj perforte haltigas ĉi tiun karnavalon. Post tio, ŝanĝoj en la stato de nodoj A kaj B estas blokitaj ĝis nova evento okazas. La momento en kiu la programo decidas "ĉesu turniĝi en rondoj!" - ĝenerale, ĝi dependas de multaj faktoroj kaj povas esti konsiderata hazarda.

Atentu kiam konektos nodojn en ringon - la efikoj ne ĉiam estos evidentaj! Havu bonan ideon pri kio kaj kial vi faras!

Ĉu ankoraŭ eblas konstrui generatoron sur la disponeblaj nodoj por ni? Jes vi povas! Sed ĉi tio postulas nodon kiu povas generi eventojn mem. Kaj ekzistas tia nodo - ĉi tio estas la "malfrua linio". Ni vidu kiel generatoro kun periodo de 6 sekundoj funkcias en la suba figuro.

ShIoTiny: Nodoj, Ligiloj, kaj Eventoj aŭ Trajtoj de Desegnaj Programoj

La ŝlosila elemento de la generatoro estas nodo A - la prokrasta linio. Se vi ŝanĝas la enigan staton de la prokrasta linio de 0 al 1, tiam 1 ne aperos ĉe la eligo tuj, sed nur post difinita tempo. En nia kazo estas 3 sekundoj. Sammaniere, se vi ŝanĝas la enigan staton de la prokrasta linio de 1 al 0, tiam 0 ĉe la eligo aperos post la samaj 3 sekundoj. La prokrastotempo estas fiksita en dekonoj de sekundo. Tio estas, la valoro 30 signifas 3 sekundojn.

Speciala trajto de la prokrastlinio estas ke ĝi generas okazaĵon post kiam la prokrastotempo eksvalidiĝis.

Ni supozu, ke komence la eligo de la prokrasta linio estis 0. Post preterpaso de la nodo B - la invetilo - ĉi tiu 0 iĝas 1 kaj iras al la enigo de la prokrasta linio. Nenio okazas tuj. Ĉe la eligo de la prokrasta linio, ĝi restos 0, sed komenciĝos la retronombrado de la prokrasta tempo. 3 sekundoj pasas. Kaj tiam la prokrasta linio generas eventon. Ĉe ĝia eligo ĝi aperas 1. Ĉi tiu unuo, post trapaso de nodo B - la invetilo - iĝas 0 kaj iras al la enigo de la prokrasta linio. Pliaj 3 sekundoj pasas... kaj la procezo ripetas. Tio estas, ĉiujn 3 sekundojn la stato de la malfrulinia eligo ŝanĝiĝas de 0 al 1 kaj poste de 1 al 0. La relajso klakas. La generatoro funkcias. La pulsperiodo estas 6 sekundoj (3 sekundoj ĉe la eligo nulo kaj 3 sekundoj ĉe la eligo unu).

Sed, en realaj cirkvitoj, kutime ne necesas uzi ĉi tiun ekzemplon. Estas specialaj temporizaj nodoj, kiuj perfekte kaj sen ekstera helpo generas sinsekvon de pulsoj kun difinita periodo. La daŭro de "nul" kaj "unu" en ĉi tiuj pulsoj estas egala al duono de la periodo.

Por agordi periodajn agojn, uzu temporizajn nodojn.

Mi rimarkas, ke tiaj ciferecaj signaloj, kie la daŭro de "nul" kaj "unu" estas egalaj, estas nomataj "meandro".

Mi esperas, ke mi iomete klarigis la demandon pri kiel eventoj disvastiĝas inter nodoj kaj kion ne fari?

Konkludo kaj referencoj

La artikolo montriĝis mallonga, sed ĉi tiu artikolo estas respondo al demandoj, kiuj aperis pri nodoj kaj eventoj.

Dum firmvaro disvolviĝas kaj novaj ekzemploj aperos, mi skribos pri kiel programi ŜIoTiny malgrandaj artikoloj kondiĉe ke ĝi estos interesa al homoj.

Kiel antaŭe, diagramo, firmvaro, ekzemploj, priskribo de komponantoj kaj ĉio la resto estas ĉi tie.

Demandoj, sugestoj, kritikoj - iru ĉi tie: [retpoŝte protektita]

fonto: www.habr.com

Aldoni komenton