ShIoTiny: вузли, зв'язки та події або особливості малювання програм

ShIoTiny: вузли, зв'язки та події або особливості малювання програм

Основні тези або про що ця стаття

Тема статті – візуальне програмування ПЛК ShIoTiny для розумного будинку, описаного тут: ShIoTiny: мала автоматизація, інтернет речей чи «за півроку до відпустки».

Дуже коротко розглянуто такі поняття, як вузли, зв'язку, події, а також особливості завантаження та виконання візуальної програми на ESP8266, який є основою ПЛК ShIoTiny.

Вступ або пара оргпитань

У попередній статті щодо своєї розробки я зробив короткий огляд можливостей контролера ShIoTiny.

Як не дивно, громадськість виявила досить сильну зацікавленість і поставила мені чимало запитань. Деякі товариші навіть відразу запропонували у мене купити контролер. Ні, я не проти того, щоб трохи заробити, але совість не дозволяє мені продавати ще дуже сиру в програмному плані річ.

Тому я виклав на GitHub бінарники прошивки та схему пристрою: прошивка+інструкція найкоротша+ схема+приклади.

Тепер кожен може прошити ESP-07 і погратися з прошивкою. Якщо комусь дуже хочеться саме таку плату як на фото — то я маю їх кілька штук. Пишіть на пошту [захищено електронною поштою]. Але, як казав незабутній Огурцов: «Я нізащо не відповідаю!».

Отже, перейдемо до суті: що такевузол» (нода) та «подія«? Як виконується програма?

Як завжди - почнемо по порядку: із завантаження програми.

Як завантажується програма

Почнемо з того, що відбувається, коли ми натискаємо кнопку Завантажувати у редакторі ElDraw і наша схема-програма, що складається з красивих квадратиків, відлітає в пристрій.

По-перше, на основі намальованої нами схеми будується її опис у текстовому вигляді.
По-друге, перевіряється, чи всі входи вузлів з'єднані з виходами. «Висячих» входів не повинно бути. Якщо такий вхід виявлено — схема ShIoTiny не завантажиться, а редактор виведе відповідне попередження.

Якщо все пройшло успішно, то редактор надсилає до ShIoTiny текстовий опис схеми по одному вузлу. Зрозуміло, існуюча схема із ShIoTiny попередньо видаляється. Отриманий текстовий опис зберігається у FLASH-пам'ять.

До речі, якщо ви хочете видалити схему із пристрою, то просто завантажте в нього порожню схему (яка не містить жодного елемента-вузла).

Як тільки вся схема-програма завантажена в ПЛК ShIoTiny, вона починає виконуватися. Що це означає?

Зазначимо, що процеси завантаження схеми з FLASH-пам'яті при включенні живлення та прийомі схеми з редактора — ідентичні.

Спочатку йде створення об'єктів-вузлів з урахуванням їх описи.
Потім проводиться розстановка зв'язків між вузлами. Тобто генеруються посилання виходів на входи та входів на виходи.

І лише після цього запускається основний цикл виконання програми.

Писав я довго, але весь процес - від "завантаження" схеми з FLASH-пам'яті до запуску основного циклу - займає частки секунди для схеми з 60-80 вузлів.

Як працює основний цикл? Дуже просто. Спочатку він чекає виникнення події у якомусь вузлі, потім обробляє цю подію. І так нескінченно. Ну чи поки не завантажать у ShIoTiny нову схему.

Вже кілька разів я згадував такі речі, як події, вузли и зв'язку. Але що це з програмної точки зору? Про це й поговоримо сьогодні.

Вузли, зв'язки та події

Достатньо поглянути на приклади схем-програм для ShIoTinyЩоб зрозуміти, що складається схема лише з двох сутностей - вузлів (або елементів) і зв'язків між ними.

вузол, але так або елемент схеми — це віртуальне уявлення якогось дії над даними. Це може бути арифметична операція, логічна операція або взагалі яка завгодно операція, яка спаде нам на думку. Головне, що у вузла є вхід та вихід.

Вхід - Це те місце, куди вузол приймає дані. Зображення входів – це точки, які завжди знаходяться з лівого боку вузла.

Вихід - Це те місце, звідки отримується результат роботи вузла. Зображення виходів — це точки, які завжди з правого боку вузла.

Деякі вузли не мають входів. Такі вузли генерують результат у собі. Наприклад, вузол-константа або вузол-датчик: їм не потрібні дані від інших вузлів, щоб повідомити результат.

Інші вузли, навпаки, не мають виходів. Це вузли, що відображають, наприклад, виконавчі пристрої (реле або ще якісь подібні). Вони приймають дані, але не генерують результат обчислень, доступного для інших вузлів.

Крім того, є ще унікальний вузол-коментар. Він нічого не робить, не має входів ні виходів. Його призначення бути поясненням на схемі.

Що таке "подія»? Подія — це виникнення нових даних у якомусь вузлі. Наприклад, до подій відносяться: зміна стану входу (вузол вхід), прийом даних від іншого пристрою (вузли MQTT и UDP), закінчення заданого проміжку часу (вузли Таймер и Затримка) і так далі.

Навіщо потрібні події? Так для того, щоб визначити — в якому вузлі виникли нові дані та стан яких вузлів необхідно змінити у зв'язку з отриманням нових даних. Подія, як би проходить по ланцюжку вузлів, поки не обійде всі вузли, стан яких необхідно перевірити і змінити.

Усі вузли можна поділити на дві категорії.
Вузли, які можуть генерувати події назвемо «активні вузли».
Вузли, які не можуть генерувати події назвемо «пасивні вузли».

Коли вузол генерує подію (тобто у нього на виході з'являються нові дані), то змінюється у загальному випадку стан всього ланцюжка вузлів, підключених до виходу вузла-генератора події.

Щоб було зрозуміло, розглянемо приклад малюнку.

ShIoTiny: вузли, зв'язки та події або особливості малювання програм

Активні вузли тут - Input1, Input2 і Input3. Інші вузли – пасивні. Розглянемо, що відбувається, коли замикається той чи інший вхід. Результати зручності зведені в табличку.

ShIoTiny: вузли, зв'язки та події або особливості малювання програм

Як бачимо, при виникненні події, будується ланцюжок від вузла-джерела події та до кінцевого вузла. Стан тих вузлів, які потрапляють у ланцюжок, не змінюється.

Виникає законне питання, а що ж буде при виникненні двох або кількох подій одночасно?

Як любителя творчості Гліба Анфілова мене так і тягне відправити цікавого запитувача до його книги «Втеча від здивувань». Це така "теорія відносності для найменших", в якій добре розказано, що таке "одночасно" і як з цим жити.

Але суто практично все набагато простіше: при виникненні двох або взагалі кількох подій послідовно будуються та обробляються всі ланцюжки від кожного джерела події по черзі та жодних чудес.

Наступне цілком законне питання цікавого читача — а що буде, якщо вузли з'єднати в кільце? Або, як це заведено говорити серед цих ваших розумників — запровадити зворотний зв'язок. Тобто з'єднати вихід одного з вузлів із входом попереднього вузла так, щоб стан виходу цього вузла впливав на стан його входу. Безпосередньо з'єднати вихід вузла з його ж входом вам не дозволить редактор ElDraw. А от опосередковано, як на малюнку нижче це зробити можна.

Отже, що буде в цьому випадку? Відповідь буде дуже «певна»: дивлячись якісь вузли. Розглянемо приклад малюнку.

ShIoTiny: вузли, зв'язки та події або особливості малювання програм

Коли контакти входу Input1 розімкнуті на верхньому вході вузла А - 0. На виході вузла А, також 0. На виході вузла Б - 1. І, нарешті, на нижньому вході вузла А - 1. Все ясно. А кому не ясно – подивіться нижче опис того, як працюють вузли «І» та «НЕ».

Тепер замкнемо контакти входу Input1, тобто подамо на верхній вхід вузла А одиницю. Ті, хто знайомий із електронікою, знає, що фактично ми отримаємо класичну схему генератора на логічних елементах. І за ідеєю, така схема повинна нескінченно видавати на виході елементів А та Б послідовності 1-0-1-0-1-0…. та 0-1-0-1-0-1-…. Адже подія має постійно змінювати стан вузлів А та Б, бігаючи по колу 2-3-2-3-…!

Але насправді це не відбувається. Схема впаде у випадковий стан - або реле залишиться включеним або відключеним, а може і злегка продзижчати вмикаючись-відключаючись кілька разів поспіль. Все залежить від погоди на південному полюсі Марса. І ось чому так стається.

Подія з вузла Input1 змінює стан вузла А, потім вузла Б і так кілька разів. Програма визначає «зациклювання» події та примусово припиняє цей карнавал. Після цього зміна стану вузлів А та Б блокуються до виникнення нової події. Момент, у який програма вирішить – «вистачить крутитися по колу!» - Загалом залежить від багатьох факторів і його можна вважати випадковим.

Будьте обережні, поєднуючи вузли в кільце - ефекти будуть не завжди очевидними! Добре уявляйте, що і навіщо ви робите!

А чи можна все ж таки побудувати генератор на доступних нам вузлах? Так можна! Але для цього потрібний вузол, який сам уміє генерувати події. І такий вузол є — це лінія затримки. Подивимося, як працює генератор з періодом 6 секунд на малюнку нижче.

ShIoTiny: вузли, зв'язки та події або особливості малювання програм

Ключовим елементом генератора є вузол А – лінія затримки. Якщо змінити стан входу лінії затримки з 0 на 1, то на виході 1 з'явиться не відразу, а тільки через заданий час. У нашому випадку це три секунди. Так само, якщо змінити стан входу лінії затримки з 3 на 1, то 0 на виході з'явиться через 0 секунди. Час затримки визначається в десятих частках секунди. Тобто значення 3 і означає 30 сек.

Особливістю лінії затримки і те, що вона генерує подію після закінчення часу затримки.

Припустимо, що спочатку на виході лінії затримки був 0. Після проходження вузла Б - інвертора - цей 0 перетворюється на 1 і надходить на вхід лінії затримки. Одразу нічого не відбувається. На виході лінії затримки як був 0 так і залишиться, зате включається відлік часу затримки. Проходить 3 секунди. І тут лінія затримки генерує подію. На виході у неї з'являється 1. Ця одиниця після проходження вузла Б - інвертора - перетворюється на 0 і надходить на вхід лінії затримки. Проходить ще 3 секунди і процес повторюється. Тобто, кожні 3 секунди стан виходу лінії затримки змінюється з 0 на 1 і потім з 1 на 0. Реле клацає. Генератор працює. Період імпульсів становить 6 секунд (3 секунди на виході нуль і 3 секунди одиниця).

Але в реальних схемах зазвичай не потрібно використовувати і цей приклад. Існують спеціальні вузли-таймери, які чудово та без сторонньої допомоги генерують послідовність імпульсів із заданим періодом. Тривалість «нуля» та «одиниці» у цих імпульсах дорівнюють половині періоду.

Для завдання періодичних дій використовуйте вузли-таймери.

Зазначу, такі цифрові сигнали, де тривалість «нуля» і «одиниці» рівні, називаються «меандром».

Сподіваюся, я трохи прояснив питання про те, як відбувається поширення подій між вузлами і чого робити не варто?

Висновок та посилання

Стаття вийшла короткою, але це стаття-відповідь на питання щодо вузлів і подій.

У міру розвитку прошивок та появи нових прикладів я писатиму про те, як програмувати ShIoTiny невеликі статті, доки це буде цікаво людям.

Як і раніше, схема, прошивка, приклади, опис вузлів і все інше тут.

Запитання, побажання, критика — це сюди: [захищено електронною поштою]

Джерело: habr.com

Додати коментар або відгук