Icono del sitio ELECTROALL

Como establecer comunicación entre un ARDUINO Y UN PLC a través del protocolo MODBUS (Enviar y recibir datos)

YouTube
YouTube
Instagram
Instagram
GitHub
GitHub
INTRODUCCIÓN

Alguna vez te preguntaste, será posible establecer una comunicación entre  un ARDUINO y un PLC?, la respuesta es SÍ, en este artículo aprenderemos como se realiza paso a paso este enlace. Seguramente a muchos de nosotros nos suena familiar el protocolo de comunicación MODBUS, esta comunicación es una de las comunicaciones estándar que se usa en las industrias para la comunicación de dispositvos plc’s, drivers, módulos, etc. Justamente para  establecer el intercambio de datos de un Arduino y un PLC usaremos el mismo protocolo ya antes mencionado, el cual nos permitirá el intercambio de lecturas de señales digitales, señales analógicas y otros datos. Por consiguiente, en este episodio mandaremos señales analógicas desde un arduino a un dispositivo PLC Siemens S7 1200, para que posteriormente el dispositivo PLC realice un acción de acuerdo a los datos recibidos. por ejemplo, que se active una salida cuando el valor analógico sea mayor igual a 500. 

ENVIAR UN DATO ANALÓGICO DESDE ARDUINO AL PLC
DISPOSITIVOS
  1. PLC S7 1200 (siemens)
  2. Arduino UNO
  3. Módulo Ethernet ENC28J60
  4. Potenciometro 10k Ohm
  5. Router (Cualquiera)
  6.  02 cables Red (RJ45)
CONEXIONES  ENTRE (Arduino – Módulo ethernet -PLC) PARA LA LECTURA ANALÓGICA

Las conexiones que se va a realizar a continuación es para la lectura analógica; donde se enviará datos analógicos (potenciometro) desde la tarjeta arduino UNO 

CÓDIGO ARDUINO

DESCARGAR LIBRERÍAS MODBUS

/* 
                MODIFICADO POR  :{==[=======>>>> ELECTROALL <<<<<=======]==}
                INSTAGRAM       : https://www.instagram.com/carlos_j_fuentess/ 
                                  ó  @carlos_j_fuentess
                FACEBOOK        : https://web.facebook.com/ELECTROALL.ELECTRONICA/?_rdc=1&_rdr
                PÁGINA WEB      : https://www.electroallweb.com/
                YOUTUBE         : https://www.youtube.com/c/ELECTROALL
           ________________________________________________________

 {==[=======> (ENVIANDO DATOS ANALÓGICOS DESDE ARDUINO A PLC S7 1200) <=======]==}
           ________________________________________________________
*/

#include <EtherCard.h>   
#include <Modbus.h>
#include <ModbusIP_ENC28J60.h>

const int SENSOR_IREG=50;
const int sensorAnalog =A0;
ModbusIP mb;

void setup() {
Serial.begin(9600);// inicializamos el serial com

//dirección MAC
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF,0xFE, 0xED}; 
//dirección IP
byte ip [] = {192,168,1,22};

mb.config (mac,ip);// se confirma las direcciones 
mb.addIreg(SENSOR_IREG);

}

void loop() {
mb.task();// actualiza para el trabajo se realize 
          // con normalidad

  // envía los valores del potenciometro 
  mb.Ireg(SENSOR_IREG, analogRead(sensorAnalog));

//muestra en el monitor serie los valores del pot4
  Serial.println(analogRead(sensorAnalog));

}
Programa TIA PORTAL (PLC S7 1200 Siemens)

ENLAZANDO PLC A UNA RED DE TRABAJO Se tiene que establecer la dirección IP para trabajar en una sola Red de esa manera tener una satisfactoria conexión  entre ambos dispositivos (PLC – ARDUINO). Para hacer este cambio se tiene que dirigir al árbol de proyecto y, seleccione configuración de dispositivo , luego haga doble click en el puerto profinet, y seguidamente cambie la dirección IP, en realidad se puede colocar la dirección que ud desee, siempre en cuando pertenezca a la conectividad IP_V4, Ejemplo:

      • 192.168.1.10
      • 192.168.1.15
      • 192.168.1.22
      • 192.168.2.40Para la demostración de este episodio usaremos la segunda dirección IP: 192.168.1.15 

CREAR BLOQUE DE DATOS PARA ALMACENAR LOS VALORES DEL ARDUINO Crearemos bloque de datos para establecer comunicación  y recibir datos del ARDUINO, para ello nos dirigimos al árbol del proyecto, seguidamente abrimos bloques de programa, luego creamos un bloque de datos(ARDUINO [DB]). Dentro de bloque de datos modificamos los parámetros como se muestra en la siguiente imagen.

SACAR LA FUNCIÓN MODBUS CLIENT En la parte principal de bloques de programa sacaremos la función MODBUS CLIENT (MB_CLIENT), esto nos facilitará el recojo de datos del potenciometro que viene del arduino, para posteriormente usar dichos datos para activar salidas etc.  

ACTIVANDO UNA SALIDA: Finalmente haremos una pequeña demostración, la cual consta en activar una salida. Es decir; cuando el valor del pontenciómetro sea >=500 (mayor igual), entonces que se encienda la salida Q0.1.

VIDEO

ENVIAR VARIOS DATOS ANALÓGICOS DESDE ARDUINO AL PLC 

DISPOSITIVOS
  1. PLC S7 1200 (siemens)
  2. Arduino UNO
  3. Módulo Ethernet ENC28J60
  4.  03 Potenciometros 10k Ohm
  5. Router (Cualquiera)
  6.  02 cables Red (RJ45)

CONEXIONES  ENTRE (Arduino – Módulo ethernet -PLC) PARA LAS LECTURAS ANALÓGICAS

Las conexiones que se va a realizar a continuación es para las lecturas analógicas; donde se enviará datos analógicos (potenciometros) desde la tarjeta arduino UNO  al PLC.

CÓDIGO ARDUINO
/* 
                MODIFICADO POR  :{==[=======>>>> ELECTROALL <<<<<=======]==}
                INSTAGRAM       : https://www.instagram.com/carlos_j_fuentess/ 
                                  ó  @carlos_j_fuentess
                FACEBOOK        : https://web.facebook.com/ELECTROALL.ELECTRONICA/?_rdc=1&_rdr
                PÁGINA WEB      : https://www.electroallweb.com/
                YOUTUBE         : https://www.youtube.com/c/ELECTROALL
           ________________________________________________________

 {==[=======> (ENVIANDO DATOS ANALÓGICOS DESDE ARDUINO A PLC S7 1200) <=======]==}
           ________________________________________________________
*/

#include <EtherCard.h>   
#include <Modbus.h>
#include <ModbusIP_ENC28J60.h>

const int SENSOR_IREG=50;
const int sensorAnalog =A0;

const int SENSOR_IREG1=60;
const int sensorAnalog1 =A1;

const int SENSOR_IREG2=70;
const int sensorAnalog2 =A2;

ModbusIP mb;

void setup() {
Serial.begin(9600);// inicializamos el serial com

//dirección MAC
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF,0xFE, 0xED}; 
//dirección IP
byte ip [] = {192,168,1,22};

mb.config (mac,ip);// se confirma las direcciones 
mb.addIreg(SENSOR_IREG);
mb.addIreg(SENSOR_IREG1);
mb.addIreg(SENSOR_IREG2);

}

void loop() {
mb.task();// actualiza para el trabajo se realize 
          // con normalidad

  // envía los valores de los respectivos potenciometro 
  mb.Ireg(SENSOR_IREG, analogRead(sensorAnalog));
  mb.Ireg(SENSOR_IREG1, analogRead(sensorAnalog1));
  mb.Ireg(SENSOR_IREG2, analogRead(sensorAnalog2));
//muestra en el monitor serie los valores del pot4
  Serial.println(analogRead(sensorAnalog));

}

PROGRAMA TIA PORTAL (PLC Siemens S7 1200)

En cuanto a las diagramas de programación son similares a los  que se muestra en el primer ejercicio, la única diferencia es que se cambia la dirección de las entradas analógicas. Ver el video.

VIDEO

ENVIAR VARIOS DATOS DIGITALES DESDE ARDUINO AL PLC 
DISPOSITIVOS
  1. PLC S7 1200 (siemens)
  2. Arduino UNO
  3. Módulo Ethernet ENC28J60
  4.  Pulsadores 
  5. Router (Cualquiera)
  6.  02 cables Red (RJ45)
CONEXIONES  ENTRE (Arduino – Módulo ethernet -PLC) PARA LAS LECTURAS DIGITALES

Las conexiones que se va a realizar a continuación es para las lecturas analógicas; donde se enviará datos analógicos (potenciometros) desde la tarjeta arduino UNO  al PLC.

CÓDIGO ARDUINO
/* 
                MODIFICADO POR  :{==[=======>>>> ELECTROALL <<<<<=======]==}
                INSTAGRAM       : https://www.instagram.com/carlos_j_fuentess/ 
                                  ó  @carlos_j_fuentess
                FACEBOOK        : https://web.facebook.com/ELECTROALL.ELECTRONICA/?_rdc=1&_rdr
                PÁGINA WEB      : https://www.electroallweb.com/
                YOUTUBE         : https://www.youtube.com/c/ELECTROALL
           ________________________________________________________

 {==[=======> (ENVIANDO DATOS ANALÓGICOS DESDE ARDUINO A PLC S7 1200) <=======]==}
           ________________________________________________________
*/

#include <EtherCard.h>   
#include <Modbus.h>
#include <ModbusIP_ENC28J60.h>

const int SENSOR_IREG1=60;
const int button1 =2;

const int SENSOR_IREG2=70;
const int button2 =3;

ModbusIP mb;

void setup() {
Serial.begin(9600);// inicializamos el serial com

pinMode (button1,INPUT);
pinMode (button2,INPUT);

//dirección MAC
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF,0xFE, 0xED}; 
//dirección IP
byte ip [] = {192,168,1,22};

mb.config (mac,ip);// se confirma las direcciones 
mb.addIreg(SENSOR_IREG1);
mb.addIreg(SENSOR_IREG2);

}

void loop() {
mb.task();// actualiza para el trabajo se realize 
          // con normalidad

  mb.Ireg(SENSOR_IREG1,digitalRead(button1));
  mb.Ireg(SENSOR_IREG2,digitalRead(button2));
//muestra en el monitor serie los valores de la entrada del boton 1
  Serial.println(digitalRead(button1));

}

PROGRAMA TIA PORTAL (PLC Siemens S7 1200)

En cuanto a las diagramas de programación son similares a los que se muestra en el primer ejercicio, la única diferencia es que se cambia la dirección de las entradas analógicas. Ver el video.

POSICIÓN DE LOS BITS EN LAS VARIABLES (MW).
VIDEO

INTRODUCCIÓN

Hace poco un cliente me pidió que hiciera un tablero eléctrico controlado por un PLC SIEMENS, donde se requería más 6 entradas analógicas de voltaje. Sin embargo, me encontré con un problema, el PLC s7 1200 solo trae 2 entradas análogas, por lo que aún me faltaba 4 más. Entonces fui a cotizar a las tiendas pertinente un módulo de entradas analógicas de 0 a 10v. No obstante, estos dispositivos estaban muy caros. En consecuencia a esto me puse a crear un módulo de entradas analógicas que sea capaz de mandar las señales a través del puerto ethernet. Y sí efectivamente ya hemos concluidos este módulo que incluye 8 entradas analógicas de 0-10V, y hoy en este video te voy ensañar y explicar a como a hacer módulos para PLC SIEMENS., te interesa? Pues acompáñenme a ver el video.

CARACTERÍSTICA TÉCNICAS
  1. Tensión de alimentación……………………….…………24VDC
  2. Corriente de alimentación………………….……………80mA
  3. Tensión de entrada(recomendado)…………………24VDC
  4. Entradas analógicas  ( 0-10VDC )………………………8
  5. Puerto ethernet…………………………………………………….1
  6. Programación Directa…………………………………………PC-BOARD MAIN
  7. Condiciones ambientales min……………………….….-40°
  8. Condiciones ambientales max…………………..……….85°
  9. Dimensiones……………………………………………………………. 64*80mm
  10. Empotrable………………………………………………………………SÍ
LISTA DE COMPONENTES ELECTRÓNICOS
Categoría Cantidad Referencias Valor PCB Package Coste unitario
Condensadores 20 C1,C5,C6,C7,C8,C9,C10,C11,C15,
C16,C17,C18,C19,C20,C21,C22,
C23,C27,C29,C31
100nF 0603_CAP $0.004
Condensadores 1 C2 2000uF ELEC-RAD25 $0.119
Condensadores 2 C3,C4 18pF CAPC1608X87 $0.004
Condensadores 2 C12,C26 470uF CAP SMD 10.5X10MM ALUMINUM 470UF/35V $0.570
Condensadores 3 C13,C24,C25 220uF CAP SMD 6.3X7.7MM ALUMINUM 220UF/16V $0.030
Condensadores 1 C14 100nF 1206_CAP $0.013
Condensadores 1 C28 10uF 0805_CAP $0.035
Condensadores 1 C30 47uF CAP SMD 5X5.4MM ALUMINUM 47UF/16V $0.030
Resistencias 4 R1,R2,R3,R19 10k 0603_RES $0.001
Resistencias 22 R4,R5,R6,R7,R8,R9,R10,R11,R12,
R18,R20,R21,R22,R24,R25,R26,
R27,R28,R29,R30,R31,R32
1k 0603_RES $0.003
Resistencias 1 R13 2.7k 0603_RES $0.003
Resistencias 4 R14,R15,R16,R17 49.9 0805_RES $0.005
Resistencias 1 R23 1M 0603_RES $0.002
Resistencias 1 R33 6.8k 0603_RES
Resistencias 1 R34 2k 0603_RES
Resistencias 8 R35,R36,R37,R38,R39,R40,R41,R42 10k 1206_RES
Integrados 4 U1,U2,U7,U8 LM358N SO8 $0.043
Integrados 1 U3 ENC28J60-I/SS SSOP28 V1 $3.055
Integrados 1 U4 ATMEGA328P QFP80P900X900X120-32 $2.190
Integrados 1 U5 CH340C SO16 $0.500
Integrados 1 U6 LM2576-adj TO170P1410X464-6 $0.413
Integrados 2 U9,U11 LD1117S50 SOT230P700X180-4
Integrados 1 U10 LD1117S33 SOT230P700X180-4 $0.065
Diodos 8 D1,D2,D3,D4,D7,D8,D9,D10 MM3Z5V1T1G SOD-323 $0.018
Diodos 2 D5,D11 B330A-13-F DIOM5226X230N $0.112
Diodos 1 D6 LED-RED LEDC2012X120 $0.021
Miscelánea 1 BTN1 RST BUTTON SMD 2P $0.016
Miscelánea 4 J1,J3,J4,J5 TBLOCK-M2 TERMINAL BLOCK 2P $0.200
Miscelánea 1 J2 TBLOCK-M3 TERMINAL BLOCK 3P $0.100
Miscelánea 1 J6 JACK USB 2 TIPO B JACK USB 2.0 TYPE B $0.110
Miscelánea 1 L1 HF70ACC201209 INDC2012X130 $0.065
Miscelánea 1 L2 100u INDUCTOR 100UH $0.550
Miscelánea 1 RJ1 RJ45/HR RJ45/NORMAB $1.371
Miscelánea 1 X1 CRYSTAL XTAL18 V1 $0.090
Miscelánea 1 X2 CRYSTAL SMD S OSCILADOR SMD CERAMIC RESONATORS $0.445
CONEXIONES EXTERNAS BOARD – ETHERNET
CÓDIGO ARDUINO
/*
                MODIFICADO POR  :{==[=======>>>> ELECTROALL <<<<<=======]==}
                INSTAGRAM       : https://www.instagram.com/carlos_j_fuentess/
                                  ó  electroall_
                FACEBOOK        : https://web.facebook.com/ELECTROALL.ELECTRONICA/?_rdc=1&_rdr
                PÁGINA WEB      : https://www.electroallweb.com/
                YOUTUBE         : https://www.youtube.com/c/ELECTROALL
           ________________________________________________________
  {==[=======> (ENVIANDO DATOS ANALÓGICOS DESDE ARDUINO A PLC S7 1200) <=======]==}
           ________________________________________________________
*/
#include <EtherCard.h>
#include <Modbus.h>
#include <ModbusIP_ENC28J60.h>

const int SENSOR_IREG0 = 10;
const int SENSOR_IREG1 = 20;
const int SENSOR_IREG2 = 30;
const int SENSOR_IREG3 = 40;
const int SENSOR_IREG4 = 50;
const int SENSOR_IREG5 = 60;
const int SENSOR_IREG6 = 70;
const int SENSOR_IREG7 = 80;

const int sensorAnalog0 = A0;
const int sensorAnalog1 = A1;
const int sensorAnalog2 = A2;
const int sensorAnalog3 = A3;
const int sensorAnalog4 = A4;
const int sensorAnalog5 = A5;
const int sensorAnalog6 = A6;
const int sensorAnalog7 = A7;

ModbusIP mb;

void setup() {
  //dirección MAC
  byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  //dirección IP
  byte ip [] = {192, 168, 1, 22};
  mb.config (mac, ip); // se confirma las direcciones

  mb.addIreg(SENSOR_IREG0);
  mb.addIreg(SENSOR_IREG1);
  mb.addIreg(SENSOR_IREG2);
  mb.addIreg(SENSOR_IREG3);
  mb.addIreg(SENSOR_IREG4);
  mb.addIreg(SENSOR_IREG5);
  mb.addIreg(SENSOR_IREG6);
  mb.addIreg(SENSOR_IREG7);

}

void loop() {
  mb.task();// actualiza para el trabajo se realize con normalidad

  // envía los valores de la entrada de corriente
  mb.Ireg(SENSOR_IREG0, analogRead(sensorAnalog0));
  mb.Ireg(SENSOR_IREG1, analogRead(sensorAnalog1));
  mb.Ireg(SENSOR_IREG2, analogRead(sensorAnalog2));
  mb.Ireg(SENSOR_IREG3, analogRead(sensorAnalog3));
  mb.Ireg(SENSOR_IREG4, analogRead(sensorAnalog4));
  mb.Ireg(SENSOR_IREG5, analogRead(sensorAnalog5));
  mb.Ireg(SENSOR_IREG6, analogRead(sensorAnalog6));
  mb.Ireg(SENSOR_IREG7, analogRead(sensorAnalog7));

}
DOWNLOAD SOLID WORKS && tia portal v16
VIDEO
Salir de la versión móvil