Programació d'automatismes amb màquines d'estat

Què són les màquines d’estats finits?

La màquina d’estats finits és un model que defineix el funcionament d’un sistema com un conjunt d’estats i transicions (entre estats), les quals depenen de la informació de les entrades i de variables internes.

Els estats es componen d’accions que defineixen l’estat de cada una de les sortides d’un dispositiu i les accions sobre variables. Podem dir, per simplificar, que un sistema tindrà tants estats com estats possibles tingui el dispositiu o automatisme a controlar.

Una transició entre estats defineix la condició per la que s’abandona un estat i s’activa l’estat següent. Un estat pot tenir més d’una transició a altres estats. La condició d’abandonament d’un estat pot estar definida pel valor d’una variable, pel valor retornat per un sensor o detector, o per combinacions booleanes d’aquestes.

Estructura d'un estat
Accions de l'estat sobre:
  • actuadors/indicadors
  • variables
Transició a l'estat següent:
  • valor d’una variable
  • valor d’un sensor
  • combinacions booleanes
Enllaç a l'estat següent

Els estats possibles d'un automatisme poden representar-se en una taula d'estats. Veiem dos exemples.

Exemple 1. Semàfor de vehicles

Estat del semàfor Làmpada vermella Làmpada taronja Làmpada verda
Vermell 1 0 0
Verd 0 0 1
Taronja 0 1 0

S’observa que hi ha altres possibilitats de combinació de les tres làmpades però no es consideren com estats atès que no són possibles en aquesta definició dels estats del semàfor.


Exemple 2. Temporitzador amb polsador

Estat del temporitzador Temporitzador
Desactivat 0
Activat 1

Les taules poden completar-se amb la condició de transició i l’estat següent. Veiem com quedarien.

Exemple 1. Semàfor de vehicles

Estat del semàfor Làmpada vermella Làmpada taronja Làmpada verda Transició Estat següent
Vermell 1 0 0 Temps vermell Verd
Verd 0 0 1 Temps verd Taronja
Taronja 0 1 0 Temps taronja Vermell


Exemple 2. Temporitzador amb polsador

Estat del temporitzador Temporitzador Transició Estat següent
Desactivat 0 Polsador Activat
Activat 1 Temps activat Desactivat

La transició de l’estat “Desactivat” a “Activat” s’activa a partir del polsador. L’acció del polsador pot detectar-se en dos tipus de canvi d’estat d’aquest:

  • Per “flanc ascendent” (0 → 1), és a dir, l’actuació sobre el polsador el fa passar de repòs a activat (premut), i en arribar a aquest situació, salta a l’estat següent.
    1. polsador en repòs (0)
    2. polsador premut (1) → salta a l’estat següent
  • Per “flanc descendent” (1 → 0) és a dir, l’actuació sobre el polsador el fa passar de repòs a activat (premut), i en deixar de prémer-lo salta a l’estat següent.
    1. polsador en repòs (0)
    2. polsador premut (1)
    3. polsador retorna al repòs (0) → salta a l’estat següent

En el cas dels sensors binaris o booleans, les transicions s’han d’activar per flanc, és a dir en un pols de pujada (1→0) o de baixada (0→1), per tal d’assegurar que no entra en estats cíclics.

Representació d’un sistema amb diagrames d’estat

En un diagrama d’estats, els estats es representen amb cercles, que en el seu interior hi ha el nom de l’estat. Les transicions es representen mitjançant línies que uneixen direccionalment la connexió entre estats, i en el tram central es marca la condició que dóna lloc al canvi d’estat.

És convenient preveure un estat d’inici (Inicial) en el que se situen les condicions d’inici de l’automatisme (posicions de referències), variables als valors inicials i una vegada s’han realitzat aquestes accions, s’activa un dels estats, de forma immediata.


Veiem com serien els diagrames d’estat dels exemples anteriors.

Exemple 1. Semàfor de vehicles
Exemple 2. Temporitzador amb polsador

Implementació d’un programa amb el mètode dels estats

Per implementar un programa amb el mètode dels estats amb Snap, s’ha de seguir el procediment següent:

  • Per cada estat caldrà crear una seqüència que s’activarà per la recepció d’un missatge amb el nom de l’estat que representa
  • Aquesta seqüència ha d’estar organitzada de la manera següent:

Accions pròpies de l’estat (bloc):
  • Fixació dels elements de sortida de l'estat
  • Actualització de variables
Verificació de la condició de sortida
Crida de l'estat següent

  • Les accions del bloc inicial han de considerar el punt de partida del sistema. És a dir, l'assignació de valors inicials a variables, la fixació dels elements de sortida del sistema. No té cap condició de sortida, és a dir, la transició a l'estat següent és immediata. La decisió de quin ha de ser l'estat següent ve condicionada per la lògica i la funcionalitat del sistema.


Exemple 1. Semàfor

S’assumeix que les sortides d’Arduino UNO per aquest exemple són:

  • pin 6: vermell
  • pin 5: taronja
  • pin 3: verd

Les accions de cada estat les inclourem en tres blocs per separat:


En el bloc Inicial caldrà incloure:

  • L'assignació del valor a les variables de temps de cada estat
  • L'apagament de les tres làmpades
  • Acaba amb la crida a l'estat següent mitjançant el missatge “verd”

La construcció dels estats es fa amb l’esdeveniment “Quan rebi” amb el missatge que correspongui a l’activació de l’estat. Acaba amb la crida a l’estat següent mitjançant l’enviament d’un missatge.



Amb aquesta estructura queden ben definits els estats del sistema, organitzats en mòduls diferents, que són molt útils per monitoritzar la seva execució, ja sigui de forma aïllada com de forma conjunta. Aquesta estructura facilita la depuració del programa que juntament amb l’opció “Monitoritzar l’execució pas a pas” del menú d’opcions.


Exemple 2. Temporitzador amb polsador

S’assumeix que el polsador està connectat al pin 4 i la sortida al pin 6. El temps de temporització serà fix i de 10 segons.

El bloc Inicial desconnecta la sortida 6, cosa que en aquest cas, no caldria ja que també ho fa el bloc següent però s’hi ha afegit per exemplificar la utilitat d’aquest bloc. En el bloc Desconnectat, es torna a desconnectar la sortida 6 i hi ha dues crides seguides a “Espera fins” per generar un flanc descendent a l’entrada 2, d’1 → 0. En repòs el posador està a massa, per tant a 0, i quan es prem, està a +Vc. Funcionaria amb flanc ascendent?

Implementació d’un sistema amb un estat que té transicions a estats diferents

Veurem aquest cas a partir d’un exemple concret, el d’un semàfor de seqüència variable segons sigui de dia o de nit. De dia fa el cicle clàssic de tres colors i de nit es queda en taronja intermitent. Un resistor LDR connectat a una entrada analògica (A0) ens servirà per discriminar el dia de la nit.

L’estat “taronja” s’ha escollit com l’estat que discriminarà l’estat següent en funció de si és de dia o de nit. Després d’haver passat el temps de taronja s’avalua el valor analògic de l’entrada del LDR, i en funció d’aquest, l’estat següent serà “vermell”, si és de dia, i serà “Taronja intermitent” si és de nit.

L’estat “taronja intermitent” es mantindrà fins que la lectura de l’LDR indiqui que és de dia, aleshores cridarà l’estat següent “vermell”.

El diagrama d’estats del sistema és:


Els blocs de programa nous, es detallen a continuació:


En l’estat “taronja”, les sortides a l’estat següent es discriminen amb un condicional amb alternativa. La condició es formula a partir de la lectura de l’LDR.

El programa complet és:


Òbviament, el programa es pot resoldre de forma diferent.

Implementació d’un sistema biestable comandat per la mateixa entrada

Veurem aquest cas a partir de l’encesa i apagat d’una sortida amb un polsador, de manera que prement-lo l’encén i tornant-lo a prémer, l’apaga.

El diagrama d’estats és:

La condició de transició entre estats és la mateixa, per tant, en aquest cas és molt important que l’activació sigui programada per flanc, ja sigui de pujada o de baixada, però igual en les dues transicions.

El programa quedaria de la forma següent:

Referències



[Autor: Jordi Regalés Barta]