Se consideran las entradas de control A (Pulsador de marcha / Marcha), B (Pulsador de paro / Paro) y el estado anterior de la salida GManterior:
| A (Marcha) | B (Paro) | GManterior | GMsiguiente | Estado y Comentario |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | Reposo (Motor Apagado - Estado M1) |
| 0 | 0 | 1 | 1 | Mantenimiento de Marcha (Realimentación / Memoria - Estado M2) |
| 0 | 1 | 0 | 0 | Paro activo (Motor Apagado - Estado M1) |
| 0 | 1 | 1 | 0 | Acción de Paro (Transición a M1 / Motor Apagado) |
| 1 | 0 | 0 | 1 | Arranque / Marcha (Transición a M2 / Motor Encendido) |
| 1 | 0 | 1 | 1 | Mantenimiento de Marcha (Estado M2) |
| 1 | 1 | 0 | 0 | Predominio de Paro (Prioridad de Paro B) |
| 1 | 1 | 1 | 0 | Predominio de Paro (Prioridad de Paro B) |
En el diseño por autómatas finitos se definen dos estados internos:
Implementación en C++ para placas Arduino leyendo las entradas digitales en los pines 28 y 26, proyectando la salida del guardamotor (GM) y el estado de Marcha (M2) en los LEDs de salida:
const int leds[] = {13,12,11,10,9,8,7,6,5};
const int entradas[] = {28,26,24,22};
const int numeroLeds = sizeof(leds) / sizeof(leds[0]);
const int numeroEntradas = sizeof(entradas) / sizeof(entradas[0]);
bool A, B, C, D;
bool GM = 0, M1 = 0, M2 = 0;
void setup()
{
Serial.begin(115200);
for(int i = 0; i < numeroLeds; i++){
pinMode(leds[i], OUTPUT);
}
for(int i = 0; i < numeroEntradas; i++){
pinMode(entradas[i], INPUT);
}
}
void loop()
{
A = digitalRead(entradas[0]); // Leo estado Pin 28 (MARCHA)
B = digitalRead(entradas[1]); // Leo estado Pin 26 (PARADA)
// FUNCIÓN
GM = !A*!B*GM + A*!B*!GM + A*!B*GM;
// Simplificada por Karnaugh: GM = !B*GM + A*!B
// Simplificada por Álgebra Boole: GM = !B*(GM + A)
// MEDIANTE LÓGICA DE AUTÓMATAS:
M1 = !M2 + (M2*B) + M1*!M2; // Estado PARO / APAGADO
M2 = M1*A + M2*!M1; // Estado MARCHA / ENCENDIDO
// SALIDA EN LOS LED 13,12
digitalWrite(leds[0], GM); // LED Pin 13: Salida Guardamotor Booleana
digitalWrite(leds[1], M2); // LED Pin 12: Salida Estado M2 (MARCHA)
}