
Статия за начинаване на програмиран логически контролер от евтино китайско устройство. Това устройство ще намери приложение както в домашната автоматизация, така и в практическите занятия по компютърни науки в училище.
За справка, по подразбиране програмата Sonoff Basic работи с мобилното приложение чрез китайски облачен сервис, след предложената модификация, всяко последващо взаимодействие с това устройство ще бъде възможно в браузъра.
Раздел I. Свързване на Sonoff с услугата MGT24
Стъпка 1. Създаване на контролен панел
Регистрирайте се на сайта (ако още не сте се регистрирали) и влезте в системата с вашия акаунт.
Вход в системата
За да създадете контролен панел за новото устройство, натиснете бутона «+».
Пример за създаване на панел
След като панелът бъде създаден, той ще се появи в списъка с вашите панели.
В раздела «Инсталация» на създадения панел, намерете полетата «ID на устройството» и «Ключ за удостоверяване», тази информация ще е необходима при настройка на Sonoff устройството.
Пример на раздела
Стъпка 2. Препрограмиране на устройството
С помощта на утилитата забележете фърмуера в устройството, за което ще ви е необходим USB-TTL конвертор. Тук и .
Стъпка 3. Настройка на устройството
Подайте захранване на устройството, след като индикаторът светне, натиснете бутона и го задръжте натиснат, докато индикаторът започне периодично да мига.
В този момент ще се появи нова Wi-Fi мрежа с името «PLC Sonoff Basic», свържете компютъра си с тази мрежа.
Разглеждане на LED индикацията
LED индикация
Състояние на устройството
периодично двойно мигане
няма връзка с рутера
свети неестествено
връзката с рутера е установена
периодично равномерно мигане
режим на Wi-Fi точка на достъп
изключено
няма захранване
Отворете интернет браузъра и въведете текста «192.168.4.1» в адресната лента, преминете към страницата за настройки на параметрите на мрежата на устройството.
Попълнете полетата по следния начин:
- «Име на мрежата» и «Парола» (за свързване на устройството с домашния Wi-Fi рутер).
- «ID на устройството» и «Ключ за удостоверяване» (за удостоверяване на устройството на услугата MGT24).
Пример за настройка на параметрите на мрежата на устройството
Запазете настройките и рестартирайте устройството.
Тук .
Стъпка 4. Свързване на сензорите (по избор)
Текущият фърмуер поддържа до четири сензора за температура ds18b20. Тук ще се разглежда монтажа на сензорите. Очевидно, тази стъпка ще бъде най-трудната, тъй като изисква от вас сръчност и запояващо оборудване.
Раздел II. Визуално програмиране
Стъпка 1. Създаване на сценарии
Като среда за програмиране се използва , средата е лесна за усвояване, затова за създаване на прости сценарии не е необходимо да сте програмист.
Добавих специализирани блокове за запис и четене на параметрите на устройството. Достъпът до всеки параметър става по име. За параметрите на отдалечени устройства се използват съставни имена: "параметър@устройство".
Падащо меню с параметри
Пример на сценарий за циклично включване и изключване на натоварването (1Hz):

Пример на сценарий, синхронизиращ работата на две отделни устройства. По-точно, релето на целевото устройство повторя работата на реле на отдалеченото устройство.

Сценарий за термостата (без хистерезис):

За да създадете по-сложни сценарии, можете да използвате променливи, цикли, функции (с аргументи) и други конструкции. Няма да ги описвам подробно тук, в интернет вече има доста .
Стъпка 2. Ред на изпълнение на сценарии
Сценарият работи в непрекъснат режим, и щом достигне края си, той се стартира отново. В същото време има два блока, които могат временно да спрат изпълнението на сценария - „delay“ и „pause“.
Блокът „delay“ се използва за забавяния в милисекунди или микросекунди. Този блок стриктно спазва времевия интервал, блокирайки работата на цялото устройство.
Блокът „pause“ се използва за забавяния в секунди (може да е и по-малко), и не блокира изпълнението на други процеси в устройството.
Ако сценарият съдържа безкраен цикъл, в тялото на който няма „pause“, интерпретаторът самостоятелно инициира малка пауза.
При изчерпване на посочената стек памет, интерпретаторът спира изпълнението на такъв ресурсоемък сценарий (внимавайте с рекурсивните функции).
Стъпка 3. Отстраняване на грешки в сценариите
За отстраняване на вече зареден сценарий на устройството, можете да стартирате трасировката на програмата стъпка по стъпка. Това е изключително полезно, когато поведението на сценария не съответства на намерението на автора. В такъв случай, трасировката позволява на автора бързо да намери източника на проблема и да поправи грешката в сценария.
Сценарий за изчисление на факториел в режим на отстраняване:

Инструментът за отстраняване е много прост и се състои от три основни бутона: «стартиране», «една стъпка напред» и «стоп» (нека не забравим и за «вход» и «изход» от режима на отстраняване). Освен стъпковата трасировка, можете да зададете точка на спиране на всеки блок (чрез клик с мишката върху блока).
За да изведете текущите стойности на параметрите (сензори, реле) на монитора, използвайте блока «print».
Тук за използването на отладчика.
Раздел за любопитни. А какво е под капака?
За да работят сценарии на целевото устройство, е разработен интерпретатор на байт-код и асемблер с 38 инструкции. В изходния код на blockly е вграден специализиран генератор на код, който конвертира визуалните блокове в асемблерни инструкции. Впоследствие тази асемблерна програма се преобразува в байт-код и се предава на устройството за изпълнение.
Архитектурата на тази виртуална машина е доста проста и не е нужно да се описва в детайли, в мрежата ще намерите много статии за проектиране на съвсем опростени виртуални машини.
Под стека на своята виртуална машина обикновено отделям 1000 байта, което е повече от достатъчно. Разбира се, дълбоките рекурсии могат да изчерпят всеки стек, но вероятно няма да имат практически приложения.
Финалният байт-код е доста компактен. Например, байт-кодът за изчисление на същия факториел заема само 49 байта. Ето неговата визуална форма:

И ето асемблерната програма за него:
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
Ако асемблерната форма на представяне няма практическа стойност, то разделът «javascript» предлага по-привикнaта форма в сравнение с визуалните блокове:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Що се отнася до производителността. При стартиране на най-простия сценарий на мигача, на екрана на осцилоскопа получих меандр 47 кХц (при тактова честота на процесора от 80 МХц).


Смятам, че това е добър резултат, понеже тази скорост е почти десет пъти по-бърза от и .
Заключителна част
В заключение, искам да кажа, че използването на сценарии не само ни позволява да програмираме логиката на работа на отделно устройство, но също така предоставя възможност за свързване на няколко устройства в единен механизъм, където едни устройства влияят на поведението на други.
Също така ще подчертая, че избраният метод за съхранение на сценарии (в самите устройства, а не на сървъра) улеснява прехвърлянето на вече работещи устройства на друг сървър, например на домашния Raspberry, тук .
На това е всичко, ще се радвам да чуя съвети и конструктивна критика.
Източник: habr.com
