DISPOSITIVO PARA REMACHAR ELECTRONEUMÁTICO (A+/B+/TEMP/B-/A-/A+/A-)
ARDUINO BASADO EN LADDER
Aprende a programar Arduino desde una solución LADDER con una metodología confiable https://youtube.com/playlist?list=PLHTERkK4EZJq9hjTGCDQmaLvi7CAyk_q_
DIAGRAMA ESPACIO/FASE
ESPECIFICACIONES DEL CONTROL
1. El sistema de control debe permitir la selección entre Ciclo Único (CU), Ciclo Continuo (CC) o Ciclo X3.
2. El CC o CX3 deben quedar interrumpido (termina el ciclo actual y se detiene en posición inicial) por la acción de conmutar a CU (solicitud de parada a fin de Ciclo) o mediante el pulsador de Paro de Emergencia (PE) o cuando no hay más PIEZA (interruptor abierto).
3. El dispositivo se explora a través de un detector de PIEZA (interruptor cerrado), sin la presencia de PIEZA, no puede iniciar ningún ciclo.
4. Cuando se terminan las piezas en el depósito de gravedad y está en modo CC o Cx3, debe terminar el ciclo en el que está y al terminarlo, ha de pararse la instalación en su posición base (inicial).
5. Después de haber realizado los (3) tres ciclos del modo CX3 sólo puede iniciarse el funcionamiento en cualquier otro ciclo después de pulsar RESET. No debe haber ningún movimiento de a máquina al pulsar RESET, para iniciar cualquier ciclo deben usarse cualquiera de los pulsadores CU, CC o CX3.
6. Una vez accionado el pulsador de Paro de Emergencia, deben retornar inmediatamente todos los cilindros a la posición de partida, pero el sistema debe asegurar que el cilindro A regrese solo cuando el cilindro B lo haya hecho completamente. Debiendo quedar al final los dos cilindros retraídos en su posición inicial. Es decir primero verifica el retorno del cilindro B y después el retorno del cilindro A.
7. En el modo CC o en CX3 el sistema debe asegurar una temporización entre ciclos.
Aplicando los conocimientos adquiridos sobre control de sistemas electroneumáticos y apoyado n las m facilidades de simulación que ofrece el software Fluid Sim P se logró encontrar un circuito de control eléctrico que diera respuesta a cada una de las siete (7) especificaciones dadas anteriormente.
VER VIDEO DE APOYO
METODOLOGÍA PASO A PASO PARA REALIZAR CIRCUITOS ELECTRONEUMÁTICOS EN LADDER Realiza la simulación de un circuito electroneumático complejo paso a paso y siguiendo una
metodología.
https://youtube.com/playlist?list=PLHTERkK4EZJrSElocHbXzjzLjKXq8RjIV
8.
Fig. Circuito de control eléctrico que cumple con las especificaciones de control
COM1 PIN 7
PIN 6 PIN 23
PIN 27
Y1
Y3
A1 A2
A1 A2
3 4
PIN 25
Y2
A1 A2
PIN 14 4
1
PIN 15 A1
A0 1 4
1 4
B1 B0 1 4
1 4
PIN 16
PIN 18 C U
C
C
PE 1
PIN 13 PIN 12
PIN 8 C X 3
RESET
PIN 9
CONEXIÓN DE ENTRADAS Y SALIDAS ARDUINO MEGA
ENTRADAS
SALIDAS
+24 V
0V
+24 V 0V +24 V 0V
COM C
O N E X I Ó N
D E
E N T R A D A S
Y
S A L I D A S
ARDUINO MEGA
ALIMENTACIÓN DEL ARDUINO D
I S P O S I T I V O
P A R A
R E M A C H A R
Interruptor PIEZA
PROGRAMA EQUIVALENTE EN EL ARDUINO- IDE
/// TRATAMIENTO PREVIO
/// DISPOSITIVO PARA REMACHAR //DECLARACION DE VARIABLES
//Declaración de las variables Ki corresponden a las reles/memorias utilizadas para el circuito/programa
//Declaración de las variables de las entradas corresponden a las Entradas de pulsador NO (Normalmente abiertos) utilizadas para el circuito/programa
//La designación Y1 y Y2 corresponde a los pine de salidas acoplada a las bobinas de la electroválvula 5/2 biestable
int K1 = 0;
int K2 = 0;
int K3 = 0;
int K4 = 0;
int K5 = 0;
int K6 = 0;
int K7 = 0;
int K8 = 0;
int K9 = 0;
int K10 = 0;
int K11= 0;
int K12= 0;
int K13= 0;
int K14 = 0;
int K20 = 0;
int K_FIN_CICLO = 0;
int KCC = 0;
int KCX3 = 0;
int R_ESET=0;
// Las memorias asociadas a cada relé se declaran en estado inicial bajo o false.
int CU ;// Hará la función de pulsador de Ciclo Unico int CC ;// Harà la función de pulsador de Ciclo Continuo int CX3 ;// Harà la función de pulsador de 3 Ciclo
int PIEZA; // Harà la función de indicar si hay o no pieza
int A_0 ; // Harà la función de sensor de entrada final de carrera int A_1; // Harà la función de sensor de entrada final de carrera int B_0 ; // Harà la función de sensor de entrada final de carrera int B_1; // Harà la función de sensor de entrada final de carrera int PE; // Harà la función de boton de Paro de Emergencia
int Y1 = 23; // Pin de salida acoplada a las bobinas de la electroválvula 5/2 BI A+
int Y2 = 25; // Pin de salida acoplada a las bobinas de la electroválvula 5/2 BI A- int Y3 = 27; // Pin de salida acoplada a las bobinas de la electroválvula 5/2 MONO B+/-
// Variables asociadas a "temp1".
int T1 = LOW; // Bit asociado al temporizador 1 int activado1 = 0; // Al principio no ha sido activado.
long inicio1, final1, actual1;
// Variables asociadas a "temp1".
int T2 = LOW; // Bit asociado al temporizador 1 int activado2 = 0; // Al principio no ha sido activado.
long inicio2, final2, actual2;
void setup() {
// put your setup code here, to run once:
//Apertura del visualizador serial Serial.begin(9600);
//Declaración de puertos digitales de Entradas y Salidas pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(12, INPUT);
pinMode(13, INPUT);
pinMode(14, INPUT);
pinMode(15, INPUT);
pinMode(16, INPUT);
pinMode(18, INPUT);
pinMode(23, OUTPUT);
pinMode(25, OUTPUT);
pinMode(27, OUTPUT);
//Algunos dispositivos traen una configuración "Sinking and Sourcing"
//por eso es necesario colocar los puertos de salida en 0v.
//Declaración del estado inicial de los pines de las salidas en bajo/apagadas digitalWrite(Y1, LOW);
digitalWrite(Y2, LOW);
digitalWrite(Y3, LOW);
}
//TRATAMIENTO SECUENCIAL void loop() {
// put your main code here, to run repeatedly:
//Capturar valores de puertos digitales de entrada
CU = digitalRead(6); CC = digitalRead(7); CX3 = digitalRead(8);
R_ESET = digitalRead(9); PIEZA = digitalRead(12); PE = digitalRead(13);
A_0 = digitalRead(14); A_1 = digitalRead(15);
B_0 = digitalRead(16); B_1 = digitalRead(18);
if ((( ( (CU | CC | CX3 | T2) & PIEZA & A_0 & B_0 & PE) | K1)) & (!K5)& (!K12) &
(!K14)& (CONTADOR1< PSCONTADOR1)) {K1 = 1;}
else { K1 = 0;}
if ((((K1 & A_1) | K2)) & (!K4) & (!K10)) { K2 = 1; } else {K2 = 0; }
if ((((K2 & B_1) | K3)) & (!K4)& (!K10) & (!K14)) { K3 = 1; } else { K3 = 0; }
if (K3) { activetemp1(); } else { desactivetemp1(); }
if ((T1 | K4) & (!K5)& (!K10) ) { K4 = 1; } else { K4 = 0;}
if ((((K4 & B_0) | K5)) & (!K6)& (!K12)& (!K14)) {K5 = 1; } else { K5 = 0; }
if ((((K5 & A_0) | K6)) & (!K7)& (!K12)& (!K14)) {K6 = 1;} else {K6 = 0; }
if ((((K6 & A_1) | K7)) & (!K12)& (!K14)& (!K_FIN_CICLO)) {K7 = 1;} else { K7 = 0; } if (K7 & A_0) { K_FIN_CICLO = 1;} else {K_FIN_CICLO = 0;}
if ((K_FIN_CICLO | K8) & (!K9) & (KCC | KCX3)) { K8 = 1;}else { K8 = 0;}
if (K8) { activetemp2(); } else { desactivetemp2(); }
if (T2) { K9 = 1;}else { K9 = 0;}
if (KCX3 & K_FIN_CICLO) { K20 = 1; } else { K20 = 0; } if (K20 != ESTADOPREVIO_K20) {
if (K20 == HIGH) { CONTADOR1++;
Serial.print("Numero de Ciclos : ");
Serial.println(CONTADOR1); } ESTADOPREVIO_K20 = K20;
}
if (R_ESET){CONTADOR1 = 0; Serial.println(CONTADOR1); Serial.print("Numero de Ciclos : "); }
if ((CC | KCC) && (!CU)&& PIEZA && PE && (CONTADOR1< PSCONTADOR1) && (!KCX3) ) {KCC = 1;}
else {KCC = 0;}
if ((CX3| KCX3) && PE && PIEZA && (!CU) && (CONTADOR1< PSCONTADOR1) && (!KCC) ) {KCX3 = 1;} else {KCX3 = 0;}
if (((((!PE) & (!B_0)) | K10)) & (!K11)& (!K12)) {K10 = 1;} else { K10 = 0; }
if (K10 & B_0 & A_0) { K11= 1;} else {K11 = 0;}
if (((K10 & B_0 & (!A_0)) | K12) & (!K13)) {K12 = 1;} else { K12 = 0; }
if (K12 & A_0) { K13= 1; } else {K13 = 0;}
if ((((!PE) & B_0) | K14) & (!A_0)) { K14 = 1; } else { K14 = 0; }
// TRATAMIENTO POSTERIOR - ACTIVACIÓN DE LAS SALIDAS/ ACCIONES
if (K1 | K6) {digitalWrite(Y1, HIGH); } else {digitalWrite(Y1, LOW); }
if (K2) {digitalWrite(Y3, HIGH); } else { digitalWrite(Y3, LOW); }
if (K5 | K7 | K12 | K14) {digitalWrite(Y2, HIGH); } else {digitalWrite(Y2, LOW);}
// ACTIVAR LUCES CON LAS BOBINAS
if (K1 | K6) {digitalWrite(29, HIGH);}else {digitalWrite(29, LOW);}
if (K2) {digitalWrite(33, HIGH); } else {digitalWrite(33, LOW);}
if (K5 | K7 | K12 | K14) {digitalWrite(31, HIGH);}else {digitalWrite(31, LOW);}
//SUBRUTINAS DE TEMPORIZACIÓN (Par cada temporización se asigna un subprograma
//activetempx y un desactivetempx usando para ello comparaciones con el comando millis //- - - -
//SUBRUTINA TEMPORIZADOR 1
//- - - -
void activetemp1() {
if (K3 && activado1 == 0) { // Si K1 esta activa y no ha sido activado=0 antes...
activado1 = 1; // marca activado=1 y guarda el tiempo de inicio.
inicio1 = millis();
final1 = inicio1 + 3000;
}
actual1 = millis(); // Consulta el tiempo actual.
if (activado1 == 1 && (actual1 > final1) ) { T1 = HIGH;
} else { T1 = LOW;
}
}
//- - - -
void desactivetemp1() { T1 = LOW;
activado1 = 0; inicio1 = 0;
final1 = 0; actual1 = 0;
}
//- - - -
//SUBRUTINA TEMPORIZADOR 2
//- - - -
void activetemp2() {
if (K8 && activado2 == 0) { // Si XX esta activa y no ha sido activado=0 antes...
activado2 = 1; // marca activado=1 y guarda el tiempo de inicio.
inicio2 = millis();
final2 = inicio2 + 3000;
}
actual2 = millis(); // Consulta el tiempo actual.
if (activado2 == 1 && (actual2 > final2) ) { T2 = HIGH;
} else { T2 = LOW;
} }
//- - - -
void desactivetemp2() { T2 = LOW;
activado2 = 0; inicio2 = 0;
final2 = 0; actual2 = 0;
}
//- - - -