26.12.2014 Aufrufe

Model-Checking eines Materialflusssystems mittels UPPAAL und SMV

Model-Checking eines Materialflusssystems mittels UPPAAL und SMV

Model-Checking eines Materialflusssystems mittels UPPAAL und SMV

MEHR ANZEIGEN
WENIGER ANZEIGEN

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/

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!