Professional Documents
Culture Documents
Sommaire.
- Code PetriNet2Tina
- Code SimplePDL2PetriNet
1
I. Meta-modélisation avec Elipse/EMF et Topcased
2
Pour valider le modèle Ecore, il a fallu de sauvegarder le modèle et après cliquer sur le symbole
vert suivant.
Grâce a une brique d’EMF(plug-in – Version Eclipse Europa -), on a généré un éditeur
arborescent permettant de saisir un Process conforme à SimplePDL.
Le fichier SimplePDF.genmodel nous a permit aussi, avec l’éditeur arborescente, de générer du
code Java.
Topcased propose un outil qui nous permet d’engendrer un éditeur graphique conforme au
meta-modèle SimplePDL et le fichier genmodel, qui contient les configurations des modèles à
éditer.
L’étape suivant la création d’un fichier de configuration de l’éditeur est la création d’un fichier de
configuration de diagramme. Un diagramme définit une vue editable sur le modèle dans
l’éditeur graphique. Ce fichier doit être lié au genmodel et à l'éditeur à créer.
Il faut configurer :
La palette de l'éditeur.
3
Le texte d’une guidance doit être défini et non vide.
Une WorkSequence ne peut pas avoir même cible et même source.
Les contraintes sont codées en ATL. Prenons par exemple, la première contrainte :
pdl!Process.allInstances()->asSequence()->first().workDefinitions->size() > 0
Vérification en ATL :
4
II. Transformation des Modèles
Notre objectif a été de faire des verifications sur des modeles de procesus. L’idee est de
transformer le modele de processus dans un langage forme l (semantique de traduction).
5
Le schéma ci-dessous montre la transformation d’un work sequence à une arc-lecture entre la
place de la source work definition et la transition approprié du target work definition.
On a écrit une requête ATL qui transforme un modèle de Petri Net vers Tina, pour traiter toutes
les caractéristiques d’un model de réseaux de Petri, afin de pouvoir visualiser et simuler un
réseau de Pétri sous Tina.
Pour faire cette partie, on a défini une configuration pour spécifier les meta- modèles et
modèles utilises par une requête ou un module ATL, et après on a complété la requête pour
atteindre le but ci-dessus.
6
III. Questions
Ecore permet d'exprimer un certain nombre d'information structurelles, mais pas toutes. Pour faire des
instances valides des modèles, on a OCL (Object Constraint Language), qui permet de rajouter des
contraintes qu’on ne peut pas trouver sous Ecore. Un clair exemple est PetriNet et ses transitions, on doit
utiliser les contraints d’OCL pour faire des instances valides.
Un modèle sous réseau de Pétri est composé de nœuds, qui permettent de faire une représentation par
transitions et/ou places. Ça permette d’exprimer notre modèle d’une façon plus réel et temporelle, dans
certain intervalle qui contient un temps max et min. En SimplePDL on a aussi des contraints de temps,
mais SimplePDL est une version beaucoup simplifié, pour garder notre présentation d’une manière plus
simple, mais on peut commettre des erreurs grâce a qu’on peut lier des transitions incorrectement.
Quel est l'intérêt de passer par le méta-modèle PetriNet plutôt que de faire directement une
transformation SimplePDL vers Tina ?
Le modèle des réseaux de Petri est considéré comme un meta-modèle pivot. On peut par exemple
changer une boite a outil, il suffira d’écrire une nouvelle transformation M2T (Modèle vers Texte –Petri
vers Tina-). On peut aussi considérer un autre modèle que les processus et, dans ce cas, c’est la
transformation M2M (Modèle vers modèle – Simple PDL vers Petri Net-) qu’il faut changer.
Dans la dernière question, on a dit que la tranformation nous permette d’exprimer notre modèle d’une
façon plus réel et temporelle, et on a Tina comme model-checker de Petri.
En plus, Tina comme model-checker de Petri Net, la configuration pour la gestion de Petri Net existe
déjà. Ecrire cette même configuration pour SimplePDL, n’est pas nécessaire (ça serait trop long), il suffira
d'écrire une transformation SimplePDL à PétriNet.
Quel intérêt de vérifier des propriétés sous Tina par rapport aux propriétés exprimées en OCL ?
Avec la boite à outils de Tina, on peut vérifier les modèles de processus et plus de propriétés.
7
III. Annexes
Code PetriNet2Tina
--@atlcompiler atl2006
-- build a net file from a Petri net model
query PetriNet2Tina = PetriNet!PetriNet->allInstances()
->first().toTina().writeTo('/tmp/res.net');
helper
def: concatenateStrings(strings: Sequence(String), terminator: String): String =
strings->iterate(s; acc: String = '' | acc + s + terminator);
helper
context PetriNet!PetriNet
def: toTina(): String = ('net ' + self.name + '\n') +thisModule.concatenateStrings(
self.nodes-> collect(n|n.toTina()),'\n');
helper
context PetriNet!Node
def:toTina():String =(self.toTina() +'\n' );
helper
context PetriNet!Place
def:toTina():String =('pl ' + self.name+ ' ' + '(' + self.marking.toString() + ')');
helper
context PetriNet!Transition
def:toTina():String =
'tr ' + self.name +' ' + thisModule.concatenateStrings(self.ingoings-> collect(i|i.toTina()),' ')
+ ' -> ' + thisModule.concatenateStrings(self.outgoings-> collect(j|j.target.name()) ,' ');
helper
context PetriNet!Arc
def:toTina():String =(
self.source.name +
if (self.kind = #read_arc)
then ('?' +self.weigth.toString() )
else if (self.weigth>1)
then ('*'+self.weigth.toString())
else ' '
endif
endif );
Code SimplePDL2PetriNet
8
-- @atlcompiler atl2006
-- Description : SimplePDL (Model) to PetriNet (Model) transformation
module SimplePDL2PetriNet;
create OUT : PetriNet from IN : SimplePDL;
rule Process2PetriNet {
from process : SimplePDL!Process
to petrinet : PetriNet!PetriNet (name <- process.name)
}
rule WorkDefinition2PetriNet {
from wd : SimplePDL!WorkDefinition
to process_isNotStarted : PetriNet!Place (name <- wd.name+'_isNotStarted' ,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
process_isStarted : PetriNet!Place (name <- wd.name+'_isStarted' ,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
process_isInProgress : PetriNet!Place (name <- wd.name+'_isInProgress' ,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
process_isFinished : PetriNet!Place (name <- wd.name+'_isFinished' ,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
transition_start : PetriNet!Transition (name <- wd.name+'_start' ,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
transition_finish : PetriNet!Transition (name <- wd.name+'_finish' ,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
arc1 : PetriNet!Arc (weigth <- 1 ,
kind <- #normal,
source <- process_isNotStarted,
target <- transition_start,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
arc2 : PetriNet!Arc (weigth <- 1 ,
kind <- #normal,
source <- transition_start,
target <- process_isInProgress,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
arc3 : PetriNet!Arc (weigth <- 1 ,
kind <- #normal,
source <- transition_start,
target <- process_isStarted,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
arc4 : PetriNet!Arc (weigth <- 1 ,
kind <- #normal,
source <- process_isInProgress,
target <- transition_finish,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet')),
9
arc5 : PetriNet!Arc (weigth <- 1 ,
kind <- #normal,
source <- transition_finish,
target <- process_isFinished,
net <- thisModule.resolveTemp(SimplePDL!Process->allInstances()->first() ,
'petrinet'))
}
rule Worksequence2PetriNet {
from ws : SimplePDL!WorkSequence
to a : PetriNet!Arc ( weigth <- 1, kind <- #read_arc,source <- if (ws.linkType =
#startToStart or ws.linkType = #startToFinish)
then thisModule.resolveTemp(ws.predecessor , 'process_isStarted ')
else thisModule.resolveTemp(ws.predecessor , 'process_isFinished ')
endif, target <- if (ws.linkType = #startToStart or ws.linkType = #finishToStart)
then thisModule.resolveTemp(ws.successor , 'transition_start ')
else thisModule.resolveTemp(ws.successor , 'transition_finish ')
endif
)
}
10