
Асноўныя тэзы ці пра што гэты артыкул
Тэма артыкула - візуальнае праграмаванне ПЛК ShIoTiny для разумнага дома, апісанага тут: .
Вельмі коратка разгледжаны такія паняцці, як вузлы, сувязі, падзеі, а таксама асаблівасці загрузкі і выканання візуальнай праграмы на ESP8266, які з'яўляецца асновай ПЛК ShIoTiny.
Уступленне або пара аргпытанняў
У папярэднім артыкуле з нагоды сваёй распрацоўкі я зрабіў кароткі агляд магчымасцяў кантролера ShIoTiny.
Як ні дзіўна, грамадскасць праявіла даволі моцную зацікаўленасць і задала мне даволі шмат пытанняў. Некаторыя таварышы нават адразу адразу прапанавалі ў мяне купіць кантролер. Не, я не супраць таго, каб крыху зарабіць, але сумленне не дазваляе мне прадаваць яшчэ вельмі сырую ў праграмным плане рэч.
Таму я выклаў на GitHub бінарнікі прашыўкі і схему прылады: .
Цяпер кожны можа адштабнаваць ESP-07 і асабіста пагуляцца з прашыўкай. Калі каму вельмі хочацца менавіта такую плату як на фота - то ў мяне ёсць іх некалькі штук. Пішыце на пошту shiotiny@yandex.ru. Але, як гаварыў незабыўны Агуркоў: "Я ні завошта не адказваю!".
Пяройдзем да сутнасці: што такоевузел» (нода) і «падзея«? Як выконваецца праграма?
Як звычайна – пачнем па парадку: з загрузкі праграмы.
Як загружаецца праграма
Пачнём з таго, што адбываецца, калі мы націскаем кнопачку Загружаць у рэдактары ElDraw і наша схема-праграма, якая складаецца з прыгожых квадрацікаў ляціць у прыладу.
Па-першае, на аснове намаляванай намі схемы будуецца яе апісанне ў тэкставым выглядзе.
Па-другое, правяраецца - ці ўсе ўваходы вузлоў злучаныя з выхадамі. «Вісячых» уваходаў не павінна быць. Калі такі ўваход знойдзены - схема ў ShIoTiny не загрузіцца, а рэдактар выведзе адпаведнае папярэджанне.
Калі ўсё прайшло паспяхова, то рэдактар пасылае ў ShIoTiny тэкставае апісанне схемы па адным вузле. Зразумела, якая існуе схема з ShIoTiny папярэдне выдаляецца. Атрыманае тэкставае апісанне захоўваецца ва FLASH-памяць.
Дарэчы, калі вы жадаеце выдаліць схему з прылады, то проста загрузіце ў яго пустую схему (не ўтрымоўвальную ніводнага элемента-вузла).
Як толькі ўся схема-праграма загружана ў ПЛК ShIoTiny, яна пачынае "выконвацца". Што гэта значыць?
Адзначым, што працэсы загрузкі схемы з FLASH-памяці пры ўключэнні харчавання і пры прыёме схемы з рэдактара - ідэнтычныя.
Спачатку ідзе стварэнне аб'ектаў-вузлоў на аснове іх апісання.
Затым робіцца расстаноўка сувязяў паміж вузламі. Гэта значыць генеруюцца спасылкі выхадаў на ўваходы і ўваходаў на выхады.
І толькі пасля ўсяго гэтага запускаецца асноўны цыкл выканання праграмы.
Пісаў я доўга, але ўвесь працэс -ад "загрузкі" схемы з FLASH-памяці да запуску асноўнага цыклу - займае дзелі секунды для схемы з 60-80 вузлоў.
Як працуе асноўны цыкл? Вельмі проста. Спачатку ён чакае ўзнікнення падзеі у якім-небудзь вузле, затым апрацоўвае гэтую падзею. І так без канца. Ну ці пакуль не загрузяць у ShIoTiny новую схему.
Ужо некалькі разоў я згадваў такія рэчы, як падзеі, вузлы и сувязі. Але што ж гэта такое з праграмнага пункта гледжання? Аб гэтым і пагаворым сёння.
Вузлы, сувязі і падзеі
Дастаткова зірнуць на прыклады схем-праграм для ShIoTiny, Каб зразумець, што складаецца схема толькі з двух сутнасцяў - вузлоў (або элементаў) і сувязяў паміж імі.
вузел, нода або элемент схемы - гэта віртуальнае ўяўленне нейкага дзеянні над дадзенымі. Гэта можа быць арыфметычная аперацыя, лагічная аперацыя ці ўвогуле якая заўгодна аперацыя, якая прыйдзе нам у галаву. Галоўнае, што ў вузла ёсць уваход і выхад.
Уваход - Гэта тое месца, куды вузел прымае дадзеныя. Выявы ўваходаў - гэта кропкі, якія знаходзяцца заўсёды з левага боку вузла.
Выхад - гэта тое месца, адкуль здабываецца вынік працы вузла. Выявы выхадаў - гэта кропкі, якія знаходзяцца заўсёды з правага боку вузла.
У некаторых вузлоў няма ўваходаў. Такія вузлы генеруюць вынік унутры сябе. Напрыклад вузел-канстанта ці вузел-датчык: ім не патрэбныя дадзеныя ад іншых вузлоў, каб паведаміць вынік.
У іншых вузлоў, наадварот, няма вынахадаў. Гэта вузлы, якія адлюстроўваюць, напрыклад, выканаўчыя прылады (рэле ці яшчэ якія-небудзь падобныя). Яны прымаюць дадзеныя, але не генеруюць выніку вылічэнняў, даступнага для іншых вузлоў.
Акрамя таго, ёсць яшчэ ўнікальны вузел-каментар. Ён нічога не робіць, не мае ні ўваходаў, ні выхадаў. Яго прызначэнне - быць тлумачэннем на схеме.
Што такое "падзея»? Падзея - Гэта ўзнікненне новых дадзеных у якім-небудзь вузле. Напрыклад да падзей адносяцца: змяненне стану ўваходу (вузел уваход), прыём дадзеных ад іншай прылады (вузлы MQTT и UDP), заканчэнне зададзенага прамежку часу (вузлы Таймер и затрымка) і гэтак далей.
Для чаго патрэбны падзеі? Ды для таго, каб вызначыць - у якім вузле паўсталі новыя дадзеныя і станы якіх вузлоў неабходна змяніць у сувязі з атрыманнем новых дадзеных. Падзея, як бы "праходзіць" па ланцужку вузлоў, пакуль не абміне ўсе вузлы, стан якіх неабходна праверыць і змяніць.
Усе вузлы можна падзяліць на дзве катэгорыі.
Вузлы, якія могуць генераваць падзеі назавемактыўныя вузлы.
Вузлы, якія не могуць генераваць падзеі назавемпасіўныя вузлы.
Калі вузел генеруе падзею (гэта значыць у яго на вынахадзе з'яўляюцца новыя дадзеныя), тое змяняецца ў агульным выпадку стан усяго ланцужка вузлоў, падлучаных да вынахаду вузла-генератара падзеі.
Каб было зразумела, разгледзім прыклад на малюнку.

Актыўныя вузлы тут – Input1, Input2 і Input3. Астатнія вузлы - пасіўныя. Разгледзім што адбываецца, калі замыкаецца той ці іншы ўваход. Вынікі для зручнасці зведзены ў таблічку.

Як бачым, пры ўзнікненні падзеі, будуецца ланцужок ад вузла-крыніцы падзеі і да канцавога вузла. Стан тых вузлоў, якія не трапляюць у ланцужок, не мяняецца.
Узнікае законнае пытанне, а што ж будзе пры ўзнікненні дзвюх ці ўвогуле некалькіх падзей адначасова?
Як аматара творчасці Глеба Анфілава, мяне так і цягне адправіць цікаўнага запытальніка да яго кнігі «Уцёкі ад здзіўленняў». Гэта такая "тэорыя адноснасці для самых маленькіх", у якой добра расказана, што такое "адначасова" і як з гэтым жыць.
Але чыста практычна ўсё значна прасцей: пры ўзнікненні дзвюх ці ўвогуле некалькіх падзей паслядоўна будуюцца і апрацоўваюцца ўсе ланцужкі ад кожнай крыніцы падзеі па чарзе і ніякіх цудаў.
Наступнае цалкам законнае пытанне цікаўнага чытача - а што будзе, калі вузлы злучыць у кольца? Або, як гэта прынята казаць сярод гэтых вашых разумнікаў - увесці зваротную сувязь. Гэта значыць, злучыць выхад аднаго з вузлоў з уваходам папярэдняга вузла так, каб стан выхаду гэтага вузла ўплывала на стан яго ж ўваходу. Напрамую злучыць выхад вузла з яго ж уваходам вам не дазволіць рэдактар ElDraw. А вось апасродкавана, як на малюнку ніжэй - гэта зрабіць можна.
Што ж будзе ў гэтым выпадку? Адказ будзе вельмі "пэўны": гледзячы якія вузлы. Разгледзім прыклад на рысунку.

Калі кантакты ўваходу Input1 растуленыя на верхнім уваходзе вузла А - 0. На выхадзе вузла А, таксама 0. На выхадзе вузла Б - 1. І, нарэшце, на ніжнім уваходзе вузла А - 1. Усё ясна. А каму не ясна – паглядзіце ніжэй апісанне таго, як працуюць вузлы "І" і "НЕ".
Зараз замкнем кантакты ўваходу Input1, гэта значыць пададзім на верхні ўваход вузла А адзінку. Тыя, хто знаёмы з электронікай, ведае, што фактычна мы атрымаем класічную схему генератара на лагічных элементах. І па ідэі, такая схема павінна бясконца выдаваць на выхадзе элементаў А і Б паслядоўнасці 1-0-1-0-1-0…. і 0-1-0-1-0-1-…. Бо падзея павінна ўвесь час зменяць стан вузлоў А і Б, бегаючы па крузе 2-3-2-3-…!
Але насамрэч гэтага не адбываецца. Схема ўпадзе ў выпадковы стан - або рэле застанецца уключаным або адключаным, а можа і злёгку прагудзець уключаючыся-адключаючыся некалькі разоў запар. Усё залежыць ад надвор'я на паўднёвым полюсе Марса. І вось чаму так адбываецца.
Падзея з вузла Input1 змяняе стан вузла А, потым вузла Б і так па коле некалькі разоў. Праграма вызначае "зацыкляванне" падзеі і прымусова спыняе гэты карнавал. Пасля гэтага змена стану вузлоў А і Бы блакуюцца да ўзнікнення новай падзеі. Момант, у які праграма вырашыць - "хопіць круціцца па крузе!" - У агульным выпадку залежыць ад многіх фактараў і яго можна лічыць выпадковым.
Будзьце асцярожныя, злучаючы вузлы ў кольца - эфекты будуць не заўсёды відавочнымі! Добра ўяўляйце што і навошта вы робіце!
А ці можна ўсё ж пабудаваць генератар на даступных нам вузлах? Так магчыма! Але для гэтага неабходны вузел, які сам умее генераваць падзеі. І такі вузел ёсць - гэта "лінія затрымкі". Паглядзім як працуе генератар з перыядам 6 секунд на малюнку ніжэй.

Ключавым элементам генератара з'яўляецца вузел А - лінія затрымкі. Калі змяніць стан уваходу лініі затрымкі з 0 на 1, то 1 на выхадзе з'явіцца не адразу, а толькі праз зададзены час. У нашым выпадку гэта 3 сэкунды. Сапраўды гэтак жа, калі змяніць стан уваходу лініі затрымкі з 1 на 0, то 0 на вынахадзе з'явіцца праз тыя ж 3 секунды. Час затрымкі задаецца ў дзясятых дзелях секунды. Гэта значыць значэнне 30 і азначае - 3 сек.
Асаблівасцю лініі затрымкі з'яўляецца тое, што яна генеруе падзею пасля заканчэння часу затрымкі.
Выкажам здагадку, што першапачаткова на вынахадзе лініі затрымкі быў 0. Пасля мінання вузла Б - інвертара - гэты 0 ператвараецца ў 1 і паступае на ўваход лініі затрымкі. Адразу нічога не адбываецца. На выхадзе лініі затрымкі як быў 0 так і застанецца, але затое ўключаецца адлік часу затрымкі. Праходзіць 3 секунды. І тут жа лінія затрымкі генеруе падзею. На выхадзе ў яе з'яўляецца 1. Гэтая адзінка пасля праходжання вузла Б - інвертара - ператвараецца ў 0 і паступае на ўваход лініі затрымкі. Праходзіць яшчэ 3 секунды… і працэс паўтараецца. Гэта значыць кожныя 3 секунды стан выхаду лініі затрымкі мяняецца з 0 на 1 і затым з 1 на 0. Рэле пстрыкае. Генератар працуе. Перыяд імпульсаў складае 6 секунд (3 секунды на выхадзе нуль і 3 секунды - адзінка).
Але, у рэальных схемах, звычайна ня трэба выкарыстоўваць і гэты прыклад. Існуюць спецыяльныя вузлы-таймеры, якія цудоўна і без старонняй дапамогі генеруюць паслядоўнасць імпульсаў з зададзеным перыядам. Працягласць "нуля" і "адзінкі" у гэтых імпульсах роўныя палове перыяду.
Для задання перыядычных дзеянняў, выкарыстоўвайце вузлы-таймеры.
Адзначу, што такія лічбавыя сігналы, дзе працягласць "нуля" і "адзінкі" роўныя, называюцца "меандрам".
Спадзяюся, я крыху растлумачыў пытанне аб тым як адбываецца распаўсюджванне падзей паміж вузламі і чаго рабіць не варта?
Заключэнне і спасылкі
Артыкул атрымаўся кароткім, але гэта артыкул-адказ на пытанні па вузлах і падзеях.
Па меры развіцця прашывак і з'яўленні новых прыкладаў я буду пісаць пра тое, як праграмаваць ShIoTiny невялікія артыкулы, пакуль гэта будзе цікава людзям.
Як і раней, схема, прашыўка, прыклады, апісанне вузлоў і ўсё .
Пытанні, пажаданні, крытыка - гэта сюды: shiotiny@yandex.ru
Крыніца: habr.com
