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

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

Ключови точки или за какво става въпрос в тази статия

Темата на статията е визуално програмиране на PLC ShIoTiny за интелигентния дом, описан тук: ShIoTiny: малка автоматизация, интернет на нещата или „шест месеца преди ваканция“.

Съвсем накратко понятия като възли, связи, развитие, както и функции за зареждане и изпълнение на визуална програма на ESP8266, което е в основата на PLC ShIoTiny.

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

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

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

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

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

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

Както обикновено, нека започнем по ред: като изтеглим програмата.

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

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

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

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

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

След като цялата схемна програма бъде заредена в ShIoTiny PLC, тя започва да се „изпълнява“. Какво означава?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Какво стана "събитие» събитие е появата на нови данни във всеки възел. Например събитията включват: промяна във входното състояние (възел Вход), получаване на данни от друго устройство (възли MQTT и UDP), изтичане на определен период от време (възли Часовник и закъснение) и така нататък.

За какво са събитията? Да, за да се определи в кой възел са възникнали нови данни и състоянията на кои възли трябва да бъдат променени във връзка с получаването на нови данни. Събитието, така да се каже, „преминава“ по веригата от възли, докато заобиколи всички възли, чието състояние трябва да бъде проверено и променено.

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

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

За да стане ясно, разгледайте примера на фигурата.

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

Активните възли тук са Input1, Input2 и Input3. Останалите възли са пасивни. Нека да разгледаме какво се случва, когато един или друг вход е затворен. За удобство резултатите са обобщени в таблица.

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

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

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

Като любител на творчеството на Глеб Анфилов се изкушавам да изпратя един любопитен въпросник към книгата му „Бягство от изненадата“. Това е „теория на относителността за най-малките“, която добре обяснява какво означава „едновременно“ и как да живеем с това.

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

Следващият напълно легитимен въпрос от любопитен читател е какво ще се случи, ако възлите са свързани в пръстен? Или, както се казва сред тези ваши умници, въведете обратна връзка. Тоест свържете изхода на един от възлите към входа на предишния възел, така че изходното състояние на този възел да повлияе на състоянието на неговия вход. Редакторът няма да ви позволи директно да свържете изхода на възел към неговия вход. ElDraw. Но индиректно, както е на фигурата по-долу, това може да се направи.

И така, какво ще се случи в този случай? Отговорът ще бъде много „категоричен“: в зависимост от това кои възли. Нека разгледаме примера на фигурата.

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

Когато входните контакти на Input1 са отворени, горният вход на възел A е 0. Изходът на възел A също е 0. Изходът на възел B е 1. И накрая, долният вход на възел A е 1. Всичко е ясно. А за тези, които не са наясно, погледнете по-долу за описание на това как работят възлите „И“ и „НЕ“.

Сега затваряме контактите на входа Input1, тоест прилагаме един към горния вход на възел A. Тези, които са запознати с електрониката, знаят, че всъщност ще получим класическа генераторна схема, използваща логически елементи. И на теория такава верига трябва безкрайно да произвежда последователността 1-0-1-0-1-0… на изхода на елементи A и B. и 0-1-0-1-0-1-…. В края на краищата, събитието трябва постоянно да променя състоянието на възли A и B, движейки се в кръг 2-3-2-3-...!

Но в действителност това не се случва. Веригата ще изпадне в произволно състояние - или релето ще остане включено или изключено, или може би леко ще се включва и изключва няколко пъти подред. Всичко зависи от времето на южния полюс на Марс. И затова се случва това.

Събитие от възел Input1 променя състоянието на възел A, след това възел B и така нататък в кръг няколко пъти. Програмата открива „зациклянето“ на събитието и принудително спира този карнавал. След това промените в състоянието на възли A и B се блокират, докато настъпи ново събитие. Моментът, в който програмата реши "спрете да се въртите в кръг!" - като цяло зависи от много фактори и може да се счита за случаен.

Бъдете внимателни, когато свързвате възли в пръстен - ефектът не винаги ще бъде очевиден! Имайте добра представа какво и защо правите!

Все още ли е възможно да се изгради генератор върху наличните ни възли? Да, можеш! Но това изисква възел, който може сам да генерира събития. И има такъв възел - това е „линията на забавяне“. Нека да видим как работи генератор с период от 6 секунди на фигурата по-долу.

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

Ключовият елемент на генератора е възел А - линията на забавяне. Ако промените входното състояние на линията на забавяне от 0 на 1, тогава 1 няма да се появи на изхода веднага, а само след определено време. В нашия случай това е 3 секунди. По същия начин, ако промените състоянието на входа на линията за забавяне от 1 на 0, тогава 0 на изхода ще се появи след същите 3 секунди. Времето на забавяне се задава в десети от секундата. Тоест стойността 30 означава 3 секунди.

Особеност на линията за забавяне е, че тя генерира събитие след изтичане на времето за забавяне.

Да приемем, че първоначално изходът на линията на забавяне е бил 0. След преминаване на възел B - инвертора - тази 0 се превръща в 1 и отива на входа на линията на забавяне. Нищо не става веднага. На изхода на линията за забавяне той ще остане 0, но ще започне обратното броене на времето за забавяне. Минават 3 секунди. И тогава линията на забавяне генерира събитие. На изхода му се появява 1. Тази единица след преминаване през възел B - инвертора - се превръща в 0 и отива на входа на линията за забавяне. Минават още 3 секунди... и процесът се повтаря. Тоест на всеки 3 секунди състоянието на изхода на линията за забавяне се променя от 0 на 1 и след това от 1 на 0. Релето щраква. Генератора работи. Периодът на импулса е 6 секунди (3 секунди на изхода нула и 3 секунди на изхода единица).

Но в реални схеми обикновено няма нужда да се използва този пример. Има специални таймерни възли, които перфектно и без външна помощ генерират последователност от импулси с даден период. Продължителността на "нула" и "едно" в тези импулси е равна на половината от периода.

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

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

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

Заключение и литература

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

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

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

Въпроси, предложения, критики - отидете тук: [имейл защитен]

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

Добавяне на нов коментар