Logo Studenta

Máquina de estados

¡Este material tiene más páginas!

Vista previa del material en texto

INFORMÁTICA 2 
Máquina de Estados 
Ing. Gustavo Fresno - Profesor 
Ing. Jorge Manganiello - Ayudante 
Máquina de Estados 
Informática II - UTN-FRBA 2011 - Ing. Fresno Gustavo 2 
¿ Qué es una Máquina de estados ? 
 Es un MODELO que describe a un sistema en estudio mediante: 
– Estados (comportamiento estático) 
– Transiciones (evolución entre estados) 
– Excitaciones (que condicionan las transiciones) 
– Acciones (asociadas a las transiciones) 
 
 
¿ Sistema de qué ? 
 
– De Control en Tiempo Real 
– Protocolos 
– Circuitos Eléctricos/Electrónicos (Lógica Secuencial) 
– Arquitectura de Software 
– Etc., etc., etc. 
 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 3 
¿ Por qué usarlas ? 
 
– Brinda una rigurosa descripción del comportamiento del sistema 
– Ofrece sobre situaciones muy complejas soluciones ridículamente 
sencillas. Incluso compuestas por la operación en paralelo de 
múltiples máquinas 
– Su implementación genera código simple, eficiente y preciso. 
– Fácil de depurar, modificar, expandir y bien organizado. 
– Sin duda facilitan el análisis, el diseño y la implementación 
 
Casos típicos de estudio 
 
 Surgen de la combinación de los siguientes factores: 
– Excitaciones por Eventos 
– Excitaciones por Sincronismos (time-out, timer-tick) 
– Excitaciones por Semáforos/Variables/Colas (mensajes) 
– Interacción con Entradas/Salidas 
– Composición en paralelo de múltiples máquinas 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 4 
• Mediante diversos métodos de representación 
– Funciones matemática 
– Diagramas de globos 
– Tablas de Estados y Transiciones 
 
¿Cómo se formalizan? 
• Mediante diversos lenguajes de programación 
– Assembler, 
– C para micros o PCs 
– C++, Java, UML 
– VHDL, etc., etc., etc. 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 5 
Diagrama de Globos 
 
Semántica. 
 
 
 
 
 
 
 
 
• Los nodos (globos) representan los posibles estados estáticos. 
Ejemplo: 1,2 y 3 
• Las etiquetas representan eventos que provocan un cambio. 
Ejemplo: a y b 
• Las aristas (flechas) determinan de qué manera cada estado, dado 
un evento, deriva en otro estado. 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 6 
Ejemplo 
 
Supongamos que se quiere modelar el comportamiento de una puerta. 
 
La puerta, inicialmente cerrada, puede pasar a estar abierta tras el evento 
“abrir puerta”. Una vez abierta, puede pasar al estado cerrada, tras el 
evento “cerrar puerta”. 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 7 
Extensión de la Semántica original 
 
Condiciones 
Son expresiones booleanas que determinan si una transición entre 
estados puede realizarse. 
 
Acciones 
Inmediatamente después de ejecutar una transición y antes de arribar 
al siguiente estado, la máquina de estado ejecuta una o varias 
acciones. 
Condiciones / Acciones 
 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 8 
Ejemplo 1: 
Encendido y apagado de una luz cada vez que presiono una tecla 
 
Tecla encendido presionada / Encender Luz 
 
Luz 
ON 
Luz 
OFF 
Tecla encendido presionada / Apagar Luz 
 
Microcontrolador 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 9 
Ejemplo 2: 
Se desea realizar un contador ascendente y descendente de forma 
periódica, el contador debe comenzar contando de forma ascendente 
hasta llegar al LIMITE SUPERIOR y luego descender hasta el LIMITE 
INFERIOR. 
ASC DES 
cuenta == LIMITE_SUP/ cuenta-- 
cuenta == LIMITE_INF / cuenta++ 
cuenta < LIMITE_SUP 
/ 
cuenta++ 
cuenta > LIMITE_INF 
/ 
cuenta -- 
RESET 
/ 
cuenta = LIMITE_INF 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 10 
// Propósito: Análisis del contador 
// cuando asciende 
// Recibe: void 
// Retorna: void 
void Ascendiendo(void) 
{ 
 if (cuenta < LIMITE_SUP) 
 cuenta++; 
 
 if (cuenta == LIMITE_SUP) 
 { 
 estado = DESCENDENTE; 
 cuenta--; 
 } 
 
 return; 
} 
// Propósito: Análisis del contador 
// cuando desciende 
// Recibe: void 
// Retorna: void 
 
void Descendiendo (void) 
{ 
 if (cuenta > LIMITE_INF) 
 cuenta--; 
 
 if( cuenta == LIMITE_INF) 
 { 
 estado = ASCENDENTE; 
 cuenta++; 
 } 
 return; 
} 
Vamos a comenzar a programar!! 
Comencemos codificando cada uno de los estados 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 11 
Sigamos con la inicialización de nuestra maquina de estados 
// Propósito: Inicializar 
// Recibe: void 
// Retorna: void 
 
void Inicializar_Maquina_Estados(void) 
{ 
 estado = DESCENDENTE; 
 cuenta = LIMITE_INF; 
 return; 
} 
 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 12 
unsigned char data estado; // Estado de Contador 
unsigned int data cuenta; // Valor instantáneo del Contador 
 
void main (void) 
{ 
 Inicializar_Maquina_Estados(); 
 
 while(1) 
 { 
 Analisas_Maquina_Estados(); 
 } 
} 
 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 13 
 Para implementar el análisis de la maquina de estados 
tengo varios métodos: 
 
– Switch’s 
– Múltiples if 
– Punteros a función 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 14 
// Propósito: Analisis Maquina Estados 
// Recibe: void 
// Retorna: void 
void Analisis_Maquina_Estados(void) 
{ 
 switch (estado) 
 { 
 case ASCENDENTE: 
 Ascendiendo(); 
 break; 
 case DESCENDENTE: 
 Descendiendo (); 
 break; 
 } 
 return; 
} 
 
 
 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 15 
// Propósito: Analisis Maquina Estados 
// Recibe: void 
// Retorna: void 
void Analisis_Maquina_Estados(void) 
{ 
 if( estado == ASCENDENTE ) 
 { 
 Ascendiendo(); 
 return; 
 } 
 if( estado == DESCENDENTE) 
 { 
 Descendiendo (); 
 return; 
 } 
 return; 
} 
 
 
 
Máquina de Estados 
Informática II - UTN-FRBA 2010 - Ing. Fresno Gustavo 16 
unsigned char data estado; // Estado de Contador 
unsigned char data cuenta; // Valor instantáneo del Contador 
 
code void (code *ArrayFuncionesEstadoContador [ ]) (void) = {Ascendiendo , 
Descendiendo}; 
 
void main (void) 
{ 
 Reset(); 
 
 while(1) 
 { 
 Display (cuenta); 
 (*ArrayFuncionesEstadoContador [estado]) (); 
 } 
} 
 
Máquina de Estados

Continuar navegando