
En artikel om, hvordan man kan omdanne en billig kinesisk enhed til en programmerbar logisk controller. En sådan enhed kan bruges både til hjemmeautomatisering og som praktiske opgaver i skolens IT-undervisning.
For reference, som standard fungerer Sonoff Basic-programmet med en mobilapp via en kinesisk cloud-service; efter den foreslåede modificering vil al videre interaktion med denne enhed være mulig i din browser.
Afsnit I. Tilslutning af Sonoff til MGT24-tjenesten
Trin 1. Oprettelse af kontrolpanel
Registrer dig på siden (hvis du ikke allerede er registreret) og log ind med din konto.
Log ind
For at oprette et kontrolpanel til den nye enhed skal du klikke på knappen „+“.
Eksempel på oprettelse af panel
Når panelet er oprettet, vil det vises i din liste over paneler.
Under fanen „Installation“, i det oprettede panel, find felterne „Enheds-ID“ og „Autorisationsnøgle“, da disse oplysninger senere vil være nødvendige, når du konfigurerer Sonoff-enheden.
Eksempel på fanen
Trin 2. Genopgradering af enheden
Ved hjælp af værktøjet overfør firmwaren til enheden; du får brug for en USB-TTL-konverter. Her og .
Trin 3. Konfiguration af enheden
Tænd for enheden, når lysdioden lyser, skal du trykke på knappen og holde den nede, indtil lysdioden begynder at blinke jævnt.
På dette tidspunkt vises et nyt wi-fi-netværk med navnet „PLC Sonoff Basic“, tilslut din computer til dette netværk.
Afsnit af lysdiodernes indikation
Lysdiodeindikation
Enhedens status
periodisk dobbeltblink
ingen forbindelse til routeren
lyser konstant
forbindelse til routeren er etableret
periodisk jævnt blink
wi-fi adgangspunkt-tilstand
slukket
ingen strøm
Åbn din internetbrowser og indtast teksten „192.168.4.1“ i adressefeltet for at gå til indstillingssiden for netværksparametre på enheden.
Udfyld felterne som volgt:
- „Netværksnavn“ og „Adgangskode“ (for at forbinde enheden til din hjemme wi-fi-router).
- „Enheds-ID“ og „Autorisationsnøgle“ (til autorisering af enheden på MGT24-tjenesten).
Eksempel på konfiguration af enhedens netværksparametre
Gem indstillingerne og genstart enheden.
Her .
Trin 4. Tilslutning af sensorer (valgfrit)
Den nuværende firmware understøtter op til fire temperaturfølere ds18b20. Her er monteringen af sensorerne. Det ser ud til, at dette trin vil blive det mest udfordrende, da det kræver håndværksmæssige evner og en loddekolbe.
Afsnit II. Visuel programmering
Trin 1. Oprettelse af scripts
I programmeringsmiljøet bruges , som er let at lære, så du behøver ikke være programmør for at oprette enkle scripts.
Jeg har tilføjet specialiserede blokke til at læse og skrive enhedens parametre. Adgang til enhver parameter sker via navn. For parametre fra fjernbetjente enheder bruges sammensatte navne: «parameter@enhed».
Rullemenu for parametre
Eksempel på et script til cyklisk tænding og slukning af en belastning (1 Hz):

Eksempel på et script, der synkroniserer arbejdet mellem to separate enheder. Specificationen: relæet på målenheden gentager arbejdet fra relæet på den fjernbetjente enhed.

Script til termostaten (uden hysterese):

For at oprette mere komplekse scripts kan man bruge variable, loops, funktioner (med argumenter) og andre strukturer. Jeg vil ikke gå i detaljer her, der findes allerede en del .
Trin 2. Udførelsesrækkefølge for scripts
Scriptet kører i kontinuerlig tilstand, og så snart det når sin afslutning, starter det forfra. Der er to blokke, der midlertidigt kan pause udførelsen af scriptet: «delay» og «pause».
Blokken «delay» bruges til millisekund- eller mikrosekundforsinkelser. Denne blok overholder strengt tidsintervallet og blokerer for hele enhedens drift.
Blokken «pause» bruges til sekundære (eller kortere) forsinkelser og blokerer ikke udførelsen af andre processer i enheden.
Hvis scriptet har en uendelig løkke uden «pause», starter fortolkeren automatisk en lille pause.
Ved udtömning af den tildelte hukommelsesstak stopper fortolkeren udførelsen af et sådant ressourcekrævende script (vær forsigtig med rekursive funktioner).
Trin 3. Fejlfinding af scripts
For debugging a script already loaded onto the device, you can run a step-by-step program trace. This is extremely useful when the script's behavior does not align with the author's intentions. In this case, tracing allows the author to quickly identify the source of the problem and correct the error in the script.
Factorial calculation script in debug mode:

The debugging tool is quite simple and consists of three main buttons: 'start', 'step forward', and 'stop' (let's not forget about 'enter' and 'exit' from debug mode). In addition to step-by-step tracing, you can set a breakpoint on any block (by clicking on the block).
To display the current parameter values (sensors, relays) on the monitor, use the 'print' block.
Her on using the debugger.
A section for the curious. What happens under the hood?
For the scripts to work on the target device, a bytecode interpreter and an assembler with 38 instructions were developed. A specialized code generator was integrated into the blockly source code, which converts visual blocks into assembler instructions. Later, this assembler program is transformed into bytecode and sent to the device for execution.
The architecture of this virtual machine is quite simple, and there is not much point in describing it; you will find many articles on designing basic virtual machines online.
I typically allocate 1000 bytes for the stack of my virtual machine; this is more than enough. Of course, deep recursions can exhaust any stack, but they are unlikely to find practical applications.
The resulting bytecode is quite compact. For example, the bytecode for calculating the same factorial consists of only 49 bytes. Here is its visual representation:

And here is its assembler program:
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
If the assembler representation has no practical value, the 'javascript' tab, on the other hand, provides a more familiar view than visual blocks:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Når det kommer til ydeevne. Da jeg kørte et simpelt blinkescript, fik jeg en 47 kHz firkantbølge på oscilloskopet (ved en CPU-taktfrekvens på 80 MHz).


Jeg betragter det som et godt resultat, i det mindste er denne hastighed næsten ti gange hurtigere end og .
Afsluttende del
Sammenfattende kan jeg sige, at brugen af scripts ikke kun giver os mulighed for at programmere logikken for en enkelt enhed, men også forbinder flere enheder til et samlet system, hvor nogle enheders adfærd påvirker andre.
Jeg vil også bemærke, at den valgte metode til opbevaring af scripts (direkte i enhederne og ikke på serveren) gør det nemmere at skifte allerede fungerende enheder til en anden server, for eksempel til en hjemmelavet Raspberry Pi, som her. .
Det var alt, jeg vil gerne høre råd og konstruktiv kritik.
Kilde: habr.com
