ShIoTiny: nodos, conexiones y eventos, o características del dibujo de programas.

ShIoTiny: nodos, conexiones y eventos, o características del dibujo de programas.

Puntos principales o de qué trata este artículo

El tema del artículo es la programación visual de PLC ShIoTiny para el hogar inteligente, descrito aquí: ShIoTiny: automatización pequeña, Internet de las cosas o 'seis meses antes de las vacaciones'.

Muy brevemente se abordan conceptos como nodos, conexiones, eventos, así como las características de carga y ejecución de un programa visual en ESP8266, que es la base del PLC ShIoTiny.

Introducción o algunas preguntas organizativas

En el artículo anterior sobre mi desarrollo, hice una breve revisión de las capacidades del controlador ShIoTiny.

Por extraño que parezca, el público mostró un interés bastante fuerte y me hizo muchas preguntas. Algunos incluso propusieron comprarme el controlador de inmediato. No, no estoy en contra de ganar un poco de dinero, pero mi conciencia no me permite vender algo que aún está muy crudo en términos de programación.

Por lo tanto, he publicado en GitHub los binarios de firmware y el esquema del dispositivo: firmware + instrucciones breves + esquema + ejemplos.

Ahora cualquier persona puede flashear el ESP-07 y jugar con el firmware. Si a alguien realmente le interesa una placa como la de la foto, tengo unas cuantas. Escriban a mi correo shiotiny@yandex.ru. Pero, como decía el inolvidable Ogurtsov: '¡No me hago responsable de nada!'.

Así que, vayamos al grano: ¿qué es un 'nodo' y un 'evento'? ¿Cómo se ejecuta el programa?

Como de costumbre, comenzaremos en orden: desde la carga del programa.

Cómo se carga el programa

Empecemos por lo que sucede cuando presionamos el botón Upload en el editor ElDraw y nuestro esquema-programa, compuesto de hermosos cuadrados, se envía al dispositivo.

En primer lugar, se construye una descripción en texto de nuestro esquema dibujado.
En segundo lugar, se verifica si todas las entradas de los nodos están conectadas a las salidas. No debe haber entradas 'flotantes'. Si se encuentra tal entrada, el esquema no se cargará en ShIoTiny y el editor mostrará una advertencia correspondiente.

Si todo ha salido bien, el editor envía a ShIoTiny la descripción en texto del esquema nodo por nodo. Por supuesto, el esquema existente en ShIoTiny se elimina primero. La descripción en texto obtenida se guarda en la memoria FLASH.

Por cierto, si deseas eliminar el esquema del dispositivo, simplemente carga en él un esquema vacío (que no contenga ningún elemento-nodo).

Una vez que todo el esquema del programa se ha cargado en el PLC ShIoTiny, comienza a «ejecutarse». ¿Qué significa esto?

Cabe señalar que los procesos de carga del esquema desde la memoria FLASH al encender y al recibir el esquema del editor son idénticos.

Primero se crea objetos-nodos basándose en su descripción.
Luego se establece la conexión entre los nodos. Es decir, se generan enlaces de salidas a entradas y de entradas a salidas.

Y solo después de todo esto se inicia el ciclo principal de ejecución del programa.

Escribí mucho, pero todo el proceso —desde la «carga» del esquema desde la memoria FLASH hasta el lanzamiento del ciclo principal— toma fracciones de segundo para un esquema de 60-80 nodos.

¿Cómo funciona el ciclo principal? Muy simple. Primero espera la aparición de un evento en algún nodo, luego procesa este evento. Y así sin fin. Bueno, o hasta que se cargue un nuevo esquema en ShIoTiny. eventos Ya he mencionado varias veces cosas como

. Pero, ¿qué significan desde el punto de vista del software? De esto hablaremos hoy. eventos, nodos y conexionesNodos, conexiones y eventos

Basta con mirar ejemplos de esquemas-programas para

, para entender que el esquema consta de solo dos entidades: nodos (o elementos) y conexiones entre ellos. ShIoTinyNodo

nodo, elemento del esquema o — es una representación virtual de alguna acción sobre los datos. Esto puede ser una operación aritmética, una operación lógica o cualquier otra operación que se nos ocurra. Lo principal es que el nodo tiene una entrada y una salida. Entrada

Entrada — es el lugar donde el nodo acepta datos. Las imágenes de las entradas son puntos que siempre están a la izquierda del nodo.

Salida — es el lugar de donde se extrae el resultado del trabajo del nodo. Las imágenes de las salidas son puntos que siempre están a la derecha del nodo.

Algunos nodos no tienen entradas. Tales nodos generan el resultado dentro de sí mismos. Por ejemplo, un nodo-constante o un nodo-sensor: no necesitan datos de otros nodos para informar un resultado.

Otros nodos, por el contrario, no tienen salidas. Son nodos que representan, por ejemplo, dispositivos ejecutores (reles u otros similares). Aceptan datos, pero no generan un resultado de cálculo disponible para otros nodos.

Además, hay un nodo-comentario único. No hace nada, no tiene entradas ni salidas. Su propósito es servir como explicación en el esquema.

¿Qué es «evento»? Evento — es la aparición de nuevos datos en algún nodo. Por ejemplo, los eventos incluyen: cambio de estado de entrada (nodo Entrada), recepción de datos de otro dispositivo (nodos MQTT y UDP), expiración de un intervalo de tiempo específico (nodos Timer y Retraso) y así sucesivamente.

¿Para qué sirven los eventos? Pues para determinar en qué nodo han surgido nuevos datos y qué estados de los nodos necesitan ser cambiados debido a la recepción de nuevos datos. Un evento, de alguna manera, "pasará" a través de la cadena de nodos, hasta que se revise y se cambie el estado de todos los nodos que necesitan ser verificados.

Todos los nodos pueden dividirse en dos categorías.
A los nodos que pueden generar eventos los llamaremos "nodos activos».
A los nodos que no pueden generar eventos los llamaremos "nodos pasivos».

Cuando un nodo genera un evento (es decir, cuando aparecen nuevos datos en su salida), cambia en general el estado de toda la cadena de nodos conectados a la salida del nodo generador del evento.

Para que sea claro, consideremos el ejemplo en la figura.

ShIoTiny: nodos, conexiones y eventos, o características del dibujo de programas.

Los nodos activos aquí son — Input1, Input2 y Input3. Los demás nodos son pasivos. Veamos qué sucede cuando se cierra una entrada u otra. Los resultados se han resumido en una tabla para mayor comodidad.

ShIoTiny: nodos, conexiones y eventos, o características del dibujo de programas.

Como podemos ver, al ocurrir un evento, se construye una cadena desde el nodo fuente del evento hasta el nodo final. El estado de aquellos nodos que no forman parte de la cadena no cambia.

Surge la pregunta legítima, ¿qué sucederá cuando ocurran dos o más eventos simultáneamente?

Como amante de la creatividad de Gleb Anfilov, me arrastra a remitir al curioso preguntador a su libro "Huida de las sorpresas". Es como una "teoría de la relatividad para los más pequeños", en la que se explica bien qué significa "simultáneamente" y cómo vivir con ello.

Pero en términos prácticos, todo es mucho más simple: al ocurrir dos o varios eventos, se construyen y procesan secuencialmente todas las cadenas de cada fuente de evento por turno, y no hay nada extraordinario.

La siguiente pregunta legítima de un lector curioso es: ¿qué pasará si conectamos los nodos en un anillo? O, como se suele decir entre los listillos, introducir retroalimentación. Es decir, conectar la salida de uno de los nodos a la entrada del nodo anterior de modo que el estado de salida de este nodo influya en el estado de su propia entrada. El editor no te permitirá conectar directamente la salida del nodo con su propia entrada. ElDraw. Pero de forma indirecta, como en la ilustración a continuación, esto es posible.

Entonces, ¿qué sucederá en este caso? La respuesta es bastante "definida": depende de qué nodos estemos hablando. Veamos un ejemplo en la imagen.

ShIoTiny: nodos, conexiones y eventos, o características del dibujo de programas.

Cuando los contactos de entrada Input1 están abiertos en la entrada superior del nodo A — 0. En la salida del nodo A, también 0. En la salida del nodo B — 1. Y, finalmente, en la entrada inferior del nodo A — 1. Todo claro. Aquellos a quienes no les queda claro, pueden ver a continuación la descripción de cómo funcionan los nodos "Y" y "NO".

Ahora cerraremos los contactos de entrada Input1, es decir, aplicaremos un uno a la entrada superior del nodo A. Aquellos que están familiarizados con la electrónica saben que, de hecho, obtendremos un esquema clásico de generador de elementos lógicos. Y en teoría, este esquema debería producir de manera infinita en las salidas de los elementos A y B las secuencias 1-0-1-0-1-0… y 0-1-0-1-0-1-…. El evento debería cambiar constantemente el estado de los nodos A y B, corriendo en círculos 2-3-2-3-…!

Pero en realidad esto no ocurre. El esquema caerá en un estado aleatorio — o el relé permanecerá encendido o apagado, o puede que emita un ligero zumbido encendiéndose y apagándose varias veces seguidas. Todo depende del clima en el polo sur de Marte. Y aquí está la razón de esto.

El evento en el nodo Input1 cambia el estado del nodo A, luego del nodo B y así sucesivamente en círculo varias veces. El programa detecta la "retroalimentación" del evento y fuerza a que este carnaval se detenga. Después de esto, el cambio en los estados de los nodos A y B se bloquea hasta que ocurra un nuevo evento. El momento en el que el programa decide que "¡ya es suficiente de girar en círculos!" depende de muchos factores y se puede considerar aleatorio.

¡Ten cuidado al conectar nodos en anillo; los efectos no siempre serán evidentes! Ten una clara comprensión de lo que haces y por qué lo haces.

¿Es posible construir un generador con los nodos que tenemos disponibles? ¡Sí, es posible! Pero para ello se necesita un nodo que pueda generar eventos por sí mismo. Y existe tal nodo: es la "línea de retraso". Veamos cómo funciona el generador con un período de 6 segundos en la imagen de abajo.

ShIoTiny: nodos, conexiones y eventos, o características del dibujo de programas.

El elemento clave del generador es el nodo A: la línea de retraso. Si se cambia el estado de la entrada de la línea de retraso de 0 a 1, el 1 en la salida no aparecerá de inmediato, sino solo después de un tiempo determinado. En nuestro caso, son 3 segundos. De la misma manera, si se cambia el estado de la entrada de la línea de retraso de 1 a 0, el 0 en la salida aparecerá después del mismo tiempo de 3 segundos. El tiempo de retraso se establece en décimas de segundo. Es decir, el valor 30 significa 3 segundos.

La característica de la línea de retraso es que genera un evento después de que transcurre el tiempo de retraso.

Supongamos que inicialmente en la salida de la línea de retraso había 0. Después de pasar por el nodo B: el inversor, este 0 se convierte en 1 y va a la entrada de la línea de retraso. No ocurre nada de inmediato. En la salida de la línea de retraso permanece 0, pero el conteo del tiempo de retraso se inicia. Pasan 3 segundos. Y de inmediato la línea de retraso genera un evento. En su salida aparece 1. Este uno, después de pasar por el nodo B: el inversor, se convierte en 0 y va a la entrada de la línea de retraso. Pasan otros 3 segundos... y el proceso se repite. Es decir, cada 3 segundos el estado de la salida de la línea de retraso cambia de 0 a 1 y luego de 1 a 0. El relé hace clic. El generador funciona. El período de pulsos es de 6 segundos (3 segundos en salida cero y 3 segundos en uno).

Sin embargo, en circuitos reales, generalmente no es necesario usar este ejemplo. Existen nodos temporizadores especiales que generan de manera excelente y sin ayuda externa una secuencia de pulsos con un período dado. La duración del "cero" y del "uno" en estos pulsos es igual a la mitad del período.

Para establecer acciones periódicas, utiliza nodos temporizadores.

Cabe destacar que tales señales digitales, donde la duración del "cero" y del "uno" son iguales, se llaman "meandro".

Espero haber aclarado un poco la cuestión de cómo se propagan los eventos entre nodos y qué no se debe hacer.

Conclusión y referencias

El artículo resultó ser breve, pero es un artículo-respuesta a las preguntas surgidas sobre nodos y eventos.

A medida que evoluciona el firmware y aparecen nuevos ejemplos, escribiré sobre cómo programar ShIoTiny artículos breves, mientras sea interesante para las personas.

Como antes, el esquema, firmware, ejemplos, descripción de nodos y todo lo demás está aquí.

Preguntas, sugerencias, críticas — aquí: shiotiny@yandex.ru

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster