ESP8266 - ModbusIP com ScadaBR


#1

a biblioteca modbusIP para o ESP8266
foi atualizada e a funcão mb.config deixou de funcionar, como ainda consta no exemplo para o MODBUS, a funcão mb.config, eu encontrei o código abaixo que funciona com a versão 4.10 da biblioteca ModbusIP_ESP8266.

instale a biblioteca de:

Abaixo o código de exemplo com modificações:

/*
  Modbus-Arduino Example - Test Analog Input (Modbus IP ESP8266)
  Read Analog sensor on Pin ADC (ADC input between 0 ... 1V)
  Original library
  Copyright by André Sarmento Barbosa
  http://github.com/andresarmento/modbus-arduino
  Current version
  (c)2017 Alexander Emelianov (a.m.emelianov@gmail.com)
  https://github.com/emelianov/modbus-esp8266
*/

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

// Preencha com as credenciais da sua rede
const char* ssid     = "MinhaRedeSemFio";
const char* password = "MinhaSenha";

// Se for usar IP Fixo, preencha os valores abaixo
IPAddress local_IP(192, 168, 0, 150);
// Set your Gateway IP address
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 0, 0);
IPAddress primaryDNS(8, 8, 8, 8);   //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional
//Modbus Registers Offsets
const int SENSOR_IREG = 0;

//Declara o Objeto ModbusIP  
ModbusIP mb;

long ts; // Tempo ts

void setup() {
    Serial.begin(115200); // Iniciando a Serial
    Serial.println("\n\n\n");
  Serial.println("ESP8266-Modbus-https://github.com/emelianov/modbus-esp8266");
    Serial.print("Tentando configurar a rede Wifi com ssid: ");
    Serial.println(ssid);
    Serial.print ("password: ");
    Serial.println(password);

int count=0; // usado apenas para a conexao wifi...
  // Descomente as linhas a seguir para configurar ip Fixo
  // Aqui seta os valores de endereço IP
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("ERRO! STA Falha na configuração!");
  }

  
  // Conecta a rede Wifi (se nao for descomentado as linhas acima, o IP será obtido por DHCP) 
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500); // Aguarda meio segundo
        Serial.print(".");
        count++;
// Se ele imprimiu 25 pontos, salta a linha e comeca novamente.
        if (count >25) {count=0;Serial.println(".");}
    }
    Serial.println(". TERMINADO!");
    Serial.println(" ");
    Serial.println("Rede WiFi conectada!");  
    Serial.print("ssid: ");
    Serial.println(ssid);
    Serial.print ("password: ");
    Serial.println(password);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    WiFi.printDiag(Serial); // Essa linha joga info sobre a conexão e mostra diagnosticos do WIFI via porta serial.
    Serial.print("Iniciando ModbusIP  \nIP: " );
    Serial.print(WiFi.localIP());
        Serial.print(":502");
    Serial.println(" qualquer ID... ");
    mb.server();    //Iniciou Servidor Modbus IP
// +-----------------+---------------+------------+-------------------+    
// |Register type    | Use as        |Access      | Library methods   |
// +-----------------+---------------+------------+-------------------+  
// |Coil             | Digital Output| Read/Write | addCoil(), Coil() |
// |Holding Register | Analog Output | Read/Write | addHreg(), Hreg() |
// |Input Status     | Digital Input | Read Only  | addIsts(), Ists() |
// |Input Register   | Analog Input  | Read Only  | addIreg(), Ireg() |
// +-----------------+---------------+------------+-------------------+

    // Adiciona SENSOR_IREG - Use addIreg() para Entradas analógicas    
    Serial.print("Acicionando Ireg (Input Register) numero: ");
    Serial.println(SENSOR_IREG);
    mb.addIreg(SENSOR_IREG);
    ts = millis();
}

void loop() {
   //Dentro do loop() - execute uma vez para a mágica funcionar...
   mb.task();

   //atualização a cada 2 segundos
   if (millis() > ts + 2000) {
       ts = millis();
       //Valor lido em A0 (0-1024)
       // coloca o valor lido de A0 para  o InputRegister SENSOR_IREG
       mb.Ireg(SENSOR_IREG, analogRead(A0)); 
   }
   delay(10);
}

Vamos ver no ScadaBR, crie um datasource MODBUS IP:

Após colocar o nome do datapoint, coloque o endereco IP do host

Abaixo: o Scan e o teste!

A porta Analógica do ESP32 possui algumas observações sobre questöes sobre precisão. Isso não foi tratado aqui. É apenas para código de exemplo…