ShioTiny: noder, anslutningar och händelser eller funktioner i ritprogram

ShioTiny: noder, anslutningar och händelser eller funktioner i ritprogram

Huvudpunkter eller vad den här artikeln handlar om

Ämnet för artikeln är visuell PLC-programmering ShioTiny för det smarta hem som beskrivs här: ShioTiny: liten automatisering, Internet of things eller "sex månader före semester".

Väldigt kort begrepp som t.ex webbplatser, kommunikation, utvecklingen, samt funktioner för att ladda och köra ett visuellt program på ESP8266, som är grunden för PLC:n ShioTiny.

Inledning eller ett par organisatoriska frågor

I den tidigare artikeln om min utveckling gav jag en kort översikt över kontrollerns möjligheter ShioTiny.

Märkligt nog visade allmänheten ett ganska stort intresse och ställde ganska många frågor till mig. Några vänner erbjöd sig till och med omedelbart att köpa en kontroller av mig. Nej, jag är inte emot att tjäna lite pengar, men mitt samvete tillåter mig inte att sälja något som fortfarande är väldigt grovt när det gäller mjukvara.

Därför postade jag firmware-binärfilerna och enhetsdiagrammet på GitHub: firmware + kortaste instruktioner + diagram + exempel.

Nu kan alla flasha ESP-07 och leka med firmware själva. Om någon verkligen vill ha exakt samma tavla som på bilden så har jag flera av dem. Skriv via mail [e-postskyddad]. Men som den oförglömliga Ogurtsov brukade säga: "Jag är inte ansvarig för någonting!"

Så låt oss komma till saken: vad är "nod" (nod) och "händelse"? Hur körs programmet?

Låt oss som vanligt börja i ordning: genom att ladda ner programmet.

Hur programmet laddas

Låt oss börja med vad som händer när vi trycker på en knapp Ladda i redaktören ElDraw och vårt kretsprogram, som består av vackra rutor, flyger in i enheten.

För det första, baserat på diagrammet vi har ritat, byggs dess beskrivning i textform.
För det andra kontrollerar den om alla nodingångar är anslutna till utgångar. Det ska inte finnas några "hängande" ingångar. Om en sådan ingång upptäcks, kommer kretsen inte att laddas in i ShIoTiny, och redigeraren kommer att visa en motsvarande varning.

Om allt gick bra skickar redaktören en textbeskrivning av kretsen en nod i taget till ShIoTiny. Naturligtvis tas den befintliga kretsen från ShIoTiny först bort. Den resulterande textbeskrivningen lagras i FLASH-minnet.

Förresten, om du vill ta bort en krets från en enhet, ladda helt enkelt en tom krets i den (som inte innehåller ett enda nodelement).

När hela kretsprogrammet har laddats in i ShioTiny PLC börjar det "exekveras". Vad betyder det?

Observera att processerna för att ladda en krets från FLASH-minnet när strömmen slås på och när du tar emot en krets från editorn är identiska.

Först skapas nodobjekt baserat på deras beskrivning.
Sedan görs kopplingar mellan noder. Det vill säga länkar av utgångar till ingångar och ingångar till utgångar genereras.

Och först efter allt detta startar huvudprogrammets exekveringscykel.

Jag skrev länge, men hela processen - från att "ladda" kretsen från FLASH-minnet till att starta huvudcykeln - tar en bråkdel av en sekund för en krets med 60-80 noder.

Hur fungerar huvudslingan? Väldigt enkelt. Först väntar han på uppkomsten utvecklingen vid någon nod, bearbetar sedan den händelsen. Och så vidare i det oändliga. Tja, eller tills de laddar upp ett nytt schema till ShIoTiny.

Flera gånger har jag redan nämnt saker som utvecklingen, webbplatser и kommunikation. Men vad är detta ur mjukvarusynpunkt? Vi ska prata om detta idag.

Noder, anslutningar och händelser

Se bara på exemplen på kretsprogram för ShioTinyatt förstå att diagrammet endast består av två enheter - noder (eller element) och kopplingarna mellan dem.

nod, men ja eller kretselement är en virtuell representation av vissa aktivitet över datan. Detta kan vara en aritmetisk operation, en logisk operation eller vilken operation som helst som vi tänker på. Huvudsaken är att noden har en ingång och en utgång.

ingång - det här är platsen där noden tar emot data. Ingångsbilderna är punkter som alltid finns på vänster sida av noden.

Utgång - det här är platsen där resultatet av nodens operation hämtas. Utdatabilderna är punkter som alltid är placerade på höger sida av noden.

Vissa noder har inga ingångar. Sådana noder genererar resultatet internt. Till exempel en konstant nod eller en sensornod: de behöver inte data från andra noder för att rapportera resultatet.

Andra noder har tvärtom inga utgångar. Det är noder som visar till exempel ställdon (reläer eller liknande). De accepterar data men genererar inte ett beräkningsresultat som är tillgängligt för andra noder.

Dessutom finns det också en unik kommentarsnod. Den gör ingenting, har inga ingångar eller utgångar. Dess syfte är att vara en förklaring på diagrammet.

Vad har hänt "händelse"? händelse är uppkomsten av ny data i vilken nod som helst. Till exempel inkluderar händelser: ändring av ingångstillstånd (nod Ingång), tar emot data från en annan enhet (noder MQTT и UDP), utgången av en angiven tidsperiod (noder timer и Dröjsmål) och så vidare.

Vad är evenemang till för? Ja, för att avgöra i vilken nod ny data har uppstått och vilka tillstånd för vilka noder behöver ändras i samband med mottagandet av ny data. Händelsen "passerar" så att säga längs kedjan av noder tills den förbigår alla noder vars tillstånd måste kontrolleras och ändras.

Alla noder kan delas in i två kategorier.
Låt oss anropa noder som kan generera händelser "aktiva noder".
Vi kommer att anropa noder som inte kan generera händelser "passiva noder".

När en nod genererar en händelse (det vill säga nya data dyker upp vid dess utgång), ändras i det allmänna fallet tillståndet för hela kedjan av noder som är anslutna till utgången från händelsegeneratornoden.

För att göra det tydligt, överväg exemplet i figuren.

ShioTiny: noder, anslutningar och händelser eller funktioner i ritprogram

De aktiva noderna här är Input1, Input2 och Input3. De återstående noderna är passiva. Låt oss överväga vad som händer när en eller annan ingång stängs. För enkelhetens skull sammanfattas resultaten i en tabell.

ShioTiny: noder, anslutningar och händelser eller funktioner i ritprogram

Som du kan se, när en händelse inträffar byggs en kedja från händelsens källnod till slutnoden. Tillståndet för de noder som inte faller in i kedjan förändras inte.

En berättigad fråga uppstår: vad händer om två eller till och med flera händelser inträffar samtidigt?

Som en älskare av Gleb Anfilovs verk är jag frestad att skicka en nyfiken frågeställare till hans bok "Escape from Surprise." Detta är en "relativitetsteori för de små", som förklarar bra vad "samtidigt" betyder och hur man kan leva med det.

Men praktiskt taget allt är mycket enklare: när två eller till och med flera händelser inträffar byggs alla kedjor från varje händelsekälla sekventiellt och bearbetas i tur och ordning, och inga mirakel inträffar.

Nästa helt berättigade fråga från en nyfiken läsare är vad som händer om noderna kopplas ihop till en ring? Eller, som de säger bland dessa smarta killar, presentera feedback. Det vill säga anslut utgången från en av noderna till ingången på föregående nod så att utgångstillståndet för denna nod påverkar tillståndet för dess ingång. Redaktören tillåter inte att du direkt kopplar utgången från en nod till dess ingång. ElDraw. Men indirekt, som i figuren nedan, kan detta göras.

Så vad kommer att hända i det här fallet? Svaret kommer att vara mycket "definitivt": beroende på vilka noder. Låt oss titta på exemplet i figuren.

ShioTiny: noder, anslutningar och händelser eller funktioner i ritprogram

När ingångskontakterna på Input1 är öppna är den övre ingången på nod A 0. Utgången från nod A är också 0. Utgången från nod B är 1. Och slutligen är den nedre ingången på nod A 1. Allt är klar. Och för dem som inte är tydliga, titta nedan för en beskrivning av hur "OCH"- och "NOT"-noderna fungerar.

Nu stänger vi kontakterna på Input1-ingången, det vill säga vi applicerar en till den övre ingången på nod A. De som är bekanta med elektronik vet att vi faktiskt kommer att få en klassisk generatorkrets som använder logiska element. Och i teorin borde en sådan krets oändligt producera sekvensen 1-0-1-0-1-0 ... vid utgången av elementen A och B. och 0-1-0-1-0-1-…. När allt kommer omkring måste händelsen ständigt ändra tillståndet för noderna A och B, löpande i en cirkel 2-3-2-3-...!

Men i verkligheten händer inte detta. Kretsen kommer att hamna i ett slumpmässigt tillstånd - eller så kommer reläet att förbli på eller av, eller kanske surra något på och av flera gånger i rad. Allt beror på vädret på Mars sydpol. Och det är därför detta händer.

En händelse från nod Input1 ändrar tillståndet för nod A, sedan nod B, och så vidare i en cirkel flera gånger. Programmet upptäcker evenemangets "looping" och tvångsstoppar denna karneval. Efter detta blockeras förändringar i tillståndet för noderna A och B tills en ny händelse inträffar. Det ögonblick då programmet bestämmer sig för "sluta snurra i cirklar!" – i allmänhet beror det på många faktorer och kan betraktas som slumpmässigt.

Var försiktig när du kopplar knutar till en ring - effekterna kommer inte alltid att vara uppenbara! Ha en bra uppfattning om vad och varför du gör!

Är det fortfarande möjligt att bygga en generator på de noder som är tillgängliga för oss? Jo det kan du! Men detta kräver en nod som kan generera händelser själv. Och det finns en sådan nod - det här är "fördröjningslinjen". Låt oss se hur en generator med en period på 6 sekunder fungerar i figuren nedan.

ShioTiny: noder, anslutningar och händelser eller funktioner i ritprogram

Generatorns nyckelelement är nod A - fördröjningslinjen. Om du ändrar ingångsläget för fördröjningslinjen från 0 till 1, kommer 1 inte att visas vid utgången omedelbart, utan först efter en angiven tid. I vårt fall är det 3 sekunder. På samma sätt, om du ändrar fördröjningslinjens ingångstillstånd från 1 till 0, kommer 0 vid utgången att visas efter samma 3 sekunder. Fördröjningstiden ställs in i tiondels sekund. Det vill säga värdet 30 betyder 3 sekunder.

En speciell egenskap hos fördröjningslinjen är att den genererar en händelse efter att fördröjningstiden har löpt ut.

Låt oss anta att utgången från fördröjningslinjen var 0. Efter att ha passerat nod B - växelriktaren - förvandlas denna 0 till 1 och går till ingången på fördröjningslinjen. Inget händer direkt. Vid utgången av fördröjningslinjen kommer den att förbli 0, men nedräkningen av fördröjningstiden börjar. 3 sekunder går. Och sedan genererar fördröjningslinjen en händelse. Vid dess utgång visas den 1. Denna enhet, efter att ha passerat genom nod B - växelriktaren - förvandlas till 0 och går till ingången på fördröjningslinjen. Ytterligare 3 sekunder går... och processen upprepas. Det vill säga var tredje sekund ändras tillståndet för fördröjningslinjeutgången från 3 till 0 och sedan från 1 till 1. Reläet klickar. Generatorn fungerar. Pulsperioden är 0 sekunder (6 sekunder vid utgång noll och 3 sekunder vid utgång ett).

Men i verkliga kretsar finns det vanligtvis inget behov av att använda detta exempel. Det finns speciella timernoder som perfekt och utan hjälp utifrån genererar en sekvens av pulser med en given period. Varaktigheten av "noll" och "ett" i dessa pulser är lika med halva perioden.

Använd timernoder för att ställa in periodiska åtgärder.

Jag noterar att sådana digitala signaler, där varaktigheten för "noll" och "ett" är lika, kallas "meander".

Jag hoppas att jag har förtydligat frågan lite om hur händelser sprids mellan noder och vad man inte ska göra?

Slutsats och referenser

Artikeln visade sig vara kort, men den här artikeln är ett svar på frågor som har dykt upp angående noder och händelser.

När 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, diagram, firmware, exempel, beskrivning av komponenter och allt resten är här.

Frågor, förslag, kritik - gå hit: [e-postskyddad]

Källa: will.com

Lägg en kommentar