ESP32 y PLC LOGO! Siemens Conexión vía Wifi

Buen día, estoy realizando un proyecto con ESP32 y PLC LOGO! Siemens Conexión vía Wifi
El ESP 32 esta conectado con un WLAN 1100 de Phoenix Contact
Con el ESP 32 quiero leer la distancia por medio de un laser VL53L0X
Quiero leer la información vía MODBUS TCP con el PLC LOGO! Siemens Conexión
Por el momento no me aparece ningún error en el ESP 32
Asi voy :

//----------------------------------Modbus

#if defined(ESP8266)
 #include <ESP8266WiFi.h>
#elif defined(ESP32)
 #include <WiFi.h>
#else
#error "Unsupported platform"
#endif
#include "ModbusTCP.h"
const int REG = 0;               // Modbus Hreg Offset
IPAddress remote(192, 168, 1, 25);  // Address of Modbus Slave device

ModbusTCP mb;  //ModbusTCP object

//----------------------------------Laser

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

//Wifi----------------------------------

#include <WiFi.h>

//------------------Servidor Web en puerto 80---------------------

WiFiServer server(80);

//---------------------Credenciales de WiFi-----------------------

const char* ssid     = "PhoenixContact E1";
const char* password = "";

//---------------------VARIABLES GLOBALES-------------------------
int contconexion = 0;

String header; // Variable para guardar el HTTP request

//------------------------CODIGO HTML------------------------------
String paginaInicio = "<!DOCTYPE html>"
"<html>"
"<head>"
"<meta charset='utf-8' />"
"<META HTTP-EQUIV='Refresh' CONTENT='2'>"
"<title> LASER ESTACION 1</title>"
"</head>"
"<body>"
"<center>"
"<h3>LASER ESTACION 1</h3>";

String paginaFin = "</center>"
"</body>"
"</html>";

//---------------------------SETUP--------------------------------
void setup() {
 
  Serial.begin(115200);
  Serial.println("");
  
 //----------------------------------Laser

 pinMode(12,INPUT_PULLUP);
  digitalWrite(12,HIGH);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);
  sensor.startContinuous();

//----------------------------------Conexión WIFI para usar con ip fija
      IPAddress ip(192,168,1,28); 
      IPAddress gateway(0,0,0,0); 
      IPAddress subnet(255,255,255,0); 
      WiFi.config(ip, gateway, subnet);

  WiFi.begin(ssid, password);
  //Cuenta hasta 50 si no se puede conectar lo cancela
  while (WiFi.status() != WL_CONNECTED and contconexion <50) { 
    ++contconexion;
    delay(500);
    Serial.print(".");
  }
  if (contconexion <50) {

      Serial.println("");
      Serial.println("WiFi conectado:");
      Serial.println(ssid);
      Serial.println(WiFi.localIP());
      server.begin(); // iniciamos el servidor
      
  }
  else { 
      Serial.println("");
      Serial.println("Error de conexion");
  }
  mb.client();
}

//----------------------------LOOP----------------------------------

void loop(){


//----------------------------------Laser

 int distance =sensor.readRangeContinuousMillimeters();
  //int distance =sensor.startContinuous(100);
  
 //distance = distance;
  Serial.println("");
  Serial.print("Distancia: ");
  Serial.print(distance);
  Serial.print("mm");
  Serial.println();
  delay(1000); 
    
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

//----------------------------------Wifi
  WiFiClient client = server.available();   // Escucha a los clientes entrantes

  if (client) {                             // Si se conecta un nuevo cliente
    Serial.println("New Client.");          // 
    String currentLine = "";                //
    while (client.connected()) {            // loop mientras el cliente está conectado
      if (client.available()) {             // si hay bytes para leer desde el cliente
        char c = client.read();             // lee un byte
        Serial.write(c);                    // imprime ese byte en el monitor serial
        header += c;
        if (c == '\n') {                    // si el byte es un caracter de salto de linea
          // si la nueva linea está en blanco significa que es el fin del 
          // HTTP request del cliente, entonces respondemos:
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
                     
            // Muestra la página web
            client.println(paginaInicio + distance + paginaFin);
            
            // la respuesta HTTP temina con una linea en blanco
            client.println();
            break;
          } else { // si tenemos una nueva linea limpiamos currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // si C es distinto al caracter de retorno de carro
          currentLine += c;      // lo agrega al final de currentLine
        }
      }
    }
    // Limpiamos la variable header
    header = "";
    // Cerramos la conexión
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }

//----------------------------------Modbus

 if (mb.isConnected(remote)) {   // Check if connection to Modbus Slave is established
    uint16_t trans = mb.writeCoil(remote, REG, true);  // Initiate Read Hreg from Modbus Server
    while(mb.isTransaction(trans)) {  // Check if transaction is active
      mb.task();
      delay(10);
    }
  } else {
    mb.connect(remote);           // Try to connect if no connection
  }
  delay(100);



}

Como esta? esta bien?
El me muestra la distancia y se conecta al WLAN
Ahora no se como se usa el MODBUS he visto ejemplos y he replicado las cosas y no me aparece error pero no se como conectarlo
Es decir no se como se relacionan las y que valor es que y así es decir que no tengo claro cuales son los valores

No se como configurar MODBUS el PLC

Quiero conectar 4 ESP 32

En el LOGO! los parámetros del dispositivo remonto no se como configurarlos respecto al ESP32

El plc logo no es Modbus de forma nativa. Algunos logos si tienen comunicación Modbus. Primero comprueba si tu logo soporta Modbus.
Si lo soporta tienes que decidir quién es el esclavo y quién el maestro y en consecuencia programar un servidor o un cliente en el logo (no es complicado pero tampoco es trivial si no programas te logo antes)

1 Like

Quiero conectar 4 ESP 32

En el LOGO! los parámetros del dispositivo remonto no se como configurarlos respecto al ESP32

Moderador:
Por favor, lee las Normas del foro
Edita tu título, usa uno que no tenga justamente lo que se considera un título inútil.
Ver en las normas punto 5.
5. Piensa un título y descriptivo
Trata de resumir tu problema con un título inteligente, útil e informativo.
Un título útil salta a la vista de las personas que podrían conocer la respuesta. Los títulos inútiles son los que deberías evitar.
Ejemplos de títulos inútiles que deberías evitar:
• ERROR EN CODIGO, AYUDA URGENTE
• Problema al programar
• Tengo un error
• Error
• Tendré problemas?
• Novato en apuros
• POR FAVOR NECESITO AYUDA RAPIDO!!!!

Si es compatible

Moderador
@aalejandra_saav por favor edita ese titulo!!!
O acaso no has visto el post en verde?

Tienes que decidir como vas a intercambiar la información, lo mas fácil es hacerlo como enteros de 16 bits que se pueden leer y escribir, incluso si solo vas a intercambiar booleanos.
Tienes que agregar un cliente Modbus en el Logo en configuración>General>conexines Ehernet
Luego haciendo doble clic en el cliente creado, debes configurar las direcciones locales (donde se almacena el dato preguntado) y las remotas (donde se almacenan en el esp)
Después debes crear un servidor modbus en el Esp respetando las direcciones configuradas en el Logo.
Te recomiendo trabajar con clientes y servidores modbus en el Pc, es decir ajustas el funcionamiento del ESP y por el otro con el logo y luego integras ambos.
Saludos

1 Like

Buenas tardes nuevamente me comunico ya que estoy en proceso de entender la conexión modbus entre un ESP 32 y un PLC LOGO! los cuales los tengo conectados a una red de área local
Quisiera saber si esto me dice el PLC , que valor pongo en el ESP 32, vi en este ejemplo Envió de datos vía MODBUS TCP - #4 by rodsal13 que usan la dirección 4000 , solo que en mi PLC no se que dirección se usa para probarlo y luego conectarlo, en el ESP32 no se que valor ponerle para probarlo, de igual manera no se usar el Modbus Poll ya lo descargue solo que no lo se usarlo, es posible que me ayuden?

Muchas gracias por su atención, estoy en busca de aprender, solo que no he logrado entender esa parte de las direcciones
Quedo atenta

//----------------------------------Modbus
#include "Modbus.h"
#if defined(ESP8266)
 #include <ESP8266WiFi.h>
#elif defined(ESP32)
 #include <WiFi.h>
#else
#error "Unsupported platform"
#endif
#include "ModbusTCP.h"


const int SENSOR_IREG=1; // AQUI NO SE QUE NUMERO PONER 


IPAddress ip(192, 168, 1, 25);  // Address of Modbus Slave device
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0); 

ModbusTCP mb;  //ModbusTCP object

//----------------------------------Laser

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

//Wifi----------------------------------

#include <WiFi.h>

//------------------Servidor Web en puerto 80---------------------

WiFiServer server(80);

//---------------------Credenciales de WiFi-----------------------

const char* ssid     = "PhoenixContact E1";
const char* password = "";

//---------------------VARIABLES GLOBALES-------------------------
int contconexion = 0;

String header; // Variable para guardar el HTTP request

//------------------------CODIGO HTML------------------------------
String paginaInicio = "<!DOCTYPE html>"
"<html>"
"<head>"
"<meta charset='utf-8' />"
//"<META HTTP-EQUIV='Refresh' CONTENT='2'>"
"<title> LASER ESTACION 1</title>"
"</head>"
"<body>"
"<center>"
"<h3>LASER ESTACION 1</h3>";

String paginaFin = "</center>"
"</body>"
"</html>";

//---------------------------SETUP--------------------------------
void setup() {
 
  Serial.begin(115200);
  Serial.println("");
  
 //----------------------------------Laser

 pinMode(12,INPUT_PULLUP);
  digitalWrite(12,HIGH);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);
  sensor.startContinuous();

//----------------------------------Conexión WIFI para usar con ip fija
      IPAddress ip(192,168,1,28); 
      IPAddress gateway(192, 168, 0, 1); 
      IPAddress subnet(255,255,255,0); 
      WiFi.config(ip, gateway, subnet);

  WiFi.begin(ssid, password);
  //Cuenta hasta 50 si no se puede conectar lo cancela
  while (WiFi.status() != WL_CONNECTED and contconexion <50) { 
    ++contconexion;
    delay(500);
    Serial.print(".");
  }
  if (contconexion <50) {

      Serial.println("");
      Serial.println("WiFi conectado:");
      Serial.println(ssid);
      Serial.println(WiFi.localIP());
      server.begin(); // iniciamos el servidor
      
  }
  else { 
      Serial.println("");
      Serial.println("Error de conexion");
  }
  //----------------------------------Modbus

//dirección IP
mb.addIreg(SENSOR_IREG);

}

//----------------------------LOOP----------------------------------

void loop(){


//----------------------------------Laser

 int distance =sensor.readRangeContinuousMillimeters();
  //int distance =sensor.startContinuous(100);
  
 //distance = distance;
  Serial.println("");
  Serial.print("Distancia: ");
  Serial.print(distance);
  Serial.print("mm");
  Serial.println();
  delay(1000); 
    
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

//----------------------------------Wifi
  WiFiClient client = server.available();   // Escucha a los clientes entrantes

  if (client) {                             // Si se conecta un nuevo cliente
    Serial.println("New Client.");          // 
    String currentLine = "";                //
    while (client.connected()) {            // loop mientras el cliente está conectado
      if (client.available()) {             // si hay bytes para leer desde el cliente
        char c = client.read();             // lee un byte
        Serial.write(c);                    // imprime ese byte en el monitor serial
        header += c;
        if (c == '\n') {                    // si el byte es un caracter de salto de linea
          // si la nueva linea está en blanco significa que es el fin del 
          // HTTP request del cliente, entonces respondemos:
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
                     
            // Muestra la página web
            client.println(paginaInicio + distance + paginaFin);
            
            // la respuesta HTTP temina con una linea en blanco
            client.println();
            break;
          } else { // si tenemos una nueva linea limpiamos currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // si C es distinto al caracter de retorno de carro
          currentLine += c;      // lo agrega al final de currentLine
        }
      }
    }
    // Limpiamos la variable header
    header = "";
    // Cerramos la conexión
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }

//----------------------------------Modbus

mb.task();// actualiza para el trabajo se realize con normalidad
             // envía los valores del potenciometro 
  mb.Ireg(SENSOR_IREG, distance);
//muestra en el monitor serie los valores del pot4
  Serial.println(distance);


}

Gracias

Actualización

Así tengo el programa dándome la señal del laser pero ModbusPool no le he podido acomodar los parametros de lectura y escritura, pero ya lo conecte pero por puerto serial

CONECTAR POR TIPO MODBUS/TCP

MENSAJES AL CONECTAR POR TIPO MODBUS/TCP

CONECTADO POR PUERTO SERIAL

READ/WRITE DEFINITION

CODIGO ACTUALIZADO

//----------------------------------Modbus
#ifdef ESP8266
 #include <ESP8266WiFi.h>
#else //ESP32
 #include <WiFi.h>
#endif
#include "ModbusIP_ESP8266.h"

//Modbus Registers Offsets
const int SENSOR_IREG = 100;

//ModbusIP object
ModbusIP mb;

long ts;

//----------------------------------Laser

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;



//---------------------Credenciales de WiFi

const char* ssid     = "PhoenixContact E1";
const char* password = "";

//---------------------VARIABLES GLOBALES
int contconexion = 0;

//---------------------------SETUP--------------------------------
void setup() {
 
  Serial.begin(115200);
  Serial.println("");
  
 //----------------------------------Laser

 pinMode(12,INPUT_PULLUP);
  digitalWrite(12,HIGH);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);
  sensor.startContinuous();

//----------------------------------Conexión WIFI para usar con ip fija
      IPAddress ip(192,168,1,28); 
      IPAddress gateway(192, 168, 0, 1); 
      IPAddress subnet(255,255,255,0); 
      WiFi.config(ip, gateway, subnet);

  WiFi.begin(ssid, password);
  //Cuenta hasta 50 si no se puede conectar lo cancela
  while (WiFi.status() != WL_CONNECTED and contconexion <50) { 
    ++contconexion;
    delay(500);
    Serial.print(".");
  }
  if (contconexion <50) {

      Serial.println("");
      Serial.println("WiFi conectado:");
      Serial.println(ssid);
      Serial.println(WiFi.localIP());
      
  }
  else { 
      Serial.println("");
      Serial.println("Error de conexion");
  }
//----------------------------------Modbus

 mb.server();		//Start Modbus IP
    // Add SENSOR_IREG register - Use addIreg() for analog Inputs
    mb.addIreg(SENSOR_IREG);

    ts = millis();

}

//----------------------------LOOP----------------------------------

void loop(){

 int distance =sensor.readRangeContinuousMillimeters();
  //int distance =sensor.startContinuous(100);
  //distance = distance;

 //----------------------------------Modbus
 //Call once inside loop() - all magic here
   mb.task();

   //Read each two seconds
   if (millis() > ts + 2000) {
       ts = millis();
       //Setting raw value (0-1024)
       mb.Ireg(SENSOR_IREG, distance);
   }
   delay(10);

//----------------------------------Laser
  Serial.println("");
  Serial.print("Distancia: ");
  Serial.print(distance);
  Serial.print("mm");
  Serial.println();
  delay(1000); 
    
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

}

CONECTADO A LA RED MONITOR SERIAL

No se que debo de hacer pero ahí estoy trabajando en ello, algún consejo?

ACTUALIZACIÓN 2.0

CODIGO DEFINITIVO

//----------------------------------Modbus
#ifdef ESP8266
 #include <ESP8266WiFi.h>
#else //ESP32
 #include <WiFi.h>
#endif
#include "ModbusIP_ESP8266.h"

//Modbus Registers Offsets
const int SENSOR_IREG = 100;

//ModbusIP object
ModbusIP mb;

long ts;

//----------------------------------Laser

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

//---------------------Credenciales de WiFi

const char* ssid     = "PhoenixContact E1";
const char* password = "";

//---------------------VARIABLES GLOBALES
int contconexion = 0;

//---------------------------SETUP--------------------------------
void setup() {
 
  Serial.begin(115200);
  Serial.println("");
  
 //----------------------------------Laser

 pinMode(12,INPUT_PULLUP);
  digitalWrite(12,HIGH);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);
  sensor.startContinuous();

//----------------------------------Conexión WIFI para usar con ip fija
      IPAddress ip(192,168,1,28); 
      IPAddress gateway(192, 168, 0, 1); 
      IPAddress subnet(255,255,255,0); 
      WiFi.config(ip, gateway, subnet);

  WiFi.begin(ssid, password);
  //Cuenta hasta 50 si no se puede conectar lo cancela
  while (WiFi.status() != WL_CONNECTED and contconexion <50) { 
    ++contconexion;
    delay(500);
    Serial.print(".");
  }
  if (contconexion <50) {

      Serial.println("");
      Serial.println("WiFi conectado:");
      Serial.println(ssid);
      Serial.println(WiFi.localIP());
      
  }
  else { 
      Serial.println("");
      Serial.println("Error de conexion");
  }
//----------------------------------Modbus

 mb.server();		//Start Modbus IP
    // Add SENSOR_IREG register - Use addIreg() for analog Inputs
    mb.addIreg(SENSOR_IREG);

    ts = millis();

}

//----------------------------LOOP----------------------------------

void loop(){

 int distance =sensor.readRangeContinuousMillimeters();
  //int distance =sensor.startContinuous(100);
  //distance = distance;

 //----------------------------------Modbus
 //Call once inside loop() - all magic here
   mb.task();

   //Read each two seconds
   if (millis() > ts + 2000) {
       ts = millis();
       //Setting raw value (0-1024)
       mb.Ireg(SENSOR_IREG, distance);
   }
   delay(10);

//----------------------------------Laser
  Serial.println("");
  Serial.print("Distancia: ");
  Serial.print(distance);
  Serial.print("mm");
  Serial.println();
  delay(1000); 
    
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

}

MODBUS POLL CONECTADO CON EL ESP 32

Es un read input registers

Ahora veo el valor en el Modbus Poll, como lo lee el PLC? , Es decir como configuro los parámetros? Según lo que me dice Modbus poll y lo que me dice el PLC

En la dirección Modbus utiliza solo 101. Hay dos maneras de identificar una dirección Modbus. Puedes colocar la dirección completa o decirle que tipo de registro. Por ejemplo para holding register puedes expresarlo como 40101 (30000 es la zona de input register ) o el dato 101 de la zona de holding register. También prueba la direcciónes 100 y 102. Dependiendo de la implementación de Modbus puede incluir o no la posición cero y lo registros se desplazan una unidad.
PD no utilices servidores externos para subir fotos, se nos complica la visualización.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.