La solución:
Para que se volviera estable y no se quedara colgado el Arduino, simplemente organice el código y en una sola lectura de 10 palabras y al cabo de 100ms hacía la escritura en bloque de 10 palabras, funcionaba bien, 4 días /24h sin parar de comunicar con el PLC SIM V3 y perfecto.
CPU de Siemens 1500
Bueno, os comento
Tengo un Arduino UNO con el internet Shield W500, y el proyecto que tengo en mente es colocar una serie de sensores de temperatura y boyas de nivel para enviarlos a un célula de soldadura. No son sensores críticos pero si me gustaría monitorizarlos cada X tiempo para que la celda conozca como esta el equipo de refrigeración externo. Ahora me encuentro en el punto establecer y comunicar con un S7 1500 de forma continua y estable. luego iré añadiendo los sensores tipo Dallas y algunos detectores.
Dentro de que soy novel y he empezado hace poco, primero intenté con los ejemplos de MODBUS, pero todo problemas de compilación que se me escapan, siendo que con el ESP8266 me funcionó a la perfección con el Modbus.... ![]()
Con la librería Settiminio V2.0 me es imposible llegar a compilar, y he estado casi una semana intentándolo. Ayer descargue la versión V1.1, y quitando y colocando código conseguí leer y escribir de aquellas maneras en un S7 1500 simulado, PLC SIM V3.0. He de decir que con estos PLC de simulación he estado días probando comunicaciones y otros programas y no se quedan colgadas las instancias que creo del TIA PORTAL. Viendo que comunicaba, le bajé al programa la lectura cada 100ms y lo he dejado toda la noche intercambiando datos para ver su fiabilidad..... y cuando me he levantado estaba el Arduino seco, la ethernet shield tenia comunicación pero el Arduino nada, el PLC sim V3.0 seguía funcionando.
Os paso el código a ver que veis o que se puede optimizar para estabilizar la comunicación, si no me pasare hacerlo con MODBUS, que lo he llegado a tener 4 días por wifi conectado al PLC SIM y al ModBus POLL sin pérdida de datos y manteniendo la comunicación en todo momento, escrituras, lecturas.....
Existe algún modo tipo watchdog que reinicie el Arduino o el código?
Que puedo cambiar en el código para que sea mas estable o no saturar al Arduino?
LA cantidad de datos a leer y escribir no va más de 8 a 16 byte en el futuro
Esta es la primera parte de varios proyectos de comunicaciones para la planta modesta en la que trabajo, por lo que iré subiendo las ideas que iremos implantando conforme avance en estas pequeñas cosas.
Muchas Gracias¡¡¡
#include <SPI.h>
#include <Ethernet.h>
#include "Settimino.h"
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x08, 0xE11 };
IPAddress Local(192,168,0,100); // Local Address
IPAddress PLC(192,168,0,30); // PLC Address
IPAddress Gateway(192, 168, 0, 1);
IPAddress Subnet(255, 255, 255, 0);
int DBNum = 10; // This DB must be present in your PLC
byte Buffer[8];
int prgint;
byte prgbyte;
word input;
S7Client Client(_S7WIRED); // S7Client will create an EthernetClient as TCP Client
void setup() {
Serial.begin(9600); // Open serial communications and wait for port to open:
//--------------------------------Wired Ethernet Shield Initialization
// Start the Ethernet Library
Ethernet.begin(mac, Local);
// Setup Time, someone said me to leave 2000 because some
// rubbish compatible boards are a bit deaf.
delay(1000);
Serial.println("");
Serial.println("Cable connected");
Serial.print("Local IP address : ");
Serial.println(Ethernet.localIP());
}
//----------------------------------------------------------------------
// Connects to the PLC
//----------------------------------------------------------------------
bool Connect()
{
int Result=Client.ConnectTo(PLC,
0, // Rack (see the doc.)
1); // Slot (see the doc.)
Serial.print("Connecting to ");
Serial.println(PLC);
if (Result==0)
{
Serial.print("Connected ! PDU Length = ");Serial.println(Client.GetPDULength());
}
else
Serial.println("Connection error");
return Result==0;
}
//----------------------------------------------------------------------
// Main Loop
//----------------------------------------------------------------------
void loop()
{
// Connection
while (!Client.Connected)
{
if (!Connect())
Serial.print("pérdida de conexión con el PLC ");
delay(100);
}
prgint = prgint +1 ;
prgbyte = prgbyte + 1;
// Small Data transfer
Client.ReadArea(S7AreaDB, 10, 0, 2, NULL);
// input=S7.WordAt(&Buffer, 2)
input =(PDU.DATA[1]);
Serial.println(input); // Print the first byte received
// Serial.println(PDU.DATA[1]); // Print the second… and so on
// Serial.println(PDU.DATA[2]); // Print the first byte received
// Serial.println(PDU.DATA[3]); // Print the second… and so on
Client.WriteArea(S7AreaDB, 10, 3, 1, 500);
Client.WriteArea(S7AreaDB, 10, 4, 1, prgint);
Client.WriteArea(S7AreaDB, 10, 6, 1, prgbyte);
delay(100);
}
