ShIoTiny: noder, forbindelser og begivenheder eller funktioner i tegneprogrammer

ShIoTiny: noder, forbindelser og begivenheder eller funktioner i tegneprogrammer

Hovedpunkter eller hvad denne artikel handler om

Emnet for artiklen er visuel PLC-programmering ShioTiny til det smarte hjem beskrevet her: ShIoTiny: lille automatisering, tingenes internet eller "seks måneder før ferie".

Meget kort begreber som f.eks knuder, kommunikation, udviklinger, samt funktioner til at indlæse og udføre et visuelt program på ESP8266, som er grundlaget for PLC'en ShioTiny.

Introduktion eller et par organisatoriske spørgsmål

I den forrige artikel om min udvikling gav jeg et kort overblik over controllerens muligheder ShioTiny.

Mærkeligt nok viste offentligheden ret stor interesse og stillede mig en del spørgsmål. Nogle venner tilbød endda straks at købe en controller af mig. Nej, jeg er ikke imod at tjene lidt penge, men min samvittighed tillader mig ikke at sælge noget, der stadig er meget groft i form af software.

Derfor postede jeg firmware-binære filer og enhedsdiagram på GitHub: firmware + korteste instruktioner + diagram + eksempler.

Nu kan alle flashe ESP-07 og selv lege med firmwaren. Hvis nogen virkelig vil have præcis samme tavle som på billedet, så har jeg flere af dem. Skriv på mail [e-mail beskyttet]. Men som den uforglemmelige Ogurtsov plejede at sige: "Jeg er ikke ansvarlig for noget!"

Så lad os komme til pointen: hvad er "node" (node) og "begivenhed"? Hvordan udføres programmet?

Lad os som sædvanlig starte i rækkefølge: ved at downloade programmet.

Hvordan programmet indlæses

Lad os starte med, hvad der sker, når vi trykker på en knap Upload i redaktøren ElDraw og vores kredsløbsprogram, bestående af smukke firkanter, flyver ind i enheden.

For det første, baseret på det diagram, vi har tegnet, er dets beskrivelse i tekstform bygget.
For det andet kontrollerer den, om alle nodeindgange er forbundet til udgange. Der bør ikke være "hængende" indgange. Hvis et sådant input detekteres, vil kredsløbet ikke blive indlæst i ShIoTiny, og editoren vil vise en tilsvarende advarsel.

Hvis alt gik godt, sender redaktøren en tekstbeskrivelse af kredsløbet én node ad gangen til ShIoTiny. Selvfølgelig fjernes det eksisterende kredsløb fra ShIoTiny først. Den resulterende tekstbeskrivelse gemmes i FLASH-hukommelsen.

Forresten, hvis du vil fjerne et kredsløb fra en enhed, skal du blot indlæse et tomt kredsløb i det (ikke indeholde et enkelt nodeelement).

Når hele kredsløbsprogrammet er indlæst i ShIoTiny PLC'en, begynder det at "udføre". Hvad betyder det?

Bemærk, at processerne for indlæsning af et kredsløb fra FLASH-hukommelsen, når strømmen er tændt, og når du modtager et kredsløb fra editoren, er identiske.

Først oprettes nodeobjekter baseret på deres beskrivelse.
Derefter laves forbindelserne mellem noderne. Det vil sige, at links af output til input og input til output genereres.

Og først efter alt dette starter hovedprogrammets udførelsescyklus.

Jeg skrev i lang tid, men hele processen - fra at "indlæse" kredsløbet fra FLASH-hukommelsen til at starte hovedcyklussen - tager en brøkdel af et sekund for et kredsløb med 60-80 noder.

Hvordan fungerer hovedsløjfen? Meget simpelt. Først venter han på fremkomsten udviklinger ved en eller anden node, behandler derefter denne hændelse. Og så videre i det uendelige. Nå, eller indtil de uploader et nyt skema til ShIoTiny.

Jeg har allerede flere gange nævnt ting som udviklinger, knuder и kommunikation. Men hvad er dette fra et softwaresynspunkt? Vi taler om dette i dag.

Noder, forbindelser og begivenheder

Se blot eksemplerne på kredsløbsprogrammer til ShioTinyat forstå, at diagrammet kun består af to entiteter - noder (eller elementer) og forbindelserne mellem dem.

node, Men ja eller kredsløbselement er en virtuel repræsentation af nogle aktivitet over dataene. Dette kan være en aritmetisk operation, en logisk operation eller enhver operation, der falder os ind. Det vigtigste er, at noden har en indgang og en udgang.

indgangen - dette er stedet, hvor noden modtager data. Inputbillederne er punkter, der altid er på venstre side af noden.

Output - dette er stedet, hvor resultatet af nodens operation hentes. Outputbillederne er punkter, der altid er placeret på højre side af noden.

Nogle noder har ikke input. Sådanne noder genererer resultatet internt. For eksempel en konstant node eller en sensornode: de behøver ikke data fra andre noder for at rapportere resultatet.

Andre noder har tværtimod ingen udgange. Det er noder, der viser for eksempel aktuatorer (relæer eller lignende). De accepterer data, men genererer ikke et beregningsresultat, der er tilgængeligt for andre noder.

Derudover er der også en unik kommentarknude. Den gør ingenting, har ingen input eller output. Dens formål er at være en forklaring på diagrammet.

Hvad er der sket "begivenhed"? begivenhed er fremkomsten af ​​nye data i enhver node. For eksempel inkluderer hændelser: ændring i inputtilstand (node Input), der modtager data fra en anden enhed (knudepunkter MQTT и UDP), udløb af en specificeret tidsperiode (knudepunkter timer и Forsinke) og så videre.

Hvad er arrangementer til? Ja, for at afgøre, i hvilken node nye data er opstået, og hvilke tilstande der skal ændres på i forbindelse med modtagelse af nye data. Hændelsen "passerer" så at sige langs kæden af ​​noder, indtil den omgår alle noder, hvis tilstand skal kontrolleres og ændres.

Alle noder kan opdeles i to kategorier.
Lad os kalde noder, der kan generere begivenheder "aktive noder'.
Vi kalder noder, der ikke kan generere hændelser "passive noder'.

Når en node genererer en hændelse (dvs. nye data vises ved dens output), så ændres i det generelle tilfælde tilstanden af ​​hele kæden af ​​knudepunkter, der er forbundet med outputtet fra hændelsesgeneratorknuden.

For at gøre det klart, overvej eksemplet i figuren.

ShIoTiny: noder, forbindelser og begivenheder eller funktioner i tegneprogrammer

De aktive noder her er Input1, Input2 og Input3. De resterende noder er passive. Lad os overveje, hvad der sker, når et eller andet input er lukket. For nemheds skyld er resultaterne opsummeret i en tabel.

ShIoTiny: noder, forbindelser og begivenheder eller funktioner i tegneprogrammer

Som du kan se, når en hændelse indtræffer, bygges en kæde fra hændelsens kildeknude til slutknudepunktet. Tilstanden for de noder, der ikke falder ind i kæden, ændres ikke.

Et legitimt spørgsmål opstår: hvad vil der ske, hvis to eller endda flere begivenheder indtræffer samtidigt?

Som en elsker af Gleb Anfilovs arbejde er jeg fristet til at sende en nysgerrig spørger til hans bog "Escape from Surprise." Dette er en "relativitetsteori for de små", som forklarer godt, hvad "samtidig" betyder, og hvordan man kan leve med det.

Men praktisk talt alt er meget enklere: Når to eller endda flere begivenheder indtræffer, bliver alle kæder fra hver begivenhedskilde sekventielt bygget og behandlet efter tur, og der sker ingen mirakler.

Det næste helt legitime spørgsmål fra en nysgerrig læser er, hvad der vil ske, hvis noderne forbindes til en ring? Eller, som de siger blandt dine smarte fyre, introducer feedback. Det vil sige, tilslut outputtet fra en af ​​knudepunkterne til indgangen på den forrige knude, så denne knudes outputtilstand påvirker dens inputs tilstand. Editoren vil ikke tillade dig at forbinde udgangen af ​​en node direkte til dens input. ElDraw. Men indirekte, som i figuren nedenfor, kan dette lade sig gøre.

Så hvad vil der ske i dette tilfælde? Svaret vil være meget "bestemt": afhængigt af hvilke noder. Lad os se på eksemplet i figuren.

ShIoTiny: noder, forbindelser og begivenheder eller funktioner i tegneprogrammer

Når inputkontakterne på Input1 er åbne, er den øverste input af node A 0. Outputtet af node A er også 0. Outputtet fra node B er 1. Og endelig er den nederste input af node A 1. Alt er klar. Og for dem, der ikke er klare, se nedenfor for en beskrivelse af, hvordan "AND" og "NOT" noderne fungerer.

Nu lukker vi kontakterne på Input1-indgangen, det vil sige, vi anvender en til den øverste input af node A. De, der er fortrolige med elektronik, ved, at vi faktisk vil få et klassisk generatorkredsløb, der bruger logiske elementer. Og i teorien skulle et sådant kredsløb uendeligt producere sekvensen 1-0-1-0-1-0 ... ved udgangen af ​​elementerne A og B. og 0-1-0-1-0-1-…. Begivenheden skal trods alt konstant ændre tilstanden af ​​noderne A og B, kørende i en cirkel 2-3-2-3-...!

Men i virkeligheden sker det ikke. Kredsløbet vil falde i en tilfældig tilstand - eller relæet vil forblive tændt eller slukket, eller måske summe lidt til og fra flere gange i træk. Det hele afhænger af vejret på Mars' sydpol. Og det er derfor, det sker.

En hændelse fra node Input1 ændrer tilstanden for node A, derefter node B, og så videre i en cirkel flere gange. Programmet registrerer begivenhedens "looping" og stopper dette karneval med magt. Herefter blokeres ændringer i tilstanden af ​​noderne A og B, indtil en ny hændelse opstår. Det øjeblik, hvor programmet beslutter sig for "stop med at snurre i cirkler!" - generelt afhænger det af mange faktorer og kan betragtes som tilfældigt.

Vær forsigtig, når du forbinder knuder til en ring - virkningerne vil ikke altid være tydelige! Hav en god idé om, hvad og hvorfor du gør!

Er det stadig muligt at bygge en generator på de noder, der er tilgængelige for os? Ja du kan! Men dette kræver en node, der selv kan generere begivenheder. Og der er sådan en node - dette er "forsinkelseslinjen". Lad os se, hvordan en generator med en periode på 6 sekunder fungerer i figuren nedenfor.

ShIoTiny: noder, forbindelser og begivenheder eller funktioner i tegneprogrammer

Nøgleelementet i generatoren er node A - forsinkelseslinjen. Hvis du ændrer indgangstilstanden for forsinkelseslinjen fra 0 til 1, vil 1 ikke vises ved udgangen med det samme, men først efter en specificeret tid. I vores tilfælde er det 3 sekunder. På samme måde, hvis du ændrer indgangstilstanden for forsinkelseslinjen fra 1 til 0, så vil 0 ved udgangen vises efter de samme 3 sekunder. Forsinkelsestiden indstilles i tiendedele af et sekund. Det vil sige, at værdien 30 betyder 3 sekunder.

Et særligt træk ved forsinkelseslinjen er, at den genererer en hændelse efter forsinkelsestiden er udløbet.

Lad os antage, at udgangen af ​​forsinkelseslinjen oprindeligt var 0. Efter at have passeret node B - inverteren - bliver denne 0 til 1 og går til indgangen til forsinkelseslinjen. Der sker ikke noget med det samme. Ved udgangen af ​​forsinkelseslinjen forbliver den 0, men nedtællingen af ​​forsinkelsestiden starter. Der går 3 sekunder. Og så genererer forsinkelseslinjen en hændelse. Ved sin udgang vises den 1. Denne enhed, efter at have passeret gennem node B - vekselretteren - bliver til 0 og går til indgangen til forsinkelseslinjen. Der går endnu 3 sekunder... og processen gentages. Det vil sige, at hvert 3. sekund ændres tilstanden for forsinkelseslinjeudgangen fra 0 til 1 og derefter fra 1 til 0. Relæet klikker. Generatoren virker. Pulsperioden er 6 sekunder (3 sekunder ved udgangen nul og 3 sekunder ved udgangen en).

Men i rigtige kredsløb er der normalt ikke behov for at bruge dette eksempel. Der er specielle timerknuder, der perfekt og uden hjælp udefra genererer en sekvens af impulser med en given periode. Varigheden af ​​"nul" og "én" i disse pulser er lig med halvdelen af ​​perioden.

Brug timerknudepunkter for at indstille periodiske handlinger.

Jeg bemærker, at sådanne digitale signaler, hvor varigheden af ​​"nul" og "én" er ens, kaldes "meander".

Jeg håber, jeg har afklaret spørgsmålet lidt om, hvordan begivenheder udbredes mellem noder, og hvad man ikke skal gøre?

Konklusion og referencer

Artiklen viste sig at være kort, men denne artikel er et svar på spørgsmål, der er opstået vedrørende noder og begivenheder.

Efterhånden som firmwaren udvikler sig og nye eksempler dukker op, vil jeg skrive om hvordan man programmerer ShioTiny små artikler, så længe det vil være interessant for folk.

Som før, diagram, firmware, eksempler, beskrivelse af komponenter og alt resten er her.

Spørgsmål, forslag, kritik - gå her: [e-mail beskyttet]

Kilde: www.habr.com

Tilføj en kommentar