PROBLEMA 21:Diseñar un automatismo que clasifique tres tamaños de paquetes diferentes, con las siguientes indicaciones:
Al pulsar sobre marcha (m) arrancará la CINTA1, la cual contiene paquetes de diferentes tamaños. Esta CINTA1 podrá pararse, si se desea, mediante un pulsador de paro (p). En caso de activación simultánea de ambos pulsadores, p tiene prioridad sobre m.
Al llegar el primer paquete al sensor S1 se parará la CINTA1 y arrancará la CINTA2.
Para averiguar el tamaño del paquete se dispone de tres sensores S1, S2 y S3. Si solo un sensor es el que está activo el paquete será pequeño. Si solo dos sensores estan activos al mismo tiempo el paquete será mediano y si los tres sensores estan activos al mismo tiempo el paquete será grande.
Al llegar el paquete al sensor S4 se para la CINTA2 y se activa el cilindro de doble efecto (C.D.E.) A, el cual si el paquete es pequeño o mediano lo eleva hasta el final de carrera a1. Sin embargo si el paquete es grande lo eleva hasta a2.
Al llegar el C.D.E. A, a a1 se detiene y se activa el C.D.E. B si el paquete es pequeño o se activa el C.D.E. C si el paquete es mediano.
Si el paquete es grande al llegar el C.D.E. A a a2 se activa el C.D.E. D.
Cuando cualquiera de los tres cilindros B, C o D hayan llegado a su final de carrera destino (b1, c1 y d1) deben retroceder tanto ellos como el cilindro A.
Cuando tanto el cilindro A como uno de los cilindros B, C o D hayan regresado a sus finales de carrera origen (a0,b0,c0,d0) la CINTA1 arrancará de nuevo para clasificar otro paquete.
Los distribuidores para los cilindros de doble efecto B, C y D son de 5 vías/2 posiciones con entradas B, BN, C, CN, D y DN respectivamente.
El distribuidor para el cilindro de doble efecto A es de 4 vías/3 posiciones con entradas A y AN.
SOLUCION por
GRAFCET:
En el GRAFCET se ha utilizado para los motores de las cintas transportadoras y para las entradas a los distribuidores, la siguiente notación:
CIN1: activación del motor de la CINTA1
CIN2: activación del motor de la CINTA2
A: avance del cilindro A B: avance del cilindro B
AN: retroceso del cilindro A BN: retroceso del cilindro B
C: avance del cilindro C D: avance del cilindro D
CN: retroceso del cilindro C DN: retroceso del cilindro D
●
Asignación de entradas y salidas a los ports, a las direcciones 0x20, 0x21 de la RAM y a los registros de desplazamiento paralelo-serie 74LS165El automatismo posee 15 entradas (m,p,S1,S2,S3,S4,a0,a1,a2,b0,b1,c0,c1,d0,d1) y 10 salidas (CIN1,CIN2,A,AN,B,BN,C,CN,D,DN). Se utilizaran dos registros de desplazamiento para meter en ellos todas las entradas. Las salidas se repartiran entre el PORTA y el PORTB.
Programa:
// P21_1.C
#include <16f84a.h>
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#byte DIRent20 = 0x20 // Variable para almacenar los valores de m, p, S1, S2, S3,
// S4, a0 y a1
#bit DIRent20_0 = 0x20.0 // Variable auxiliar para introducir datos del registro al PIC
#bit m = 0x20.0 // Entrada: pulsador de marcha m
#bit p = 0x20.1 // Entrada: pulsador de paro p
#bit S1 = 0x20.2 // Entrada: sensor S1
#bit S2 = 0x20.3 // Entrada: sensor S2
#bit S3 = 0x20.4 // Entrada: sensor S3
#bit S4 = 0x20.5 // Entrada: sensor S4
#bit a0 = 0x20.6 // Entrada: final de carrera a0
#bit a1 = 0x20.7 // Entrada: final de carrera a1
#byte DIRent21 = 0x21
#bit DIRent21_0 = 0x21.0
#bit a2 = 0x21.0 // Entrada: final de carrera a2
#bit b0 = 0x21.1 // Entrada: final de carrera b0
#bit b1 = 0x21.2 // Entrada: final de carrera b1
#bit c0 = 0x21.3 // Entrada: final de carrera c0
#bit c1 = 0x21.4 // Entrada: final de carrera c1
#bit d0 = 0x21.5 // Entrada: final de carrera d0
#bit d1 = 0x21.6 // Entrada: final de carrera d1
#byte port_a = 5
#byte port_b = 6
main()
{
static short Si,CIN1,CIN2,A,AN,B,BN,C,CN,D,DN;
static short I,E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14;
static char n;
set_tris_a(0x10); // Si entrada, CK, PL, D y DN salidas
set_tris_b(0x00); // CIN1,CIN2,A,AN,B,BN,C y CN salidas
port_a=0;
port_b=0;
I=1; // Inicialización del GRAFCET
while(1)
{
// TOMA DE DATOS: DESPLAZAMIENTO DE LAS ENTRADAS A LAS
// DIRECCIONES 0x20 Y 0x21
output_bit(PIN_A2,0); // Se activa la entrada de carga en || de los dos 74165,
// (PL=0)
delay_us(1); //Retardo de 1µs
output_bit(PIN_A2,1); // Se desactiva la entrada de carga en || de los dos
// 74165, (PL=1)
for(n=0;n<=6;n++) // Entran en 0x20: a1,a0,S4,S3,S2,S1,p
{
DIRent20_0=input(PIN_A4); // PIN_A4 (entrada Si) conectado a
// Q7 del registro
DIRent20=DIRent20 << 1; // Desplazamiento izquierda de 0x20
output_bit(PIN_A3,1); // Nivel alto del pulso de reloj (CK=1)
delay_us(1); //Retardo de 1µs
output_bit(PIN_A3,0); // Nivel bajo del pulso de reloj (CK=0)
delay_us(1); //Retardo de 1µs
}
DIRent20_0=input(PIN_A4); // Entra en 0x20: m
output_bit(PIN_A3,1); // Se manda un pulso de reloj para dejar
delay_us(1); // preparado para entrar en 0x21 al
output_bit(PIN_A3,0); // bit Q7 del 2º registro (este bit, en este
delay_us(1); // problema no tiene entrada asignada)
for(n=0;n<=6;n++) // Entran en 0x21: -,d1,d0,c1,c0,b1,b0
{
DIRent21_0=input(PIN_A4); // PIN_A4 (entrada Si) conectado a
// Q7 del registro
DIRent21=DIRent21 << 1; // Desplazamiento izquierda de 0x21
output_bit(PIN_A3,1); // Nivel alto del pulso de reloj (CK=1)
delay_us(1); //Retardo de 1µs
output_bit(PIN_A3,0); // Nivel bajo del pulso de reloj (CK=0)
delay_us(1); //Retardo de 1µs
}
DIRent21_0=input(PIN_A4); // Entra en 0x21: a2
//------------------------------------------------------------------------------------------------------------
if (I || E1 && p ) // ETAPA 0
{
E0=1;
E1=0;
I=0;
}
// ------------------------------------- ACTIVACIÓN CINTA1 ---------------------------------------
if (E0 && m && !p || E12 && a0 && b0 || E13 && a0 && c0 || E14 && a0 && d0) // ETAPA 1
{
E1=1;
E0=0;
E12=0;
E13=0;
E14=0;
}
// ---------------------------------------- ACTIVACIÓN CINTA2 ------------------------------------
if (E1 && S1) // ETAPA 2
{
E2=1;
E1=0;
}
// -------------------------------- CICLO PAQUETES PEQUEÑOS --------------------------------
if (E2 && S3 && !S2 && !S1) // ETAPA 3
{
E3=1;
E2=0;
}
if (E3 && S4) // ETAPA 6
{
E6=1;
E3=0;
}
if (E6 && a1) // ETAPA 9
{
E9=1;
E6=0;
}
if (E9 && b1) // ETAPA 12
{
E12=1;
E9=0;
}
// --------------------------------- CICLO PAQUETES MEDIANOS -------------------------------
if (E2 && S3 && S2 && !S1) // ETAPA 4
{
E4=1;
E2=0;
}
if (E4 && S4) // ETAPA 7
{
E7=1;
E4=0;
}
if (E7 && a1) // ETAPA 10
{
E10=1;
E7=0;
}
if (E10 && c1) // ETAPA 13
{
E13=1;
E10=0;
}
// ------------------------------ CICLO PAQUETES GRANDES -----------------------------------
if (E2 && S3 && S2 && S1) // ETAPA 5
{
E5=1;
E2=0;
}
if (E5 && S4) // ETAPA 8
{
E8=1;
E5=0;
}
if (E8 && a2) // ETAPA 11
{
E11=1;
E8=0;
}
if (E11 && d1) // ETAPA 14
{
E14=1;
E11=0;
}
// --------------------------------------------- SALIDAS ------------------------------------------------
CIN1 = E1;
CIN2 = E2 || E3 || E4 || E5;
A = E6 || E7 || E8;
AN = E12 || E13 || E14;
B = E9;
BN = E12;
C = E10;
CN = E13;
D = E11;
DN = E14;
output_bit(PIN_B0,CIN1);
output_bit(PIN_B1,CIN2);
output_bit(PIN_B2,A);
output_bit(PIN_B3,AN);
output_bit(PIN_B4,B);
output_bit(PIN_B5,BN);
output_bit(PIN_B6,C);
output_bit(PIN_B7,CN);
output_bit(PIN_A0,D);
output_bit(PIN_A1,DN);
}
}