Enviar DATOS de sensores a PLC Siemens S7 1200 / 1500

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.... :frowning:

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); 




}

Es difícil decir que puede estar fallando, tienes muchos sistema complejos funcionando y TIA portal y plcsims no son dos de los mas estables. Cuando afirmas que el arduino estaba seco ¿Esto significa que no estabas recibiendo nada por la conexión serial?

**Moderador:**Hola @tatoman, bienvenido al foro Arduino.
En la sección proyectos tienes estos dos hilos que debiste haber leído antes de postear

Como tu consulta es para otra sección lo muevo a Software.
Agradezco que hayas posteado debidamente el código. Solo ubicaste mal tu tópico.

Hola¡¡

Gracias @surbyte, intentaremos ir mejorando donde postear acorde a la consulta ;-).
que razón tenéis, con rebuscar algo más, y hacer más pruebas lógicas, nos evitaríamos consultas.

@PeterKantTropus, si que es verdad que TIA PORTAL va como va, pero el PLC SIM V3.0.. con un buen PC, puedes simular muchas cosas, y conexiones externas, todo excepto protocolo profinet y algunas cosas más. Estas semana de atrás... con tiempo...he llegado a interconectar 4 instancias de PLC SIM entre ellas, cuatro PLC virtuales se diría, y con equipos externos al PC, para lo que es Siemens, eso si, Tia portal V15.1.

Volviendo al Arduino:
Estoy intentando varias cosas para ver que no se queda seco, eso que no recibía ni por SERIAL ni escribía en el PLC.

El primer cambio es estructurar bien el programa, que se ve muy sucio, con mis comentarios y demás partes que voy quitando para las pruebas,

Segundo agrupar todos los datos en un solo array y escribirlo con una sola instrucción, en bloque. Con la lectura idem de idem, si quiero leer del S7 hacerlo de esa manera, en bloque y no múltiples solicitudes.

Después de esto, lo dejo todo el día conectado comunicando y a ver que tal resultado da.
las solicitudes son cada 200ms.

Por cierto al final utilice la librería Settimino V1.1.0, ya he encontrado algunos post, como me indicaba surbyte que comentan como modificar la librería V2.0... pero eso ya cuando tenga más soltura.

Por otro lado lo que hecho de prueba para liberar de instrucciones al Arduino, es hacer el cambio de los bytes, la rotación, directamente en el PLC, con dos instrucciones lo tienes. Siempre irá mas sobrado de tiempo ciclo, y en este caso el que me interesa que vaya ágil es el Arduino.

Gracias¡¡¡

Te dejo esta web,el autor tiene muchos videos donde combina arduino con plc siemens.
https://www.electroallweb.com/

Muy buenas,

El problema que tenía en la planta donde trabajo era el siguiente:

Conectar unas células de soldadura, con el ordenador de producción para realizar los conteos de piezas, estados de las máquinas y conexión con el sistema ANDON de la planta, envio de señales de estados de los servicios de la planta tipo aire, agua, gas.... Todas las líneas disponen de sus PLC, tipo Siemens y Schneider. El problema era independizar las redes para no unirlas al anillo general de la planta, ya que eso produce problemas, y es inviable
Hay dispositivos como CP de comunicaciones en el caso de Siemens, pero se van a precios desorbitados para la función que queríamos hacer, desde 400€ a 900€ dependiendo del autómata.

La idea parte de separar redes con rangos distintos y economizar conexiones. Llevo días probando los Arduinos por separado durante horas y horas, y me por ahora me convencen por la estabilidad del código

Utilizo dos Arduino 1 más dos ethernet Shield.

En cada Arduino he subido el mismo programa, de manera que he utilizado las librerias Modbus, y el programa vale para los dos simplemente cambiando la IP que corresponda en la red que se conecte.

El Arduino 1 por ejemplo, está conectado a la red del PLC de la línea, el PLC de esa máquina le escribe con protocolo Modbus 10 palabras y lee otras 10 de la memoria del arduino. Este Arduino le pasa por puerto serie con intervalo de 100ms al otro Arduino 4 palabras de 2 byte que son datos de la máquina para enviar al sistema superior de la planta.

El Arduino 2 recibe por datos serie esas 4 palabras y las mapea al Servidor MODBUS. Este arduino 2 es al que accede el sistema de planta leyendo esas palabras para saber el estado de la maquina. si esta produciendo, piezas que se producen y las señales del Andon de planta para su estado. Desde el sistema de planta podemos enviar 4 palabras de información, que le llegaran al PLC por el mismo camino, via puerto serie y la memoria del Map Modbus del Arduino 1.

Creo que me he explicado bien de la función que quiero hacer.
Os dejo el código, mañana probare en la planta su funcionamiento real y subiré fotos.
He intentado hacer el código igual para que solo cambiando la IP se pueda utilizar en los dos arduinos, y de paso he hablado con IT de mi empresa para hacer un map estandard de esas señales entre máquinas.

He de decir que en todo momento estoy utilizando comunicación Modbus, en los dos Arduino.

Las pruebas que he hecho en simulaciones me han funcionado, a ver en planta.
Aquí va el código, si veis que se puede mejorar, perfecto o incluso hacer la comunicación serie más estable para pasar mas de 4 palabras de golpe.

Quiero hacer el siguiente paso, que es hacer un segundo puerto por Software y liberar el principal por si tengo que hacer test y utilizarlo.

Mas o menos le refresco de variables se hace hasta 100ms, por lo que es sobrado para estas funciones de control, lo subiré a 500ms en todo el sistema para no saturar a los equipos.
En pruebas directas con cable/cable he llegado a 50ms de refresco, si errores, con algún delay por modbus, y sin problemas. Lo comento pro si alguien quiere utilizarlo para algo que requiera velocidad de refresco. Las librerías Modbuds están modificadas para solo utilizar lectura de Holding Registres y COILS, nada de analógicas o entradas.

Salu2¡

200610_V3_Servidor_MODBUS_LADO_PLC.zip (6.39 KB)

Porque si este hilo tiene clara conexión con este proyecto no forma parte del mismo?

https://forum.arduino.cc/index.php?topic=686906.msg4620006#msg4620006

Te dije oportunamente que podias empezar por alli y conforme avanzaras volveríamos a ver si se trataba o no de un proyecto.
Justamente si lo desarmas, pocas personas verán que se trata de lo mismo.

Si te interesa juntamos las piezas.

Hola de nuevo Surbyte, gracias por la apreciación de que había abierto varios hilos, y completamente de acuerdo que están enlazados.

Por mi parte no hay problema de juntarlos, aunque no sabría como hacerlo

Es interesante si alguien lo ve, pq llevo varias semanas haciendo pruebas en la planta con ma´quinas reales y hay cosas que se me escapan. Creo que cuando juntas varias comunicaciones, como el puerto serie modo duplex, comunicación por ethernet y protocolos como Modbus y comunicaciones, los Delay no ayudan en nada, y tengo que comprender como fluye el programa del Aruduino, ya que estoy teniendo pérdidas de conexión..etc.. pero el arduino sigue corriendo... ya voy algo perdido.

Ya he estado mirando docu del Foro de cambiar delay, por millis(), para correr el loop principal sin interrupciones, que creo que es lo que me está matando. en la simulación de casa todo bien, y en planta...plafff

Si los juntas actualizaré todo lo que he ido haciendo, los progresos que han sido pocos y lo que me voy encontrando. El proyecto es interesante pq no abre unas opciones interesantes en donde trabajo.

Gracias de nuevo

La pregunta es ¿Por que Arduino? Cuando tengo problemas en inter conectar PLCs con una red ethernet/IP, ya sea que el PLC es obsoleto o los módulos son caros o difíciles de conseguir , utilizo HMI industriales chinescas como puente entre redes. Suele ser mas sencilla y estable la conexión, y tiene el valor agregado de la parte "visual" (todo el mundo se entera que hiciste algo) .

El tema de los HMI es otra opción que no había planteado o tenido en cuenta por no profundizar en según qué campos, si tienen diferentes adaptadores ethernet para independizar redes, lo mirare. Porque Arduino? por su bajo coste, supongo que con más conocimiento de Arduino del q tengo, sería más fácil, pero vamos q tb lo quiero utilizar para más cosas. Me permiten unir varios PLC, intercambiar no muchos datos, pq no logro estabilidad,más 4word por serie se cuelgan comunicaciones, y poder añadir sensorica a las celdas, que no influyen en el proceso. Por ejemplo el futuro Andon lo estoy preparando con Arduino.
Al final lo q busco con el arduino, q sea periferia, conectado a sistema superior más potente que sea el que gobierne todos esos pequeños equipos.

@PeterKantTropus, ya me darás pistas de que HMI, necesito agilizar muchas cosas, pero los Arduino no los pierdo para ostras cosas.

Gracias!!!

Bueno, como de trastear y aprender se trata, voy comentando mejoras.

Después de pegarme un mes haciendo pequeñas pruebas y jugando con el MODBUS, decidí seguir con la comunicación S7 directamente.

Avances:

  • La comunicación de los Arduinos y Ethernet Shield con los PLC Siemens y la librería Settimino V1.0.0 ha funcionado perfectamente, solamente que cuando conectaba los puertos Serie para intercambiar los datos, se quedaban colgados.... y mi conocimiento no llegaba a mucho mas de saber el porque, ni jugando con Delays, ni con función millis, ni haciendo secuencias......

  • El siguiente paso fue utilizar el intercambio de datos por Bus I2c, y el resultado excelente, intercambiando hasta 9 palabras en ambas direcciones y sin problemas, con maestro y esclavo. con un escaneo de 500ms me sobra. Supongo que esta comunicación al ser sincrona, o eso creo, hace que las rutinas funcionen mejor.

-Mañana actualizaré código con el Settimino V2. subiré programas y las fotos del sistema, sencillo, pero ya va dando pequeños pasos para lo que lo necesitamos. Quiero utilizar la V2, para utilizar tarjetas con el ESP8266 y conectar pequeñas máquinas vía WIF al control de planta, PLC Siemens.

Un saludo