ShIoTiny: noder, forbindelser og begivenheder eller træk ved programmering

ShIoTiny: noder, forbindelser og begivenheder eller træk ved programmering

Hovedpunkter eller hvad denne artikel handler om

Emnet for artiklen er visuel programmering af PLC ShIoTiny til det smarte hjem, som beskrevet her: ShIoTiny: lille automation, internet of things eller 'seks måneder før ferien'.

Meget kort blev der overvejet begreber som noder, forbindelser, begivenheder, samt egenskaberne ved indlæsning og udførelse af det visuelle program på ESP8266, som er grundlaget for PLC ShIoTiny.

Indledning eller et par organisatoriske spørgsmål

I den tidligere artikel om min udvikling gav jeg et kort overblik over controllerens muligheder ShIoTiny.

Mærkeligt nok viste offentligheden en ret stærk interesse og stillede mig en del spørgsmål. Nogle personer tilbød endda straks at købe controlleren fra mig. Nej, jeg er ikke imod at tjene lidt penge, men min samvittighed tillader mig ikke at sælge noget, der stadig er meget uferdig på det programmeringsmæssige område.

Derfor har jeg lagt binære filer til firmware og enhedens skema op på GitHub: firmware + kort instruktion + skema + eksempler.

Nu kan enhver flashe ESP-07 og lege med firmwaren selv. Hvis nogen virkelig ønsker præcis dette board som på billedet — så har jeg adskillige stykker. Skriv til mig på mail shiotiny@yandex.ru. Men som den uforglemmelige Ogurtsov sagde: 'Jeg tager intet ansvar!'.

Lad os nu gå til sagen: hvad er "node" (node) og "begivenhed"? Hvordan udføres programmet?

Som sædvanlig, lad os starte med det grundlæggende: indlæsning af programmet.

Hvordan indlæses programmet

Lad os starte med, hvad der sker, når vi trykker på knappen Upload i editoren ElDraw og vores skema-program, der består af smukke firkanter, sendes til enheden.

For det første bliver der, baseret på det skema, vi har tegnet, bygget en tekstbeskrivelse.
For det andet kontrolleres det — er alle noder blevet forbundet til udgange? Der bør ikke være nogen "hævende" indgange. Hvis en sådan indgang opdages, kan skemaet ikke indlæses i ShIoTiny, og editoren vil give en tilsvarende advarsel.

Hvis alt gik som planlagt, sender editoren tekstbeskrivelsen af skemaet til ShIoTiny node for node. Selvfølgelig slettes det eksisterende skema fra ShIoTiny på forhånd. Den modtagne tekstbeskrivelse gemmes i FLASH-hukommelsen.

Forresten, hvis du ønsker at slette skemaet fra enheden, så indlæs blot et tomt skema (som ikke indeholder nogen node-elementer).

Når hele schematet er indlæst i PLC ShIoTiny, begynder det at "køre". Hvad betyder det?

Det skal bemærkes, at processerne for indlæsning af schemat fra FLASH-hukommelsen ved opstart og ved modtagelse af schemat fra editoren er identiske.

Først oprettes objekter-noder baseret på deres beskrivelse.
Derefter oprettes forbindelser mellem noderne. Det vil sige, at der genereres links fra udgange til indgange og fra indgange til udgange.

Og først efter alt dette startes hovedkørselscyklussen.

Jeg har skrevet meget, men hele processen - fra "indlæsning" af schemat fra FLASH-hukommelsen til starten af hovedkørselscyklussen - tager en brøkdel af et sekund for et schema med 60-80 noder.

Hvordan virker hovedcyklussen? Meget enkelt. Først venter den på, at begivenheder der opstår en hændelse i en af noderne, hvorefter den behandler denne begivenhed. Og sådan fortsætter det. Eller indtil der indlæses et nyt schema i ShIoTiny.

Jeg har allerede nævnt sådanne ting flere gange, som begivenheder, noder og forbindelser. Men hvad betyder det egentlig fra et programmeringsperspektiv? Det er, hvad vi vil diskutere i dag.

Noder, forbindelser og hændelser

Det er nok at se på eksempler på schemat-programmer for ShIoTiny, for at forstå, at et schema kun består af to enheder - noder (eller elementer) og forbindelser mellem dem.

Node, noder eller schemaelement – er en virtuel repræsentation af en eller anden handling på data. Det kan være en aritmetisk operation, en logisk operation eller overhovedet enhver operation, vi kan komme i tanke om. Det vigtigste er, at noden har en indgang og en udgang.

Log ind – er det sted, hvor noden modtager data. Indgange vises som punkter, der altid ligger til venstre for noden.

Udgange – er det sted, hvor resultatet af nodens arbejde udtrækkes. Udgange vises som punkter, der altid ligger til højre for noden.

Nogle noder har ikke indgange. Disse noder genererer resultatet inden i sig selv. For eksempel en konstantnode eller en sensor-node: de har ikke brug for data fra andre noder for at kommunikere resultatet.

Andre noder har derimod ikke udgange. Disse noder repræsenterer for eksempel aktiveringsenheder (relæer eller andet lignende). De modtager data, men genererer ikke beregningsresultater, der er tilgængelige for andre noder.

Derudover er der også en unik kommentar-node. Den gør ingenting, har hverken indgange eller udgange. Dens formål er at være en forklaring i schemat.

Hvad er "begivenhed»? Begivenhed — det er opståen af nye data i en hvilken som helst node. For eksempel henviser begivenheder til: ændring af indgangens tilstand (node Input), modtagelse af data fra en anden enhed (noder MQTT og UDP), udløb af en given tidsperiode (noder Timer og Forsinkelse) og så videre.

Hvad er formålet med begivenheder? Ja, for at fastslå — i hvilken node der opstod nye data, og hvilke noders tilstande der skal ændres som følge af de nye data. En begivenhed 'går' ligesom gennem kæden af noder, indtil den har dækket alle noder, hvis tilstand skal kontrolleres og ændres.

Alle noder kan opdeles i to kategorier.
Noder, der kan generere begivenheder, kalder vi "aktive noder».
Noder, der ikke kan generere begivenheder, kalder vi "passive noder».

Når en node genererer en begivenhed (det vil sige at der på dens output opstår nye data), ændres generelt tilstanden af hele kæden af noder, der er tilsluttet outputtet af begivenhedsgeneratoren.

For at gøre det klart, lad os overveje et eksempel i billedet.

ShIoTiny: noder, forbindelser og begivenheder eller træk ved programmering

De aktive noder her er — Input1, Input2 og Input3. De øvrige noder er passive. Lad os se, hvad der sker, når en af indgangene lukkes. Resultaterne er samlet i en tabel for enkelhedens skyld.

ShIoTiny: noder, forbindelser og begivenheder eller træk ved programmering

Som vi kan se, når der opstår en begivenhed, bygges der en kæde fra begivenhedens kilde node til den endelige node. Tilstanden for de noder, der ikke er en del af kæden, ændres ikke.

Der opstår et legitimt spørgsmål: hvad sker der ved opståen af to eller endda flere begivenheder samtidig?

Som en beundrer af den kreative Gleb Anfilov, bliver jeg draget til at henvise den nysgerrige spørger til hans bog "Flugten fra forundringer". Det er en 'relativitetsteori for de mindste', hvor det er godt forklaret, hvad 'samtidig' betyder, og hvordan man lever med det.

Men rent praktisk er alt meget lettere: ved opståen af to eller endda flere begivenheder bygges og behandles alle kæder fra hver begivenhedskilde i rækkefølge, uden nogen mirakler.

Det næste helt legitime spørgsmål fra en nysgerrig læser er: hvad sker der, hvis man forbinder noderne i en ring? Eller, som man plejer at sige blandt de kloge — indføre feedback. Det vil sige at forbinde udgangen af en af noderne til indgangen til den foregående node, sådan at tilstanden af udgangen på denne node påvirker tilstanden af dens egen indgang. Du vil ikke kunne forbinde udgangen af noden direkte til dens egen indgang, da redaktøren... ElDraw...men indirekte, som vist på billedet nedenfor — det kan lade sig gøre.

Og hvad vil der så ske i dette tilfælde? Svaret bliver meget "bestemt": alt efter hvilke noder. Lad os tage et eksempel fra billedet.

ShIoTiny: noder, forbindelser og begivenheder eller træk ved programmering

Når indgangskontakterne Input1 er åbne på den øverste indgang til node A — 0. På udgangen af node A også 0. På udgangen af node B — 1. Og endelig på den nederste indgang til node A — 1. Alt er klart. Og hvis der er nogen, der ikke forstår det — se nedenfor for beskrivelsen af, hvordan "OG"- og "IKKE"-noderne fungerer.

Nu lukker vi indgangskontakterne Input1, det vil sige vi giver en enhed til den øverste indgang til node A. De, der kender til elektronik, ved, at vi faktisk får et klassisk skema for en generator baseret på logiske elementer. Ideelt set bør et sådant skema uendeligt producere sekvenserne 1-0-1-0-1-0... og 0-1-0-1-0-1.... For et hændelsesforløb skal konstant ændre tilstanden af noderne A og B, mens det cirkulerer 2-3-2-3...!

Men i virkeligheden sker dette ikke. Skemaet vil falde ind i en tilfældig tilstand — enten forbliver relæet aktiveret eller deaktiveret, eller det kan let brumme ved at tænde og slukke flere gange i træk. Alt afhænger af vejret på den sydlige pol på Mars. Og her er grunden til, at dette sker.

Hændelsen fra node Input1 ændrer tilstanden af node A, så node B og så videre i flere omgange. Programmet registrerer "cirklisering" af hændelsen og tvinger denne fest til at stoppe. Efter dette bliver ændringen af tilstanden af noderne A og B blokeret, indtil der opstår en ny hændelse. Det moment, hvor programmet beslutter — "nok med at dreje i ring!" — afhænger generelt af mange faktorer og kan betragtes som tilfældigt.

Vær forsigtig med at forbinde noder i en ring — effekterne vil ikke altid være åbenlyse! Sørg for at have en klar idé om, hvad og hvorfor du gør det!

Kan man bygge en generator med de tilgængelige noder? Ja, det kan man! Men til det kræves en node, der selv kan generere hændelser. Og en sådan node findes — det er "forsinkelseslinjen". Lad os se, hvordan generatoren fungerer med en periode på 6 sekunder på tegningen nedenfor.

ShIoTiny: noder, forbindelser og begivenheder eller træk ved programmering

Nøgleelementet i generatoren er node A — forsinkelseslinjen. Hvis man ændrer indgangen til forsinkelseslinjen fra 0 til 1, vil 1 ikke komme ud med det samme, men først efter den angivne tid. I vores tilfælde er det 3 sekunder. Ligeledes, hvis man ændrer indgangen til forsinkelseslinjen fra 1 til 0, vil 0 komme ud efter de samme 3 sekunder. Forsinkelsestiden angives i tidedele af et sekund. Det vil sige, at værdien 30 betyder — 3 sekunder.

Kendetegnet ved forsinkelseslinjen er, at den genererer en hændelse efter udløbet af forsinkelsestiden.

Antag, at der i starten var 0 på udgangen af forsinkelseslinjen. Efter at have passeret node B — inverteren — bliver dette 0 til 1 og går ind i forsinkelseslinjen. Der sker straks ikke noget. På udgangen af forsinkelseslinjen forbliver der 0, men tidtageren for forsinkelsen starter. 3 sekunder går. Og så genererer forsinkelseslinjen straks en hændelse. Der kommer 1 ud. Denne 1 bliver efter at have passeret node B — inverteren — til 0 og går ind i forsinkelseslinjen. Der går endnu 3 sekunder… og processen gentages. Det vil sige, at hver 3. sekund ændres udgangstilstanden af forsinkelseslinjen fra 0 til 1 og derefter fra 1 til 0. Relæet klikker. Generatoren fungerer. Pulsperioden er 6 sekunder (3 sekunder på udgangen 0 og 3 sekunder — 1).

Men i virkelige kredsløb er det normalt ikke nødvendigt at bruge dette eksempel. Der findes specielle timernoder, der fantastisk og uden hjælp genererer en sekvens af pulser med en given periode. Varigheden af "nul" og "et" i disse pulser er lig med halvdelen af perioden.

For at angive periodiske handlinger skal du bruge timernoder.

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

Jeg håber, jeg har afklaret spørgsmålet om, hvordan hændelser spreder sig mellem noderne, og hvad man ikke skal gøre.

Konklusion og links

Artiklen blev kort, men det er en artikel-svar på spørgsmål, der opstod om noder og hændelser.

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

Som før vil skemaet, firmwaren, eksemplerne, beskrivelserne af noder og alt andet være her..

Spørgsmål, ønsker, kritik — send dem her: shiotiny@yandex.ru

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster