Entendiendo y configurando el protocolo MODBUS TCP/IP mediante ESP32

Поділитися
Вставка
  • Опубліковано 7 жов 2024
  • En este video miraremos cómo configurar e iniciar la comunicación mediante protocolo MODBUS TCP/IP en la tarjeta de desarrollo ESP32. En los siguientes enlaces se encuentra la información usada en el video:
    Líbrería MODBUS TCP/IP para ESP32: github.com/eme...
    Video de explicación MODBUS TCP/IP: • Comprendiendo el proto...
    Software MODBUS-POLL: www.modbustool...
    URL para agregar la tarjeta ESP32 a Arduino: dl.espressif.c...
    Muchas gracias por ver el video :)

КОМЕНТАРІ • 45

  • @tomassantana2328
    @tomassantana2328 Рік тому

    Excelente video, tengo una duda. Lo que pasa es que estoy usando una placa WT32 ( Un esp32 con interface ethernet). Mi pregunta es la siguiente ¿ Como debiese ser el ejemplo con un cable de red en vez de Wifi?

    • @taloselectronico
      @taloselectronico  Рік тому

      Hola Tomás, gracias. No se que IC tendrá la placa, pero la librería que use para WiFi tiene soporte para libreria Ethernet. Revise este enlace:
      github.com/emelianov/modbus-esp8266/tree/master/examples/TCP-Ethernet
      Saludos desde Colombia

  • @andreeu570
    @andreeu570 2 роки тому

    buen video pero... que tendria que hacer para modificar un numero entero desde modbuss?

  • @drbsolucioneselectronicas4346
    @drbsolucioneselectronicas4346 2 роки тому

    Excelente video Profe. Estoy en la realización de un proyecto de monitoreo de variables modbus y me gustaría me compartiera su asesoría, Me podría regalar su correo electrónico.

    • @taloselectronico
      @taloselectronico  2 роки тому

      Muchas gracias Yerson, es taloselectronico@gmail.com

  • @Primo-k7k
    @Primo-k7k Рік тому

    hola, exelente video....como podria leed registros de otros equipos por modbus tcp?

    • @taloselectronico
      @taloselectronico  Рік тому +1

      Hola buenas tardes, muchas gracias. Modbus es un protocolo "genérico" por así decirlo. Se debería cambiar las direcciones a los registros del nodo o RTU que se quiera leer, esto lo indica el manual del equipo o dispositivo.
      Saludos desde Colombia.

  • @vincent4343
    @vincent4343 2 роки тому

    buen video men, tengo una consulta:
    Donde sacas esa direccion? del mismo ESP32?

    • @taloselectronico
      @taloselectronico  2 роки тому +1

      Hola Gerardo, si esa dirección es de mi red que tengo con el router. Uno puede configurar la IP dependiendo del rango que tenga en la red de uno y ajustarla a la que tiene el ESP32, por defecto es la del video.

    • @vincent4343
      @vincent4343 2 роки тому

      @@taloselectronico si correcto, me refiero a la direccion 100

    • @taloselectronico
      @taloselectronico  2 роки тому +1

      @@vincent4343 Esta es la dirección (offset) del registro que contendrá la información a donde se va a escribir o donde se va a leer en MODBUS dependiendo del ejemplo que seleccione en la libreria. Esta dirección puede ir hasta 9999. Por defecto la dirección es el 100.

  • @ilkeraykut7064
    @ilkeraykut7064 2 роки тому

    Thanks for tutorial.How can we use Write Single Register?

    • @taloselectronico
      @taloselectronico  2 роки тому

      Hi, thank you. Basically, you can see the function uint16_t writeHreg(IPAddress ip, uint16_t offset, uint16_t value, cbTransaction cb = nullptr, uint8_t uint = MODBUSIP_UNIT);
      Please, see the examples for this function in the following link: github.com/emelianov/modbus-esp8266/tree/master/examples/TCP-ESP
      Also, I made a code for a speed drive. Please traduce the comments to english (see the part : "mb1.writeHreg(ID_ESCLAVO,direccion,valor);"
      ID_ESCLAVO: SLAVE_ID
      Direccion: Address of your register
      Value: Value to write to the register
      github.com/Uniminutoarduino/CanalUA-cam/blob/main/MODBUS/ESP32/VariadorVelocidadArduino.ino

  • @tinontio5878
    @tinontio5878 11 місяців тому

    😀

  • @mgabiel
    @mgabiel Рік тому

    me salta error de conexión tcp, pero con el espo8266 no me lo hace, solo con el esp32

    • @taloselectronico
      @taloselectronico  Рік тому

      Hola Mario gca. Tal vez es que el ESP32 no se esta conectando a la red o hay que incrementar el tiempo de retraso en el inicio de la conexión a red.
      Saludos desde Colombia.

    • @mgabiel
      @mgabiel Рік тому

      @@taloselectronico hola gracias. Ya lo solucioné, es que cada vez que tocaba el botón de reset o le desconectaba la alimentación el esp32 volvía a una programación anterior. No me preguntes por qué.
      Entonces se borraba el programa del modbus y volvía a "programarse solo" en programa de ota. Es raro.
      Ahora sé que no lo puedo apagar.

  • @AAlejandra_Saav
    @AAlejandra_Saav 8 місяців тому

    Si el router me dice que esta conectado pero no me aparece la dirección ip en el monitor en serie , pero la MAC del dispositivo aparece vinculado, estoy conectando el ESP 32 con un WLAN 1100 (PHOENIX CONTAC) en el administrador web (del wlan) me dice que en los dispositivos conectados esta el ESP 32 y de da la MAC, pero en el Monitor en serie se queda mostrando solo puntos es decir que se queda en el while y no me muestra la ip address, que podría hacer ?, Lo conecto a el router de mi casa y pasa exactamente lo mismo.

    • @taloselectronico
      @taloselectronico  8 місяців тому +1

      Parece que el ESP32 no se conecta Alejandra. Hay que verificar la IP del router o si tal vez el router tiene un proxy que rechaza la conexión. También habría que reiniciar el ESP32 una vez se carga el código, habría que probar estas opciones.

    • @AAlejandra_Saav
      @AAlejandra_Saav 8 місяців тому

      @@taloselectronico Muchas gracias , para conectar el WLAN con un tablet o telefono debo de configurar la ip u que sea estática le pongo los datos y conecta, como puedo hacerlo en el ESP 32? Seria ponerle los datos de direccion ip propia, ip del wlan, "longitud de prefijo" dns 1 , dns 2, como puedo yo asignarle (programar) al esp 32 estos valores ?

    • @taloselectronico
      @taloselectronico  8 місяців тому +1

      @@AAlejandra_Saav te toca mirar los parametros de Wifi. Mira este ejemplo de Arduino para configurar el DNS (Debe funcionar para ESP32): www.arduino.cc/reference/en/libraries/wifi/wifi.setdns/

    • @AAlejandra_Saav
      @AAlejandra_Saav 7 місяців тому

      @@taloselectronico TODO PERFECTO EXCELENTE AYUDA!

    • @taloselectronico
      @taloselectronico  7 місяців тому

      @@AAlejandra_Saav Ok me alegra que todo haya funcionado bien. Saludos desde Colombia.

  • @gustavocosta3718
    @gustavocosta3718 2 роки тому

    talos no me estaria funcionando, la unica diferencia que veo es que la instruccion ModbusIP mb no se pone en naranja.. como si tuviera problemas para reconocer el objeto..ModbusIP

    • @taloselectronico
      @taloselectronico  2 роки тому

      Buenos días Gustavo. Yo creo que puede ser un problema en la librería. Hay que incluir todos lops archivos dentro de la misma carpeta del proyecto. También verificar la IP de los dispositivos en la red y del ESP32. Tendría que ver el código. Si quiere escribame a taloselectronico@gmail.com

  • @andreeu570
    @andreeu570 2 роки тому

    no quisiera ser molesto pero... como puedo hacerlo en RTU?, quiero leer entrada analogica desde modbus RTU, me podrias dar un ejemplo porfa no encuentro como hacerlo, he visto que en la libreria hay ejemplos pero no se como funcionan

    • @taloselectronico
      @taloselectronico  2 роки тому

      Buenos días Mr.GameplaySans, para trabajar con Modbus RTU debe hacerse usando un puerto serial del ESP32, en mi caso funciono bien el número 2, si quiere dejeme crear un código base que le puede ayudar y se lo envio por este medio.

    • @andreeu570
      @andreeu570 2 роки тому

      @@taloselectronico si, muchas gracias

    • @taloselectronico
      @taloselectronico  2 роки тому

      @@andreeu570 Revise este código en modo RTU, aquí use el serial 2 del ESP32:
      drive.google.com/file/d/1xstCxT9dUJFgSmowAz_zUW_HB9pBPkSl/view?usp=sharing

    • @andreeu570
      @andreeu570 2 роки тому

      @@taloselectronico muchas gracias pero, que sentido tiene iniciar el wifi si el RTU no lo necesita?

    • @taloselectronico
      @taloselectronico  2 роки тому

      @@andreeu570 Si disculpas es que tome una plantilla de modbus TCP/IP, esa parte la puede omitir del código. Pense que era si ud queria hacer un puente entre modbus TCP/IP y Modbus RTU, pero para lo que lo necesita lo puede omitir.

  • @sillydog3647
    @sillydog3647 10 місяців тому

    Hello, I want to assign the value of the holding register to the servo motor. For example, if I write the holding register data 90 and the servo motor rotates to 90 degrees, what should I do?😀

    • @taloselectronico
      @taloselectronico  10 місяців тому

      Hi, I think you need to modificate in the code the address of the holding register. You can use this example: github.com/emelianov/modbus-esp8266/blob/master/examples/TCP-ESP/client/client.ino
      Also, this is the library's documentation in the video: github.com/emelianov/modbus-esp8266/tree/master/examples/TCP-ESP#API
      Here, use writeHreg to write the angle value of your motor.
      Best regards.

    • @sillydog3647
      @sillydog3647 10 місяців тому

      @@taloselectronico Hello, thank you for your reply. My ESP32 serves as a modbus TCP server and I use modbus poll as the client. Now I can write holding register data normally. The problem is that no matter what value is written, the servo will not rotate. What if I want the initial value of the servo to be 90 degrees, the initial value of the register to be 90 degrees, and the servo to rotate to as many degrees as the register data is? Here is my ESP32 program, I'm not sure where the problem lies.
      #ifdef ESP8266
      #include
      #else //ESP32
      #include
      #endif
      #include "ModbusIP_ESP8266.h"
      #include
      // Modbus Registers Offsets
      const int TEST_HREG = 0;
      unsigned int sever0_data;
      Servo myservo;
      //ModbusIP object
      ModbusIP mb;

      void setup() {
      Serial.begin(115200);

      WiFi.begin("HOU", "1372610017");

      while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
      }

      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      myservo.attach(2);

      mb.server();
      mb.addHreg(TEST_HREG,0x00);
      }

      void loop() {
      //Call once inside loop() - all magic here
      mb.task();
      sever0_data=mb.addHreg(TEST_HREG);
      myservo.write(sever0_data);

      delay(10);
      }

    • @taloselectronico
      @taloselectronico  10 місяців тому

      @@sillydog3647 Are you writing the angle value from the client to server?
      1. If so, may you need to change
      sever0_data=mb.addHreg(TEST_HREG); to
      sever0_data=mb.readHreg(TEST_HREG);
      Also print the value that you are receiving, here:
      sever0_data=mb.readHreg(TEST_HREG);
      Serial.print(sever0_data);
      myservo.write(sever0_data);
      The addHreg only adds or allocates a holding register in the address (0x00) to your ESP32 memory but not read the value storaged in this register. To read the value Instead use readHreg.
      2. Another problem could be due to the type of variable that you are using. Change sever0_data to int and print the value that you are receiving:
      sever0_data=mb.Hreg(TEST_HREG);
      Serial.print(sever0_data);
      myservo.write(sever0_data);
      I changed addHreg to Hreg. This is another option to read the register.
      Finally, for debugging purposes (print), change the delay, for example, to 100 ms.

    • @sillydog3647
      @sillydog3647 10 місяців тому

      @@taloselectronico Hello,I write the angle value from the client to server,I change my code to this,but it shows some error:no matching function for call to 'ModbusIP::readHreg(const int&)'
      sever0_data=mb.readHreg(TEST_HREG);
      And here is my code:
      #ifdef ESP8266
      #include
      #else //ESP32
      #include
      #endif
      #include "ModbusIP_ESP8266.h"
      #include
      const int TEST_HREG = 0;
      int sever0_data;
      Servo myservo;
      ModbusIP mb;

      void setup()
      {
      Serial.begin(115200);

      WiFi.begin("HOU", "1372610017");

      while (WiFi.status() != WL_CONNECTED)
      {
      delay(500);
      Serial.print(".");
      }

      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      myservo.attach(15);

      mb.server();
      mb.addHreg(TEST_HREG,0x00);
      }

      void loop() {
      mb.task();
      sever0_data=mb.readHreg(TEST_HREG);
      Serial.println(sever0_data);
      myservo.write(sever0_data);
      delay(100);
      }

    • @sillydog3647
      @sillydog3647 10 місяців тому

      @@taloselectronico Hello,the code is right and could upload,thank you!
      #ifdef ESP8266
      #include
      #else
      #include
      #endif
      #include
      #include
      int TEST_HREG0 = 0;
      int TEST_HREG1 = 1;
      int TEST_HREG1 = 2;
      int TEST_HREG1 = 3;
      int TEST_HREG1 = 4;
      int TEST_HREG1 = 5;
      int TEST_HREG1 = 6;
      int TEST_HREG1 = 7;
      int TEST_HREG1 = 8;
      int TEST_HREG1 = 9;
      int sever0_data;
      int sever1_data;
      int sever2_data;
      int sever3_data;
      int sever4_data;
      int sever5_data;
      int sever6_data;
      int sever7_data;
      int sever8_data;
      int sever9_data;
      Servo myservo0;
      Servo myservo1;
      Servo myservo2;
      Servo myservo3;
      Servo myservo4;
      Servo myservo5;
      Servo myservo6;
      Servo myservo7;
      Servo myservo8;
      Servo myservo9;
      ModbusIP mb;

      void setup()
      {
      Serial.begin(115200);

      WiFi.begin("HOU", "1372610017");

      while (WiFi.status() != WL_CONNECTED)
      {
      delay(500);
      Serial.print(".");
      }

      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      myservo0.attach(15);
      myservo1.attach(2);
      myservo2.attach(4);
      myservo3.attach(5);
      myservo4.attach(12);
      myservo5.attach(17);
      myservo6.attach(19);
      myservo7.attach(27);
      myservo8.attach(18);
      myservo9.attach(26);
      mb.server();
      mb.addHreg(TEST_HREG0, 0x5A);
      mb.addHreg(TEST_HREG1, 0x5A);
      mb.addHreg(TEST_HREG2, 0x5A);
      mb.addHreg(TEST_HREG3, 0x5A);
      mb.addHreg(TEST_HREG4, 0x5A);
      mb.addHreg(TEST_HREG5, 0x5A);
      mb.addHreg(TEST_HREG6, 0x5A);
      mb.addHreg(TEST_HREG7, 0x5A);
      mb.addHreg(TEST_HREG8, 0x5A);
      mb.addHreg(TEST_HREG9, 0x5A);
      }
      void loop()
      {
      mb.task();
      sever0_data=mb.Hreg(TEST_HREG0);
      sever1_data=mb.Hreg(TEST_HREG1);
      sever2_data=mb.Hreg(TEST_HREG2);
      sever3_data=mb.Hreg(TEST_HREG3);
      sever4_data=mb.Hreg(TEST_HREG4);
      sever5_data=mb.Hreg(TEST_HREG5);
      sever6_data=mb.Hreg(TEST_HREG6);
      sever7_data=mb.Hreg(TEST_HREG7);
      sever8_data=mb.Hreg(TEST_HREG8);
      sever9_data=mb.Hreg(TEST_HREG9);
      myservo0.write(sever0_data);
      myservo1.write(sever1_data);
      myservo2.write(sever2_data);
      myservo3.write(sever3_data);
      myservo4.write(sever4_data);
      myservo5.write(sever5_data);
      myservo6.write(sever6_data);
      myservo7.write(sever7_data);
      myservo8.write(sever8_data);
      myservo9.write(sever9_data);
      delay(10);
      }
      😀😀😀

  • @andreeu570
    @andreeu570 2 роки тому

    y tambien como agregar otro led igual porfa

    • @taloselectronico
      @taloselectronico  2 роки тому

      Hola Mr.GameplaySans, para modificar un número entero cree una variable de tipo entera (contador), por ejemplo, y enviela a un registro MODBUS. Para esto guiese por el ejemplo de lectura de valor análogo que esta en el link y que explico en el video: github.com/emelianov/modbus-esp8266/blob/master/examples/TCP-ESP/IP-server-AnalogInput/IP-server-AnalogInput.ino
      Cuando cree la variable, cambie la parte en el loop que dice AnalogRead(A0) por la variable que se quiere enviar.
      En cuanto a la segunda pregunta del Led, habría que crear otro registro en otra dirección, por ejemplo la 101,. Entonces se crearía en la pte que dice: "const int LED_COIL2 = 101;" , en segundo lugar, configura el segundo led como salida y finalmente en el loop enlaza la salida con el registro donde dice "digitalWrite(ledPin, mb.Coil(LED_COIL2));"
      El ejemplo de Led está en: github.com/emelianov/modbus-esp8266/blob/master/examples/TCP-ESP/IP-server-Led/IP-server-Led.ino
      Creo que lo anterior le puede ayudar.
      Saludos cordiales

    • @andreeu570
      @andreeu570 2 роки тому

      @@taloselectronico muy amable señor, gracias por la atencion

    • @andreeu570
      @andreeu570 2 роки тому

      @@taloselectronico señor, podria hacer un script de ejemplo, no me funciona el codigo

    • @andreeu570
      @andreeu570 2 роки тому

      @@taloselectronico no logro entender bien, si todas las variables son enteras

    • @taloselectronico
      @taloselectronico  2 роки тому

      @@andreeu570 Revise estos dos códigos que cree, uno para los dos leds y otro para la variable entera.
      Espero que le sirvan.
      drive.google.com/file/d/1SzjdruS8vhxL6BiVdtqKZiga3ZM6DPkh/view?usp=sharing
      drive.google.com/file/d/1wlarOYhOufuqasUuJ8-DSoQPcVsy5UU4/view?usp=sharing