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
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)
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!!!!
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
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);
}
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
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.