Actualización:
No hay nada como seguir intentándolo con mas ideas, viendo ejemplos y analizando el código
Me quedan muchas horas de programar y de fallo error ![]()
Os subo el último código, por si sirve de ayuda.
Es un codigo TEST, ahora falta pasar el array al Atmega y viceversa, hasta ahora lo hacia solo con un int.
Si veis que algo se puede optimizar o hacer mejor, serán bien venidas las ideas.
_____________________________________________________-
Hola¡¡
Tengo una placa con ESP8266+Atmega328P y quiero comunicar por Modbus con el ESP8266 y pasar los datos al Atmega. siendo novato que llevo dos semanas igual me he metido demasiado rápido.
Después de probar muchas cosas, otras librerías y proyectos he llegado al punto que desde fuera con un PLC y con el Modus Poll, puedo leer y escribir. Los valores que escribo los puedo enviar al Atmega, pero no consigo modificar desde el programa ESP la tabla Modbus para leerlos desde el Modbuss Poll y el PLC.
Estoy ya un poco bloqueado, a ver que veis que le falta al código, que hago mal...
muchas gracias
Os dejo aquí el código del ESP:
#include <ESP8266WiFi.h>
#include <ModbusIP_ESP8266.h>
#define LEN 20 // Cantidad de registros del Modbus
//Area de memoria para guardar los datos de Modbus 20. 10 de recepción y 10 de envío de señales
int MBHR[40];
//Variable para ver que corre el programa y generar señales
int comm;
int IndexWrite;
// Parámetros de mi WIFI
const char* ssid = "LowiA6A3";
const char* password = "ORANGEORANGE1234567890";
IPAddress ip(192, 168, 0, 100);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
//ModbusIP object
ModbusIP mb;
// Callback function to read corresponding DI
uint16_t cbRead(TRegister* reg, uint16_t val) {
MBHR[reg->address.address]= reg->value;
return val;
}
// Callback function to write-protect DI
uint16_t cbWrite(TRegister* reg, uint16_t val) {
MBHR[reg->address.address]= reg->value;
return val;
}
//Callback function for client connect. Returns true to allow connection.
bool cbConn(IPAddress ip) {
return true;
}
void setup() {
pinMode(14, OUTPUT); //Led del ESP para saber que corre el programa y está conectado al WIFI
//puerto Serie de la placa
Serial.begin(19200);
//WIFI CFG y START
WiFi.mode(WIFI_STA);
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
//WIFI OK
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
mb.onConnect(cbConn); // Add callback on connection event
mb.slave();
if (!mb.addHreg(0, 0x0000, LEN)); // Add Hregs Creeamos los registros??
mb.onGetHreg(0, cbRead, LEN); // Add callback on Coils value get
mb.onSetHreg(0, cbWrite, LEN);
IndexWrite = 10; // Inicializamos el contador para el puntero de copia del Array
}
void loop() {
mb.task();
comm = comm + 1;
delay(10);
if(bitRead(comm,3)) {
digitalWrite(14, HIGH); //controlamos que el programa fluye y no se queda en bucles al probarlo
}else{
digitalWrite(14, LOW);
}
if(bitRead(comm,5)) {
Serial.print(MBHR[10]); // imprimimos cada 100 ciclos el valor del registro y del contador
Serial.println(comm); // imprimimos cada 100 ciclos el valor del registro y del contador
comm = 0;
}
// ********************************************************************************************************************
// Los 10 registros de salida los creamos aqui luego con el loop y el index los escribimos al MAP del Modbus de Salida
MBHR[10] = ("RSSI: %d dBm\n", WiFi.RSSI());
MBHR[11] = MBHR[11]+1;
MBHR[12] = random(0,12);
MBHR[13] = random(0,12);
MBHR[14] = random(0,12);
MBHR[15] = random(0,12);
MBHR[16] = random(0,12);
MBHR[17] = random(0,12);
MBHR[18] = random(0,12);
MBHR[19] = random(0,12);
mb.Hreg(IndexWrite,MBHR[IndexWrite]);
if (IndexWrite >= 19) {
IndexWrite = 10;
}
IndexWrite = IndexWrite + 1;
// END PROGRAM
}