
Les points principaux ou de quoi parle cet article
Le sujet de l'article - la programmation visuelle des PLC ShIoTiny pour la maison intelligente, décrite ici : .
En résumé sont abordés des concepts tels que nœuds, liens, événements, ainsi que les spécificités de chargement et d'exécution d'un programme visuel sur ESP8266, qui est à la base du PLC ShIoTiny.
Introduction ou quelques questions organisationnelles
Dans l'article précédent concernant mon développement, j'ai donné un aperçu des capacités du contrôleur ShIoTiny.
Étonnamment, le public a manifesté un grand intérêt et m'a posé beaucoup de questions. Certains amis ont même proposé d'acheter le contrôleur sur le champ. Non, je ne suis pas contre l'idée de gagner un peu d'argent, mais ma conscience ne me permet pas de vendre un produit encore très rudimentaire sur le plan logiciel.
C'est pourquoi j'ai publié sur GitHub des binaires du firmware et le schéma de l'appareil : .
Maintenant, chacun peut flasher l'ESP-07 et s'amuser avec le firmware. Si quelqu'un désire vraiment une carte comme sur la photo, j'en ai quelques-unes. Écrivez-moi par email shiotiny@yandex.ru. Mais, comme le disait l'inoubliable Ogurtsov : « Je ne suis responsable de rien ! ».
Bien, passons aux choses sérieuses : qu'est-ce que «nœud» (node) et «événement« ? Comment s'exécute le programme ?
Comme d'habitude, commençons par le commencement : le chargement du programme.
Comment le programme est chargé
Commençons par ce qui se passe lorsque nous appuyons sur le bouton Télécharger dans l'éditeur ElDraw et notre schéma-programme, constitué de beaux carrés, est envoyé à l'appareil.
Tout d'abord, une description textuelle de notre schéma est construite sur la base de ce que nous avons dessiné.
Deuxièmement, il est vérifié si toutes les entrées des nœuds sont connectées aux sorties. Il ne doit pas y avoir d'entrées « pendantes ». Si une telle entrée est détectée, le schéma ne se chargera pas dans ShIoTiny et l'éditeur donnera un avertissement approprié.
Si tout se passe bien, l'éditeur envoie à ShIoTiny la description textuelle du schéma un nœud à la fois. Bien sûr, le schéma existant de ShIoTiny est d'abord supprimé. La description textuelle obtenue est enregistrée dans la mémoire FLASH.
Au fait, si vous souhaitez supprimer le schéma de l'appareil, il vous suffit de charger un schéma vide (ne contenant aucun élément-nœud).
Une fois que tout le schéma-programme est chargé dans le PLC ShIoTiny, il commence à « s'exécuter ». Que cela signifie-t-il ?
Notons que les processus de chargement du schéma depuis la mémoire FLASH lors de la mise sous tension et lors de la réception du schéma depuis l'éditeur sont identiques.
La première étape consiste à créer des objets-nœuds sur la base de leur description.
Ensuite, des liens sont établis entre les nœuds. C'est-à-dire que les sorties sont liées aux entrées et les entrées aux sorties.
Et ce n'est qu'après tout cela que le cycle principal d'exécution du programme est lancé.
J'ai écrit longtemps, mais tout le processus - de "l'importation" du schéma depuis la mémoire FLASH à l'activation du cycle principal - ne prend que quelques fractions de seconde pour un schéma de 60 à 80 nœuds.
Comment fonctionne le cycle principal ? Très simplement. D'abord, il attend qu'un événement se produise événements dans un nœud quelconque, puis traite cet événement. Et cela sans fin. Ou jusqu'à ce qu'un nouveau schéma soit chargé dans ShIoTiny.
J'ai déjà mentionné plusieurs fois des choses comme événements, nœuds et liens. Mais qu'est-ce que cela signifie du point de vue logiciel ? C'est ce dont nous allons parler aujourd'hui.
Nœuds, liens et événements
Il suffit de regarder des exemples de schémas-programmes pour ShIoTiny, pour comprendre qu'un schéma ne se compose que de deux entités : des nœuds (ou éléments) et des liens entre eux.
Noeud, nœud ou élément de schéma — c'est une représentation virtuelle d'un des actions sur les données. Cela peut être une opération arithmétique, une opération logique ou toute autre opération qui nous vient à l'esprit. L'essentiel est qu'un nœud a une entrée et une sortie.
Connexion — c'est l'endroit où le nœud reçoit des données. Les représentations des entrées sont des points qui se trouvent toujours sur le côté gauche du nœud.
Sortie — c'est l'endroit d'où le résultat du travail du nœud est extrait. Les représentations des sorties sont des points qui se trouvent 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 à l'intérieur d'eux-mêmes. Par exemple un nœud-constante ou un nœud-capteur : ils n'ont pas besoin de données d'autres nœuds pour communiquer un résultat.
À l'inverse, d'autres nœuds n'ont pas de sorties. Ce sont des nœuds qui affichent, par exemple, des dispositifs d'exécution (relais ou autres similaires). Ils reçoivent des données, mais ne génèrent pas de résultats de calculs accessibles à d'autres nœuds.
De plus, il y a un nœud-commentaire unique. Il ne fait rien, n'a ni entrées ni sorties. Sa fonction est d'être une explication dans le schéma.
Qu'est-ce que "événement»? Événement — c'est l'apparition de nouvelles données dans un nœud quelconque. Par exemple, les événements incluent : un changement d'état d'une entrée (nœud Input), réception des données d'un autre appareil (nœuds MQTT et UDP), expiration d'une période spécifiée (nœuds Timer et Délai) et ainsi de suite.
À quoi servent les événements ? Tout simplement à déterminer dans quel nœud de nouvelles données ont été générées et quels nœuds doivent changer d'état en raison de la réception de nouvelles données. Un événement « passe » le long de la chaîne de nœuds jusqu'à ce qu'il ait vérifié et modifié tous les nœuds concernés.
Tous les nœuds peuvent être divisés en deux catégories.
Les nœuds capables de générer des événements seront appelés «nœuds actifs».
Les nœuds qui ne peuvent pas générer d'événements seront appelés «nœuds passifs».
Lorsqu'un nœud génère un événement (c'est-à-dire qu'il produit de nouvelles données), l'état de toute la chaîne de nœuds connectés à la sortie du nœud générateur d'événements change généralement.
Pour illustrer cela, considérons un exemple sur le diagramme.

Les nœuds actifs ici sont Input1, Input2 et Input3. Les autres nœuds sont passifs. Voyons ce qui se passe lorsque l'un ou l'autre des entrées se ferme. Les résultats sont résumés dans un tableau pour plus de clarté.

Comme nous le voyons, lorsqu'un événement se produit, une chaîne est construite depuis le nœud source de l'événement jusqu'au nœud terminal. L'état des nœuds qui ne font pas partie de la chaîne ne change pas.
Une question légitime se pose alors : que se passe-t-il lors de l'apparition de deux événements ou même plusieurs en même temps ?
En tant qu'amateur des œuvres de Gleb Anfilov, j'ai envie d'envoyer ce curieux questionneur vers son livre « Évasion des merveilles ». C'est une sorte de « théorie de la relativité pour les plus jeunes », qui explique bien ce que signifie « en même temps » et comment vivre avec.
Mais sur le plan pratique, tout est beaucoup plus simple : lors de l'apparition de deux événements ou même plusieurs, toutes les chaînes sont construites et traitées successivement depuis chaque source d'événement, dans l'ordre, sans aucune merveille.
Une autre question tout à fait légitime que pourrait se poser un lecteur curieux est : que se passera-t-il si les nœuds sont connectés en anneau ? Ou, comme aiment à le dire certains d'entre vous, introduire une rétroaction. Cela signifie connecter la sortie d'un des nœuds à l'entrée du nœud précédent de manière à ce que l'état de la sortie de ce nœud affecte celui de son entrée. Le rédacteur ne vous permettra pas de connecter directement la sortie d'un nœud à son entrée. ElDraw. Mais indirectement, comme sur l'illustration ci-dessous, cela peut être réalisé.
Alors, que se passera-t-il dans ce cas ? La réponse sera très « précise » : cela dépend des nœuds. Examinons l'exemple sur l'illustration.

Lorsque les contacts d'entrée Input1 sont ouverts sur 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. C'est clair. Pour ceux qui ne comprennent pas — consultez ci-dessous la description du fonctionnement des nœuds « ET » et « NON ».
Maintenant, fermons les contacts d'entrée Input1, c'est-à-dire que nous allons appliquer 1 à l'entrée supérieure du nœud A. Ceux qui connaissent l'électronique savent qu'en fait nous obtiendrons un schéma classique de générateur à éléments logiques. Et, en théorie, ce schéma devrait produire indéfiniment en sortie des nœuds A et B des séquences 1-0-1-0-1-0…. et 0-1-0-1-0-1-…. Car l'événement doit constamment changer l'état des nœuds A et B, tournant en boucle 2-3-2-3-… !
Mais en réalité, cela ne se produit pas. Le schéma tombera dans un état aléatoire — soit le relais restera activé soit désactivé, ou il peut émettre un léger bourdonnement en s'activant et se désactivant plusieurs fois de suite. Tout dépend de la météo sur le pôle sud de Mars. Et voilà pourquoi cela se produit.
L'événement avec le nœud Input1 modifie l'état du nœud A, puis du nœud B, et ainsi de suite en boucle plusieurs fois. Le programme détecte la « boucle » de l'événement et arrête de force ce carnaval. Après cela, la modification des états des nœuds A et B est bloquée jusqu'à l'apparition d'un nouvel événement. Le moment où le programme décidera — « ça suffit de tourner en rond ! » — dépend en général de nombreux facteurs et peut être considéré comme aléatoire.
Soyez prudent en connectant des nœuds en boucle — les effets ne seront pas toujours évidents ! Ayez une bonne compréhension de ce que vous faites et pourquoi !
Peut-on néanmoins construire un générateur avec les nœuds à notre disposition ? Oui, c'est possible ! Mais pour cela, un nœud capable de générer des événements est nécessaire. Et ce nœud existe — c'est la « ligne de retard ». Voyons comment fonctionne un générateur avec une période de 6 secondes sur l'illustration ci-dessous.

L'élément clé du générateur est le noeud A — la ligne de retard. Si l'on change l'état d'entrée de la ligne de retard de 0 à 1, alors 1 n'apparaîtra pas immédiatement à la sortie, mais seulement après un certain temps. Dans notre cas, il s'agit de 3 secondes. De la même manière, si l'on change l'état d'entrée de la ligne de retard de 1 à 0, alors 0 apparaîtra à la sortie après les mêmes 3 secondes. Le temps de retard est exprimé en dixièmes de seconde. Ainsi, une valeur de 30 signifie 3 secondes.
La caractéristique de la ligne de retard est qu'elle génère un événement après l'expiration du temps de retard.
Supposons qu'initialement la sortie de la ligne de retard était 0. Après avoir passé par le noeud B — l'inverseur — ce 0 se transforme en 1 et arrive à l'entrée de la ligne de retard. Au début, rien ne se passe. À la sortie de la ligne de retard, il reste 0, mais le chronomètre du temps de retard commence à fonctionner. Trois secondes passent. Et soudain, la ligne de retard génère un événement. À sa sortie, apparaît 1. Ce 1, après avoir traversé le noeud B — l'inverseur — se transforme en 0 et arrive à l'entrée de la ligne de retard. Encore trois secondes passent… et le processus se répète. Cela signifie que toutes les 3 secondes, l'état de la sortie de la ligne de retard change de 0 à 1 puis de 1 à 0. Le relais clique. Le générateur fonctionne. La période des impulsions est de 6 secondes (3 secondes à 0 et 3 secondes à 1).
Cependant, dans des schémas réels, il n'est généralement pas nécessaire d'utiliser cet exemple. Il existe des noeuds-minuteurs spéciaux qui génèrent de manière autonome et remarquable une séquence d'impulsions avec une période donnée. La durée du « zéro » et de l'« un » dans ces impulsions est égale à la moitié de la période.
Pour définir des actions périodiques, utilisez des noeuds-minuteurs.
Je note que de tels signaux numériques, où la durée du « zéro » et de l'« un » est égale, sont appelés « méandre ».
J'espère avoir un peu clarifié la question sur la façon dont la propagation des événements entre les noeuds se produit et ce qu'il ne faut pas faire ?
Conclusion et liens
L'article est court, mais c'est un article-réponse aux questions soulevées sur les noeuds et les événements.
Au fur et à mesure que les firmwares et les nouveaux exemples se développent, je vais écrire sur la façon de programmer ShIoTiny de petits articles tant que cela intéressera les gens.
Comme auparavant, le schéma, le firmware, les exemples, la description des noeuds et tout le reste ici .
Questions, souhaits, critiques — c'est par ici : shiotiny@yandex.ru
Source : habr.com
