En artikkel om hvordan du lager en programmerbar logikkkontroller fra en billig kinesisk enhet. En slik enhet vil finne sin bruk både i hjemmeautomatisering og som praktiske klasser i skolens informatikk.
Som referanse fungerer Sonoff Basic-programmet som standard med en mobilapplikasjon gjennom en kinesisk skytjeneste; etter den foreslåtte endringen vil all ytterligere interaksjon med denne enheten være mulig i nettleseren.
Seksjon I. Koble Sonoff til MGT24-tjenesten
Trinn 1: Lag et kontrollpanel
Registrer deg på siden
Logg Inn
For å opprette et kontrollpanel for en ny enhet, klikk på "+"-knappen.
Eksempel på å lage et panel
Når panelet er opprettet, vil det vises i listen over paneler.
I «Oppsett»-fanen i det opprettede panelet finner du feltene «Enhets-ID» og «Autorisasjonsnøkkel»; i fremtiden vil denne informasjonen være nødvendig når du konfigurerer Sonoff-enheten.
Eksempel på fane
Trinn 2. Flash enheten på nytt
Bruke verktøyet
Trinn 3. Enhetsoppsett
Sett strøm på enheten, etter at LED-en lyser, trykk på knappen og hold den inne til LED-en begynner å blinke jevnt med jevne mellomrom.
I dette øyeblikket vises et nytt wi-fi-nettverk kalt "PLC Sonoff Basic", koble datamaskinen til dette nettverket.
Forklaring av LED-indikasjon
LED indikasjon
Enhetsstatus
periodisk dobbel blinking
ingen tilkobling til ruteren
skinner kontinuerlig
forbindelse opprettet med ruteren
periodisk uniform blinking
Wi-Fi tilgangspunktmodus
slukket
Ingen strømforsyning
Åpne en nettleser og skriv inn teksten "192.168.4.1" i adressefeltet, gå til enhetens side for nettverksinnstillinger.
Fyll ut feltene som følger:
- "Nettverksnavn" og "Passord" (for å koble enheten til Wi-Fi-ruteren hjemme).
- "Enhets-ID" og "Autorisasjonsnøkkel" (for å autorisere enheten på MGT24-tjenesten).
Eksempel på innstilling av enhetens nettverksparametere
Lagre innstillingene og start enheten på nytt.
Her
Trinn 4. Koble til sensorer (valgfritt)
Den nåværende fastvaren støtter opptil fire ds18b20 temperatursensorer. Her
Seksjon II. Visuell programmering
Trinn 1: Lag skript
Brukes som programmeringsmiljø
Jeg la til spesialiserte blokker for å skrive og lese enhetsparametere. Alle parametere åpnes med navn. For parametere for eksterne enheter brukes sammensatte navn: "parameter@enhet".
Rullegardinliste med alternativer
Eksempelscenario for syklisk på- og avkobling av lasten (1Hz):
Et eksempel på et skript som synkroniserer driften av to separate enheter. Reléet til målenheten gjentar nemlig operasjonen til reléet til den eksterne enheten.
Scenario for termostat (uten hysterese):
For å lage mer komplekse skript kan du bruke variabler, løkker, funksjoner (med argumenter) og andre konstruksjoner. Jeg vil ikke beskrive alt dette i detalj her; det er allerede ganske mye på nettet.
Trinn 2: Rekkefølge av skript
Skriptet kjører kontinuerlig, og så snart det når slutten starter det på nytt. I dette tilfellet er det to blokker som midlertidig kan sette skriptet på pause, "forsinkelse" og "pause".
"Delay"-blokken brukes for millisekunds- eller mikrosekundersforsinkelser. Denne blokken opprettholder strengt tidsintervallet, og blokkerer driften av hele enheten.
"Pause"-blokken brukes for andre (eller mindre) forsinkelser, og den blokkerer ikke kjøringen av andre prosesser i enheten.
Hvis selve skriptet inneholder en uendelig løkke, hvis brødtekst ikke inneholder "pause", starter tolken uavhengig en kort pause.
Hvis den tildelte minnestabelen er oppbrukt, vil tolken slutte å utføre et slikt kraftkrevende skript (vær forsiktig med rekursive funksjoner).
Trinn 3: Feilsøking av skript
For å feilsøke et skript som allerede er lastet inn i enheten, kan du kjøre en programsporing trinn for trinn. Dette kan være ekstremt nyttig når oppførselen til manuset viste seg å være annerledes enn det forfatteren hadde til hensikt. I dette tilfellet lar sporing forfatteren raskt finne kilden til problemet og rette feilen i skriptet.
Scenario for beregning av faktor i feilsøkingsmodus:
Feilsøkingsverktøyet er veldig enkelt og består av tre hovedknapper: "start", "ett skritt fremover" og "stopp" (la oss heller ikke glemme "enter" og "exit" feilsøkingsmodus). I tillegg til trinn-for-trinn-sporing, kan du angi et bruddpunkt på en hvilken som helst blokk (ved å klikke på blokken).
For å vise gjeldende verdier for parametere (sensorer, releer) i monitoren, bruk "print"-blokken.
Her
Seksjon for nysgjerrige. Hva er under panseret?
For at skriptene skulle fungere på målenheten ble det utviklet en bytekodetolk og en assembler med 38 instruksjoner. Blocklys kildekode har en spesialisert kodegenerator innebygd som konverterer visuelle blokker til monteringsinstruksjoner. Deretter konverteres dette assemblerprogrammet til bytekode og overføres til enheten for kjøring.
Arkitekturen til denne virtuelle maskinen er ganske enkel og det er ikke noe spesielt poeng i å beskrive den; på Internett finner du mange artikler om å designe de enkleste virtuelle maskinene.
Jeg tildeler vanligvis 1000 byte til stabelen til den virtuelle maskinen min, noe som er nok til overs. Selvfølgelig kan dype rekursjoner tømme enhver stabel, men de har neppe noen praktisk nytte.
Den resulterende bytekoden er ganske kompakt. Som et eksempel er bytekoden for å beregne den samme faktoren bare 49 byte. Dette er dens visuelle form:
Og dette er assemblerprogrammet hans:
shift -1
ldi 10
call factorial, 1
print
exit
:factorial
ld_arg 0
ldi 1
gt
je 8
ld_arg 0
ld_arg 0
ldi 1
sub
call factorial, 1
mul
ret
ldi 1
ret
Hvis monteringsformen for representasjon ikke har noen praktisk verdi, gir "javaskrit" -fanen tvert imot et mer kjent utseende enn visuelle blokker:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Angående ytelse. Da jeg kjørte det enkleste flasher-skriptet, fikk jeg en 47 kHz firkantbølge på oscilloskopskjermen (med en prosessorklokkehastighet på 80 MHz).
Jeg synes dette er et bra resultat, denne hastigheten er i hvert fall nesten ti ganger høyere enn
Den siste delen
For å oppsummere vil jeg si at bruken av skript lar oss ikke bare programmere logikken til driften av en separat enhet, men gjør det også mulig å koble flere enheter til en enkelt mekanisme, der noen enheter påvirker oppførselen til andre.
Jeg legger også merke til at den valgte metoden for lagring av skript (direkte i selve enhetene, og ikke på serveren) forenkler bytte av allerede fungerende enheter til en annen server, for eksempel til en hjemme-Bringebær, her
Det er alt, jeg vil gjerne høre råd og konstruktiv kritikk.
Kilde: www.habr.com