ESP32 Ejemplo de comunicación ModBus en modo AP Access Point
/*
* Ejemplo de comunicación ModBus TCP/IP con el ESP32 como server y en modo AP Access Point
*
* Descripción: Programa básico para utilizar una placa PCB de ESP32 como unidad remota de entradas
* y salidas digitales y analógicas, utilizando comunicación modbus sobre tcp/ip
*
* Nota: Instalar las librerias modbus-esp8266 by Andre Sarmento Barbosa, Alexander Emelianov
* https://github.com/emelianov/modbus-esp8266
*
* Autor: Rafa Aranda
* Fecha: 06-11-2023
* Versión: 1.0
*/
// Librerías
#include ‹WiFi.h›
#include ‹ModbusIP_ESP8266.h›
// Asignación de Pins a Salidas digitales
#define K1_PIN 2 // GPIO2 Lez integrado en la placa
// Asignación de Pins a Entradas digitales
#define S1_PIN 5 // GPIO5 Pin de entrada
// Asignación de Pins a Entradas analógicas
#define A1_PIN A0 // Pin de entrada analógica
// Credenciales para la WIFI
const char *ssid = "RafaESP32AP";
const char *password = "12345678";
// Modbus dirección de registro
const int A1_IREG = 100;
// Modbus dirección de bobina de salida
const int K1_COIL = 100;
// Modbus dirección de bobina de entrada
const int S1_COIL = 200;
// Funciones prototipo
void getInputs(void);
void setOutputs(void);
void getAnalog(void);
// Variables globales
ModbusIP mb; // ModbusIP se crea el objeto
// Temporizador para contar segundos
unsigned long ams;
unsigned long bms;
unsigned long cms;
void setup() {
Serial.begin(115200);
delay(4000);
Serial.println("\n-> Creating AP");
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);
Serial.print("-> AP Created with IP Gateway ");
Serial.println(WiFi.softAPIP());
// Modbus en modo server
mb.server(); //Iniciar el Modbus IP
// Asignación de registros enteros de entrada al objeto modbus
mb.addIreg(A1_IREG);
// Asignación de bobinas al objeto modbus
mb.addCoil(K1_COIL);
// Asignación de entrada digitales al objeto modbus
mb.addCoil(S1_COIL);
// Establecer los pins de salida
pinMode(K1_PIN, OUTPUT);
// Establecer los pins de entrada
pinMode(S1_PIN, INPUT);
// Iniciar variable contadora
ams = millis();
}
void loop() {
getInputs(); // Leer entradas digitales
getAnalog(); // Leer entradas analógicas
mb.task(); // Sondear el sistema de comunicaciones modbus
// PROGAMA DE AUTOMATIZACIÓN DE......
//----------------------------------------------------------------------------------------------------
/* Aquí mi programa de automatización utilizando los datos de las bobinas y registros modbus como
parámetros y consignas para hacer mi proyecto..... */
//----------------------------------------------------------------------------------------------------
mb.Ireg(A1_IREG, 123); // Leer la entrada del ADC (0 a 1023)
setOutputs(); // Activar las salidas
delay(10); // CicloScan + 10ms, retardo para anti-rebotes
}
/* getInputs
* Lee el estado de la entrada indicada en el parámetro y lo asigna a las bobinas modbus
*/
void getInputs(void){
mb.Coil(S1_COIL, digitalRead(S1_PIN));
//Repetir para otras entradas.....
}
/* setOutputs
* asigna el estado de las bobinas modbus a las salidas digitales
*/
void setOutputs(void){
digitalWrite(K1_PIN, mb.Coil(K1_COIL)); // Escribimos en el pin de salida el estado de la bobina ModBus
//Repetir para otras salidas.....
}
/* getAnalog
* Lee el estado de la entrada indicada en el parámetro y lo asigna a los registros modbus
*/
void getAnalog(void){
//Leer las entradas cada 2 segundos
bms=millis();
if(bms>=ams)cms=bms-ams;
else cms=0x40000-ams+bms;
if(cms>=2000){
ams = bms;
// Guardar en el registro modbus el valor de la entrada analógica
mb.Ireg(A1_IREG, analogRead(A1_PIN)); // Leer la entrada del ADC (0 a 1023)
//mb.Ireg(A1_IREG, 123); // Prueba, asignar la constante 123 al registro de entrada para probar el funcionamiento
//Repetir para otras entradas.....
}
}