Objetivos y conocimientos previos #
Se va a realizar una comunicaicón Modbus TCP/IP entre un relé lógico LOGO de Siemens, que actuará como Cliente, y un microcontrolador Esp32, que será el Servidor de la comunicación. Antes de comenzar es importante destacar que esta comunicación usando LOGO como Cliente, solo es posible con las últimas versiones de LOGO, sin ser necesaria la 8.4.
En este sentido, cabe señalar que Siemens ha modificado la denominación de sus dispositivos, por lo que la siguiente referencia, pese a acabar en 0BA1, sí indica un LOGO 8.3:
En el vídeo Principios básicos de Modbus TCP/IP y app gráfica para configurar Esp32 se resume el protocolo Modbus junto con sus principales particularidades en los trabajos aquí tratados, si bien en este documento se resumen todos los conceptos previos necesarios para llevar a cabo la comunicación. Además, en el artículo https://didactronica.microlsb.es/docs/configuracion-de-esp32-como-servidor-modbus se detalla el funcionamiento de cada bloque de configuración Modbus TCP/IP del Esp32.
En este documento se propone trabajar con estados booleanos mediante “Coils” (bobinas) y analógicos mediante Holding Registers, en adelante “HR”.
Se recuerda que hay tres formas de referirse a un canal Modbus.
- Puedes dar la dirección del canal, que de forma estandarizada, para Holding Registers está en el 40001.
- Puedes hacer referencia al offset, es decir, cuántos valores le sumas a la primera dirección del HR. El offset 0 equivale a la dirección 40001, ya que 40001 + 0 = 40001. El offset 3 equivale a poner la dirección 40004, que es el resultado de sumar el offset (3) a la primera dirección (40001).
- Puedes hacer referencia a la posición que ocupa la dirección del HR. Por ejemplo, la 40001 sería la primera dirección normalizada para HR. Siguiendo con el otro ejemplo anterior, la 40003 sería la posición 3.
Creación del proyecto en LOGO Softconford #
En LOGO se puede trabajar desde la pestaña «Proyecto de Red» que nos obligará a programar en FUP, o desde el «Modo de diagrama», que nos permitirá programar en KOP, además, la configuración de la comunicación se puede realizar de forma conjunta en «Herramientas / Conexiones Ethernet» o de forma individualizada configurando cada nodo de comunicación de Entrada o salida de red.
Trabajo en KOP desde Modo de Diagrama #
En esta forma de trabajo, podemos crear la conexión en «Herramientas / Conexiones Ethernet»
Y ahí dentro, establecemos de forma conjunta las variables, los tipos de datos y las direcciones en las que intercambiar los datos:
Este método es el que se utiliza en el vídeo de comunicación con Esp32, por tanto, no se profundizará mas en este artículo.
Trabajo en FUP desde Proyecto de Red #
Para esta funcionalidad se ha de trabajar en el modo “Proyecto de red”, y por tanto, solo se podrá utilizar el lenguaje de “Diagrama de Funciones”. No se puede trabajar en KOP desde aquí, al menos en la versión 8.3. Veamos los pasos para configurar una comunicación Modbus en LOGO de Siemens en Soft Conford 8.3 en esta modalidad:
- Agrega un nuevo dispositivo en proyecto de red:
2. Dale la IP de tu LOGO, junto con demás datos de la red:
3. Haz clic derecho en el dispositivo creado y añade una conexión Modbus como cliente:
Tras esto, ya se podrán empezar a crear los canales de comunicación. Se hace mediante las entradas y salidas de red, como se irá mostrando mas adelante.
Cuando se realice en los ejemplos la configuración de la conexión, hay que tener en cuenta que el puerto tiene que ser el 502 y la dirección la 1..
Cabe la opción, como vemos en el vídeo inicial de hacerlo en KOP y configurar la comunicación completa desde «Herramientas / Conexiones Ethernet», o se puede configurar cada uno de las entradas o salidas de red por individual. Veamos los siguientes ejemplos realizando la configuración individual.
Envío de valor entero desde LOGO (cliente) a Esp32 (servidor) #
Para los primeros trabajos, se puede seleccionar una entrada analógica de red, cuyos valores se pueden simular fácilmente, y una salida analógica de red, que será la que configuremos en este caso, para enviar datos al servidor.
Los trabajos iniciales de testeo, podemos seleccionar un bloque de “Entrada analógica de red” y “Salida analógica de red”. Al primero le daremos el valor que queramos enviar en el segundo, que será donde configuremos la comunicación. Si introducimos varios elementos, debemos tener cuidado de no asignar la misma variable a las entradas analógicas de red, que, al ser de tipo WORD, irán de dos en dos, es decir: VW0, VW2, VW4, etc.:
En Modbus TCP/IP, LOGO utiliza la tercera opción explicada, es decir, trabaja con la posición del canal Modbus. Dado que los canales predefinidos comienzan en la dirección 40001, esta dirección equivale a la posición 1 de canal (es el primer canal del Holding Register (HR) ). Por tanto, para establecer la comunicación con el primer canal del HR, como ejemplo, configuraremos un 1 en la dirección de LOGO, que comunicará con un 0 en la dirección del Esp32.
En la entrada solo hay que seleccionar una variable tipo Word que esté libre, como en este caso la VW0. A continuación definimos la comunicación en la salida de red, indicando la IP del servidor (Esp32), puerto 502 y dirección 1 (estos dos datos muy importantes).
La librería implementada en el Esp32 trabaja con el offset, es decir, la opción 2 anteriormente explicada. Por tanto, para comunicar por el canal 1 (dirección 40001), habrá que configurar el offset 0.
Resultado que se obtendrá:
Lectura analógica de datos desde el cliente (LOGO) del servidor (Esp32) #
Se va a realizar el intercambio de datos en la dirección 40001 de HR, es decir, posición 1 (LOGO) y offset 0 (Esp32).
Ahora lo que se comunica con Modbus es la entrada analógica de red, y su valor se almacena en una variable analógica, que será la que se lea para conocer el valor recibido.
El bloque utilizado en microlsb para el Esp32 es el siguiente si lo que se quiere es enviar un dato ejemplo de valor 33:
El programa completo sería el siguiente:
Resultado que se obtendrá:
Ejercicios de aplicación #
Ejemplo 1:
El siguiente programa muestra la conexión a la red Wifi y el envío de un valor analógico en la dirección 40001 de un potenciómetro en AI2 (I8) que se leerá en el puerto serie del Esp32:
- Configuración del LOGO (que se detalla mas adelante):
Dónde la configuración de NAQ1 se ha conseguido de la siguiente forma, haciendo doble clic sobre él:
- Configuración del Esp32:
- Resultado:
Ejemplo 2: Envío de varios datos analógicos de LOGO a Esp32 en FUP
Aquí se envía desde LOGO el número 28 en la dirección Modbus 40001 y el número 73 en la dirección 40002.
Tras forzar los valores de VW0 y VW1 a 28 y 73:
En el Esp32 se pueden leer dichos valores:
Ejemplo 3: intercambio analógico bidireccional en FUP
Se van a enviar datos desde LOGO a Esp32 en la dirección 40002 y de Esp32 a LOGO en la 40003.
En LOGO se recibirá el dato 20 en AM1, y se recibirá el dato que se envíe desde LOGO en el puerto serie del Esp32.
Ejemplo 4: datos digitales y analógicos de forma bidireccional en KOP
sdf
- Se tiene el siguiente cableado:
- Se ha de realizar un programa para que se ejecuten las siguientes funciones:
- El Pulsador en el LOGO activa el Led en el Esp32.
- Pulsador en el Esp32 activa el piloto en el LOGO.
- La lectura del potenciómetro del LOGO se muestra por puerto serie.
- La lectura de temperatura del Esp32 se muestra en la pantalla del LOGO.
LA SOLUCIÓN DE ESTE EJERCICIO SE DETALLA EN EL VÍDEO DE EXPLICACIÓN.
Ejemplo avanzado con Modbus y MQTT
En este ejemplo se envía la temperatura leída por un sensor DHT22 conectado en el pin 26 el Esp32 a LOGO. Además, se envía el valor de la lectura de un potenciómetro conectado en AI2 de LOGO al Esp32. Tras esto, el Esp32 envía ese dato del potenciómetro por mqtt al servidor io.adafruit.com, quedando un registro online de la variación del potenciómetro. Es decir, mediante Modbus se conecta LOGO a un dispositivo que tiene salida a internet y saca uno de sus valores. El proceso podría ser al contrario, recibir órdenes desde internet y pasarlas por Modbus al LOGO.
Programación de LOGO:
Programación del Esp32 con un sensor de temperatura DHT22 en el pin 25:
- Resultado:
En Node Red, con la siguiente configuración:
Se recibe lo siguiente:
En LOGO Soft Conford, en AM, se recibe lo siguiente con el sensor de temperatura marcando 25 grados:
Si se desea hacer mas operaciones, lo mas aconsejable es delarar dos variables globales y almacenar en ellas las lecturas, y luego ya poner esas variables en los sitios en los que se necesiten. De esta forma se agiliza el programa, ya que no se le pide en un solo ciclo realizar varias lecturas de forma innecesaria. Como el sensor de temperatura va a dar valores con decimales, se puede almacenar su valor en la variable tipo float (coma flotante), con nombre «temperatura». El potenciómetro, que solo va a tener valores enteros, se puede almacenar en una variable tipo int.