He creado una secuencia en plc control para continuar con la lavadora web. En un principio pensé en hacer esta secuencia en vb.net, pero me ha parecido más interesante hacerla con plc control. Así, de paso, vemos una secuencia creada en ST (Texto Extructurado).Despues de tener la lavadora funcionando, haré la supervisión en vb.net y el guardado en MySql.
La secuencia es una versión beta que modificaremos sobre la marcha. En el siguiente paso crearé la interface en vb.net.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
VAR_GLOBAL Y1 AT %Q*:BOOL; (*Electroválvula cajon*) Y2 AT %Q*:BOOL; (*Electroválvula Bombo*) M1 AT %Q*:BOOL; (*Motor bombo*) M2 AT %Q*:BOOL; (*Motor desagüe*) X1 AT %Q*:BOOL; (*Bloqueo puerta*) Resistencia AT %Q*:BOOL; CajonCerrado AT %I*:BOOL; PuertaCerrada AT %I*:BOOL; InicioLavado:BOOL; Temperatura:INT; NivelAgua:INT; END_VAR PROGRAM MAIN VAR stateMain:INT; Aviso:INT; txtAviso:STRING; PermisoCalentar: BOOL; Termostato: BOOL; Pulso1Sec: TON; Espera: INT; END_VAR (*LLamada a subprogramas*) SecCalentar(); (*Otros*) Pulso1Sec(IN:=NOT Pulso1Sec.Q, PT:= T#1s); CASE stateMain OF 0:(*Comprobar condiciónes para inicio*) IF NOT CajonCerrado THEN Aviso := 1; txtAviso :='Cajon sin cerrar'; ELSE IF NOT PuertaCerrada THEN Aviso := 2; (*Puerta sin cerrar*) txtAviso :='Puerta sin cerrar'; ELSE Aviso := 3; txtAviso :='Preparado para inicio'; IF InicioLavado THEN stateMain:= 10; InicioLavado := FALSE; END_IF END_IF END_IF 10:(*Bloqueo de puerta*) X1 := TRUE; stateMain := 20; 20:(*Llenar de agua I*) Espera := 30; stateMain :=21; Y2:= TRUE; 21:(*Llenar de agua II*) IF Espera > 0 AND Pulso1Sec.Q THEN Espera := Espera - 1; Aviso := 20; txtAviso :='Llenado de agua'; END_IF IF Espera < 1 THEN Espera := 0; stateMain := 30; END_IF; 30:(*Calentar agua*) PermisoCalentar := TRUE; stateMAIN := 40; 40:(*Esperar hasta conseguir temperatura*) IF Temperatura > 60 THEN stateMain:= 50; END_IF Aviso := 40; txtAviso :='Calentando agua'; 50:(*Mover bombo con agua, esto tendrá un nombre pero...*) Espera := 20; stateMain := 51; M1 :=TRUE; 51:(*Continua mover bombo*) IF Espera > 0 AND Pulso1Sec.Q THEN Espera := Espera - 1; Aviso := 50; txtAviso :='Moviendo bombo'; END_IF IF Espera > 1 THEN Espera := 0; stateMain := 60; END_IF; 60:(*Abrimos electroválvula jabon I*) Espera := 5; stateMain := 61; Y1 :=TRUE; 61:(*Continua mover bombo*) IF Espera > 0 AND Pulso1Sec.Q THEN Espera := Espera - 1; Aviso := 60; txtAviso :='Introducir jabon'; END_IF IF Espera < 1 THEN Espera := 0; stateMain := 70; END_IF; 70:(*Cerramos jabon*) Y1:= FALSE; stateMain := 80; 80:(*Lavando*) Espera := 25; stateMain := 81; 81:(*Continua lavado*) IF Espera > 0 AND Pulso1Sec.Q THEN Espera := Espera - 1; Aviso := 60; txtAviso :='Lavando'; END_IF IF Espera < 1 THEN Espera := 0; stateMain := 90; END_IF; 90:(*Extraer agua*) Espera := 25; stateMain := 91; M2 := TRUE; 91:(*Continua Extraer agua*) IF Espera > 0 AND Pulso1Sec.Q THEN Espera := Espera - 1; Aviso := 90; txtAviso :='Sacando agua'; END_IF IF Espera < 1 THEN Espera := 0; stateMain := 100; END_IF; 100:(*Llenar agua y extraer*) Espera := 25; stateMain := 101; 101:(*Continua llenar agua y extraer*) IF Espera > 0 AND Pulso1Sec.Q THEN Espera := Espera - 1; Aviso := 60; txtAviso :='Llenar agua y extraer'; END_IF IF Espera < 1 THEN Espera := 0; stateMain := 110; END_IF; 110:(*Paramos agua y extraer*) M2:= FALSE; Y2:= FALSE; stateMain := 120; 120:(*Centrifugar, para simplificar sólo dejo el bombo en marcha un tiempo*) Espera := 25; stateMain := 121; 121:(*Continúa centrifugado*) IF Espera > 0 AND Pulso1Sec.Q THEN Espera := Espera - 1; Aviso := 120; txtAviso :='Centrifugado'; END_IF IF Espera < 1 THEN Espera := 0; stateMain := 130; END_IF; 130:(*Fin lavado*) M1:= FALSE; X1:= FALSE; Aviso :=0; stateMain :=0; END_CASE PROGRAM Simular VAR Pulso1Sec: TON; END_VAR Pulso1Sec(IN:=NOT Pulso1Sec.Q, PT:= T#1s); IF Pulso1Sec.Q AND Resistencia THEN Temperatura := Temperatura + 1; END_IF IF Y2 THEN NivelAgua := NivelAgua + 1; END_IF; |
Dentro del programa creado en ST he añadido una ACTION en LEADER. Esto nos permite hacer ciertas líneas de código en otro lenguaje por diferentes razones.
Este es el árbol del programa:
Y este el action:
La secuencia se construye con un CASE. Cuando el plc lee la instrucción CASE, lee el valor de la variable que sigue a esta palabra clave. Luego leerá sólo el código que este seguido de este valor y sólo ese hasta el siguiente ciclo de scan.
CASE <variable> OF
<Valor>: Codigo
<Valor>: Codigo
END_CASE
En el siguiente ejemplo si Var = 1, se pone M1 a true y si Var = 2, se pone Y2 a FALSE. Esto es equivalente a hacer un SET.
CASE Var OF
1:M1:=TRUE;
2:Y2:=FALSE;
END_CASE
Otra cosa que me parece interesante es la variable txtAviso. Esta variable de tipo STRING nos informa de el estado actual de la máquina, a efecto de depuración creo que puede ser interesante.
Bueno y por el momento esto es todo, cualquier cosa un comentario. Y el programa lo dejo en la próxima entrada con la aplicación en vb.net.
Bookmark on DeliciousDigg this postRecommend on Facebookshare via RedditShare with StumblersTweet about itSubscribe to the comments on this postAuthors: David