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…