
Points clés ou sujet de cet article
Le sujet de l'article est la programmation visuelle de l'automate
ShIoTiny pour la maison intelligente décrite ici:
ShIoTiny: petite automatisation, Internet des objets, ou «six mois avant les vacances» .
Des concepts tels que les
nœuds , les
communications , les
événements , ainsi que les fonctionnalités de chargement et d'exécution d'un programme visuel sur
ESP8266 , qui est la base de
ShIoTiny PLC, sont
très brièvement passés en revue .
Site du projet ShIoTinyIntroduction ou quelques questions d'organisation
Dans un article précédent sur mon développement, j'ai donné un bref aperçu des capacités du contrôleur
ShIoTiny .
Curieusement, le public a montré un intérêt assez fort et m'a posé beaucoup de questions. Certains camarades m'ont même proposé immédiatement d'acheter un contrôleur. Non, je ne suis pas opposé à gagner un peu d'argent, mais ma conscience ne me permet pas de vendre quelque chose qui est encore très grossier en termes de logiciels.
Par conséquent, j'ai posté sur les binaires du firmware GitHub et le schéma de l'appareil:
firmware + instruction la plus courte + circuit + exemples .
Désormais, tout le monde peut flasher ESP-07 et jouer avec le firmware par lui-même. Si quelqu'un veut vraiment un tel tableau que sur la photo, j'en ai plusieurs. Écrivez à
shiotiny@yandex.ru . Mais, comme le disaient les concombres inoubliables: "Je ne suis responsable de rien!"
Alors, allons droit au but: qu'est-ce qu'un «
nœud » (nœud) et un «
événement »? Comment est exécuté le programme?
Comme d'habitude - commençons dans l'ordre: en téléchargeant le programme.
Comment se charge le programme
Pour commencer, que se passe-t-il lorsque nous cliquons sur le bouton
Télécharger dans l'éditeur
ElDraw et notre schéma de programme, composé de beaux carrés, vole dans l'appareil.
Tout d'abord, sur la base du schéma que nous avons dessiné, sa description sous forme de texte est construite.
Deuxièmement, il est vérifié si toutes les entrées des nœuds sont connectées aux sorties. Il ne devrait y avoir aucune entrée «suspendue». Si une telle entrée est détectée, le circuit dans ShIoTiny ne se chargera pas et l'éditeur affichera un avertissement.
Si tout s'est bien passé, l'éditeur envoie une description textuelle du circuit à un nœud dans ShIoTiny. Bien sûr, le schéma existant de ShIoTiny est précédemment supprimé. La description textuelle résultante est enregistrée dans la mémoire FLASH.
Soit dit en passant, si vous souhaitez supprimer le circuit de l'appareil, chargez simplement un circuit vide (qui ne contient aucun élément de nœud).
Dès que tout le circuit du programme est chargé dans l'automate ShIoTiny, il commence à «fonctionner». Qu'est-ce que cela signifie?
Notez que les processus de chargement du circuit à partir de la mémoire FLASH lors de la mise sous tension et lorsque le circuit est reçu de l'éditeur sont identiques.
Vient d'abord la création d'objets nœuds en fonction de leur description.
Ensuite, la disposition des connexions entre les nœuds est effectuée. C'est-à-dire que des liens de sorties aux entrées et d'entrées aux sorties sont générés.
Et ce n'est qu'après tout cela que le cycle d'exécution du programme principal est lancé.
J'ai écrit longtemps, mais tout le processus - du «chargement» du circuit de la mémoire FLASH au début de la boucle principale - prend une fraction de seconde pour un circuit de 60 à 80 nœuds.
Comment fonctionne la boucle principale? Très simple. Tout d'abord, il attend que l'
événement se
produise dans n'importe quel nœud, puis il traite cet événement. Et donc sans fin. Eh bien, ou jusqu'à ce qu'ils téléchargent un nouveau schéma sur ShIoTiny.
Déjà plusieurs fois, j'ai mentionné des choses comme les
événements , les
nœuds et les
connexions . Mais qu'est-ce que c'est d'un point de vue logiciel? Nous en parlerons aujourd'hui.
Nœuds, connexions et événements
Il suffit de regarder les exemples de programmes de circuits pour
ShIoTiny pour comprendre qu'un circuit se compose de seulement deux entités - les nœuds (ou éléments) et les relations entre eux.
Un nœud , un
nœud ou un
élément de circuit est une représentation virtuelle d'une
action sur les données. Cela peut être une opération arithmétique, une opération logique ou toute autre opération qui nous arrive. L'essentiel est que le nœud ait une entrée et une sortie.
Une entrée est l'endroit où le nœud reçoit des données. Les images d'entrée sont des points qui sont toujours sur le côté gauche du nœud.
La sortie est l'endroit d'où le résultat de l'opération de nœud est extrait. Les images de sortie sont des points qui sont toujours sur le côté droit du nœud.
Certains nœuds n'ont pas d'entrées. Ces nœuds génèrent un résultat en eux-mêmes. Par exemple, un nœud constant ou un nœud capteur: ils n'ont pas besoin de données provenant d'autres nœuds pour rendre compte du résultat.
D'autres nœuds, en revanche, n'ont pas de sortie. Ce sont des nœuds qui affichent, par exemple, des actionneurs (relais ou autres dispositifs similaires). Ils acceptent les données, mais ne génèrent pas le résultat des calculs disponibles pour les autres nœuds.
En outre, il existe également un nœud de commentaire unique. Il ne fait rien, n'a ni entrées ni sorties. Son but est d'être une explication dans le diagramme.
Qu'est-ce qu'un «
événement »?
Un événement est l'occurrence de nouvelles données dans un nœud. Par exemple, les événements incluent: la modification de l'état d'entrée (nœud d'
entrée ), la réception de données d'un autre périphérique (nœuds
MQTT et
UDP ), l'expiration d'une période de temps spécifiée (nœuds de
temporisation et de
retard ), etc.
À quoi servent les événements? Oui, afin de déterminer dans quel nœud les nouvelles données sont apparues et les états de quels nœuds doivent être modifiés lors de la réception de nouvelles données. L'événement, pour ainsi dire, «passe» le long de la chaîne de nœuds jusqu'à ce qu'il ait contourné tous les nœuds dont l'état doit être vérifié et modifié.
Tous les nœuds peuvent être divisés en deux catégories.
Les nœuds pouvant générer des événements sont appelés «
nœuds actifs ».
Les nœuds qui ne peuvent pas générer d'événements sont appelés «
nœuds passifs ».
Lorsqu'un nœud génère un événement (c'est-à-dire que de nouvelles données apparaissent sur sa sortie), alors en général l'état de la chaîne entière de nœuds connectés à la sortie du nœud générateur d'événement change.
Pour être clair, considérons l'exemple de la figure.

Les nœuds actifs ici sont Input1, Input2 et Input3. Les nœuds restants sont passifs. Considérez ce qui se passe lorsque telle ou telle entrée se ferme. Pour plus de commodité, les résultats sont tabulés.

Comme vous pouvez le voir, lorsqu'un événement se produit, une chaîne est créée du nœud source de l'événement au nœud final. L'état de ces nœuds qui ne tombent pas dans la chaîne ne change pas.
Une question légitime se pose, mais que se passera-t-il si deux ou même plusieurs événements se produisent simultanément?
En tant qu’amant du travail de Gleb Anfilov, je suis tenté d’envoyer un curieux questionneur à son livre «Flight from Surprise». Il s'agit d'une telle "théorie de la relativité pour les plus petits", dans laquelle on sait bien ce qu'est "simultanément" et comment vivre avec.
Mais purement presque tout est beaucoup plus simple: lorsque deux ou même plusieurs événements se produisent, toutes les chaînes de chaque source d'événements sont successivement construites et traitées à tour de rôle et pas de miracles.
La prochaine question tout à fait légitime d'un lecteur curieux est de savoir ce qui se passera si les nœuds sont connectés en anneau? Ou, comme il est de coutume de dire parmi ces sages de la vôtre, d'introduire des commentaires. Autrement dit, connectez la sortie de l'un des nœuds à l'entrée du nœud précédent de sorte que l'état de sortie de ce nœud affecte l'état de son entrée.
L' éditeur
ElDraw ne vous permettra pas de connecter directement la sortie du nœud à sa propre entrée. Mais indirectement, comme dans la figure ci-dessous - cela peut être fait.
Alors, que sera-t-il dans ce cas? La réponse sera très «définitive»: selon les nœuds. Prenons l'exemple de la figure.

Lorsque les contacts de l'entrée Input1 sont ouverts à l'entrée supérieure du nœud A - 0. À la sortie du nœud A, également 0. À la sortie du nœud B - 1. Et enfin, à l'entrée inférieure du nœud A - 1. Tout est clair. Et pour qui ce n'est pas clair - regardez ci-dessous pour une description du fonctionnement des nœuds "ET" et "NON".
Fermez maintenant les contacts de l'entrée Input1, c'est-à-dire que nous en fournirons un à l'entrée supérieure du nœud A. Ceux qui connaissent l'électronique savent qu'en fait, nous obtenons un circuit de générateur logique classique. Et en théorie, un tel schéma devrait produire à l'infini en sortie des éléments A et B les séquences 1-0-1-0-1-0 ... et 0-1-0-1-0-1-1 .... Après tout, un événement devrait constamment changer l'état des nœuds A et B, en tournant dans un cercle 2-3-2-3- ...!
Mais cela ne se produit pas réellement. Le circuit tombera dans un état aléatoire - ou le relais restera activé ou désactivé, ou il peut sonner légèrement en marche et en arrêt plusieurs fois de suite. Tout dépend de la météo au pôle sud de Mars. Et c'est pourquoi cela se produit.
Un événement du nœud Input1 modifie plusieurs fois l'état du nœud A, puis du nœud B, et ainsi de suite dans un cercle. Le programme détermine le "bouclage" de l'événement et met fin de force à ce carnaval. Après cela, les changements d'état des nœuds A et B sont bloqués jusqu'à ce qu'un nouvel événement se produise. Le moment où le programme décide - "arrête de tourner en cercle!" - dans le cas général, cela dépend de nombreux facteurs et peut être considéré comme aléatoire.
Soyez prudent lorsque vous connectez des nœuds dans un anneau - les effets ne seront pas toujours évidents! Eh bien, imaginez quoi et pourquoi vous faites!
Mais est-il possible de construire un générateur sur les nœuds qui nous sont accessibles? Oui tu peux! Mais cela nécessite un nœud qui sait lui-même générer des événements. Et il y a un tel nœud - c'est une «ligne à retard». Voyons comment fonctionne le générateur avec une période de 6 secondes dans la figure ci-dessous.

Un élément clé du générateur est le nœud A, la ligne à retard. Si vous changez l'état d'entrée de la ligne à retard de 0 à 1, alors 1 à la sortie n'apparaît pas immédiatement, mais seulement après un temps spécifié. Dans notre cas, c'est 3 secondes. De même, si vous changez l'état d'entrée de la ligne à retard de 1 à 0, alors 0 apparaîtra à la sortie après les mêmes 3 secondes. Le temps de retard est réglé en dixièmes de seconde. Autrement dit, la valeur est 30 et signifie - 3 secondes.
Une caractéristique de la ligne à retard est qu'elle génère un événement après que le temps de retard s'est écoulé.
Supposons qu'au départ, la sortie de la ligne à retard était 0. Après avoir traversé le nœud B, l'onduleur, ce 0 devient 1 et va à l'entrée de la ligne à retard. Rien ne se passe tout de suite. À la sortie de la ligne à retard, telle qu'elle était, 0 restera, mais le compte à rebours du délai est alors activé. Cela prend 3 secondes. Et puis la ligne à retard génère un événement. En sortie, elle en a 1. Cette unité, après avoir traversé le noeud B, l'onduleur, se transforme en 0 et passe à l'entrée de la ligne à retard. Encore 3 secondes passent ... et le processus se répète. Autrement dit, toutes les 3 secondes, l'état de sortie de la ligne à retard passe de 0 à 1, puis de 1 à 0. Le relais clique. Le générateur fonctionne. La période d'impulsion est de 6 secondes (3 secondes à la sortie de zéro et 3 secondes - une).
Mais, dans les circuits réels, vous n'avez généralement pas besoin d'utiliser cet exemple. Il existe des nœuds de temporisation spéciaux qui, parfaitement et sans aide extérieure, génèrent une séquence d'impulsions avec une période donnée. La durée de «zéro» et des «unités» dans ces impulsions est égale à la moitié de la période.
Pour définir des actions périodiques, utilisez des nœuds de temporisation.
Je note que de tels signaux numériques, où la durée du «zéro» et des «unités» sont égales, sont appelés «méandre».
J'espère avoir clarifié un peu la question sur la façon dont les événements sont répartis entre les nœuds et que ne devrait-on pas faire?
Conclusion et références
L'article s'est avéré court, mais cet article est la réponse aux questions posées sur les nœuds et les événements.
Au fur et à mesure que le firmware évolue et que de nouveaux exemples apparaissent, j'écrirai sur la façon de programmer de petits articles
ShIoTiny , tant que cela sera intéressant pour les gens.
Comme précédemment, le schéma, le firmware, les exemples, la description des nœuds et tout le
reste sont ici .
Questions, souhaits, critiques - c'est ici:
shiotiny@yandex.ru