ShIoTiny: noder, tilkoblinger og hendelser eller funksjoner i tegneprogrammer

ShIoTiny: noder, tilkoblinger og hendelser eller funksjoner i tegneprogrammer

Hovedpunkter eller hva denne artikkelen handler om

Temaet for artikkelen er visuell PLS-programmering ShioTiny for smarthjemmet beskrevet her: ShioTiny: liten automatisering, tingenes internett eller «seks måneder før ferie».

Veldig kort begreper som knuter, связи, utviklingen, samt funksjoner for å laste og kjøre et visuelt program på ESP8266, som er grunnlaget for PLS ShioTiny.

Introduksjon eller et par organisatoriske spørsmål

I forrige artikkel om utviklingen min ga jeg en kort oversikt over kontrollerens muligheter ShioTiny.

Merkelig nok viste publikum ganske sterk interesse og stilte meg ganske mange spørsmål. Noen venner tilbød til og med umiddelbart å kjøpe en kontroller fra meg. Nei, jeg er ikke imot å tjene litt penger, men min samvittighet tillater meg ikke å selge noe som fortsatt er veldig grovt når det gjelder programvare.

Derfor la jeg ut fastvarebinærene og enhetsdiagrammet på GitHub: fastvare + korteste instruksjoner + diagram + eksempler.

Nå kan alle flashe ESP-07 og leke med fastvaren selv. Hvis noen virkelig vil ha akkurat samme tavle som på bildet, så har jeg flere av dem. Skriv på e-post [e-postbeskyttet]. Men, som den uforglemmelige Ogurtsov pleide å si: "Jeg er ikke ansvarlig for noe!"

Så la oss komme til poenget: hva er "node" (node) og "event"? Hvordan utføres programmet?

Som vanlig, la oss starte i rekkefølge: ved å laste ned programmet.

Hvordan programmet lastes

La oss starte med hva som skjer når vi trykker på en knapp Last opp i redaktør ElDraw og vårt kretsprogram, bestående av vakre firkanter, flyr inn i enheten.

For det første, basert på diagrammet vi har tegnet, bygges beskrivelsen i tekstform.
For det andre sjekker den om alle nodeinnganger er koblet til utganger. Det skal ikke være «hengende» innganger. Hvis en slik inngang oppdages, vil ikke kretsen lastes inn i ShIoTiny, og redaktøren vil vise en tilsvarende advarsel.

Hvis alt gikk bra, sender redaktøren en tekstbeskrivelse av kretsen én node om gangen til ShIoTiny. Selvfølgelig fjernes den eksisterende kretsen fra ShIoTiny først. Den resulterende tekstbeskrivelsen lagres i FLASH-minnet.

Forresten, hvis du vil fjerne en krets fra en enhet, laster du bare en tom krets inn i den (som ikke inneholder et enkelt nodeelement).

Når hele kretsprogrammet er lastet inn i ShIoTiny PLC, begynner det å "kjøre". Hva betyr det?

Merk at prosessene for å laste en krets fra FLASH-minnet når strømmen er slått på og når du mottar en krets fra editoren er identiske.

Først opprettes nodeobjekter basert på beskrivelsen deres.
Deretter opprettes forbindelser mellom noder. Det vil si at koblinger av utganger til innganger og innganger til utganger genereres.

Og først etter alt dette starter hovedprogrammets utførelsessyklus.

Jeg skrev lenge, men hele prosessen - fra å "laste" kretsen fra FLASH-minnet til å starte hovedsyklusen - tar en brøkdel av et sekund for en krets med 60-80 noder.

Hvordan fungerer hovedsløyfen? Veldig enkelt. Først venter han på fremveksten utviklingen på en node, behandler deretter hendelsen. Og så videre i det uendelige. Vel, eller til de laster opp et nytt opplegg til ShIoTiny.

Flere ganger har jeg allerede nevnt ting som utviklingen, knuter и связи. Men hva er dette fra et programvaresynspunkt? Vi skal snakke om dette i dag.

Noder, forbindelser og hendelser

Bare se på eksemplene på kretsprogrammer for ShioTinyå forstå at diagrammet består av bare to enheter - noder (eller elementer) og forbindelsene mellom dem.

node, men ja eller kretselement er en virtuell representasjon av noen handlinger over dataene. Dette kan være en aritmetisk operasjon, en logisk operasjon eller en hvilken som helst operasjon som kommer til oss. Hovedsaken er at noden har en inngang og en utgang.

inngang - dette er stedet hvor noden mottar data. Inngangsbildene er punkter som alltid er på venstre side av noden.

Utgang - dette er stedet hvor resultatet av nodens operasjon hentes. Utdatabildene er punkter som alltid er plassert på høyre side av noden.

Noen noder har ikke innganger. Slike noder genererer resultatet internt. For eksempel en konstant node eller en sensornode: de trenger ikke data fra andre noder for å rapportere resultatet.

Andre noder har tvert imot ingen utganger. Dette er noder som viser for eksempel aktuatorer (releer eller lignende). De aksepterer data, men genererer ikke et beregningsresultat som er tilgjengelig for andre noder.

I tillegg er det også en unik kommentarnode. Den gjør ingenting, har ingen innganger eller utganger. Hensikten er å være en forklaring på diagrammet.

Hva har skjedd "event"? event er fremveksten av nye data i en hvilken som helst node. For eksempel inkluderer hendelser: endring i inngangstilstand (node Input), mottar data fra en annen enhet (noder MQTT и UDP), utløp av en spesifisert tidsperiode (noder tidsur и Utsette) og så videre.

Hva er arrangementer for? Ja, for å finne ut i hvilken node nye data har oppstått og tilstandene til hvilke noder som må endres i forbindelse med mottak av nye data. Hendelsen "passer" som det var langs kjeden av noder til den omgår alle noder hvis tilstand må kontrolleres og endres.

Alle noder kan deles inn i to kategorier.
La oss ringe noder som kan generere hendelser "aktive noder'.
Vi vil kalle noder som ikke kan generere hendelser "passive noder'.

Når en node genererer en hendelse (det vil si at nye data vises ved utgangen), endres i det generelle tilfellet tilstanden til hele kjeden av noder koblet til utgangen til hendelsesgeneratornoden.

For å gjøre det klart, vurder eksemplet i figuren.

ShIoTiny: noder, tilkoblinger og hendelser eller funksjoner i tegneprogrammer

De aktive nodene her er Input1, Input2 og Input3. De resterende nodene er passive. La oss vurdere hva som skjer når en eller annen inngang lukkes. For enkelhets skyld er resultatene oppsummert i en tabell.

ShIoTiny: noder, tilkoblinger og hendelser eller funksjoner i tegneprogrammer

Som du kan se, når en hendelse inntreffer, bygges en kjede fra kildenoden til hendelsen til sluttnoden. Tilstanden til de nodene som ikke faller inn i kjeden, endres ikke.

Et legitimt spørsmål oppstår: hva vil skje hvis to eller til og med flere hendelser inntreffer samtidig?

Som en elsker av arbeidet til Gleb Anfilov, er jeg fristet til å sende en nysgjerrig spørsmålsstiller til boken hans «Escape from Surprise». Dette er en "relativitetsteori for de minste", som forklarer godt hva "samtidig" betyr og hvordan man kan leve med det.

Men praktisk talt alt er mye enklere: når to eller til og med flere hendelser inntreffer, blir alle kjeder fra hver hendelseskilde sekvensielt bygget og behandlet etter tur, og det skjer ingen mirakler.

Det neste helt legitime spørsmålet fra en nysgjerrig leser er hva som vil skje hvis nodene kobles til en ring? Eller, som de sier blant disse smarte gutta dine, introduser tilbakemelding. Det vil si, koble utgangen til en av nodene til inngangen til den forrige noden slik at utgangstilstanden til denne noden påvirker tilstanden til inngangen. Redaktøren vil ikke tillate deg å koble utgangen fra en node direkte til inngangen. ElDraw. Men indirekte, som i figuren nedenfor, kan dette gjøres.

Så hva vil skje i dette tilfellet? Svaret vil være veldig "bestemt": avhengig av hvilke noder. La oss se på eksemplet i figuren.

ShIoTiny: noder, tilkoblinger og hendelser eller funksjoner i tegneprogrammer

Når inngangskontaktene til Input1 er åpne, er den øvre inngangen til node A 0. Utgangen til node A er også 0. Utgangen til node B er 1. Og til slutt er den nedre inngangen til node A 1. Alt er klar. Og for de som ikke er klare, se nedenfor for en beskrivelse av hvordan "AND" og "NOT"-nodene fungerer.

Nå lukker vi kontaktene til Input1-inngangen, det vil si at vi bruker en til den øvre inngangen til node A. De som er kjent med elektronikk vet at vi faktisk vil få en klassisk generatorkrets som bruker logiske elementer. Og i teorien skulle en slik krets uendelig produsere sekvensen 1-0-1-0-1-0 ... ved utgangen av elementene A og B. og 0-1-0-1-0-1-…. Tross alt må hendelsen hele tiden endre tilstanden til nodene A og B, og kjører i en sirkel 2-3-2-3-...!

Men i virkeligheten skjer ikke dette. Kretsen vil falle inn i en tilfeldig tilstand - eller reléet vil forbli på eller av, eller kanskje surre litt av og på flere ganger på rad. Alt avhenger av været på sørpolen på Mars. Og det er derfor dette skjer.

En hendelse fra node Input1 endrer tilstanden til node A, deretter node B, og så videre i en sirkel flere ganger. Programmet oppdager "looping" av hendelsen og tvangsstopper dette karnevalet. Etter dette blir endringer i tilstanden til nodene A og B blokkert inntil en ny hendelse inntreffer. Øyeblikket da programmet bestemmer seg for "slutt å snurre i sirkler!" - Generelt avhenger det av mange faktorer og kan betraktes som tilfeldig.

Vær forsiktig når du kobler knuter til en ring - effektene vil ikke alltid være tydelige! Ha en god ide om hva og hvorfor du gjør!

Er det fortsatt mulig å bygge en generator på nodene som er tilgjengelige for oss? Ja det kan du! Men dette krever en node som kan generere hendelser selv. Og det er en slik node - dette er "forsinkelseslinjen". La oss se hvordan en generator med en periode på 6 sekunder fungerer i figuren nedenfor.

ShIoTiny: noder, tilkoblinger og hendelser eller funksjoner i tegneprogrammer

Nøkkelelementet til generatoren er node A - forsinkelseslinjen. Hvis du endrer inngangstilstanden til forsinkelseslinjen fra 0 til 1, vil ikke 1 vises på utgangen umiddelbart, men først etter en spesifisert tid. I vårt tilfelle er det 3 sekunder. På samme måte, hvis du endrer inngangstilstanden til forsinkelseslinjen fra 1 til 0, vil 0 ved utgangen vises etter de samme 3 sekundene. Forsinkelsestiden settes i tideler av et sekund. Det vil si at verdien 30 betyr 3 sekunder.

En spesiell egenskap ved forsinkelseslinjen er at den genererer en hendelse etter at forsinkelsestiden er utløpt.

La oss anta at utgangen til forsinkelseslinjen i utgangspunktet var 0. Etter å ha passert node B - omformeren - blir denne 0-en til 1 og går til inngangen til forsinkelseslinjen. Ingenting skjer med en gang. Ved utgangen av forsinkelseslinjen vil den forbli 0, men nedtellingen av forsinkelsestiden vil starte. 3 sekunder går. Og så genererer forsinkelseslinjen en hendelse. Ved utgangen vises den 1. Denne enheten, etter å ha passert gjennom node B - omformeren - blir til 0 og går til inngangen til forsinkelseslinjen. Det går ytterligere 3 sekunder... og prosessen gjentas. Det vil si at hvert 3. sekund endres tilstanden til forsinkelseslinjeutgangen fra 0 til 1 og deretter fra 1 til 0. Reléet klikker. Generatoren fungerer. Pulsperioden er 6 sekunder (3 sekunder ved utgang null og 3 sekunder ved utgang en).

Men i ekte kretser er det vanligvis ikke nødvendig å bruke dette eksemplet. Det er spesielle timernoder som perfekt og uten hjelp utenfra genererer en sekvens av pulser med en gitt periode. Varigheten av "null" og "en" i disse pulsene er lik halve perioden.

For å angi periodiske handlinger, bruk tidtakernoder.

Jeg legger merke til at slike digitale signaler, der varigheten av "null" og "en" er like, kalles "meander".

Jeg håper jeg har avklart spørsmålet litt om hvordan hendelser forplantes mellom noder og hva man ikke skal gjøre?

Konklusjon og referanser

Artikkelen viste seg å være kort, men denne artikkelen er et svar på spørsmål som har dukket opp angående noder og hendelser.

Etter hvert som fastvaren utvikler seg og nye eksempler dukker opp, vil jeg skrive om hvordan du programmerer ShioTiny små artikler så lenge det vil være interessant for folk.

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

Spørsmål, forslag, kritikk - gå her: [e-postbeskyttet]

Kilde: www.habr.com

Legg til en kommentar