ShIoTiny: възли, връзки и събития или особености на рисуването на програми

ShIoTiny: възли, връзки и събития или особености на рисуването на програми

Основни тези или за какво става дума в тази статия

Темата на статията е визуално програмиране на ПЛК ShIoTiny за умния дом, описан тук: ShIoTiny: малка автоматизация, интернет на нещата или "половин година преди отпуска".

Много накратко разглеждат се понятия като възли, връзки, събития, а също и особеностите на зареждането и изпълнението на визуалната програма на ESP8266, който е основата на ПЛК ShIoTiny.

Въведение или няколко организационни въпроса

В предишната статия относно моята разработка направих кратък преглед на възможностите на контролера ShIoTiny.

Както и да е, обществото прояви доста силен интерес и зададе много въпроси. Някои хора дори предложиха веднага да купят контролера от мен. Не, не съм против да спечеля малко, но съвестта ми не ми позволява да продавам нещо, което все още е много сурово в програмен план.

Затова публикувах на GitHub бинарни версии на фърмуера и схемата на устройството: фърмуер + кратка инструкция + схема + примери.

Сега всеки може да запише ESP-07 и самостоятелно да поиграе с фърмуера. Ако на някого много му се иска точно такава платка, каквато е на снимката — имам тях няколко. Пишете на имейл shiotiny@yandex.ru. Но, както казваше незабравимият Огурцов: "Аз не нося отговорност за нищо!".

И така, да преминем към същността: какво е "възел" (нода) и "събитие"? Как се изпълнява програмата?

Както обикновено — ще започнем по ред: с зареждане на програмата.

Как се зарежда програмата

Започваме с това, което се случва, когато натиснем бутона Upload в редактора ElDraw и нашата схема-програма, състояща се от красиви квадрати, отива в устройството.

На първо място, на базата на нарисуваната от нас схема се изгражда нейното описание в текстов вид.
На второ място, проверява се — дали всички входове на възлите са свързани с изходите. Не трябва да има "висящи" входове. Ако такъв вход бъде открит — схемата в ShIoTiny няма да се зареди, а редакторът ще изведе съответно предупреждение.

Ако всичко премине успешно, редакторът изпраща в ShIoTiny текстовото описание на схемата по един възел. Разбира се, съществуващата схема от ShIoTiny предварително се изтрива. Полученото текстово описание се запазва в FLASH-паметта.

Между другото, ако искате да изтриете схемата от устройството, просто заредете в него празна схема (не съдържаща нито един елемент-възел).

След като цялата схема-програма бъде заредена в ПЛК ShIoTiny, тя започва да «се изпълнява». Какво означава това?

Важно е да се отбележи, че процесите на зареждане на схемата от FLASH паметта при включване на захранването и при получаване на схемата от редактора са идентични.

Първо се извършва създаването на обекти-възли на базата на тяхното описание.
След това се извършва установяване на връзки между възлите. Тоест, генерират се връзки от изходите към входовете и от входовете към изходите.

И едва след всичко това се стартира основният цикъл на изпълнение на програмата.

Писах дълго, но целият процес - от «зареждане» на схемата от FLASH паметта до стартиране на основния цикъл - отнема части от секундата за схема от 60-80 възли.

Как работи основният цикъл? Много просто. Първо той изчаква възникването събития в някой възел, след това обработва това събитие. И така без край. Или докато не заредят в ShIoTiny нова схема.

Вече няколко пъти споменах подобни неща, като събития, възли и връзки. Но какво представлява това от програмна гледна точка? За това и ще говорим днес.

Възли, връзки и събития

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

Възел, възел или елемент на схемата — това е виртуално представление на някаква действия обработка на данни. Това може да бъде аритметична операция, логическа операция или каквато и да е друга операция, която ни дойде на ум. Основното е, че възелът има вход и изход.

Вход — това е мястото, където възелът приема данни. Изображенията на входовете са точки, винаги разположени от лявата страна на възела.

Изход — това е мястото, откъдето се извлича резултатът от работата на възела. Изображенията на изходите са точки, винаги разположени от дясната страна на възела.

Някои възли нямат входове. Такива възли генерират резултата вътре в себе си. Например възел-константа или възел-сензор: те не се нуждаят от данни от други възли, за да съобщят резултата.

От друга страна, други възли нямат изходи. Това са възли, които визуализират, например, изпълнителни устройства (релета или други подобни). Те приемат данни, но не генерират резултат от изчисленията, достъпен за други възли.

Освен това, съществува и уникален възел-коментар. Той не прави нищо, няма нито входове, нито изходи. Неговото предназначение е да бъде пояснение в схемата.

Какво е «събитие»? Събитие — това е възникването на нови данни в някой възел. Например събитията включват: промяна на състоянието на входа (възел Input), прием на данни от друго устройство (възли MQTT и UDP), изтичане на зададения времеви интервал (възли Timer и Забавяне) и така нататък.

За какво са необходими събитията? За да определим — в кой възел са възникнали нови данни и какви състояния на възлите трябва да се променят във връзка с получаването на новите данни. Събитието, сякаш «преминава» по веригата от възли, докато не мине през всички възли, чийто статус трябва да бъде проверен и променен.

Всички възли могат да се поделят на две категории.
Възли, които могат да генерират събития, ще наречем «активни възли».
Възли, които не могат да генерират събития, ще наречем «пасивни възли».

Когато възел генерира събитие (тоест има нови данни на изхода), обикновено се променя състоянието на цялата верига от възли, свързани с изхода на възела-генератор на събития.

За да бъде ясно, нека разгледаме пример на изображението.

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: възли, връзки и събития или особености на рисуването на програми

Ключовият елемент на генератора е възел A - линия на забавяне. Ако променим състоянието на входа на линията на забавяне от 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 секунди на изхода 0 и 3 секунди - 1).

Но в реалните схеми обикновено не е необходимо да се използва и този пример. Съществуват специални таймери, които великолепно и без чужда помощ генерират последователност от импулси с зададен период. Продължителността на „нула“ и „единица“ в тези импулси е равна на половината от периода.

За задаване на периодични действия, използвайте таймери.

Ще отбележа, че такива цифрови сигнали, при които продължителността на „нула“ и „единица“ е равна, се наричат „меандър“.

Надявам се, че малко изясних въпроса как се разпространяват събитията между възлите и какво не трябва да се прави?

Заключение и линкове

Статията се оказа кратка, но това е статия-отговор на възникналите въпроси по отношение на възлите и събитията.

С развитието на фърмуерите и появата на нови примери ще пиша за това как да програмирам ShIoTiny малки статии, докато е интересно за хората.

Както и по-рано, схемата, фърмуера, примерите, описанието на възлите и всичко останало тук.

Въпроси, предложения, критика — тук: shiotiny@yandex.ru

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster