ShIoTiny: węzły, połączenia i zdarzenia lub funkcje programów do rysowania

ShIoTiny: węzły, połączenia i zdarzenia lub funkcje programów do rysowania

Główne punkty lub o czym jest ten artykuł

Tematem artykułu jest wizualne programowanie sterowników PLC ShioTiny dla opisanego tutaj inteligentnego domu: ShIoTiny: mała automatyzacja, Internet rzeczy, czyli „sześć miesięcy przed urlopem”.

Bardzo krótko pojęcia takie jak węzły, krawaty, wydarzenia, a także funkcje ładowania i wykonywania programu wizualnego na ESP8266, który jest podstawą PLC ShioTiny.

Wprowadzenie lub kilka pytań organizacyjnych

W poprzednim artykule o moim rozwoju dałem krótki przegląd możliwości sterownika ShioTiny.

Co dziwne, publiczność wykazała dość duże zainteresowanie i zadawała mi sporo pytań. Niektórzy znajomi nawet od razu zaproponowali, że kupią ode mnie kontroler. Nie, nie jestem przeciwny zarobieniu trochę pieniędzy, ale sumienie nie pozwala mi sprzedać czegoś, co jest wciąż bardzo prymitywne pod względem oprogramowania.

Dlatego zamieściłem pliki binarne oprogramowania sprzętowego i schemat urządzenia na GitHubie: firmware + najkrótsza instrukcja + schemat + przykłady.

Teraz każdy może sflashować ESP-07 i samodzielnie pobawić się oprogramowaniem. Jeżeli ktoś bardzo chce dokładnie taką samą deskę jak na zdjęciu to mam ich kilka. Napisz e-mailem [email chroniony]. Ale, jak mawiał niezapomniany Ogurcow: „Nie jestem za nic odpowiedzialny!”

Przejdźmy zatem do sedna: czym jest „węzeł„ (węzeł) i „wydarzenie„? Jak program jest wykonywany?

Zacznijmy jak zwykle w kolejności: od pobrania programu.

Sposób ładowania programu

Zacznijmy od tego, co dzieje się po naciśnięciu przycisku Prześlij w edytorze ElDraw a nasz program składający się z pięknych kwadratów wlatuje do urządzenia.

Najpierw na podstawie narysowanego przez nas diagramu budowany jest jego opis w formie tekstowej.
Po drugie sprawdza, czy wszystkie wejścia węzła są podłączone do wyjść. Nie powinno być żadnych „wiszących” wejść. Jeśli takie wejście zostanie wykryte, obwód nie zostanie załadowany do ShIoTiny, a edytor wyświetli odpowiednie ostrzeżenie.

Jeśli wszystko poszło dobrze, edytor wysyła opis tekstowy obwodu po jednym węźle na raz do ShIoTiny. Oczywiście w pierwszej kolejności usuwany jest istniejący obwód z ShIoTiny. Powstały opis tekstowy zapisywany jest w pamięci FLASH.

Nawiasem mówiąc, jeśli chcesz usunąć obwód z urządzenia, po prostu załaduj do niego pusty obwód (nie zawierający ani jednego elementu węzłowego).

Gdy cały program użytkowy zostanie załadowany do sterownika ShIoTiny, zaczyna on „wykonywać”. Co to znaczy?

Należy pamiętać, że procesy ładowania obwodu z pamięci FLASH po włączeniu zasilania i podczas odbierania obwodu z edytora są identyczne.

W pierwszej kolejności tworzone są obiekty węzłów na podstawie ich opisu.
Następnie tworzone są połączenia pomiędzy węzłami. Oznacza to, że generowane są powiązania wyjść z wejściami i wejść z wyjściami.

I dopiero po tym wszystkim rozpoczyna się cykl wykonywania programu głównego.

Pisałem długo, ale cały proces - od „załadowania” obwodu z pamięci FLASH do uruchomienia głównego cyklu - zajmuje ułamek sekundy dla obwodu 60-80 węzłów.

Jak działa pętla główna? Bardzo prosta. Najpierw czeka na pojawienie się wydarzenia w jakimś węźle, a następnie przetwarza to zdarzenie. I tak w nieskończoność. Cóż, albo dopóki nie prześlą nowego schematu do ShIoTiny.

Już kilka razy wspominałem o takich rzeczach jak np wydarzenia, węzły и krawaty. Ale co to jest z punktu widzenia oprogramowania? Porozmawiamy o tym dzisiaj.

Węzły, połączenia i zdarzenia

Wystarczy spojrzeć na przykłady programów obwodów dla ShioTinyzrozumieć, że diagram składa się tylko z dwóch bytów - węzłów (lub elementów) i połączeń między nimi.

Węzeł, ale tak lub element obwodu jest wirtualną reprezentacją niektórych działania nad danymi. Może to być operacja arytmetyczna, operacja logiczna lub jakakolwiek operacja, która przyjdzie nam do głowy. Najważniejsze jest to, że węzeł ma wejście i wyjście.

wejście - jest to miejsce, do którego węzeł otrzymuje dane. Obrazy wejściowe to punkty, które zawsze znajdują się po lewej stronie węzła.

Wyloguj się - jest to miejsce, w którym pobierany jest wynik działania węzła. Obrazy wyjściowe to punkty, które zawsze znajdują się po prawej stronie węzła.

Niektóre węzły nie mają wejść. Takie węzły generują wynik wewnętrznie. Na przykład węzeł stały lub węzeł czujnikowy: nie potrzebują danych z innych węzłów, aby zgłosić wynik.

Natomiast inne węzły nie mają żadnych wyjść. Są to węzły wyświetlające np. elementy wykonawcze (przekaźniki lub coś podobnego). Akceptują dane, ale nie generują wyniku obliczeń dostępnego dla innych węzłów.

Ponadto istnieje również unikalny węzeł komentarza. Nie robi nic, nie ma wejść ani wyjść. Jego celem jest wyjaśnienie na diagramie.

Co się stało "wydarzenie"? Wydarzenie jest pojawieniem się nowych danych w dowolnym węźle. Na przykład zdarzenia obejmują: zmianę stanu wejściowego (node Wkład), odbieranie danych z innego urządzenia (nodes MQTT и UDP), upływem określonego czasu (nodes Regulator czasowy и Opóźnienie) itp.

Po co są wydarzenia? Tak, w celu ustalenia, w którym węźle pojawiły się nowe dane i jakie stany należy zmienić w związku z otrzymaniem nowych danych. Zdarzenie niejako „przechodzi” wzdłuż łańcucha węzłów, aż ominie wszystkie węzły, których stan należy sprawdzić i zmienić.

Wszystkie węzły można podzielić na dwie kategorie.
Nazwijmy węzły, które mogą generować zdarzenia ”aktywne węzły".
Węzły, które nie mogą generować zdarzeń, nazwiemy „węzły pasywne".

Kiedy węzeł generuje zdarzenie (czyli na jego wyjściu pojawiają się nowe dane), to w ogólnym przypadku zmienia się stan całego łańcucha węzłów podłączonych do wyjścia węzła generatora zdarzeń.

Aby to wyjaśnić, rozważ przykład na rysunku.

ShIoTiny: węzły, połączenia i zdarzenia lub funkcje programów do rysowania

Aktywne węzły to Wejście1, Wejście2 i Wejście3. Pozostałe węzły są pasywne. Zastanówmy się, co się stanie, gdy jedno lub drugie wejście zostanie zamknięte. Dla wygody wyniki podsumowano w tabeli.

ShIoTiny: węzły, połączenia i zdarzenia lub funkcje programów do rysowania

Jak widać, w momencie wystąpienia zdarzenia budowany jest łańcuch od węzła źródłowego zdarzenia do węzła końcowego. Stan tych węzłów, które nie należą do łańcucha, nie zmienia się.

Powstaje uzasadnione pytanie: co się stanie, jeśli jednocześnie wystąpią dwa lub nawet kilka zdarzeń?

Jako miłośnik twórczości Gleba Anfiłowa kusi mnie, aby wysłać ciekawskiego pytającego do jego książki „Ucieczka przed niespodzianką”. To „teoria względności dla najmłodszych”, która dobrze wyjaśnia, co oznacza „jednoczesność” i jak z tym żyć.

Ale praktycznie wszystko jest znacznie prostsze: gdy mają miejsce dwa lub nawet kilka zdarzeń, wszystkie łańcuchy z każdego źródła zdarzeń są budowane sekwencyjnie i po kolei przetwarzane i nie zdarzają się żadne cuda.

Kolejne całkowicie uzasadnione pytanie ciekawskiego czytelnika brzmi: co się stanie, jeśli węzły zostaną połączone w pierścień? Lub, jak to mówią wśród tych twoich mądrych facetów, przedstaw informację zwrotną. Oznacza to, że połącz wyjście jednego z węzłów z wejściem poprzedniego węzła, tak aby stan wyjściowy tego węzła wpływał na stan jego wejścia. Edytor nie pozwoli na bezpośrednie połączenie wyjścia węzła z jego wejściem. ElDraw. Ale pośrednio, jak na poniższym rysunku, można to zrobić.

Co więc stanie się w tym przypadku? Odpowiedź będzie bardzo „określona”: w zależności od tego, które węzły. Spójrzmy na przykład na rysunku.

ShIoTiny: węzły, połączenia i zdarzenia lub funkcje programów do rysowania

Kiedy styki wejściowe wejścia 1 są otwarte, górne wejście węzła A wynosi 0. Wyjście węzła A również wynosi 0. Wyjście węzła B wynosi 1. I wreszcie dolne wejście węzła A wynosi 1. Wszystko jest jasne. A dla tych, którzy nie są jasne, spójrz poniżej, aby zapoznać się z opisem działania węzłów „AND” i „NOT”.

Teraz zamykamy styki wejścia Wejście1, to znaczy przykładamy je do górnego wejścia węzła A. Osoby obeznane z elektroniką wiedzą, że tak naprawdę otrzymamy klasyczny obwód generatora wykorzystujący elementy logiczne. I teoretycznie taki obwód powinien w nieskończoność generować sekwencję 1-0-1-0-1-0… na wyjściu elementów A i B. i 0-1-0-1-0-1-…. Przecież zdarzenie musi stale zmieniać stan węzłów A i B, biegnąc po okręgu 2-3-2-3-...!

Ale w rzeczywistości tak się nie dzieje. Obwód przejdzie w stan losowy - albo przekaźnik pozostanie włączony lub wyłączony, a może lekko brzęczy kilka razy z rzędu. Wszystko zależy od pogody na biegunie południowym Marsa. I dlatego tak się dzieje.

Zdarzenie z węzła Wejście1 zmienia stan węzła A, następnie węzła B i tak dalej w kółko. Program wykrywa „zapętlenie” wydarzenia i na siłę przerywa ten karnawał. Następnie zmiany stanu węzłów A i B są blokowane do czasu wystąpienia nowego zdarzenia. Moment, w którym program postanawia „przestać kręcić się w kółko!” - generalnie zależy to od wielu czynników i można je uznać za losowe.

Zachowaj ostrożność podczas łączenia węzłów w kółko – efekty nie zawsze będą widoczne! Miej dobre pojęcie o tym, co i dlaczego robisz!

Czy jest jeszcze możliwość zbudowania generatora na dostępnych nam węzłach? Tak, możesz! Wymaga to jednak węzła, który sam może generować zdarzenia. I jest taki węzeł - to jest „linia opóźnienia”. Zobaczmy jak działa generator z okresem 6 sekund na poniższym rysunku.

ShIoTiny: węzły, połączenia i zdarzenia lub funkcje programów do rysowania

Kluczowym elementem generatora jest węzeł A – linia opóźniająca. Jeżeli zmienimy stan wejściowy linii opóźniającej z 0 na 1, wówczas na wyjściu nie od razu pojawi się 1, lecz dopiero po określonym czasie. W naszym przypadku są to 3 sekundy. W ten sam sposób, jeśli zmienisz stan wejściowy linii opóźniającej z 1 na 0, to po tych samych 0 sekundach na wyjściu pojawi się 3. Czas opóźnienia ustawiany jest w dziesiątych części sekundy. Oznacza to, że wartość 30 oznacza 3 sekundy.

Cechą szczególną linii opóźniającej jest to, że generuje ona zdarzenie po upływie czasu opóźnienia.

Załóżmy, że początkowo wyjście linii opóźniającej wynosiło 0. Po przejściu węzła B – falownika – to 0 zamienia się na 1 i trafia na wejście linii opóźniającej. Nic nie dzieje się od razu. Na wyjściu linii opóźniającej pozostanie 0, ale rozpocznie się odliczanie czasu opóźnienia. Mijają 3 sekundy. A następnie linia opóźnienia generuje zdarzenie. Na jego wyjściu pojawia się 1. Jednostka ta po przejściu przez węzeł B - falownik - zamienia się na 0 i przechodzi na wejście linii opóźniającej. Mijają kolejne 3 sekundy... i proces się powtarza. Oznacza to, że co 3 sekundy stan wyjścia linii opóźniającej zmienia się z 0 na 1, a następnie z 1 na 0. Przekaźnik klika. Generator działa. Okres impulsu wynosi 6 sekund (3 sekundy na wyjściu zerowym i 3 sekundy na wyjściu).

Jednak w rzeczywistych obwodach zwykle nie ma potrzeby używania tego przykładu. Istnieją specjalne węzły czasowe, które doskonale i bez zewnętrznej pomocy generują sekwencję impulsów o zadanym okresie. Czas trwania „zero” i „jeden” w tych impulsach jest równy połowie okresu.

Aby ustawić działania okresowe, użyj węzłów czasowych.

Zwracam uwagę, że takie sygnały cyfrowe, w których czas trwania „zero” i „jeden” jest równy, nazywane są „meanderami”.

Mam nadzieję, że trochę wyjaśniłem pytanie, w jaki sposób zdarzenia są propagowane pomiędzy węzłami i czego nie robić?

Wnioski i odniesienia

Artykuł okazał się krótki, ale ten artykuł jest odpowiedzią na pytania, które pojawiły się dotyczące węzłów i zdarzeń.

W miarę rozwoju oprogramowania i pojawiania się nowych przykładów będę pisać o tym, jak programować ShioTiny małe artykuły, o ile będą interesujące dla ludzi.

Tak jak poprzednio schemat, firmware, przykłady, opis podzespołów i wszystko reszta jest tutaj.

Pytania, sugestie, krytyka - przejdź tutaj: [email chroniony]

Źródło: www.habr.com

Dodaj komentarz