martes, 23 de octubre de 2012

Red de petri

Bueno para esta semana se encargo realizar una Red de Petri, primer daremos un poco de introduccion:

Una Red de Petri es una simulación de un sistema, con eventos de forma paralela, concurrente o de manera distribuida, puede ser representada tanto matemáticamente o gráficamente.

Estos sistemas por lo general están compuestos por:
  • Transiciones: Estas transiciones están unidas por lo general a dos lugares o mas.
  • Lugares: Son los estados del sistema.
  • Marcas: Representación de los objetos dentro de los lugares.
Estas redes de petri tienen condiciones que se deben cumplir al momento de construirse:
  • Un arco une siempre lugares con transiciones y nunca dos lugares o dos transiciones.
  • Una transición puede ser destino de varios lugares y un lugar puede ser el destino devarias transiciones.
  • Una transición puede ser origen de varios lugares y un lugar puede ser origen de varias transiciones.
  • Los lugares pueden presentar marcas (una marca se representa mediante un punto en el interior del círculo).
  • Cada lugar tiene asociada una acción o salida. Los lugares que contiene marcas se consideran lugares activos. Cuando un lugar está activo sus salidas están a uno.
  • A las transiciones se les asocia eventos (funciones lógicas de las variables de entrada). Una transición se dice que está sensibilizada cuando todos su lugares origen están marcados.
  • Cuando ocurre un evento asociado a una transición (la función lógica se hace uno), se dice que la transición está validada.
Bien ahora vamos a realizar nuestra red de petri con la ayuda de python-snakes.


Bien lo que se hizo fue la del funcionamiento de un elevador

Estos son los estados:
  • Espera
  • BPS = Boton para subir
  • BPB = Boton para bajar
  • Abrirps = puerta se abre para subir
  • Cerrar = puerta se cierra para el viaje
  • P1 = Piso 1 
  • P2 = Piso 2
  • P3 = Piso 3 
  • Abrirpb = se abre elevador para bajar.
Estas son las transiciones:
  • Selec Pet = Selecciona peticion(para que llegue el elevador).
  • Esperabps = Espera la llegada si presiono BPS.
  • Esperabpb = Espera la llegada si presiono BPB.
  • Tiempo Subida = Tiempo para abordar el elevador.
  • Presion P1 = Se preciono la tecla P1.
  • Presion P2 = Se preciono la tecla P2.
  • Presion P3 = Se preciono la tecla P3.
  • Tiempo Bajada = Tiempo para bajar del elevador.
  • if btn <= 1 = esta es condicion por si otro boton esta presionado.



Aqui la imagen que me lanza python snake:





Aqui esta el codigo:
#Librerias
from snakes.nets import *
from snakes.data import *
import snakes.plugins
snakes.plugins.load('gv', 'snakes.nets', 'nets')
from nets import *
e = PetriNet("Elevador")
#Estados del sistema
e.add_place(Place('Espera',[0]))
e.add_place(Place('BPS',[1]))
e.add_place(Place('BPB',[1]))
e.add_place(Place('Abrirps',[2]))
e.add_place(Place('Cerrar',[3]))
e.add_place(Place('P1',[4]))
e.add_place(Place('P2',[4]))
e.add_place(Place('P3',[4]))
e.add_place(Place('Abrirpb',[5]))
#Transiciones del sistema
e.add_transition(Transition('Selec Pet'))
e.add_transition(Transition('Esperabps'))
e.add_transition(Transition('Esperabpb'))
e.add_transition(Transition('Tiempo Subida'))
e.add_transition(Transition('Presion P1'))
e.add_transition(Transition('Presion P2'))
e.add_transition(Transition('Presion P3'))
e.add_transition(Transition('Tiempo Bajada'))
e.add_transition(Transition('if btn <= 1'))
#Uniones y salidas de las transiciones
e.add_input('Espera', 'Selec Pet', Variable('escoge'))
e.add_output('BPS', 'Selec Pet', Expression('presionado'))
e.add_output('BPB', 'Selec Pet', Expression('presionado'))
e.add_input('BPS','Esperabps', Variable('contadort'))
e.add_input('BPB','Esperabpb', Variable('contadort'))
e.add_output('Abrirps', 'Esperabps', Expression('llegada'))
e.add_output('Abrirps', 'Esperabpb', Expression('llegada'))
e.add_input('Abrirps', 'Tiempo Subida', Variable('inicia'))
e.add_output('Cerrar', 'Tiempo Subida', Expression('Termina'))
e.add_input('Cerrar','Presion P1',Variable('eleccion'))
e.add_input('Cerrar','Presion P2',Variable('eleccion'))
e.add_input('Cerrar','Presion P3',Variable('eleccion'))
e.add_output('P1','Presion P1',Expression('llegada'))
e.add_output('P2','Presion P2',Expression('llegada'))
e.add_output('P3','Presion P3',Expression('llegada'))
e.add_input('P1','Tiempo Bajada',Variable('Contador'))
e.add_input('P2','Tiempo Bajada',Variable('Contador'))
e.add_input('P3','Tiempo Bajada',Variable('Contador'))
e.add_output('Abrirpb','Tiempo Bajada',Expression('llegada'))
e.add_input('Abrirpb','if btn <= 1',Variable('maspresiones'))
e.add_output('Cerrar','if btn <= 1',Expression('regresa'))
e.add_output('Espera','if btn <= 1', Expression('Empieza'))
#Se dibuja todo
e.draw('redpetri.png')
view raw petri.py hosted with ❤ by GitHub


Referencias:
http://es.wikipedia.org/wiki/Red_de_Petri
Tutorial

1 comentario: