Академический Документы
Профессиональный Документы
Культура Документы
Tutor:
Prof. Edgar Chacón
Jurado:
Prof. Eladio Dapena
Índice de Tablas IX
Índice de Figuras X
Agradecimientos XIII
Resumen XV
1. Introducción 1
1.1. Sistemas de Eventos Discretos . . . . . . . . . . . . . . . . . . . . 1
1.2. Definición del Problema . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Motor de Ejecución de Redes de Petri . . . . . . . . . . . . . . . . 3
1.4. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4.1. Objetivo General . . . . . . . . . . . . . . . . . . . . . . . 3
1.4.2. Objetivos Especı́ficos . . . . . . . . . . . . . . . . . . . . . 4
1.5. Descripción de los Siguientes Capı́tulos . . . . . . . . . . . . . . . 4
2. Redes de Petri 5
2.1. Introducción a las Redes de Petri . . . . . . . . . . . . . . . . . . 5
2.1.1. Definición Informal de una Redes de Petri . . . . . . . . . 5
2.1.2. Definición Formal de una Red de Petri . . . . . . . . . . . 7
2.1.3. Notación Matricial de una Red de Petri . . . . . . . . . . . 8
2.1.4. Red de Petri Pura . . . . . . . . . . . . . . . . . . . . . . 9
2.1.5. Habilitación de una Transición . . . . . . . . . . . . . . . . 10
v
2.1.6. Disparo de una Transición . . . . . . . . . . . . . . . . . . 11
2.1.7. Conflicto Estructural y Efectivo . . . . . . . . . . . . . . . 12
2.1.8. Secuencia de Disparo . . . . . . . . . . . . . . . . . . . . . 13
2.1.9. Conjunto de Marcaciones Accesibles . . . . . . . . . . . . . 14
2.1.10. Redes de Petri Acotadas . . . . . . . . . . . . . . . . . . . 14
2.2. Redes de Petri con Arcos Inhibidores . . . . . . . . . . . . . . . . 15
2.3. Máquinas de Estado y Redes de Petri . . . . . . . . . . . . . . . . 16
2.4. Redes de Petri de Alto Nivel . . . . . . . . . . . . . . . . . . . . . 17
5. Implementación 47
5.1. El API de Componentes . . . . . . . . . . . . . . . . . . . . . . . 47
5.1.1. Data del Componente ComponentData . . . . . . . . . . . 48
5.1.2. Objeto Acuarela ComponentObject . . . . . . . . . . . . . 49
5.1.3. Objeto de Ejecución ComponentRuntime . . . . . . . . . . 51
5.1.4. Fábrica de Componentes ComponentFactory . . . . . . . . 52
5.1.5. Archivo Descriptor de Componentes . . . . . . . . . . . . . 53
5.2. El Documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.2.1. Representación del Documento en Memoria . . . . . . . . 53
5.2.2. Representación del Documento en XML . . . . . . . . . . 54
5.3. El Motor de Ejecución . . . . . . . . . . . . . . . . . . . . . . . . 56
5.3.1. Interfaz de Administración, Capturador de Eventos . . . . 56
5.3.2. Manejador de Sucesos . . . . . . . . . . . . . . . . . . . . 58
5.3.3. Repositorio de Redes de Petri . . . . . . . . . . . . . . . . 58
5.3.4. Manejador de Eventos . . . . . . . . . . . . . . . . . . . . 60
5.4. El Editor de Redes de Petri . . . . . . . . . . . . . . . . . . . . . 62
5.4.1. Clases del Editor de Redes de Petri . . . . . . . . . . . . . 63
6. Conclusiones y Recomendaciones 65
6.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.2. Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
C. Acrónimos 81
Bibliografı́a 82
Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Índice de cuadros
ix
Índice de figuras
xi
3.8. Lugar de Fichas Coloreadas . . . . . . . . . . . . . . . . . . . . . 31
3.9. Lugar Asociado a Código Java . . . . . . . . . . . . . . . . . . . . 32
xiii
Resumen
Descriptores Cota
Sistemas de control de supervisión *
Redes de Petri TJ222
G88
xv
Capı́tulo 1
Introducción
En general, todo sistema tiene asociada una dinámica que representa los cam-
bios que pueden ocurrir en las variables del mismo. De forma que los diferentes
elementos de un sistema evolucionan de acuerdo a un conjunto de leyes propias
que describen su evolución natural, bien sea fı́sica o quı́mica, y que puede ser del
tipo x = f (x, u), en el caso de que el sistema sea continuo, o xk+1 = ft (xk , σk )
si el sistema es de dinámica discreta. Un caso especial se presenta en los siste-
mas hı́bridos, que se componen de elementos continuos y elementos discretos.
En principio, existen muchas herramientas y técnicas para modelar y predecir la
dinámica continua y discreta de un sistema. Sin embargo, desde el punto de vista
de los sistemas de eventos discretos, una que ha resultado especialmente exitosa
ha sido la utilización de redes de Petri.
t
a)
t
b)
1.4. Objetivos
Redes de Petri
Según (Janette Cardoso, Robert Valette, 1997), las redes de Petri son una
herramienta gráfica y matemática que se adapta bien a un gran número de apli-
caciones en que las nociones de eventos, estados y evoluciones simultáneas son
importantes.
La Figura 2.2 muestra un ejemplo simple de una red de Petri, formada por las
transiciones t1 , t2 y t3 y los lugares p1 , p2 , p3 y p4 . La transición t3 , por ejemplo,
tiene dos lugares de entrada (p2 y p3 ) y dos lugares de salida (p3 y p4 ). Los arcos
dirigidos se encargan de definir con que lugares (entrada y salida) está asociada
una transición. En este caso, en particular, p3 es tanto un lugar de entrada de t3
como un lugar de salida.
t2
t1 [2]
p2
t3
p1 p4
p3
Los lugares de una red de Petri pueden tener fichas, las cuales se denotan
2.1 Introducción a las Redes de Petri 7
utilizando puntos dentro del cı́rculo que representa el lugar que las contiene. En
el ejemplo de la Figura 2.2, los lugares p1 y p4 tienen una ficha cada uno, p2 tiene
dos fichas y p3 ninguna.
En donde:
t1 t3
[3]
p1 p2 p3
[3]
t2 t4
t t2 t3 t4
1
0 1 0 0 p1
(2.2)
P re =
1 0 3 0 p2
0 0 0 1 p3
t t2 t3 t4
1
1 0 0 0 p1
(2.3)
P ost =
0 1 0 3 p2
0 0 1 0 p3
Además, se define la matriz caracterı́stica, o de incidencia, C de la red como:
C = P ost − P re (2.4)
t1 t2 t3 t4
1 −1 0 0 p1
(2.5)
C=
−1 1 −3 3 p2
0 0 1 −1 p3
Para esta red, de la matriz C, se infiere entre otras cosas, que al dispararse
la transición t3 se removeran tres fichas del lugar p2 y se añadirá una a p3 . En
general, se utiliza la notación P re(., t), P ost(., t) y C(., t) para referirse a la
columna asociada a la transición t una de alguna de estás matrices.
Desde el punto de vista matricial, la marcación de la red se representa con un
vector columna M , cuya dimensión es el tamaño n del conjunto de lugares P y
que contiene los valores de M (p) para todos los lugares de la red.
Es decir, una red de Petri es pura si no existe un lugar que sea a la vez entrada
y salida de una misma transición. En otras palabras, también se puede decir que
una red es pura si la intersección de los lugares de entrada con los de salida
es vacı́a. Por ejemplo, las redes de Petri de las Figuras 2.2 y 2.4 no son puras,
mientras que la de la Figura 2.3 es pura.
Matemáticamente, una red impura genera matrices P re y P ost que sobrepo-
nen en algún lugar valores distintos de cero (consecuencia directa de la ecuación
2.6), cosa que no ocurre en una red pura. Esto puede apreciarse en la red pura
de la Figura 2.3 y en sus matrices P re y P ost mostradas en las Ecuaciones 2.2 y
2.3, donde no existe ninguna combinación (p, t) que produzca entradas en P re y
en P ost distintas de cero simultáneamente. Por ejemplo, las matrices P re y P ost
de la red impura de la Figura 2.4 son:
10 Redes de Petri
t1 t3
[3]
p1 p2 p3 t5
[3]
t2 t4
t t2 t3 t4 t5
1
0 1 0 0 0 p1
(2.7)
P re =
1 0 3 0 0 p2
0 0 0 1 1 p3
t t2 t3 t4 t5
1
1 0 0 0 0 p1
(2.8)
P ost =
0 1 0 3 0 p2
0 0 1 0 1 p3
Donde se hace evidente que P re(p3 , t5 )P ost(p3 , t5 ) = 1, es decir, que existe al
menos una entrada que es distinta de cero en P re y que al mismo tiempo lo es
en P ost. Por otra parte, en la Figura 2.4 se aprecia que la red no es pura porque
la transición t5 tiene a p3 como lugar de entrada y salida al mismo tiempo.
t1 t2
p1 p3 p5 p7
p2 p4 p6 p8
t1 t1
p1 p3 p1 p3
p2 p4 p2 p4
p1 p1
t1 p4 t1 p4
p2 p2
t2 p5 t2 p5
p3 p3
a) b)
Por otro lado, se dice que dos transiciones t1 y t2 están en conflicto efectivo
para una marcación M si están en conflicto estructural, es decir, se cumple la
ecuación 2.13, y además están habilitadas (ver Figura 2.7-b).
Dada una red de Petri, es posible llevarla de una marcación M0 a una marca-
ción M2 por medio de una serie de disparos de transiciones. Esto puede anotarse,
por ejemplo, de la siguiente forma:
t1 ,t2 (2.14)
M0 −→ M2
0
3
t1 t3
0
t2 t4
1 0
2 0
0 1
t1 t2
2
1
0
t1 t2
3
0
0
Es decir, para todas las marcaciones alcanzables por la red, ningún lugar
tendrá más de k fichas.
Si se analiza el grafo de marcaciones accesibles de la Figura 2.8, es evidente que
la máxima cantidad de fichas contenidas por un lugar para todas las marcaciones
es tres. Por esta razón, se dice que la red de la Figura 2.3 es 3-acotada. Por otra
parte, si una red de Petri no es k-acotada, entonces existe al menos un lugar que
puede llegar a tener un número infinito de fichas, y debido a esto, entonces la red
tendrá un número infinito de estados.
Un ejemplo de una red de Petri no acotada se muestra en la Figura 2.10, y en
su grafo de marcaciones accesibles en la Figura 2.11, donde se aprecia que la red
evoluciona desde su estado inicial por un número infinito de marcaciones.
p1 p3 p2 p1 p3 p2
t1 t2 t1 t2
p4 p5 p4 p5
a) b)
p1
t2 t1 t3
p2 p3
1
0
0
t1
0 t1 1 t2 0 t3 1 t1 0
1 0 1 1 2
2 1 1 0 1
t2 t3
t3 t2
1 1 1
0 1 2
2 1 0
t1 t1 t1
0 0 0
1 2 3
3 2 1
t2 t3 t2 t3 t2 t3
... ... ... ... ... ...
4 1
p1
v
1
t1
v3
p3
(v < v ),
2 3 v 1 2
2
p2
v 3 = v 2 − v1
Las redes de Petri de alto nivel fueron propuestas en 1980, debido a que cuando
se trata de modelar sistemas complejos con redes de Petri tradicionales, éstos
sufren una explosión en tamaño que hace que el modelo sea difı́cil de manejar
(fenómeno similar al que ocurre con las máquinas de estado). En las redes de
Petri tradicionales, las fichas representan objetos simples del mismo tipo y con un
mismo valor. En las redes de alto nivel, las fichas representan una gran variedad de
tipos de datos como booleanos, enteros, reales, arreglos, registros, etc. Además de
los tipos de fichas complejas, las redes de alto nivel incluyen reglas para manipular
la información contenida en las fichas (Robert Esser, 1996).
La red de la Figura 2.12 muestra una red de alto nivel que utiliza fichas de
tipo entero y tiene una transición con una función guarda G(t) = v1 ≤ v2 y una
función de salida F (t) = v2 − v1 . La función guarda es una restricción adicional
que debe cumplirse para que la transición esté habilitada, mientras que, la función
de salida se encarga de generar las fichas adecuadas en los lugares de salida de la
transición.
Si bien las redes de alto nivel son conceptualmente mucho mas complejas que
las redes de Petri tradicionales, esta complejidad adicional se ve compensada por
el hecho de que es posible modelar sistemas más complejos con mayor facilidad.
Algunos autores (Gile & DiCesare, *) comparan la evolución de los distintos tipos
de redes de Petri con la de los lenguajes de programación (ver Figura 2.13). Sobre
este punto, afirman que las máquinas de estados son comparables con los lenguajes
de ensamblador, es decir, si bien son eficientes, las posibilidades de desarrollo
20 Redes de Petri
Menos Errores
Abstraccion
Eficiencia
Lenguajes de Alto Nivel
Redes de Petri
C, Pascal, Fortran, etc
son muy limitadas. Por otro lado, las redes de alto nivel son comparables con
los lenguajes de alto nivel, en donde la eficiencia es un poco menor que en los
lenguajes de bajo nivel, pero las posibilidades de desarrollo son mucho mayores.
Capı́tulo 3
3.1. Eventos
Los eventos son los estı́mulos originados por el mundo exterior que producen
cambios en una red de Petri. Una red cambia de estado y evoluciona en función
22 Modelo Ampliado de Redes de Petri
de los eventos que reciba y del orden en que sean procesados. Para que un evento
produzca un cambio de estado en una red de Petri, debe existir una transición
habilitada asociada al mismo. En la siguiente sección se detallan las condiciones
que deben cumplirse bajo el modelo ampliado de redes de Petri para que una
transición esté habilitada.
Los eventos representan sucesos del mundo exterior. Un evento puede repre-
sentar sucesos tan distintos como el inicio de un proceso de producción, un usuario
pulsando un enlace o un botón de una página Web, la apertura de una válvula o
la averı́a de una máquina, entre otros. Algunos eventos tienen asociadas porciones
de información que son necesarias para describirlos.
Por otra parte, un evento debe poder ejecutarse de forma atómica, es decir,
sin interrupción desde que comienza hasta que termina. Esto es imprescindible
para mantener la integridad de la red de Petri y de la información asociada a
la misma. Una red de Petri nunca puede estar ejecutando dos eventos de forma
simultánea.
3.2 Transiciones 23
3.2. Transiciones
Las transiciones son los componentes asociados a la dinámica de la red de
Petri. Representan la reacción de la red frente a los eventos del mundo exterior.
Las transiciones están asociadas a eventos. Cada transición puede estar aso-
ciada sólo a un único evento, pero un evento puede estar asociado a muchas
transiciones dentro de una misma red. Una transición depende de dos factores
para que pueda dispararse, el primero, que llegue el evento al cual está asociada,
y el segundo que esté habilitada. Una transición está habilitada si puede ejecutar
con éxito todas sus aristas asociadas. Las aristas entrantes están asociadas con las
pre-condiciones de la transición, mientras que las aristas salientes están asociadas
con las post-condiciones.
p3
0 0 0
p1 1 1 1 p2
0 0 0
0 0
p4 1 1 p5
0 0
2. La transición ejecuta todas sus aristas entrantes y verifica que estén habi-
litadas.
3. La transición ejecuta todas sus aristas salientes y verifica que estén habili-
tadas.
p2
1 1 1
p1 1 1 1 p3
0 0 0
Lugares Compartidos
e1 e2
t1 t2
0 0 0
p4 1 1 1 p6
0 0 0
p5
Es por esto que el motor debe garantizar que la ejecución de un evento trans-
curra de forma atómica, sin interrupciones desde que comienza hasta que termina.
En otras palabras, un evento está asociado a una serie de transiciones, y éstas a
una serie de lugares y aristas. Pero muchos lugares son compartidos por varias
transiciones, asociadas a su vez con otros tipos de eventos. De esta forma, es ne-
cesario que la ejecución de un evento y sus transiciones asociadas ocurra sin que
otro evento asociado a otras transiciones interfiera, siempre y cuando comparta
lugares con el primer evento.
t1
e1
t1
e1
1
p1 1
0
e1 t1 t2 e2
0
1 p2
0
t1
e1
3.3. Lugares
Los lugares son los componentes de una red de Petri asociados al estado de la
red.
El estado de una red de Petri, en un instante determinado, viene dado por la
marcación de la red. En el caso de una red de Petri clásica, que sólo tiene lugares
con fichas, la marcación de la red viene dada por el número de fichas que están
presentes en cada uno de los lugares de la red. En el caso del modelo ampliado de
redes de Petri, la situación se complica porque la red no sólo está compuesta por
lugares con fichas. La red puede tener lugares complejos en los que no siempre
es fácil y claro ver cual es la marcación del lugar. Por ejemplo, un lugar puede
representar una consulta a una base de datos, siendo la marcación 1 si la consulta
no es vacı́a y 0 si la consulta no genera resultados.
Además, las redes de Petri clásicas son grafos bipartitos no ponderados, es
decir, que lo único que importa de una arista es de donde viene y a donde va.
Sin embargo, el modelo ampliado aquı́ propuesto, sugiere que las aristas tengan
una función más protagónica en la ejecución de la red, cumpliendo un papel en
la evaluación de la habilitación de un lugar. Por ejemplo, en el caso de un lugar
con fichas coloreadas, la arista que lo conecta con su transición asociada puede
especificar el número de fichas de cada color que se deben desplazar para que el
lugar esté habilitado.
que ahora es posible tener un sin fin de lugares de distintos tipos interactuando
juntos en una misma red, de modo que ya no existe una sola forma de representar
la marcación de un lugar. En general, la marcación de un lugar, sirve en el modelo
clásico de redes de Petri para determinar si el lugar está o no habilitado, pero en
el modelo extendido se puede dar el caso de que, sin la presencia de un evento
(con sus respectivos parámetros), no sea posible determinar si un lugar está o no
habilitado. Ese es el caso de los Lugares Asociados a Código JavaTM , donde la
habilitación o no del lugar depende del código que se ejecute y de los parámetros
asociados al evento.
Por las razones expuestas anteriormente, el modelo ampliado define la mar-
cación de un lugar como un elemento particular al tipo de lugar. Es decir, para
un lugar de fichas, la marcación será el número de fichas presentes (como en el
modelo clásico). Para un lugar con fichas coloreadas, la marcación será una tabla
cuya clave es el color y que tiene por valor en cada entrada el número de fichas
presentes en el lugar para el color especificado. Un ejemplo aún más dramático es
el de la marcación de un lugar JavaTM , en el que sólo existen tres posibilidades a
saber: no habilitado, habilitado e indefinido. En general, un lugar JavaTM deberı́a
hacer el mejor esfuerzo para determinar su estado, pero en casos en los que esto
no sea posible, debido a que no están presentes los parámetros de un evento,
entonces la marcación del lugar es indefinida, es decir, no es posible determinar
si está habilitado o no.
0
1
0
p1
p1
p1
Los lugares JavaTM pueden ser utilizados en casos en los que, por ejemplo, la
habilitación de un lugar depende de una consulta a una base de datos o a algún
otro recurso similar. Por otra parte, la ejecución de un lugar de este tipo puede
representar un cambio en algún registro en una base de datos llevado a cabo por
el método invocado a la hora de ejecutar el componente.
3.4. Aristas
Las aristas en las redes de Petri clásicas cumplen la función de enlazar las
transiciones con los lugares. Sin embargo, en el modelo ampliado de redes de Petri,
las aristas juegan un papel más activo. En general, una transición está habilitada
si todas sus aristas entrantes o salientes están habilitadas. Esto es coherente con
la definición de redes de Petri del capı́tulo anterior, donde se especifica que una
arista determina si una transición está o no habilitada dependiendo del número de
fichas que se desean eliminar (o agregar) de un lugar. Las aristas además pueden
funcionar como arcos inhibitorios. En tal situación, una arista estará habilitada
si su lugar asociado no lo está (según los criterios de la arista y el lugar), pero
sin embargo, al momento de su ejecución, la arista debe abstenerse de realizar
cambios en la red de Petri (ver sección 2.2).
con el que conecta según sea el caso. Si la arista va de un lugar a una transición,
entonces las fichas se removerán del lugar, si va de una transición a un lugar,
entonces se añadirán al lugar.
4.1. Requerimientos
1. Debe ser posible agregar componentes para poder crear luego redes com-
plejas.
3. Debe poder correr como librerı́a para ser utilizado localmente desde una
aplicación.
4. Alta portabilidad.
4.2 Arquitectura General del Sistema 37
Cliente Motor BD
Redes de Petri
Serializadas
Editor Motor BD
Interfaz Local
(libreria)
Recuperar una red de la base de datos cuando sea necesario realizar una
operación sobre la misma.
38 Arquitectura del Sistema
No Existe
registro eliminacion
ejecucion de
evento
no en uso
En Ejecucion Pasiva (BD)
requerida
suspender resumir
no en uso
Suspendida
requerida
Interfaz de Repositorio de
administracion Redes de Petri BD
Capturador Manejador de
Cola de Eventos
de eventos Eventos
administración pueda realizar todas las operaciones que le sean requeridas sobre
las redes de Petri del repositorio.
En general, el repositorio de redes es el único módulo que está al tanto de
que las redes de Petri son almacenadas en una base de datos, los demás módulos
sólo utilizan las redes suministradas por el repositorio, independientemente de
que haya que buscarlas en una base de datos o se encuentren ya en memoria.
4.3.5. Componentes
Los componentes (en colaboración con el documento que es explicado más ade-
lante) son la piedra angular del mecanismo de expansión del motor de ejecución.
En este caso, en particular, un componente es un pequeño módulo de software
que interactúa con el motor, una o más redes de Petri, otros componentes, y que
44 Arquitectura del Sistema
Interfaz Documento
Vista
Principal (Red de Petri)
Motor
Motor
Motor
Interfaz de
administracion
4.4.3. Vista
4.4.4. Documento
Como objetivo principal, el documento debe manejar toda la lógica de la
información que contiene, ası́ como los detalles sobre el almacenamiento del mismo
en un medio persistente. Además, el documento es la forma estándar que tienen
el motor el editor y cualquier otro módulo de almacenar y representar redes de
Petri en memoria.
Capı́tulo 5
Implementación
Petri, diferentes todas entre si, pero que tienen en común ciertas caracterı́sticas
funcionales.
Para crear un nuevo tipo de componente (transición, lugar o arista) basta con
implementar adecuadamente las interfaces de la Figura 5.1 y registrar el nuevo
tipo en el archivo descriptor de componentes (ver más adelante). En general, el
tipo debe ser registrado en cada instancia de motor o editor en el que se utilice,
asi como de igual forma, es necesario que las clases que implantan el tipo estén
disponibles en dichas instancias.
de ejecución.
<plugins>
<plugin factory="..."/>
...
<plugin factory="..."/>
</plugins>
5.2. El Documento
<petrinet>
<place name = "..." type = "...">
5.2 El Documento 55
El archivo consta de una lista de lugares, en donde se describe para cada uno
de ellos su nombre y su fábrica de componentes (name y type respectivamente).
Además, cada lugar contiene una lista de objetos XDataObject representados en
XML (ver más adelante). Luego, viene una lista de transiciones, cada una de las
cuales contiene su nombre, su fábrica de componentes, el nombre del evento al que
está asociada (name, type y event), y al igual que los lugares, una lista de objetos
XDataObject. Inmediatamente después, aparece una lista de aristas, donde para
cada una de ellas se describe su nombre, fábrica de componentes, el nombre del
nodo origen y el nombre del nodo destino (name, type, src y dst). Al igual que
56 Implementación
los lugares y transiciones, las aristas también poseen una lista de XDataObject.
Los objetos XDataObject se codifican en XML, especificando su identificador
y el nombre completamente calificado del XClass que lo describe (name y ty-
pe). Además, cada XDataObject posee una lista de propiedades tipo clave-valor
que representa la información que contenı́a el objeto en el momento en que se
almacenó como XML.
Finalmente, el archivo contiene una lista de eventos que pueden afectar a
la red de Petri, describiendo para cada uno de ellos su nombre y especificando
un XClass que define los parámetros que pueden venir adjuntos al evento. Una
descripción más completa y complementaria del formato del documento en XML
se puede apreciar en el apéndice A.
En general, todos los módulos del sistema necesitan manejar ambas represen-
taciones de una red de Petri (en memoria y en XML), pero más importante aún es
la necesidad de obtener una a partir de la otra. La clase PNetFactory cumple esta
función, brindando una serie de métodos (todos estáticos) que permiten obtener
el XML correspondiente a partir de un objeto PNetData y viceversa.
Existen también varias clases auxiliares que sirven para facilitar la comuni-
cación entre el cliente y el motor. Estas clases son PNetQuery, TransQuery y
PNetEvent. La primera sirve para encapsular la información referente al estado
de ejecución de una red de Petri (suspendida o ejecutando), y se utiliza funda-
mentalmente en el método queryPNet de EngineBusiness para listar las redes
que están corriendo en un motor de ejecución. La clase TransQuery se utiliza
para obtener, por medio del método queryTrans, la lista de transiciones de una
red y el estado de cada una de ellas (habilitada, deshabilitada o indeterminado).
Finalmente, PNetEvent representa un evento y es utilizado como parámetro del
método fireEvent.
58 Implementación
“pnets”. La tabla debe tener tres campos para que se puedan almacenar redes
de Petri: El primero es el identificador único de la red, debe llamarse “id” y ser
de tipo “VARCHAR(50)” (además es la clave primaria de la tabla). El segundo
campo representa el estado de ejecución de la red (ejecutando o suspendida),
debe llamarse “status” y ser de tipo entero. El motor utiliza un valor 0 para
indicar que una red está corriendo y un valor 1 para indicar que está suspendida.
Finalmente, el tercer campo, representa el contenido de la red en forma de XML.
Este campo debe ser de un tipo que soporte cadenas de caracteres de longitud
variable (el nombre del tipo varı́a mucho entre los distintos manejadores de bases
de datos) y debe llamarse “data”. Como ejemplo, a continuación se muestra la
sentencia SQL utilizada para crear la tabla “pnets”, utilizando PostgreSQL como
manejador de base de datos:
Seleccionar primera
Inicio transicion
Seleccionar siguiente
transicion initComponentRuntime testComponentRuntime
Si ¿Mas No
transiciones? ¿Habilitada?
No Si
Ejecutar transiciones
Si
No No
La segunda etapa (ver Figura 5.8) se encarga de ejecutar las transiciones habi-
litadas almacenadas en la lista generada por la primera etapa. Esta etapa agrupa
las transiciones habilitadas por precedencia, y trata de ejecutar en bloque y de
forma transaccional todas las transiciones asociadas a un mismo nivel de pre-
cedencia. Si alguna de las transiciones falla en su ejecución (por problemas de
conflicto, ver secciones 2.1.7 y 3.2.1), entonces la ejecución del nivel de prece-
dencia actual es abortada y las transiciones son alertadas por medio del método
rollbackComponentRuntime para que deshagan cualquier cambio realizado. Por
otro lado, si todas las transiciones de un mismo nivel de precedencia tienen éxito
en su ejecución, entonces son notificadas mediante el método commitComponen-
tRuntime para que hagan persistente cualquier cambio realizado.
como cualquier motor que esté corriendo remotamente como servicio). La primera
de estas clases maneja todo lo relacionado a la administración de un motor de
ejecución (listar, eliminar, suspender o resumir redes de Petri), mientras que la
segunda, maneja todo lo vinculado con importar y exportar redes de Petri hacia
y desde el motor.
La clase FrmEditor implanta la vista (ver Figura 4.4) y es la encargada de
interactuar con el documento y con Acuarela para permitir la edición de redes
de Petri. Esta clase tiene dos modalidades de ejecución; la primera permite al
usuario crear y editar redes de Petri, y la segunda le permite conectarse a una
red que esté corriendo en algún motor con el fin de supervisarla y/o enviarle
eventos manualmente.
Capı́tulo 6
Conclusiones y Recomendaciones
6.1. Conclusiones
poderosa que puede utilizarse para atacar esta clase de problemas siempre de la
misma forma. Mejor aún, si la herramienta puede expandirse fácilmente, entonces
se garantiza de esta forma que nunca escaseará un componente determinado.
Por todas estas razones, el autor considera que además del motor de ejecución,
los aportes más importantes del presente trabajo son la definición de un formato
de archivo XML que permita describir redes de Petri, ası́ como la especificación
de una arquitectura de componentes que permite expandir fácilmente el motor
y cualquier aplicación que utilice redes de Petri. En el primer caso, un archivo
estándar que sirve para describir y definir redes, permite el intercambio de las mis-
mas entre distintas aplicaciones. Por otra parte, la arquitectura de componentes
permite definir lugares, aristas y transiciones con casi cualquier comportamiento
deseado. Esto, en conjunto con el formato de archivo XML, se convierte en una
herramienta poderosa para definir, ejecutar, simular y editar redes de Petri.
El presente desarrollo (si bien es totalmente funcional) sirve como primera
aproximación a la solución del problema. De las aplicaciones en las que el motor
sea utilizado y de la experiencia obtenida desarrollando nuevos componentes se
deben derivar futuros trabajos al respecto. Sobre todo, es importante tener en
cuenta que existen muchos problemas en la industria (y no sólo los relacionados
con la industria de la manufactura, sino también los relacionados con la industria
del desarrollo de software) que pueden ser fácilmente resueltos utilizando redes de
Petri. Por esta razón, un motor que permita ejecutar tales tipos de redes, puede
resultar una herramienta invaluable, sobre todo si éste se combina con software
pensado para manejar procesos de producción, sobre todo dentro del enfoque
holónico.
6.2. Recomendaciones
Muchas de estas recomendaciones salen de la lista de “TODO”’s (“por hacer”)
del software, que generalmente está formada por comentarios en el código fuente
del mismo. Es importante recordar que el desarrollo de software es un proceso de
6.2 Recomendaciones 67
Serı́a importante a largo plazo implementar todas las interfaces del motor
(administración, capturador de eventos y notificación de sucesos), utilizando
JMS de forma ası́ncrona o, en el peor de los casos, utilizando un Message
Driven Session Bean en lugar de un Session Bean. Esto harı́a más sencilla la
comunicación con el motor (desde el punto de vista del cliente y del servidor)
y permitirı́a facilitar la portabilidad del motor entre distintos servidores de
aplicaciones.
Una red de Petri se puede describir en XML mediante una lista de lugares,
transiciones, aristas y eventos. A continuación se muestra un ejemplo de la es-
tructura del archivo XML:
<petrinet>
<place name = "..." type = "...">
<data-object name = "..." type = "...">
<property key = "..." value = "..."/>
...
</data-object>
...
</place>
...
<transition name = "..." type = "..." event = "...">
<data-object name = "..." type = "...">
<property key = "..." value = "..."/>
...
</data-object>
72 Definición de Redes de Petri en XML
...
</transition>
...
<edge name = "..." type = "..." src = "..." dst = "...">
<data-object name = "..." type = "...">
<property key = "..." value = "..."/>
...
</data-object>
...
</edge>
...
<event name = "...">
<class name="..."></class>
</event>
...
</petrinet>
El XML contiene:
3. Una lista de aristas que se describen por medio de la etiqueta <edge na-
me=”...”type=”...”src=”...”dst = ”...”>. Donde name contiene el nombre
A Definición de Redes de Petri en XML 73
Por otra parte, cada lugar, transición o arista contienen una lista de data
objects que sirven para describir las propiedades particulares de los componentes.
Un data object se representa mediante la etiqueta <data-object name = ”...”type
= ”...”>, donde name es el nombre del objeto y type es su descripción en XClass.
Cada data object contiene una lista de propiedades que se representan por medio
de etiquetas <property key = ”...”value = ”.../>, donde key representa el nombre
o la clave de la propiedad y value el valor de la misma. En general, dos instancias
distintas de un mismo tipo de componente comparten data objects del mismo tipo
y nombre, pero que están parametrizados de forma distinta según las necesidades
de cada instancia.
Finalmente, cada evento representado en la lista de eventos contiene un des-
criptor XClass que sirve para definir los parámetros asociados al mismo. En el
apéndice B se puede obtener información más detallada respecto a XClass.
Por ejemplo, un lugar de fichas (ver sección 3.3.2) puede describirse de esta
forma:
<place name="p1"
type="org.cyrano.pnet.plugins.plugins.TokenPlaceFactory">
<data-object name="aPlaceData"
type="org.cyrano.pnet.editor.acuarela.APlaceData">
<property key="X_obj" value="168"/>
<property key="X_lbl" value="168"/>
<property key="Y_obj" value="323"/>
<property key="Y_lbl" value="360"/>
74 Definición de Redes de Petri en XML
</data-object>
<data-object name="properties"
type="org.cyrano.pnet.mapping.TokenPlace">
<property key="token-cnt" value="1"/>
<property key="token-max" value="2"/>
<property key="token-min" value="0"/>
</data-object>
</place>
De esta forma, se describe un lugar llamado p1 que tiene como fábrica de com-
ponentes a la clase org.cyrano.pnet.plugins.plugins.TokenPlaceFactory. Además,
la descripción del lugar está formada dos data objects, el primero, llamado aPla-
ceData, que contiene información geométrica del mismo (donde dibujarlo) y el
segundo, llamado properties, que contiene la parametrización concreta que define
el comportamiento de este lugar en particular. En este caso, el data object pro-
perties especifica que el lugar contiene una ficha y que puede tener un máximo de
dos y un mı́nimo de cero (token-cnt, token-max y token-min respectivamente).
Un ejemplo que define una transición:
<transition name="t1"
type="org.cyrano.pnet.plugins.plugins.SimpleTransFactory"
event="evt_A">
<data-object name="aTransData"
type="org.cyrano.pnet.editor.acuarela.ATransData"> ...
</data-object>
<data-object name="default-properties"
type="org.cyrano.pnet.mapping.TransDefaultProperties">
<property key="precedence" value="0"/>
</data-object>
</transition>
A Definición de Redes de Petri en XML 75
<edge name="edge1"
type="org.cyrano.pnet.plugins.plugins.TokenEdgeFactory"
src="t1" dst="p1">
<data-object name="default-properties"
type="org.cyrano.pnet.mapping.EdgeDefaultProperties">
<property key="inhibitor" value="true"/>
</data-object>
<data-object name="properties"
type="org.cyrano.pnet.mapping.TokenEdge">
<property key="token-weight" value="1"/>
</data-object>
</edge>
De igual forma, en el XML anterior se aprecian los data objects de una arista.
Este caso particular define una arista de fichas (ver sección 3.4.1), y el peso de
la misma se describe con en el data object properties por medio de la propiedad
entera token-weight. Por otra parte, el data object default-properties debe estar
presente en todos los tipos de aristas y debe contener al menos una propiedad de
tipo booleano llamada inhibitor, esto con el fin de representar arcos inhibidores
(ver sección 2.2).
76 Definición de Redes de Petri en XML
Apéndice B
Acrónimos
Referencias
A.H. Lewis. (1999). An introduction to petri nets.
Eric S. Raymond. (2000). The cathedral and the bazaar.
http://www.tuxedo.org/ esr/writings/cathedral-bazaar/.
Gile, M. R., & DiCesare, F. (*). Toward distributed simulation of complex
discrete event systems represented by colored petri nets: A review.
Harald Störrle. (1998). An evaluation of high-end tools for petri nets.
Janette Cardoso, B. Pradin-Chézalviel. (1997, Jun). Logic and fuzzy petri nets.
A Workshop within the XVIII International Conference on Applications
and Theory of Petri Nets.
Janette Cardoso, Robert Valette. (1997). Redes de petri. Editora da Universidade
Federal de Santa Catarina.
Krzysztof Sacha. (2001, Dec). Fault analysis using petri nets.
Kurt Jensen. (1997). A brief introduction to coloured petri nets. 203-208. Lecture
Notes in Computer Science Vol. 1217, Springer-Verlag.
The petri nets world. (2004). URL: http://www.daimi.au.dk/PetriNets/. (An on-
line database of Petri net-related conferences, mailing lists, bibliographies,
tool databases, newsletters, research groups, etc)
Raskin, J., Tan, Y., & Torre, L. van der. (1996). How to model normative
behavior in petri nets.
Robert Esser. (1996). An object oriented petri net approach to embedded system
design. Unpublished doctoral dissertation.
Robert Valette, Brigitte Pradin-Chézalviel, François Girault. (*). An introduction
to petri net theory.
Valette, R. (1997). Some issues about petri net application to manufacturing and
process supervisory control. In ICATPN (p. 23-41).