
Huvudpunkter eller vad denna artikel handlar om
Ămnet för artikeln Ă€r visuell programmering av PLC. ShIoTiny för smarta hem, som beskrivs hĂ€r: .
Mycket kortfattat behandlas begreppen noder, kopplingar, hÀndelser, samt egenskaperna hos laddning och utförande av det visuella programmet pÄ ESP8266, som utgör grunden för PLC. ShIoTiny.
Inledning eller ett par organisatoriska frÄgor
I den föregÄende artikeln om min utveckling gav jag en kort översikt över kontrollerarens möjligheter. ShIoTiny.
Som det kan lÄta konstigt, visade allmÀnheten ett ganska starkt intresse och stÀllde mig mÄnga frÄgor. Vissa personer erbjöd till och med direkt att köpa kontrollen av mig. Nej, jag har inget emot att tjÀna lite, men min samvete tillÄter mig inte att sÀlja nÄgot som fortfarande Àr mycket rÄtt ur programmeringssynpunkt.
DÀrför har jag lagt ut binÀrer för fastvaran och en krets pÄ GitHub: .
Nu kan alla flasha ESP-07 och sjĂ€lva leka med fastvaran. Om nĂ„gon verkligen vill ha ett sĂ„dant kort som pĂ„ bilden â sĂ„ har jag nĂ„gra stycken. Skriv till mailen shiotiny@yandex.ru. Men som den oförglömliga Ogurtsov sa: "Jag tar inget ansvar!".
SÄ, lÄt oss gÄ till kÀrnan: vad Àr "nod" (noda) och "hÀndelse"? Hur körs programmet?
Som vanligt â lĂ„t oss börja i ordning: med laddningen av programmet.
Hur programmet laddas
LÄt oss börja med vad som hÀnder nÀr vi trycker pÄ knappen Ladda upp i redigeraren ElDraw och vÄrt schema-program, som bestÄr av vackra rutor, flyger till enheten.
För det första byggs en textbeskrivning av vÄrt ritade schema.
För det andra kontrolleras det â Ă€r alla ingĂ„ngar av noder anslutna till utgĂ„ngarna. Det fĂ„r inte finnas nĂ„gra "hĂ€ngande" ingĂ„ngar. Om en sĂ„dan ingĂ„ng upptĂ€cks â kommer schemat inte att laddas i ShIoTiny, och redigeraren kommer att ge ett motsvarande varningsmeddelande.
Om allt gick bra, skickar redigeraren en textbeskrivning av schemat till ShIoTiny en nod i taget. Naturligtvis tas det nuvarande schemat frÄn ShIoTiny bort i förvÀg. Den erhÄllna textbeskrivningen sparas i FLASH-minnet.
För övrigt, om du vill ta bort schemat frÄn enheten, ladda bara upp ett tomt schema (som inte innehÄller nÄgra element-noder).
SÄ snart hela schema-programmet har laddats in i PLC ShIoTiny börjar det "utföras". Vad betyder det?
Vi noterar att processen för att ladda schemat frÄn FLASH-minnet vid strömsÀttning och vid mottagning av schemat frÄn redigeraren Àr identiska.
Först skapas noder baserat pÄ deras beskrivning.
DÀrefter sÀtts relationerna mellan noderna. Det vill sÀga lÀnkar mellan utgÄngar och ingÄngar genereras.
Och först efter allt detta startas huvudprogrammet.
Jag skrev lÀnge, men hela processen - frÄn "laddning" av schemat frÄn FLASH-minnet till starten av huvudcykeln - tar brÄkdelen av en sekund för ett schema med 60-80 noder.
Hur fungerar huvudcykeln? VÀldigt enkelt. Först vÀntar den pÄ att ett hÀndelse ska intrÀffa hÀndelser i nÄgon nod, sedan behandlar den hÀndelsen. Och sÄ fortsÀtter det. Tills dess att en ny schema laddas in i ShIoTiny.
Jag har redan nÀmnt sÄdana saker som hÀndelser, noder och kopplingar. Men vad innebÀr detta ur ett programvaruperspektiv? Det ska vi prata om idag.
Noder, relationer och hÀndelser
Det rÀcker med att titta pÄ exempel för schemprogram för ShIoTiny, för att förstÄ att schemat bestÄr av endast tvÄ entiteter - noder (eller element) och relationerna mellan dem.
Nod, nod eller schematiskt element â Ă€r en virtuell representation av nĂ„got handlingar över data. Det kan vara en aritmetisk operation, logisk operation eller vilken operation som helst som vi kan tĂ€nka oss. Det viktigaste Ă€r att noden har en ingĂ„ng och en utgĂ„ng.
IngĂ„ng â Ă€r platsen dĂ€r noden tar emot data. IngĂ„ngarna avbildas som punkter som alltid finns till vĂ€nster om noden.
UtgĂ„ng â Ă€r platsen dĂ€r resultatet av nodens arbete skickas ut. UtgĂ„ngarna avbildas som punkter som alltid finns till höger om noden.
Vissa noder har inga ingÄngar. Dessa noder genererar resultat inuti sig sjÀlva. Till exempel konstantnoden eller sensornoden: de behöver inga data frÄn andra noder för att rapportera resultat.
à andra sidan har andra noder inga utgÄngar. Det Àr noder som representerar till exempel styranordningar (relÀer eller liknande). De tar emot data men genererar inget resultat som kan anvÀndas av andra noder.
Dessutom finns det en unik kommentar-nod. Den gör inget, har varken ingÄngar eller utgÄngar. Dess syfte Àr att vara en förklaring i schemat.
Vad Ă€r "hĂ€ndelse»? HĂ€ndelse â Ă€r uppkomsten av nya data i en nod. Till exempel inkluderar hĂ€ndelser: förĂ€ndring av ingĂ„ende tillstĂ„nd (nod Input), mottagande av data frĂ„n en annan enhet (noder MQTT och UDP), utgĂ„ngen av en angiven tidsperiod (noder Timer och Fördröjning) och sĂ„ vidare.
Vad behövs hÀndelser för? Jo, för att faststÀlla i vilken nod nya data har uppstÄtt och vilka noders tillstÄnd som behöver Àndras pÄ grund av mottagningen av ny data. HÀndelsen "passerar" genom kedjan av noder tills alla noder, vars tillstÄnd behöver kontrolleras och Àndras, har besökts.
Alla noder kan delas in i tvÄ kategorier.
Noder som kan generera hÀndelser kallar vi "aktiva noder».
Noder som inte kan generera hÀndelser kallar vi "passiva noder».
NÀr en nod genererar en hÀndelse (dvs. nÀr nya data dyker upp pÄ dess utgÄng) förÀndras normalt tillstÄndet för hela kedjan av noder anslutna till utgÄngen av hÀndelsegeneratorn.
För att göra det tydligt, lÄt oss titta pÄ exemplet i bilden.

De aktiva noderna hÀr Àr Input1, Input2 och Input3. De andra noderna Àr passiva. LÄt oss se vad som hÀnder nÀr nÄgon av ingÄngarna sluts. Resultaten har sammanstÀllts i en tabell för enkelhets skull.

Som vi ser, vid uppkomsten av en hÀndelse, byggs en kedja frÄn hÀndelsekÀllnodet till den slutliga noden. TillstÄndet för noder som inte ingÄr i kedjan förÀndras inte.
Det uppstÄr en berÀttigad frÄga, vad hÀnder om tvÄ eller flera hÀndelser uppstÄr samtidigt?
Som en beundrare av Gleb Anfilovs kreativa arbete kÀnner jag att jag vill skicka den nyfikna frÄgestÀllaren till hans bok "Flykt frÄn förvÄningen". Det handlar om "relativitetsteorin för de minsta", dÀr det förklaras utmÀrkt vad som menas med "samtidigt" och hur man lever med det.
Men rent praktiskt Àr allt mycket enklare: vid uppkomsten av tvÄ eller flera hÀndelser byggs och behandlas alla kedjor frÄn varje hÀndelsekÀlla i tur och ordning, utan nÄgra underverk.
NĂ€sta fullt legitima frĂ„ga frĂ„n den nyfikna lĂ€saren Ă€r: vad hĂ€nder om noderna kopplas i en ring? Eller, som det oftast sĂ€gs bland dessa kloka mĂ€nniskor â införa Ă„terkoppling. Det vill sĂ€ga att koppla utgĂ„ngen av en nod till ingĂ„ngen av föregĂ„ende nod pĂ„ ett sĂ€tt sĂ„ att tillstĂ„ndet för utgĂ„ngen till den noden pĂ„verkar tillstĂ„ndet för dess egen ingĂ„ng. En direkt koppling av nodens utgĂ„ng till dess egen ingĂ„ng tillĂ„ts inte av redaktören. ElDraw. Men pĂ„ ett indirekt sĂ€tt, som pĂ„ bilden nedan â Ă€r det möjligt att göra detta.
SÄ, vad kommer hÀnda i det hÀr fallet? Svaret kommer att vara mycket "definitivt": beroende pÄ vilka noder. LÄt oss titta pÄ exemplet i bilden.

NĂ€r ingĂ„ngskontakterna Input1 Ă€r öppna vid den övre ingĂ„ngen av nod A â 0. Vid utgĂ„ngen av nod A, ocksĂ„ 0. Vid utgĂ„ngen av nod B â 1. Och slutligen, vid den nedre ingĂ„ngen av nod A â 1. Allt Ă€r klart. Och för dem som inte förstĂ„r â se nedan beskrivningen av hur "OCH" och "IKKE" noder fungerar.
Nu kopplar vi ihop ingĂ„ngskontakterna Input1, det vill sĂ€ga att vi ger en enhet pĂ„ den övre ingĂ„ngen av nod A. De som Ă€r bekanta med elektronik vet att vi faktiskt kommer att fĂ„ ett klassiskt schema för en generator baserat pĂ„ logiska element. Och i teorin bör ett sĂ„dant schema oĂ€ndligt ge utföljderna 1-0-1-0-1-0âŠ. och 0-1-0-1-0-1-âŠ. Eftersom hĂ€ndelsen kontinuerligt bör Ă€ndra tillstĂ„ndet av noderna A och B, som springer runt i cykler 2-3-2-3-âŠ!
Men i verkligheten hĂ€nder detta inte. Schemat kommer att falla in i ett slumpmĂ€ssigt tillstĂ„nd â antingen kommer relĂ€et att förbli pĂ„slaget eller avstĂ€ngt, eller sĂ„ kan det lĂ€tt surra genom att slĂ„ pĂ„ och av nĂ„gra gĂ„nger i rad. Allt beror pĂ„ vĂ€dret pĂ„ den södra polen av Mars. Och det Ă€r dĂ€rför detta hĂ€nder.
HĂ€ndelsen med nod Input1 Ă€ndrar tillstĂ„ndet av nod A, sedan nod B och sĂ„ vidare i en cykel flera gĂ„nger. Programmet identifierar "loopingen" av hĂ€ndelsen och tvingar att avsluta denna karneval. Efter detta blockeras Ă€ndringen av tillstĂ„ndet för noderna A och B tills en ny hĂ€ndelse intrĂ€ffar. Tidpunkten nĂ€r programmet beslutar â "en gĂ„ng för mycket att snurra runt!" â beror i allmĂ€nhet pĂ„ mĂ„nga faktorer och kan betraktas som slumpmĂ€ssig.
Var försiktig med att koppla noder i en ring â effekterna kommer inte alltid att vara uppenbara! Var tydlig med vad och varför du gör det!
Kan vi Ă€ndĂ„ bygga en generator med de noder som Ă€r tillgĂ€ngliga för oss? Ja, det kan vi! Men för detta krĂ€vs en nod som sjĂ€lv kan generera hĂ€ndelser. Och det finns en sĂ„dan nod â det Ă€r "fördröjningslinjen". LĂ„t oss se hur generatorn fungerar med en period pĂ„ 6 sekunder pĂ„ bilden nedan.

Den centrala komponenten i generatorn Ă€r nod A â fördröjningslinjen. Om man Ă€ndrar ingĂ„ngstillstĂ„ndet för fördröjningslinjen frĂ„n 0 till 1, sĂ„ kommer 1 pĂ„ utgĂ„ngen inte att dyka upp omedelbart, utan först efter en viss tid. I vĂ„rt fall Ă€r det 3 sekunder. PĂ„ samma sĂ€tt, om man Ă€ndrar ingĂ„ngstillstĂ„ndet för fördröjningslinjen frĂ„n 1 till 0, sĂ„ kommer 0 pĂ„ utgĂ„ngen att dyka upp efter samma 3 sekunder. Fördröjningstiden anges i tiondelar av en sekund. Det vill sĂ€ga vĂ€rdet 30 betyder â 3 sek.
En egenskap hos fördröjningslinjen Àr att den generar en hÀndelse efter att fördröjningstiden har passerat.
Antag att det initialt pĂ„ utgĂ„ngen av fördröjningslinjen fanns 0. Efter att ha passerat nod B â inverteraren â omvandlas detta 0 till 1 och skickas till ingĂ„ngen av fördröjningslinjen. Omedelbart hĂ€nder ingenting. PĂ„ utgĂ„ngen av fördröjningslinjen förblir det 0, men tiden för fördröjningen börjar rĂ€knas ner. Tre sekunder gĂ„r. Och dĂ„ genererar fördröjningslinjen en hĂ€ndelse. 1 dyker upp pĂ„ utgĂ„ngen. Denna 1 omvandlas efter att ha passerat nod B â inverteraren â till 0 och skickas till ingĂ„ngen av fördröjningslinjen. Ytterligare tre sekunder gĂ„r⊠och processen upprepas. Det vill sĂ€ga var tredje sekund förĂ€ndras utgĂ„ngstillstĂ„ndet för fördröjningslinjen frĂ„n 0 till 1 och sedan frĂ„n 1 till 0. RelĂ€et klickar. Generatorn fungerar. Impulsperioden Ă€r 6 sekunder (3 sekunder med noll och 3 sekunder med ett).
Men i verkliga scheman behöver man oftast inte anvÀnda detta exempel. Det finns speciella timer-noder som utmÀrkt och utan hjÀlp genererar en sekvens av impulser med angiven period. Varaktigheten av "noll" och "ett" i dessa impulser Àr lika med hÀlften av perioden.
För att stÀlla in periodiska ÄtgÀrder, anvÀnd timer-noder.
Jag vill pÄpeka att sÄdana digitala signaler dÀr "noll" och "ett" varaktighet Àr lika, kallas för "meander".
Jag hoppas att jag har klargjort frÄgan om hur hÀndelser sprids mellan noder och vad man inte ska göra?
Slutsats och lÀnkar
Artikeln blev kort, men det Àr en artikel som svarar pÄ de uppkomna frÄgorna kring noder och hÀndelser.
Allt eftersom firmware utvecklas och nya exempel dyker upp kommer jag att skriva om hur man programmerar ShIoTiny smÄ artiklar, sÄ lÀnge det Àr intressant för folk.
Som tidigare, schema, firmware, exempel, beskrivning av noder och allt .
FrĂ„gor, önskemĂ„l, kritik â hit: shiotiny@yandex.ru
KĂ€lla: habr.com
