Páginas

martes, 23 de octubre de 2012

[VERIFICACIÓN Y VALIDACIÓN] Redes de Petri

Para esta semana se nos encargó modelar un sistema concurrente, en este caso una red de petri. Segun Wikipedia: "Una Red de Petri es una representación matemática o gráfica de un sistema a eventos discretos en el cual se puede describir la topología de un sistema distribuido, paralelo o concurrente."

En mi caso modelaré el funcionamiento básico de un cajero automático. Para ello tengo que definir los estádos de la máquina y las transiciones entre estados.

Para poder definir los estados y transiciones definire en palabras simples como actua la máquina:

  • El cajero se encuentra en espera de que se introduzca una tarjeta.
  • Una vez introducida se procede a pedir el NIP.
  • Si el NIP es incorrecto se le vuelve a pedir, de ser correcto entonces continua.
  • La siguiente es la pantalla de transacciones donde se elige el tipo de transacción (efectivo, cheques, etc).
  • Se procede a la selección de cantidad para la transacción.
  • Se realiza la transaccion en la que se entrega el efectivo, el tiquet, etc.
  • Se pregunta al usuario si desea realizar otra transacción, de ser así se regresa a la pantalla de selección de tipo de transacción, de no ser así se regresa al estado de espera.
Código utilizado usando la libreria de python snakes:
from snakes.nets import *
from snakes.data import *
import snakes.plugins
snakes.plugins.load('gv', 'snakes.nets', 'nets')
from nets import *
cajero = PetriNet("Cajero")
# Estados del cajero
cajero.add_place(Place('STB', [0]))
cajero.add_place(Place('P NIP', [1]))
cajero.add_place(Place('NIP Correcto', [2]))
cajero.add_place(Place('NIP Incorrecto', [3]))
cajero.add_place(Place('P Transaccion', [4]))
cajero.add_place(Place('Donacion', [5]))
cajero.add_place(Place('P Cantidad', [6]))
cajero.add_place(Place('Transaccion', [7]))
cajero.add_place(Place('Nueva Transaccion', [8]))
# Transiciones del Cajero
cajero.add_transition(Transition('Lectura'))
cajero.add_transition(Transition('Val NIP'))
cajero.add_transition(Transition('NIP Mal'))
cajero.add_transition(Transition('NIP Bien'))
cajero.add_transition(Transition('Donar?'))
cajero.add_transition(Transition('Tipo Trans'))
cajero.add_transition(Transition('Selec Cantidad'))
cajero.add_transition(Transition('Otra Trans?'))
cajero.add_input('STB', 'Lectura', Variable('Tarjeta')) # Se introduce una tarjeta en modo espera.
cajero.add_output('P NIP', 'Lectura', Expression('Tarjea == True')) # Se lee los datos
cajero.add_input('P NIP', 'Val NIP', Variable('NIP')) # Se introduce un NIP
cajero.add_output('NIP Correcto','Val NIP',Expression('NIP == NIP_Cuenta')) # El NIP es correcto
cajero.add_output('NIP Incorrecto','Val NIP',Expression('NIP == Error')) # El NIP no es correcto
cajero.add_input('NIP Correcto', 'NIP Bien', Variable('NIP_Cuenta')) # Si es correcto continua
cajero.add_input('NIP Incorrecto', 'NIP Mal', Variable('NIP')) # Si no lo es regresa
cajero.add_output('P NIP','NIP Mal',Expression('Tarjea == True')) # Se validan de nuevo los datos si esta mal el NIP
cajero.add_output('P Transaccion','NIP Bien',Expression('NIP_Cuenta == Trans')) # Pantalla de Transacciones si esta bien el NIP
cajero.add_input('P Transaccion','Donar?',Variable('Donar')) # Desea donar?
cajero.add_output('Donacion','Donar?',Expression('Donar == True')) # Cuanto desea donar?
cajero.add_input('Donacion','Tipo Trans',Variable('TipoTrans')) # Continua con la Transaccion
cajero.add_input('P Transaccion','Tipo Trans',Variable('TipoTrans')) # Continua con la Transaccion
cajero.add_output('P Cantidad', 'Tipo Trans', Expression('TipoTrans == SelecTipoTrans'))# Se elige el tipo de Transaccion
cajero.add_input('P Cantidad','Selec Cantidad',Variable('Monto')) # Se procede a seleccionar el monto
cajero.add_input('Nueva Transaccion','Tipo Trans',Variable('TipoTrans')) # Nueva Transaccion
cajero.add_output('Transaccion', 'Selec Cantidad', Expression('Monto == SelecMonto')) # Se selecciona el monto y continua
cajero.add_input('Transaccion','Otra Trans?',Variable('OtraTrans')) # Desea otra transaccion?
cajero.add_output('Nueva Transaccion', 'Otra Trans?', Expression('OtraTrans == True')) # Se ingresa una nueva Transaccion
cajero.add_output('STB', 'Otra Trans?', Expression('OtraTrans == False')) # Entra en modo espera
cajero.draw('cajero.png')
view raw cajero.py hosted with ❤ by GitHub
Una imagen de como queda finalmente:

Referencias:

2 comentarios:

  1. Pues, no tiene nada paralelo, pero está bien el componente que hiciste. Te pongo 7 pts.

    ResponderBorrar
  2. Alguien. Hace la red de petri para un cajero automático

    ResponderBorrar