GRAFCET IMPLEMENTADO CON ARDUINO - ESTRUCTURAS BÁSICAS

Page 1

GRAFCET IMPLEMENTADO CON ARDUINO https://youtube.com/playlist?list=PLHTERkK4EZJpJEcByUotJ5YOIiC -Vmimt

Hola jóvenes, en estos enlaces del BLOGG y DEL CANAL, pueden encontrar recursos sobre fundamentos de ingeniería mecatrónica como : SOLIDWORKS, PROGRAMACIÓN DE ARDUINO, HIDRÁULICA – LENGUAJE LADDER , LENGUAJE GRAFCET ,ELECTROHIDRÁULICA , NEUMÁTICA, ELECTRONEUMÁTICA, PLC M221, PLC SIEMEMS S7 1200, PLC SIEMENS S7 300 , FLUID SIM, FACTORY IO, CONTROL, entre otros https://www.mecatrónica.com.co/ https://mecatronicaitsa.blogspot.com/ http://www.youtube.com/c/JovannyDu que?sub_confirmation=1_ Si te ha sido útil, regálame un Like, comenta y suscríbete :) (っ◕‿◕)


SISTEMAS DE AUTOMATIZACIÓN SECUENCIALES IMPLEMENTADOS EN GRAFCET SOBRE ARDUINO

ARDUINO Acceso a PDF

https://play.google.com/books/s/370286768613/ebooks https://mega.nz/folder/a9thTIjA#bSAwbpbG3Z34DW3jJ_bMQg

ARDUINO Aprende a programar Arduino desde una solucio n LADDER o GRAFCET con metodologí as confiables https://youtube.com/playlist?list=PLHTERkK4EZJr7zDQNKjjEyxhErjllCCUy

GRAFCET CON ARDUINO Programa en Arduino sistemas secuenciales simulados en GRAFCET , con un metodo confiable 100% https://youtube.com/playlist?list=PLHTERkK4EZJpJEcByUotJ5YOIiC-Vmimt

Metodología Desarrollada por Ing. Jovanny Duque et al pág. 1


GRAFCET IMPLEMENTADO CON ARDUINO JOVANNY DUQUE MsC - Ing. Mecatronica, Grupo GIIT Institucion Universitaria ITSA

GRAFCET CON ARDUINO Programa en Arduino sistemas secuenciales simulados en GRAFCET , con un metodo confiable 100%

https://youtube.com/playlist?list=PLHTERkK4EZJpJEcByUotJ5YOIiC-Vmimt De los trabajos de A. Ramos, se entiende al Binodo como un elemento de programación que solo puede tener dos estados posibles, S y 𝑆̅ (activado o desactivado). Donde 𝑀𝑖 corresponde a las (V.D.A) variables de activación del binodo y 𝑃𝑗 corresponde a las (V.D.D) variables de desactivación del binodo.

A partir de este modelo se desprende que el comportamiento de un BINODO dentro de la lógica Binodal que puede ser descrito por la expresión matemática:

𝑛

𝑚

𝑆(𝑡) = [(𝑆 + ∑ 𝑀𝑖 ) ∗ ∏ 𝑖=1

Metodología Desarrollada por Ing. Jovanny Duque et al pág. 2

𝑗=1

̅𝑗 ] 𝑃


𝑛

𝐸(𝑖) = [(𝐸(𝑖) ∗ ∏

𝑖=1

𝑛

̅​̅​̅​̅​̅​̅​̅​̅​̅​̅𝑖+1 + ∑ 𝐸𝑇𝐴𝑃𝐴𝑖−1 ∗ 𝐶𝑂𝑁𝐷𝐼𝐶𝐼𝑂𝑁𝐸𝑆𝑖 ) ∗] 𝐸𝑇𝐴𝑃𝐴 𝑖=1

Extrapolando lo anterior para sintetizar el método GRAFCET:

𝑛

𝐸(𝑖) = [(𝐸(𝑖) + ∑ 𝐸𝑇𝐴𝑃𝐴𝑖−1 ∗ 𝐶𝑂𝑁𝐷𝐼𝐶𝐼𝑂𝑁𝐸𝑆𝑖 ) ∗ ∏ 𝑖=1

𝑛 𝑖=1

̅​̅​̅​̅​̅​̅​̅​̅​̅​̅𝑖+1 ] 𝐸𝑇𝐴𝑃𝐴

Las ecuaciones de estado obtenidas anteriormente pueden definirse como el algoritmo que describirá el proceso, este algoritmo se codifico en lenguaje C para implementarlo en ARDUINO , teniendo en cuenta tratamientos previos como la declaración de variables, declaración de puertos de entrada y salida digital y demás consideraciones.

Las operaciones booleanas de suma, producto y negación deben hacerse usando la siguiente sintaxis:

&

Corresponde a la operación booleana AND o producto.

|

Corresponde a la operación booleana OR o suma.

~

Corresponde a la función booleana NOT o de negación.

ENLACES A VIDEOS GRAFCET - ARDUINO https://www.youtube.com/playlist?list=PLHTERkK4EZJpJEcByUotJ5YOIiC-Vmimt

Metodología Desarrollada por Ing. Jovanny Duque et al pág. 3


ESTRUCTURA LINEAL

𝐸(1) = [(𝐸(1) + (𝐸(4) ∗ 𝑆3)) ∗ 𝐸̅2 ]

Note que para la etapa inicial 1 la sumatoria hace

referencia a la etapa anterior i-1, dado que es una etapa inicial dicha etapa anterior corresponderá a la etapa 4.

𝐸(2) = [(𝐸(2) + (𝐸(1) ∗ 𝑆0) ) ∗ 𝐸̅3 ]

𝐸(3) = [(𝐸(3) + (𝐸(2) ∗ (𝑆1 + 𝑆4))) ∗ 𝐸̅4 ]

𝐸(4) = [(𝐸(4) + (𝐸(3) ∗ 𝑆2)) ∗ 𝐸̅1 ] Note que para la etapa final 4 la sumatoria hace referencia a la etapa posterior i+1, dado que es una etapa final dicha etapa posterior corresponderá a la etapa 1.

/// GRAFCET LINEAL EN ARDUINO

//TRATAMIENTO PREVIO //Decalaracion de variables utilizadas para el programa //La designacion E corresponde a una "Etapa" // La designacion S corresponde a los pulsadores de entrada asociados a las transiciones int E1;

// Etapa 1

int E2;

//Etapa 2

int E3;

//Etapa 3

int E4;

//Etapa 4

int S0 = 6; //Pulsador S0 conectado al pin 6 de Arduino int S1 = 7; int S2 = 8; int S3 = 9; int S4 = 10; int Y2 = 2; //Salida Y2 conectada al pin 2 de Arduino int Y3 = 3;


int Y4 = 4;

void setup() { //Apertura del visualizador serial Serial.begin(9600); //Declaracion de puertos digitales pinMode(6, INPUT); pinMode(7, INPUT); pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT);

//Algunos dispositivos traen una configuracion "Sinking and Sourcing" por eso es necesario colocar los puertos de salida en 0v. digitalWrite(Y2, LOW); digitalWrite(Y3, LOW); digitalWrite(Y4, LOW);

//Declaracion del estado inicial de las etapas E1 = HIGH; //La Etapa 1 es una Etapa inicial, debe estar activa al inicio del programa E2 = LOW; E3 = LOW; E4 = LOW; }

void loop() { //Capturar valores de puertos digitales de entrada S0 = digitalRead(6);

5


S1 = digitalRead(7); S2 = digitalRead(8); S3 = digitalRead(9); S4 = digitalRead(10);

//TRATAMIENTO SECUENCIAL E1 = ((E1 | (E4 & S3 )) & (~E2)); //Ecuacion binaria correspondiente al estado1 E2 = ((E2 | (E1 & S0 )) & (~E3)); //Ecuacion binaria correspondiente al estado2 E3 = ((E3 | (E2 & (S1 | S4) )) & (~E4)); //Ecuacion binaria correspondiente al estado3 E4 = ((E4 | (E3 & S2)) & (~E1)); //Ecuacion binaria correspondiente al estado4

// TRATAMIENTO POSTERIOR

if (E1 == HIGH) { Serial.println("Etapa1"); } if (E2 == HIGH) { digitalWrite(Y2, HIGH); Serial.println("Etapa2"); } else { digitalWrite(Y2, LOW); }

if (E3 == HIGH) { digitalWrite(Y3, HIGH); Serial.println("Etapa3"); } else {

6


digitalWrite(Y3, LOW); } if (E4 == HIGH) { digitalWrite(Y4, HIGH); Serial.println("Etapa4"); } else { digitalWrite(Y4, LOW); } }

ESTRUCTURA ALTERNATIVA

7


𝐸(6) = [(𝐸(6) + (𝐸(9) ∗ 𝑆8) + (𝐸(10) ∗ 𝑆10)) ∗ 𝐸̅7 ∗ 𝐸̅8 ]

𝐸(7) = [(𝐸(7) + (𝐸(6) ∗ 𝑆6 ∗ 𝑆7)) ∗ 𝐸̅9 ]

𝐸(9) = [(𝐸(9) + (𝐸(7) ∗ 𝑇1)) ∗ 𝐸̅6 ]

𝐸(8) = [(𝐸(8) + (𝐸(6) ∗ 𝑆6 ∗ 𝑆8)) ∗ 𝐸̅10 ]

𝐸(10) = [(𝐸(10) + (𝐸(8) ∗ 𝑆9)) ∗ 𝐸̅6 ]

/// GRAFCET ESTRUCTURA ALTERNATIVA" OK EN ARDUINO

//TRATAMIENTO PREVIO //Decalaracion de variables utilizadas para el programa //La designacion E corresponde a una "Etapa" // La designacion S corresponde a los pulsadores de entrada asociados a las transiciones int E6;

// Etapa 6

int E7; int E8; int E9; int E10;

int S6 = 6; //Pulsador S6 conectado al pin 6 de Arduino int S7 = 7; int S8 = 8; int S9 = 9; int S10 = 10;

8


int Y2 = 2; //Salida Y2 conectada al pin 2 de Arduino int Y3 = 3; int Y4 = 4; int T1;

// Bit asociado al temporizador 1

// Variables asociadas a "temp1". int activado1 = 0; // Al principio no ha sido activado. long inicio1, final1, actual1;

void setup() { //Apertura del visualizador serial Serial.begin(9600);

//Declaracion de puertos digitales pinMode(6, INPUT); pinMode(7, INPUT); pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); //Algunos dispositivos traen una configuracion "Sinking and Sourcing" por eso es necesario colocar los puertos de salida en 0v. digitalWrite(Y2, LOW); digitalWrite(Y3, LOW); digitalWrite(Y4, LOW);

//Declaracion del estado inicial de las etapas E6 = HIGH; //La Etapa 6 es una Etapa inicial, debe estar activa al inicio del programa

9


E7 = LOW; E8 = LOW; E9 = LOW; E10 = LOW; }

void loop() { //Capturar valores de puertos digitales de entrada S6 = digitalRead(6); S7 = digitalRead(7); S8 = digitalRead(8); S9 = digitalRead(9); S10 = digitalRead(10);

//TRATAMIENTO SECUENCIAL E6 = ((E6 | (E9 & S8) | (E10 & S10)) & (~E7) & (~E8)); //Ecuacion binaria correspondiente al estado 6 E7 = ((E7 | (E6 & S6 & S7 )) & (~E9)); //Ecuacion binaria correspondiente al estado 7 E9 = ((E9 | ( E7 & T1 )) & (~E6)); //Ecuacion binaria correspondiente al estado9 E8 = ((E8 | (E6 & S6 & S8)) & (~E10)); //Ecuacion binaria correspondiente al estado 8 E10 = ((E10 | (E8 & S9)) & (~E6)); //Ecuacion binaria correspondiente al estado 10

// TRATAMIENTO POSTERIOR if (E6 == HIGH) { Serial.println("Etapa6"); } if (E7 == HIGH) { digitalWrite(Y3, HIGH); Serial.println("Etapa7"); activetemp1(); } else {

10


digitalWrite(Y3, LOW); desactivetemp1(); }

if (E9 == HIGH) { digitalWrite(Y2, HIGH); Serial.println("Etapa9"); } else { digitalWrite(Y2, LOW); }

if (E8 == HIGH) { digitalWrite(Y4, HIGH); Serial.println("Etapa8"); } else { digitalWrite(Y4, LOW); }

if (E10 == HIGH) { Serial.println("Etapa10"); } } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //SUBRUTINA TEMPORIZADOR 1 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void activetemp1() { if (E7 == HIGH && activado1 == 0) { activado1 = 1;

// Si ha pulsado HIGH y no ha sido activado=0 antes...

// marca activado=1 y guarda el tiempo de inicio.

inicio1 = millis();

11


final1 = inicio1 + 5000;

// Tiempo final es inicio mas 5 segundos.

} actual1 = millis();

// Consulta el tiempo actual.

if (activado1 == 1 && (actual1 > final1) ) { T1 = HIGH; } else { T1 = LOW; } } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void desactivetemp1() { activado1 = 0;// inicio1 = 0; final1 = 0; actual1 = 0; } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ESTRUCTURA SIMULTANEA

𝐸(12) = [(𝐸(12) + (𝐸18 ∗ 𝐸19 ∗ 𝑆0)) ∗ 𝐸̅14 ∗ 𝐸̅15 ]

𝐸(14) = [(𝐸(14) + (𝐸(12) ∗ 𝑆11)) ∗ 𝐸̅16 ]

𝐸(15) = [(𝐸(15) + (𝐸(12) ∗ 𝑆11)) ∗ 𝐸̅17 ]

𝐸(16) = [(𝐸(16) + (𝐸(14) ∗ 𝑆3)) ∗ 𝐸̅18 ]

12


𝐸(17) = [(𝐸(17) + (𝐸(15) ∗ 𝑆4)) ∗ 𝐸̅19 ]

𝐸(18) = [(𝐸(18) + (𝐸(16) ∗ 𝑆7)) ∗ 𝐸̅12 ]

𝐸(19) = [(𝐸(19) + (𝐸(17) ∗ 𝑆6) ∗ 𝐸̅12 ]

///// GRAFCET "ESTRUCTURA SIMULTANEA" EN ARDUINO //Programa correspondiente a estructura simultanea

//TRATAMIENTO PREVIO //Decalaracion de variables utilizadas para el programa //La designacion E corresponde a una "Etapa" // La designacion S corresponde a los pulsadores de entrada asociados a las transiciones int E12 ;

// Etapa 12

int E14 ; int E15 ; int E16 ; int E17 ; int E18 ; int E19 ; int S11 = 6; //Pulsador S11 conectado al pin 6 de Arduino int S3 = 7; int S4 = 8; int S7 = 9; int S6 = 10; int S0 = 11; int Y6 = 2; //Salida Y6 conectada al pin 2 de Arduino int Y7 = 3;

13


void setup() { Serial.begin(9600); //Declaracion de puertos digitales// pinMode(S11, INPUT); pinMode(S3, INPUT); pinMode(S4, INPUT); pinMode(S7, INPUT); pinMode(S6, INPUT); pinMode(S0, INPUT); pinMode(Y6, OUTPUT); pinMode(Y7, OUTPUT); //Algunos dispositivos traen una configuracion "Sinking and Sourcing" por eso es necesario colocar los puertos de salida en 0v. digitalWrite(Y6, LOW); digitalWrite(Y7, LOW); //Declaracion de etapa inicial E12 = HIGH; E14 = LOW; E15 = LOW; E16 = LOW; E17 = LOW; E18 = LOW; E19 = LOW; }

void loop() {

//Capturar valores de puertos digitales de entrada S11 = digitalRead(6); S7 = digitalRead(9); S6 = digitalRead(10); S4 = digitalRead(8);

14


S3 = digitalRead(7); S0 = digitalRead(11);

//Tratamiento secuencial E12 = ((E12 | (E18 & E19&S0 )) & (~E14) & (~E15)); //Ecuacion binaria correspondiente al etapa12 E14 = ((E14 | (E12&S11)) & (~E16)); //Ecuacion binaria correspondiente al etapa14 E15 = ((E15 | (E12&S11)) & (~E17)); //Ecuacion binaria correspondiente al etapa15 E16 = ((E16 | (E14 & S3)) & (~E18)); //Ecuacion binaria correspondiente al etapa16 E17 = ((E17 | (E15 & S4)) & (~E19)); //Ecuacion binaria correspondiente al etapa 17 E18 = ((E18 | (E16 & S7)) & (~E12)); //Ecuacion binaria correspondiente al etapa 18 E19 = ((E19 | (E17 & S6)) & (~E12)); //Ecuacion binaria correspondiente al etapa 19

// Tratamiento posterior if (E12 == HIGH) { Serial.println("Etapa12"); }

if (E14 == HIGH) { digitalWrite(Y6, HIGH); Serial.println("Etapa14"); } else { digitalWrite(Y6, LOW); }

if (E15 == HIGH) { digitalWrite(Y7, HIGH); Serial.println("Etapa15"); } else

15


{ digitalWrite(Y7, LOW); }

if (E16 == HIGH) { Serial.println("Etapa16"); } if (E18 == HIGH) { Serial.println("Etapa18"); } if (E17 == HIGH) { Serial.println("Etapa17"); } if (E19 == HIGH) { Serial.println("Etapa19"); } }

ESTRUCTURA REPETITIVA USO DE CONTADOR ACTIVADO POR UNA ETAPA

16


//TRATAMIENTO PREVIO //Decalaracion de variables utilizadas para el programa //La designacion E corresponde a una "Etapa" // La designacion S corresponde a los pulsadores de entrada asociados a las transiciones int E1; int E2; int E3; int E4; int S0 = 6; int Y2 = 2; // Variables asociadas al Contador int CONTADOR = 0; const int PSCONTADOR = 3; // Preselect del Contador o # de ciclos int ESTADOPREVIO_E2 = 0; // previous state of the Step int T1 ;

// Bit asociado al temporizador 1

int T2 ;

// Bit asociado al temporizador 2

// Variables asociadas a "temp1". int activado1 = 0; // Al principio no ha sido activado. long inicio1, final1, actual1; // Variables asociadas a "temp2". int activado2 = 0; // Al principio no ha sido activado. long inicio2, final2, actual2;

void setup() { //Apertura del visualizador serial Serial.begin(9600);

//Declaracion de puertos digitales pinMode(6, INPUT); pinMode(2, OUTPUT);

//Algunos dispositivos traen una configuracion "Sinking and Sourcing" //por eso es necesario colocar los puertos de salida en 0v. digitalWrite(Y2, LOW);

17


//Declaracion del estado inicial de las etapas E1 = HIGH; //La Etapa 1 es una Etapa inicial E2 = LOW; E3 = LOW; E4 = LOW; // las etapas comunes }

//TRATAMIENTO SECUENCIAL void loop() { //Capturar valores de puertos digitales de entrada S0 = digitalRead(6);

// Ecuaciones binodales de ETAPAS E1 = ((E1 | (E4 & (CONTADOR >= PSCONTADOR) )) & (~E2)); //Ecuacion binaria correspondiente al estado1 E2 = ((E2 | (E1 & S0 ) | (E4 & (CONTADOR < PSCONTADOR))) & (~E3)); //Ecuacion binaria correspondiente al estado2 E3 = ((E3 | (E2 & T1 )) & (~E4)); //Ecuacion binaria correspondiente al estado3 E4 = ((E4 | (E3 & T2)) & (~E1) & (~E2)); //Ecuacion binaria correspondiente al estado4

delay(200); // solo para ayuda de visualizacion // TRATAMIENTO POSTERIOR

if (E1 == HIGH) { Serial.println("Etapa1"); CONTADOR = 0; }

if (E2 == HIGH) {activetemp1(); } else {desactivetemp1(); } if (E2 == HIGH) { Serial.println("Etapa2"); digitalWrite(Y2, HIGH); Serial.print("CONTADOR : "); Serial.println(CONTADOR); }

18


else {digitalWrite(Y2, LOW);}

if (E3 == HIGH) { Serial.println("Etapa3"); }

if (E3 == HIGH) {activetemp2();} else {desactivetemp2();}

if (E4 == HIGH) {Serial.println("Etapa4");}

if (E2 != ESTADOPREVIO_E2) { if (E2 == HIGH) { CONTADOR++; Serial.print("Numero de Ciclos : "); Serial.println(CONTADOR); } ESTADOPREVIO_E2 = E2; } delay (100); // se usa para observar mejor el monitor serial } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //SUBRUTINA TEMPORIZADOR 1 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void activetemp1() { if (E2 == HIGH && activado1 == 0) { activado1 = 1;

// Si ha pulsado HIGH y no ha sido activado=0 antes...

// marca activado=1 y guarda el tiempo de inicio.

inicio1 = millis(); final1 = inicio1 + 5000; } actual1 = millis();

// Consulta el tiempo actual.

if (activado1 == 1 && (actual1 > final1) ) {

19


T1 = HIGH; } else { T1 = LOW; } } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void desactivetemp1() { T1 = LOW; activado1 = 0; inicio1 = 0; final1 = 0; actual1 = 0; } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //SUBRUTINA TEMPORIZADOR 2 //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void activetemp2() { if (E3 == HIGH && activado2 == 0) { activado2 = 1;

// Si ha pulsado HIGH y no ha sido activado=0 antes...

// marca activado=1 y guarda el tiempo de inicio.

inicio2 = millis(); final2 = inicio2 + 5000; } 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; }

20


//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Jovenes, este material ha sido elaborado con mucho gusto. Si te es util Rega lame un Like, comenta y suscríbete :) (っ◕‿◕) Te invito al CANAL DE YOUTUBE MEKATRONICA para conocer ma s

http://www.youtube.com/c/JovannyDuque?sub _confirmation=1_ Amigos/as en el BLOGG MEKATRONICA J DUKE podras encontrar cantidad de recursos sobre SOLIDWORKS, HIDRAULICA ELECTROHIDRAULICA , NEUMATICA, ELECTRONEUMATICA, CONTROL, PLC M221, PLC SIEMEMS S7 1200, PLC SIEMENS S7 300 , FLUID SIM FACTORY IO, entre otros

https://mecatronica-itsa.blogspot.com/ 21


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.