Model-Checking eines Materialflusssystems mittels UPPAAL und SMV
Model-Checking eines Materialflusssystems mittels UPPAAL und SMV
Model-Checking eines Materialflusssystems mittels UPPAAL und SMV
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Fachbereich 17 • Mathematik – Informatik<br />
Arbeitsgruppe Softwaretechnik<br />
Warburger Strasse 100<br />
33098 Paderborn<br />
<strong>Model</strong>-<strong>Checking</strong> <strong>eines</strong> <strong>Materialflusssystems</strong><br />
<strong>mittels</strong> <strong>UPPAAL</strong> <strong>und</strong> <strong>SMV</strong><br />
Bachelorarbeit<br />
zur Erlangung des Grades<br />
Bachelor of Computer Science“<br />
”<br />
für den integrierten Studiengang Informatik<br />
von<br />
Martin Hirsch<br />
Batenhorstweg 3<br />
59494 Soest<br />
<strong>und</strong><br />
Markus Zarbock<br />
Wehler Weg 52<br />
31785 Hameln<br />
vorgelegt bei<br />
Herrn Prof. Dr. Wilhelm Schäfer<br />
<strong>und</strong><br />
Frau Prof. Dr. Gitta Domik<br />
Paderborn, den 10. September 2002
Erklärung<br />
Ich versichere, dass ich die namentlich kenntlich gemachten Teile 1 der Arbeit<br />
ohne fremde Hilfe <strong>und</strong> ohne Benutzung anderer als der angegebenen Quellen angefertig<br />
habe <strong>und</strong> dass die Arbeit in gleicher Form noch keiner anderen Prüfungsbehörde<br />
vorgelegen hat <strong>und</strong> von dieser als Teil einer Prüfungsleistung angenommen<br />
wurde. Alle Ausführungen, die wörtlich oder sinngemäß übernommen wurden,<br />
sind als solche gekennzeichnet.<br />
Paderborn, den 3. August 2004<br />
Martin Hirsch<br />
Ich versichere, dass ich die namentlich kenntlich gemachten Teile 1 der Arbeit<br />
ohne fremde Hilfe <strong>und</strong> ohne Benutzung anderer als der angegebenen Quellen angefertig<br />
habe <strong>und</strong> dass die Arbeit in gleicher Form noch keiner anderen Prüfungsbehörde<br />
vorgelegen hat <strong>und</strong> von dieser als Teil einer Prüfungsleistung angenommen<br />
wurde. Alle Ausführungen, die wörtlich oder sinngemäß übernommen wurden,<br />
sind als solche gekennzeichnet.<br />
Paderborn, den 3. August 2004<br />
Markus Zarbock<br />
1 Unterkapitel, die nicht mit einem Namen gekennzeichent sind, wurden von dem Autor<br />
erstellt, der im letzten vorherigen Oberkapitel genannt wurde
Zusammenfassung<br />
In dieser Studienarbeit werden zwei verschiedene <strong>Model</strong>-Checker Werkzeuge,<br />
<strong>SMV</strong> <strong>und</strong> Uppaal, vorgestellt. Anhand von ausgewählten Beispielen werden<br />
die wichtigsten Eigenschaften der beiden Werkzeuge in einer kurzen Einführung<br />
herausgestellt.<br />
Die <strong>Model</strong>lierung des <strong>Materialflusssystems</strong> zeigt eine praktische Anwendung der<br />
Werkzeuge, die auch die Vor- <strong>und</strong> Nachteile von Uppaal <strong>und</strong> <strong>SMV</strong> noch einmal<br />
verdeutlicht <strong>und</strong> gleichzeitig Probleme, die in der <strong>Model</strong>lierungsphase entstehen,<br />
aufzählt.<br />
Abstract<br />
In this paper two different model-checker tools are presented. On the basis<br />
of selected examples the most important characteristics of the two tools are<br />
shown in a short introduction.<br />
The modelling of the material-flow-system shows a practical application of this<br />
tools, which clarifies also the pro and cons of Uppaal and <strong>SMV</strong>. By this way<br />
problems which occour during the development of the sytem are shown.
Inhaltsverzeichnis<br />
1 Einleitung (Martin Hirsch) 9<br />
1.1 Einführung in die Thematik ”<br />
<strong>Model</strong>-<strong>Checking</strong>“ (Martin Hirsch) 9<br />
1.2 Überblick über die folgenden Kapitel (Martin Hirsch) . . . . . . 11<br />
2 Vorstellung von Uppaal <strong>und</strong> <strong>SMV</strong> 13<br />
2.1 Uppaal (Martin Hirsch) . . . . . . . . . . . . . . . . . . . . . . 13<br />
2.1.1 Allgem<strong>eines</strong> . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
2.1.2 Gr<strong>und</strong>lagen . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.1.3 Benutzung von Uppaal . . . . . . . . . . . . . . . . . . . 17<br />
2.1.4 Die Verifikationssprache TCTL . . . . . . . . . . . . . . 20<br />
2.2 <strong>SMV</strong> (Markus Zarbock) . . . . . . . . . . . . . . . . . . . . . . . 22<br />
2.2.1 Entwicklungsgeschichte . . . . . . . . . . . . . . . . . . . 22<br />
2.2.2 Eigenschaften der <strong>Model</strong>lierungssprache . . . . . . . . . 22<br />
2.2.3 Eigenschaften der Spezifikationen . . . . . . . . . . . . . 28<br />
2.2.4 Verwendung von <strong>SMV</strong> . . . . . . . . . . . . . . . . . . . 29<br />
3 Fallstudie 31<br />
3.1 Vorstellung (Martin Hirsch) . . . . . . . . . . . . . . . . . . . . 31<br />
3.2 Uppaal (Martin Hirsch) . . . . . . . . . . . . . . . . . . . . . . 33<br />
3.2.1 Vorgehensweise zur <strong>Model</strong>lierung der Fallstudie . . . . . 33<br />
3.2.2 Die <strong>Model</strong>lierung . . . . . . . . . . . . . . . . . . . . . . 34<br />
3.2.3 Ergebnisse der Verifikation . . . . . . . . . . . . . . . . . 40<br />
3.3 <strong>SMV</strong> (Markus Zarbock) . . . . . . . . . . . . . . . . . . . . . . . 46<br />
3.3.1 Allgemeine Bemerkungen . . . . . . . . . . . . . . . . . . 46<br />
3.3.2 Das Weichenmodell . . . . . . . . . . . . . . . . . . . . . 47<br />
3.3.3 Der Koordinator . . . . . . . . . . . . . . . . . . . . . . 51<br />
3.3.4 <strong>Model</strong>checking . . . . . . . . . . . . . . . . . . . . . . . 52<br />
7
4 Zusammenfassung 57<br />
4.1 Zusammenfassung <strong>SMV</strong> (Markus Zarbock) . . . . . . . . . . . . 57<br />
4.2 Zusammenfassung Uppaal (Martin Hirsch) . . . . . . . . . . . . 58<br />
Anhang<br />
A Uppaal Quellcode (Martin Hirsch) 61<br />
A.1 Quellcode: Deklarationen der globalen Variablen, Automaten Instanziierungen<br />
<strong>und</strong> System Definition . . . . . . . . . . . . . . . 61<br />
A.2 Quellcode: Weiche . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />
A.3 Quellcode: Ventilinsel . . . . . . . . . . . . . . . . . . . . . . . . 63<br />
A.4 Quellcode: Koordinator . . . . . . . . . . . . . . . . . . . . . . . 63<br />
A.5 Quellcode: Switch . . . . . . . . . . . . . . . . . . . . . . . . . . 64<br />
A.6 Quellcode: Shuttle . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />
B <strong>SMV</strong> (Markus Zarbock) 67<br />
B.1 Quellcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />
B.2 Abbildungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />
C CDROM – alle Unterlagen 83<br />
Abbildungsverzeichnis 84<br />
Literaturverzeichnis 85
Kapitel 1<br />
Einleitung (Martin Hirsch)<br />
The bug is always in the case you didn’t test<br />
Murphy’s Law<br />
In vielen technologischen Bereichen ist eine solch pessimistische Einstellung, wie<br />
Murphy sie in seinen Gesetzen beschreibt, durchaus angebracht. If anything<br />
”<br />
can go wrong, it will go wrong “ – dies kann bei Maschinen, die uns in unserem<br />
täglichen Leben begleiten <strong>und</strong> auf deren Korrektheit wir damit angewiesen<br />
sind, fatale Folgen haben. Neben bekannten Beispielen wie Verkehrsampeln,<br />
Bahnschranken oder Steuerungsanlagen gehen wir auch davon aus, dass unser<br />
Heimcomputer verlässliche Rechenergebnisse liefert. Dass dies nicht immer der<br />
Fall ist, machte der Intel Pentium Bug“ aus dem Jahre 1994 deutlich, bei dem<br />
”<br />
ein millionenfach verkaufter Prozessor für die Aufgabe x−( x )·y mit x = 4195835<br />
y<br />
<strong>und</strong> y = 3145727 den Wert 256 errechnete, obwohl eigentlich der Wert 0 herauskommt.<br />
Die Tatsache, dass neben der möglichen Gefahr für unsere Ges<strong>und</strong>heit<br />
auch schwere wirtschaftliche Schäden aus solchen Fehlern entstehen, bewog<br />
immer mehr Hersteller, weniger auf das zeitaufwendige Testen ihrer Produkte<br />
als vielmehr auf einen formalen Beweis der Korrektheit zu vertrauen. Mittels<br />
<strong>eines</strong> Programms kann eine automatische Verifikation von Anforderungen durchgeführt<br />
werden, was unter dem Begriff <strong>Model</strong>-<strong>Checking</strong>“ bekannt wurde.<br />
”<br />
1.1 Einführung in die Thematik ”<br />
<strong>Model</strong>-<strong>Checking</strong>“<br />
(Martin Hirsch)<br />
Das Gebiet des Software-Engineering beschäftigt sich mit der Systementwicklung.<br />
Formale Methoden [13] stellen mathematisch f<strong>und</strong>ierte Techniken zur<br />
Spezifikation von Systemen zur Verfügung. Der Einsatz formaler Methoden<br />
erhöht das Verständnis für das zu entwickelnde System. Die formale Spezifikation<br />
von Systemen wirkt sich damit positiv auf die Qualität des entwickelten<br />
Produkts aus. Das Risiko von Spezifikationsfehlern wird reduziert.<br />
9
10 KAPITEL 1. EINLEITUNG (MARTIN HIRSCH)<br />
Jedes entwickelte System wird normalerweise auf seine Funktionen hin überprüft.<br />
Neben manuellen Testverfahren, die vom Entwickler durchgeführt werden müssen,<br />
existieren auch automatische Verifikationstechniken. Der Einsatz formaler Methoden<br />
ermöglicht die Verwendung formaler Verifikationstechniken zur Überprüfung<br />
des entwickelten Systems. In [12] wird ein Überblick über formale Methoden<br />
<strong>und</strong> formale Verifikationstechniken gegeben. Eine formale Verifikationstechnik<br />
ist das <strong>Model</strong>-<strong>Checking</strong>. Diese Technik ermöglicht die Überprüfung<br />
endlicher Zustandssysteme. Der Entwickler spezifiziert das System <strong>und</strong> legt<br />
gleichzeitig Eigenschaften fest, die das System erfüllen muss. Durch das <strong>Model</strong>-<br />
<strong>Checking</strong> wird automatisch überprüft, ob die festgelegten Eigenschaften durch<br />
die Spezifikation erfüllt werden. Zum Überprüfen der Eigenschaften wird der Zustandsübergangsgraph<br />
des Systems betrachtet. Die Einhaltung der Eigenschaften<br />
wird in den Zuständen <strong>und</strong> den Zustandsübergängen des Systems verifiziert.<br />
Das <strong>Model</strong>-<strong>Checking</strong> ist eine Beweistechnik, mit der sich die Einhaltung vorgegebener<br />
Eigenschaften in Systemen zeigen lässt. Bestimmte Fehler innerhalb<br />
der Spezifikation lassen sich durch den Einsatz von <strong>Model</strong>-<strong>Checking</strong> entweder<br />
finden, oder es kann ausgeschlossen werden, dass das System den vorgegebenen<br />
Fehler enthält.<br />
Die Technik des <strong>Model</strong>-<strong>Checking</strong> wurde unabhängig voneinander durch Clarke<br />
<strong>und</strong> Emerson in [10] <strong>und</strong> Quielle <strong>und</strong> Sifakis in [11] erstmals beschrieben.<br />
Vor allem bei reaktiven Systemen mit sicherheitskritischen Anforderungen bietet<br />
sich der Einsatz von <strong>Model</strong>-<strong>Checking</strong> an. Sicherheitsrelevante Eigenschaften<br />
lassen sich durch das <strong>Model</strong>-<strong>Checking</strong> Programm überprüfen. Dadurch können<br />
Spezifikationsfehler ausgeschlossen werden, die zu einer Verletzung der sicherheitskritischen<br />
Vorgaben führen. Auf diese Weise lassen sich qualitativ hochwertige<br />
Systeme entwickeln, bei denen beispielsweise Gefahren für Menschenleben<br />
nahezu ausgeschlossen sind.<br />
Für die Verifikation von verteilten Systemen bieten viele <strong>Model</strong>-<strong>Checking</strong> Programme<br />
zusätzliche Unterstützungen an. Sie bieten Möglichkeiten zum Finden<br />
von Dead-Locks <strong>und</strong> Life-Locks. So lassen sich beispielsweise bei der Überprüfung<br />
<strong>eines</strong> Protokolls Verklemmungssituationen finden, bei denen kein Fortschritt in<br />
der Ausführung des Systems mehr möglich ist.<br />
Die benötigte Rechenzeit <strong>und</strong> der Speicherbedarf hängen beim <strong>Model</strong>-<strong>Checking</strong><br />
von der Größe des zu überprüfenden Systems ab. Die Zahl der Zustände wächst<br />
mit der Komplexität von Systemen sehr schnell an. Im schlimmsten Fall gehen<br />
Zustände von Teilsystemen als kartesisches Produkt in die Zahl der Zustände des<br />
Gesamtsystems ein. Effiziente Algorithmen werden beim <strong>Model</strong>-<strong>Checking</strong> eingesetzt,<br />
um möglichst große Systeme überprüfen zu können. Trotzdem ist eine<br />
Überprüfung herkömmlicher Software-Systeme in den meisten Fällen auf Gr<strong>und</strong><br />
der Größe des Zustandsraums durch diese Verifikationstechnik nicht möglich.<br />
Ist ein System für die Überprüfung durch die <strong>Model</strong>-<strong>Checking</strong> Technik zu groß,<br />
kann durch geeignete Abstraktionen ein entsprechend kleineres System festgelegt<br />
werden. Dieses abstrakte System besitzt weniger Zustände <strong>und</strong> lässt sich<br />
dann eventuell durch das <strong>Model</strong>-<strong>Checking</strong> Programm überprüfen.
1.2. ÜBERBLICK ÜBER DIE FOLGENDEN KAPITEL (MARTIN<br />
HIRSCH) 11<br />
Heute werden hauptsächlich zwei verschiedene Ansätze des <strong>Model</strong>-<strong>Checking</strong>s eingesetzt.<br />
Beim symbolischen <strong>Model</strong>-<strong>Checking</strong> wird der Zustandsübergangsgraph<br />
als eine Formel in einem Binary Decision Diagram (BDD) abgelegt. Durch symbolische<br />
Operationen wird festgestellt, ob die Formel im BDD die durch den<br />
Benutzer vorgegebenen Eigenschaften erfüllt. Der zweite Ansatz wird mit onthe-fly<br />
<strong>Model</strong>-<strong>Checking</strong> bezeichnet. Bei dieser Art des <strong>Model</strong>-<strong>Checking</strong> wird<br />
der Zustandsübergangsgraph während der Überprüfung explizit aufgebaut <strong>und</strong><br />
durchsucht. Jeder Zustand <strong>und</strong> jeder Zustandsübergang dieses Graphen wird dabei<br />
auf die Einhaltung der vorgegebenen Eigenschaften überprüft. Um mit der<br />
eventuell großen Anzahl von Systemzuständen zurechtzukommen, werden verschiedene<br />
effiziente Algorithmen für die Durchführung der Suche <strong>und</strong> die Speicherung<br />
von Zuständen angewendet. Der in der vorliegenden Arbeit vorgestellte<br />
<strong>Model</strong>-Checker <strong>SMV</strong> verwendet die Art des symbolischen <strong>Model</strong>-<strong>Checking</strong>s.<br />
Das Werkzeug Uppaal dagegen verwendet eine Kombination von symbolischem<br />
<strong>Model</strong>-<strong>Checking</strong> <strong>und</strong> on-the-fly <strong>Model</strong>-<strong>Checking</strong>.<br />
1.2 Überblick über die folgenden Kapitel<br />
(Martin Hirsch)<br />
Kapitel 2 gibt eine Einführung in die beiden <strong>Model</strong>-Checker Werkzeuge UP-<br />
PAAL <strong>und</strong> <strong>SMV</strong> <strong>und</strong> bildet die Gr<strong>und</strong>lage für die folgenden Kapitel.<br />
Kapitel 3 geht auf die untersuchte Fallstudie ein. Ein Materialflusssystem, ein<br />
Ausschnitt aus der ISILEIT 1 -Fallstudie [18, 5] wird in Uppaal <strong>und</strong> <strong>SMV</strong> modelliert.<br />
Probleme, die es bei <strong>Model</strong>lierungen zu beachten gilt, werden anhand<br />
dieses Beipiels aufgeführt. Abschließend werden konkrete Ergebnisse des Verifikationsprozesses<br />
genannt.<br />
Kapitel 4 gibt schließlich einen zusammenfassenden Überblick <strong>und</strong> zeigt weitere<br />
Perspektiven auf.<br />
Der Anhang beinhaltet den kompletten Quellcode beider Implementierungsvarianten<br />
sowie eine CDROM mit den beiden Werkzeugen Uppaal <strong>und</strong> <strong>SMV</strong>.<br />
1 Integrative Spezifikation von Leitsystemen der flexibel automatisierten Fertigung
Kapitel 2<br />
Vorstellung von Uppaal <strong>und</strong><br />
<strong>SMV</strong><br />
2.1 Uppaal (Martin Hirsch)<br />
Dieses Kapitel gibt eine kurze Einführung in das <strong>Model</strong>-Checker Werkzeug Uppaal<br />
[17]. Nach einer kurzen Einleitung, die sich mit der Geschichte Uppaals<br />
befasst, erfolgt ein Überblick über die Syntax <strong>und</strong> Semantik sowie über die Benutzung<br />
des Werkzeugs. Diese Einführung soll kein Handbuch sein, sondern<br />
lediglich die wichtigsten Gesichtspunkte erläutern, die zum späteren Verständnis<br />
der Beispiele notwendig sind. Für eine ausführliche Beschreibung der Syntax<br />
<strong>und</strong> Semantik wird z. B. auf [17, 3] verwiesen.<br />
2.1.1 Allgem<strong>eines</strong><br />
1993 wurde der erste Prototyp des <strong>Model</strong>-Checkers Uppaal [17], TAB, an der<br />
Universität Uppsala (Schweden) entwickelt. Das Werkzeug TAB ermöglichte es,<br />
einfache Eigenschaften <strong>eines</strong> Systems, die man leicht durch die Erreichbarkeit<br />
von Zuständen in einem Netzwerk von Timed Automata darstellen kann, wie z.<br />
B. Deadlockfreiheit, zu überprüfen.<br />
Im Jahre 1995 schlossen sich das Department of Computer Systems“ der Universität<br />
Uppsala (Schweden) <strong>und</strong> das Department of Computer Science and<br />
”<br />
”<br />
Mathematics“ der Universität Aalborg (Dänemark) zusammen <strong>und</strong> entwickelten<br />
die erste Version von Uppaal (September 1995). Aus den jeweiligen drei<br />
Anfangsbuchstaben der Städte ergibt sich der Name des Werkzeugs.<br />
Uppaal ist ein Werkzeug für die <strong>Model</strong>lierung, Simulation <strong>und</strong> Verifikation von<br />
Echtzeitsystemen. Es eignet sich besonders gut für Systeme, die man durch<br />
ein Netzwerk von nicht deterministischen Automaten, versehen mit Zeitangaben,<br />
die über Kanäle bzw. gemeinsame Variablen kommunizieren, modellieren<br />
kann. Typische Anwendungsbereiche sind Echtzeitsysteme, Kommunikationsprotokolle<br />
<strong>und</strong> komplexe Systeme, in denen Zeitaspekte eine wichtige <strong>und</strong> kritische<br />
Rolle spielen.<br />
Seit Uppaal 1995 zum ersten Mal für die Öffentlichkeit verfügbar war, wurden im<br />
13
14 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
jährlichen Abstand immer wieder neue Versionen herausgebracht. Die Veränderungen<br />
bezogen sich hauptsächlich auf Verbesserungen im Bereich der Datenstrukturen<br />
<strong>und</strong> Algorithmen des Verifizierers. Brauchte Uppaal 1995 noch 304<br />
Sek<strong>und</strong>en zum verifizieren für das Philips audio protocol [2], so benötigt es auf<br />
derselben Hardware mit der aktuellen Uppaal-Version nur noch 5.5 Sek<strong>und</strong>en.<br />
Aber auch die Bedienung <strong>und</strong> die grafische Oberfläche des Werkzeugs wurden<br />
sukzessive verbessert.<br />
2.1.2 Gr<strong>und</strong>lagen – Syntax <strong>und</strong> Semantik von Uppaal<br />
Uppaal arbeitet basierend auf dem Formalismus der timed automata“ (oft auch<br />
”<br />
Zeitautomaten genannt). Es handelt sich hierbei um endliche Automaten, die<br />
von Rajeev Alur <strong>und</strong> Davil L. Dill um clocks“, die im Folgenden als Uhren<br />
”<br />
bezeichnet werden, <strong>und</strong> entsprechende Ausdrücke, um auf diese eingehen zu<br />
können, erweitert wurden [9]. Uppaal arbeitet auf einer Menge von Automaten,<br />
die noch um weitere Eigenschaften erweitert sind. Im Folgenden werden die<br />
timed automata“ sowie weitere Eigenschaften von Uppaal näher beschrieben.<br />
”<br />
Timed automata<br />
sind endliche Automaten, die um folgende Komponenten erweitert wurden:<br />
➫ Uhren<br />
➫ Integer Variablen<br />
➫ Kommunikationskanäle<br />
➫ entsprechende Beschriftungen der Transitionen mit Ausdrücken<br />
– zum Setzen, Manipulation von Uhren<br />
– zum Setzen von Werten für die Variablen<br />
– zur Formulierung von Bedingungen (guards) für Uhren <strong>und</strong> Variablen<br />
– zur Synchronisation mit anderen Automaten über einen Kanal<br />
Jeder in Uppaal instanziierte Automat stellt einen Prozess dar. Dieser ist erst<br />
einmal von allen anderen unabhängig. Das hat zur Folge, dass die Automaten a<br />
priori asynchron laufen, d. h. jeder besitzt einen eigenen Takt. Automaten sind<br />
reaktive Systeme. Sie besitzen immer nur einen definierten Anfangszustand,<br />
aber keinen Endzustand. In Uppaal werden die zu einem Zeitpunkt t aktiven<br />
Zustände durch eine Marke (Token), wovon jeder Automat genau eine besitzt,<br />
gekennzeichnet.<br />
Uhren<br />
Die oben erwähnten Uhren spielen in Uppaal bei den Timed Automata eine besondere<br />
Rolle. Die Werte der Uhren steigen während <strong>eines</strong> Systemdurchlaufes
2.1. <strong>UPPAAL</strong> (MARTIN HIRSCH) 15<br />
stetig an. Uppaal berechnet für die Uhren die Bereiche, in denen ihre Werte<br />
liegen müssen, damit sie den Spezifikationen des Systems genügen. Die Berechnungsgr<strong>und</strong>lagen<br />
liefern die Bedingungen an die Uhren, die in den Automaten<br />
enthalten sind. Die Manipulation der Uhren, z. B. das Zurücksetzten auf 0,<br />
geschieht durch eine Zuweisung ”<br />
:=“.<br />
Variablen<br />
Uppaal unterstützt als Variablentypen nur Integervariablen. Variablen können<br />
an Transitionsübergängen neue Werte zugewiesen bekommen. Es besteht die<br />
Möglichkeit, den Wertebereich einer Integervariablen einzuschränken. Dies ermöglicht<br />
u. a. die Simulation von Bool’schen Variablen, indem der Bereich<br />
auf [0,1] beschränkt wird. Zusätzlich können Konstanten definiert werden, z.B<br />
const true 1 oder const false 0, die es dann ermöglichen, Zuweisungen oder<br />
Vergleiche über true <strong>und</strong> false, anstatt über 0 oder 1 zu machen.<br />
Bedingungen <strong>und</strong> Invarianten<br />
Die Variablen können an den Transitionen auch als Bedingungen stehen.<br />
Erst wenn die Bedingung der Variablen erfüllt ist, darf die Transition schalten.<br />
Nicht nur Variablen wachen über die Transitionen, sondern auch Uhren.<br />
Die Besonderheit der Uhren ist, dass sie auch als Invarianten an den Zuständen<br />
fungieren können (dies ist nur für Uhren erlaubt). Zur Behandlung der Uhren<br />
bzw. Variablen sind hier nur einfache arithmetische Ausdrücke erlaubt:<br />
k 1 ∼ x ∼ k 2 ,<br />
k 1 ∼ x, y ∼ k 2 ,<br />
wobei k 1 , k 2 ∈ N, x,y clocks bzw. Variablen <strong>und</strong> ∼ ∈ {≤, ≤, ≥, ≥, ==}. Komplexere<br />
Ausdrücke würden den Vorgang des <strong>Model</strong>-<strong>Checking</strong>s erheblich verlangsamen,<br />
da sich der Zustandsraum enorm vergrößern würde (Zustandsraumexplosion).<br />
Kanäle<br />
Über die sogenannten channel Kommunikationskanäle können sich die Automaten<br />
untereinander synchronisieren. Gelangt ein Automat an eine Transition, die<br />
mit einem Kommunikationskanal gekennzeichnet ist, z.B. kanal, so kann diese<br />
erst dann schalten, wenn ein anderer Automat ebenfalls an einer Transition angekommen<br />
ist, die diese Kanalvariable besitzt, kanal!. Die Kanaldefinitionen<br />
können zusätzlich mit dem Schlüsselwort urgent versehen werden. Dieses bewirkt,<br />
dass das Schalten der Transition unmittelbar eintritt, wenn beide Parteien<br />
die Möglichkleit haben. Ohne das Schlüsselwort urgent ist das sofortige Schalten<br />
nicht garantiert. Die Synchronisation zwischen zwei Automaten in Uppaal<br />
bezieht sich jeweils auf genau zwei Transitionen, an denen dann der jeweilige<br />
Ausdruck steht.
16 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
Folgendes Beispiel illustriert die vorgestellten Konzepte noch einmal.<br />
Beispiel<br />
Es soll ein System ”<br />
Intelligenter Lichtschalter “ durch Echtzeitautomaten modelliert<br />
werden. Ein Lichtschalter, der von einem Benutzer betätigt wird, soll<br />
folgende drei Eigenschaften besitzen:<br />
1. Nach einmaligem Betätigen des Schalters geht das Licht an,<br />
2. wird innerhalb von 3 Sek<strong>und</strong>en der Schalter erneut betätigt, wird das Licht<br />
heller,<br />
3. wird der Lichtschalter nach 3 Sek<strong>und</strong>en erneut betätigt, erlischt das Licht<br />
wieder.<br />
Abbildung 2.1: Automaten Benutzer <strong>und</strong> Lichtschalter des Beipiels ”<br />
Intelligenter<br />
Lichtschalter“<br />
Die beiden Automaten sind wie folgt aufgebaut:<br />
Prozess Benutzer<br />
Der Automat Benutzer (siehe Abb. 2.1 ) besitzt nur den einen Zustand idle,<br />
dieser ist zugleich auch der Initialzustand (optisch erkennbar an den Doppelkreisen).<br />
Von diesem gehen zwei (Selbst-)Transitionen aus. Die Transition ohne<br />
Label stellt einen ɛ -Übergang 1 dar, die mit press! markierte Transition dient<br />
1 Diese Transition kann immer schalten. Sie zu feuern, bedarf k<strong>eines</strong> äusseren Einflusses
2.1. <strong>UPPAAL</strong> (MARTIN HIRSCH) 17<br />
dazu, sich mit dem Automaten Lichtschalter zu synchronisieren, den ”<br />
Lichtschalter“<br />
zu drücken. Dieser sehr einfache Automat spiegelt alle möglichen Verhaltensweisen<br />
des Benutzers aus der Realität 1:1 wieder. Entweder kann der<br />
Lichtschalter gedrückt werden oder der Benutzer führt keine Aktion aus.<br />
Prozess Lichtschalter<br />
Der Automat Lichtschalter ist dagegen schon etwas komplizierter. Er besitzt<br />
die Zustände Licht aus, Licht an <strong>und</strong> Heller, Initialzustand des Automaten<br />
ist Licht aus. Die Transition von Licht aus nach Licht an ist mit der Kanalvariablen<br />
press sowie mit der Zuweisung x:=0 der Uhrenvariablen x markiert.<br />
Betätigt der Benutzer den Lichtschalter, wechselt dieser Prozess in den Zustand<br />
Licht an, startet dabei eine Uhr x <strong>und</strong> initialisiert diese mit 0. Von dem Zustand<br />
Licht an gehen zwei Transitionen aus. Der Übergang zu Licht aus ist<br />
wiederum mit der Kanalvariablen press markiert. Zusätzlich gibt es hier auch<br />
noch eine Bedingung, x>3. Die Transition schaltet also nur dann, wenn der<br />
Benutzer nach Anschalten der Beleuchtung nach 3 Sek<strong>und</strong>en den Lichtschalter<br />
erneut betätigt. Wird innerhalb von 3 Sek<strong>und</strong>en der Schalter erneut gedrückt,<br />
schaltet die andere Transition, die in den Zustand Heller führt. Dieser Übergang<br />
ist neben der Kanalvariablen press mit der Bedingung x
18 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
Abbildung 2.2: Uppaal – System Editor<br />
Datei <strong>und</strong> die Daten für die Visualisierung in der .UGI Datei abgespeichert.<br />
Ein integrierter Syntax-Checker überprüft bei Bedarf <strong>und</strong> automatisch vor jeder<br />
Simulation bzw. Verifikation die Korrektheit der Syntax des erstellten System.<br />
Alternativ zur Konstruktion im Systemeditor kann man die <strong>Model</strong>lierung des<br />
Systems auch direkt in einem normalen Texteditor in der für die Automaten spezifischen<br />
Beschreibungssprache vornehmen <strong>und</strong> als .XTA Datei abspeichern. Auf<br />
diese Art der <strong>Model</strong>lierung wird in der Arbeit nicht weiter eingangen. Der Nachteil<br />
dieser Vorgehensweise ist, dass bei einem späteren Editieren die grafischen<br />
Daten zur Visualisierung im Simulator fehlen <strong>und</strong> dadurch die Übersichtlichkeit<br />
verloren geht. Das manuelle Erstellen der .UGI Datei wird nicht empfohlen. Auf<br />
den Verifizierer hat dies alles keinen Einfluss, so dass, wenn man die Simulation<br />
nicht benötigt, z. B. bei einer automatischen Codetransformation von einer Programmiersprache<br />
nach Uppaal, diese Variante durchaus von Vorteil sein kann.<br />
Eine Möglichkeit wäre z. B., das bereits an der Arbeitsgruppe Softwaretechnik
2.1. <strong>UPPAAL</strong> (MARTIN HIRSCH) 19<br />
der Universität Paderborn entwickelte Werkzeug FUJABA 2 um diese Funktion<br />
zu erweitern <strong>und</strong> über eine Plugin-Struktur anzubinden.<br />
Simulator<br />
Die Simulatoroberfläche (siehe Abb. 2.3) bietet dem Benutzer die Möglichkeit,<br />
das vorher definierte System anhand einer Beipielausführung nachzuvollziehen.<br />
Die Variablenbelegung der Automaten kann in einem extra Fenster verfolgt werden.<br />
Außerdem zeigt eine extra Ausgabe (Trace) an, welche Automatenzustände<br />
gerade aktiv sind. Zum Einsatz kommt der Simulator besonders in der Entwicklungsphase<br />
des Systems. So können, auch wenn das System noch nicht komplett<br />
ist, schon einzelne Abläufe überprüft <strong>und</strong> eventuelle Fehler erkannt werden.<br />
Abbildung 2.3: Uppaal – Simulator<br />
Verifizierer<br />
Im Verifizierer (siehe Abb. 2.4) werden die Prüfformeln für das zu testende System<br />
angegeben. Hier ist die Spezifikationssprache eine eingeschränkte Form<br />
2 From UML to Java and back again; www.FUJABA.de
20 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
von TCTL 3 , eine Erweiterung von CTL 4 . Der Verifizierer bietet die Option, bei<br />
nicht erfüllten Formeln ein Gegenbeispiel anzugeben. Dieses geschieht in Form<br />
<strong>eines</strong> Traces, der im Simulator nachvollzogen werden kann.<br />
Abbildung 2.4: Uppaal – Verifizierer<br />
2.1.4 Die Verifikationssprache TCTL<br />
Eine Erläuterung der theoretischen Hintergründe von TCTL erfolgt nur insoweit,<br />
als diese für das Verständnis der in dieser Arbeit, besonders in Kapitel 3<br />
vorkommenden Prüfformeln, erforderlich ist.<br />
TCTL ist aus CTL hervorgegangen. TCTL ist entwickelt worden, um zeitbehaftete<br />
<strong>Model</strong>le, wie sie in Uppaal durch Zeitautomaten vorkommen, <strong>mittels</strong> <strong>eines</strong><br />
mathematischen Formalismus überprüfen zu können. CTL wurde daher um Eigenschaften<br />
erweitert, die insbesondere das Zeitverhalten von zustandsbasierten<br />
Systemen überprüfen können.<br />
Uppaal unterstützt nicht den vollen Umfang von TCTL. Lediglich folgende Arten<br />
von Formelkonstrukten sind erlaubt:<br />
3 Timed Computation Tree Logic<br />
4 Computation Tree Logic
2.1. <strong>UPPAAL</strong> (MARTIN HIRSCH) 21<br />
Als Quantoren gibt es den Allquantor A□ <strong>und</strong> den Existenzquantor E♦. Diese<br />
treten immer in Verbindung mit einem Ausdruck, der einen Zustand des System<br />
präsentiert, auf. Die Kette der Ausdrücke kann beliebig durch die logischen<br />
Operatoren and <strong>und</strong> or geschachtelt <strong>und</strong> erweitert werden.<br />
Bezugnehmend auf das unter 2.1.2 erklärte Beipiel lassen sich z. B. durch diese<br />
Konstrukte folgende Formeln erstellen:<br />
Beispiel:<br />
A□ Lichtschalter.Licht ist aus<br />
E♦ Lichtschalter.Licht ist an or Lichtschalter.Heller<br />
Mit der ersten Formel wird geprüft, ob der Automat Lichtschalter sich stets im<br />
Zustand Licht ist aus befindet. Natürlich ist dies nicht der Fall, so dass der<br />
Verifizierer diese Formel nicht bestätigt. In diesem Fall wird vom Verifizierer<br />
der oben erwähnte Trace ausgegeben.<br />
Die zweite Formel überprüft, ob der Automat jemals in den Zustand Licht ist an<br />
oder Heller gelangt, was vom Verifizerer bestätigt wird.<br />
Erwähnt werden sollten noch die Operatoren ”<br />
−→“ (leadsto) <strong>und</strong> ”<br />
imply“.<br />
Imply stellt einen Bezug zwischen 2 Automaten dar. Wenn sich z. B. ein<br />
Automat A zum Zeitpunkt t in einem Zustand S 1 <strong>und</strong> ein Automat B zum<br />
selben Zeitpunkt t in einem Zustand S 2 befindet, so würde die Formel<br />
A.S 1 imply B.S 2<br />
akzeptiert werden.<br />
Der −→ (leadsto) Operator dagegen überprüft eine Fortschrittseigenschaft.<br />
Beispiel:<br />
Lichtschalter.Licht ist an −→ Lichtschalter.Licht ist aus<br />
Wann immer das Licht angeschaltet wurde, so gibt es in der Zukunft einen Zustand,<br />
zu dem das Licht wieder ausgeschaltet ist. Im vorliegenden Beispiel würde<br />
diese Formel nicht akzeptiert werden, da der Automat Benutzer nicht gezwungen<br />
wird, die Transition, mit press! markiert, mehr als einmal zu aktivieren.<br />
Es besteht die Möglichkeit für den Automaten, im Zustand idle zu verweilen<br />
<strong>und</strong> keine Aktion mehr auszuführen.<br />
Die Uhren <strong>eines</strong> Automaten werden genauso wie Variablen in die Prüfformeln<br />
eingeb<strong>und</strong>en.<br />
Beispiel:<br />
E♦ Lichtschalter.Heller and Lichtschalter.x
22 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
2.2 <strong>SMV</strong> (Markus Zarbock)<br />
2.2.1 Entwicklungsgeschichte<br />
Der Symbolic <strong>Model</strong> Verifier, <strong>SMV</strong> wurde Mitte der neunziger Jahre von Ken<br />
McMillan, an der Carnegie Mellon University (CMU) entwickelt. Ken McMillan<br />
ist einer der maßgeblichen Entwickler des symbolischen <strong>Model</strong>checkings. Diese<br />
erste Version von <strong>SMV</strong> verwendete CTL 5 für Spezifikationen <strong>und</strong> ermöglichte<br />
die Verwendung verschiedener Zeitmodelle. Viele Halbleiterhersteller verwendeten<br />
<strong>und</strong> verwenden diese Version, um ihre eigenen Tools zu entwickeln, zum<br />
Beispiel IBM’s RuleBase. Ende der neunziger Jahre, Ken McMillan wechselte<br />
zur University of Carlifornia, Berkeley wurde <strong>SMV</strong> erweitert. Es wurde eine<br />
erweiterte Eingabesprache (extendet <strong>SMV</strong>) <strong>und</strong> die Fähigkeit LTL 6 als Spezifikationskalkül<br />
zu verwenden hinzugefügt. Desweiteren ist <strong>SMV</strong> nun in der Lage<br />
VeriLog zu verstehen einer Sprache, die zur Beschreibung von Halbleiterbbauelementen<br />
<strong>und</strong> elektronischen Schaltungen verwendet wird. Diese Cadence <strong>SMV</strong><br />
genannte Version ist voll abwärtskompatibel zur CMU Version. <strong>SMV</strong> beherrscht<br />
damit drei Eingabesprachen sowie CTL <strong>und</strong> LTL für Spezifikationen. Es kann<br />
jedoch CTL nur für Spezifikationen von <strong>Model</strong>len in der alten Syntax verwendet<br />
werden <strong>und</strong> LTL für solche mit extendet <strong>SMV</strong>. Für diese Studienarbeit wurde<br />
extended <strong>SMV</strong> verwendet <strong>und</strong> Spezifikationen in LTL.<br />
2.2.2 Eigenschaften der <strong>Model</strong>lierungssprache<br />
Zur Beschreibung von <strong>Model</strong>len verwendet <strong>SMV</strong> eine eigene Sprache, die sich in<br />
der Syntax an gängige Programmiersprachen anlehnt. Allerdings unterscheidet<br />
sich diese Sprache in der Semantik erheblich von imperativen Programmiersprachen,<br />
wie Java oder C++. Deshalb beginnt dieser Überblick mit einer Beschreibung<br />
der beiden in <strong>SMV</strong> möglichen Zeitmodelle. Danach wird eine kurze<br />
Einführung die Syntax von <strong>SMV</strong> beschreiben. Ziel ist es, neben der Vorstellung<br />
der <strong>Model</strong>lierungssprache, klar zu machen, daß <strong>SMV</strong> ein Werkzeug zur<br />
<strong>Model</strong>lierung <strong>und</strong> nicht zur Programmierung ist.<br />
Zeitmodelle<br />
<strong>Model</strong>lbeschreibungen kann man mit <strong>SMV</strong> in Module unterteilen, die wie Klassendefinitionen<br />
in objektorientierten Programmiersprachen als Typen für Instanziierungen<br />
dienen. Ein besonderes ist das Main-Modul, da dieses alle Instanziierungen<br />
anstößt <strong>und</strong> als erstes ausgewertet wird.<br />
Warum wird nun ein Zeitmodell benötigt, um <strong>Model</strong>le zu überprüfen Prinzipiell<br />
muss ein <strong>Model</strong>checker alle möglichen Abläufe <strong>eines</strong> <strong>Model</strong>ls berechnen<br />
können. Dafür diskretisiert <strong>SMV</strong> die Zeit <strong>und</strong> kann so einen Takt zu definieren,<br />
in dem Programmschritte ausgeführt werden. Dieser Takt ist eine atomare Einheit,<br />
das bedeutet es wird nur der Zustand vor <strong>und</strong> nach dem Takt betrachtet,<br />
Zwischenzustände gibt es nicht.<br />
5 Computation Tree Logic<br />
6 Linear Temporal Logic
2.2. <strong>SMV</strong> (MARKUS ZARBOCK) 23<br />
module main()<br />
{<br />
next(x) := true;<br />
next(y) := false;<br />
}<br />
Ausführbahre Anweisungen werden in <strong>SMV</strong> in einem Takt echt parallel ausgeführt.<br />
Das bedeutet die Reihenfolge in obigem Beispiel ist irrelevant. Daraus<br />
ergeben sich eine Reihe von Konsequenzen, die später noch detailliert beschrieben<br />
werden. Wenn nun aber die Anweisungen <strong>eines</strong> Moduls parallel ausgeführt<br />
werden wie sieht es dann mit den Anweisungen instanziierter Module aus Dazu<br />
bietet <strong>SMV</strong>, wie schon erwähnt zwei Zeitmodelle an, ein synchrones <strong>und</strong> ein<br />
asynchrones.<br />
Im synchronen Zeitmodell wird eine Modulreihenfolge festgelegt <strong>und</strong> dann werden<br />
bei der Ablaufberechnung alle Module gleichgetaktet. Man kann das mit<br />
einer elektronischen Schaltungsgruppe vergleichen, die über einen globalen Takt<br />
geschaltet wird. Es gibt also einen globalen Takt <strong>und</strong> wenn dieser von t nach<br />
t+1 gesetzt wird, dann werden für alle Module die möglichen Anweisungen ausgeführt.<br />
Beispiel:<br />
module a()<br />
{<br />
x : 0..127;<br />
init(x) := 0;<br />
next(x) := x + 1;<br />
}<br />
Wird dieses Modul mehrmals instanziiert <strong>und</strong> als Zeitmodell das synchrone<br />
gewählt, so kann man beobachten, dass die x-Werte aller Modulinstanzen stets<br />
gleich sind, da alle Modulinstanzen in einem atomaren Schritt weitergetaktet<br />
werden.<br />
Wird nun eine Modulinstanziierung mit dem Schlüsselwort process eingeleitet,<br />
so verwendet <strong>SMV</strong> ein asynchrones Zeitmodell. Das bedeutet, dass für Instanzen<br />
solcher Module beliebige Taktreihungen berücksichtigt werden. Der im synchronen<br />
<strong>Model</strong>l globale atomare Zeittakt, existiert nun nicht mehr. Stattdessen gibt<br />
es für jede Modulinstanz einen eigenen atomaren Takt. Wie für die Anweisungen<br />
<strong>eines</strong> Moduls gilt nun für den Zustand der Modulinstanzen, daß alle möglichen<br />
Ausführungen berücksichtigt werden müssen. Es gilt im asynchronen Fall jedoch,<br />
dass keine zwei Prozesse gleichzeitig weitergetaktet werden. Grafik 2.5<br />
zeigt für zwei Modulinstanzen P1 <strong>und</strong> P2 den Unterschied. Im synchronen Fall<br />
gehen P1 <strong>und</strong> P2, bei Zeitfortschritt t nach t+1, in die Folgezustände P1’ bzw<br />
P2’ über. Sind P1 <strong>und</strong> P2 jedoch asynchrone Instanzen, so berechnet <strong>SMV</strong><br />
alle möglichen Ausführungsreihenfolgen <strong>und</strong> wendet auf diese die Spezifikationen<br />
an. Bei asynchronen <strong>Model</strong>len kann man häufig beobachten, daß <strong>SMV</strong> als<br />
Gegenbeispiel ein Ausführungsreihenfolge angibt, in der eine Modulinstanz stets<br />
Rechenschritte ausführt alle anderen jedoch nicht. Dies gilt es bei der Festlegung<br />
der Spezifikationen zu berücksichtigen.
24 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
Abbildung 2.5: <strong>SMV</strong> – Zeitmodelle<br />
Das Verständnis des Zeitbegriffs, ist für die <strong>Model</strong>lierung in <strong>SMV</strong> von gr<strong>und</strong>legender<br />
Bedeutung, da die im Folgenden vorgestellten Sprachelemente zwar<br />
denen einer Programmiersprache ähneln, <strong>Model</strong>le aber nicht im herkömmlichen<br />
Sinne programmiert werden können. Die Semantik von <strong>SMV</strong> ähnelt eher Sprachen<br />
zur Beschreibung von elektronischen Bauteilen, wie zum Beispiel VHDL.<br />
Sprachelemente<br />
Die Syntax von <strong>SMV</strong>, soll hier nur auszugsweise beschrieben werden. Für Details<br />
sei auf die Sprachreferenz verwiesen [19]. Die Beschreibung ist so ausgelegt,<br />
dass davon ausgegangen wird, daß der Leser mit imperativen Programmiersprachen<br />
vertraut ist. Die Auswahl erfolgte unter dem Gesichtspunkt, der während<br />
der <strong>Model</strong>lierung aufgetretenen Probleme.<br />
Typen<br />
<strong>SMV</strong> kennt als primitive Datentypen bool’sche Werte, Mengen <strong>und</strong> Ganzahlen.<br />
Die Deklaration einer bool’schen Variablen sieht so aus:<br />
bit1 : boolean;<br />
Bei Zuweisungen gilt es zu beachten, dass <strong>SMV</strong> keine Schlüsselworte für true/false<br />
kennt, diese kann man aber für alle Module festlegen, wenn man Beginn einer<br />
<strong>Model</strong>ldefinition folgendes schreibt:<br />
#define true 1<br />
#define false 0<br />
Mengen deklariert man wie folgt:
2.2. <strong>SMV</strong> (MARKUS ZARBOCK) 25<br />
state : {idle , waiting , active};<br />
Schließlich kann man Ganzahlenvariablen definieren.<br />
byte : 0..7;<br />
An komplexen Datentypen stellt <strong>SMV</strong> Arrays <strong>und</strong> Structs zur Verfügung. Arrays<br />
sehen so aus:<br />
word : array .. of ;<br />
matrix : array 0..1 of array 2..0 of 0..7;<br />
Verb<strong>und</strong>ene Datentypen erzeugt man mit dem Schlüsselwort struct.<br />
message : struct<br />
{<br />
flag : boolean;<br />
byte : 0..7;<br />
datas : array 0..31 of 0..31;<br />
}<br />
Wenn man mit struct definierte Datentypen, wie die vordefinierten Datentypen<br />
verwenden will, so muss man die selbstdefinierten Datentypen mit typedef<br />
definieren.<br />
typedef message struct<br />
{...}<br />
Schleifen <strong>und</strong> Konditionale<br />
Die Syntax von Schleifen (for) bzw Konditionalen (if/else, case) ist der in Sprachen<br />
wie Java oder C++ sehr ähnlich, daher sei auf die Sprachreferenz verwiesen<br />
[19].<br />
Zuweisungen<br />
Zuweisungen sind, aufgr<strong>und</strong> der Tatsache, dass <strong>SMV</strong> eine Sprache zur Beschreibung<br />
von <strong>Model</strong>len <strong>und</strong> keine Programmiersprache ist, besonders zu betrachten.<br />
Die Art der Zuweisung bestimmt in <strong>SMV</strong>, wann der Wert einer Variablen<br />
geändert wird. Sei im Folgenden x eine Ganzahlvariable. Will man x im gleichen<br />
Takt ändern, so schreibt man :<br />
x := 2;<br />
Erfolgt diese Anweisung zum Zeitpunkt t, so gilt ab einschließlich t, daß x = 2<br />
ist. Schreibt man dagegen :<br />
next(x) := 2;<br />
So wird der Wert von x erst zum Zeitpunkt t+1 verändert. Wird eine Variable<br />
so deklariert, so kann man mit:<br />
init(x) := 0;
26 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
einen Anfangswert definieren. Um die Zuweisungsarten etwas plausibler zu machen<br />
folgen nun zwei Beispiele.<br />
module a()<br />
{<br />
x : 0..31;<br />
y : 0..31;<br />
init(x) := 0; -- Anfangswerte setzen<br />
init(y) := 0;<br />
next(x) := x + 1;<br />
next(y) := x;<br />
}<br />
equal : assert G (x = y);<br />
module b()<br />
{<br />
x : 0..31;<br />
y : 0..31;<br />
init(x) := 0; -- y darf nicht mehr mit init() gesetzt werden<br />
next(x) := x + 1;<br />
y := x;<br />
}<br />
equal2 : assert G (x = y);<br />
Für die Spezifikation equal wird als Ergebnis false berechnet, da y ja stets den<br />
aktuellen Wert von x erst im nächsten Takt zugewiesen bekommt, x jedoch erst<br />
im nächsten Takt verändert wird. Im Modul b darf der Wert für y nicht mit<br />
init() initialisiert werden, da die Anweisung y := x den ersten Takt einschließt.<br />
Würde y initalisiert werden so wäre dies eine Verletzung der single assignment<br />
Regel. Für die Spezifikation equal2 berechnet <strong>SMV</strong> true.<br />
Die Single Assignment Regel<br />
In <strong>SMV</strong> werden alle Anweisungen <strong>eines</strong> Taktes echt parallel ausgeführt. Ein<br />
Taktschritt ist eine atomare Einheit ohne Zwischenschritte. Daraus folgt unmittelbar,<br />
dass es in einem Taktschritt für eine Variable nur eine Zweisung geben<br />
darf, gäbe es mehrere so existierten auch Zwischenzustände. Diese Regel gilt in<br />
beiden Zeitmodellen mit unterschiedlichen Auswirkungen.<br />
Für die folgenden Beispiele seien x <strong>und</strong> y Ganzzahlvariablen. <strong>SMV</strong> prüft if-<br />
Blöcke nicht auf Ausschluß, daher ist es nicht erlaubt in mehreren solchen den<br />
Wert einer Variablen zu verändern.
2.2. <strong>SMV</strong> (MARKUS ZARBOCK) 27<br />
if(y = 1)<br />
next(x) := 1;<br />
if(y = 2)<br />
next(x) := 0; -- nicht erlaubt<br />
...<br />
Hierfür ist das Case Konstrukt vorgesehen, das dieses stets garantiert, dass nur<br />
einer der aufgeführten Fälle tatsächlich eintritt.<br />
Das folgende Beispiel ist in einer imperativen Programmiersprache möglich.<br />
next(x) := x + 2;<br />
...<br />
next(y) := y + 3;<br />
next(x) := y; -- nicht erlaubt<br />
In <strong>SMV</strong> ist die zweite Zuweisung für x nicht gestattet. Hier gibt es zwei Möglichkeiten<br />
entweder es wird eine neue Variable eingeführt oder Berechnungen werden<br />
so optimiert, daß zwei Zuweisungen nicht notwendig sind.<br />
Im folgenden gilt das synchrone Zeitmodell.<br />
1 module a()<br />
2 {<br />
3 x : 0..7;<br />
4 init(x) := 0;<br />
5<br />
6 next(x) := x+1;<br />
7 }<br />
8 module main()<br />
9 {<br />
10 aInstanz : a();<br />
11 next(aInstanz.x) := 0; --nicht erlaubt<br />
12 }<br />
Da im synchronen Zeitmodel ein globaler Takt weitergesetzt wird, werden hier<br />
die Zuweisungen in Zeile 6 <strong>und</strong> Zeile 11 parallel ausgeführt <strong>und</strong> somit würde<br />
die single assignment Regel verletzt werden. Im synchronen Zeitmodell ist dies<br />
also nicht möglich. Wäre aber aInstanz als asynchroner Prozess (Schlüsselwort<br />
process) instanziiert worden, so wären die Zuweisungen erlaubt. Das liegt daran,<br />
dass im asynchronen Zeitmodell keine zwei Prozesse gleichzeitig weitergetaktet<br />
werden. Die single assignment Regel folgt zwingend aus den Definitionen der<br />
Zeitmodelle. Dennoch sollte sie hier betrachtet werden, da sie sich beim Prozess<br />
des <strong>Model</strong>lierens als Stolperstein erwiesen, weil sie in Bezug auf imperatives<br />
Programmieren ein Paradigmenwechsel darstellt.<br />
Die Circular Dependency Regel<br />
Diese Regel besagt, dass es nicht gestattet ist kreisförmige Zuweisungen ohne<br />
Zeitverzögerungen durchzuführen. Eine kreisförmige Zuweisung sieht zum Beispiel<br />
so aus:
28 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
x := y;<br />
y := x;<br />
Erlaubt sind dagegen kreisförmige Zuweisungen, die Verzögerungen enthalten.<br />
Beispiel :<br />
x := y;<br />
next(y) := x;<br />
2.2.3 Eigenschaften der Spezifikationen<br />
Mit der <strong>Model</strong>lierungssprache von <strong>SMV</strong> beschreibt man die Eigenschaften <strong>eines</strong><br />
Systems, das tatsächlich existiert oder realisiert werden soll. Eine Spezifkation<br />
soll eine Eigenschaft beschreiben, deren Einhaltung am modellierten System<br />
vom <strong>Model</strong>checker zu prüfen ist. <strong>SMV</strong> verwendet für Spezifikationen Linear<br />
Temporal Logic, kurz LTL. Zunächst zur Syntax, Spezifikationen werden mit<br />
dem Schlüsselwort assert gekennzeichnet.<br />
Beispiel:<br />
spez1 : assert G ( a = true);<br />
Jede Spezifikation besteht also aus einem Namen, dem Schlüsselwort assert <strong>und</strong><br />
der eigentlichen Spezifikation in LTL. Diese Zerlegung in einzelne Spezifikationen<br />
geschieht nicht nur aus Gründen der übersichtlichkeit, sondern auch um<br />
Berechnungen zu minimieren. <strong>SMV</strong> kann nämlich gezielt einzelne Spezifikationen<br />
prüfen.<br />
Spezifikationen können auch komplexe Gebilde sein, da man Sprachelemente verwenden<br />
kann, um Spezifikationen zu generieren. Um beispielsweise, die Werte<br />
<strong>eines</strong> Arrays prüfen zu lassen kann man folgende Konstruktion verwenden:<br />
for (i = 0 ; i < 32 ; i = i + 1)<br />
{<br />
dats[i] :<br />
assert G (datas[i] < 31 & datas[i] >= 0);<br />
}<br />
Eine weitere praktische Möglichkeit ist die Verwendung von Mengenschreibweisen,<br />
um den Wertebereich von Variablen zu beschreiben. Beispiel:<br />
spezifikation : assert G ( a = {0..7});<br />
Übersicht Operatoren<br />
Für die Spezifikationen verwendet <strong>SMV</strong> Formeln, die zum einen aus den Operatoren<br />
der Sprache bestehen. Beispielsweise sind die logischen Operatoren:
2.2. <strong>SMV</strong> (MARKUS ZARBOCK) 29<br />
UND &<br />
ODER |<br />
NICHT ~<br />
Zum anderen aus Temporaloperatoren X, G, F <strong>und</strong> U, die wie folgt definiert<br />
sind:<br />
Seien p <strong>und</strong> q Formeln.<br />
X p gilt zum Zeitpunkt t, wenn p zum Zeitpunkt t+1 gilt<br />
G p gilt zum Zeitpunkt t, wenn für alle t’ ≥ t p gilt<br />
F p gilt zum Zeitpunkt t, wenn für ein t’ ≥ t p gilt<br />
p U q gilt, wenn q für ein t’ ≥ t gilt <strong>und</strong> zwischen t <strong>und</strong> t’ p gilt<br />
Bemerkungen zur Verwendung<br />
Da <strong>SMV</strong> ein Kommandozeilen orientiertes Tool ist <strong>und</strong> es in der frei verfügbaren<br />
Version auch keine grafische Repräsentation für <strong>Model</strong>le gibt, sind Spezifikationen<br />
das einzige Mittel, um ein <strong>Model</strong>l dahingehend zu überprüfen, ob es<br />
überhaupt das zu prüfende System korrekt modelliert. Zu diesem Zweck hat es<br />
sich häufig gezeigt, dass Forderungen wie:<br />
“Von jedem Zustand gibt es einen Weg zu einem Zustand in dem<br />
eine Formel gilt.“<br />
dafür sehr praktisch wären. Zum Beispiel könnte man so prüfen lassen, ob ein<br />
Shuttle in einem geschlossenen Gleiskreis immer wieder über ein bestimmtes<br />
Gleis fährt. Formeln, die wie obige kann man in CTL ausdrücken.<br />
AG(EF) p<br />
Für alle Zustände, gibt es einen Pfad zu einem Zustand, in dem p gilt. Leider<br />
lässt sich so etwas nicht in LTL ausdrücken. Die Quantoren F <strong>und</strong> G müsste man<br />
in LTL eigentlich als AF, bzw als AG schreiben. Da es keinen Existenzquantor<br />
gibt kann man mit LTL Formeln einzelne Pfade nicht erfassen. Dieser Nachteil<br />
ist für die eigentlichen Spezifikationen dann jedoch eher vernachlässigbar, weil<br />
es dann ja gerade erwünscht ist Bedingungen zu formulieren, die für alle Pfade<br />
gelten.<br />
2.2.4 Verwendung von <strong>SMV</strong><br />
Konsole<br />
<strong>SMV</strong> kann auf zwei unterschiedliche Arten bedient werden. Zunächst ist <strong>SMV</strong><br />
ein Kommandozeilenprogramm, dem man ein <strong>Model</strong>l <strong>und</strong> die Spezifikationen<br />
übergibt. Die Ausgabe besteht zum einen aus dem Ergebnis der Spezifikationsprüfung,<br />
sprich wahr oder falsch, wobei <strong>SMV</strong> nach der ersten falschen Spezifikation<br />
mit einem Gegenbeispiel abbricht. Zum anderen gibt <strong>SMV</strong> eine ganze<br />
Reihe von Angaben zum internen Ablauf, durch die man sich den Umfang der<br />
Berechnungen verdeutlichen kann.
30 KAPITEL 2. VORSTELLUNG VON <strong>UPPAAL</strong> UND <strong>SMV</strong><br />
GUI<br />
Die zweite Art mit <strong>SMV</strong> zu arbeiten besteht in der Benutzung der mit TCL/TK<br />
geschriebenen grafischen Benutzeroberfläche. Diese kapselt im wesentlichen die<br />
parametrisierten Kommandozeilenaufrufe. Wenn man das Programm startet<br />
<strong>und</strong> eine <strong>Model</strong>ldatei (*.smv) lädt, so zeigt <strong>SMV</strong> zunächst den Quelltext <strong>und</strong> in<br />
einer Baumstruktur alle instanziierten Module sowie deren Variablen an, (Abbildung<br />
B.1).<br />
Wechselt man nun in die Spezifikationsansicht ( Abbildung B.2), so werden<br />
nun im oberen Fenster die im Quelltext gef<strong>und</strong>en Spezifikationen aufgelistet.<br />
Diese kann man unter dem Menüpunkt Prop einzeln prüfen lassen. Diese Einzelprüfung<br />
ist sehr hilfreich, wenn man in großen <strong>Model</strong>len mit vielen Spezifikationen<br />
gezielt Prüfungen vornehmen kann.<br />
Hat man <strong>SMV</strong> nun eine oder mehrere Spezifikationen prüfen lassen, so bekommt<br />
man die Ergebnisse <strong>und</strong> die Berechnungsdaten im Logfenster angezeigt (Abbildung<br />
B.3).<br />
Erfüllt ein <strong>Model</strong>l eine Spezifikation nicht, so berechnet <strong>SMV</strong> ein Gegenbeispiel.<br />
Dieses wird dann in einem Trace angezeigt (Abbildung B.4). Man kann dieses<br />
Gegenbeispiel auch in wählbarer Schrittzahl weiterberechnen lassen.
Kapitel 3<br />
Fallstudie<br />
Dieses Kapitel bildet das Kernstück dieser Studienarbeit. Anhand <strong>eines</strong> praktischen<br />
Beispiels, <strong>eines</strong> Ausschnitts aus der ISILEIT 1 -Fallstudie [18, 5], wird<br />
der stetig wachsende Einsatz von <strong>Model</strong>-Checker Werkzeugen in der Praxis gezeigt.<br />
Außerdem wird an diesem Beispiel gezeigt, wo Grenzen der einzelnen<br />
<strong>Model</strong>-Checker liegen, bzw. welche Werkzeuge für welche Gebiete besonders<br />
prädestiniert sind.<br />
Abbildung 3.1: Eine mögliche Topologie der ISILEIT-Fallstudie<br />
3.1 Vorstellung (Martin Hirsch)<br />
In der Fallstudie geht es um die Simulation <strong>eines</strong> komplexen <strong>Materialflusssystems</strong>.<br />
Verschiedene Arbeitsstationen sind durch ein Schienennetz, auf dem<br />
autonome Shuttles verkehren, verb<strong>und</strong>en. An den einzelnen Stationen können<br />
die Shuttles mit Material beladen bzw. entladen werden. Weiterhin stehen an<br />
den einzelnen Stationen verschiedene Roboter bereit, die die Materialien weiterverarbeiten<br />
oder bis zu einer späteren Verwendung lagern.<br />
1 Integrative Spezifikation von Leitsystemen der flexibel automatisierten Fertigung<br />
31
32 KAPITEL 3. FALLSTUDIE<br />
An strategischen Punkten des Schienensystems sind Sensoren angebracht, die einer<br />
Steuereinheit, einem Koordinator, der für diesen Systemabschnitt zuständig<br />
ist, melden, wenn ein Shuttle diesen passiert. Ein Koordinator übernimmt jeweils<br />
die Koordination seiner angeschlossenen Komponenten, d. h. er sorgt<br />
dafür, dass Shuttles z. B. an den richtigen Stationen zum Be- bzw. Entladen<br />
gestoppt werden <strong>und</strong> Weichen immer richtig gestellt sind, so dass die Shuttles<br />
immer den richtigen Weg nehmen bzw. es zu keiner Entgleisung kommt.<br />
Abbildung 3.2: Ausschnitt aus der ISILEIT-Fallstudie<br />
Ein mögliches Szenario für einen Koordinator, die Ansteuerung von Weichen mit<br />
den dazugehörigen Komponenten, ist in Abb. 3.2 dargestellt. Wie in Abb. 3.2<br />
zu erkennen, gibt es hier die Komponenten Switch 1, Switch 2 (Weichensteuerungseinheiten)<br />
<strong>und</strong> Ventilinsel <strong>und</strong> natürlich die beiden Weichen. Jede Weichensteuerungseinheit,<br />
die in der Realität durch eine Speicherprogrammierbare<br />
Steuereinheit (SPS) verkörpert wird, steht über eine Kommunikationsleitung<br />
mit dem Koordinator in Verbindung. Über eine elektronische Verbindung kann<br />
eine Weichensteuerungseinheit die Ventilinsel, ein 4/2 Wegeventil, ansteuern,<br />
das wiederum die Weichen bewegt.<br />
In unserer <strong>Model</strong>lierung haben wir uns auf die in Abb. 3.2 dargestellten Komponenten<br />
beschränkt. Die Be- <strong>und</strong> Entladesteuerung, Verarbeitung sowie die<br />
Lagerverwaltung der einzelnen Materialien wurden aus Komplexitätsgründen<br />
weggelassen. Folgende Regeln <strong>und</strong> Anforderungen wurden an unser System gestellt:<br />
1. Im kompletten System darf es zu keiner Deadlocksituation kommen.<br />
2. Auf Gr<strong>und</strong> der gegebenen technischen Voraussetzung der Ventilinsel kann<br />
zu einem Zeitpunkt immer nur eine Weiche geschaltet werden. Dieses muss<br />
vom Koordinator geregelt werden.
3.2. <strong>UPPAAL</strong> (MARTIN HIRSCH) 33<br />
3. Die beiden Weichensteuerungseinheiten verfügen über keine Kommunikation<br />
untereinander, d. h, sie können sich über keine globalen Variablen<br />
gegenseitig sperren um die unter 2. genannte Voraussetzung zu erfüllen.<br />
Dieser Vorgang muss vom Koordinator gelöst werden.<br />
4. Bevor ein Shuttle die Passage Schiene1, Schiene3, Schiene4 passieren<br />
will, müssen Weiche 1 <strong>und</strong> Weiche 2 richtig gestellt sein. Erst nachdem<br />
das Shuttle auf Schiene4 angekommen ist, werden die Weichen wieder freigegeben.<br />
5. Möchte ein Shuttle die Passage über Schiene1, Schiene2, Schiene4 nehmen,<br />
so wird vorerst nur Weiche 1 geschaltet, Weiche 2 wird erst geschaltet,<br />
wenn das Shuttle an der Arbeitsstation angekommen ist <strong>und</strong> weiter<br />
möchte.<br />
6. Auf Schiene3 darf sich zu keinem Zeitpunkt mehr als ein Shuttle befinden.<br />
Weiterhin darf ein Shuttle auf diesem Schienenstück nicht stehen bleiben.<br />
7. Eine Weiche darf nur dann von einem Shuttle passiert werden, wenn sie<br />
arretiert ist.<br />
3.2 Uppaal (Martin Hirsch)<br />
In diesem Abschnitt wird die Vorgehensweise bei der <strong>Model</strong>lierung der Fallstudie<br />
erläutert <strong>und</strong> das ”<br />
Programm“ anhand der Automaten <strong>und</strong> Quelltextausschnitte<br />
weitestgehend erklärt. Abschließend werden Resultate des Verifikationsprozesses<br />
genannt.<br />
3.2.1 Vorgehensweise zur <strong>Model</strong>lierung der Fallstudie<br />
Im ersten Schritt wurde die Sichtung der vohandenen beteiligten Komponenten<br />
vorgenommen. Aus obiger Beschreibung ergibt sich folgende Liste:<br />
1. Koordinator<br />
2. Switch 1 <strong>und</strong> Switch 2<br />
3. Ventilinsel<br />
4. Shuttles<br />
5. Weiche 1 mit Zustandssensor <strong>und</strong> Weiche 2 mit Zustandssensor<br />
6. Schiene 1 mit Sensor 1, Schiene 2 mit Sensor 2, Schiene 3 mit Sensor 3,<br />
Schiene 4 mit Sensor 4<br />
Die Realisierung der einzelnen Komponenten wird im Folgenden erläutert, bei<br />
der <strong>Model</strong>lierung aufgetretene Probleme werden aufgezeigt.
34 KAPITEL 3. FALLSTUDIE<br />
3.2.2 Die <strong>Model</strong>lierung<br />
Koordinator<br />
Der Koordinator als koordinierende Instanz für die Komponenten der Weichensteuerungseinheiten<br />
wird als eigener Automat realisiert. Dabei muss beachtet<br />
werden, dass der Koordinator in der Struktur <strong>eines</strong> ”<br />
switch case Blocks“ aufgebaut<br />
werden muss. Der Koordinatorprozess muss in jedem Takt neue Inputs<br />
verarbeiten können <strong>und</strong> sollte sich nicht in einer Schleife aufhalten. Dieses wird<br />
am besten durch einen Automaten mit nur einem Zustand, von dem alle ”<br />
cases“<br />
ausgehen, dargestellt durch (Selbst-)Transitionen, umgesetzt.<br />
Der relativ komplexe Automat für den Koordinator, komplex bezieht sich hierbei<br />
nicht auf die Anzahl der Zustände, der Automat besitzt nur einen Zustand, sondern<br />
auf die umfangreiche Steuerlogik, wurde in Form <strong>eines</strong> ”<br />
switch case Blocks“<br />
aufgebaut. So fragt der Koordinator in jedem Takt seine Signale bzw. Variablen<br />
ab <strong>und</strong> kann dementsprechend reagieren. Die Signale sind Inputs von den<br />
Weichensteuerungseinheiten Switch 1 <strong>und</strong> Switch 2, die Variablen sind lokaler<br />
Art, die einen Zustand des Koordinators darstellen <strong>und</strong> durch Veränderungen<br />
im nächst möglichen Takt eine Transition feuern lassen.<br />
Folgende Beispielabläufe erklären die Logik des Automaten, der Quellcode ist<br />
im Anhang unter A.4 aufgelistet.<br />
Beispielablauf 1: Ein Shuttle möchte den Weg über die Schiene 1,<br />
Schiene 2, Schiene 4 nehmen.<br />
Das Shuttle löst als erstes den Sensor 1 der Schiene 1 aus. Der Koordinator<br />
merkt sich in einer Variablen zustand sensor 1, dass ein Signal anliegt<br />
<strong>und</strong> stellt den Richtungswunsch des Shuttles fest richtung==links. Ist zustand<br />
sensor 1==true, liegt also ein Signal an, überprüft der Koordinator<br />
als nächstes, ob die zu schaltende Weiche 1 frei ist. Den Zustand der Weiche<br />
merkt sich der Koordinator stets in einer lokalen Variablen weiche belegt 1.<br />
Ist weiche belegt 1==false, die Weiche also von keinem anderen Schaltvorgang<br />
belegt, setzt der Koordinator weiche belegt 1:=true, die Komponente<br />
Weiche 1 wird also belegt <strong>und</strong> die Variable bewege weiche 1:=true wird gesetzt.<br />
Nun weiß der Koordinator, dass eine Anforderung zum Schalten der Weiche<br />
1 existiert. Sobald möglich, sendet er nun über einen Kommunikationskanal<br />
steuer weiche 1! ein Signal an Switch 1, der den Schaltvorgang der Weiche<br />
übernimmt. Bei diesem Vorgang setzt der Koordinator seine lokale Variable<br />
ventilinsel belegt:=true. Diese Variable sperrt die Ventilinsel, da diese zu<br />
einem Zeitpunkt schließlich immer nur eine Weiche schalten kann. Wenn nun<br />
die Weiche geschaltet ist, bekommt der Koordinator über einen Kommunikationskanal<br />
vom Switch 1 ein Signal. Der Koordinator setzt erst jetzt die Flags<br />
ventilinsel belegt, weiche belegt 1 wieder auf false <strong>und</strong> gibt dem Shuttle<br />
das Signal weiter 1 zur Weiterfahrt über die Weiche 1 auf Schiene 2. Befindet<br />
sich das Shuttle nun auf Schiene 2 <strong>und</strong> löst dort den Sensor 2 der Schiene 2<br />
aus, verhält sich der Koordinator genauso wie oben, nur mit den Signalen <strong>und</strong><br />
Variablen ˜ 2.
3.2. <strong>UPPAAL</strong> (MARTIN HIRSCH) 35<br />
Beispielablauf 2: Ein Shuttle möchte den Weg über die Schiene 1,<br />
Schiene 3, Schiene 4 nehmen.<br />
Das Shuttle löst als erstes den Sensor 1 der Schiene 1 aus. Der Koordinator<br />
merkt sich in einer Variablen, zustand sensor 1, dass ein Signal anliegt <strong>und</strong><br />
stellt den Richtungswunsch des Shuttles fest richtung==links. Ist zustand sensor<br />
1==true, liegt also ein Signal an, überprüft der Koordinator als nächstes,<br />
ob die zu schaltende Weiche 1 <strong>und</strong> Weiche 2 frei sind. Ist dieses der Fall, werden<br />
beide Weichen als belegt gekennzeichnet, weiche belegt 1:=true, weiche belegt<br />
2:=true, sowie die Anforderungsvariablen zum Schalten der Weichen gesetzt<br />
(bewege weiche 1:=true, bewege weiche 2:=true). Im Folgenden werden<br />
jetzt die beiden Weichen geschaltet. In welcher Reihenfolge dies geschieht,<br />
ist nicht festgelegt. Es kann also sein, dass entweder Weiche 1 als erstes schaltet<br />
oder Weiche 2. Die Variable ventilinsel belegt, die bei jedem Schaltvorgang<br />
auf den Wert true gesetzt wird <strong>und</strong> erst nach Vollendung wieder auf false,<br />
verhindert, dass beide Weichen gleichzeitig schalten. Der Schaltvorgang einer<br />
Weiche wird hier genauso gelöst wie unter Beispiel 1. Erst wenn beide Weichensteuerungseinheiten<br />
das Signal an den Koordinator gegeben haben, dass<br />
die Weichen geschaltet sind, wird das Shuttle weitergeschickt (weiter 1!). Da<br />
das Shuttle auf dieser Passage vor der Weiche 2 nicht angehalten werden kann,<br />
wie es auf Schiene 2 möglich ist, darf die Weiche 2 erst dann wieder freigegeben<br />
werden, wenn das Shuttle den Sensor der Schiene 4 ausgelöst hat. Andernfalls<br />
könnte ein Shuttle, das auf Schiene 2 steht, die Weiche für sich richtig stellen lassen.<br />
Um dieses zu umgehen, wird die Variable weiche belegt 2 erst zu diesem<br />
Zeitpunkt wieder auf false gesetzt <strong>und</strong> die Komponente Weiche 2 freigegeben.<br />
Weichensteuerungseinheiten<br />
Die Weichensteuerungseinheiten Switch 1 <strong>und</strong> Switch 2, ebenfalls notwendig<br />
für die <strong>Model</strong>lierung, werden als Instanzen <strong>eines</strong> Automaten Switch realisiert.<br />
Dieses ist möglich, da die beiden Speicherprogrammierbaren Steuerungen (SPS)<br />
dieselbe Logik haben, nur mit anderen Ein- bzw. Ausgangssignalen. Bei der<br />
<strong>Model</strong>lierung muss berücksichtig werden, dass die beiden SPS’en untereinander<br />
nicht direkt kommunizieren können. Die Weichensteuerungseinheit soll sich in<br />
einer lokalen Variablen die jeweilige Position der Weiche, für die sie verantwortlich<br />
ist, merken.<br />
Der Automat Switch (siehe Abb. 3.4) besitzt 10 Zustände <strong>und</strong> befindet sich<br />
initial im start Zustand, erkennbar an den Doppelkreisen des Zustandsymbols.<br />
Die Steuerungseinheit ist, wie oben erwähnt, für die Ansteuerung der Weichen<br />
bzw. genauer der Ventilinsel, zuständig. Bekommt der Automat nun vom Koordinator<br />
das Signal steuer weiche zum Schalten der Weiche (Transition start<br />
→ S0), springt der Automat in den Zustand S0 <strong>und</strong> startet eine Uhr x:=0.<br />
Innerhalb desselben Taktes wertet der Automat aus, in welche Richtung das<br />
Shuttle fahren möchte (Transition S0 → S1 bzw. S0 → S2 ) <strong>und</strong> stellt fest,<br />
ob sich die Weiche schon in der richtigen Position befindet oder nicht. Dies ist<br />
möglich, da sich der Automat in einer lokalen Variablen weichen position stets<br />
die Position der Weiche merkt. Befindet sich die Weiche schon in der korrekten
36 KAPITEL 3. FALLSTUDIE<br />
Stellung, gibt der Automat noch im selben Takt ein Signal weiche geschaltet!<br />
an den Koordinator (Transition S4 → start bzw. S8 → start) <strong>und</strong> schaltet<br />
wieder in den Ruhezustand start. Ist die Position der Weiche allerdings noch<br />
nicht die richtige, der Automat befindet sich in den Zuständen S3 bzw. S6,<br />
gibt dieser ein Signal an die Ventilinsel druckluft ventilinsel <strong>und</strong> löst die<br />
Arretierung der Weiche arretiert:=false. Für diesen Vorgang braucht die<br />
Steuerungseinheit einen Zeittakt, erkennbar an der Zeitbedingung x==1 der<br />
Transition S3 → S5 bzw. S6 → S7, der Automat befindet sich nun in S5 bzw.<br />
S7. Frühestens nach 2 weiteren (guard x>=3) <strong>und</strong> spätestens nach 3 Zeiteinheiten,<br />
die Zustände S5 <strong>und</strong> S7 sind mit Invarianten x
3.2. <strong>UPPAAL</strong> (MARTIN HIRSCH) 37<br />
Weiche 1 <strong>und</strong> Weiche 2<br />
Die beiden Weichen, obwohl unterschiedlich (Splitter <strong>und</strong> Joiner), werden im<br />
<strong>Model</strong>l als ein Typ angesehen. Auf den ersten Blick ist dieses nicht so ganz<br />
einsehbar aber dennoch korrekt. Im physikalischen <strong>Model</strong>l kennt die Weiche<br />
auch nur ihre zwei Zustände, Links oder Rechts. Die Art <strong>und</strong> Weise, wie sie<br />
in das Schienennetz eingebaut ist, ist für die Weiche selbst uninteressant, lediglich<br />
die steuernde Instanz, also der Koordinator, muss dieses berücksichtigen.<br />
Auf Gr<strong>und</strong> dieser Gegebenheit können die beiden Weichen deshalb Instanz ein<br />
<strong>und</strong> desselben Automaten sein. Da man aber auch Fehlverhalten bzw. nicht<br />
korrektes Schalten oder Blockieren einer Weiche mit modellieren möchte, muss<br />
der Weichen-Automat neben den zwei Zuständen Links bzw. Rechts auch noch<br />
zwei weitere Zustände bekommen. Diese stellen Zwischenzustände dar, d. h.<br />
die Weiche schaltet über einen Zwischenzustand in die neue Position. Die Wei-<br />
Abbildung 3.4: Uppaal – Automat Weiche<br />
che (siehe Abb. 3.4) besteht aus den vier Zuständen weiche ist rechts, S2,<br />
S1 <strong>und</strong> weiche ist links. Anfangszustand ist weiche ist links, d. h. beim<br />
Starten des Systems befindet sich die Weiche in der definierten Linken Stellung<br />
(Anfangszustand ist immer durch den doppelten Kreis gekennzeichnet). S1 <strong>und</strong><br />
S2 sind Zwischenstellungen, schließlich springt die Weiche in der Realität auch<br />
nicht sofort von Links nach Rechts bzw. Rechts nach Links. Bekommt die<br />
Weiche nun Druckluft von der Ventilinsel, die Weiche befindet sich zu diesem<br />
Zeitpunkt entweder im Zustand weiche ist links oder weiche ist rechts,<br />
schaltet sie zuerst in S1 bzw. S2 (Transition 1 bzw. 3). Dieser Vorgang wird<br />
durch die Kanalvariable druckluft 1! realisiert, die von der Ventilinsel ausgelöst<br />
wird (siehe Automat Ventilinsel). Nachdem ein Zeittakt verstrichen ist<br />
(clock x>=1), schaltet die Weiche in den neuen Zustand weiche ist links<br />
bzw. weiche ist rechts (Transition 2 bzw. 4) <strong>und</strong> löst den entsprechenden<br />
Näherungssensor der Weiche aus, so dass die Weichensteuerungseinheit eine
38 KAPITEL 3. FALLSTUDIE<br />
Rückmeldung erhält. Diese Rückmeldung wird wiederum durch eine Kanalvariable<br />
naeherungs sensor rechts! bzw. naeherungs sensor links! gelöst.<br />
Ventilinsel<br />
Die Ventilinsel ist im <strong>Model</strong>l nicht unbedingt mit zu modellieren, da sie im realen<br />
System keine weitere Aufgabe hat als die elektronischen Signale in Druckluft<br />
umzuwandeln <strong>und</strong> an die Weiche weiterzugeben. D. h. man könnte z. B. in der<br />
<strong>Model</strong>lierung das Signal direkt an die Weiche geben <strong>und</strong> stattdessen eine längere<br />
fingierte Schaltzeit für die Weiche einplanen. Diese Abstraktion hat zum Nachteil,<br />
dass ein in der Realität auftretendes Fehlverhalten der Ventilinsel bei der<br />
<strong>Model</strong>lierung unberücksichtig gelassen würde. Da man beim <strong>Model</strong>-<strong>Checking</strong><br />
aber gerade solche Verhaltensweisen von Systemen überprüfen will, wird die<br />
Ventilinsel in das <strong>Model</strong> mit aufgenommen.<br />
Wie erwähnt dient die Ventilinsel lediglich dazu, die Signale, die sie von einer<br />
Weichensteuerungseinheit bekommt, in Druckluft umzuwandeln. Allerdings<br />
kann die Ventilinsel, wie oben unter den Anforderungen an das System bereits<br />
genannt, zu einem Zeitpunkt immer nur genügend Luft zum Schalten einer Weiche<br />
bereitstellen.<br />
Der Quellcode des Automaten-Templates Ventilinsel<br />
1 process Ventilinsel<br />
2 {<br />
3 clock x;<br />
4 state S3{x S0{sync druckluft_weiche_rechts_1;<br />
13 assign x:=0; },<br />
14 S0 -> start{guard x>=1;<br />
15 sync druckluft_1!; },<br />
16 start -> S1{sync druckluft_weiche_links_1;<br />
17 assign x:=0; },<br />
18 S1 -> start{guard x>=1;<br />
19 sync druckluft_1!; },<br />
20 start -> S3{sync druckluft_weiche_links_2;<br />
21 assign x:=0; },<br />
22 S3 -> start{guard x>=1;<br />
23 sync druckluft_2!; };<br />
24 }
3.2. <strong>UPPAAL</strong> (MARTIN HIRSCH) 39<br />
Der Automat Ventilinsel besteht aus den 5 Zuständen start, S0, S1, S2<br />
<strong>und</strong> S3, deklariert durch das Schlüsselwort state (Zeile 4), initial start (Zeile<br />
6). Soll z. B. Weiche 1 von Links nach Rechts geschaltet werden (Zeile 10), bekommt<br />
die Ventilinsel vom Automat Switch 1 ein Signal druckluft weiche rechts 1,<br />
schaltet vom Zustand start in den Zustand S1, wartet eine Zeiteinheit, um den<br />
Druck aufzubauen, <strong>und</strong> gibt schließlich Druckluft druckluft 1! an Weiche 1,<br />
die daraufhin schaltet (Zeile 12). Die anderen Schaltvorgänge laufen analog ab.<br />
Shuttles <strong>und</strong> Schienennetz<br />
Die Komponenten Shuttle <strong>und</strong> Schienennetz sind gemeinsam zu betrachten.<br />
Bei der Realisierung der beiden Komponenten ist zu überlegen, ob man das<br />
Shuttle als aktives, die Schiene als passives Objekt bzw. umgekehrt darstellt.<br />
Wird das Shuttle als passives Objekt angesehen, so bedeutet dies eine hohe Abstraktion<br />
von den realen Gegebenheiten. Die Schiene würde als Aktionsträger<br />
die Shuttles bereits beinhalten. In Uppaal würde das Shuttle durch ein Token<br />
dargestellt. Durch Kommunikationskanäle würden sich die Schienen nun untereinander<br />
verständigen <strong>und</strong> sich gegenseitig aktivieren, das Shuttle also weiterreichen.<br />
Diese Variante hat den Vorteil, dass die Anzahl der Zustände des<br />
gesamten System relativ gering bleibt, da man die Schienen an sich durch einfache<br />
Automaten aus je 2 Zuständen darstellen kann. Der Nachteil ist, dass<br />
man die Shuttles nicht unterscheiden kann. Außerdem ist es nicht möglich, die<br />
Shuttles in irgendeiner Form zu beladen“, wie es in der Fallstudie vorgesehen<br />
”<br />
ist.<br />
Betrachtet man das Shuttle nun als aktives Element, wird das Shuttle als Instanz<br />
<strong>eines</strong> Shuttle-Automaten dargestellt. Durch die Anzahl der Instanzen, die<br />
man vorab festlegt, wird die Menge der Shuttles im System, das geprüft werden<br />
soll, bestimmt. Die Vorteile dieser Variante sind klar ersichtlich. Die Shuttles<br />
können nun identifziert werden, da sie eine Instanz sind. Jedes Shuttle hat<br />
sein eigenes Verhalten, es kann z. B. Ladung aufnehmen. Durch die geringere<br />
Abstraktion von der Realität werden in diesem Fall die Zustände des Systems<br />
erheblich gegenüber der ersten Variante erhöht. Dieser Nachteil ist jedoch nicht<br />
so schlimm, wie in Kapitel 3.2.3 anhand von Auswertungen belegt wird.<br />
Abb. 3.5 zeigt eine Möglichkeit der Realisierung <strong>eines</strong> Automaten für ein Shuttle.<br />
Wie zu erkennen, ist der Automat in Form des in 3.2 dargestellten Schienensystems<br />
aufgebaut. Das Shuttle besitzt intern eine Abbildung der gegebenen<br />
Topologie. Ein Shuttle weiß, in welcher Reihenfolge welche Signale empfangen<br />
<strong>und</strong> gesendet werden dürfen <strong>und</strong> an welcher Stelle es sich gerade befindet. So<br />
ergibt sich folgende Einteilung:<br />
Schiene 1: Zustände Start & Sensor 1<br />
Schiene 2: Zustände S1 & Sensor 2<br />
Schiene 3: Zustände S2 & Sensor 3<br />
Schiene 4: Zustände S3 & Sensor 4.<br />
Das autonom reagierende Shuttle kann lediglich Sensoren sensor 1, sensor 2,<br />
sensor 3, sensor 4 der entsprechenden Schienen auslösen <strong>und</strong> an ensprechen-
40 KAPITEL 3. FALLSTUDIE<br />
Abbildung 3.5: Uppaal – Automat Shuttle<br />
den Stationen Sensor 1, Sensor 2, Sensor 4 gestoppt werden. Durch ein Signal<br />
weiter 1, weiter 2, weiter 4 wird es wieder in Bewegung gesetzt.<br />
3.2.3 Ergebnisse der Verifikation<br />
In diesem Abschnitt werden die Ergebnisse des Verifikationsprozesses vorgestellt.<br />
Anhand der in 3.1 an das System gestellten Bedingungen wurden entsprechende<br />
Prüfformeln erstellt.<br />
Prüfformeln sind (sollten) eine ”<br />
bijektive Abbilung“ <strong>eines</strong> sprachlich formulierten<br />
Regelwerks <strong>eines</strong> Systems auf eine mathematische Formel (sein). Durch die<br />
mathematische Formel, in diesem Fall in TCTL (siehe 2.1.4) formuliert, wird<br />
also immer nur das überprüft, was letztendlich auf diese abgebildet wurde. Eine<br />
Schwierigkeit des Verifikationsprozesses ist es also auch, das <strong>und</strong> nur das auf<br />
Prüfformeln abzubilden, was gefordert war.<br />
Da in 3.1 die Regeln schon recht eindeutig formuliert wurden, ist es in diesem<br />
Fall recht einfach, diese genau abzubilden. Dieses ist jedoch häufig nicht der Fall.<br />
So steht fast immer vor dem Verifikationsprozess durch den <strong>Model</strong> Checker erst<br />
der ”<br />
Beweis“, dass die Formeln auch wirklich die zu prüfenden Eigenschaften<br />
ausdrücken.<br />
Eigenschaft Nr.1<br />
Im System tritt nie eine Deadlock Situation auf.<br />
Zur Überprüfung dieser Eigenschaft stellt Uppaal schon eine vorgegebene Formel,<br />
deadlock, zur Verfügung. Will man also die Deadlockfreiheit des ganzen
3.2. <strong>UPPAAL</strong> (MARTIN HIRSCH) 41<br />
Systems zu jedem Zeitpunkt überprüfen, formuliert man folgende Formel:<br />
A□ not deadlock.<br />
Eine Auswertung durch den Verifizierer 2 hat folgende Werte ergeben.<br />
Anz. Shuttle Anz. Zustände Verifikationszeit Anforderung<br />
Instanzen des Systems (in Sek.) erfüllt (j/n)<br />
1 44 ≪ 1 j<br />
2 54 < 1 j<br />
3 64 ≈ 1 j<br />
4 74 ≈ 3 j<br />
5 84 ≈ 21 j<br />
6 94 ≈ 66 j<br />
7 104 ≈ 189 j<br />
Neben der Eigenschaft, dass diese Formel immer akzeptiert wird, ist zu beobachten,<br />
dass schon mit geringer Erhöhung der Zustände des Gesamtsystems die Verifikationszeit<br />
erheblich ansteigt. So ist bei der Erhöhung von 74 auf 84 Zustände<br />
ein Faktor 7, von 84 auf 94 sowie von 94 auf 104 Zustände ein Faktor 3 festzustellen,<br />
die Verifikationszeit bei maximaler Zustandszahl beträgt schon über 3<br />
Minuten. Bei einer Verifikation auf einer anderen, nicht so schnellen Hardware 3<br />
benötigt der Verifizierer für das System mit 7 Shuttles (104 Zustände) schon über<br />
2 St<strong>und</strong>en! Diese Zahl verdeutlicht die doch schon relativ große Komplexität<br />
des <strong>Model</strong>-<strong>Checking</strong>s bei einem doch recht einfachen Beispiel sehr gut.<br />
Eigenschaft Nr.2<br />
Zu einem Zeitpunkt t wird immer nur eine Weiche geschaltet.<br />
Die Prüfformel für diese Systemeigenschaft ist schon etwas komplexer. Aus<br />
3.2.2 ist bekannt, dass eine Weiche 4 Zustände besitzt, weiche ist rechts,<br />
weiche ist links, S1, S2. Befindet sich nun eine Weiche zu einem Zeitpunkt<br />
t im Zustand S1 bzw. S2, die Weiche schaltet also gerade, muss die andere<br />
Weiche entweder im Zustand weiche ist rechts bzw. weiche ist links sein.<br />
Dieses muss für beide Weichen zu jedem Zeitpunkt des Systemablaufes gelten.<br />
Unter Verwendung der in 2.1.3 vorgestellten Operatoren ergibt sich folgende<br />
Prüfformel:<br />
A□ (((weiche 1.S1 or weiche 1.S2) imply (weiche 2.weiche ist links<br />
or weiche 2.weiche ist rechts)) and ((weiche 2.S1 or weiche 2.S2)<br />
imply (weiche 1.weiche ist links or weiche 1.weiche ist rechts)))<br />
2 auf folgender Hardware: Dual Intel Pentium III Prozessor, 933 MHz, 512 MB Hauptspeicher;<br />
OS: Linux, Debian Distribution<br />
3 Intel Pentium III 450 MHZ, 128 MB Hauptspeicher; OS: Windows 98
42 KAPITEL 3. FALLSTUDIE<br />
Die zeitliche Auswertung des Verifikationsprozesses ergibt ein ähnliches Bild wie<br />
oben was den Faktor des Zeitanstieges betrifft. Auffällig ist, dass die Verifikation<br />
hier allgemein in kürzerer Zeit geschieht. Das ist dadurch zu erklären, dass im<br />
obigen Fall alle Zustände des Systems überprüft werden mussten, im vorliegenden<br />
Fall lediglich eine eingeschränkte Menge.<br />
Anz. Shuttle Anz. Zustände Verifikationszeit Anforderung<br />
Instanzen des Systems (in Sek.) erfüllt (j/n)<br />
1 44 ≪ 1 j<br />
2 54 ≪ 1 j<br />
3 64 < 1 j<br />
4 74 ≈ 2 j<br />
5 84 ≈ 9 j<br />
6 94 ≈ 32 j<br />
7 104 ≈ 86 j<br />
Eine weitere Verwendung des imply Operators zeigt die folgende Formel für die<br />
nächste Bedingung.<br />
Eigenschaft Nr.3<br />
Eine Weiche muss arretiert sein, wenn sie von einem Shuttle passiert<br />
wird.<br />
A□ (shuttle 1.Weiche1 imply switch 1.arretiert==true)<br />
bzw.<br />
A□ (shuttle 1.Weiche2 imply switch 2.arretiert==true)<br />
Da im System alle Shuttle-Instanzen gleichberechtigt sind, ist es egal, welche<br />
in der Prüfformel verwendet wird. Wenn sich also ein Shuttle auf der Weiche1<br />
befindet, hat die Variable arretiert der Weichensteuerungseinheit switch 1<br />
bzw. switch 2 immer den Wert true, d. h. die Weiche ist in der Realität<br />
arretiert.<br />
Anz. Shuttle Anz. Zustände Verifikationszeit Anforderung<br />
Instanzen des Systems (in Sek.) erfüllt (j/n)<br />
1 44 ≪ 1 j<br />
2 54 ≪ 1 j<br />
3 64 < 1 j<br />
4 74 ≈ 2 j<br />
5 84 ≈ 8 j<br />
6 94 ≈ 28 j<br />
7 104 ≈ 83 j
3.2. <strong>UPPAAL</strong> (MARTIN HIRSCH) 43<br />
Eigenschaft Nr.4<br />
Wenn ein Shuttle nach Links, also auf die Schiene 2 fahren möchte,<br />
gelangt es auch immer dorthin.<br />
In der folgen Prüfformel kommt der in 2.1.3 erwähnte leadsto Operator zur<br />
Verwendung. Wie an der formulierten Eigenschaft schon zu erkennen, soll eine<br />
Fortschrittseigenschaft überprüft werden, d. h. trifft dieses Ereignis unter den<br />
gegebenen Bedingungen in der Zukunft ein.<br />
(shuttle 1.Weiche1 and richtung==links) −→ shuttle 1.S1<br />
Anz. Shuttle Anz. Zustände Verifikationszeit Anforderung<br />
Instanzen des Systems (in Sek.) erfüllt (j/n)<br />
1 44 ≪ 1 j<br />
2 54 ≪ 1 j<br />
3 64 < 1 j<br />
4 74 ≈ 2 j<br />
5 84 ≈ 9 j<br />
6 94 ≈ 32 j<br />
7 104 ≈ 84 j<br />
Eigenschaft Nr.5<br />
Bevor ein Shuttle die Passage über Schiene 1, Schiene 3, Schiene 4<br />
nimmt, sind beide Weichen bereits in der korrekten, also in der Rechten<br />
Stellung arretiert.<br />
Folgende Formel zeigt, wie mehrere Bedingunen in einer Prüfformel miteinander<br />
verknüpft werden.<br />
A□ (shuttle 1.Weiche1 and richtung==rechts) imply<br />
((weiche 1.weiche ist rechts and weiche 2.weiche ist rechts)<br />
and (switch 1.arretiert==true and switch 2.arretiert==true))<br />
Anz. Shuttle Anz. Zustände Verifikationszeit Anforderung<br />
Instanzen des Systems (in Sek.) erfüllt (j/n)<br />
1 44 ≪ 1 j<br />
2 54 ≪ 1 j<br />
3 64 < 1 j<br />
4 74 ≈ 3 j<br />
5 84 ≈ 10 j<br />
6 94 ≈ 32 j<br />
7 104 ≈ 98 j<br />
Trotz der komplexen Formel ist bei der Verifikationszeit kein großer Unterschied<br />
zu den vorherigen Zeiten festzustellen.
44 KAPITEL 3. FALLSTUDIE<br />
Eigenschaft Nr.6<br />
Wenn ein Shuttle die Passage über Schiene 3 gewählt hat, hat das<br />
Shuttel dieses Schienenstück nach spätestens 3 Zeiteinheiten wieder<br />
verlassen.<br />
A□ (shuttle 1.Weiche2 and von richtung==rechts) imply shuttle 1.x
3.2. <strong>UPPAAL</strong> (MARTIN HIRSCH) 45<br />
Abbildung 3.6: Grafische Auswertung der Verifikationszeiten<br />
Anstieg bei Erhöhung der Gesamtzustände sehr gut. Es ist ersichtlich, dass die<br />
Verifikatonszeiten bei Systemen mit noch mehr Zuständen als im vorliegenden<br />
Fall sprunghaft ansteigen werden.
46 KAPITEL 3. FALLSTUDIE<br />
3.3 <strong>SMV</strong> (Markus Zarbock)<br />
3.3.1 Allgemeine Bemerkungen<br />
In diesem Kapitel soll der Ansatz, die Fallstudie in <strong>SMV</strong> zu modellieren vorgestellt<br />
werden. Zunächst sollen einige gr<strong>und</strong>legende Betrachtungen zur Machbarkeit<br />
gemacht werden. Dann soll die <strong>Model</strong>lierung der einzelnen Komponenten<br />
erläutert werden. Schließlich werden die Spezifikationen vorgestellt, die das <strong>Model</strong>l<br />
überprüfen sollen bzw deren Ergebnisse <strong>und</strong> Rechenaufwände.<br />
Vorgehensweise<br />
Zunächst gilt es die, für die <strong>Model</strong>lierung notwendigen Komponenten zu indentifizieren.<br />
Dazu nocheinmal die Übersichtsgrafik (Abbildung 3.7) aus dem<br />
Einführungskapitel .<br />
Abbildung 3.7: Die ISILEIT-Fallstudie<br />
Um diesen Auschnitt zu modellieren müssen die in der Grafik erkennbaren Blöcke<br />
modelliert werden. Auf die möglichen Kommunikationsprobleme zwischen den<br />
Komponenten wird im folgenden <strong>Model</strong>l nicht eingegangen. Welchen Einfluss<br />
sie auf die Ergebnisse haben, muss in einem nächsten Verfeinerungsschritt des<br />
<strong>Model</strong>ls überprüft werden. Wenn man die einzelnen Komponenten betrachtet,<br />
so fällt auf, dass es für die Weichen eine Doppelstruktur gibt. Auf der<br />
einen Seite das physikalische <strong>Model</strong>l,z.B. die tatsächlich existierende Weiche <strong>und</strong><br />
auf der anderen Seite die Instanz, die diese steuert, z.B. die Weichensteuerung<br />
(Switch1,Switch2). Diese Struktur muss nun in der <strong>Model</strong>lierung ihre Entsprechung<br />
finden. Dies kann auf verschiedene Arten geschehen. Der aufwändigste<br />
Ansatz ist, die physikalischen Eigenschaften der mechanischen/elektrischen
3.3. <strong>SMV</strong> (MARKUS ZARBOCK) 47<br />
Geräte zu modellieren. Beispielsweise können die Bewegungen der Shuttles, beschleunigen,<br />
fahren, bremsen durch entsprechende Gleichungssysteme modelliert<br />
werden. Sind physikalisches <strong>Model</strong>l <strong>und</strong> Steuerinstanz modelliert, so ergibt sich<br />
die in 3.8 abgebildete Struktur.<br />
Abbildung 3.8: <strong>Model</strong>lieren<br />
Für den Systemausschnitt Weiche, Ventilinsel, Weichensteuerung wird im folgende<br />
Kapitel gezeigt, wie eine solche <strong>Model</strong>lierung realisiert werden kann. Das<br />
sich daran anschließende Kapitel wird die <strong>Model</strong>lierung des Koordinators behandeln.<br />
Zwischen den <strong>Model</strong>ierungen dieser beiden Blöcke gibt es einen wichtigen Unterschied.<br />
Die Shuttles, die der Koordinator steuert, werden nicht als physiklisches<br />
<strong>Model</strong>l mitmodelliert. Die Ursache hierfür liegt in der komplexen Natur der<br />
Shuttles, die zu modellieren den Rahmen dieser Arbeit gesprengt hätte. Da der<br />
prinzipielle Weg jedoch für die Weichen aufgezeigt wird, lässt sich dieses Problem<br />
jedoch in späteren Arbeiten wiederaufgreifen.<br />
3.3.2 Das Weichenmodell<br />
In diesem Kapitel soll gezeigt werden, wie die Weiche <strong>und</strong> ihre Steuerung modelliert<br />
werden können. Die Weiche ist ein System, das grob betrachtet nur<br />
zwei Zustände besitzt. Diese entsprechen den beiden Richtungen, in die sie geschaltet<br />
sein kann. Dazu kommt ein Verriegelungsmechanismus, der die Weiche<br />
mechanisch arretiert, sobald sie einen sicheren Zustand erreicht hat (geradeaus,<br />
abbiegend). Der Antrieb dieser Weiche wird durch die Ventilinsel erzeugt. Über<br />
ein Ventil wird die Richtung der Weiche festgelegt <strong>und</strong> ein pneumatischer Zylinder<br />
steuert die Arretierung. Der Weichenkontroller steuert die Weiche nicht
48 KAPITEL 3. FALLSTUDIE<br />
direkt, sondern gibt seine Befehle auf elektrischem Wege der Ventilinsel, die diese<br />
dann in pneumatische Steuerimpulse umwandelt. Daher ist die Ventilinsel eigentlich<br />
nur ein Mediumswechsler für die Kommunikation zwischen Weiche <strong>und</strong><br />
Steuerung. Für spätere Abstraktionsschritte ist daher denkbar, die Ventilinsel<br />
wegzulassen <strong>und</strong> durch ein allgemeineres Kommunikationsmodell zu ersetzen. In<br />
dieser Arbeit wird sie jedoch betrachtet. Deswegen kann man die in Abbildung<br />
3.8 gezeigte Grafik auf die in Abbildung 3.9 gezeigte Art erweitern.<br />
Abbildung 3.9: <strong>Model</strong>lieren 2<br />
Die drei dort dargestellten Module gilt es also zu modellieren.<br />
Die Weiche<br />
Das Modul switcher soll das physikalische Verhalten einer Weiche nachbilden.<br />
Für diese <strong>Model</strong>lierung wird das Verhalten der Weiche jedoch vereinfacht. Das<br />
Schaltverhalten der Weiche ist in der Realität eine kontinuierliche Bewegung.<br />
Diese wird im <strong>Model</strong> auf diskrete Übergänge abstrahiert. Abbildung 3.10 zeigt<br />
den endlichen Automaten, der dem Weichenmodell entspricht. Fett sind sind die<br />
für die Transition notwendigen Vorbedingungen dargestellt, normal die bei der<br />
Transition vorgenommenen Änderungen. Alle Variablen dieses Moduls haben<br />
bool’sche Werte, mit Ausnahme der Zustandsvariablen. Die Werte der beiden<br />
Näherungssensoren, mit deren Hilfe festegestellt wird, in welche Richtung<br />
die Weiche geschalten ist, werden als approxSensorEven <strong>und</strong> approxSensorSwitched<br />
gespeichert. Diese Sensoren werden von der Weiche nur dadurch ausgelöst,<br />
dass das Schienenstück am Ende des Schaltvorgangs gegen einen solchen Sensor<br />
stösst. Daher könnten die Sensoren auch in ein extra Modul verlagert werden,<br />
dass dann nur die Sensoren enthielte. Wenn das Weichenmodell durch exaktere<br />
<strong>Model</strong>lierung der physikalischen Eigenschaften komplexer würde, wäre eine eine
3.3. <strong>SMV</strong> (MARKUS ZARBOCK) 49<br />
solche Verlagerung sinnvoll, da so Spezifikationen abgestufter geprüft werden<br />
könnten. Für diese <strong>Model</strong>lierung sind diese Sensoren jedoch Teil der Weiche. Da<br />
Sensoren <strong>und</strong> Weiche in der Realität in einem Block verbaut sind erscheint diese<br />
Vorgehensweise auch intuitiver. Desweiteren hat die Weiche eine Variable lock,<br />
die die Arretierung modellieren soll. Zwei weitere Variablen modellieren die von<br />
der Ventilinsel kommenden Druckleitungen. Die Druckvariablen unterscheiden<br />
sich insofern von den restlichen Variablen, als sie nicht bei Zustandsübergängen<br />
verändert werden, sondern von außerhalb gesetzt werden.<br />
Dieses Weichenmodell enthält keine Fehlerbehandlung, wie es später im Weichencontroller<br />
der Fall ist. Es soll ausschließlich steuerungslose Mechanik/Pneumatik<br />
modellieren. Daher kann auf eine spezifische <strong>Model</strong>lierung der beiden Weichen<br />
verzichtet werden <strong>und</strong> stattdessen werden zwei Instanziierungen des gleichen<br />
Moduls verwendet. Dies entspricht auch der Realität, in der es möglich ist, eine<br />
Weiche an beiden Positionen einzubauen.<br />
Abbildung 3.10: Weiche<br />
Die Ventilinsel<br />
Das Modul pressureDistributor modelliert die Ventilinsel. Sie setzt die elektrischen<br />
Steuerimpulse, des Weichencontrollers in Druckimpulse um, die dann<br />
die Weiche selbst steuern. Eine Weiche kann zwei mögliche Zustände einnehmen,<br />
geradeaus <strong>und</strong> abgebogen. Bei zwei Weichen, muss die Ventilinsel<br />
also vier verschiedene Druckbeschaltungen ermöglichen. Diese vier notwendigen<br />
Zustände stellt die Variable control dar. Je nach deren Wert werden die Druckleitungen<br />
befüllt. Ist beispielsweise control = oneEven, so wird die Leitung<br />
pressureEven, der ersten Weiche befüllt (bzw auf true gesetzt). Die Ventilinsel<br />
erhält bei der Instanziierung, Referenzen, auf die Weichenmodelle <strong>und</strong> kann<br />
so deren Variablen, wie oben beschreiben setzen. Dieses <strong>Model</strong>l ist passiv insofern,<br />
als die Variable control innerhalb des Moduls nicht verändert wird, es ist<br />
also ein Anstoß von aussen notwendig. Diesen löst die Weichensteuerung aus.
50 KAPITEL 3. FALLSTUDIE<br />
Die Weichensteuerung<br />
Die Steuerung einer Weiche wird durch die Module leftSwitchController <strong>und</strong><br />
rightSwitchController modelliert. Es wurde für jede Weiche ein eigenes Steuermodell<br />
geschrieben, weil jeder Controller Steuersignale für eine spezielle Weiche<br />
schicken muss. Grafik 3.11 zeigt, den endlichen Automaten, der dem Controller<br />
der linken Weiche ( in Abbildung 3.12 mit one bezeichnet) entspricht.<br />
Wie in Abbildung 3.10 gilt, fett sind sind die für die Transition notwendigen<br />
Vorbedingungen dargestellt, normal die bei der Transition vorgenommenen<br />
Änderungen. Prinzipiell könnte auch ein Controller modelliert werden, der festellt,<br />
welche Weiche er zu steuern hat. Allerdings sind generische Strukturen in<br />
<strong>SMV</strong> erheblich schwieriger zu modellieren, als sie in imperativen Programmiersprachen<br />
zu implementieren sind. Hier sei auf die single assignment Regel (siehe<br />
2.2.2) verwiesen.<br />
Abbildung 3.11: Weichencontroller<br />
Die Beschreibung des Controllers für die linke Weiche ist beispielhaft für den der<br />
Rechten. Es müssen im wesentliche nur die Steuerkommandos an die Ventilinsel<br />
ensprechend verändert werden. Der Automat des Weichenmodells (Abbildung<br />
3.10) ähnelt dem des Controller (Abbildung 3.11). Dies ist damit zu begründen,<br />
dass die Software des Controllers die Realität abbilden muss, um Steuerkommandos<br />
geben zu können. Die Zustandsübergänge werden mit bool’schen Wert<br />
commitSwitch angestossen, dieser wird von ausserhalb des Controllers gesetzt<br />
<strong>und</strong> modelliert so die Steuerleitung vom Koordinator zum Weichencontroller.<br />
Die Zustandsmenge entspricht dem des Weichenmodells, erweitert um einen Fehlerzustand.<br />
Dieser wird immer dann ausgelöst, wenn Fehler in der Steuerung<br />
auftreten, zum Beispiel wenn ein falscher Sensor ausgelöst wird. Allerdings<br />
findet in der vorliegende <strong>Model</strong>lierung im Koordinator noch keine Behandlung<br />
einer solchen Fehlersituation statt. In Abbildung 3.11 ist allerdings nur ein
3.3. <strong>SMV</strong> (MARKUS ZARBOCK) 51<br />
Zustandsübergang in einen Fehlerzustand abgebildet, dieser Übergang ist beispielhaft,<br />
für alle anderen (siehe hierzu B.1).<br />
Weiterhin hält der Controller in einer bool’schen Variable, die Information, ob<br />
die Weiche verfügbar ist. Dies ist immer dann der Fall, wenn die Weiche in einem<br />
arretierten Zustand ist. Ob eine Weiche durch ein Shuttle belegt ist ist dem Weichencontroller<br />
jedoch unbekannt <strong>und</strong> wird daher auch nicht modelliert. Daher<br />
findet vor dem Schalten auch keine Überprüfung statt, ob sich auf der Weiche<br />
ein Shuttle befindet, wird commitSwitch durch den Koordinator gesetzt schaltet<br />
der Weichencontroller. Dies geschieht indem die Steuervariable (control) der<br />
Ventilinsel gesetzt wird.<br />
3.3.3 Der Koordinator<br />
Vorbemerkungen<br />
Die <strong>Model</strong>lierung des Koordinators unterscheidet sich erheblich von <strong>Model</strong>lierungen<br />
der bisher betrachteten Komponenten der Fallstudie. Zunächst hat der<br />
Koordinator eine wesentlich komplexere Augabe als beispielsweise der Weichencontroller.<br />
Desweiteren gibt es für ihn keine eindeutig zuordnenbare physikalische<br />
Entsprechung, er ist als Software realisiert.<br />
Umsetzung<br />
Der hier vorgestellte Ansatz folgt im wesentlichen der Idee, für jedes Shuttle im<br />
Koordinator eine steuernde Instanz zu schaffen, die einerseits alle notwendigen<br />
Daten des Shuttles enthält <strong>und</strong> andererseits die notwendigen Entscheidungen<br />
treffen kann, um ein Shuttle durch das System zu steuern. Daher gibt es in dieser<br />
Realisierung kein eigenes Modul für den Koordinator, es werden stattdessen<br />
im Hauptmodul eine Reihe von Shuttlemodulen instanziiert. Um die Shuttles<br />
zu koordinieren, muss ein gegenseitiger Auschluss für die Weichen realisiert werden,<br />
dies geschieht über das Modul channel, das für jede Weiche eine Variable<br />
hält, die entscheidet, ob ein Weiche belegt ist oder nicht. Darüberhinaus gibt<br />
es ein Modul track, das speichert, ob ein Gleisabschnitt von einem Shuttle befahren<br />
ist. Die Module shuttle, channel <strong>und</strong> track bilden zusammen den<br />
Koordinator. Um die Gleisschlaufe mit den beiden Weichen darzustellen, sind<br />
die Gleismodule wie in 3.12 angeordnet. Die Weichen erhalten erhalten in den<br />
Shuttleprozessen die Nummern 11 <strong>und</strong> 12. Es gibt jedoch in den Gleismodulen<br />
keine Verweise, auf Nachbarn oder ähnliches, die Topologie wird nur durch die<br />
Steuerung der Shuttles festgelegt. Da es keine Zeiger in <strong>SMV</strong> gibt <strong>und</strong> komplexe<br />
Datentypen rechenzeitproblematisch sind, erschien diese Art der Repräsentation<br />
des Gleissystems am plausibelsten. Die physikalische Länge, die ein Gleismodul<br />
modellieren soll entspricht einer Shuttlelänge, das bedeutet, das in der vorliegenden<br />
<strong>Model</strong>lierung der Koordinator erheblich präziser festellen kann, wo sich<br />
ein Shuttle aktuell befindet. Diese Einschränkung ließe sich umgehen, wenn<br />
es für ein Shuttle ein physikalisches Bewegungsmodell gäbe, aus welchem für<br />
den Koordinator entsprechende Zeitannahmen gemacht werden könnten. Die<br />
Schlaufe unterhalb der Weichen wurde eingefügt, um kontinuierliche Shuttlebewegungen<br />
zu ermöglichen. Die Verbindung oberhalb der Weichen, kann in einer<br />
nächsten Entwicklungsphase verwendet werde, um dort die Beladungsautomatik
52 KAPITEL 3. FALLSTUDIE<br />
Abbildung 3.12: <strong>Model</strong>lieren 2<br />
einzufügen.<br />
Als Zeitmodell wurde für alle Modulinstanzen das asynchrone verwendet, da<br />
mit einem synchronen <strong>Model</strong>l gr<strong>und</strong>legende Eingenschaften, der Fallstudie nicht<br />
hätten modelliert werden können. Beispielsweise werden die Shuttles nicht synchron<br />
im System bewegt, während <strong>eines</strong> beladen wird, soll ein anderes eine<br />
Weiche passieren können.<br />
Probleme<br />
Bei der Entwicklung des Koordinatormodells ergaben sich eine Reihe von Problemen.<br />
Durch die Entscheidung jedem Shuttle einen es steuernden Prozess<br />
zuzuordnen, geht die Reihenfolgeunabhängikeit der Shuttles verloren. Wird ein<br />
Shuttleprozess instanziiert so muss entschieden werden, auf welchem Gleisabschnitt<br />
dies geschieht. Im vorliegenden <strong>Model</strong>l wurde darauf verzichtet, eine<br />
Methode zu entwickeln, der Shuttles zufallsbasiert auf Gleise verteilt <strong>und</strong> so die<br />
Reihenfolgeunabhängigkeit wiederherzustellen.<br />
3.3.4 <strong>Model</strong>checking<br />
In diesem Abschnitt werden die Spezifikationen vorgestellt, denen das modellierte<br />
System genügen muss. Die in Kapitel 3.1 vorgestellte Liste mit Bedingungen<br />
diente hierzu als Orientierung. Die präzise Übernahme, war bei einigen<br />
nicht möglich. Beispielsweise verfügt <strong>SMV</strong> über keinen vordefinierten Mechanismus,<br />
um Deadlockfreiheit zu garantieren. Eine Möglichkeit, diese Bedingung<br />
mit <strong>SMV</strong> zu spezifizieren wäre einen Fortschritt zu definieren <strong>und</strong> zu zeigen,<br />
dass dieser in jedem Zustand möglich ist. Der Aufwand, für ein solches System<br />
eine Fortschritt zu definieren hätte den Rahmen dieser Arbeit jedoch gesprengt.
3.3. <strong>SMV</strong> (MARKUS ZARBOCK) 53<br />
Alle hier aufgeführten Zahlen wurden mit folgender Rechnerausstattung ermittelt:<br />
Pentium 4 1,7 GHz, 1GB RAM, RedHatLinux 7.2.<br />
Shuttles pro Gleis/Weiche<br />
Eine gr<strong>und</strong>sätzliche Forderung, denen das System gr<strong>und</strong>sätzlich genügen muss,<br />
ist die, dass sich zu keinem Zeitpunkt mehr als ein Shuttle auf einem Gleisstück,<br />
bzw einer Weiche befinden darf. Die Spezifikation, die für die Prüfung dieser<br />
Bedingung ermöglichen soll, fragt ab, ob die Gleisvariablen der Shuttles gleich<br />
sind. Daraus ergibt sich, dass die Anzahl der Shuttle auch die Spezifikation<br />
ändert. So lautet die Formel für fünf Shuttles:<br />
notMoreThanOneOnSameTrack5 :<br />
assert G ~((s1.myTrack = s2.myTrack) | (s1.myTrack = s3.myTrack)<br />
| (s1.myTrack = s4.myTrack) | (s1.myTrack = s5.myTrack)<br />
| (s2.myTrack = s3.myTrack) | (s2.myTrack = s4.myTrack)<br />
| (s2.myTrack = s5.myTrack) | (s3.myTrack = s4.myTrack)<br />
| (s3.myTrack = s5.myTrack) | (s4.myTrack = s5.myTrack));<br />
Die Prüfung dieser Bedingung in einem System mit weniger als fünf Shuttles,<br />
geschieht nach einem ähnlichen Muster. Hier nun die Ergebnisse dieser Prüfung.<br />
Anz. Shuttle Anz. BDD-Knoten Verifikationszeit Anforderung<br />
Instanzen (in Sek.) erfüllt (j/n)<br />
2 65.675 0,83 j<br />
3 96.893 1,2 j<br />
4 394.239 11.47 j<br />
5 1.157.910 115.15 j<br />
Sowohl die Zeitangaben als auch der mitt BDD-Knoten repräsentierte Zustandsraum,<br />
verdeutlichen den enormen Anstieg, bei steigender Shuttlezahl. Interessant<br />
ist auch, daß die Rechenzeit erheblich schneler ansteigt, als der Zustandsraum.<br />
Im Schritt von vier auf fünf Shuttles steigt die Größe des Zustands etwa<br />
mit dem Faktor vier, die Rechenzeit jedoch etwa um den Faktor 10.<br />
Weichenschalten<br />
Aufgr<strong>und</strong> der Konstruktion der Ventilinsel (siehe Abbildung 3.7) ist es nicht<br />
möglich mehr als eine Weiche gleichzeitig zu schalten. In zwei Schritten wird gezeigt,<br />
dass das <strong>Model</strong>l dieser Forderung entspricht. Im ersten Schritt, werden die<br />
Weichenmodelle darauf überprüft, ob ihre Zustandsvariablen gleichzeitig in der<br />
Menge (switchingToSwiched,switchingToEven) sind. Dies kann nur geschehen,<br />
wenn beide Weichen gleichzeitig schalten oder ein Schaltvorgang nicht atomar<br />
ist. Die Spezifikation dazu:<br />
switches1 :<br />
assert G ~(one.state ={switchingToSwitched,switchingToEven}<br />
& two.state ={switchingToSwitched,switchingToEven});
54 KAPITEL 3. FALLSTUDIE<br />
Die Auswertung dieser Spezifikation führte zu folgenden Ergebnissen:<br />
Anz. Shuttle Anz. BDD-Knoten Verifikationszeit Anforderung<br />
Instanzen (in Sek.) erfüllt (j/n)<br />
5 946.441 106.77 j<br />
Analog dazu muss ebenfalls überprüft weren, ob die Weichencontroller gleichzeitig<br />
den Schaltbefehl geben. Die Überprüfung dieser Forderung geschieht auf<br />
sehr ähnliche Weise, wie die für die Weichenmodelle.<br />
switches2 :<br />
assert G ~(controlOne.state ={switchingToSwitched,switchingToEven}<br />
& controlTwo.state ={switchingToSwitched,switchingToEven});<br />
Diese Spezifikation wurde mit folgendem Ergebnis auf das <strong>Model</strong>l angewendet:<br />
Anz. Shuttle Anz. BDD-Knoten Verifikationszeit Anforderung<br />
Instanzen (in Sek.) erfüllt (j/n)<br />
5 946.441 103.77 j<br />
Weichen überfahren<br />
Fährt ein Shuttle über eine Weiche so muss diese sich in einem der arretierten<br />
Zustände befinden, also geradaus oder abgebogen. Befindet sich die Weiche in<br />
einem Umschaltvorgang, so darf ein Shuttle nicht über diese Weiche fahren. Mit<br />
zwei Spezifikationen wird diese Eigenschaft überprüft. In beiden wird geprüft,<br />
dass es nicht vorkommen kann, dass ein Shuttle auf einer Weiche steht (Gleis 11<br />
oder 12) <strong>und</strong> gleichzeitig die Variable lock false ist. In <strong>SMV</strong> Notation:<br />
lockedOne2 :<br />
assert G ~((s1.myTrack = 11 | s2.myTrack = 11<br />
| s3.myTrack = 11 | s4.myTrack = 11 | s5.myTrack = 11)<br />
& ~one.lock);<br />
Die Prüfung dieser Spezifikation führte zu folgenden Ergebnissen:<br />
Anz. Shuttle Anz. BDD-Knoten Verifikationszeit Anforderung<br />
Instanzen (in Sek.) erfüllt (j/n)<br />
5 1.156.454 116.89 j<br />
Dieselbe Forderung gestellt für die zweite Weiche:
3.3. <strong>SMV</strong> (MARKUS ZARBOCK) 55<br />
lockedTwo2 :<br />
assert G ~((s1.myTrack = 12 | s2.myTrack = 12<br />
| s3.myTrack = 12 | s4.myTrack = 12 | s5.myTrack = 12)<br />
& ~two.lock);<br />
Mit folgenden Ergebnissen:<br />
Anz. Shuttle Anz. BDD-Knoten Verifikationszeit Anforderung<br />
Instanzen (in Sek.) erfüllt (j/n)<br />
5 1.141.572 116.72 j<br />
Weichen arretieren<br />
Wenn eine Weiche schaltet, so muss dazu die Arretierung gelöst sein. Die folgenden<br />
zwei Spezifikationen überprüfen dies für die beiden Weichen.<br />
lockedOne :<br />
assert G ~(one.lock & one.state ={switchingToSwitched,switchingToEven});<br />
lockedTwo :<br />
assert G ~(two.lock & two.state ={switchingToSwitched,switchingToEven});<br />
Mit folgenden Ergebnissen:<br />
Spezifikation Anz. BDD-Knoten Verifikationszeit Anforderung<br />
(in Sek.) erfüllt (j/n)<br />
lockedOne 971.964 105.1 j<br />
lockedTwo 932.678 100.87 j
Kapitel 4<br />
Zusammenfassung<br />
4.1 Zusammenfassung <strong>SMV</strong> (Markus Zarbock)<br />
Als ein Ergebnis der Untersuchungen zur Fallstudie, kann man <strong>SMV</strong> als taugliches<br />
Werkzeug zur <strong>Model</strong>lierung von Systemen der hier vorgestellten Art. Allerdings<br />
gilt dies mit einigen Einschränkungen.<br />
Zunächst ist das Fehlen einer grafischen Repräsentation des modellierten Systems<br />
ein erheblicher Nachteil. Beispielsweise die Strukuren, die sich durch<br />
die Übergabe von Referenzen bei der Instanziierung von Modulen, ergeben,<br />
sind ohne eine solche Repräsentation nur schwer nachzuvollziehen. Als Vergleich<br />
können hierzu Assoziationen aus objektorientierten Sprachen dienen, auch<br />
dort sind grafische Mittel gut geeignet, um Verständnis <strong>und</strong> Fehlersuche zu unterstützen.<br />
Problematisch ist weiterhin die auschliessliche Verwendung von LTL. Wenn man<br />
nur auf Codeebene ein <strong>Model</strong>l entwickelt <strong>und</strong> auf Korrektheit im Sinne der korrekten<br />
Umsetzung des existierenden Systems in ein <strong>SMV</strong> <strong>Model</strong>l prüfen will ist<br />
LTL ein umständliches Mittel. Mit CTL lassen sich, wie in ( 2.2.3) gezeigt,<br />
typische Anfragen besser formulieren. Da <strong>SMV</strong> mit der alten Syntax CTL implementiert,<br />
mit der neuen aber LTL sollte möglich sein, in späteren Versionen<br />
sowohl CTL als auch LTL als Spezifikationskalkül zu verwenden.<br />
Eine weitere Einschränkung ist zweifelsohne die notwendige Rechenzeit, um hinreichend<br />
komplexe Systeme zu prüfen. Die für diese Fallstudie notwendigen Rechenzeiten<br />
lassen vermuten, dass <strong>SMV</strong> angewand auf komplexe Softwaresysteme<br />
rasch an die Grenzen der heute verfügbaren Rechenleistung dringt. Daher ist es<br />
für solche Systeme notwendig Strategien zu entwickeln diese in kleinere Einheiten<br />
zu zerlegen <strong>und</strong> so die Prüfungen von Spezifikationen erst möglich zu machen.<br />
Ein interessanter Ansatz dazu ist in [16] beschrieben. Dort werden State Flow<br />
Diagramme <strong>mittels</strong> automatischer Verfahren in <strong>SMV</strong> <strong>Model</strong>le übersetzt. Wenn<br />
es gelänge, dieses Verfahren auf die sehr ähnlichen State Chart Diagramme aus<br />
der UML 1 azuwenden, so wäre es denkbar die mit CASE 2 Tools, wie zum Beispiel<br />
FUJABA 3 entwickelte Software automatisch in <strong>SMV</strong> <strong>Model</strong>le zu übersetzen<br />
1 Unified <strong>Model</strong>ling Language<br />
2 Computer Aided Software Engineering<br />
3 From UML to Java and back again; www.FUJABA.de<br />
57
58 KAPITEL 4. ZUSAMMENFASSUNG<br />
<strong>und</strong> somit einen großen Schritt in Richtung automatischer Softwareverifikation<br />
zu gehen.<br />
Bezüglich der Fallstudie sind für den <strong>Model</strong>lierungsprozess noch eine ganze Reihe<br />
von Verfeinerungen denkbar. So sollten die Shuttles, analog zu den Weichen,<br />
ebenfalls als physikalisches <strong>Model</strong>l erfasst werden. Ein weiterer wichtiger Aspekt<br />
sind Fehlermodellierungen. Wenn die vorhandenen Komponenten alle als <strong>Model</strong>l<br />
erfasst sind, wäre der nächste Schritt Fehlermöglichkeiten mitzumodellieren,<br />
beispielweise den Ausfall oder die Störung der Kommunikation.<br />
Prinzipiell ist es also möglich eine Reihe gr<strong>und</strong>sätzlicher Probleme bei der <strong>Model</strong>lierung<br />
von komplexen Systemen mit dieser Fallstudie nachzuvollziehen.<br />
4.2 Zusammenfassung Uppaal (Martin Hirsch)<br />
Uppaal ist ein Werkzeug, das sich besonders für die <strong>Model</strong>lierung von Echtzeitsystemen<br />
eignet, die man gut durch Automaten darstellen kann.<br />
Durch einen grafischen Editor zum Erstellen der Automaten wird die <strong>Model</strong>lierung<br />
allgemein erleichtert. Der integrierte Simulator hilft schon in der <strong>Model</strong>lierungsphase,<br />
das System ständig zu überprüfen <strong>und</strong> Fehler ausfindig zu machen.<br />
TCTL, die Verifikationssprache für die Prüfformeln, ist relativ leicht, auch ohne<br />
Vorkenntnisse zu verstehen <strong>und</strong> anzuwenden. Diese Punkte machen Uppaal zu<br />
einem <strong>Model</strong>-Checker, der sehr gut in der Praxis einzusetzen ist.<br />
Trotz der durch Uppaal recht gut unterstützen <strong>Model</strong>lierung von Automaten<br />
ist die <strong>Model</strong>lierungsphase jedoch nicht zu unterschätzen. Wie in dieser Arbeit<br />
deutlich gemacht, besteht ein Großteil dieser Phase auch in Überlegungen, wie<br />
ein System zu realisieren ist <strong>und</strong> zu entscheiden, was wichtig <strong>und</strong> unwichtig ist<br />
für die <strong>Model</strong>lierung. Hier spielt der Grad der Abstraktion eine große Rolle.<br />
Durch eine hohe Abstraktion ist das <strong>Model</strong>l häufig leichter <strong>und</strong> schneller zu<br />
verifizieren, da das System im Allgemeinen aus weniger Zuständen besteht. Jedoch<br />
bedeutet dies auf der anderen Seite meistens eine starke Idealisierung des<br />
Systems, so dass Probleme, die im realen System auftreten können <strong>und</strong> die es<br />
gilt herauszufinden, vernachlässigt oder übersehen werden können.<br />
Schließlich steht am Ende der <strong>Model</strong>lierungsphase der Prozess der Verifikation,<br />
das eigentliche <strong>Model</strong>-<strong>Checking</strong>. Für diesen Vorgang müssen die meist umgangssprachlich<br />
vorgegebenen Regeln <strong>und</strong> Anforderungen an das System auf<br />
Prüfformeln in TCTL abgebildet werden. Hierbei ist darauf zu achten, dass<br />
auch wirklich genau das Geforderte abgebildet wird.<br />
Das in der Arbeit in Uppaal modellierte Materialflusssystem, ein Ausschnitt aus<br />
der ISILEIT-Fallstudie [18, 5], zeigt die Wichtigkeit des <strong>Model</strong>-<strong>Checking</strong>s in der<br />
Praxis.<br />
Es hat sich gezeigt, das Uppaal sich für das <strong>Model</strong>-<strong>Checking</strong> auf dem Gebiet der<br />
Steuerungsanlagen im Fertigungsbereich gut eignet. Diskrete, untereinander<br />
kommunizierende reaktive Systeme mit Echtzeitverhalten lassen sich sehr gut<br />
durch Echtzeitautomaten, wie sie in Uppaal vorkommen, darstellen.
4.2. ZUSAMMENFASSUNG <strong>UPPAAL</strong> (MARTIN HIRSCH) 59<br />
Die <strong>Model</strong>lierung des in dieser Arbeit ausgewählten Ausschnittes aus der ISILEIT-<br />
Fallstudie ist so konzipiert, dass sich Erweiterungen auf die übrigen Teile der<br />
Fallstudie leicht vornehmen lassen. Verifikationszeiten von momentan maximal<br />
4 Minuten auf heutiger Standardhardware lassen dieses ohne weiteres realisieren.<br />
Allerdings wäre für diese Aufgabe eine genauere Beschreibung seitens der SPS<br />
Programmierung notwendig, um die Abläufe besser darstellen zu können. Ebenfalls<br />
wären genauere Zeitangaben über die Abläufe notwendig, da Uppaal gerade<br />
hier seine Stärken besitzt.
Anhang A<br />
Uppaal Quellcode (Martin Hirsch)<br />
In diesem Abschnitt ist der Quellcode der Automaten aufgelistet, die in Kapitel<br />
3.2.2 nur textuell bzw. visuell dargestellt wurden.<br />
A.1 Quellcode: Deklarationen der globalen Variablen,<br />
Automaten Instanziierungen <strong>und</strong><br />
System Definition<br />
Der Quellcode: Deklarationen<br />
1 // ************** Beginn Konstantendeklarationen *********************<br />
2 // Einige Konstendeklarationen, damit es "ubersichtlicher ist ;-)<br />
3 const rechts 1;<br />
4 const links 0;<br />
5 const true 1;<br />
6 const false 0;<br />
7 // ************** Ende Konstantendeklarationen ***********************<br />
8<br />
9 // ************** Beginn der Kanaldefinitionen ***********************<br />
10 // Jedes Schienest"uck besitzt einen Sensor, der dem Controller meldet,<br />
11 // wenn ein Shuttle eine Weiche passieren m"ochte<br />
12 chan sensor_1,sensor_2,sensor_3,sensor_4;<br />
13<br />
14 // Die Kommunikatioskan"ale zwischen den SPS’en Switch_1 bzw. Switch_2<br />
15 // <strong>und</strong> dem Controller<br />
16 chan weiche_geschaltet_1,weiche_geschaltet_2;<br />
17 chan steuer_weiche_1,steuer_weiche_2;<br />
18<br />
19 // jedes Shuttle bekommt eine Impuls, wenn es "uber<br />
20 // an der Sensorstation weiterfahren darf<br />
21 urgent chan weiter_1,weiter_2,weiter_4;<br />
22<br />
23 // die Kommunikationskan"ole zwischen Switch <strong>und</strong> der Ventilinsel<br />
24 chan druckluft_weiche_rechts_1, druckluft_weiche_links_1,<br />
25 druckluft_weiche_rechts_2, druckluft_weiche_links_2;<br />
26<br />
27 // die Signalleitungen zwischen Ventilinsel <strong>und</strong> der eigentlichen<br />
28 // Weiche<br />
29 chan druckluft_1,druckluft_2;<br />
30<br />
31 // die Benachrichtigung von der Weiche an de Switch, dass die<br />
32 // Weiche die neue Entstellung erreicht hat<br />
33 chan naeherungs_sensor_rechts_1,naeherungs_sensor_links_1,<br />
34 naeherungs_sensor_rechts_2,naeherungs_sensor_links_2;<br />
35 // ************** Ende der Kanaldefinitionen *************************<br />
36<br />
37 // ************** Beginn Variablendeklarationen **********************<br />
61
62 ANHANG A. <strong>UPPAAL</strong> QUELLCODE (MARTIN HIRSCH)<br />
38 // "Boolsche" Varibalen<br />
39 int [0,1] richtung, von_richtung;<br />
40 int [0,1] weichen_position_1,weichen_position_2;<br />
41 // ************** Ende Variablendeklarationen ************************<br />
42<br />
43 // ************** Uhren **********************************************<br />
44 // die globale Uhr<br />
45 clock clk;<br />
46<br />
47 // ************************ Automaten Instanziierungen ***************<br />
48 weiche_1 := Weiche(druckluft_1,naeherungs_sensor_links_1,naeherungs_sensor_rechts_1);<br />
49 weiche_2 := Weiche(druckluft_2,naeherungs_sensor_links_2,naeherungs_sensor_rechts_2);<br />
50<br />
51 // Ventilinsel<br />
52 ventilinsel := Ventilinsel();<br />
53<br />
54 // Switch 1 & 2<br />
55 switch_1 := Switch(steuer_weiche_1,weiche_geschaltet_1,<br />
56 druckluft_weiche_links_1,<br />
57 druckluft_weiche_rechts_1,<br />
58 naeherungs_sensor_links_1,<br />
59 naeherungs_sensor_rechts_1,<br />
60 richtung,weichen_position_1);<br />
61 switch_2 := Switch(steuer_weiche_2,weiche_geschaltet_2,<br />
62 druckluft_weiche_links_2,<br />
63 druckluft_weiche_rechts_2,<br />
64 naeherungs_sensor_links_2,<br />
65 naeherungs_sensor_rechts_2,<br />
66 von_richtung,weichen_position_2);<br />
67<br />
68 // MasterController<br />
69 controller := Controller();<br />
70<br />
71 // Shuttles<br />
72 shuttle_1 := Shuttle();<br />
73 shuttle_2 := Shuttle();<br />
74 shuttle_3 := Shuttle();<br />
75 shuttle_4 := Shuttle();<br />
76 shuttle_5 := Shuttle();<br />
77 shuttle_6 := Shuttle();<br />
78 shuttle_7 := Shuttle();<br />
79<br />
80 // System Definition<br />
81 system weiche_1, weiche_2, ventilinsel, switch_1, switch_2,<br />
82 controller, shuttle_1,shuttle_2,shuttle_3,<br />
83 shuttle_4,shuttle_5,shuttle_6,shuttle_7;<br />
A.2 Quellcode: Weiche<br />
Der Quellcode Weiche<br />
1 process Weiche(chan druckluft,<br />
2 naeherungs_sensor_links,<br />
3 naeherungs_sensor_rechts)<br />
4 {<br />
5 clock x;<br />
6<br />
7 state weiche_ist_rechts,weiche_ist_links,<br />
8 S2{x weiche_ist_rechts{guard x>=1;<br />
15 sync naeherungs_sensor_rechts!;<br />
16 assign x:=0; },<br />
17 weiche_ist_rechts -> S2{sync druckluft; assign x:=0; },
A.3. QUELLCODE: VENTILINSEL 63<br />
18 S2 -> weiche_ist_links{guard x>=1;<br />
19 sync naeherungs_sensor_links!;<br />
20 assign x:=0; };<br />
21 }<br />
A.3 Quellcode: Ventilinsel<br />
1 process Ventilinsel<br />
2 {<br />
3 clock x;<br />
4<br />
Der Quellcode Ventilinsel<br />
5 state S3{x S0{sync druckluft_weiche_rechts_1;<br />
14 assign x:=0; },<br />
15 S0 -> start{guard x>=1;<br />
16 sync druckluft_1!; },<br />
17 start -> S1{sync druckluft_weiche_links_1;<br />
18 assign x:=0; },<br />
19 S1 -> start{guard x>=1;<br />
20 sync druckluft_1!; },<br />
21 start -> S3{sync druckluft_weiche_links_2;<br />
22 assign x:=0; },<br />
23 S3 -> start{guard x>=1;<br />
24 sync druckluft_2!; };<br />
25 }<br />
A.4 Quellcode: Koordinator<br />
Der Quellcode Controller<br />
1 process Controller<br />
2 {<br />
3 int[0,1] ventilinsel_belegt:=0;<br />
4 int anzahl:=0;<br />
5 int [0,1] zustand_sensor_1:=0,zustand_sensor_2:=0,<br />
6 zustand_sensor_3:=0,zustand_sensor_4:=0;<br />
7 int [0,1] gleis_belegt_1:=0,gleis_belegt_2:=0,<br />
8 gleis_belegt_3:=0,gleis_belegt_4:=0;<br />
9 int [0,1] weiche_ist_geschaltet_1:=0,weiche_ist_geschaltet_2:=0;<br />
10 int[0,1] route_1:=0,route_2:=0;<br />
11 int [0,1] weiche_belegt_1:=0,weiche_belegt_2:=0;<br />
12 int[0,1] bewege_weiche_1,bewege_weiche_2;<br />
13<br />
14 state S0;<br />
15 init S0;<br />
16<br />
17 trans<br />
18 S0 -> S0{guard zustand_sensor_1==false;<br />
19 sync sensor_1;<br />
20 assign zustand_sensor_1:=true, richtung:=rechts; },<br />
21 S0 -> S0{guard zustand_sensor_2==false;<br />
22 sync sensor_2;<br />
23 assign zustand_sensor_2:=true,gleis_belegt_2:=false; },<br />
24 S0 -> S0{guard zustand_sensor_1==true, richtung==rechts,<br />
25 weiche_belegt_1==false, weiche_belegt_2==false;
64 ANHANG A. <strong>UPPAAL</strong> QUELLCODE (MARTIN HIRSCH)<br />
26 assign weiche_belegt_1:=true, bewege_weiche_1:=true,<br />
27 bewege_weiche_2:=true, route_1:=true,<br />
28 weiche_belegt_2:=true, von_richtung:=rechts; },<br />
29 S0 -> S0{guard zustand_sensor_1==false;<br />
30 sync sensor_1;<br />
31 assign zustand_sensor_1:=true, richtung:=links; },<br />
32 S0 -> S0{guard zustand_sensor_1==true, richtung==links,<br />
33 weiche_belegt_1==false;<br />
34 assign weiche_belegt_1:=true, bewege_weiche_1:=true; },<br />
35 S0 -> S0{guard richtung==rechts, weiche_ist_geschaltet_2==true,<br />
36 weiche_ist_geschaltet_1==true, gleis_belegt_4==false;<br />
37 sync weiter_1!;<br />
38 assign weiche_ist_geschaltet_1:=false, weiche_ist_geschaltet_2:=false,<br />
39 zustand_sensor_1:=false, gleis_belegt_4:=true; },<br />
40 S0 -> S0{guard zustand_sensor_2==true, weiche_belegt_2==false;<br />
41 assign von_richtung:=links, weiche_belegt_2:=true,<br />
42 bewege_weiche_2:=true; },<br />
43 S0 -> S0{guard zustand_sensor_2==true, route_1==false,<br />
44 weiche_ist_geschaltet_2==true, gleis_belegt_4==false;<br />
45 sync weiter_2!;<br />
46 assign weiche_ist_geschaltet_2:=false, zustand_sensor_2:=false,<br />
47 weiche_belegt_2:=false, route_2:=true, gleis_belegt_4:=true; },<br />
48 S0 -> S0{guard zustand_sensor_3==false;<br />
49 sync sensor_3;<br />
50 assign zustand_sensor_3:=true,weiche_belegt_1:=false; },<br />
51 S0 -> S0{guard zustand_sensor_4==false, route_2==true;<br />
52 sync sensor_4;<br />
53 assign zustand_sensor_4:=true, route_2:=false, gleis_belegt_4:=false; },<br />
54 S0 -> S0{guard zustand_sensor_4==true;<br />
55 sync weiter_4!;<br />
56 assign zustand_sensor_4:=false; },<br />
57 S0 -> S0{guard zustand_sensor_4==false, route_1==true, route_2==false;<br />
58 sync sensor_4;<br />
59 assign zustand_sensor_4:=true, route_1:=false,<br />
60 weiche_belegt_2:=false, zustand_sensor_3:=false,<br />
61 gleis_belegt_4:=false; },<br />
62 S0 -> S0{guard ventilinsel_belegt==false, bewege_weiche_1==true;<br />
63 sync steuer_weiche_1!;<br />
64 assign ventilinsel_belegt:=true, bewege_weiche_1:=false; },<br />
65 S0 -> S0{guard ventilinsel_belegt==false, bewege_weiche_2==true;<br />
66 sync steuer_weiche_2!;<br />
67 assign ventilinsel_belegt:=true, bewege_weiche_2:=false; },<br />
68 S0 -> S0{guard gleis_belegt_2==false, weiche_ist_geschaltet_1==true,<br />
69 richtung==links;<br />
70 sync weiter_1!;<br />
71 assign gleis_belegt_2:=true, weiche_belegt_1:=false,<br />
72 zustand_sensor_1:=false, weiche_ist_geschaltet_1:=false; },<br />
73 S0 -> S0{sync weiche_geschaltet_1;<br />
74 assign ventilinsel_belegt:=false, weiche_ist_geschaltet_1:=true; },<br />
75 S0 -> S0{sync weiche_geschaltet_2;<br />
76 assign ventilinsel_belegt:=false, weiche_ist_geschaltet_2:=true; };<br />
77 }<br />
A.5 Quellcode: Switch<br />
Der Quellcode des Automaten-Templates Switch<br />
1 process Switch(chan steuer_weiche,weiche_geschaltet,<br />
2 druckluft_weiche_links,<br />
3 druckluft_weiche_rechts,<br />
4 naeherungs_sensor_links,<br />
5 naeherungs_sensor_rechts;<br />
6 int[0,1] richtung}<br />
7 {<br />
8 int[0,1] arretiert:=1;<br />
9 int[0,1] weichen_position:=0;<br />
10 clock x;
A.6. QUELLCODE: SHUTTLE 65<br />
11<br />
12 state S0, start, S8, S7{x S3{guard weichen_position==rechts; },<br />
23 S3 -> S5{guard x==1;<br />
24 sync druckluft_weiche_links!;<br />
25 assign arretiert:=false; },<br />
26 S5 -> S4{guard x>=3;<br />
27 sync naeherungs_sensor_links;<br />
28 assign arretiert:=true,<br />
29 weichen_position:=links; },<br />
30 S4 -> start{sync weiche_geschaltet!; },<br />
31 S1 -> S4{guard weichen_position==links; },<br />
32 S2 -> S6{guard weichen_position==links; },<br />
33 S6 -> S7{guard x==1;<br />
34 sync druckluft_weiche_rechts!;<br />
35 assign arretiert:=false; },<br />
36 S2 -> S8{guard weichen_position==rechts; },<br />
37 S7 -> S8{guard x>=3;<br />
38 sync naeherungs_sensor_rechts;<br />
39 assign arretiert:=true,<br />
40 weichen_position:=rechts; },<br />
41 S8 -> start{sync weiche_geschaltet!; };<br />
42 }<br />
A.6 Quellcode: Shuttle<br />
1 process Shuttle<br />
2 {<br />
3 clock x;<br />
4<br />
Der Quellcode: Shuttle<br />
5 state Sensor_4, Sensor_3{x Sensor_3{guard x>=1; sync sensor_3!; },<br />
16 Sensor_4 -> Start{sync weiter_4; },<br />
17 Sensor_3 -> Weiche2{guard x>=2; },<br />
18 Sensor_2 -> Weiche2{sync weiter_2; },<br />
19 Sensor_1 -> Weiche1{sync weiter_1; assign x:=0; },<br />
20 Weiche1 -> S1{guard richtung==links; },<br />
21 Weiche1 -> S2{guard richtung==rechts; },<br />
22 Weiche2 -> S3{assign x:=0; },<br />
23 S3 -> Sensor_4{sync sensor_4!; },<br />
24 Sensor_2 -> Sensor_2{},<br />
25 Sensor_1 -> Sensor_1{};<br />
26 }
Anhang B<br />
<strong>SMV</strong> (Markus Zarbock)<br />
B.1 Quellcode<br />
Hier befindet sich der vollständige, nach Modulen gegliederte Quellcode der <strong>Model</strong>lierung<br />
bzw. der Spezifikationen.<br />
1 /**<br />
2 * hw module for switch<br />
3 */<br />
4 module switcher()<br />
5 {<br />
6 /** true if locked*/<br />
7 lock : boolean;<br />
8 init(lock) := true;<br />
9<br />
10 /** true if sensor has contact*/<br />
11 approxSensorEven : boolean;<br />
12 init(approxSensorEven) := true;<br />
13<br />
14 /** true if sensor has contact*/<br />
15 approxSensorSwitched : boolean;<br />
16 init(approxSensorSwitched) := false;<br />
17<br />
18 /** true if pressure is high*/<br />
19 pressureEven : boolean;<br />
20 init(pressureEven) := false;<br />
21<br />
22 /** true if pressure is high*/<br />
23 pressureSwitched : boolean;<br />
24 init(pressureSwitched) := false;<br />
25<br />
Quellcode Weichenmodell<br />
26 /** state variable */<br />
27 state :<br />
28 {even,switched,switchingToEven,switchingToSwitched};<br />
29 init(state) := even;<br />
30<br />
31 case<br />
32 {<br />
33 /** switch even, no pressure or pressure on even pipe */<br />
34 (state = even & ~pressureSwitched)<br />
35 | (state = even & pressureEven) :<br />
36 {<br />
37 next(state) := even;<br />
38 }<br />
39 /** switch even, pressure on switched pipe */<br />
40 (state = even & pressureSwitched) :<br />
41 {<br />
42 next(state) := switchingToSwitched;<br />
67
68 ANHANG B. <strong>SMV</strong> (MARKUS ZARBOCK)<br />
43 next(approxSensorEven) := false;<br />
44 next(lock) := false;<br />
45 }<br />
46 /** switching */<br />
47 state = switchingToSwitched & pressureSwitched :<br />
48 {<br />
49 next(state) := switched;<br />
50 next(approxSensorSwitched) := true;<br />
51 next(lock) := true;<br />
52 }<br />
53 /** nothing to do */<br />
54 (state = switched & ~pressureEven)<br />
55 | (state = switched & pressureSwitched) :<br />
56 {<br />
57 next(state) := switched;<br />
58 }<br />
59 /** switched, pressure on even pipe */<br />
60 (state = switched & pressureEven) :<br />
61 {<br />
62 next(state) := switchingToEven;<br />
63 next(approxSensorSwitched) := false;<br />
64 next(lock) := false;<br />
65 }<br />
66 /** switching */<br />
67 state = switchingToEven & pressureSwitched :<br />
68 {<br />
69 next(state) := even;<br />
70 next(approxSensorEven) := true;<br />
71 next(lock) := true;<br />
72 }<br />
73 }<br />
74 locked :<br />
75 assert G ~(lock & state ={switchingToSwitched,switchingToEven});<br />
76 }
B.1. QUELLCODE 69<br />
Quellcode Ventilinsel<br />
1 /**<br />
2 * shall be a model for the pressure<br />
3 * distribution system, that drives the switches<br />
4 */<br />
5 module pressureDistributor(one,two)<br />
6 {<br />
7 /** control variable for pressureDistributor */<br />
8 control : {oneEven,oneSwitched,twoEven,twoSwitched};<br />
9<br />
10 /** modeling pressureDistributor behaviour */<br />
11 case<br />
12 {<br />
13 control = oneEven :<br />
14 {<br />
15 next(one.pressureEven) := true;<br />
16 next(one.pressureSwitched) := false;<br />
17 next(two.pressureEven) := false;<br />
18 next(two.pressureSwitched) := false;<br />
19 }<br />
20 control = oneSwitched :<br />
21 {<br />
22 next(one.pressureEven) := false;<br />
23 next(one.pressureSwitched) := true;<br />
24 next(two.pressureEven) := false;<br />
25 next(two.pressureSwitched) := false;<br />
26 }<br />
27 control = twoEven :<br />
28 {<br />
29 next(one.pressureEven) := false;<br />
30 next(one.pressureSwitched) := false;<br />
31 next(two.pressureEven) := true;<br />
32 next(two.pressureSwitched) := false;<br />
33 }<br />
34 control = twoSwitched :<br />
35 {<br />
36 next(one.pressureEven) := false;<br />
37 next(one.pressureSwitched) := false;<br />
38 next(two.pressureEven) := true;<br />
39 next(two.pressureSwitched) := false;<br />
40 }<br />
41 }<br />
42 pressureControl :<br />
43 assert G ~(~one.pressureEven & two.pressureEven);<br />
44 }
70 ANHANG B. <strong>SMV</strong> (MARKUS ZARBOCK)<br />
Quellcode Weichensteuerung links<br />
1 /**<br />
2 * left switch controller<br />
3 */<br />
4 module leftSwitchController(pd,one)<br />
5 {<br />
6 /** true if switch not available for shuttles (switching) */<br />
7 available : boolean;<br />
8 init(available) := true;<br />
9<br />
10 /** control flag to start switching */<br />
11 commitSwitch : boolean;<br />
12 init(commitSwitch) := true;<br />
13<br />
14 /** two "locked" states and two swinging states */<br />
15 state :<br />
16 {even,switchingToEven,switchingToSwitched,switched,errorState};<br />
17 init(state) := even;<br />
18<br />
19 /** modeling the switch as a state machine */<br />
20 case<br />
21 {<br />
22 /** begin switch from even to switched */<br />
23 state = even & commitSwitch :<br />
24 {<br />
25 next(state) := switchingToSwitched;<br />
26 next(commitSwitch) := false;<br />
27 next(available) := false;<br />
28 next(pd.control) := oneSwitched;<br />
29 }<br />
30 /** switching */<br />
31 state = switchingToSwitched & one.approxSensorSwitched :<br />
32 {<br />
33 next(state) := switched;<br />
34 next(available) := true;<br />
35 }<br />
36 /** switching error*/<br />
37 state = switchingToSwitched & one.approxSensorEven :<br />
38 {<br />
39 next(state) := errorState;<br />
40 }<br />
41 /** begin switch from switched to even */<br />
42 state = switched & commitSwitch :<br />
43 {<br />
44 next(state) := switchingToSwitched;<br />
45 next(commitSwitch) := false;<br />
46 next(available) := false;<br />
47 next(pd.control) := oneEven;<br />
48 }<br />
49 /** switching */<br />
50 state = switchingToEven & one.approxSensorEven :<br />
51 {<br />
52 next(state) := even;<br />
53 next(available) := true;<br />
54 }<br />
55 /** switching error*/<br />
56 state = switchingToSwitched & one.approxSensorSwitched :<br />
57 {<br />
58 next(state) := errorState;<br />
59 }<br />
60 /** wait state */<br />
61 default : next(state) := state;<br />
62 }<br />
63 }
B.1. QUELLCODE 71<br />
Quellcode Weichensteuerung links<br />
1 /**<br />
2 * right switch controller<br />
3 */<br />
4 module rightSwitchController(pd,two)<br />
5 {<br />
6 /** true if switch not available for shuttles (switching) */<br />
7 available : boolean;<br />
8 init(available) := true;<br />
9<br />
10 /** control flag to start switching, stupid solution*/<br />
11 commitSwitch : boolean;<br />
12 init(commitSwitch) := false;<br />
13<br />
14 /** two "locked" states and two swinging states */<br />
15 state : {even,switchingToEven,switchingToSwitched,switched,errorState};<br />
16 init(state) := even;<br />
17<br />
18 /** modeling the switch as a state machine */<br />
19 case<br />
20 {<br />
21 /** begin switch from even to switched */<br />
22 state = even & commitSwitch :<br />
23 {<br />
24 next(state) := switchingToSwitched;<br />
25 next(commitSwitch) := false;<br />
26 next(available) := false;<br />
27 next(pd.control) := twoSwitched;<br />
28 }<br />
29 /** switching */<br />
30 state = switchingToSwitched & two.approxSensorSwitched :<br />
31 {<br />
32 next(state) := switched;<br />
33 next(available) := true;<br />
34 }<br />
35 /** switching error*/<br />
36 state = switchingToSwitched & two.approxSensorEven :<br />
37 {<br />
38 next(state) := errorState;<br />
39 }<br />
40 /** begin switch from switched to even */<br />
41 state = switched & commitSwitch :<br />
42 {<br />
43 next(state) := switchingToSwitched;<br />
44 next(commitSwitch) := false;<br />
45 next(available) := false;<br />
46 next(pd.control) := twoEven;<br />
47 }<br />
48 /** switching */<br />
49 state = switchingToEven & two.approxSensorEven :<br />
50 {<br />
51 next(state) := even;<br />
52 next(available) := true;<br />
53 }<br />
54 state = switchingToSwitched & two.approxSensorSwitched :<br />
55 {<br />
56 next(state) := errorState;<br />
57 }<br />
58 /** wait state */<br />
59 default : next(state) := state;<br />
60 }<br />
61 }
72 ANHANG B. <strong>SMV</strong> (MARKUS ZARBOCK)<br />
Quellcode Shuttle<br />
1 /**<br />
2 * models a shuttle controller<br />
3 */<br />
4 module shuttle(startTrack,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,<br />
5 controlOne,controlTwo,chan)<br />
6 {<br />
7<br />
8 /** true if shuttle wants to drive straight ahead*/<br />
9 straight : boolean;<br />
10 init(straight) := {0,1};<br />
11<br />
12 /**<br />
13 * to memorize wether switch one was caused to switch<br />
14 * as shuttles passed the switch<br />
15 */<br />
16 causedOneToSwitch : boolean;<br />
17 init(causedOneToSwitch) := false;<br />
18<br />
19 /**<br />
20 * to memorize wether switch two was caused to switch<br />
21 * as shuttles passed the switch<br />
22 */<br />
23 causedTwoToSwitch : boolean;<br />
24 init(causedTwoToSwitch) := false;<br />
25<br />
26 /** shuttle states */<br />
27 state : {idle, halted, driving};<br />
28 init(state) := idle;<br />
29<br />
30 myTrack : 1..12;<br />
31<br />
32 /** put shuttle on start track */<br />
33 case<br />
34 {<br />
35 startTrack = 3 : init(myTrack) := 3;<br />
36 startTrack = 7 : init(myTrack) := 7;<br />
37 startTrack = 8 : init(myTrack) := 8;<br />
38 startTrack = 9 : init(myTrack) := 9;<br />
39 startTrack = 10 : init(myTrack) := 10;<br />
40 }<br />
41 /** shuttle logic */<br />
42 case<br />
43 {<br />
44 /** 10 -> 1 */<br />
45 myTrack = 10 :<br />
46 {<br />
47 if(t1.state = empty)<br />
48 {<br />
49 next(state) := driving;<br />
50 next(t1.state) := passed;<br />
51 next(myTrack) := 1;<br />
52 next(t10.state) := empty;<br />
53 }<br />
54 else<br />
55 {<br />
56 next(state) := halted;<br />
57 next(myTrack) := 10;<br />
58 }<br />
59 }<br />
60 /** 9 -> 10 */<br />
61 myTrack = 9 :<br />
62 {<br />
63 if(t10.state = empty)<br />
64 {<br />
65 next(state) := driving;<br />
66 next(t10.state) := passed;<br />
67 next(myTrack) := 10;<br />
68 next(t9.state) := empty;<br />
69 }
B.1. QUELLCODE 73<br />
70 else<br />
71 {<br />
72 next(state) := halted;<br />
73 next(myTrack) := 9;<br />
74 }<br />
75 }<br />
76 /** 8 -> 9 */<br />
77 myTrack = 8 :<br />
78 {<br />
79 if(t9.state = empty)<br />
80 {<br />
81 next(state) := driving;<br />
82 next(t9.state) := passed;<br />
83 next(myTrack) := 9;<br />
84 next(t8.state) := empty;<br />
85 }<br />
86 else<br />
87 {<br />
88 next(state) := halted;<br />
89 next(myTrack) := 8;<br />
90 }<br />
91 }<br />
92 /** 7 -> 8 */<br />
93 myTrack = 7 :<br />
94 {<br />
95 if(t8.state = empty)<br />
96 {<br />
97 next(state) := driving;<br />
98 next(t8.state) := passed;<br />
99 next(myTrack) := 8;<br />
100 next(t7.state) := empty;<br />
101 }<br />
102 else<br />
103 {<br />
104 next(state) := halted;<br />
105 next(myTrack) := 7;<br />
106 }<br />
107 }<br />
108 /** shuttle on track in front of switch one 1 -> 11*/<br />
109 myTrack = 1 :<br />
110 {<br />
111 case<br />
112 {<br />
113 straight = true :<br />
114 {<br />
115 case<br />
116 {<br />
117 controlOne.state = even & ~chan.onePassed :<br />
118 {<br />
119 next(myTrack) := 11;<br />
120 next(chan.onePassed) := true;<br />
121 next(state) := driving;<br />
122 next(t1.state) := empty;<br />
123 if (causedOneToSwitch)<br />
124 {<br />
125 next(chan.pressureAvailable) := true;<br />
126 next(causedOneToSwitch) := false;<br />
127 }<br />
128 }<br />
129 controlOne.state = switched & ~chan.onePassed :<br />
130 {<br />
131 if (chan.pressureAvailable)<br />
132 {<br />
133 next(controlOne.commitSwitch) := true;<br />
134 next(state) := halted;<br />
135 next(chan.pressureAvailable) := false;<br />
136 next(causedOneToSwitch) := true;<br />
137<br />
138 }<br />
139 }<br />
140 /** occurs if switch is switching -> shuttle has to wait */
74 ANHANG B. <strong>SMV</strong> (MARKUS ZARBOCK)<br />
141 default : next(state) := halted;<br />
142 }<br />
143 }<br />
144 straight = false :<br />
145 {<br />
146 case<br />
147 {<br />
148 controlOne.state = switched & ~chan.onePassed :<br />
149 {<br />
150 next(myTrack) := 11;<br />
151 next(t1.state) := empty;<br />
152 next(state) := driving;<br />
153 next(chan.onePassed) := true;<br />
154 if (causedOneToSwitch)<br />
155 {<br />
156 next(chan.pressureAvailable) := true;<br />
157 next(causedOneToSwitch) := false;<br />
158 }<br />
159 }<br />
160 controlOne.state = even & ~(chan.onePassed) :<br />
161 {<br />
162 if (chan.pressureAvailable)<br />
163 {<br />
164 next(controlOne.commitSwitch) := true;<br />
165 next(state) := halted;<br />
166 next(chan.pressureAvailable) := false;<br />
167 next(causedOneToSwitch) := true;<br />
168<br />
169 } /** occurs if switch is switching -> shuttle has to wait */<br />
170 }<br />
171 default : next(state) := halted;<br />
172 }<br />
173 }<br />
174 }<br />
175 }<br />
176 /** shuttle on first switch */<br />
177 myTrack = 11 :<br />
178 {<br />
179 case<br />
180 {<br />
181 /** 11 -> 2*/<br />
182 straight = true :<br />
183 {<br />
184 if(t2.state = empty)<br />
185 {<br />
186 next(state) := driving;<br />
187 next(t2.state) := passed;<br />
188 next(chan.onePassed) := false;<br />
189 next(myTrack) := 2;<br />
190 }<br />
191 else<br />
192 {<br />
193 next(state) := halted;<br />
194 next(myTrack) := 11;<br />
195 }<br />
196 }<br />
197 /** 11 -> 4 */<br />
198 straight = false :<br />
199 {<br />
200 if(t4.state = empty)<br />
201 {<br />
202 next(state) := driving;<br />
203 next(t4.state) := passed;<br />
204 next(chan.onePassed) := false;<br />
205 next(myTrack) := 4;<br />
206 }<br />
207 else<br />
208 {<br />
209 next(state) := halted;<br />
210 next(myTrack) := 11;<br />
211 }
B.1. QUELLCODE 75<br />
212 }<br />
213 }<br />
214 }<br />
215 /** 4 -> 6 */<br />
216 myTrack = 4 :<br />
217 {<br />
218 if(t6.state = empty)<br />
219 {<br />
220 next(state) := driving;<br />
221 next(t6.state) := passed;<br />
222 next(myTrack) := 6;<br />
223 next(t4.state) := empty;<br />
224 }<br />
225 else<br />
226 {<br />
227 next(state) := halted;<br />
228 next(myTrack) := 4;<br />
229 }<br />
230 }<br />
231 /** shuttle on track modelling track loop -> later loading area 6 -> 5*/<br />
232 myTrack = 6 :<br />
233 {<br />
234 if(t5.state = empty)<br />
235 {<br />
236 next(state) := driving;<br />
237 next(t5.state) := passed;<br />
238 next(myTrack) := 5;<br />
239 next(t6.state) := empty;<br />
240 }<br />
241 else<br />
242 {<br />
243 next(state) := halted;<br />
244 next(myTrack) := 6;<br />
245 }<br />
246 }<br />
247 /** shuttle on track above switch two */<br />
248 myTrack = 5 :<br />
249 {<br />
250 case<br />
251 {<br />
252 controlTwo.state = switched & ~(chan.twoPassed) :<br />
253 {<br />
254 next(myTrack) := 12;<br />
255 next(t5.state) := empty;<br />
256 next(state) := driving;<br />
257 next(chan.twoPassed) := true;<br />
258 if (causedTwoToSwitch)<br />
259 {<br />
260 next(causedTwoToSwitch) := false;<br />
261 next(chan.pressureAvailable) := true;<br />
262 }<br />
263<br />
264 }<br />
265 controlTwo.state = even & ~(chan.twoPassed) :<br />
266 {<br />
267 if (chan.pressureAvailable)<br />
268 {<br />
269 next(controlTwo.commitSwitch) := true;<br />
270 next(state) := halted;<br />
271 next(chan.pressureAvailable) := false;<br />
272 next(causedTwoToSwitch) := true;<br />
273 }<br />
274 }<br />
275 /** occurs if switch is switching -> shuttle has to wait */<br />
276 default : next(state) := halted;<br />
277 }<br />
278 }<br />
279 /** shuttle on switch two 12 -> 3*/<br />
280 myTrack = 12 :<br />
281 {<br />
282 if(t3.state = empty)
76 ANHANG B. <strong>SMV</strong> (MARKUS ZARBOCK)<br />
283 {<br />
284 next(state) := driving;<br />
285 next(t3.state) := passed;<br />
286 next(chan.twoPassed) := false;<br />
287 next(myTrack) := 3;<br />
288 }<br />
289 else<br />
290 {<br />
291 next(state) := halted;<br />
292 next(myTrack) := 12;<br />
293 }<br />
294 }<br />
295 /** shuttle between switches */<br />
296 myTrack = 2 :<br />
297 {<br />
298 case<br />
299 {<br />
300 controlTwo.state = even & ~(chan.twoPassed) :<br />
301 {<br />
302 next(myTrack) := 12;<br />
303 next(t2.state) := empty;<br />
304 next(state) := driving;<br />
305 next(chan.twoPassed) := true;<br />
306 if(causedTwoToSwitch)<br />
307 {<br />
308 next(causedTwoToSwitch) := false;<br />
309 next(chan.pressureAvailable) := true;<br />
310 }<br />
311 }<br />
312 controlTwo.state = switched & ~(chan.twoPassed) :<br />
313 {<br />
314 if (chan.pressureAvailable)<br />
315 {<br />
316 next(controlTwo.commitSwitch) := true;<br />
317 next(state) := halted;<br />
318 next(chan.pressureAvailable) := false;<br />
319 next(causedTwoToSwitch) := true;<br />
320 }<br />
321 }<br />
322 /** occurs if switch is switching -> shuttle has to wait */<br />
323 default : next(state) := halted;<br />
324 }<br />
325 }<br />
326 /** 3 -> 7 */<br />
327 myTrack = 3 :<br />
328 {<br />
329 if(t7.state = empty)<br />
330 {<br />
331 next(state) := driving;<br />
332 next(t7.state) := passed;<br />
333 next(myTrack) := 7;<br />
334 next(t3.state) := empty;<br />
335 }<br />
336 else<br />
337 {<br />
338 next(state) := halted;<br />
339 next(myTrack) := 3;<br />
340 }<br />
341 }<br />
342 }<br />
343 }/** shuttle */
B.1. QUELLCODE 77<br />
Quellcode Track<br />
1 /**<br />
2 * models a track segment<br />
3 */<br />
4 module track()<br />
5 {<br />
6 /** flag to store if track is passed by shuttle or not */<br />
7 state : {empty, passed};<br />
8 }<br />
1 /**<br />
2 * used to ensure mutex between shuttles<br />
3 * driving over switches<br />
4 */<br />
5 module channel()<br />
6 {<br />
7 /** true if switch one is empty */<br />
8 onePassed : boolean;<br />
9 init(onePassed) := false;<br />
10<br />
11 /** true if switch two is empty */<br />
12 twoPassed : boolean;<br />
13 init(twoPassed) := false;<br />
14<br />
15 /** true if pressure is available */<br />
16 pressureAvailable : boolean;<br />
17 init(pressureAvailable) := true;<br />
18 }<br />
Quellcode channel
78 ANHANG B. <strong>SMV</strong> (MARKUS ZARBOCK)<br />
1 module main()<br />
2 {<br />
3 /**<br />
4 * processes to model switches<br />
5 */<br />
6<br />
7 pd : process pressureDistributor(one,two);<br />
8<br />
9 /** physical models */<br />
10 one : process switcher();<br />
11 two : process switcher();<br />
12<br />
Quellcode Instanziierungen<br />
13 /** control models */<br />
14 controlOne : process leftSwitchController(pd,one);<br />
15 controlTwo : process rightSwitchController(pd,two);<br />
16<br />
17 /**<br />
18 * mastercontroller parts<br />
19 */<br />
20<br />
21 t1 : process track();<br />
22 t2 : process track();<br />
23 t3 : process track();<br />
24 t4 : process track();<br />
25 t5 : process track();<br />
26 t6 : process track();<br />
27 t7 : process track();<br />
28 t8 : process track();<br />
29 t9 : process track();<br />
30 t10 : process track();<br />
31<br />
32 /** holds shared variables */<br />
33 chan : process channel();<br />
34<br />
35 /** init shuttles, up to now in fixed order */<br />
36<br />
37 s1 : process shuttle(7,t1,t2,t3,t4,t5,t6,t7,t8,t9,<br />
38 t10,controlOne,controlTwo,chan);<br />
39 s2 : process shuttle(8,t1,t2,t3,t4,t5,t6,t7,t8,t9,<br />
40 t10,controlOne,controlTwo,chan);<br />
41 s3 : process shuttle(9,t1,t2,t3,t4,t5,t6,t7,t8,t9,<br />
42 t10,controlOne,controlTwo,chan);<br />
43 s4 : process shuttle(10,t1,t2,t3,t4,t5,t6,t7,t8,t9,<br />
44 t10,controlOne,controlTwo,chan);<br />
45 s5 : process shuttle(3,t1,t2,t3,t4,t5,t6,t7,t8,t9,<br />
46 t10,controlOne,controlTwo,chan);<br />
47<br />
48 /** initializing tracks */<br />
49 init(t1.state) := empty;<br />
50 init(t2.state) := empty;<br />
51 init(t3.state) := passed;<br />
52 init(t4.state) := empty;<br />
53 init(t5.state) := empty;<br />
54 init(t6.state) := empty;<br />
55 init(t7.state) := passed;<br />
56 init(t8.state) := passed;<br />
57 init(t9.state) := passed;<br />
58 init(t10.state) := passed;<br />
59<br />
60 /** specifications */<br />
61<br />
62 notMoreThanOneOnSameTrack5 :<br />
63 assert G ~((s1.myTrack = s2.myTrack) | (s1.myTrack = s3.myTrack)<br />
64 | (s1.myTrack = s4.myTrack) | (s1.myTrack = s5.myTrack)<br />
65 | (s2.myTrack = s3.myTrack) | (s2.myTrack =s4.myTrack)<br />
66 | (s2.myTrack = s5.myTrack) | (s3.myTrack = s4.myTrack)<br />
67 | (s3.myTrack = s5.myTrack) | (s4.myTrack = s5.myTrack));<br />
68<br />
69 notMoreThanOneOnSameTrack4 :
B.1. QUELLCODE 79<br />
70 assert G ~((s1.myTrack = s2.myTrack) | (s1.myTrack = s3.myTrack)<br />
71 | (s1.myTrack = s4.myTrack) | (s2.myTrack = s3.myTrack)<br />
72 | (s2.myTrack = s4.myTrack) | (s3.myTrack = s4.myTrack));<br />
73<br />
74 notMoreThanOneOnSameTrack3 :<br />
75 assert G ~((s1.myTrack = s2.myTrack) | (s1.myTrack = s3.myTrack)<br />
76 | (s2.myTrack = s3.myTrack));<br />
77<br />
78 notMoreThanOneOnSameTrack2 : assert G ~(s1.myTrack = s2.myTrack);<br />
79<br />
80 switches1 :<br />
81 assert G ~(one.state ={switchingToSwitched,switchingToEven}<br />
82 & two.state ={switchingToSwitched,switchingToEven});<br />
83<br />
84 switches2 :<br />
85 assert G ~(controlOne.state ={switchingToSwitched,switchingToEven}<br />
86 & controlTwo.state ={switchingToSwitched,switchingToEven});<br />
87<br />
88 lockedOne :<br />
89 assert G ~(one.lock & one.state ={switchingToSwitched,switchingToEven});<br />
90<br />
91 lockedTwo :<br />
92 assert G ~(two.lock & two.state ={switchingToSwitched,switchingToEven});<br />
93<br />
94 lockedOne2 :<br />
95 assert G ~((s1.myTrack = 11 | s2.myTrack = 11 | s3.myTrack = 11<br />
96 | s4.myTrack = 11 | s5.myTrack = 11) & ~one.lock);<br />
97<br />
98 lockedTwo2 :<br />
99 assert G ~((s1.myTrack = 12 | s2.myTrack = 12 | s3.myTrack = 12<br />
100 | s4.myTrack = 12 | s5.myTrack = 12) & ~two.lock);<br />
101 }/** main */
80 ANHANG B. <strong>SMV</strong> (MARKUS ZARBOCK)<br />
B.2 Abbildungen<br />
Hier befinden sich die Abbildungen zur grafischen Benutzeroberfläche für <strong>SMV</strong>.<br />
Die Verwendung dieser Oberfläche befindet sich in Kapitel 2.2.4.<br />
Abbildung B.1: <strong>SMV</strong> – Variablenbrowser
B.2. ABBILDUNGEN 81<br />
Abbildung B.2: <strong>SMV</strong> – Spezifikationen<br />
Abbildung B.3: <strong>SMV</strong> – Auswertung
82 ANHANG B. <strong>SMV</strong> (MARKUS ZARBOCK)<br />
Abbildung B.4: <strong>SMV</strong> – Trace
Anhang C<br />
CDROM – alle Unterlagen<br />
83
Abbildungsverzeichnis<br />
2.1 Automaten Benutzer <strong>und</strong> Lichtschalter des Beipiels ”<br />
Intelligenter<br />
Lichtschalter“ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
2.2 Uppaal – System Editor . . . . . . . . . . . . . . . . . . . . . . 18<br />
2.3 Uppaal – Simulator . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
2.4 Uppaal – Verifizierer . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
2.5 <strong>SMV</strong> – Zeitmodelle . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
3.1 Eine mögliche Topologie der ISILEIT-Fallstudie . . . . . . . . . 31<br />
3.2 Ausschnitt aus der ISILEIT-Fallstudie . . . . . . . . . . . . . . 32<br />
3.3 Uppaal – Automat Switch . . . . . . . . . . . . . . . . . . . . . 36<br />
3.4 Uppaal – Automat Weiche . . . . . . . . . . . . . . . . . . . . . 37<br />
3.5 Uppaal – Automat Shuttle . . . . . . . . . . . . . . . . . . . . . 40<br />
3.6 Uppaal – Grafische Auswertung der Verifikationszeiten . . . . . 45<br />
3.7 Ausschnitt aus der ISILEIT-Fallstudie . . . . . . . . . . . . . . 46<br />
3.8 <strong>SMV</strong> Steuerung . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
3.9 <strong>SMV</strong> Weiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
3.10 <strong>SMV</strong> Weichenmodell . . . . . . . . . . . . . . . . . . . . . . . . 49<br />
3.11 <strong>SMV</strong> Weiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
3.12 <strong>SMV</strong> Topologie . . . . . . . . . . . . . . . . . . . . . . . . . . . 52<br />
B.1 <strong>SMV</strong> – Variablenbrowser . . . . . . . . . . . . . . . . . . . . . . 80<br />
B.2 <strong>SMV</strong> – Spezifikationen . . . . . . . . . . . . . . . . . . . . . . . 81<br />
B.3 <strong>SMV</strong> – Auswertung . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
B.4 <strong>SMV</strong> – Trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82<br />
84
Literaturverzeichnis<br />
[1] Petterson, R / Larsen, K. G.: Uppaal2k: Small Tutorial<br />
[2] Bengtsson J, / Griffioen, D / Kristoffersen, K / Larsen, K. G./ Larrson, F /<br />
Pettersson, P / Yi, W: Verification of an Audio Protocol with Bus Collision<br />
Using Uppaal; in Alur, R / Henzinger, T. A. (Hrsg): Proc. of 9th Int. Conf.<br />
on Computer Aided Verification, Nr. 1102, Seiten 244-256; Springer Verlag,<br />
Juli 1996<br />
[3] Larsen, K. G. / Pettersson, P / Yi, W.: Uppaal in a Nutshell<br />
[4] Bengtsson, J. / Larsen, K. G. / Larsson, F. / Pettersson, P. / Yi, W. /<br />
Weise, C.: New Generation of <strong>UPPAAL</strong><br />
[5] Schäfer, W. / Kardos, M.:Vortrag: Integrative Spezifikation von verteilten<br />
Leitsystemen der flexibel automatisierten Fertigung,<br />
[7] <strong>UPPAAL</strong> Workshop, Sunnersta Herrgard, Uppsala, Oktober 1998<br />
[8] Larsen, K. G. / Pettersson, P:Timed and Hybird System in <strong>UPPAAL</strong>2K,<br />
Juni 2000<br />
[9] Alur, R. / Dill, D. L.: A theory of timed automta Timed Theoretical Computer<br />
Science, 1994<br />
[10] Clarke, E. M. / Emerson, E. A.: Synthesis of Synchronization Skeletons<br />
for Branching Time Temporal Logic; in Logics of Programms: Workshop,<br />
volume 131 of Lecture Notes in Computer Science, Yorktown Heights, New<br />
York, May 1981, Springer Verlag<br />
[11] Quielle, J. P. / Sifakis, J.: Spezification and verification of concurrent systems<br />
in CESAR; in: Proceedings of the Fifth International Symposium in<br />
Programming, 1981<br />
[12] Clarke, E. M. / Wing, J. M.: Formal methods: State of the art and future<br />
directions; Technical Report CMU-CS-96-178, School of Computer Science,<br />
Carnegie Mellon University, Semptember 1996<br />
[13] Wing, J. M.: A specifiers’s introduction to formal methods; IEEE Computer,<br />
September 1990<br />
85
86 LITERATURVERZEICHNIS<br />
[14] McMillan, K.: Symbolic model checking: an approach to the state explosion<br />
problem; Carnegie Mellon University, School of Computer Science; Ph.D.<br />
Thesis, 1992.<br />
[15] McMillan, K.: <strong>SMV</strong> system; Carnegie Mellon University, Technical Report,<br />
School of Computer Science, 1992.<br />
[16] Banphawatthanarak, C. / Krogh, B. H.: Verification of Stateflow Diagrams<br />
Using <strong>SMV</strong><br />
[17] http://www.uppaal.com<br />
[18] http://www.uni-paderborn.de/cs/ISILEIT<br />
[19] http://www-cad.eecs.berkeley.edu/˜kenmcmil/smv/