Introducción
Hoy trabajando un compañero de trabajo me enseño una forma de crear interlocks para evitar que se activen 2 salidas al mismo tiempo.
El problema que estábamos viendo era activar un motor que tiene 2 sentidos de giro y a demás de la parada queríamos dar un pequeño retardo de activación hasta encender el motor en sentido contrario.
¿Para que sirve los interlocks?
Los interlocks nos permiten hacer una activación segura tanto para las maquinas como para las personas asegurándonos que no haya ningún disgusto ni económico ni humanitario
¿Cómo crear los interlocks?
Para empezar quería agradecer a Jose Juan esta enseñanza y querría compartir con vosotros 2 formas de hacerlo, por un lado la de Jose Juan programado con KOP y la mía hecha con una maquina de estados en SCL.
La verdad es que me ha parecido muy intuitiva la forma de programarlo mi compañero y que queda muy elegante
KOP
Para empezar aprovecharemos el uso de la evaluación de flancos descendentes y activaremos un retardo de activación
SCL
Yo para hacerlo en SCL aunque puedo hacerlo como en KOP yo optaba por un funcionamiento con una maquina de estados, no tengo tanta experiencia como mi compañero Jose Juan y decidí hacer una maquina de estados muy sencillita que permite un entendimiento relativamente intuitivo
1.Diagrama máquina de estados
Para la ejecución he usado este codigo
<Declaration>
FUNCTION_BLOCK Interlocks
VAR_INPUT
bStartFirst: BOOL;
bStartSecond: BOOL;
END_VAR
VAR_OUTPUT
bFirstActivation: BOOL;
bSecondActivation: BOOL;
END_VAR
VAR
state: INT;
TON: Tc2_Standard.TON;
IDDLE: INT := 0;
FIRST: INT := 10;
SECOND: INT := 20;
WAITING: INT := 30;
END_VAR
</Declaration>
<Implementation>
CASE state OF
IDDLE: //IDLE STATE WAITING FOR OPERATION
IF bStartFirst THEN
state:=FIRST;
END_IF;
IF bStartSecond THEN
state:=SECOND;
END_IF;
FIRST: //ACTIVATION OF FIRST OUTPUT
bSecondActivation:=FALSE; //SECURE DISABLE OUTPUT
IF bStartFirst THEN
bFirstActivation:=TRUE;
ELSE
state:=30;
END_IF;
SECOND: //ACTIVATION OF SECOND OUTPUT
bFirstActivation:=FALSE; //SECURE DISABLE OUTPUT
IF bStartSecond THEN
bSecondActivation:=TRUE;
ELSE
state:=WAITING;
END_IF;
WAITING: // WAITING FOR SECURITY
TON(IN:=TRUE,PT:=T#1S,Q=>,ET=>);
IF TON.Q THEN
TON(IN:=FALSE);
state:=IDDLE;
END_IF
END_CASE;
</Implementation>