11.10.2013 Aufrufe

Diss.-ETH 12317 Diss.-ETH 12317 Diss.-ETH 12317 Diss.-E Eine ...

Diss.-ETH 12317 Diss.-ETH 12317 Diss.-ETH 12317 Diss.-E Eine ...

Diss.-ETH 12317 Diss.-ETH 12317 Diss.-ETH 12317 Diss.-E Eine ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Diss</strong>. <strong>ETH</strong> Nr. <strong>12317</strong><br />

<strong>Eine</strong> Domänen-Architektur zur<br />

Konfiguration von wiederverwendbaren<br />

Software-Komponenten für die Lösung<br />

nichtlinearer Netzgleichungen<br />

ABHANDLUNG<br />

zur Erlangung des Titels<br />

DOKTOR DER TECHNISCHEN WISSENSCHAFTEN<br />

der<br />

EIDGENÖSSISCHEN TECHNISCHEN HOCHSCHULE<br />

ZÜRICH<br />

vorgelegt von<br />

PETER BOSSHART<br />

Dipl. El.-Ing. <strong>ETH</strong><br />

geboren am 15. Juli 1955<br />

Bürger von Zürich (ZH)<br />

und Wittenwil (TG)<br />

Angenommen auf Antrag von<br />

Prof. Dr. R. Bacher, Referent<br />

Prof. Dr. R. Weiss, Korreferent<br />

Zürich 1997<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Meiner Frau Klara<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Diese Arbeit entstand zwischen 1994 und 1997 während meiner Assistenztätigkeit<br />

am <strong>ETH</strong>-Institut für Energieübertragung und Hochspannungstechnik<br />

in der Fachgruppe Netzleittechnik.<br />

Herrn Prof. Dr. Rainer Bacher möchte ich für die Betreuung und Korrektur<br />

der Arbeit danken. Er hat in offenen und kreativen Diskussionen<br />

viel zu dieser Arbeit beigetragen. Herrn Prof. Dr. Reinhold Weiss sei<br />

für die Übernahme des Korreferats herzlich gedankt. Prof. Dr. Hans<br />

Glavitsch hat den Einstieg in diese Arbeit mit viel Erfahrung begleitet.<br />

Wertvolle Einsichten ergaben sich auch aus der Zusammenarbeit mit Reto<br />

Hirt, der Teile des Prototyps implementiert und getestet hat. Ferner hat<br />

Markus Leuzingers kompetente und freundliche Hilfe bei EDV-Problemen<br />

die Arbeit oft erleichtert. Stamatina Orfanogianni verdanke ich die Vergleichsmöglichkeit<br />

mit ihrem konkurrierenden Ansatz.<br />

Herzlicher Dank gilt meinem Vater Walter und seiner Frau Anne<br />

Bosshart-Girod für das offene Haus in der Nähe des <strong>ETH</strong>-Instituts während<br />

der Abschlussphase dieser Arbeit.<br />

Besonderer Dank gilt schliesslich meiner Frau Klara, die mich während<br />

dem Entstehen dieser Arbeit hilfreich, klug und geduldig begleitet hat.<br />

Zürich, im Juli 1997 Peter Bosshart<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Kurzfassung<br />

Viele Applikationen im Bereich der elektrischen Energieübertragung<br />

führen auf ein System von simultanen, nichtlinearen Gleichungen<br />

g(x,p)=0(x: Unbekannte, p: Parameter), die nach den Unbekannten x<br />

aufzulösen sind. Diese Gleichungen beschreiben das nichtlineare Verhalten<br />

miteinander verbundener Entitäten.<br />

Dies ist kein neues Problem. Der Beitrag der vorliegenden Arbeit<br />

besteht jedoch darin, für diese Klasse von Problemen mit Mitteln des<br />

Software-Engineerings und aktuellen Erkenntnissen aus der Netzmodellierung<br />

eine wiederverwendbare, generische Lösung zu beschreiben, die<br />

leicht an neue Anforderungen angepasst werden kann.<br />

Diese Lösung besteht konkret aus den Diensten Netzaufbau, Netzberechnung<br />

und der Darstellung von Resultaten. Diese Dienste werden in<br />

einheitlicher Art als Leistungen aufgefasst, die sich aus einem variablen<br />

und einem innerhalb der Problemklasse konstanten Anteil zusammensetzt.<br />

Diese Struktur ist in einem in der vorliegenden Arbeit betrachteten Prototypen<br />

konkretisiert worden.<br />

Der Kern des Prototypen besteht aus einem objekt-orientierten Framework.<br />

Es eignet sich für diese Aufgabenstellung, weil sich damit ein generisches<br />

Modell der betrachteten Problemklasse implementieren lässt. Dieses<br />

Domänenmodell stellt ein wesentliches Ergebnis der vorliegenden Arbeit<br />

dar.<br />

Es hat sich herausgestellt, dass das Verhalten eines Netzes durch Instanzen<br />

zweier generischer Bausteintypen, Ntor und Summengeber, modellierbar<br />

ist. Instanzen dieser Typen werden stets über Anschlüsse miteinander<br />

verbunden. Dabei wird der Anschluss als abstrakter Begriff aufgefasst.<br />

Die dafür gängige Vorstellung einer elektrischen Klemme ist nur ein wichtiger<br />

Spezialfall.<br />

Das Ntor ist eine Entität, die üblicherweise mit einem physikalischen<br />

Betriebsmittel, wie z.B. einem Generator, einer Last oder Leitung assoziiert<br />

wird. Das Ntor ist jedoch von allgemeinerer Natur. Es ist mit ihm<br />

möglich, auch eine Fehlerbedingung, wie z.B. einen Kurzschlussfall zu<br />

modellieren. Das Ntor stellt einen endlichen Automaten mit einem Verhalten<br />

BN σ(Vσ,Pσ,E σ,Tσ) für jeden Zustand σ dar. Die Menge E σ enthält<br />

alle Gleichungen, die mit Hilfe der Variablen Vσ und den Parametern Pσ<br />

gebildet werden. Die Menge Tσ spezifiziert den endlichen Automaten<br />

durch die Angabe von Zuständen und Übergangsbedingungen.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Die Summengeber greifen auf Variable in den Ntoren zu, und formulieren<br />

damit weitere Gleichungen, um z.B. die Topologie eines Netzes auszudrücken.<br />

Den Bausteintypen des Domänenmodells entsprechen spezielle Klassen<br />

des Frameworks, die dazu angelegt sind, für einen bestimmten Anwendungsfall<br />

noch konkretisiert zu werden. Dazu wird ein Mechanismus vorgestellt,<br />

der den variablen Anteil eines Dienstes in kontrollierter Weise im<br />

Framework adaptiert. An dieser Stelle kommt ein symbolisches Rechenprogramm<br />

(Maple V) zum Einsatz, das aus einer anwendungsfreundlichen<br />

Hochsprachen-Spezifikation zuverlässig den korrekten Quelltext für die zu<br />

konkretisierenden Teile des Frameworks erzeugt.<br />

Alle diese Elemente, wie Framework, Spezifikation und Adaption der<br />

generischen Teile des Frameworks werden innerhalb einer übergeordneten<br />

Domänen-Architektur koordiniert.<br />

Der Nutzen der in dieser Arbeit vorgeschlagenen Vorgehensweise ist<br />

eine erhebliche Einsparung des Entwicklungsaufwandes innerhalb dieser<br />

Klasse von Simulationsproblemen.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Abstract<br />

Many applications lead to systems of simultaneous nonlinear equations<br />

g(x,p)=0(x: unknowns, p: parameters) which have to be solved for<br />

the unknowns x. It is assumed that these equations describe non-linear<br />

behavior related to interconnected entities. This is not a new problem.<br />

However the contribution of this thesis is a description of a generic solution<br />

for a class of problems by means of software-engineering and an actual<br />

approach of network modeling. The result is a reusable asset which can be<br />

easily adapted to changes of specifications.<br />

The proposed asset offers three fundamental services: Instantiation of<br />

network building objects, simulation (calculation) and representation of<br />

results. These services are modeled in a unified manner. Each service consists<br />

of a variable and a constant part within the boundary of the problem.<br />

This concept has been implemented in a prototype, which is described in<br />

the thesis.<br />

The core of the prototype is an object-oriented framework. It is suited<br />

for the task, because it is capable to represent a generic design for the class<br />

of problems mentioned above. A domain model containing the commonalities<br />

of these problems has been found, which is an important result of this<br />

thesis.<br />

A typical application was analyzed to figure out an object-oriented model<br />

of this domain. It turned out that a behavior of a network can be modeled<br />

by instances of two generic types nport and sumsetter. These instances<br />

are always connected by ports. Thereby the port is seen as an abstract<br />

term. Its common association to an electrical terminal is only an import<br />

special case.<br />

The nport is the entity typically associated with an electrical element<br />

such as generator, load, line etc. The nport, however, is more general allowing<br />

to model for example fault conditions, such as a short circuit. The<br />

nport is a finite state machine with a behavior BN σ(Vσ,Pσ,E σ,Tσ) for<br />

each state σ. The set E σ contains all equations formulated in terms of local<br />

variables Vσ and parameters Pσ. Tσ defines the transitions and their<br />

conditions leading to next states.<br />

A sumsetter accesses variables located in nports to create further equations,<br />

typically expressing incidence relations within networks. A sumsetter<br />

contains instances of sum types and a set A of n connected ports.<br />

The domain model was implemented as a system of coupled classes<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


which establish the object-oriented framework. Thereby the entities of the<br />

domain model, nport and sumsetter, are special classes, which have to be<br />

adapted to concrete applications. A mechanism is proposed to adapt the<br />

framework in controlled way. At this place a symbolic calculation system<br />

(Maple V) is applied to generate correct source code of the adapted parts<br />

of the framework from a user-friendly, high-level language specification.<br />

All these elements, such as framework, specification and adaptation of<br />

the generic parts of the framework are coordinated within a domain architecture.<br />

The payoff of this approach is a high reduction in the effort to develop,<br />

maintain and expand software in the domain of non-linear network<br />

equations.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Inhaltsverzeichnis<br />

1 Einleitung 1<br />

1.1 Motivation.......................... 1<br />

1.2 StandderTechnik...................... 2<br />

1.3 ZielderArbeit........................ 4<br />

1.4 Aufbau der Arbeit . . . . . . . . . . . . . . . . . . . . . . 5<br />

2 Konzepte des Software-Engineering 7<br />

2.1 Einleitung.......................... 7<br />

2.2 Software-Wiederverwendung . . . . . . . . . . . . . . . . 8<br />

2.2.1 Erwartungen an die Wiederverwendung . . . . . . 9<br />

2.2.2 Grundlegende Ansätze............... 9<br />

2.2.3 Hindernisse . . . . . . . . . . . . . . . . . . . . . 10<br />

2.2.4 Techniken . . . . . . . . . . . . . . . . . . . . . . 12<br />

2.3 Begriffe der objekt-orientierten Programmierung . . . . . 15<br />

2.3.1 Objekt . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

2.3.2 Klassen . . . . . . . . . . . . . . . . . . . . . . . 17<br />

2.3.3 Methoden . . . . . . . . . . . . . . . . . . . . . . 17<br />

2.3.4 Attribute . . . . . . . . . . . . . . . . . . . . . . 18<br />

2.4 Objekt-orientierte Konzepte . . . . . . . . . . . . . . . . 18<br />

2.4.1 Kapselung . . . . . . . . . . . . . . . . . . . . . 18<br />

2.4.2 Vererbung . . . . . . . . . . . . . . . . . . . . . . 20<br />

2.4.3 Polymorphismus . . . . . . . . . . . . . . . . . . 21<br />

2.5 Objekt-orientiertes Framework . . . . . . . . . . . . . . . 21<br />

2.5.1 Begriff und Funktion . . . . . . . . . . . . . . . . 22<br />

2.5.2 Entwicklungsvorgang . . . . . . . . . . . . . . . . 23<br />

2.5.3 Anwendung . . . . . . . . . . . . . . . . . . . . . 24<br />

3 Netzmodellierung und Netzberechnung 27<br />

3.1 Domänenanalyse ...................... 27<br />

3.1.1 Lastfluss-Applikation . . . . . . . . . . . . . . . . 28<br />

I<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


II INHALTSVERZEICHNIS<br />

3.1.2 Modellierung von Netzelementen . . . . . . . . . 29<br />

3.1.3 Zusammenschaltbarkeit der Netzelemente . . . . . 31<br />

3.1.4 Lösungsverfahren . . . . . . . . . . . . . . . . . . 33<br />

3.1.5 Netzgleichungen . . . . . . . . . . . . . . . . . . 36<br />

3.2 Domänenmodell....................... 51<br />

3.2.1 Netz und Entitäten ................. 51<br />

3.2.2 Anschluss . . . . . . . . . . . . . . . . . . . . . . 52<br />

3.2.3 Variable . . . . . . . . . . . . . . . . . . . . . . . 53<br />

3.2.4 Parameter . . . . . . . . . . . . . . . . . . . . . . 54<br />

3.2.5 Ntor . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />

3.2.6 Summengeber . . . . . . . . . . . . . . . . . . . 56<br />

3.3 Funktionalität des Domänenmodells ............ 57<br />

3.3.1 Netzaufbau . . . . . . . . . . . . . . . . . . . . . 57<br />

3.3.2 Netzberechnung . . . . . . . . . . . . . . . . . . 57<br />

3.3.3 Resultat-Anzeige . . . . . . . . . . . . . . . . . . 58<br />

3.4 Beispiel ........................... 58<br />

4 Framework 63<br />

4.1 Einleitung.......................... 63<br />

4.2 Anwendungsbereich . . . . . . . . . . . . . . . . . . . . 64<br />

4.3 Implementation des Domänen-Modells........... 64<br />

4.4 Netzmodellierung . . . . . . . . . . . . . . . . . . . . . . 66<br />

4.5 Newton-Raphson-Netzberechnung . . . . . . . . . . . . . 67<br />

4.5.1 Beitrag des lokal definierten Verhaltens . . . . . . 67<br />

4.5.2 Konzeption der Operationen . . . . . . . . . . . . 69<br />

4.5.3 Aufgabenverteilung auf Klassen . . . . . . . . . . 70<br />

4.5.4 Lösen des linearen Gleichungssystems . . . . . . . 75<br />

4.6 Programmier-Schnittstellen (API) . . . . . . . . . . . . . 77<br />

4.7 Implementation....................... 78<br />

4.7.1 C++ . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />

4.7.2 Bibliotheken . . . . . . . . . . . . . . . . . . . . 79<br />

5 Domänen-Architektur 81<br />

5.1 Einleitung.......................... 81<br />

5.2 Sichten ........................... 83<br />

5.2.1 Architekturebenen . . . . . . . . . . . . . . . . . 83<br />

5.2.2 Dienste . . . . . . . . . . . . . . . . . . . . . . . 83<br />

5.2.3 Variabilität innerhalb der Dienste . . . . . . . . . 86<br />

5.3 Architektur-Elemente.................... 86<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


INHALTSVERZEICHNIS III<br />

5.3.1 Domänenmodell .................. 88<br />

5.3.2 Spezifikationselement . . . . . . . . . . . . . . . 89<br />

5.3.3 Spezifikationsdaten . . . . . . . . . . . . . . . . . 89<br />

5.3.4 Adaption . . . . . . . . . . . . . . . . . . . . . . 89<br />

5.3.5 Framework . . . . . . . . . . . . . . . . . . . . . 89<br />

5.3.6 Zusammensetzung des Frameworks . . . . . . . . 90<br />

5.4 Implementation....................... 90<br />

5.4.1 Spezifikationselement . . . . . . . . . . . . . . . 92<br />

5.4.2 Spezifikationsdaten . . . . . . . . . . . . . . . . . 93<br />

5.4.3 Adaption . . . . . . . . . . . . . . . . . . . . . . 94<br />

5.4.4 Zusammensetzung des Frameworks . . . . . . . . 95<br />

5.5 Adaption des Dienstes Netzberechnung . . . . . . . . . . 98<br />

5.5.1 Spezifikation . . . . . . . . . . . . . . . . . . . . 98<br />

5.5.2 Spezifikationsdaten . . . . . . . . . . . . . . . . . 102<br />

5.5.3 Adaption . . . . . . . . . . . . . . . . . . . . . . 102<br />

5.5.4 Aufbau eines Lastfluss-Programms . . . . . . . . 107<br />

5.6 Adaption des Dienstes Netzaufbau . . . . . . . . . . . . . 108<br />

5.6.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . 108<br />

5.6.2 Problembeschreibung . . . . . . . . . . . . . . . . 110<br />

5.6.3 Analyse eines konkreten Tauschformates . . . . . 111<br />

5.6.4 Spezifikation . . . . . . . . . . . . . . . . . . . . 116<br />

5.6.5 Spezifikationsdaten . . . . . . . . . . . . . . . . . 120<br />

5.6.6 Adaption . . . . . . . . . . . . . . . . . . . . . . 120<br />

5.6.7 Diskussion der Lösung............... 123<br />

5.7 Richtlinien fürdieBenutzung................ 124<br />

5.7.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . 124<br />

5.7.2 Anpassung durch den Klienten . . . . . . . . . . . 125<br />

5.7.3 Vorgehen bei Änderung eines Dienstes . . . . . . 127<br />

5.7.4 Erweiterung des Frameworks . . . . . . . . . . . . 127<br />

6 Fallstudien 129<br />

6.1 Lastfluss in kartesischen Koordinaten . . . . . . . . . . . 132<br />

6.1.1 Spezifikation der Ntor-Typen . . . . . . . . . . . . 132<br />

6.1.2 Spezifikation der Summengeber-Typen . . . . . . 135<br />

6.2 Lastfluss in polaren Spannungskoordinaten . . . . . . . . 135<br />

6.2.1 Spezifikation der Ntor-Typen . . . . . . . . . . . . 135<br />

6.2.2 Spezifikation der Summengeber-Typen . . . . . . 137<br />

6.3 Wechselstrom-Lastfluss mit Austauschgebiet . . . . . . . 137<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


IV INHALTSVERZEICHNIS<br />

6.3.1 Modellierung eines Austauschgebietes . . . . . . . 139<br />

6.3.2 Spezifikation der Ntor-Typen . . . . . . . . . . . . 139<br />

6.3.3 Spezifikation der Summengeber-Typen . . . . . . 141<br />

6.4 Lineare Netzberechnung . . . . . . . . . . . . . . . . . . 141<br />

6.5 DC-Lastfluss ........................ 144<br />

6.5.1 Spezifikation der Ntor-Typen . . . . . . . . . . . . 145<br />

6.5.2 Spezifikation der Summengeber-Typen . . . . . . 146<br />

6.6 Resultate .......................... 146<br />

6.6.1 Herstellung des Simulationsprogramms . . . . . . 146<br />

6.6.2 CPU-Zeiten und Speicherbedarf . . . . . . . . . . 147<br />

6.6.3 Charakteristik der Software-Entwicklung . . . . . 149<br />

7 Schlussbetrachtung 151<br />

7.1 Zusammenfassung ..................... 151<br />

7.2 Ergebnisse.......................... 153<br />

A Umformung der Ntor-Gleichungen 155<br />

A.1 Modellierung der Ntore . . . . . . . . . . . . . . . . . . . 155<br />

A.2 Kirchhoff-Knoten . . . . . . . . . . . . . . . . . . . . . . 156<br />

A.3 Darstellung aller Gleichungen eines Netzes . . . . . . . . 157<br />

B IEEE Common Data Format 159<br />

C Stichwortverzeichnis 163<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Kapitel 1<br />

Einleitung<br />

1.1 Motivation<br />

Simulation ist heute eine unerlässliche Technik für die Analyse von<br />

Energieversorgungssystemen, um seine aktuelle und zukünftige Leistungsfähigkeit,<br />

Zuverlässigkeit und Anpassungsmöglichkeiten an neue<br />

betriebliche Anforderungen zu überprüfen. Dabei werden aufgrund eines<br />

passenden Modells Vorgänge nachgebildet und auf dem Computer berechnet.<br />

Die Resultate verhelfen zu einem rascheren Verständnis eines Problems<br />

und ermöglichen eine Beurteilung von Hypothesen. Zur Zeit löst<br />

beispielsweise die Liberalisierung des Strommarktes eine Reihe von neuen<br />

Fragestellungen aus.<br />

Simulations-Systeme werden tendenziell grösser und komplizierter, da<br />

immer mehr Zusammenhänge zu anderen Wissensgebieten, wie z.B. der<br />

Ökonomie, zu berücksichtigen sind. Neben der Komplexität, die hauptsächlich<br />

von der Typenvielfalt und der Parametrierbarkeit herrührt, erschwert<br />

die fehlerträchtige Kodierung der Algorithmen Entwicklung und<br />

Wartung solcher Systeme.<br />

Als Folge davon wird es immer schwieriger, Software rechtzeitig auf<br />

den Markt zu bringen und innerhalb budgetierter Kosten zu entwickeln.<br />

Gemäss [1] liegen heute 90 % vom Entwicklungsaufwand von Produkten,<br />

die auf einem Rechner basieren, bei der Software. Deren Entwicklungszeitdauer<br />

bestimmt letztlich den Preis und den Zeitpunkt der Marktreife.<br />

Es ist schwierig geworden, diese neuen Anwendungen mit traditionellen<br />

Software- Entwicklungshilfsmitteln aufzubauen und zu unterhalten. In<br />

konventionellen Sprachen wie Fortran, Pascal oder C entwickelte Systeme<br />

weisen eine starke Koppelung zwischen den Datenstrukturen und den<br />

Algorithmen auf. Typischerweise erstreckt sich ein Algorithmus über ein<br />

1<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


2 KAPITEL 1. EINLEITUNG<br />

Programm. Ein Algorithmus greift an vielen Stellen auf Variablen zu, deren<br />

Typen durch geeignete Datenstrukturen vorgegeben werden. Kleine<br />

Änderungen können sich daher auf ein ganzes Programm auswirken. Der<br />

Programmieraufwand ist nicht wie gewünscht proportional zur Änderung,<br />

sondern wegen der verteilten Abhängigkeiten eher proportional zur Grösse<br />

des Programms. Dieser unerfreulichen Situation kann man zwar mit Modularisierung<br />

und genormten Schnittstellen-Standards begegnen. Neben<br />

dem Zeit- und Koordinationsaufwand der Schnittstellen-Normierung erhebt<br />

sich aber stets die Frage, was denn ein Modul beinhalten soll. Damit<br />

Module allgemein verwendbar sind, tendieren sie dazu, eher klein zu<br />

sein. Unabhängig davon, ob die Module in konventionellem oder in objektorientiertem<br />

Stil entwickelt werden, entstehen daher oft zu feinkörnige<br />

Strukturen. Der sich darin bewegende Software-Entwickler ist gezwungen,<br />

an vielen Orten Entscheidungen zu treffen, wie er diese relativ vielen<br />

und kleinen Teile zusammensetzt und miteinander kommunizieren lässt.<br />

In diesen Entscheidungen liegen Fehlerquellen, welche die Qualität eines<br />

Produktes trotz einwandfreier Module beeinträchtigen.<br />

Neuere Ansätze aus dem Software-Engineering gehen diese Probleme<br />

an, indem sie Techniken bereitstellen, um grobkörnigere und dennoch flexible<br />

Module für eine Klasse von Problemen herzustellen.<br />

1.2 Stand der Technik<br />

Im Folgenden werden einige Lösungs-Ansätze aus der Literatur aufgeführt,<br />

welche einzelne oder mehrere der im Unterkapitel 1.1 dargestellten<br />

Probleme angehen und den Hintergrund der vorliegenden Arbeit bilden.<br />

Die objekt-orientierte Technik hielt bei den Energieübertragungssystemen<br />

etwa Ende der Achtzigerjahre Einzug. In [2] wurde bestätigt, dass<br />

die objekt-orientierte Technik die Flexibilität grosser Software-Systeme<br />

erhöht. Als besonderer Vorteil wurde erkannt, dass Änderungen innerhalb<br />

eines Objektes das restliche System nicht beeinflussen. Dies ist eine wesentliche<br />

Voraussetzung um das Problem der Komplexität der Software in<br />

den Griff zu bekommen. Als weiterer Vorteil wurde gesehen, dass Objekte<br />

gleichermassen physikalische Dinge und abstrakte Ideen in einheitlicher<br />

Art darstellen und dahinter liegende Details verstecken können, was die<br />

Arbeit des Software-Entwicklers wesentlich erleichtert.<br />

In [3] wurde die objekt-basierte Technik in einem graphischen Benutzer-Interface<br />

erprobt, was anfangs das klassische und besonders anschau-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


1.2. STAND DER TECHNIK 3<br />

liche Anwendungsfeld der objekt-orientierten Technik darstellte. Das Objekt<br />

wird unmittelbar durch ein graphisches Symbol am Bildschirm sichtbar,<br />

das man anklicken und dadurch dem dahinterliegenden Objekt Botschaften<br />

schicken kann. Dank der Objektmodellierung und der Vererbungseigenschaft<br />

ist es einfach, ein einheitliches Verhalten eines Benutzer-<br />

Interfaces zu erreichen, was auch für den Endbenutzer ein unmittelbarer<br />

Vorteil ist.<br />

In [4] wird die objekt-orientierte Technik auch in einer numerischen Berechnung<br />

angewendet, die speziell auf das Lastflussproblem zugeschnitten<br />

ist. Damit konnte das den ersten objekt-orientierter Simulationsprogrammen<br />

anhaftende Manko an Rechengeschwindigkeit beseitigt werden. Der<br />

wesentlicher Beitrag von [4] besteht aber darin, ein objekt-orientiertes Simulationsprogramm<br />

so konzipiert zu haben, dass es für einen bestimmten<br />

Bereich von Problemen wiederverwendbar wird.<br />

Bei der Modellierung des elektrischen Netzes besteht ein beträchtlicher<br />

Freiheitsgrad. Modellierung bedeutet grob gesagt, eine geeignete Menge<br />

von Objekten zu definieren. In [5] wird eine Modellierung einer Lastflussrechnung<br />

dargestellt, die sich strikte an physikalischen Objekten, wie<br />

z.B. Schalter, Leitungen, Transformatoren orientiert. Damit strebt man einerseits<br />

Unabhängigkeit von den Algorithmen an und stellt andererseits<br />

das Datenmodell durch eine natürliche und intuitiv einleuchtende Objektwahl<br />

verständlich dar. Diese anwendungsfreundliche und stabile Objektwahl<br />

geht allerdings auf Kosten erhöhter Rechenzeit.<br />

Die Abstraktionsfähigkeit der objekt-orientierten Technik wurde erkannt<br />

und in [6] ausgenutzt, um eine allgemeine Software-Plattform für<br />

Simulationsapplikationen in Netzen zu formulieren. Ein sogenannter generischer<br />

Behälter zur Speicherung und Berechnung von elektrischen Übertragungsnetzen<br />

wird in [6] vorgestellt. Die Wiederverwendung geschieht<br />

in diesem Ansatz dadurch, dass ein Software-Entwickler 1 vorgegebene<br />

Klassen dieses Behälters an seine Bedürfnisse anpasst. Er benötigt dabei<br />

objekt-orientierte Techniken, die in Kapitel 2 beschrieben sind, und ferner<br />

spezielle Spracheigenschaften der Zielsprache (C++) des Behälters.<br />

Das fehlerträchtige Kodieren von Elementen, die bei der Simulationsrechnung<br />

benötigt werden 2 , muss aber immer noch vom Klienten geleistet<br />

werden.<br />

In [7, 8, 9] ist erkannt worden, dass symbolische Rechnungssysteme<br />

1 In der vorliegenden Arbeit als Klient bezeichnet<br />

2 Bei der Lastflussrechnung: Jacobi- und Mismatchterme<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


4 KAPITEL 1. EINLEITUNG<br />

diese fehlerträchtige Arbeit automatisch ausführen können. Dabei wird<br />

das zu simulierende System in mathematischer Darstellung, typischerweise<br />

durch einen Satz von Gleichungen, vorgegeben.<br />

Aufgrund dieser Spezifikationen kann das in [7] vorgestellte, allgemein<br />

verwendbare Werkzeug Simulationen ausführen. Darin erlaubt das symbolische<br />

Verarbeiten der Spezifikationen des Klienten einen sehr hohen<br />

Grad an Anpassungsfähigkeit. Dies kostet aber andererseits viel Verarbeitungszeit,<br />

was insbesondere bei Programmen mit Echtzeitanforderungen<br />

zu Leistungsbegrenzungen führen kann.<br />

Ein etwas anderer Weg wird in [8, 9] vorgeschlagen. Das Simulationsproblem<br />

wird auch hier durch einen flexiblen Satz von Gleichungen<br />

baukasten-förmig vorgegeben. Die symbolische Berechnung verarbeitet<br />

diese Eingabe und erzeugt daraus einen Quelltext, der in einer numerischen<br />

Rechenumgebung zur effizienten Lösung von Gleichungssystemen<br />

abgearbeitet wird.<br />

Es bleibt noch das Problem bestehen, dem Klienten eine grobkörnigere<br />

und dennoch flexible Struktur zur Wiederverwendung anbieten zu können.<br />

Die Ansätze [4] und [6] gehen bereits in diese Richtung, indem sie ein Design<br />

von zusammenwirkenden und anpassbaren Objekten als generische<br />

Lösung für eine Reihe von Problemen vorsehen. Dies ist eine Möglichkeit,<br />

um ein Design einer Lösung zu beschreiben und wiederzuverwenden. Diese<br />

Technik wird in [10] in einem sogenannten Applikations-Framework 3<br />

ausserhalb der elektrischen Energieübertragung dargestellt. In [11] wird<br />

mit Hilfe der Framework-Technik ein Werkzeug für Unterhalt, Training<br />

und Dokumentationserstellung und Fehleranalyse für EMS instantiiert.<br />

Das Framework befreit den Klienten jedoch noch nicht vom fehlerträchtigen<br />

Kodieren von Elementen. Es braucht nochmals einen grösseren<br />

Rahmen, der die einzelnen Elemente (Software-Komponente und mathematische<br />

Spezifikation) in einer kohärenten Art zusammenbringt und ihre<br />

Konsistenz sicherstellt. In [12] und [13] wird dieser grössere Rahmen als<br />

Architektur bezeichnet und eingehend dargestellt.<br />

1.3 Ziel der Arbeit<br />

Das Ziel dieser Arbeit ist, den Klienten beim Herstellen neuer Simulations-Applikationen<br />

4 von elektrischen Energieübertragungssystemen zu un-<br />

3 Siehe Kapitel 2<br />

4 In der Arbeit als Applikation abgekürzt<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


1.4. AUFBAU DER ARBEIT 5<br />

terstützen. Sie soll ihm helfen, neue Applikationen auf qualitativ hohem<br />

Niveau zu entwickeln. Dies bedeutet:<br />

• Erstellung von korrektem Code, insbesondere bei abgeleiteten Termen,<br />

• gute Rechenzeiteffizienz verglichen mit der Codierung von Hand und<br />

• Beibehalten der Eigenschaft der Schwachbesetztheit.<br />

Ferner sollen Konzepte gefunden werden, die dem Klienten helfen, neue<br />

Applikationen mit hoher Produktivität zu entwickeln. Dies bedeutet:<br />

• wiederverwendbare Lösung für eine wichtige Klasse von Simulationsproblemen<br />

in Netzen,<br />

• Leichte und schnelle Anpassung an neue Modelle,<br />

• Förderung der Transparenz, um den Entwicklungsprozess und die<br />

Bausteine verständlicher und leichter kommunizierbar zu machen,<br />

• Vereinfachte Umstellung auf eine neue Zielsprache.<br />

Dazu sollen Konzepte der objekt-orientierten Technik zusammen mit<br />

Erkenntnissen des Software-Engineerings und der Netzmodellierung benutzt<br />

werden, um den Software-Entwicklungsprozess zu beschleunigen.<br />

Das Produkt dieser Arbeit ist eine wiederverwendbare Software-Komponente<br />

und ein dazu passender Rahmen5 , wie dies in [14] zusammenfassend<br />

dargestellt ist. Innerhalb dieses Rahmens adaptiert der Klient diese<br />

Software-Komponente, um sie schliesslich in seiner Applikation einbauen<br />

zu können. Die Software-Komponente soll den Klienten von Design- und<br />

Programmierarbeit befreien, die er in vielen Simulationsprogrammen im<br />

Bereich der elektrischen Energieübertragung ansonsten erneut zu leisten<br />

hätte. Gemeint ist dabei die Klasse von Problemen, bei denen es vernetzbare<br />

Entitäten mit einem Verhalten gibt, das auf nicht-lineare Gleichungssysteme<br />

führt.<br />

1.4 Aufbau der Arbeit<br />

Diese Arbeit ist wie folgt gegliedert: Zuerst wird die Problematik beim<br />

Entwickeln neuer Simulations-Software dargelegt. Ferner werden einige<br />

bekannte Vorgehensweisen angeführt.<br />

5 Dies ist die in Kapitel 5 beschriebene Domänen-Architektur<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


6 KAPITEL 1. EINLEITUNG<br />

Kapitel 6 Kapitel 5 Kapitel 4<br />

Fallstudien Domänen-Architektur<br />

Framework<br />

Kapitel 2<br />

Konzepte des<br />

Software-Engineerings<br />

Kapitel 3<br />

Netzmodellierung<br />

Netzberechnung<br />

Abbildung 1.1: Kapitel und Beziehungen<br />

: A benutzt / benötigt B<br />

Das Kapitel 2 erläutert Begriffe und Konzepte des Software-Engineerings<br />

und insbesondere der objekt-orientierten Technologie. Im Kapitel 3<br />

wird die Netzberechnung und -modellierung nach dem Ntor-Ansatz und<br />

ein darauf basiertes objekt-orientiertes Netzmodell vorgestellt. Darauf<br />

bauen die beiden Hauptkapitel 4 und 5 auf.<br />

Das Kapitel 5 beschreibt den Rahmen zur Adaption und Wiederverwendung<br />

des Frameworks. Das Kapitel 4 beschreibt die Software-<br />

Komponente, die in dieser Arbeit als Framework bezeichnet wird.<br />

Es bildet den hart-codierten Kern der in dieser Arbeit formulierten<br />

Netzberechnungs-Software.<br />

Im Kapitel 6 wird gezeigt, wie die Software-Komponente an konkrete<br />

Simulationsprobleme aus dem Bereich der elektrischen Energieübertragungssysteme<br />

adaptiert werden kann.<br />

Abbildung 1.1 zeigt die Abhängigkeiten zwischen den Kapiteln. Damit<br />

ist ersichtlich, in welcher Reihenfolge Begriffe und Konzepte festgelegt<br />

und verwendet werden. <strong>Eine</strong> weitere Lesehilfe bietet ein Stichwortverzeichnis<br />

im Anhang dieser Arbeit.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

A<br />

B


Kapitel 2<br />

Konzepte des Software-Engineering<br />

2.1 Einleitung<br />

Die vielversprechenden Ansätze, um die Ziele der vorliegenden Arbeit zu<br />

erreichen, stammen aus dem Gebiet des Software-Engineerings. In Abbildung<br />

2.1 sind relevante Begriffe aus diesem Teilgebiet aufgezeigt.<br />

Seit Ende der Sechzigerjahre hat man in der Wiederverwendung bereits<br />

geschriebener Softwareteile grosses Potential gesehen, um Kosten<br />

und Aufwand bei der Entwicklung von Software einzusparen. Man erwartete<br />

signifikante Produktivitäts- und Qualitätsverbesserungen.<br />

Innerhalb des Software-Engineerings ist daher das Teilgebiet Wiederverwendung<br />

entstanden. Es beschäftigt sich neben anderen Aspekten mit<br />

der Frage, wie man wiederverwendbare Software herstellt. Es gibt viele<br />

verschiedene Techniken, wovon einige nie über das Stadium von Forschungsprototypen<br />

hinauskamen, weil ihre Anwendung in der Praxis zu<br />

kompliziert erschien. In [13] wurde 1994 festgehalten, dass die hohen Erwartungen<br />

an die Wiederverwendung von Software nicht auf der ganzen<br />

Linie erfüllt wurden.<br />

Es zeigte sich aber, dass die Wiederverwendung unter gewissen Einschränkungen<br />

den Erwartungen gerecht werden kann.<br />

Man hat erkannt, dass die Wiederverwendung innerhalb von Familien<br />

von ähnlichen Programmen gewinnbringend sein kann. Das Wissensgebiet<br />

des Domänen-Engineerings baut genau auf dieser Erkenntnis auf und konzentriert<br />

sich auf den Bau wiederverwendbarer Software innerhalb eines<br />

klar begrenzten Anwendungsgebietes, eben einer Domäne 1 .<br />

Der für diese Arbeit wichtige Beitrag des Domänen-Engineerings ist<br />

1 <strong>Eine</strong> Domäne ist laut [15] “a distinct functional area that can be supported by a class of software<br />

systems with similar requirements and capabilities.”<br />

7<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


8 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

Domänen-<br />

Modell<br />

benutzt<br />

Objekt-orientierte<br />

Technologie<br />

SW-Engineering<br />

benutzt<br />

ist Teilgebiet von<br />

Wiederverwendung<br />

Domänen-<br />

Engineering<br />

ist Teilgebiet von<br />

benutzt<br />

benutzt<br />

Domänen-<br />

Architektur<br />

hat<br />

Generisches<br />

Design<br />

ist ein<br />

Framework<br />

Legende:<br />

Alternativen<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

A<br />

B<br />

andere Teilgebiete<br />

ist Teilgebiet von<br />

heisst:<br />

B ist Teilgebiet von A<br />

Abbildung 2.1: Begriffe aus der Software-Technologie<br />

die Erkenntnis, dass eine Familie von Software-Produkten mit Hilfe eines<br />

Domänenmodells 2 und einer Domänen-Architektur 3 formalisierbar ist.<br />

Beide Beiträge werden in diesem Kapitel dargestellt.<br />

Die objekt-orientierte Programmtechnik hat sich als hilfreich erwiesen,<br />

einerseits das Domänenmodell und andererseits das von der Domänen-<br />

Architektur geforderte generische Design zu beschreiben.<br />

2.2 Software-Wiederverwendung<br />

Unter Wiederverwendung versteht man ein Entwicklungsvorgehen, bei dem<br />

neue Applikationen auf bereits existierender Software aufgebaut werden,<br />

und das generell darauf abzielt, Codevervielfachung zu vermeiden, indem<br />

Gemeinsamkeiten in grundsätzlich ähnlichen Aufgaben systematisch genutzt<br />

werden. Dabei werden nicht nur Programm-Code, sondern mit steigendem<br />

Nutzen Programm-Design und Anforderungen wiederverwendet.<br />

Wiederverwendbarkeit ist keine inhärente Eigenschaft von Software.<br />

Gemeint ist daher nicht das ad-hoc Verfahren nach dem Muster von Copy-<br />

Paste-Modify.<br />

2Ein Domänenmodell ist laut [15] “a product of an analysis of a domain which provides a representation<br />

of the requirements of the domain.”<br />

3<strong>Eine</strong> Domänen-Architektur ist laut [15] “a generic, organizational structure or design for software<br />

systems in a domain.”


2.2. SOFTWARE-WIEDERVERWENDUNG 9<br />

Systematische Wiederverwendung muss geplant sein [16, 17]. Sie entsteht<br />

auch nicht einfach dadurch, dass z.B. eine bestimmte Programmiertechnik,<br />

wie die objekt-orientierte Technik angewendet wird. Unter systematischer<br />

Wiederverwendung versteht man eine Softwareentwicklung, die<br />

durch den geplanten Einsatz von Erzeugnissen des Domänen-Engineerings,<br />

wie dem Domänenmodell, der Domänen-Architektur und weiterer Software-Komponenten<br />

in aufeinanderfolgenden Phasen des Software-Engineering-Prozesses<br />

gekennzeichnet ist [15].<br />

2.2.1 Erwartungen an die Wiederverwendung<br />

Von der Wiederverwendung verspricht man sich folgenden Nutzen:<br />

• Weniger Entwicklungs- bzw. Wartungsaufwand: Weniger Zeitbedarf<br />

und tiefere Kosten bei der Spezifikation, dem Design, der Codierung<br />

und Fehlersuche, da bereits eine entwickelte Software-Komponente<br />

verwendet wird. Je häufiger diese verwendet wird, und je grösser<br />

eine Software-Komponente ist, desto grösser ist der Nutzen.<br />

• Reduktion des Wartungungsaufwand: In [13] wird von einem Wartungsaufwand<br />

4 heutiger Software-System von 67 % ausgegangen. Es<br />

kann gezeigt werden, dass die gleichen Entwicklungsziele, die zur<br />

Verbesserung der Wiederverwendbarkeit führen, auch die Wartbarkeit<br />

und Portierbarkeit eines Software-Systems fördern [13].<br />

• Erhöhung der Softwarequalität: Mehrfache Anwendung erhöht die<br />

Wahrscheinlichkeit, dass Fehler gefunden werden und zu einer laufenden<br />

Verbesserung einer Software-Komponente führen.<br />

2.2.2 Grundlegende Ansätze<br />

Auf der Stufe einer Software-Komponente unterscheidet man zwischen<br />

dem Black-Box-Ansatz und dem White-Box-Ansatz der Wiederverwendung.<br />

Beim Black-box-Ansatz werden grobkörnige und möglicherweise parametrierbare<br />

Komponenten ohne Änderungen in ein neues System eingebaut.<br />

Beim White-box-Ansatz werden feinkörnige und möglicherweise parametrierbare<br />

Komponenten mit Änderungen in ein neues System eingebaut.<br />

Der White-box-Ansatz ist flexibler. Er hat aber den Nachteil, dass wegen<br />

4 gemeint ist der Aufwand für die Fehlerbehebung und für Erweiterungen der Funktionalität<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


10 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

der Feinkörnigkeit eine grössere Menge von Komponenten entsteht. Ferner<br />

müssen einem Klienten, der solche Komponenten einsetzt, nebst Angaben<br />

über die Schnittstelle weitere Informationen angegeben werden. Diese betreffen<br />

z.B. den Sichtbarkeitsbereich und die Bedeutung von Variablen und<br />

Funktionen innerhalb einer solchen Komponente.<br />

Ferner unterscheidet man zwischen horizontaler und vertikaler Wiederverwendung.<br />

Vertikale Wiederverwendung kennzeichnet die Wiederverwendung<br />

von Software-Komponenten innerhalb einer bestimmten Domäne.<br />

Neben dem Programmcode lassen sich auch die Spezifikation und das Design<br />

von Programmen auf einen neuen Anwendungsfall übertragen. In der<br />

vorliegenenden Arbeit liegt der Schwerpunkt daher auf der vertikalen Wiederverwendung.<br />

Horizontale Wiederverwendung ist unabhängig von der Domäne. Ein<br />

Beispiel dafür sind Klassenbibliotheken von allgemeinem Charakter, wie<br />

etwa die Dienste eines Betriebssystems, mathematische Funktionen oder<br />

graphische Benutzerschnittstellen. Horizontale Wiederverwendung wird<br />

heute verbreitet praktiziert.<br />

In der vorliegenden Arbeit kommen alle Ansätze der Wiederverwendung<br />

nebeneinander vor. Software-Komponenten mit domänen-unabhängigem,<br />

mathematischem Charakter folgen dem Black-Box-Ansatz. Hier liegt<br />

horizontale Wiederverwendung vor. Die Bausteine des Domänenmodells<br />

von Kapitel 3 hingegen müssen sehr flexibel konzipiert sein. Daher wird<br />

bei ihnen der White-Box-Ansatz angewendet. Die Simulations-Funktionalität<br />

wird als generisches Design beschrieben und in vertikaler Wiederverwendung<br />

genutzt.<br />

2.2.3 Hindernisse<br />

Die wesentlichen Hindernisse, die bei der Wiederverwendung auftreten<br />

sind:<br />

• Auf der Seite des Klienten:<br />

– Finden einer geeigneten Komponente<br />

– Verstehen einer Komponente<br />

– “Not invented here” Syndrom5 • Auf der Seite des Anbieters oder eines Entwicklungsleiters:<br />

5 Gemeint ist das Misstrauen, ein fremdes und ungenügend dokumentiertes Produkt zu verwenden, bei<br />

dem man nicht genau weiss, was es tut und welche Seiteneffekte es dabei produziert.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


2.2. SOFTWARE-WIEDERVERWENDUNG 11<br />

– Schwierigkeit beim Herausfinden, welche Komponenten wiederverwendbar<br />

sind. Dies bedeutet, Gemeinsamkeiten in verschiedenen<br />

Anwendungen zu erkennen, zu klassifizieren und zu beschreiben.<br />

– Mangelnde Standardisierung der Komponenten<br />

– Fehlende Entwicklungswerkzeuge zur Herstellung wiederverwendbarer<br />

Komponenten<br />

– Kosten Nutzen-Frage: Rechtfertigung von Initialkosten und Mehraufwand<br />

für die Herstellung einer Komponente<br />

– Rechtliche Fragen, Schutz von geistigem Eigentum<br />

<strong>Eine</strong> Schwierigkeit einer wiederverwendbaren Komponente ist deren Abgeschlossenheit<br />

(Black-Box). Damit lässt sie sich nachträglich nicht problemlos<br />

an neue Anforderungen anpassen. Meyer [18] formuliert daher<br />

das Open-Closed-Prinzip, das folgende wünschenswerte Eigenschaften<br />

einer wiederverwendbaren Software-Komponente festhält:<br />

• <strong>Eine</strong> Software-Komponente ist offen, wenn sie nachträglich erweitert<br />

werden kann, ohne dass ihr Quelltext geändert werden muss oder existierende<br />

Klienten davon betroffen werden. Mögliche Erweiterungen<br />

sind das Hinzufügen von neuen Elementen zu Datenstrukturen oder<br />

das Hinzufügen von zusätzlichen Funktionen.<br />

• <strong>Eine</strong> Software-Komponente ist abgeschlossen, wenn sie mit einer<br />

klar definierten Schnittstelle in einer Bibliothek für die Wiederverwendung<br />

zur Verfügung gestellt wird.<br />

Diebeidenansichgegensätzlichen Wünsche werden deutlicher, wenn man<br />

zwischen Schnittstelle und Implementierung einer Software-Komponente<br />

unterscheidet. Der Klient möchte eine stabile d.h. abgeschlossene Schnittstelle<br />

zu Software-Komponenten. Als Anbieter wiederverwendbarer Software-Komponenten<br />

möchte man zulassen, dass die Schnittstellen, wie in<br />

Abbildung 2.2 dargestellt, von verschiedenen Klienten in verschiedenen<br />

Varianten implementiert werden können. Dabei soll es die Klienten nicht<br />

betreffen, wenn verschiedene Varianten aus einer benutzten Software--<br />

Komponente gebildet werden.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


12 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

Klient 1<br />

ändert um<br />

Δ<br />

1<br />

Δ 1<br />

Wiederverwendbare Komponente<br />

keine Beeinflussung<br />

Klient 2<br />

ändert um<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Δ 2<br />

Klient 1 Klient 2<br />

Δ 2<br />

Abbildung 2.2: Anwendung des Open-Closed-Prinzips<br />

Kompositions<br />

basiert<br />

Programm-generierende<br />

Systeme<br />

Erzeugungs<br />

basiert<br />

Sprach Transformations<br />

basiert basiert<br />

Applikations-<br />

Generator<br />

Abbildung 2.3: Prinzipielle Vorgehensweisen zur Herstellung von Programmen nach [17]<br />

2.2.4 Techniken<br />

In [17] werden, wie in Abbildung 2.3 dargestellt, verschiedene Vorgehensweisen<br />

zur Herstellung von neuen Programmen durch Wiederverwendung<br />

unterschieden. Darin werden nicht nur Quelltext, sondern noch gewinnbringendere<br />

Teile wie Domänen-Wissen und Programmdesign wiederverwendet.<br />

In existierenden Systemen ist aber keine der genannten Vorgehensweisen<br />

in reiner Form umgesetzt. Die Systeme stellen eher Mischformen<br />

dar.<br />

Kompositions-basierte Systeme basieren auf der Wiederverwendung von<br />

atomaren Software-Komponenten (Black-Box-Ansatz). Solche Systeme<br />

benötigen Wissen, wie man eine passende Komponente für Teilaufgaben<br />

findet. <strong>Eine</strong> weitere Aufgabe besteht darin, diese Komponenten zu einem<br />

lauffähigen Programm zu verknüpfen.<br />

In erzeugungs-basierten Systemen ist es viel schwieriger, wiederverwendete<br />

Komponenten zu identifizieren. Das wiederverwendete Wissen


2.2. SOFTWARE-WIEDERVERWENDUNG 13<br />

steckt in der Struktur des Programms, das neue Programme erzeugt. Ein<br />

primitiver Vertreter dieser Vorgehensweise ist das Programmgerüst, das<br />

von einem Klienten bei Bedarf angepasst wird.<br />

Sprach-basierte, generierende Systeme bauen auf einer wohldefinierten<br />

Sprachkonstruktion auf, welche eine Domäne beschreibt. <strong>Eine</strong> solche<br />

Sprache ist weit mehr als nur eine Befehlszeile zur Steuerung eines Programmgenerators.<br />

Ein wesentlicher Vorteil für den Klienten besteht darin,<br />

dass die Sprache von Einzelheiten der Implementation abstrahiert. Als besondere<br />

Herausforderung beim Bau solcher Systeme gilt es jedoch, eine<br />

effiziente Implementation der Sprache zu finden.<br />

Transformations-basierte Systeme bestehen grob gesehen aus einer Folge<br />

von Transformationen, welche eine Grundvariante einer Programmfamilie<br />

beschreibt. Ein Klient passt diese Grundvariante neuen Bedürfnissen<br />

an, indem er einige Transformationen ersetzt und die geänderte Folge von<br />

Transformationen erneut “abspielt”, um das neue Programm zu erzeugen.<br />

Applikations-Generatoren enthalten Muster, die beim Erzeugen spezifischer<br />

Instanzen eines Zielsystems wiederverwendet werden. Ein Muster<br />

stellt dabei das Gemeinsame der erzeugten Instanzen dar. Ein Muster<br />

ist wesentlich flexibler als eine atomare Software-Komponente beim<br />

kompositions-basierten Vorgehen. Der variable Teil einer Applikationsfamilie<br />

wird aus geeigneten Eingabe-Daten erzeugt und im Applikations-<br />

Programm eingebaut. Als Vertreter eines Applikations-Generators wird<br />

DRACO [19] eingestuft, wobei auch dieses System sprach- und transformations-basierte<br />

Eigenschaften enthält.<br />

Den vorgestellten Systemen ist gemeinsam, dass sie neben Quell-Code<br />

auch Domänenwissen und Programmdesign wiederverwenden, um daraus<br />

neue Programme zu erzeugen. Dazu muss unabhängig von der Technik<br />

stets ein System zueinander passender und teilweise voneinander abhängiger<br />

Elemente organisiert werden.<br />

Dies geschieht innerhalb einer zu erarbeitenden, spezifischen Architektur<br />

6 .<br />

6 <strong>Eine</strong> Architektur ist laut [15]:<br />

“1. a organizational structure of a system or asset<br />

2. the structure of components, their interrelationships, and the principles and guidelines governing their<br />

design and evolution over time”<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


14 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

Domänen-Engineering<br />

Das Domänen-Engineering betreibt vertikale Wiederverwendung. Es beschränkt<br />

sich darauf, Software-Komponenten 7 zu bauen. Auch hier ist die<br />

Architektur als Beschreibungsmittel eines Systems von zentraler Bedeutung.<br />

In [12]: “We strongly believe that architecture is the enabling technology<br />

that brings together the elements (...) in a coherent approach”. Der<br />

Architektur-Begriff wird jedoch auf eine Domäne eingeschränkt. Es gelten<br />

die spezialisierten Begriffe Domänen-Architektur und Domänenmodell.<br />

Zentraler Ausgangspunkt für den Bau einer wiederverwendbaren Software-Komponente<br />

ist das Herausfinden eines Domänenmodells. Dies ist<br />

das Ergebnis einer Domänen-Analyse, bei der Gemeinsamkeiten und Unterschiede<br />

zwischen Systemen einer Domäne erfasst werden. Ein Domänen-<br />

Modell enthält folgende Angaben:<br />

• Gültigkeitsbereich und Funktionalität der Domäne<br />

• Information über die Entitäten<br />

• Faktoren, die zu Variationen führen<br />

Die Domänen-Architektur ist eine generische Struktur (Design), zur Organisation<br />

von Elementen eines Systems innerhalb einer Domäne. <strong>Eine</strong><br />

Domänen-Architektur enthält:<br />

• die Struktur<br />

• die gemeinsamen Elemente<br />

• den Kommunikations-Mechanismus zwischen Elementen<br />

• die Richtlinien für die Benutzung und Weiterentwicklung der Domänen-Architektur<br />

Die Domänen-Architektur liefert daher einen Bezugsrahmen für die<br />

Herstellung von Software-Komponenten einer Domäne.<br />

Objekt-orientierte Technologie<br />

Wie einleitend bemerkt, reicht die objekt-orientierte Technologie nicht aus,<br />

um alleine eine systematische Wiederverwendung zu ermöglichen. Hingegen<br />

kann sie wesentliche Beiträge leisten:<br />

7 gemeint sind Programme oder Teile, die in Programmen eingebaut werden<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


2.3. BEGRIFFE DER OBJEKT-ORIENTIERTEN PROGRAMMIERUNG 15<br />

konventionell objekt-orientiert Methoden<br />

Zugriffe<br />

Funktionen<br />

Daten<br />

ein Objekt:<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Zugriffe<br />

Attribute<br />

Abbildung 2.4: Funktionales und objekt-orientiertes Vorgehen<br />

• bei der Beschreibung eines Domänenmodells<br />

• bei der Beschreibung eines Programm-Designs mit Hilfe eines objekt-orientierten<br />

Frameworks (siehe Seite 21)<br />

Die wichtigste Errungenschaft der objekt-orientierten Programmierung ist<br />

die direkte Unterstützung des Open-closed-Prinzips durch entsprechende<br />

Sprachkonstrukte [10]. Die Begriffe und wesentliche Beiträge der objektorientierten<br />

Technologie werden im Kapitel 2.3 dargestellt.<br />

2.3 Begriffe der objekt-orientierten Programmierung<br />

In diesem Unterkapitel werden die Grundbegriffe der objekt-orientierten<br />

Programmierung wie Objekt, Klasse, Methode und Attribut festgelegt, um<br />

einen einheitlichen Sprachgebrauch sicherzustellen. Es stellt keine umfassende<br />

Einführung in das Gebiet der objekt-orientierten Entwicklung dar.<br />

<strong>Eine</strong> umfassende Einführung bietet [20].<br />

2.3.1 Objekt<br />

In der Abbildung 2.4 wird der grundsätzliche Unterschied zwischen der<br />

funktionalen und der objekt-orientierten Vorgehensweise dargestellt. Neben<br />

den unterschiedlichen Namen an sich gleichartiger Elemente fällt ihre<br />

unterschiedliche Anordnung auf. So klein dieser Unterschied auch erscheinen<br />

mag, so gross sind die Auswirkungen, wie weiter unten noch gezeigt<br />

wird. <strong>Eine</strong> wichtige Änderung ist, dass eine Menge von Funktionen,<br />

Daten und Zugriffen in der objekt-orientierten Welt immer innerhalb eines<br />

Objekt zusammengefasst wird. Software-Systeme bestehen beim objekt-orientierten<br />

Vorgehen daher stets aus einer Menge interagierender Objekte.<br />

Dabei gilt die in Tabelle 2.1 dargestellte Begriffs-Korrespondenz:


16 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

funktional objekt-orientiert<br />

Funktionen Methoden<br />

Daten Attribute<br />

Tabelle 2.1: Begriffs-Korrespondenz<br />

Die Zugriffe zwischen Funktionen und Daten werden dabei gewissermassen<br />

in das Innere eines Objektes gestülpt und sind ausserhalb eines Objektes<br />

nicht mehr sichtbar.<br />

Beim funktionalem (konventionellem) Vorgehen liegt der Schwerpunkt<br />

auf der Spezifikation und Dekomposition der Systemfunktionalität. Dieser<br />

Ansatz mag als der effektivere Weg erscheinen, ein gewünschtes Ziel<br />

zu implementieren. Das resultierende System ist aber in der Regel anfälliger<br />

für umfangreiche Restrukturierungen, falls es an neue Anforderungen<br />

anzupassen ist.<br />

Bei der objekt-orientierten Vorgehensweise zielt man hingegen zuerst<br />

darauf ab, Objekte einer Anwendungs-Domäne zu identifizieren, und diese<br />

erst später mit den passenden Methoden und Attributen auszustatten.<br />

Obwohl dies ein Umweg zu sein scheint, hält die objekt-orientierte Software<br />

einem Wechsel von Anforderungen besser stand. Dies hat damit zu<br />

tun, dass die Objekt-Findung im grösseren Rahmen einer Anwendungs-<br />

Domäne erfolgt, und nicht auf der Ebene einzelner, schnellebiger Funktionen<br />

[20].<br />

Objekte stellen eigenständige Einheiten mit einer inneren Struktur dar.<br />

Einheiten können sein: elektrische Betriebsmittel, Fensterflächen, Dinge<br />

von reeller oder abstrakter Natur, jedoch mit einer klar definierbaren Rolle<br />

innerhalb einer Anwendungs-Domäne. Die innere Struktur wird durch die<br />

Implementation der Methoden, der Attribute und ihrer Zugriffe bestimmt.<br />

Jedes Objekt hat eine Identität und ist dadurch unterscheidbar. So sind<br />

z.B. zwei Schafe mit haargenau dem gleichen Aussehen dennoch zwei individuelle<br />

Schafe. Der Begriff Identität bezeichnet die fundamentale Eigenschaft<br />

der Existenz eines Objektes und hat nichts mit seinen Eigenschaften<br />

zu tun.<br />

Ferner hat ein Objekt ein Verhalten. Es reagiert auf bestimmte Botschaften<br />

(siehe Kapitel 2.3.3) in einer bestimmten Weise, indem es z.B.<br />

seinen eigenen Zustand ändert und möglicherweise Aktionen anderer Objekte<br />

auslöst.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


2.3. BEGRIFFE DER OBJEKT-ORIENTIERTEN PROGRAMMIERUNG 17<br />

2.3.2 Klassen<br />

Unter einer Klasse wird in der vorliegenden Arbeit immer ein Stück Quelltext<br />

der verwendeten Programmiersprache (C++) verstanden. Die Klasse<br />

ist eine Beschreibung von typgleichen Objekten. <strong>Eine</strong> Klassenbeschreibung<br />

enthält daher sowohl die innere, verborgene Struktur eines Objektes<br />

als auch die Reaktionsfähigkeit durch die Angabe der Schnittstelle seiner<br />

Methoden. Zur Programmlaufzeit ist die Klasse daher eine Art Objektfabrik,<br />

aus der beliebig viele Objekte eines gleichen Typs instantiiert werden<br />

können.<br />

Man beachte, dass sich bei gewissen Programmsprachen, wie z.B Eiffel<br />

oder Smalltalk, die Frage erhebt, inwiefern eine Klasse selber wieder eine<br />

Instanz, also ein Objekt ist. Dies ist grundsätzlich dann der Fall, wenn<br />

der Quelltext einer Objektbeschreibung selbst ein generiertes Produkt ist.<br />

Dieser Fall tritt auch bei der vorliegenden Arbeit auf.<br />

<strong>Eine</strong> spezielle Klasse ist die abstrakte Klasse. Aus ihr werden nie direkt<br />

Objekte erzeugt. Sie ist dazu angelegt, ihre Substanz an weitere abgeleitete<br />

Klassen zu vererben und damit zu konkretisieren. Die Substanz einer<br />

abstrakten Klasse besteht aus abstrakten Methoden, die leer und zum Überschreiben<br />

gedacht sind. Durch eine solche Gruppe von Methoden lässt sich<br />

eine Menge von Botschaften festlegen, die von Objekten verstanden wird.<br />

Damit lassen sich standardisierte Protokolle festlegen, die einen wesentlichen<br />

Bestandteil eines Design bilden, weil dadurch die Kommunikation<br />

zwischen Objekten formalisierbar ist. Abstrakte Klassen sind daher an der<br />

Spitze von Klassenhierarchien zu finden.<br />

2.3.3 Methoden<br />

Um die Fähigkeiten eines Objektes zu nutzen, schickt man ihm Botschaften.<br />

Damit wirkt man von aussen auf ein Objekt ein und stösst eine Aktion<br />

im Objekt an. Dies wird programmtechnisch dadurch realisiert, dass<br />

eine Methode eines existierenden Objektes aufgerufen wird. Ein Methodenaufruf<br />

umfasst neben einem gewohnten Prozeduraufruf mit optionalen<br />

Übergabeparametern auch einen Identifikator des Objektes. Dies ist eine<br />

Variable, deren Wert vom System zur Laufzeit berechnet wird.<br />

Dabei kann das Objekt nur ihm bekannte Methoden ausführen. Das<br />

Objekt kennt diejenigen Methoden, die in seiner eigenen Klasse oder einer<br />

Klasse definiert sind, von der die Methode geerbt wird. Die Ausführung<br />

der Methode kann zu weiteren Methoden-Aufrufen und zur Änderung des<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


18 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

inneren Zustandes eines Objektes führen.<br />

2.3.4 Attribute<br />

Dies sind die im Innern eines Objektes verborgenen Daten. Diese können<br />

Platzhalter für Eigenschaften des Objektes sein, die es näher beschreiben.<br />

Neben Standard-Typen sind auch Objekte von einer anderen oder der eigenen<br />

Klasse denkbar.<br />

Typischer- und sinnvollerweise kann ein Benutzer eines Objektes die<br />

Attribute nicht direkt manipulieren, sondern nur über die dafür vorgesehenen<br />

Methoden.<br />

Die Speicherwirkung der Attribute ermöglicht einem Objekt, einen Zustand<br />

und ein Gedächtnis zu haben. Die Speicherwirkung hält nicht länger<br />

an als das Objekt existiert.<br />

2.4 Objekt-orientierte Konzepte<br />

Die Fähigkeit abgeleitete Klassen zu bilden, Eigenschaften auf diesem intuitiv<br />

natürlich empfundenen Weg zu vererben sowie die dynamische Bindung<br />

sind weitere Schlüsselelemente für den Bau von wiederverwendbarer<br />

Software.<br />

Die Datenabstraktion und die Kapselung durch Klassen sind die wichtigsten<br />

Beiträge für eine einfache und eine durch das objekt-orientierte Vorgehen<br />

elementar unterstützte Modellierung. <strong>Eine</strong> wichtige Konsequenz ist,<br />

dass grundsätzlich keine Lücke zwischen Modellierung und Implementierung<br />

entsteht, die zu schwer verständlichen Inkonsistenzen zwischen Design<br />

und Implementation führen kann. Solche Lücken lassen sich bei der<br />

funktionalen Programmierung nur durch guten Kommentar überbrücken.<br />

In diesem Unterkapitel werden die wichtigsten Paradigmen der objektorientierten<br />

Programmierung zusammengestellt. In diesem Unterkapitel<br />

werden Konsequenzen für den Bau von wiederverwendbarer Software aufgezeigt,<br />

die sich aus dem Objekt-Modell ergeben.<br />

2.4.1 Kapselung<br />

Wie bereits in Abbildung 2.4 angedeutet, verbergen Objekte ihre innere<br />

Struktur. Unter innerer Struktur werden die Attribute und die Implementation<br />

der Methoden verstanden. Soll auf ein Objekt zugegriffen werden,<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


2.4. OBJEKT-ORIENTIERTE KONZEPTE 19<br />

Zugriff nur auf<br />

Methoden des<br />

Objektes<br />

Zugriff auf Attribute<br />

nicht möglich<br />

MeinBildschirm<br />

(Klasse Bildschirm)<br />

Methoden:<br />

Öffnen<br />

Schliessen<br />

Originalgrösse<br />

Zoom<br />

ZeichneRahmen<br />

ZeichneInhalt<br />

AllesZeichnen<br />

Attribute:<br />

links 40<br />

rechts 140<br />

oben 10<br />

unten 100<br />

Wirkung der Klasse:<br />

Abbildung 2.5: Abstraktion durch Kapselung<br />

geschieht dies stets durch das Schicken einer Botschaft, in der dem Objekt<br />

nur mitgeteilt wird, was es zu tun hat. Objekte erledigen dann Aufgaben<br />

prinzipiell in eigener Verantwortung. Sie lassen sich vom Aufgabensteller<br />

nicht aufzwingen, wie sie eine Aufgabe zu erledigen haben. Man kann den<br />

Objekten nur sagen, was sie zu tun haben. Diese Fähigkeit zur Abstraktion<br />

hilft dem Klienten, komplexe Systeme in kleinere Teile zu zerlegen.<br />

Er kann sich darauf beschränken, von den Objekten nur das kennenzulernen,<br />

was sie ausführen, und nicht noch, wie sie es tun. Das Mittel, das<br />

die Abstraktion durchsetzt ist die Kapselung. Abbildung 2.5 zeigt, wie die<br />

Kapselung funktioniert. Wie in der biologischen Welt die Zellmembrane<br />

den Zellkern von allen chemischen Signalen der Aussenwelt abschirmt,<br />

ausser denjenigen Signalen, welche die Zellmembran versteht, verhindert<br />

die Kapsel eines Objektes, dass äussere Programmaktivitäten in irgendwelche<br />

Speicherzellen eines Objektes hineinschreiben können und dadurch<br />

das Objekt gefährden. Anderseits lässt die Kapsel Zugriffe auf die Methoden<br />

des Objektes zu. In Abbildung 2.5 ist eine stark vereinfachte Instanz<br />

einer Bildschirm-Klasse aufgezeigt. Das Objekt versteht einen Methodenaufruf<br />

“Öffnen”. Es veranlasst darauf, die im Bild rechts gezeichnete Darstellung<br />

auf einem Bildschirm auszugeben. Die einzige Möglichkeit um<br />

die Attribute für die Koordinaten des geöffneten Fensters zu ändern, besteht<br />

darin, die Methoden “Zoom” oder “Originalgrösse” aufzurufen, und<br />

entsprechende Parameter zu übergeben. Das Objekt lässt einen direkten<br />

Zugriff auf seine Attribute nicht zu. Dadurch werden zufällige oder unkorrekte<br />

Änderungen verhindert, was hier zur Folge hätte, dass solchermassen<br />

geänderte Attribute mit dem zugrundeliegenden Fenstersystem unver-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


20 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

M<br />

A<br />

Basis<br />

Abgeleitet<br />

ΔM<br />

Δ A<br />

Methoden<br />

Attribute<br />

Symbol<br />

für Vererbung<br />

Abbildung 2.6: Vererbungsbeziehung<br />

träglich würden, oder der Inhalt ausserhalb seines Fensters irgendwo auf<br />

dem Bildschirm zu liegen käme.<br />

2.4.2 Vererbung<br />

Ein wichtiges Konzept der objekt-orientierten Programmierung ist die Vererbung.<br />

Mit Hilfe dieses Konzeptes lassen sich neue Klassen definieren,<br />

die auf einer existierenden Klasse aufbauen. Es muss dann nur noch die<br />

Differenz zu einer gewünschten inneren Struktur einer Klasse (Methode<br />

und Attribute) definiert werden. Die bereits existierende Klasse wird als<br />

Basis- oder Vorgängerklasse bezeichnet. Die neue Klasse ist die abgeleitete<br />

Klasse. In Abbildung 2.6 ist eine solche Vererbungsbeziehung dargestellt.<br />

Darin ist die Basisklasse mit den Methoden M und den Attributen<br />

A ausgestattet. Die abgeleitete Klasse erbt alle Methoden und Attribute<br />

seiner Vorgängerklassen. Die abgeleitete Klasse kann damit die Funktionalität<br />

der Vorgängerklassen erweitern und an neue Bedürfnisse anpassen,<br />

indem<br />

• neue Attribute hinzugefügt werden AAbgeleitet = A ∪ ΔA<br />

• neue Methoden hinzugefügt werden MAbgeleitet = M ∪ ΔM<br />

• eine geerbte Methode M durch eine andere Implementation ersetzt<br />

wird: MAbgeleitet = ΔM. Dies wird auch als Überschreiben einer Methode<br />

bezeichnet.<br />

• eine geerbte Methode erweitert wird. Dies geschieht z.B. dadurch,<br />

dass im Code von ΔM die Methode M aufgerufen wird.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


2.5. OBJEKT-ORIENTIERTES FRAMEWORK 21<br />

Von Mehrfachvererbung spricht man, wenn eine abgeleitete Klasse mehrere<br />

Vorgängerklassen hat.<br />

Vererbung fördert die Wiederverwendung von Methoden und Attributen<br />

und damit von Code. Gemeinsamer Code kann in einer gemeinsamen<br />

Basisklasse eingebracht und allen Erben zur Verfügung gestellt werden.<br />

2.4.3 Polymorphismus<br />

Polymorphie ist die wichtige Fähigkeit, verschiedene Implementationen<br />

hinter einem gleichen Namen verbergen zu können. Dies wird mit einem<br />

Mechanismus (dynamische Bindung) realisiert, der erst zur Programmlaufzeit<br />

entscheidet, ob und welche Methode eines Objektes aufzurufen<br />

ist, um diesem eine bestimmte Botschaft mit einem bestimmten Namen<br />

zu schicken. Daher kommt die Polymorphie erst beim Verschicken von<br />

Botschaften zum Tragen.<br />

<strong>Eine</strong> Methode, die beispielsweise die Matrix-Elemente addiert, wird<br />

korrekt arbeiten, solange alle Elemente der Matrix die Botschaft “Addiere”<br />

verstehen, egal aus welcher Klasse die zu summierenden Elemente stammen.<br />

In Systemen ohne Polymorphie wären Fallunterscheidungen notwendig,<br />

um je nach Typ des Matrix-Elementes und möglicherweise des aktuellen<br />

Typs der bisherigen Summe eine passende Prozedur für die Addition<br />

aufzurufen. Die Gefahr für den Software-Entwickler besteht dabei darin,<br />

dass er einen Fall vergisst. Ferner ist es schwierig, eine solche Software<br />

wiederzuverwenden, da kleine Änderungen dem System sehr wahrscheinlich<br />

weitere Fälle aufbürden. Da die Fallunterscheidungen über das ganze<br />

System verstreut sind, wird es ebenso verstreute Modifikationen bedingen,<br />

ehe das System wiederverwendet werden kann.<br />

Polymorphie vereinfacht daher die Kommunikation unter Objekten ganz<br />

erheblich. Ferner erlaubt es dem Software-Entwickler, eine eigene Version<br />

einer Klasse zu erzeugen, diese wieder in das System einzubauen und an<br />

der Stelle des Originals in Betrieb zu nehmen.<br />

2.5 Objekt-orientiertes Framework<br />

Die in Bibliotheken gesammelten Klassen sind in vielen Fällen nützlich<br />

und sehr flexibel, haben aber folgende Nachteile:<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


22 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

• Vielzahl von Klassen: In grossen Bibliotheken müssen zuerst passende<br />

Klassen für einen bestimmten Anwendungsfall gefunden werden.<br />

Es kann für einen Klienten schwierig sein, ohne konzeptionelle<br />

Dokumentation der Klassenbibliothek herauszufinden, wofür die einzelnen<br />

Klassen gedacht sind. Noch schwieriger und gefährlicher ist<br />

es, in diesem Fall eigene Änderungen und Ergänzungen anzubringen.<br />

• Beziehungen zwischen den Klassen: Die Kommunikation und die<br />

Beziehungen zwischen den Klassen sind nach wie vor vom Klienten<br />

zu programmieren. Er legt dabei fest, wann welche Botschaft an welches<br />

Objektes zu schicken ist. Dies zwingt einen Klienten bei komplexeren<br />

Anwendung immer wieder, eigene Lösungen für die gleichen,<br />

grundlegenden Probleme zu finden. Selbst wenn Klienten dafür<br />

die gleichen Klassen wählen, machen die vielen, leicht abweichenden<br />

Entscheidungen den Code der Applikationen genügend unterschiedlich,<br />

um das gemeinsame Design nicht mehr so einfach zu erkennen<br />

und wiederverwenden zu können.<br />

Daher versucht man das Prinzip Kapselung auf einer höheren Stufe anzuwenden,<br />

um Code und Design von Lösungen innerhalb einer grösseren<br />

Einheit zu integrieren und wiederzuverwenden. Diese nächst höhere Abstraktionsebene<br />

erreicht man mit Hilfe eines Frameworks.<br />

2.5.1 Begriff und Funktion<br />

Johnson [21] definiert ein Framework wie folgt: “ A framework is a set<br />

of classes that embodies an abstract design for solutions to a family of related<br />

problems”. Die Grundaufgabe des Frameworks besteht also darin,<br />

ein wiederverwendbares Design einer bestimmten Problemstellung zu beschreiben.<br />

Dabei wird dieses wiederverwendbare Design durch den Code<br />

des Frameworks beschrieben. Dieser Code legt folgende Elemente fest:<br />

1. Die Menge der Klassen<br />

2. Die standardisierten Protokolle: In abstrakten Basisklassen werden<br />

Mengen von Methoden festgelegt, welche die Protokolle für die<br />

Kommunikation unter den Framework-Klassen definieren.<br />

3. Die Erweiterungsstellen: Das Framework verknüpft eine Menge<br />

von Klassen. Ein Teil dieser Klassen und/oder Methoden bedarf weiterer<br />

Konkretisierung, um das innerhalb der Familie von verwandten<br />

Problemstellungen unterschiedliche Verhalten zu definieren.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


2.5. OBJEKT-ORIENTIERTES FRAMEWORK 23<br />

Rückmeldung<br />

1<br />

Domänen-Wissen<br />

Domänen-Engineering<br />

Unterstützung des<br />

Applikations-Engineering<br />

Applikations-Engineering<br />

Geschäfts- oder<br />

Forschungsziele<br />

Anforderungen<br />

Produkt für<br />

Endbenutzer<br />

Abbildung 2.7: Durch Wiederverwendung gesteuerter Software-Engineering Prozess<br />

2.5.2 Entwicklungsvorgang<br />

Die Entwicklung eines Frameworks wird als eine schwierige Aufgabe erachtet<br />

[12]. Sie benötigt das Wissen eines Experten einer bestimmten<br />

Domäne. Das Aufwendige dabei ist die Erstellung eines Domänenmodells.<br />

Dieses ist wiederum die Grundlage für den Entwurf des Frameworks. Das<br />

Domänenmodell ist das Ergebnis einer Domänen-Analyse, in deren Verlauf<br />

eine oder mehrere wissenschaftliche Theorien einer Domäne zu formalisieren<br />

sind.<br />

Frameworks entstehen meist Bottom-up durch Konsolidierung von Erfahrung,<br />

die bei der Entwicklung einer Lösung für ein spezielles Problem<br />

gefunden wurde [10]. Dies geschieht innerhalb eines iterativen Entwicklungsprozesses,<br />

wobei das Framework in konkreten Anwendungen erprobt<br />

wird. Die dabei gewonnenen Erfahrungen fliessen in das Framework zurück.<br />

Der Entwicklungsprozess von Frameworks wird noch nicht von objekt-orientierten<br />

Analyse- und Entwurfswerkzeugen unterstützt.<br />

Die Entwicklung eines Frameworks kann durch den in Abbildung 2.7<br />

aufgezeigten Software-Engineering Prozess in einem grösseren Zusammenhang<br />

dargestellt werden. Dieser Prozess wurde von dem Software<br />

Productivity Consortium [12] vorgeschlagen. Er entspricht prinzipiell<br />

dem Ausreifprozess des Frameworks. Dem Domain-Engineer entspricht<br />

der Entwickler des Frameworks. Das Framework soll den Applikations-<br />

Entwickler darin unterstützten, Applikationen rascher und mit grösserer<br />

Qualität zu entwickeln. Der Applikations-Engineer, der in dieser Arbeit<br />

als Klient bezeichnet wird, ist derjenige, der das Framework in seiner An-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

2


24 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

Framework<br />

GetAElem(..)<br />

in MeinNtor<br />

überschreibt<br />

GetAElem(..) in<br />

VNtor<br />

VNtor<br />

GetAElem(..)<br />

MeinNtor<br />

GetAElem(..)<br />

vom Klienten durch Ableitung definierte Erweiterungen<br />

Abbildung 2.8: Funktionsweise eines Frameworks<br />

Programmfluss<br />

wendung einbaut und damit in eher traditioneller Weise Software-Produkte<br />

für einen Endbenutzer erstellt. In einem Forschungsumfeld ist der Klient<br />

oft selber Endbenutzer.<br />

Der durch Wiederverwendung gesteuerte Software-Engineering Prozess<br />

ist dadurch gekennzeichnet, dass es vom Klienten eine Rückkopplung zum<br />

Framework-Entwickler gibt. Die Kommunikation zwischen diesen Akteuren<br />

ist entscheidend. Das Verbessern und Erweitern des Frameworks ist in<br />

diesem iterativen Prozess möglich, solange der Klient dies benötigt.<br />

In [12] werden Erfahrungen mit diesem Prozess dargestellt, die bei der<br />

Produktion von Software für Flugsimulatoren gemacht wurden.<br />

2.5.3 Anwendung<br />

Kann ein Klient bei seiner Problemstellung auf einem Framework aufbauen,<br />

so ist bereits ein Teil der Entwurfsarbeit vom Framework-Entwickler<br />

erbracht worden. Der Klient benutzt ein Framework, indem er an den dafür<br />

vorgesehenen Stellen eigene Klassen ableitet. Der Klient überschreibt<br />

Methoden und ändert damit das vom Framework vorgegebene Standard-<br />

Verhalten. In Abbildung 2.8 wird die Anpassung eines Frameworks an<br />

einem einfachen Beispiel aufgezeigt. Die Klasse VNtor sei eine Klasse<br />

des Frameworks, die dazu angelegt ist, vom Klienten in einer abgeleiteten<br />

Klasse, hier MeinNtor, konkretisiert zu werden. Der Klient liefert eine<br />

eigene Version zu der Methode GetAElem(..), um dieser Methode ein<br />

spezielles Verhalten zu geben. Man beachte aber, dass GetAElem(..) unabhängig<br />

von den Änderungen des Klienten vom Framework zur geeigneten<br />

Zeit aufgerufen wird. Diese Art der Wiederverwendung ist in Kapitel<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


2.5. OBJEKT-ORIENTIERTES FRAMEWORK 25<br />

2.2.2 als “White-Box-Ansatz” klassifiziert worden. Dem Vorteil der Flexibilität<br />

steht ein erhöhter Lernaufwand gegenüber. Obwohl die abgeleiteten<br />

und zu konkretisierenden Klassen häufig klein und einfach sind, muss der<br />

Klient doch wissen, wie die überschriebenen Methoden aufzubauen sind.<br />

Ferner kann die Menge der zu konkretisierenden Klassen gross werden,<br />

und eine zusätzliche Erschwernis im Lernprozess des Klienten darstellen.<br />

In [22] werden folgende Vorteile des Frameworks aufgeführt:<br />

1. Weniger Code zu schreiben: Das Framework enthält bereits Design-<br />

Entscheidungen und Quell-Code des Programms.<br />

2. Zuverlässiger und robuster Code: Der vom Framework geerbte Code<br />

ist bereits getestet und im Framework richtig eingebaut.<br />

3. Einheitlicher und modularer Code: Wiederverwendeter Code fördert<br />

die Einheitlichkeit und das Herausarbeiten der Gemeinsamkeiten<br />

zwischen Programmen, unabhängig vom Programm-Entwickler. Der<br />

Einsatz von Frameworks vereinfacht die Aufteilung eines Programms<br />

in kleine Stücke.<br />

4. Generische Lösung, für verwandte Probleme wiederverwendbar:<br />

Der Umgang mit Frameworks bewirkt beim Klienten, dass er für seine<br />

Probleme weniger eine spezielle sondern eher eine generische Lösung<br />

sucht. Daraus könnte sogar selbst wieder ein Framework entstehen.<br />

5. Vereinfachte Integration von verwandten Programmen: Da Programme,<br />

die auf dem gleichen Framework aufbauen, nicht nur den<br />

gleichen Code, sondern auch die gleichartige Struktur aufweisen, verstehen<br />

Klienten die an ähnlichen Aufgaben arbeiten, gegenseitig ihre<br />

Programme besser. Ferner ist es wahrscheinlicher, dass die Zusammenarbeit<br />

ihrer Programme gelingt.<br />

Der Einsatz von Frameworks erlaubt dem Softwareentwickler, Nutzen<br />

aus bereits eingebauten, und teilweise komplexen Beziehungen zwischen<br />

Objekten zu ziehen. Ein wesentlicher Vorteil dabei ist, dass der Softwareentwickler<br />

nicht alle Einzelheiten dieser Beziehungen verstehen muss.<br />

Frameworks wurden schon verschiedentlich in Systemen für Energieversorgung<br />

(EMS) eingesetzt. Anfangs geschah dies insbesondere bei den<br />

graphischen Benutzersystemen. In [11] wird der Einsatz eines objekt-orientierten<br />

Frameworks für Unterhalt und Dokumentation von EMS beschrieben.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


26 KAPITEL 2. KONZEPTE DES SOFTWARE-ENGINEERING<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Kapitel 3<br />

Netzmodellierung und Netzberechnung<br />

In diesem Kapitel werden die Anforderungen an das Domänenmodell betrachtet.<br />

Dazu wird Wissen gesammelt und im Domänen-Modell formalisiert.<br />

Das Resultat ist ein Modell für einen bestimmten Ausschnitt aus der<br />

realen Welt. Das Modell zielt auf einen Anwendungsbereich ab, für den<br />

ähnliche Softwaresysteme (Applikationen) gebaut werden. Dieser Bereich<br />

ist die Welt von vernetzbaren Entitäten mit Verhalten, dass durch nichtlineare,<br />

simultane Gleichungen beschreibbar ist.<br />

Die Beschreibung des Modells enthält die folgenden Angaben:<br />

• Gültigkeitsbereich und Leistungen des Domänenmodells<br />

• Information über die Entitäten<br />

• Faktoren, die zu Variationen führen<br />

Abschliessend wird ein Beispiel betrachtet, bei dem eine einfache Anordnung<br />

im Domänenmodell identifiziert wird.<br />

3.1 Domänenanalyse<br />

In diesem Unterkapitel wird der Gültigkeitsbereich und die Grenzen der<br />

Domäne festgelegt, indem die wichtigen Funktionen und Merkmale der<br />

Domäne beschrieben werden. Dabei wird beschrieben, was getan wird,<br />

nicht wie. Die wichtigen Funktionen und Fähigkeiten einer Domäne werden<br />

als Anforderungen einer Domäne bezeichnet. Die Beschreibung der<br />

Anforderungen ist nicht nur für den Entwickler des Domänenmodells wichtig.<br />

Sie enthält ausserdem die Information, die ein Klient benötigt, um<br />

dieses Modell aufzufinden und auf seine Eignung zu prüfen.<br />

27<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


28 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

Alle Anforderungen einer Domäne<br />

R 1<br />

M 1<br />

R 2<br />

R 3<br />

M 2<br />

Abbildung 3.1: Grundsätzliche Problematik beim schrittweisen Modellieren<br />

Die Festlegung der Anforderungen sollte vor der Domänen-Modellierung<br />

erfolgen. In Abbildung 3.1 sind die Konsequenzen einer iterativen<br />

Modellierung veranschaulicht. Darin werde zunächst eine Teilmenge R1<br />

der Anforderungen modelliert. Dann ist das gefundene Modell M1 teilweise<br />

hinfällig, wenn neue Anforderungen zu modellieren sind.<br />

Andererseits ist es eine anerkannte Tatsache, dass sich Modelle nur<br />

schrittweise entwickeln lassen. Diese grundsätzliche Problematik bei der<br />

iterativen Modellierung wurde im Verlaufe dieser Arbeit ebenfalls bestätigt.<br />

Der objekt-orientierte Programmieransatz ist in dieser Phase sehr hilfreich,<br />

da Modellierung und Programmdesign zusammenfallen. Damit kann das<br />

Modell bereits nach kurzer Zeit eingesetzt und getestet werden.<br />

3.1.1 Lastfluss-Applikation<br />

Die Lastfluss-Rechnung ist ein typischer, stabiler und gut verstandener<br />

Vertreter der Probleme, die in die Domäne der nichtlinearen Systeme gehören.<br />

Die genaue Bestimmung des Betriebszustandes eines elektrischen<br />

Energieübertragungssystems ist eine zentrale, jedoch nicht neue Aufgabe,<br />

die im Betrieb und bei der Planung solcher Systeme sowie als Teilaufgabe<br />

bei Marktsimulations-Szenarien immer wieder zu lösen ist. Die typischen<br />

Fragen lauten:<br />

• Wie sieht das Spannungsprofil an den Netzknoten bei einer bestimmten<br />

Belastung aus?<br />

• Welche Belastungen (Leistungen, Ströme) treten in den Betriebsmitteln<br />

auf?<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

M 3<br />

?


3.1. DOMÄNENANALYSE 29<br />

Entität Bedingungen Typ aus [23]<br />

PQ-Last P und Q sind Parameter 0<br />

PQ-Gen V = Vmin ...Vmax 1<br />

P und Q sind Parameter<br />

PV-Gen Q = Qmin ...Qmax 2<br />

P und V ist Parameter<br />

Slack-Knoten V und Φ sind Parameter 3<br />

P und Q sind unbegr. Vars<br />

Tabelle 3.1: Knoten-Typen<br />

<strong>Eine</strong> kompakte und präzise Darstellung von Lastfluss-Anforderungen<br />

findet man implizit in der Beschreibung von Datenformaten, in denen beteiligte<br />

Personen eine gemeinsame Sprache festlegen. Diese Datenformate<br />

müssen präzise und vollständig sein, da sie auch für den Computer lesbar<br />

sind.<br />

Dafür ist ein verbreitetes Datenformat [23] ausgewählt worden. Das<br />

Domänenmodell soll in diesem Format beschriebene Netze für den Lastfluss<br />

abbilden können.<br />

3.1.2 Modellierung von Netzelementen<br />

Die Datenvorgabe für eine Lastfluss-Rechnung geschieht mit Hilfe von<br />

speziellen Datentypen, die meistens von einem Knoten-Zweig basierten<br />

Netzmodell ausgehen. Ein repräsentativer Satz solcher Typen ist in [23]<br />

dargestellt. Die in Klammer stehenden, englischen Begriffe stammen aus<br />

[23]. Verschiedene Teile der vorliegenden Arbeit beziehen sich auf diese<br />

Typen. Die Typvielfalt und ihre Eigenschaften legen den Variationsbereich<br />

fest, der vom Domänenmodell zu bewältigen ist.<br />

Knoten-Typen<br />

Die Knoten-Typen (Buses) zeichnen sich durch einen elektrischen Anschluss<br />

aus. Sie entsprechen einem Knoten im zugrundeliegenden Knoten-<br />

Zweig-Modell. Die Typen unterscheiden sich in zusätzlichen Randbedingungen<br />

in den Knoten. Diese lassen sich durch Gleichungen ausdrücken,<br />

wie dies weiter unten unter Kapitel 3.1.5 dargestellt wird. In der Tabelle<br />

3.1 sind die Knoten-Typen von [23] zusammengestellt.<br />

PQ-Knoten sind Stellen, an denen das Netz belastet oder Leistung von<br />

Kraftwerken ins Netz eingespiesen wird. Dabei sind die Lasten durch die<br />

Verbraucher bestimmt, z.B. durch Industrieprozesse, Heizbedürfnisse usw.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


30 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

Wesentlich dabei ist, dass eine konstante Wirkleistung P und Blindleistung<br />

Q vorgegeben wird, die nicht von den übrigen Grössen des Netzes abhängt.<br />

Der Spannungsbetrag V am Knoten stellt sich frei ein. Der Knoten toleriert<br />

dabei einen Bereich von V = Vmin ...Vmax.<br />

PV-Knoten sind Kraftwerkseinspeisungen bei denen eine Wirkleistung<br />

P und ein Spannungsbetrag V vorgegeben wird. Beides sind Sollwerte, für<br />

die der Turbinen- bzw. der Spannungsregler des Generators verantwortlich<br />

ist. Die Blindleistung Q am Knoten stellt sich dabei frei ein. Der Knoten<br />

toleriert dabei einen Bereich von Q = Qmin ...Qmax.<br />

Sowohl der PQ- als auch der PV-Knoten stellt wegen der Leistungsbeziehung<br />

S = P + j · Q = U · I ∗ und der Konstanthaltung des Spannungsbetrags<br />

nichtlineare Zusammenhänge zwischen den Knotengrössen her.<br />

Der Slack-Knoten ist eine Kraftwerkseinspeisung, bei der alle Komponenten<br />

der komplexen Knotenspannung vorgegeben werden. Der Slack-<br />

Knoten ist daher ein spezieller Knoten, da er als Referenz für sämtliche<br />

Spannungen eines Netzes dient. Üblicherweise wird die Spannung des<br />

Slack-Knotens in die reelle Achse der komplexen Ebene gelegt. Am Slack-<br />

Knoten stellen sich die Wirkleistung P und die Blindleistung Q entsprechend<br />

der Leistungsbilanz im Netz ein. Dieser Knoten hat deshalb die<br />

Bezeichnung Slack-Knoten (slack = lose, locker).<br />

Ein weiterer Knoten, in Tabelle 3.1 mit PQ-Last bezeichnet, ist eine<br />

ungeregelte Stelle des Netzes, an welcher mit den Parametern P und Q<br />

eine Last vorgegeben werden kann.<br />

Zweig-Typen<br />

Zweig-Typen (Branches) zeichnen sich durch zwei elektrische Anschlüsse<br />

aus.<br />

Typische Vertreter sind der Transformator und die Übertragungsleitung.<br />

Wie in der Tabelle 3.2 ersichtlich, lassen sich mehrere Typen von<br />

Transformatoren unterscheiden, je nach den möglichen Datenvorgaben.<br />

Die Grösse t bezeichnet das Übersetzungsverhältnis t und eine Phasendrehung<br />

Φt. Beide Vorgaben sind Steuergrössen des Transformators, die<br />

in bestimmten Grenzen variierbar sind, um z.B. einen Spannungsbetrag<br />

und/oder eine Wirk- oder Blindleistung an einem beliebigen Netzknoten<br />

zu regeln. Die beiden Anschlüsse werden durch Zusatzinformation unterschieden,<br />

die einem dahinterliegenden Modell des Zweiges entspricht.<br />

Das Transformatormodell hat eine Seite, die dem idealen Übertrager (Tap-<br />

Bus) und eine Seite, die mit einer nichtverschwindenden Impedanz ver-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


3.1. DOMÄNENANALYSE 31<br />

Entität Bedingungen Typ aus [23]<br />

Übertragungs- 0<br />

leitung<br />

Trafo1 t = const. 1<br />

Trafo2 t = tmin ...tmax, Φt = const, 2<br />

VBus = Vmin ...Vmax<br />

Trafo3 t = tmin ...tmax, Φt = const, 3<br />

QBranch = Qmin ...Qmax<br />

Trafo4 Φt = Φmin ...Φmax, t = const, 4<br />

PBranch = Pmin ...Pmax<br />

Tabelle 3.2: Zweig-Typen<br />

bunden ist (Impedance-Bus). <strong>Eine</strong> Übertragungsleitung (Tie-Line) hat eine<br />

“Meter-Bus”- und eine “NonMeter-Bus”-Seite. Parallele Zweige werden<br />

in [23] durch Circuits-Nummern unterschieden. Damit lassen sich z.B.<br />

parallele Leitungsstränge etwas vereinfacht darstellen, da gemeinsame Daten,<br />

wie z.B. die gleichen Knoten-Nummern nur einmal anzugeben sind.<br />

Interchange-Area<br />

Das Interchange-Area ist ein Gebiet innerhalb eines Netzes, in welchem<br />

eine bestimmte Wirkleistungssumme vorgegeben werden kann. Diese Vorgabe<br />

entspricht beispielsweise einer Sollvorgabe für einen bestimmten Wirkleistungs-Export<br />

des Gebietes. Die Leistung, die aus einem Area exportiert<br />

ist positiv, bei Import ist sie negativ.<br />

3.1.3 Zusammenschaltbarkeit der Netzelemente<br />

<strong>Eine</strong> wesentliche Eigenschaft der Netzelemente ist, dass sie eine oder mehrere<br />

Anschlussstellen (Klemmen) besitzen, an denen sie miteinander in<br />

verschiedenster Weise verbunden werden können. Dies ist ein bedeutender<br />

Faktor von Variabilität innerhalb der betrachteten Domäne. Bei der Topologie<br />

(Lehre vom Ort, Topos: Ort) des Netzes geht es um die Beschreibung<br />

der Verbindungen zwischen Knoten. Bevor auf dem Computer eine Netzberechnung<br />

ausführbar ist, muss die Topologie des Netzes computermässig<br />

erfasst werden. In der vorliegenden Arbeit wird diese Erfassungsfunktion<br />

als Netzaufbau bezeichnet. Ein elektrisches Energieübertragungsnetz lässt<br />

sich grob durch seine Knotenzahl und die Zahl der Übertragungsleitungen<br />

charakterisieren, da die Zahl der (Hochspannungs-) Leitungen gegenüber<br />

anderen Zweig-Typen des Übertragungsnetzes weitaus dominiert. Für eine<br />

modellmässige Beschreibung muss darüber hinaus bekannt sein, wie<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


32 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

1<br />

4<br />

2<br />

5<br />

Abbildung 3.2: Graph für ein 5-knotiges Netz<br />

die einzelnen Knoten verbunden sind und welche Typen von Knoten und<br />

Zweigen vorhanden sind.<br />

Auf dem Papier lässt sich ein Netz eindeutig durch einen Graphen beschreiben.<br />

Als Beispiel ist in Abbildung 3.2 ein Graph für ein 5-knotiges<br />

Netz gezeigt.<br />

Ein Graph besteht nur aus Knoten und Verbindungen (Zweigen) zwischen<br />

diesen Knoten. Die Zweige besagen lediglich, dass zwischen den<br />

betreffenden Knoten eine Verbindung besteht. Der Bezugsknoten wird im<br />

Graphen nicht eingezeichnet 1 .<br />

Den Verbindungen kann noch eine vorgegebene Richtung zugeordnet<br />

werden, die durch einen Pfeil festgelegt wird. Man spricht dann von einem<br />

gerichteten Graphen, im Unterschied zum ungerichteten Graphen der<br />

Abbildung 3.2.<br />

Im allgemeinen Fall wird mit dem gerichteten Graphen gearbeitet, da<br />

es in einem Netz meistens unsymmetrische Zweige gibt, wie z.B. einen<br />

Transformator mit einem Übersetzungsverhältnis = 1 oder eine Übertragungsleitung<br />

mit nur einer Leistungs-Messstelle an einem der Leitungsenden.<br />

In beiden Fällen ist die Angabe der Einbau-Richtung (=Zweigrichtung!)<br />

absolut zwingend, damit eine übereinstimmende Modellierung auf<br />

dem Computer möglich ist.<br />

Mit dem (gerichteten) Graphen ist bei der Modellierung von elektrischen<br />

Netzen die Netzstruktur festgelegt.<br />

Der Graph ist wohl ein anschauliches geometrisches Gebilde, aber damit<br />

ist die Netztopologie noch nicht für den Computer unmittelbar lesbar.<br />

Dafür muss der Graph alphanumerisch umgesetzt werden. <strong>Eine</strong> mögliche<br />

computerlesbare Eingabeform ist die Zweigliste. Sie besagt, welche<br />

Knoten am Start- und Endknoten der gerichteten Zweige anliegen, oder<br />

umgekehrt, welche Knoten durch den Zweig verbunden sind.<br />

1Er entspricht im Dreiphasen-System dem Sternpunkt. Sämtliche Knotenspannungen im Netz beziehen<br />

sich auf diesen Punkt.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

3


3.1. DOMÄNENANALYSE 33<br />

In der folgenden Zweigliste ist der Graph der Abbildung 3.2 numerisch<br />

beschrieben.<br />

Start-Knoten End-Knoten<br />

1 2<br />

1 4<br />

2 5<br />

4 5<br />

2 3<br />

3 5<br />

Falls diese Zweigliste noch mit technischen Parametern der modellierten<br />

Betriebsmittel ergänzt wird, gelangt man zu einem Format (Tauschformat),<br />

dass von einem Computer gelesen werden kann.<br />

3.1.4 Lösungsverfahren Netzgleichungen<br />

Wie in 3.1.2 dargestellt, führen Randbedingungen der Knoten-Typen bei<br />

der Lastflussrechnung auf nicht-lineare Gleichungssysteme. Es hat sich<br />

gezeigt, dass ein Domänenmodell, das solche nicht-lineare Gleichungen<br />

enthält, vom zugrundeliegenden Lösungsverfahren abhängt. So ist es beim<br />

gewählten Newton-Raphson-Verfahren zwingend, dass die Variablen kontinuierlich<br />

und alle Funktionen einmal ableitbar sind.<br />

Das gesamte Gleichungssystemg(x,p)=0 enthält N gleichzeitige, nichtlineare<br />

Gleichungen, gebildet aus den Unbekannten<br />

x = {x1,x2,···xN} und den Bekannten p.<br />

Dieses Unterkapitel zeigt und bewertet zwei möglichen Verfahren zur Auflösung<br />

von N nicht-linearen Gleichungen, die das System<br />

g(x,p)=0 bilden.<br />

Das Gauss-Seidel Verfahren<br />

Für das Gauss-Seidel Verfahren werden die N Gleichungen wie folgt aufgestellt:<br />

x1= g1(x2 ···xN)<br />

. =<br />

xi= gi(x1···xN) (1


34 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

g(x )<br />

k<br />

g(x)<br />

xk+1<br />

Abbildung 3.3: Eindimensionale Darstellung des Newton-Raphson-Verfahrens<br />

Das Gauss-Seidel Verfahren liefert den Wert xk i , der die Approximation<br />

von xi bei der Iteration k darstellt:<br />

x k i = gi(x k 1 ,xk2 ,···,xki−1 ,xk−1<br />

i+1 ,···,xk−1 N ) (3.1)<br />

Falls die Bedingung<br />

Δx k i = |xki − xk−1 i | < ε ∀i<br />

erfüllt ist, hat das Verfahren konvergiert und eine Lösung gefunden.<br />

Das Gauss-Seidel Verfahren ist ein Relaxations-Verfahren. Es konvergiert<br />

schlecht oder gar nicht, falls ein Netz mehr als 100 Knoten aufweist.<br />

Die Methode wird kaum noch in der Praxis angewandt. Das Verfahren<br />

würde sich jedoch sehr einfach in einem objekt-orientierten Design implementieren<br />

lassen. In [5] und in veränderter, konzeptionell aber ähnlicher<br />

Form in [24] wird dieses Verfahren benutzt, um damit einen knotenorientierten<br />

Netzberechnungs-Algorithmus zu formulieren. Es zeigt sich,<br />

dass der Datenaustausch genau der Topologie des Netzes folgt, was in der<br />

objekt-orientierten Welt bedeutet, dass nur benachbarte Objekt miteinander<br />

kommunizieren müssen.<br />

Das Newton-Raphson-Verfahren<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

(4)<br />

(3)<br />

Um die eindimensionale, nichtlineare Gleichung<br />

g(x)=0<br />

x k<br />

(2)<br />

(1)<br />

x


3.1. DOMÄNENANALYSE 35<br />

zu lösen, wird die Funktion in einer Taylor-Reihe um den Punkt xk entwickelt,<br />

so gilt:<br />

g(x)=g(xk)+ ∂g(x)<br />

<br />

<br />

(x−xk)+Terme höherer Ordnung<br />

∂x x=xk<br />

Bricht man die Reihe nach dem Term 1. Ordnung ab, erhält man für die<br />

Lösung eine bessere Approximation:<br />

xk+1 = xk + Δx<br />

wobei<br />

<br />

∂g(x)<br />

−1 <br />

Δx = − · g(xk) (3.2)<br />

∂x x=xk<br />

Dieser iterative Prozess wird solange fortgesetzt bis das Konvergenzkriterium<br />

|g(xk)| < ε<br />

erfüllt ist. Je mehr sich die Funktion einer Geraden annähert desto schneller<br />

und zuverlässiger konvergiert das Verfahren unter der Voraussetzung,<br />

dass der Startpunkt nahe genug bei der Lösung gewählt wurde.<br />

Stellt man die Funktion y = g(x) graphisch dar (siehe Abbildung 3.3),<br />

so kann die Lösung visuell einfach festgestellt werden: Dort, wo die Kurve<br />

die x-Null-Achse schneidet, d.h. dort wo y = 0, ist die gesuchte Lösung<br />

für x.<br />

Das Newton-Raphson-Verfahren nähert sich, ausgehend von einem numerisch<br />

gegebenen Startwert xk (Punkt 1 in Abbildung 3.3) dieser Lösung<br />

iterativ wie folgt:<br />

Am Ort yk = g(xk) (Punkt 2) wird eine Tangente, in Abbildung 3.3<br />

durch 3 gekennzeichnet, an die Kurve y = g(x) gelegt. Diese Tangente<br />

(eine Gerade) schneidet die x-Achse am Ort xk+1 (Punkt 4). Für diesen<br />

Wert wird der zugehörige Wert yk+1 = g(xk+1) bestimmt. Dann wird wieder<br />

eine Tangente an die Kurve gelegt, der Schnittpunkt mit der x-Achse<br />

festgestellt, usw.<br />

Die Methode lässt sich auf beliebig grosse Gleichungssysteme<br />

g(x,p)=0 (3.3)<br />

anwenden. Die Tangente in Abbildung 3.3 ist in diesem Fall durch eine<br />

tangentiale Fläche in einem N-dimensionalen Raum zu ersetzen. Die<br />

Menge der Unbekannten wird dabei wie folgt verbessert:<br />

xk+1 =xk + Δx<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


36 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

wobei<br />

Δx = −J −1 ·g(xk) Jij = ∂gi(x)<br />

<br />

<br />

(3.4)<br />

∂xj x=xk<br />

Die Jacobi-Matrix J ersetzt dabei die erste Ableitung in Gleichung (3.2).<br />

Der maximale Mismatch ist dabei die betragsmässig grösste Funktionswert-<br />

Abweichung.<br />

Dieses Verfahren ist heute die Basismethode für die Lösung des Lastflusses.<br />

Darüber hinaus wird dieses Verfahren verbreitet in kommerziellen<br />

Simulationsprogrammen verwendet.<br />

Die Erfahrung zeigt, dass sich der Mismatch bei diesem Verfahren pro<br />

Iteration um den Faktor 10 verkleinert. Unabhängig von der Netzgrösse<br />

kann daher erwartet werden, dass nach 4 bis 6 Iterationen eine befriedigende<br />

Lösung gefunden wird.<br />

Zusammenfassend sprechen folgende Gründe für die Wahl des Newton-<br />

Raphson-Verfahrens:<br />

• Rasche und sichere Konvergenz<br />

• Unabhängigkeit von der Netzgrösse<br />

• Vorhandensein von effizienten Softwarepaketen zur Lösung von Gleichungssystemen<br />

2<br />

• Vorhandensein von Sprachen, welche eine symbolische Ableitung von<br />

Funktionen ermöglichen<br />

3.1.5 Erzeugung der Netzgleichungen<br />

Die Netzmodellierung gibt an, wie man systematisch zu einem Satz von<br />

Gleichungen gelangt, die das Verhalten des Netzes beschreiben. Es existieren<br />

heute mehrere solcher Verfahren. Es stellt sich daher die Frage,<br />

welche dieser Netzmodellierung zu wählen ist.<br />

<strong>Eine</strong> Netzmodellierung ist für die Ziele der vorliegenden Arbeit dann<br />

günstig, wenn sie durch eine objekt-orientierte Modellierung, realisierbar<br />

ist, bei der die Vorzüge dieser Technologie möglichst gut zum Tragen<br />

kommen. Dabei wird insbesondere dem Gesichtspunkt der Kapselung,<br />

d.h. einer klaren Zuordnung von Daten und Aktionen auf Entitäten<br />

2 Wie in Kapitel 3.1.5 gezeigt wird, handelt es sich dabei um schwach-besetzte Gleichungssysteme<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


3.1. DOMÄNENANALYSE 37<br />

beachtet. Ferner wird angestrebt, dass es möglichst wenige solcher Aktionen<br />

benötigt. Ferner ist es auschlaggebend, dass das gewählte Newton-<br />

Raphson-Verfahren in einfacher Weise mit der Modellierung kombiniert<br />

werden kann.<br />

Ein gut bekannter Kandidat basierend auf Knoten und Zweigen soll<br />

zunächst vorgestellt und hinsichtlich der objekt-orientierten Modellierung<br />

nach diesen Kriterien untersucht werden. Dies geschieht anhand eines Beispiels,<br />

das auch in einem weiteren, alternativen Modellierungs-Ansatz benutzt<br />

wird, der in dieser Arbeit als Ntor-Ansatz bezeichnet wird. An diesem<br />

durchgezogenen Beispiel wird aufgezeigt, dass sich der Ntor-Ansatz<br />

für eine objekt-orientierte Modellierung eines Netzes besser eignet, als der<br />

verbreitete Knoten-Zweig-Ansatz.<br />

Modellierung mit Knoten und Zweigen<br />

Ein verbreiteter Ansatz modelliert das Netz als einen gerichteten Graphen,<br />

der aus Knoten und Zweigen besteht. Sämtliche elektrischen Betriebsmittel<br />

werden dabei als spezielle Knoten- oder Zweiginstanzen betrachtet.<br />

Das zentrale Element ist dabei stets die Knotenpunktsadmittanzmatrix.<br />

Dieser Ansatz ist verbreitet. Man findet ihn in den meisten Lehrbüchern<br />

über Netzwerkanalyse. Er wird eingehend in den Arbeiten [24] und [25]<br />

benutzt und in weiteren Veröffentlichungen wie [2, 4, 6, 8] und [23] verwendet.<br />

Der Knoten-Zweig-basierte Ansatz soll hier auf seine Eignung für eine<br />

objekt-orientierte Modellierung untersucht werden. Dazu werden die Terme<br />

betrachtet, welche im Zuge des Newton-Raphson-Verfahrens für das<br />

linearisierte Gleichungssystem benötigt werden. Dabei interessieren vorallem<br />

die Zugehörigkeiten dieser Terme zu Knoten und Zweigen. Einfache<br />

Zugehörigkeiten lassen einen einfacheren Design erwarten.<br />

Für diese Untersuchung wird eine Lastfluss-Berechnung betrachtet. Nachfolgend<br />

sind dazu die Gleichungen, Variablen und Parameter der einzelnen<br />

Knotentypen dargestellt. Da bei dieser Lastfluss-Berechnung nur sinusförmige<br />

Grössen vorkommen, können die Variablen durch komplexe<br />

Zahlen realisiert werden.<br />

Die Knotentypen sind im Unterkapitel 3.1.2 beschrieben. Jeder dieser<br />

Typen hat Variable und formuliert damit typspezifische Gleichungen. Je<br />

zwei Gleichungen stammen aus der Strombilanz am Knoten, wie in Abbildung<br />

3.4 dargestellt. Weitere Gleichungen können wie in Tabelle 3.3<br />

dargestellt, dazukommen.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


38 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

U<br />

I<br />

I<br />

Knoten-Entität<br />

i<br />

KE<br />

i<br />

i<br />

U i<br />

Referenzpotential<br />

I i<br />

Knotenspannung am Knoten I gegen Referenzpotential<br />

i Strom in die Knoten-Entität i<br />

I<br />

KE<br />

i<br />

Summe aller aus dem Knoten i fliessender Zweigströme<br />

Abbildung 3.4: Strombilanz im Knoten<br />

Netzwerk<br />

Die komplexen Grössen sind wie folgt zusammengesetzt:<br />

I i = Iei + j·Ifi<br />

IKEi = IKEei + j·IKE fi Ui = ei + j · fi<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

j<br />

(3.5)<br />

(3.6)<br />

(3.7)<br />

<strong>Eine</strong> zentrale Gleichung ist die Strombilanz im Knoten i. Die Strombilanz<br />

benutzt die Gleichungen (3.10), (3.11), (3.13) und (3.14).<br />

IKEi +I i = 0 (3.8)<br />

Der Strom I i fliesst vom Knoten i in das restliche, rechts-liegende Netz<br />

hinein. Dabei ist zu beachten, dass die Zweige bei dieser Modellierung immer<br />

durch Vierpole ausgedrückt werden. Der Zweig-Teil des Netzes lässt<br />

sich daher mit Hilfe der bekannten Knotenadmittanz-Matrix Y ausdrücken.<br />

Y besitzt die komplexen Elemente y ij :<br />

y ij =gij + j·bij<br />

(3.9)<br />

Damit lässt sich der Strom I i nach Real- und Imaginärteil getrennt durch<br />

folgende Gleichungen ausdrücken:<br />

Iei =<br />

Ifi=<br />

N<br />

∑<br />

j=1<br />

N<br />

(ej gij − fjbij), i=1...N (3.10)<br />

∑(ejbij<br />

+ fjgij), i=1...N (3.11)<br />

j=1


3.1. DOMÄNENANALYSE 39<br />

Slack-Knoten<br />

i<br />

Admittanz Y = G + jB<br />

Y-Zweig<br />

PQ-Knoten<br />

Abbildung 3.5: Netzbeispiel modelliert mit Knoten-Zweig-Ansatz<br />

N ist die Anzahl aller Netzknoten ohne den Referenzknoten.<br />

Ferner lässt sich der Strom aus den Knoten-Entitäten IKEi aus den Angaben<br />

von Wirk- und Blindleistung bei gegebener Knotenspannung U i mit Hilfe<br />

der Beziehung<br />

∗<br />

Pi + j · Qi = Ui · IKEi<br />

(3.12)<br />

berechnen und nach Real- und Imaginärteil getrennt ausdrücken:<br />

IKEei = eiPi + fiQi<br />

ei 2 + fi 2<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

j<br />

(3.13)<br />

IKE f = i −eiQi + fiPi<br />

ei 2 + fi 2<br />

(3.14)<br />

Man beachte, dass das Verbraucherzählpfeilsystem gewählt ist. Die Knoten-<br />

Entität verbraucht daher Leistung, falls P grösser als 0 ist.<br />

Abbildung 3.5 zeigt eine einfache Netzkonfiguration. Die darin vorkommenden<br />

Knoten- und Zweigentitäten werden mit Hilfe der Strombilanz<br />

3.8 und weiteren typenspezifischen Beziehungen charakterisiert. Die<br />

Tabelle 3.3 zeigt, was g(x,p)=0 in diesem Fall konkret bedeutet. In<br />

der Spalte “Gleichungen”, “Param(eter)” und “Variable” stehen die Komponenten<br />

der Vektoren g, p und x. Allgemein gibt es zu jeder im Netz<br />

vorkommenden Knoten-Entität zwei unbekannte Knotenspannungen e und<br />

f . Diesen entsprechen zwei Komponenten von x. Ferner ist erkennbar,<br />

dass die Knoten-Entitäten wegen der Leistungsbeziehung (siehe Gleichung<br />

(3.12)) je zwei Komponenten von g mit nichtlinearem Verhalten aufweisen.<br />

Für jeden Typ der Knoten-Entitäten können je nach Bedarf weitere<br />

Komponenten in g, p und x dazukommen. wie z.B. die dritte und vierte<br />

Zeile in der Spalte “Gleichungen” des Typs Slack-Generators. Die Zweig-<br />

Entität steuert nur Komponenten von p bei, mit deren Hilfe die Komponenten<br />

von g formuliert werden. Die Zuordnung der Komponenten der<br />

Vektoren g, x und p ist frei wählbar. Sie muss jedoch für die weitere Berechnung<br />

beibehalten werden.


40 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

Entität Variable Param. Gleichungen<br />

x p g(x,p)=0<br />

Slack- Pi,Qi eSl, fSl<br />

Knoten ei, fi<br />

PQ- e j, f j Pj,Qj<br />

Knoten<br />

Y- G,B<br />

Zweig<br />

ei Pi+ fi Qi<br />

e 2 i + fi 2 + ei G − fi B − e j G + f j B = 0<br />

−ei Qi+ fi Pi<br />

ei 2 + fi 2<br />

e j Pj+ f j Q j<br />

e2 j + f j 2<br />

−e j Q j+ f j Pj<br />

e j 2 + f j 2<br />

+ ei B + fi G − e j B − f j G = 0<br />

ei − eSl = 0<br />

fi − fSl = 0<br />

+ e j G − f j B − ei G + fi B = 0<br />

+ e j B + f j G − ei B − fi G = 0<br />

Tabelle 3.3: Entitäten beim Knoten-Zweig-Ansatz<br />

Aus der Angabe von Tabelle 3.3 lassen sich alle die Terme berechnen,<br />

die für das Newton-Raphson-Verfahren benötigt werden.<br />

<strong>Eine</strong> wichtige Konsequenz des Knoten-Zweig-Ansatzes ist, dass die Jabobi-<br />

Matrix Nebendiagonal-Blöcke Aij aufweist, die von Null verschieden sind.<br />

Dies ist dann der Fall, wenn zwischen den Knoten i und j ein Zweig mit<br />

einer Admittanz Yij =0 vorhanden und nicht ein Slack-Knoten verbunden<br />

ist.<br />

Aij = ∂[gi]<br />

(3.15)<br />

∂[xj]<br />

Dabei bezeichnen [gi] und [xi] Teilmengen von Funktionen und Variablen<br />

der Knotentypen. In der Tabelle 3.3 sind diese Teilmengen für jeden Knotentypen,<br />

der im Netzbeispiel vorkommt, dargestellt.<br />

Es zeigt sich, dass vorallem die Nebendiagonal-Blöcke näher zu betrachten<br />

sind. Bei den Diagonalblöcken steuern die Zweige die Parameter<br />

B und G bei. Damit wird das Lokalitätsprinzip verletzt. Beim Mismatch-<br />

Wert treten keine wesentlichen Unterschiede zwischen der Knoten-Zweigund<br />

der, ab Seite 43 diskutierten, Ntor-basierten Modellierung auf.<br />

Hingegen gibt es bei der Erzeugung der Nebendiagonal-Blöcke durch<br />

den Knoten-Zweig basierten Ansatz Schwierigkeiten, wenn dies in einer<br />

objekt-orientierten Modellierung geschehen soll.<br />

Dazu sind in der Tabelle 3.4 die Nebendiagonal-Blöcke der Jacobi-<br />

Matrix für alle Kombinationen von Knoten-Typen dargestellt, die über den<br />

gleichen Zweig verbunden sind.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


3.1. DOMÄNENANALYSE 41<br />

Knoten<br />

i<br />

Admittanz Y<br />

Zweig<br />

Knoten<br />

Abbildung 3.6: Abhängigkeit der Nachbarknoten<br />

Knotentyp i Knotentyp j Aij<br />

<br />

0 0<br />

Slack Slack<br />

0 0<br />

Slack PQ<br />

Slack PV<br />

PQ PQ<br />

PQ PV<br />

PV PV<br />

PV PQ<br />

PQ Slack<br />

PV Slack<br />

−gij bij<br />

−bij −gij<br />

−gij bij 0<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

j<br />

<br />

−bij −gij 0<br />

<br />

−gij bij<br />

−bij −gij<br />

−gij bij 0<br />

⎡<br />

<br />

−bij −gij 0<br />

−gij bij 0<br />

−bij −gij 0<br />

<br />

<br />

⎤<br />

⎢<br />

⎣<br />

⎥<br />

⎦<br />

0<br />

⎡<br />

0 0<br />

⎤<br />

⎢<br />

⎣<br />

−gij bij<br />

−bij −gij<br />

<br />

0 0<br />

<br />

0 0<br />

0<br />

⎡<br />

0<br />

0<br />

⎤<br />

0<br />

⎢<br />

⎣ 0<br />

⎥<br />

0 ⎦<br />

0 0<br />

Tabelle 3.4: Abhängigkeit der Jacobi-Terme<br />

⎥<br />


42 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

Es ist offensichtlich, dass für die Erstellung dieser Matrizen Information<br />

von den drei beteiligten Entitäten benötigt wird. Man erkennt die Abhängigkeit<br />

zwischen der Dimension der Matrizen und der Grösse der Variablen-<br />

Mengen der anstossenden Knotentypen. Die Reihenfolge der Knoten-<br />

Typen für die Dimension der Matrizen entscheidend. Je nachdem, ob die<br />

Reihenfolge i- j PQ-PV oder PV-PQ lautet, wird die Matrix eine 2×3- oder<br />

eine 3 × 2-Matrix.<br />

Ferner hängen die Elemente selbst von den Knotentypen ab. Wenn der<br />

Slack-Knoten die Rolle des Knotens j hat, sind alle Matrizenwerte 0. In<br />

den anderen Fällen werden die Elemente durch Zweigparameter vorgegeben.<br />

Es stellt sich daher die Frage, welche Entität die Matrix Aij letztlich<br />

erstellt, und wie dabei das Wissen aus den anderen Entitäten beigesteuert<br />

wird. Zwei mögliche Lösungsansätze werden nachfolgend skizziert. Die<br />

dabei entstehenden Schwierigkeiten im Zusammenhang mit dem objektorientierten<br />

Design werden erläutert.<br />

Die erste Lösung geht davon aus, dass ausser den Spannungen keine<br />

weiteren Variablen gegenseitig in den Gleichungen von Knoten i und<br />

j vorkommen. Unter dieser Annahme lässt sich mit dem in Abbildung<br />

3.7 gezeigten Datenaustausch die Information durch die beteiligten Entitäten<br />

fortlaufend vervollständigen. Dies geschieht innerhalb verschiedener<br />

Aktionen, die zu verschiedenen Entitäten gehören. In der objektorientierten<br />

Terminologie entsprechen die Aktionen den Methoden verschiedener<br />

Klassen. Im Folgenden werden die Aktionen durch das Symbol<br />

M Index1[Index2] abgekürzt. Index1 bezeichnet die zugehörige Entität<br />

(Z=Zweig, K=Knoten bzw. Kirchhoff-Knoten, N=Ntor). Mit Index2<br />

werden unterschiedliche Aktionen einer Entität identifiziert.<br />

Die Aktion MK1E verfügt über die Information, die der Knoten j für<br />

den Aufbau der Matrix Aij bzw. A ji benötigt.<br />

Man beachte, dass die Vierpole der Zweige nicht symmetrisch zu sein<br />

brauchen. Daher wurde in beiden Lösungen angenommen, dass es zwischen<br />

zwei benachbarten Knoten immer zwei entgegengesetzt gerichtete<br />

Zweige gibt.<br />

Dieser Lösungsansatz benötigt vier unterschiedliche Aktionen:<br />

MZ1H, MZ1T , MK1A und MK1E sowie fünf Parameter-Werte. Als nachteilig<br />

wird dabei beurteilt, dass die von der Zweig-Entität stammenden Übergabeparameter<br />

gij bzw. bij für die Schnittstellendefinition der Knoten-<br />

Entität (Aktionen MK1A und MK1E) benutzt werden. Sollten sich diese<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


3.1. DOMÄNENANALYSE 43<br />

über alle<br />

Zweige<br />

in Richtung<br />

M Z1H<br />

g ij , b ij<br />

M K1A<br />

Dimension i<br />

g ij , b ij<br />

i j<br />

M K1E<br />

über alle<br />

Zweige<br />

in Richtung<br />

i j<br />

Zweig Knoten Knoten<br />

ij i j<br />

M Z1T<br />

g ij , b ij<br />

M K1A<br />

ij b Dimension i<br />

g , ij<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

M K1E<br />

Abbildung 3.7: 1. Lösungsansatz zum Aufbau der Nebendiagonalblöcke<br />

Übergabeparameter jemals ändern, so sind die Schnittstellen des Knotentypen<br />

anzupassen.<br />

In der zweiten Lösung wird eine Fallunterscheidung im Programmcode<br />

der Aktion MZ2H bzw. MZ2T der Zweige benutzt. Diese Fallunterscheidung<br />

hängt, wie in Tabelle 3.4 ersichtlich und nachfolgend diskutiert wird,<br />

von der Vielfalt der Knotentypen ab. Obwohl der zweite Lösungsansatz<br />

nur drei Aktionen MZ2H, MZ2T und MK2 und einen Übergabeparameter für<br />

den Knotentypen benötigt, gibt es ebenfalls Wartungsprobleme, wenn z.B.<br />

die Vielfalt der Knotentypen ändert. In diesem Fall wäre der Programmcode<br />

in der Aktion MZ2H bzw. MZ2T der Zweig-Entität anzupassen.<br />

Modellierung mit Ntor-Ansatz<br />

In Tabelle 3.4 ist ersichtlich, dass bei der Knoten-Zweig-basierten Modellierung<br />

für den Aufbau eines Nebendiagonalblocks Aij Informationen von<br />

drei Entitäten benötigt werden. Ferner zeigt sich, dass der Nebendiagonalblock<br />

Aij gleichzeitig die Information enthält, ob zwischen den Knoten<br />

i und j eine Verbindung besteht und welche Parameter des Zweiges zwischen<br />

diesen Knoten massgebend sind.<br />

Wie in Kapitel 3.1.5 gezeigt wurde, ist diese Vermischung von gleichzeitig<br />

auszuwertender Information für einen objekt-orientierten Design ungünstig.<br />

Es treten Wartungsprobleme der Software auf, wie z.B. die in<br />

Programmen verstreute Auswirkungen bei Änderung von Datentypen oder<br />

A ij<br />

A ji<br />

Zeit


44 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

über alle<br />

Zweige<br />

in Richtung<br />

i<br />

über alle<br />

Zweige<br />

in Richtung<br />

i<br />

j<br />

j<br />

Zweig Knoten Knoten<br />

ij i j<br />

M Z2H<br />

case<br />

case<br />

...<br />

M Z2T<br />

case<br />

case<br />

...<br />

Knotentyp<br />

Knotentyp<br />

A<br />

Knotentyp<br />

Knotentyp<br />

ij<br />

A ji<br />

M K2<br />

M K2<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

M<br />

K2<br />

M K2<br />

Abbildung 3.8: 2. Lösungsansatz zum Aufbau der Nebendiagonalblöcke<br />

Entitäten.<br />

Daher wird ein weiterer Modellierungsansatz untersucht, der in der vorliegenden<br />

Arbeit als Ntor-Ansatz bezeichnet wird.<br />

Dieser Ansatz zielt einerseits darauf ab, diese Vermischung zu entflechten.<br />

Ausserdem hat es sich gezeigt, dass die Flexibilität der Modellierung<br />

beim Knoten-Zweig-basierten Ansatz an Grenzen stösst, wenn Betriebsmittel<br />

mit mehr als zwei Anschlüssen zu modellieren sind. Dies ist z.B.<br />

beim Dreiwickler-Transformators mit verstellbarem Übersetzungsverhältnis<br />

der Fall, um genügende Übereinstimmung mit der Wirklichkeit zu erlangen.<br />

In [26] werden genauere aber auch komplexere Modelle dargestellt.<br />

Diese Komplexität ist ein wesentlicher Grund für eine Modellierung,<br />

die allgemein für Betriebsmittel mit N Anschlüssen geeignet ist.<br />

Der Ntor-Ansatz baut auf den Entitäten Ntor und Kirchhoff-Knoten und<br />

formuliert dabei die Gleichungen etwas anders. Wie im Anhang A gezeigt,<br />

lassen sich die Gleichungen des Ntor-Ansatzes in diejenigen des Knoten-<br />

Zweig-Ansatzes überführen.<br />

Die grundlegende Idee des Ntor-Ansatzes ist, Betriebsmittel mit internen<br />

“starken” physikalischen und damit modellmässigen Zusammenhängen<br />

als Ntore zu modellieren. Es gibt hier keinen Unterschied mehr zwischen<br />

Knoten- und Zweigentitäten. Alle Betriebsmittel sind bei dieser Modellie-<br />

Zeit


3.1. DOMÄNENANALYSE 45<br />

Referenzknoten<br />

anr<br />

Flussvariable<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Ntor<br />

i<br />

i,anr<br />

Potentialvariable i,anr<br />

Abbildung 3.9: Zählrichtungen von Fluss- und Potentialvariablen<br />

rung Ntor-Entitäten. Jedes Ntor formuliert dazu Gleichungen in eigenen<br />

Variablen.<br />

Typische Vertreter sind in der Energieübertragungstechnik die Leitung<br />

(2-Tor), das Kabel (2-Tor), der Shunt (1-Tor), das Serieelement (2-Tor),<br />

der 2-Wicklungstransformator (2-Tor) und der 3-Wicklungstransformator<br />

(3-Tor).<br />

Die Anzahl Tore pro Ntor, d.h. die Zahl N gibt zunächst die Anzahl<br />

unterschiedlicher Klemmen eines Betriebsmittel an, über die es mit den<br />

übrigen anderen Elementen des Netzes verbunden werden kann. Dies sind<br />

stets Verbindungen von diesen Ntoren zu Kirchhoff-Knoten. In Unterkapitel<br />

3.2 wird schliesslich eine abstraktere Betrachtung angegeben, bei dem<br />

das Tor, als Anschluss bezeichnet, den Zugriff auf eine beliebige Anzahl<br />

von indizierten Variablen ermöglicht.<br />

Ein weitere Entität ist daher der Kirchhoff-Knoten. Beim Übertragungsnetz<br />

in der Energietechnik wird jeder idealen, impedanzlosen Sammelschiene<br />

ein (Kirchhoff-) Knoten zugeordnet. Ihm ist die Aufgabe zugeteilt,<br />

die Netztopologie zwischen Ntor-Entitäten zu beschreiben. Dies wird<br />

durch folgende beiden Kirchhoffschen Gesetze erreicht:<br />

• Die Potentialvariablen aller miteinander verbundenen Ntor-Anschlüsse<br />

haben den gleichen Wert.<br />

• Die Summe der Flussvariablen aller miteinander verbundenen Ntor-<br />

Anschlüsse ist Null.<br />

Die Potentialvariablen entsprechen in elektrischen Anwendungen gerichteten<br />

Spannungen gegen einen Referenz-Knoten. Den Flussvariablen entsprechen<br />

die in die Ntor-Anschlüsse fliessenden Ströme oder Leistungen.<br />

Beim Ntor-Ansatz gelten folgende Regeln der Modellierung:


46 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

Ntor i Ntor k<br />

Slack<br />

I i,1<br />

U i,2<br />

1 2<br />

Verbindung<br />

1<br />

I k,2<br />

U k,2<br />

Y<br />

1 1<br />

Verbindung<br />

2<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

I k,1<br />

U k,1<br />

I j,1<br />

Ntor j<br />

U j,1 PQ<br />

Abbildung 3.10: Netzbeispiel modelliert mit Ntor-Ansatz<br />

1: Bezugsrichtungen von Fluss- und Potentialvariablen beim Ntor-<br />

Anschluss sind gemäss Abbildung 3.9 festgelegt.<br />

2: Die Basisnamen der Fluss- und Potentialvariablen sind netzweit<br />

einheitlich.<br />

3: Die Datentypen der Fluss- und Potentialvariablen sind netzweit<br />

einheitlich.<br />

4: Fluss- und Potentialvariablen werden gemäss folgendem Schema<br />

bezeichnet:<br />

• netzweit: Basisnamei,anr<br />

• innerhalb Ntor i : Basisnameanr<br />

Die Zahl anr ist die bezüglich des Ntors i lokale Nummer eines<br />

Anschlusses.<br />

5: Der Referenzknoten gilt netzweit.<br />

6: Ntor-Anschlüsse können nicht direkt miteinander verbunden<br />

werden.<br />

7: Die Verbindung zwischen den Ntor-Anschlüssen ist impedanzlos.<br />

Impedanzbehaftete Pfade zum Referenzknoten gibt es nur<br />

innerhalb von Ntoren.<br />

Diese Standardisierung ermöglicht es, beide Kirchhoff-Gesetze unabhängig<br />

von den Ntor-Typen aufzustellen.<br />

An dieser Stelle wird das Modellierungs-Beispiel mit dem Ntor-Ansatz<br />

gemäss Abbildung 3.10 für eine Lastflussrechnung formuliert. Das Verhalten<br />

der Entitäten ist identisch mit demjenigen, das bei der Knoten-<br />

Zweig-Modellierung in 3.1.5 verwendet werden. In beiden Modellierungen<br />

wird das Verbraucherzählpfeilsystem angewandt. Die Gleichungen<br />

beider Ansätze lassen sich daher direkt vergleichen.<br />

Beim betrachteten Fall sind die Flussvariablen Ströme mit dem einheitlichen<br />

Namen I. Die Potentialvariablen sind Spannungen mit einheitlichen


3.1. DOMÄNENANALYSE 47<br />

Namen U. Für die Lastfluss-Rechnung ist ein komplexer Datentyp für diese<br />

Variablen geeignet. I und U bestehen bei der Wahl von kartesischen<br />

Koordinaten aus den Komponenten:<br />

Ii = iei + j · i fi<br />

Ui = ei + j · fi<br />

(3.16)<br />

(3.17)<br />

Die Tabelle 3.5 zeigt, was g(x,p)=0 beim Ntor-Ansatz konkret bedeutet.<br />

In der Spalte “Gleichungen”, “Param(eter)” und “Variable” stehen<br />

die Komponenten der Vektoren g, p und x. Im betrachteten Beispiel gibt<br />

es zu jedem im Netz vorkommenden Ntor pro Anschluss zwei unbekannte<br />

Komponenten der Knotenspannungen e und f, sowie zwei Komponenten<br />

ie und i f . Diesen Komponenten entsprechen vier Komponenten von x.<br />

Ferner ist erkennbar, dass die Ntore mit einer Leistungsbeziehung gemäss<br />

Gleichung (3.12) (PQ- und Slack-Ntor) je zwei Komponenten von g mit<br />

nichtlinearem Verhalten aufweisen. Ntor-Typen unterscheiden sich durch<br />

die Anzahl und Namen der Komponenten von p und x sowie durch die<br />

Anzahl und Struktur vong. Summengeber-Entitäten können grundsätzlich<br />

Komponenten aller drei Vektoren g, p und x beisteuern. Im betrachteten<br />

Beispiel sind die Entitäten “Verbindung1” und “Verbindung2” Summengeber,<br />

welche nur weitere Komponenten von g beisteuern. Auch hier ist<br />

die Zuordnung der Komponenten der Vektoren g,x und p frei wählbar. Sie<br />

muss jedoch für die weitere Berechnung beibehalten werden.<br />

Nun soll der wesentliche Unterschied dieser Neuformulierung der Gleichungen<br />

beim Ntor-Ansatz betrachtet werden. Die in Tabelle 3.4 dargestellten<br />

Jacobi-Terme existieren beim Ntor-Ansatz nicht, da die Menge der<br />

Funktionen [gi] eines Ntors i stets nur in den eigenen Variablen [xi] ausgedrückt<br />

wird, und die Schnittmenge der Variablen zwischen beliebigen<br />

Ntor-Instanzen stets leer ist. Daher verschwinden alle Terme ∂[gi]<br />

mit i = j.<br />

∂[x j]<br />

Die der topologischen Verknüpfung entsprechende Information hat eine<br />

andere Form. Für jeden Kirchhoff-Knoten n entsteht eine Matrix AVerbn .Es<br />

ist eine reine Inzidenz-Matrix, bestehend aus vielen Nullen und typischerweise<br />

wenigen “1”- und “-1”-Elementen.<br />

Sie lautet für die Verbindung 1:<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


48 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

AVerb1<br />

Entität Variable Param. Gleichungen<br />

x p g(x,p)=0<br />

Slack- ei,1, fi,1 eSl, fSl iei,1 − ei,1 Pi+ fi,1 Qi<br />

ei,1 2 + fi,1 2 = 0<br />

Ntor iei,1 ,ifi,1 i fi,1 − −ei,1 Qi+Pi fi,1<br />

ei,1 2 + fi,1 2<br />

Pi,Qi<br />

ei,1 − eSl = 0<br />

fi,1 − fSl = 0<br />

PQ- e j,1, f j,1 Pj,Qj ie j,1 − e j,1 Pj+ f j,1 Q j<br />

e j,1 2 + f j,1 2<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

= 0<br />

= 0<br />

Ntor ie j,1 ,ifj,1 i f j,1 − −e j,1 Q j+Pj fi,1<br />

e j,1 2 + f j,1 2 = 0<br />

Zweig- ek,1, fk,1 G,B iek,1 − <br />

ek,1 − ek,2 G + fk,1 − fk,2 B = 0<br />

Ntor iek,1 ,ifk,1 i fk,1 − <br />

fk,1 − fk,2 G − ek,1 − ek,2 B = 0<br />

ek,2, fk,2<br />

iek,2<br />

+ iek,1 = 0<br />

iek,2 ,ifk,2<br />

i fk,2 + i fk,1 = 0<br />

Verbin- iei,1 + iek,2 = 0<br />

dung 1 i fi,1 + i fk,2 = 0<br />

ei,1 − ek,2 = 0<br />

fi,1 − fk,2 = 0<br />

Verbin- ie j,1 + iek,1 = 0<br />

dung 2 i f j,1 + i fk,1 = 0<br />

e j,1 − ek,1 = 0<br />

f j,1 − fk,1 = 0<br />

Tabelle 3.5: Entitäten beim Ntor-Ansatz<br />

=<br />

=<br />

∂−−→ f unsVerb1 ⎡ ∂x<br />

0 0 1 0 0 0 0 0 0 0 0 0 0 0 0<br />

⎢ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0<br />

⎢<br />

⎣ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 −1<br />

0<br />

0<br />

0<br />

(3.18)<br />

⎤<br />

1 0<br />

⎥<br />

0 1 ⎥<br />

0 0<br />

⎥<br />

⎦<br />

0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 −1 0 0<br />

−−→<br />

f unsVerb1 entspricht den Gleichungen der Verbindung 1, in der Reihenfolge,<br />

die in Tabelle 3.5 angegeben ist. x entspricht allen Variablen des


3.1. DOMÄNENANALYSE 49<br />

über alle<br />

Kirchhoff-<br />

Verbindungen<br />

des Netzes<br />

Kirchhoff-Verbindung Ntor<br />

M K<br />

n<br />

Name der Variablen<br />

Position der Variablen<br />

A Verb n<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

M N<br />

Abbildung 3.11: Datenaustausch beim Ntor-Ansatz für AVerbn<br />

Systems in der Reihenfolge ihres Auftretens in der Spalte “Variable” der<br />

Tabelle 3.5.<br />

In Abbildung 3.11 ist eine objekt-orientierte Lösung skizziert, bei der die<br />

beteiligten Entitäten die Matrix AVerbn erstellen. Dabei sammelt die Kirchhoff-<br />

Verbindung die Matrix-Positionen aller Variablen der mit ihr verbundenen<br />

Ntore. Dies ist die Menge aller Variablen, die über die Kirchhoffschen<br />

Gesetze miteinander in Verbindung stehen. Dies sind im Beispiel für die<br />

Verbindung1 (siehe Tabelle 3.5):<br />

{iei,1 ,iek,2 ,ifi,1 ,ifk,2 ,ei,1,ek,2, fi,1, fk,2}.<br />

Die Kirchhoff-Verbindung erzeugt pro Gleichung, welche an den<br />

Kirchhoffschen Gesetzen beteiligt ist, je eine Zeile der Matrix AVerbn .<br />

Es sind die beiden Aktionen MK und MN mit zwei Parametern für die<br />

Übergabe des Variablennamens und der Matrix-Position notwendig. Beide<br />

Parameter sind allgemeine Datentypen (Zeichenkette und INTEGER). Es<br />

ist ersichtlich, dass die Lösung vom Ntor-Typ völlig unabhängig ist.<br />

Sicht des Netzes<br />

In Abbildung 3.12 wird die Struktur der Jacobi-Matrizen (A) im Knoten-<br />

Zweig- und Ntor-Ansatz für ein gleiches Netz gegenübergestellt. Wie in<br />

Abbildung 3.12 ersichtlich, unterscheiden sich die Jacobi-Matrizen beider<br />

Ansätze erheblich. Beim Knoten-Zweig-Ansatz besitzt sie eine Diagonale,<br />

die durch quadratische, praktisch vollbesetzte Blockmatrizen gebildet<br />

wird. Jede dieser Blockmatrizen gehört zu einer Knoten-Entität.<br />

Die Matrizen-Elemente hängen auch von Zweigparametern ab. Pro Zweig<br />

gibt es zwei Matrizen in der Nebendiagonalen, deren Struktur und Werte,<br />

Zeit


50 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

0<br />

0<br />

Knoten-Zweig-Ansatz Ntor-Ansatz<br />

0<br />

0<br />

0<br />

0<br />

A u b<br />

(Jacobi-Matrix)<br />

(Mismatch-<br />

Vektor)<br />

von Knoten-Entitäten abhängig<br />

von Zweig-Entitäten abhängig<br />

1 1 1 1<br />

1 -1<br />

1 -1<br />

1 1 1<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

0<br />

A<br />

von Ntoren abhängig<br />

von Summengebern abhängig<br />

Abbildung 3.12: Struktur der linearisierten Gleichungssysteme beider Ansätze<br />

wie die Schraffur in Abbildung 3.12 andeutet, von den Knoten-Entitäten<br />

und dem sie verbindenden Zweig abhängen. Diese Matrizen sind, wie in<br />

Tabelle 3.4 ersichtlich, typischerweise zu 74% besetzt. Alle übrigen Matrixelemente<br />

sind Null.<br />

Beim Ntor-Ansatz ist die Jacobi-Matrix wesentlich grösser. Sie besteht<br />

aus zwei rechteckigen Matrizen. Die obere Matrix, in Abbildung 3.12 hell<br />

dargestellt, ist eine reine Block-Diagonalmatrix. Diese ist aus den relativ<br />

schwach besetzten und den Ntoren zugeordnete Matrizen gebildet. Da im<br />

Ntor-Ansatz die zahlenmässig häufig vorkommenden Leitungen (Zweige)<br />

ebenfalls durch Ntore modelliert werden, hat deren Anzahl einen wesentlichen<br />

Einfluss auf die Grösse der Jacobi-Matrix. Die untere Matrix, in<br />

Abbildung 3.12 schwarz dargestellt, ist eine rechteckige, typischerweise 3<br />

sehr schwachbesetzte Matrix (vergl. Gleichung (3.18)).<br />

Bewertung der Ansätze<br />

Zusammenfassend ergibt sich folgende Bewertung:<br />

Vorteile des Ntor-Ansatzes:<br />

• Entflechtung von Gleichungen, welche die Topologie beschreiben und<br />

solchen, die die physikalische Modellierung der Ntore betreffen<br />

3 in Netzen der Energieübertragung<br />

0<br />

u<br />

b


3.2. DOMÄNENMODELL 51<br />

• Gleichbehandlung bei der Modellierung elektrischer Betriebsmittel,<br />

da keine Unterscheidung mehr in Knoten und Zweige<br />

• Elektrische Betriebsmittel mit mehr als zwei Anschlüssen lassen sich<br />

in gleicher Weise modellieren und für den Computer implementieren.<br />

• Der geschlossene Schalter kann problemlos mit Z = 0 modelliert werden.<br />

Nachteile des Ntor-Ansatzes: Der Preis für die Entflechtung von Information<br />

ist die Vergrösserung der Dimension des Gleichungssystems auf<br />

18 Variable und 18 Gleichungen, da im betrachteten Beispiel hinter jedem<br />

elektrischen Anschluss eines Ntors je ein Satz von Variablen (Strom und<br />

Spannung) steht. Im Vergleich dazu tritt beim Knoten-Zweig-Ansatz pro<br />

elektrischer Verbindung (Knoten) nur eine Spannungsvariable auf. Das<br />

Gleichungssystem enthält für das gleiche Beispiel nur 6 Variable und 6<br />

Gleichungen. Ferner haben die in Netzen typischerweise zahlreichen Zweige<br />

(Leitungen) gar keine Variablen.<br />

Im Beispiel der Abbildung 3.5 ist das Verhältnis zwischen den Nichtnull-Elementen<br />

und der totalen Anzahl der Elemente der A-Matrix 12 :<br />

16. Dieses Verhältnis beträgt beim Ntor-Ansatz für das gleiche Netz 54 :<br />

324. Die Vergrösserung der Dimension wiegt daher nicht so schwer, da<br />

das Gleichungssystem wesentlich schwächer besetzt ist als beim Knoten-<br />

Zweig-Ansatz.<br />

3.2 Domänenmodell<br />

Dieser Teil beschreibt die Ergebnisse der Domänenanalyse.<br />

Es wird dargestellt, welchen Beitrag die einzelnen Entitäten an der Bildung<br />

des gesamten nichtlinearen Gleichungssystems g(x,p)=0 leisten.<br />

Dabei ist dim [x] =dim[g]. Der Vektor x ist der Vektor der unbekannten<br />

Variablen, p ist der Vektor der bekannten Parameter.<br />

3.2.1 Netz und Entitäten<br />

Ein Netz wird als Menge untereinander verbundener Entitäten angesehen,<br />

die in dieser Arbeit als “Ntor” und “Summengeber” bezeichnet werden.<br />

Diese Entitäten werden stets über die weitere Entität “Anschluss” miteinander<br />

verknüpft. Zu jeder Verknüpfung gehört genau ein Anschluss. Jeder<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


52 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

Σ<br />

Σ<br />

Σ<br />

Ntor Anschluss Summengeber<br />

Abbildung 3.13: Netzwerk gebildet aus den Entitäten Ntor und Summengeber<br />

Anschluss muss mit genau einem Summengeber verbunden sein. Verbindungen<br />

entstehen mathematisch gesehen dadurch, dass Gleichungen von<br />

miteinander verbundenen Ntoren und Summengebern gemeinsame Variable<br />

haben.<br />

Ein Ntor hat genau n Anschlüsse. Dabei bezeichnet n eine ganze Zahl<br />

grösser Null. Man beachte, dass z.B. ein Betriebsmittel, dass 3 elektrische<br />

Anschlüsse hat nicht notwendigerweise ein 3Tor (n=3) ist. Die Zahl<br />

“n” steht nämlich für die Anzahl nach aussen zu verknüpfender, reeller<br />

Variablen des Ntors. Diese Variablen werden ausserhalb des Ntors von<br />

Summengebern benutzt, um daraus weitere Gleichungen aufzubauen. Der<br />

Anschluss eines Ntors muss also im Falle der elektrischen Ntore nicht<br />

zwingend eine Hochspannungs-Klemme darstellen. Möglich sind weitere<br />

Signalklemmen, wie z.B. ein Ist-Werteingang eines Reglers. Ein elektrischer<br />

Anschluss verknüpft immer Variable, die in Kirchhoff-Gleichungen<br />

verwendet werden, um die Topologie eines Netzes zu formulieren. Je nach<br />

Anwendungsfall sind dies unterschiedlich viele Anschlüsse.<br />

3.2.2 Anschluss<br />

Der Anschluss bildet die Verbindung zwischen Ntor und Summengeber.<br />

Jeder Anschluss steht dabei für eine gemeinsame Variable, die sowohl im<br />

Ntor als auch im verbundenen Summengeber in den Gleichungen auftritt.<br />

Pro gemeinsame Variable (immer reell) ist ein Anschluss zu instantiieren.<br />

Ein elektrischer Anschluss verknüpft immer Variable, die in Kirchhoff-<br />

Gleichungen verwendet werden, um die Topologie eines Netzes zu formu-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Σ


3.2. DOMÄNENMODELL 53<br />

Σ<br />

a1<br />

summiert alle<br />

verbundenen a‘s b2<br />

c<br />

Σ<br />

summiert alle<br />

verbundenen b‘s<br />

Ntor<br />

V<br />

Variable<br />

Anschluss<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

hat<br />

P<br />

Parameter<br />

Σ<br />

E<br />

Gleichungen<br />

Summengeber<br />

Abbildung 3.14: Verknüpfung als Verbindungspfad zwischen Variablen<br />

lieren. Je nach Anwendungsfall (DC, AC symmetrisch, allgemein dreiphasig<br />

usw.) sind dies unterschiedlich viele Anschlüsse.<br />

Anschlüsse sind ausserhalb des Ntors immer über Summengeber miteinander<br />

verbunden. Summengeber können über die Anschlüsse auf indizierte<br />

Variable der Ntore zugreifen.<br />

Jeder Anschluss besitzt zwei Informationen. Die eine Information k<br />

identifiziert das zugehörige Ntor innerhalb eines Netzes. Die andere Information<br />

j ist ein Index, der Teil einer Identifikation (Schlüssel) ist.<br />

3.2.3 Variable<br />

<strong>Eine</strong> weitere, zentrale Entität ist die Variable. Diese Entität hat ein Wertattribut,<br />

das auf dem Rechner als Double-PRECISION-Wert abgespeichert<br />

ist. Der Wert ist initialisierbar. Der Wert gehört zu der Komponente xvnr<br />

des Vektors der Unbekanntenx innerhalb des Gleichungssystemsg(x,p)=<br />

0.<br />

Ein Grundgedanke dieses Modells liegt darin, dass es zwei verschiedene<br />

Sichten auf ein und denselben numerischen Wert xvnr gibt. <strong>Eine</strong> Sicht<br />

bedeutet einen Zugriffsweg auf den numerischen Wert einer Variablen.<br />

Die erste Sicht bezieht den numerischen Wert auf die Komponente eines<br />

Vektors von zugehörigen Zuwächsen, die im Zuge des Lösungsvorganges<br />

des nicht-linearen Gleichungssystems beteiligt sind. Die Lage der Komponente<br />

im Vektor ist nicht zum Voraus bekannt. Sie ist von vielen Grössen


54 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

abhängig. Diese sind:<br />

• die Anzahl der im Netz vorhandenen Ntore und Summengeber<br />

• die Instantiierungsreihenfolge<br />

• die Anzahl der Variablen im Netz vorkommender Ntore und Summengeber<br />

• der aktuellen Zustand, in dem sich ein Ntor oder Summengeber befindet<br />

Der Zugriff für die erste Sicht wird durch eine bei der Variablen abgespeicherte,<br />

ganzzahligen Zahl vnr (Integer) ermöglicht. Der Wertebereich<br />

dieser Zahl umfasst die Anzahl der in den Netzen vorkommenden Variablen.<br />

Die zweite Sicht bezieht sich auf die Beschreibung der Gleichungen mit<br />

Hilfe von Variablen und Parameter. Diese Gleichungen werden einerseits<br />

lokal in Ntoren und netzweit mit Summengebern formuliert. Die Funktion<br />

Vk(basename,anr) ermöglicht diesen Zugriff. Sie gibt den numerischen<br />

Wert einer Variablen heraus, die durch eine Zeichenkette basename und<br />

einen optionalen, ganzzahligen Wert anr innerhalb des Namenraumes eines<br />

Ntors k identifizierbar ist. Im gleichen Namensraum sind auch die<br />

Parameter eines Ntors k angesiedelt. Variable innerhalb von Summengebern<br />

sind von aussen nicht zugreifbar. Dazu fehlt den Summengebern die<br />

Anschlüsse zu ihren (optionalen) Variablen.<br />

3.2.4 Parameter<br />

Ein Parameter ist eine Entität, welche die bekannten Werte p von Ntoren<br />

oder Summengebern darstellen. Er hat ein Wertattribut, das auf dem Rechner<br />

durch einen Double-PRECISION-Wert dargestellt ist. Der Parameter<br />

kann von einem Klienten auf einen bestimmten Wert gesetzt werden. Dieser<br />

Wert ist während des Auflösens des nicht-linearen Gleichungssystems<br />

g(x,p)=0 konstant.<br />

3.2.5 Ntor<br />

Das Ntor modelliert typischerweise ein vernetzbares Betriebsmittel, wie<br />

einen Generatoren, eine Last, eine Leitung usw. Das Ntor wird als end-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


3.2. DOMÄNENMODELL 55<br />

licher Automat betrachtet, der das Verhalten BN σ(Vσ,Pσ,E σ,Tσ) in jedem<br />

Zustand σ aufweist. Im Gegensatz zum im Kapitel 3.2.6 beschriebenen<br />

Summengeber ist das Verhalten zur Spezifikationszeit eines Ntors<br />

bekannt. Die ngσ Gleichungen liegen im gesamten Gleichungssystem an<br />

den Stellen q bis q + ngσ − 1. <strong>Eine</strong> wichtige Eigenschaft ist, dass diese<br />

Gleichungen unabhängig von der Topologie des Netzes formulierbar sind,<br />

in welchem das Ntor eingesetzt ist. Die Gleichungen werden durch eine<br />

bekannte Menge V von nvσ Variablen mit der Lage s bis s + nvσ − 1im<br />

Gleichungssystem und Parametern P beschrieben.<br />

Das Verhalten BN σ im Zustand σ enthält die folgenden Mengen:<br />

Vσ = { xs,xs+1,...xs+nvσ−1 }<br />

Pσ = { p1, p2,...pnpσ }<br />

E σ = { gq(V [q]<br />

σ ,P [q]<br />

σ )=0,<br />

gq+1(V [q+1]<br />

σ ,P [q+1]<br />

σ<br />

···,<br />

)=0,<br />

gq+ngσ−1(V [q+ngσ−1]<br />

σ , P [q+ngσ−1]<br />

σ )=0 }<br />

Tσ ={ v−pa≥0⇒Folgezustand = σ1,<br />

pb − v ≥ 0 ⇒ Folgezustand = σ2 }<br />

Dabei ist Parameter pa, pb ∈ Pσ, mit pa > pb und die Variable v ∈ Vσ. In<br />

jedem Zustand σ gibt es maximal zwei Folgezustände σ1 und σ2.<br />

Es sind verschiedene Strategien für den Zustandwechsel möglich. Da<br />

der endliche Automat im Ntor spezifiziert ist, kann und soll das Ntor zur<br />

Laufzeit entscheiden, ob ein Zustandsübergang angezeigt ist. Das Ntor soll<br />

aber nicht selbständig wechseln.<br />

Es wird daher die Strategie unterstützt, dass das Ntor dem Klienten anzeigt,<br />

dass die Bedingung für einen Zustandswechsel erfüllt ist. Die Kontrolle<br />

liegt dann beim Klienten den Zustandswechsel im Ntor zu veranlassen.<br />

Das Ntor wechselt dann in den spezifizierten Nachfolgezustand σi. Ab<br />

dann gilt im Ntor das neue Verhalten BN σi (Vσi ,Pσi ,E σi ,Tσi ). Tσ = {}<br />

bezeichnet einen Zustand ohne Nachfolgezustand.<br />

Diese Zustandsbeschreibung erlaubt, für gewisse Bedingungen von Variablen<br />

des Ntors, die Gleichungsmenge und damit das Verhalten zu ändern.<br />

Dies ist in der Praxis dann wichtig, wenn z.B. in einem Lastfluss ein PV-<br />

Generator wegen begrenzter Blindleistung Q das Verhalten eines PQ-Generator<br />

erhalten soll.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


56 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

3.2.6 Summengeber<br />

Summengeber formulieren und instantiieren Summenbeziehungen zwischen<br />

Basisnamen von Variablen. Ein Summengeber s greift auf Variable der<br />

Ntore zu, um weitere Teilmengen von Gleichungen<br />

g [s] (x [s] ,p [s] )=0 (3.19)<br />

zu formulieren. Diese Gleichungen drücken typischerweise topologische<br />

Beziehungen aus, die als Inzidenzbeziehungen innerhalb von Netzwerken<br />

bezeichnet werden. Ein Summengeber hat ng Instanzen von elementaren<br />

Summentypen und eine Menge A verknüpfter Anschlüsse. Alle elementaren<br />

Summentypen ergeben Gleichungen mit n Variablen, die einen gemeinsamen<br />

Basisnamen basename haben. Wahlweise kann eine Variable<br />

lv und ein Parameter par in die Summe einbezogen werden. Ein Summengeber<br />

kann mit beliebig vielen Ntoren in Beziehung stehen. Es gibt die<br />

folgenden, parametrierbaren Summentypen (Elementarsummen):<br />

1. EinzeiligeSumme(basename,[lv,][par,]A ):<br />

n<br />

∑ Vki<br />

i=1<br />

(basename, ji)[+lv][+par]=0 (3.20)<br />

2. MehrzeiligeSumme(basename, A ):<br />

Vk1 (basename, j1) − Vk2 (basename, j2) = 0<br />

Vk2 (basename, j2) − Vk3 (basename, j3) = 0<br />

··· = 0 (3.21)<br />

Vkn−1 (basename, jn−1) − Vkn (basename, jn) = 0<br />

Das Verhalten BS(A ,E ) eines Summengebers wird durch die nachfolgend<br />

beschriebenen Mengen charakterisiert. Dabei steht Sum stellvertretend<br />

für beide elementaren Summentypen.<br />

A = { Anschluss1,Anschluss2,... ,Anschlussn }<br />

E = { gq = Sum( basenameq,[lvq,][parq,]A ),<br />

gq+1 = Sum( basenameq+1,[lvq+1,][parq+1,]A ),<br />

···,<br />

gq+ng−1 = Sum( basenameq+ng−1,[lvq+ng−1,]<br />

[parq+ng−1,]A ) }<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


3.3. FUNKTIONALITÄT DES DOMÄNENMODELLS 57<br />

Im Gegensatz zum Ntor ist das Verhalten BS zur Spezifikationszeit noch<br />

nicht vollständig bekannt. Die aktuelle Menge der zu verknüpfenden Anschlüsse<br />

A kennt man erst, nachdem Netzdaten eingelesen worden sind.<br />

3.3 Funktionalität des Domänenmodells<br />

Dieses Unterkapitel fasst die Funktionen sowie die Merkmale des postulierten<br />

Domänenmodells zusammen. Dabei wird der Anwendungsbereich<br />

des Domänenmodells zusammenfassend dargestellt. Das Domänenmodell<br />

liefert eine Basis, auf der sich die drei Funktionen Netzaufbau, Netzberechnung<br />

und Resultatanzeige aufbauen lassen.<br />

3.3.1 Netzaufbau<br />

Das Domänenmodell enthält die Elemente Ntor, Summengeber und Anschluss,<br />

aus denen beliebige Netze modelliert werden können. In einem<br />

Netz lassen sich beliebig viele Ntor- und Summengeber-Typen definieren.<br />

Dabei kann eine beliebige Menge von Instanzen miteinander in beliebiger<br />

Topologie verknüpft werden, solange die Verknüpfungsregeln des<br />

Domänenmodells nicht verletzt werden.<br />

3.3.2 Netzberechnung<br />

Das Domänenmodell enthält sämtliche Elemente, aus denen die Netzberechnung<br />

nach dem Ntor-Modellierungs-Ansatz aufgebaut wird. Das dabei<br />

entstehende gesamte Gleichungssystem g(x,p)=0 enthält ng gleichzeitige,<br />

nichtlineare Gleichungen, gebildet aus den Unbekannten<br />

x = {x1,x2,···xnv} und den Bekannten p. Die gesamte Variabilität des Verhaltens<br />

wird ausschliesslich durch die Bausteine Ntor und Summengeber<br />

erbracht. Pro Baustein-Typ werden dabei beliebige Teilmengen von g, x<br />

und p spezifiziert und verwaltet.<br />

Dabei sind die folgenden Punkte zu berücksichtigen:<br />

1. Es gibt keine netzbezogenen Gleichungen ausserhalb von Summengebern<br />

und Ntoren.<br />

2. Alle Komponenten vonx sind kontinuierliche Variablen.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


58 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

3. Die Gesamtzahl der Variablen nv ist gleich der Gesamtzahl der Funktionen<br />

ng. Dies ist eine notwendige aber nicht hinreichende Bedingung<br />

für die Lösbarkeit des nichtlinearen Gleichungssystems.<br />

4. Die linearisierten Teile von g sind linear unabhängige Funktionen.<br />

5. ∃ ∂gi(x,p)<br />

∂x ∀{i, j}: Es existieren alle ersten partiellen Ableitungen der<br />

j<br />

Gleichungen nach allen Unbekannten.<br />

6. Netzweit gültige Daten, wie z.B. die Bezugsscheinleistung oder die<br />

Bezugsspannungen sind bei jedem Bausteintypen als Parameter p zu<br />

modellieren.<br />

7. Für sämtliche Variablen sind Anfangswerte für den Newton-Raphson-<br />

Algorithmus vorzugeben.<br />

Innerhalb eines Ntors lassen sich beliebige Funktionen bilden, solange<br />

sich diese nach allen Variablen dieses Ntors ableiten lassen. Hingegen<br />

haben Funktionen von Variablen von verschiedenen Summengeber-Instanzen<br />

stets die Form von Elementarsummen.<br />

3.3.3 Resultat-Anzeige<br />

Das Domänenmodell kennt die unbekannten Grössen und ihre Zugehörigkeit<br />

zu den Bausteinen. Daraus ist grundsätzlich eine objekt-orientierte<br />

Resultatanzeige-Funktion ableitbar.<br />

3.4 Beispiel<br />

An dieser Stelle wird ein genügend einfaches Beispiel für eine Modellierung<br />

mit Entitäten des Domänenmodells betrachtet. Abbildung 3.15 gibt<br />

einen vollständigen Überblick über dieses Modellierungs-Beispiel.<br />

Darin ist eine Glühlampe über eine Leitung an einer Batterie angeschlossen.<br />

In dieser einfachen Anordnung soll das stationäre Verhalten<br />

modelliert werden.<br />

In einem ersten Schritt werden für die drei Betriebsmittel einzelne Ersatzschaltbilder<br />

erstellt, die durch Rechtecke begrenzt sind. Die Ersatzschaltbilder<br />

werden an nummerierten Klemmen zusammengeschaltet. Die<br />

Batterie und die Last haben eine Klemme, die Leitung hat zwei Klemmen.<br />

Da nur das stationäre Verhalten interessiert, reicht je eine Zustandsgrösse<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


3.4. BEISPIEL 59<br />

+<br />

-<br />

+ -<br />

4.5V<br />

Batterie Leitung Last<br />

R<br />

Uq<br />

I1<br />

1 1 2 1<br />

I1 R I2 I1 U1 U1<br />

U2 U1 I1 U1<br />

U1 I1 U<br />

U1 I<br />

I1 2 I R + Uq - = 0 - + R + 2 = 0<br />

- 1 R = 0<br />

+ = 0<br />

U 1 Batterie<br />

I 1 Batterie<br />

-<br />

U 1<br />

Leitung<br />

+ I1 = 0<br />

Leitung<br />

= 0<br />

U 2<br />

I 2<br />

-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

U 1<br />

Leitung Last<br />

= 0<br />

+ I1 = 0<br />

Leitung Last<br />

Verbindungsstelle Verbindungsstelle<br />

1 2<br />

Abbildung 3.15: Modellierungs-Beispiel<br />

R<br />

Betriebsmittel<br />

Ersatzschaltbilder<br />

für die Modellierung<br />

der Ntor-Typen<br />

Ntor-<br />

Gleichungen<br />

Summengeber-<br />

Gleichungen<br />

für den Strom I und die Spannung U. Im Ersatzschaltbild werden darauf<br />

sämtliche Variablen und Parameter eingetragen. Die neben der Klemme i<br />

stehenden Variablen werden mit i indiziert. Man beachte, dass die Symbolnamen,<br />

z.B. I1 oder auch R, nur innerhalb des Ersatzschaltbildes eines<br />

Ntors eindeutig sein müssen.<br />

Nach diesen Vorbereitungen kann die Anordnung mit dem Domänen--<br />

Modell formuliert werden. Die drei verschiedenen Betriebsmittel werden<br />

durch drei Ntor-Typen wie in Tabelle 3.6 modelliert.<br />

<strong>Eine</strong> elektrische Verbindungsstelle wird durch einen Summengeber mo-<br />

Betriebsmittel V P E<br />

Batterie {U1,I1} {R,Uq} {I1R+Uq−U1 =0}<br />

Leitung {U1,U2,I1,I2} {R} {−U1+I1R+U2 =0,I1+I2 =0}<br />

Last {U1,I1} {R} {U1 − I1 R = 0}<br />

Tabelle 3.6: Ntor-Typen für das Beispiel<br />

Σ


60 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

delliert. Dieser ist so parametriert, dass er die Kirchhoffschen Gesetze<br />

formuliert:<br />

E = { EinzeiligeSumme(Basisname = I),<br />

MehrzeiligeSumme(Basisname = U);}<br />

Die Menge der Anschlüsse ist dem Summengeber erst nach dem Einlesen<br />

der Netzdaten bekannt. Dann kennt z.B. die Verbindungsstelle1 in der Abbildung<br />

3.15 die Menge der Anschlüsse A . Diese umfasst den Anschluss<br />

1 der Batterie und den Anschluss 1 der Leitung.<br />

Betriebsmittel Anschluss speichernde Instanz<br />

Batterie Batterie-1 Verbindungsstelle1<br />

Leitung Leitung-1 Verbindungsstelle1<br />

Leitung-2 Verbindungsstelle2<br />

Last Last-1 Verbindungsstelle2<br />

Tabelle 3.7: Anschlüsse beim Beispiel<br />

Die gestrichelten Pfade der Abbildung 3.15 verbinden gleichwertige<br />

Variable in zwei verschiedenen Systemen. Das eine System wird durch<br />

Gleichungen der Ntore, das andere durch solche der Summengeber gebildet.<br />

Man beachte, dass aber in beiden Fällen der gleiche numerische Wert<br />

gemeint ist. Die Anzahl der linear unabhängigen Gleichungen ist gleich<br />

der Anzahl der Variablen (8). Dies ist eine notwendige Bedingung, damit<br />

das (lineare) Gleichungssystem dieses Beispiels auflösbar ist. Diese Variablen<br />

entsprechen den Unbekannten x des Gleichungssystems g(x,p). Die<br />

Zuordung ist in Tabelle 3.8 dargestellt.<br />

Unbekanntex Variable der Ntore<br />

x1<br />

x2<br />

x3<br />

x4<br />

x5<br />

x6<br />

x7<br />

x8<br />

U1Batterie<br />

U1Leitungen<br />

U2Leitungen<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

U1Last<br />

I1Batterie<br />

I1Leitungen<br />

I2Leitungen<br />

I1Last<br />

Tabelle 3.8: Zuordnung der Variablen auf Unbekanntex<br />

Tabelle 3.9 zeigt alle Gleichungen auf, welche einerseits durch die Ntor-<br />

Instanzen “Batterie”, “Leitung” und “Last” andererseits durch die Sum-


3.4. BEISPIEL 61<br />

mengeber-Instanzen “Verbindungsstelle1” und “Verbindungsstelle2” formuliert<br />

werden.<br />

Gleichungen g(x,p) formulierende Instanz<br />

x5 · RBatterie +UqBatterie − x1 = 0 Batterie<br />

−x2 + x6 · RLeitung + x3 = 0 Leitung<br />

x6 + x7 = 0<br />

x4 − x8 · RLast = 0 Last<br />

x1 − x2 = 0 Verbindungstelle1<br />

x5 + x6 = 0<br />

x3 − x4 = 0 Verbindungsstelle2<br />

x7 + x8 = 0<br />

Tabelle 3.9: Gleichungssystem g(x,p) für das Beispiel<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


62 KAPITEL 3. NETZMODELLIERUNG UND NETZBERECHNUNG<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Kapitel 4<br />

Framework<br />

Johnson [21] definiert ein Framework wie folgt: “A framework is a set of<br />

classes that embodies an abstract design for solutions to a family of related<br />

problems”.<br />

4.1 Einleitung<br />

Der Begriff des Frameworks ist in Kapitel 2.5 allgemein erläutert worden.<br />

In diesem Kapitel wird ein Framework beschrieben, das das gemeinsame<br />

Programm-Design von Simulationsabläufen enthält wie sie bei vernetzbaren<br />

Entitäten auftreten. Das Framework bildet ein wichtiges Element der<br />

in Kapitel 5 beschriebenen Domänen-Architektur.<br />

Dieses Element besteht aus hart-codierten, eng-gekoppelten Klassen,<br />

die innerhalb ähnlicher Applikationen den stabilen Codeteil mit der vergleichsweise<br />

längsten Lebensdauer bilden.<br />

Das Framework definiert einerseits die gemeinsame Struktur von Newton-Raphson-Verfahren<br />

mit vernetzbaren Entitäten (siehe Kapitel 3) und<br />

legt andererseits Schnittstellen fest, an denen der Klient spezifischen Anpassungen<br />

vornimmt. Die Anpassung geschieht wie bereits in Kapitel 2<br />

beschrieben durch Ableitung weiterer Klassen, bzw. durch Überschreiben<br />

von bestimmten Methoden.<br />

Dieses Framework lässt sich innerhalb eines Bereichs von ähnlichen Simulationsproblemen<br />

anwenden. Dieser Anwendungsbereich wird in Kapitel<br />

3 aufgezeigt.<br />

Es wird die Implementation der Dienste beschrieben, die das Framework<br />

anbietet. Dies ist der Netzaufbau, die Netzberechnung und die Resultatausgabe.<br />

Dazu werden die benutzten Mechanismen und deren Implementation<br />

dargestellt. Für jeden einzelnen Dienst werden die für den<br />

63<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


64 KAPITEL 4. FRAMEWORK<br />

Klienten wichtigen Programmschnittstellen (API, engl. Application Programming<br />

Interface) aufgezeigt.<br />

Das vorliegende Framework ist das Resultat einer iterativen Entwicklung.<br />

Das Framework wurde in konkreten Aufgabenstellungen (siehe Kapitel<br />

6) getestet und entwickelt.<br />

Abschliessend werden Entscheidungen bei der Implementation aufgezeigt,<br />

welche die Programmiersprache, die Bibliotheken und die Portierbarkeit<br />

des Frameworks betreffen.<br />

4.2 Anwendungsbereich<br />

Das Framework deckt einen bestimmten Bereich von Anwendungen ab.<br />

Dieser Bereich wird im Domänenmodell auf Seite 57 festgelegt. Für das<br />

in dieser Arbeit realisierte Framework gelten folgende zusätzliche Festlegungen:<br />

• Es sucht eine Lösung innerhalb einer maximalen Anzahl Iterationen<br />

und innerhalb einer Toleranz.<br />

• Pro Ntor lässt sich eine Variable überwachen. Ab einem parametrierbaren<br />

Konvergenzgrad wird geprüft, ob die überwachte Variable innerhalb<br />

eines Bereichs liegt. Liegt sie ausserhalb, wird das Verhalten<br />

des Ntors geändert und mit dem begrenzten Wert der Variablen als<br />

Anfangswert erneut eine Lösung gesucht.<br />

• Atomare Ntore: Keine Typenschachtelung<br />

4.3 Implementation des Domänen-Modells<br />

Dieser Abschnitt gibt einen Überblick über das aktuelle Framework. Es<br />

zeigt die Klassen, welche das in Kapitel 3 beschriebene Domänen-Modell<br />

darstellen. Die Klassen VNtor, VSummengeber, NetzObjekt, LinSolver<br />

und NewtonRaphson sind im Laufe der Entwicklung des Frameworks hinzugekommen.<br />

Alle Klassen sind eng-gekoppelt und erbringen zusammen<br />

die Dienste des Frameworks. Die Klassen leisten dabei ihren Beitrag je<br />

nach zugeordneter Verantwortung. Diese Beiträge werden bei den weiter<br />

unten beschriebenen Diensten im Einzelnen aufgeführt, sofern dies nicht<br />

bereits beim Domänen-Modell geschehen ist.<br />

Abbildungen 4.1 und 4.2 zeigen die statische Klassenstruktur auf.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


4.3. IMPLEMENTATION DES DOMÄNEN-MODELLS 65<br />

A<br />

Parameter Variable Anschluss<br />

B<br />

B spezialisiert A<br />

hat<br />

Parameter<br />

Adaptierbare Teile<br />

NetzObjekt<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Netz<br />

NewtonRaphson<br />

VNtor VSummengeber<br />

Ntor Summengeber<br />

Abbildung 4.1: “Ist-ein”-Beziehungen (is-a) zwischen Klassen<br />

0 oder >0, falls<br />

nichts angegeben<br />

genau ein<br />

0 oder 1<br />

Netz<br />

Ntor gehört zu Anschluss<br />

name name<br />

hat<br />

1+<br />

Variable<br />

name name<br />

hat<br />

2+<br />

hat<br />

hat<br />

verbunden mit<br />

Einzeilige Mehrzeilige<br />

Summe Summe<br />

1+ 1+<br />

hat<br />

Einzeilige<br />

Summe<br />

hat<br />

LinSolver<br />

Abbildung 4.2: “Hat”-Beziehungen (has) zwischen Klassen<br />

Summengeber<br />

hat hat<br />

Mehrzeilige<br />

Summe


66 KAPITEL 4. FRAMEWORK<br />

In der Abbildung 4.1 stehen die Basis-Klassen zuoberst. Weiter unten<br />

angesiedelte Klassen erben von den Basis-Klassen Daten (Attribute) und<br />

Verhalten (Methoden).<br />

4.4 Netzmodellierung<br />

Die hier dargestellten Klassen sind dafür verantwortlich, ein Netz aus Instanzen<br />

der beiden Klassen Ntor und Summengeber zu modellieren.<br />

• NetzObjekt: Identifiziert Objekte durch einen Namen. Die Identifikation<br />

bereits instantiierter Objekte wird beim Verknüpfen von<br />

Summengeber- und Ntoren benötigt.<br />

• Ntor: spezielle Ntor-Klasse, deren Verhalten vom Klienten spezifiziert<br />

wird. Der Konstruktor der Ntore hat die Form:<br />

typname(char* name [, Parametertyp Parameter ])<br />

Die Parameter-Menge wird vom Klienten festgelegt. Es ist eine beliebige<br />

Anzahl Parameter möglich. Die Zeichenkette char* name identifiziert<br />

Ntor-Instanzen. Der Bezeichner typname identifiziert Ntor-<br />

Klassen.<br />

• Summengeber: spezieller Summengeber-Typ mit Namen<br />

typname, dessen Verhalten vom Klienten spezifiziert wird. Der Konstruktor<br />

der Summengeber hat die Form:<br />

typname(char* name [, Parametertyp Parameter ])<br />

Die Parameter-Menge wird vom Klienten festgelegt. Es ist eine beliebige<br />

Anzahl Parameter möglich. Die Zeichenkette char* name identifiziert<br />

Ntor-Instanzen. Der Bezeichner typname identifiziert Ntor-<br />

Klassen.<br />

• VSummengeber: Diese Klasse implementiert die Summengeber-Basisklasse<br />

und stellt einen Platzhalter für die vom Klienten zu definierenden<br />

Summengeber-Typen dar.<br />

– InsertAnschluss(char* name, int i, VNtor* nt)<br />

Der Konstruktor erzeugt am Ntor nt einen Anschluss mit dem<br />

Index i und dem Namen name.<br />

• Netz: Dies ist ein Behälter, der den Objektbestand aus Ntor- und<br />

Summengeber-Typen speichert. Für beide Kategorien gibt es je eine<br />

einfach-gebundene Liste. Da erst zur Laufzeit bekannt ist, welcher<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


4.5. NEWTON-RAPHSON-NETZBERECHNUNG 67<br />

aktuelle Typ in der Liste abzulegen ist, und C++ eine typenstrenge<br />

Sprache ist, ist ein allgemeiner Platzhalter anzugeben. Dies ist VNtor<br />

für die Ntor-Klassen und VSummengeber für die Summengeber-<br />

Klassen. Ntor- und Summengeber-Instanzen sind als Argumente mit<br />

den verlangten Typen zu kennzeichnen 1<br />

Methoden:<br />

– InsertNTor(VNTor* nt)<br />

Fügt die Ntor-Instanz nt ein.<br />

– InsertSumSetter(VSummengeber* sg)<br />

Fügt die Summengeber-Instanz sg ein.<br />

– InsertAnschluss(char* sname,char* n,int i)<br />

Verknüpft eine bereits geschaffene Summengeber-Instanz mit<br />

Namen sname mit einer Ntor-Instanz mit dem Namen n am Anschluss<br />

mit dem Index i. In der Summengeber-Instanz wird eine<br />

Anschluss-Instanz mit dem Index i eingefügt. Damit wird die<br />

Verbindung zwischen dem Summengeber und dem Ntor hergestellt.<br />

4.5 Newton-Raphson-Netzberechnung<br />

Der zentrale, algorithmische Dienst des Frameworks ist das Lösen eines<br />

nicht-linearen Gleichungssystems nach dem Newton-Raphson-Verfahren.<br />

Dieses Verfahren wird in drei Schritten implementiert:<br />

1. Zusammensetzen der Jacobimatrix und des Mismatch-Vektors aus dem<br />

lokal definierten Verhalten der Summengeber- und Ntor-Instanzen<br />

2. Lösen eines schwach-besetzten, linearen Gleichungssystems mit einem<br />

geeigneten Paket, das an den objekt-orientierten Programm--<br />

Kontext angepasst ist<br />

3. Aktualisieren der Unbekannten in den Ntoren und Summengebern<br />

4.5.1 Beitrag des lokal definierten Verhaltens<br />

Das gesamte, nichtlineare Gleichungssystem g(x,p)=0 wird aus Instanzen<br />

von Ntoren und Summengebern zusammengebaut.<br />

1 engl. casting<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


68 KAPITEL 4. FRAMEWORK<br />

Anzahl Funktionen<br />

q<br />

1<br />

k<br />

ng<br />

1<br />

ng<br />

k<br />

s<br />

0<br />

k<br />

Anzahl Variable<br />

nv<br />

k<br />

Ntor<br />

k<br />

0<br />

1 1 1 1<br />

1 -1<br />

1 -1<br />

1 1 1<br />

A<br />

von Ntoren erzeugt<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

nv<br />

von Summengebern erzeugt<br />

Abbildung 4.3: Struktur des schwachbesetzten, linearen Gleichungssystems<br />

Da die Lösung dieses Systems mit dem bekannten Newton-Raphson-<br />

Verfahren ermittelt wird, stellt die Matrix A (Siehe Abbildung 4.3) die<br />

Jacobi-Matrix dar. Der Vektor b entspricht den Mismatch-Werten und u<br />

den negativen Korrekturwerten, mit denen die Unbekannten pro Iterationsschritt<br />

verändert werden. Die symbolischen Ausdrücke der linearisierten<br />

Terme Aij und bi eines Newton-Raphson Iterationsschrittes werden nachfolgend<br />

dargestellt.<br />

Abbildung 4.3 zeigt die folgenden Zuordnungen:<br />

zum Ntork ⎧ gehörige Gleichungsterme:<br />

⎪⎨ :qk≤i


4.5. NEWTON-RAPHSON-NETZBERECHNUNG 69<br />

Aij =<br />

bi =<br />

⎧<br />

⎪⎨<br />

⎪⎩<br />

1:qk ≤i


70 KAPITEL 4. FRAMEWORK<br />

M<br />

C<br />

M<br />

B<br />

M<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

A<br />

Abbildung 4.4: Rekursion und Polymorphie<br />

Kommunikation zwischen Summengeber und Ntor-Variable<br />

Ein wesentlicher Datenaustausch findet zwischen dem Summengeber und<br />

den Variablen in Ntoren statt. Die Summengeber bilden in jeder Iteration<br />

Summen von Variablen, die sich in den angeschlossenen Ntoren befinden.<br />

Die Summengeber greifen auf diese Werte zu, um die eigenen Mismatch-<br />

Werte zu berechnen. Diese Aufgabe delegiert der Summengeber an seine<br />

Elementarsummen.<br />

Abbildung 4.5 zeigt die drei Teilschritte:<br />

1. Zeiger auf Variable beschaffen<br />

2. Wert der Variablen holen<br />

3. Position der Variablen im Gleichungssystem berechnen (siehe Methode<br />

GetLfNr(), S. 74)<br />

4.5.3 Aufgabenverteilung auf Klassen<br />

Am Aufbau des Gleichungssystems sind folgende Klassen beteiligt:<br />

• NewtonRaphson: Diese Basisklasse legt das Protokoll aller am Newton-Raphson<br />

Algorithmus beteiligten Klassen fest. Alle davon abgeleiteten<br />

Klassen (siehe Kapitel 2.4.2) unterstützen dieses Protokoll,<br />

indem sie die hier angegebenen Methoden sinngemäss auf ihrer Stufe<br />

implementieren. In Anlehnung an Abbildungen 4.3 und 4.4, stellen<br />

k, sk, qk Indizes dar, die für alle Teilmatrizen und Vektoren verschiedener<br />

Objekt-Instanzen k gelten. Die Schnittstellen der Methoden<br />

dieser Basisklasse sind die Vereinigungsmengen der Parameter aller<br />

abgeleiteten Klassen. Andererseits implementieren nicht alle von dieser<br />

Basisklasse abgeleiteten Klassen alle Methoden.<br />

Die zugehörigen Methoden sind:


4.5. NEWTON-RAPHSON-NETZBERECHNUNG 71<br />

Summengeber Anschluss Ntor Variable<br />

1<br />

2<br />

3<br />

GetVar(Grundname)<br />

VarName =<br />

Grundname.index<br />

vp existiert<br />

vp -> GetValue<br />

Wert der Variablen<br />

GetOwnNtor<br />

nt existiert<br />

nt ->GetLfNr(vp)<br />

LfNr<br />

GetVar(VarName)<br />

vp existiert<br />

nt = Zeiger auf Ntor<br />

GetName<br />

name = VarName<br />

vp = Zeiger auf Variable<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

name<br />

GetName<br />

name<br />

nt ->GetLfNr(vp)<br />

LfNr<br />

LfNr = LfNr + StartLfNr<br />

Abbildung 4.5: Datenaustausch Summengeber-Variable<br />

– void CountNonZeroes(int& nZ)<br />

Der Solver braucht, wie auf Seite 75 beschrieben, zur Initialisierung<br />

die Anzahl der Nichtnull-Elemente der gesamten “A”-<br />

Matrix. Die erbende Klasse addiert zu der Zahl nZ die Anzahl<br />

der Nichtnull-Elemente in ihrer “A”-Teilmatrix.<br />

– void SetFunStartLfNr(int& fnr)<br />

Die Instanz k setzt die Anfangszeile qk ihrer A-Teilmatrix auf den<br />

Wert fnrund addiert die Anzahl der Gleichungen ngk.<br />

– void SetVarStartLfNr(int& vnr)<br />

Die Instanz k setzt die Anfangsspalte sk ihrer A-Teilmatrix auf<br />

den Wert vnr und addiert die Anzahl ihrer Variablen nvk.<br />

– void InsertRVar(RVar* rv)<br />

Fügt eine Variable in die Menge Vk eines Ntors k ein.<br />

– void InsertRPar(RPar* rp)<br />

Fügt einen Parameter in die Menge Pk eines Ntors k ein.<br />

Zeit


72 KAPITEL 4. FRAMEWORK<br />

– RVar* GetVar(char* name)<br />

Holt eine Variable mit Namen name aus der Menge Vk eines<br />

Ntors k.<br />

– RPar* GetPar(char* name)<br />

Holt einen Parameter mit Namen name aus der Menge Pk<br />

– double GetAElem(int i, int j, int state)<br />

Die Instanz k liefert das Element Aqk+i,sk+ j ihrer Teilmatrix A für<br />

einen Zustand state. Bei zustandslosen Instanzen ist der Parameter<br />

state wirkungslos.<br />

– double GetbElem(int i, int state)<br />

Die Instanz k liefert das Element bqk+i ihres Teilvektors b für<br />

einen Zustand state. Bei zustandslosen Instanzen ist der Parameter<br />

state wirkungslos.<br />

– void PutSolver(LinSolver& solver)<br />

Die Instanz k füttert den Solver solver mit der “A”-Teilmatrix und<br />

dem “b”-Teilvektor.<br />

– void GetFromSolver(LinSolver& solver)<br />

Holt die Korrekturwerte für die Variablen xi ,i = sk ...sk +nvk<br />

der Instanz k aus der Lösung des gesamten Gleichungssystems<br />

und addiert sie zu diesen Variablen.<br />

– void GetMaxMismatch(double& MaxMism)<br />

Der maximale Mismatch ist eine Kenngrösse, an welcher der<br />

Konvergenzverlauf des Newton-Raphson-Verfahrens erkennbar<br />

ist. Wie in Kapitel 3.1.4 beschreiben, ist der maximale Mismatch<br />

der betragsmässig grösste Wert der einzelnen Abweichungen<br />

der Funktionswerte. Die Instanz k berechnet ihre bi im Bereich<br />

i = qk ...qk+ngk und überschreibt MaxMism, falls ein betragsmässig<br />

grösserer Wert auftritt.<br />

– int Limiter()<br />

Testet und meldet, ob eine Variablen-Grenze aktiv wurde. Falls<br />

dies eintrat, wird entsprechend der Ntor-Spezifikation das Verhalten<br />

BN σi (Vσi ,Pσi ,E σi ,Tσi ) des Nachfolgezustandes σi eingerichtet.<br />

– double CheckLimits(double v, min, max)<br />

Begrenzt einen Wert v auf das Band zwischen min und max und<br />

meldet, ob v begrenzt wurde.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


4.5. NEWTON-RAPHSON-NETZBERECHNUNG 73<br />

– void PrintVarsAndPars()<br />

Diese Methode implementiert den Dienst Resultatausgabe. Die<br />

Resultatausgabe erfolgt auf die Standard-Ausgabe des Betriebssystems.<br />

Liefert die aktuellen Werte der Mengen Vk und Pk einer<br />

Instanz k.<br />

• Netz: Die Klasse Netz ist mit folgenden Methoden an der Netzberechnung<br />

und Resultatanzeige beteiligt:<br />

– Netz(char* name, char* F, char* file)<br />

Der Konstruktor liest Netzdaten und interpretiert diese gemäss<br />

dem gewählten Tauschformat F. Dabei wird ein Objektbestand<br />

im Netz-Objekt abgespeichert und für die Berechnung vorbereitet.<br />

Falls die Anzahl der Variablen und Funktionen nicht übereinstimmt,<br />

ist ein späterer Aufruf der Methode Calculate wirkungslos.<br />

– Calculate(int maxIter, double dfein, double dgrob)<br />

Versucht innerhalb maxIter Iterationen und einer Mismatch-Toleranz<br />

von dfein eine Lösung zu finden. Testet dabei ab einer<br />

zweiten, gröberen Mismatch-Toleranz dgrob, ob das Verhalten<br />

von Ntoren aufgrund aktiv gewordener Variablengrenzen zu ändern<br />

ist. Falls dies zutrifft, wird das Verhalten gemäss Spezifikation<br />

des Ntors geändert und ein neuer Newton-Raphson-Prozess<br />

mit den auf die Grenzen gesetzten Variablen als Anfangswerte<br />

gestartet. Abbildung 4.6 zeigt den Programmablauf. Die Methode<br />

hat folgende mögliche Resultate:<br />

1. Keine Rechnung, wegen Netzfehler. Ein Netzfehler tritt auf,<br />

wenn die Anzahl der Variablen und Funktionen nicht übereinstimmt,<br />

oder versucht wurde, nichtexistente Bausteine miteinander<br />

zu verbinden.<br />

2. Fehler wegen linear abhängiger Gleichungen oder numerischer<br />

Probleme, z.B. Division durch Null<br />

3. konvergierter Prozess ohne Zustandsänderung in Ntoren<br />

4. konvergierter Prozess mit Zustandsänderung in Ntoren<br />

5. divergierender Prozess<br />

• ElektroObjekt: Diese Klasse liefert die Identifikation eines Objektes<br />

durch einen eindeutigen Namen. Im Zuge der Netzberechnung bedarf<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


74 KAPITEL 4. FRAMEWORK<br />

es des Zugriffs auf identifizierbare Variable im Namensraum einer<br />

Ntor-Instanz.<br />

– char* GetName()<br />

Liefert den Namen (Zeichenkette) eines Objektes im Netzbestand.<br />

• Variable: Diese Klasse stellt eine Variable xi im Gleichungssystem<br />

dar und ist stets in Ntor- oder in Elementarsummen beheimatet.<br />

– Variable(char* name, int lfNr, double* var)<br />

Der Konstruktor erzeugt eine Variable mit dem Namen name.<br />

Die Variable ist lokal an der Stelle sk+lfNr einer Ntor- oder Elementarsummen-Instanz<br />

k angeordnet. Diese Anordnung muss<br />

konsistent sein mit der erzeugten Jacobi-Matrix und dem Unbekannten-Vektor.<br />

Über den Zeiger var wird die Verbindung zwischen<br />

Laufzeit-Namen der Variablen und dem zur Übersetzzeit<br />

bekannten Speicher-Symbol hergestellt. Das Speichersymbol wird<br />

für die Berechnung der Teilmatrizen und Teilvektoren benutzt.<br />

– double GetValue()<br />

Gibt den Wert einer Variablen.<br />

– double SetValue(double Value)<br />

Setzt den Wert einer Variablen.<br />

– int GetLfNr()<br />

Gibt die zur Festlegung der Reihenfolge der Variablen notwendigen<br />

Laufnummer lfnrinnerhalb einer Ntor-Instanz k an. Zusammen<br />

mit dem Wert sk ist der Index der Variable xi im gesamten<br />

Gleichungssystem berechenbar:<br />

i = sk + lfnr<br />

• Parameter: Diese Klasse stellt einen Parameter pi im Gleichungssystem<br />

dar und ist stets entweder in Ntor- oder in Elementarsummen-<br />

Instanzen beheimatet.<br />

– Parameter(char* name)<br />

Der Konstruktor erzeugt einen Parameter mit dem Namen name.<br />

• Anschluss: Diese Klasse implementiert die Verbindung zwischen<br />

Summengeber und Ntor.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


4.5. NEWTON-RAPHSON-NETZBERECHNUNG 75<br />

– Anschluss(char* name, int i, VNtor* nt)<br />

Der Konstruktor erzeugt am Ntor nt einen Anschluss mit dem<br />

Index i und dem Namen name.<br />

– Variable* GetVar(char* name)<br />

Implementiert die Zugriffsfunktion Vk(basename,i) auf eine Variable<br />

im zugehörigen Ntor k. In der Zeichenkette name ist<br />

basename und Index i zusammengehängt.<br />

• VSummengeber: Diese Klasse implementiert die Summengeber-Basisklasse<br />

und stellt einen Platzhalter für die vom Klienten zu definierenden<br />

Summengeber-Typen dar.<br />

– InsertAnschluss(char* name,int i,VNtor* meinNTor)<br />

Der Konstruktor erzeugt am Ntor meinNTor einen Anschluss mit<br />

dem Index i und dem Namen name.<br />

• VNtor: Diese Klasse implementiert die Ntor-Basisklasse und stellt<br />

einen Platzhalter für die vom Klienten zu definierenden Ntor-Typen<br />

dar.<br />

4.5.4 Lösen des linearen Gleichungssystems<br />

Das Lösen des linearen Gleichungssystems A · x = b geschieht mit einem<br />

bewährten und leistungsfähigen Softwarepaket aus der mathematischen<br />

Domäne. Dieses Paket besteht aus einzelnen Unterprogrammen. Es löst<br />

schwachbesetzte Gleichungssysteme mit der Genauigkeit des C oder C++-<br />

Typs “Double”. Es ist innerhalb der Klasse LinSolver gekapselt. Dadurch<br />

kann das Paket im objekt-orientierten Programm-Kontext des Frameworks<br />

benutzt werden. Die Klasse LinSolver hat folgende Schnittstelle:<br />

• LinSolver(int n, int nzmax)<br />

Der Klassen-Konstruktor benötigt die Dimension des Gleichungssystems<br />

n, sowie die Anzahl der Nicht-Nullelemente nzmax in der Matrix<br />

A. Je nach Wert dieser Parameter wird Speicher alloziert, der im<br />

Destruktor wieder freigegeben wird.<br />

• fillVector(double bi, int i)<br />

Schreibt bi i = 0,1,...,n−1<br />

• double readVector(int i)<br />

Gibt bi i = 0,1,...n−1<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


76 KAPITEL 4. FRAMEWORK<br />

ja<br />

ja<br />

Netzfehler<br />

?<br />

nein<br />

AnzIterationen = 0<br />

AnzIterationen<br />

> maxIter ?<br />

MaxMismatch = 0<br />

Anzahl Nichtnull-Elemente = 0<br />

Nichtnull-Elemente zählen<br />

LinSolver-Objekt<br />

instantiieren<br />

A und b aufbauen<br />

Gleichungssystem<br />

lösen<br />

ja<br />

Start<br />

Lösung<br />

verarbeiten<br />

dgrob>= nein<br />

MaxMismatch<br />

?<br />

ja<br />

Variablengrenzen testen und Variablen begrenzen<br />

Verhaltensänderung in Ntoren mit begrenzter Variable<br />

gibt es<br />

nein<br />

verletzte Grenzen<br />

?<br />

ja<br />

Anfangsspalten und -zeilen<br />

der Matrizen und Vektoren<br />

aller Ntore und Summengeber<br />

berechnen<br />

LinSolver-Objekt vernichten<br />

Ende<br />

nein<br />

Fehler<br />

?<br />

nein<br />

MaxMismatch berechnen<br />

Parameter: maxIter, dgrob, dfein<br />

AnzIterationen um 1 erhöhen<br />

MaxMismatch =<br />

dfein>=<br />

MaxMismatch<br />

?<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

b i max<br />

ja<br />

nein<br />

konvergiert<br />

über alle instantiierten Funktionen<br />

Abbildung 4.6: Programmablauf in Calculate<br />

nein<br />

MaxMismatch<br />

>> 0 ?<br />

ja<br />

divergiert


4.6. PROGRAMMIER-SCHNITTSTELLEN (API) 77<br />

• fillMatrix(double Aij, int i, int j)<br />

Schreibt Aij i,j=1,2,...,n<br />

• int Solve()<br />

Löst das Gleichungssystem und signalisiert Erfolg oder Misserfolg.<br />

• double ReturnSolution(int i)<br />

Liest xi , i = 0,1,...,n−1<br />

4.6 Programmier-Schnittstellen (API)<br />

Der Klient muss vom Framework mehr wissen, sobald er Dienste ändert.<br />

Falls es dafür noch keine passenden Adaptionselemente gibt, muss er in<br />

der Lage sein, diese zu bauen. Ein weiterer Grund kann darin liegen, dass<br />

der Klient das vorgeschlagene Default-Programm ersetzen muss, weil z.B.<br />

mehrere Newton-Raphson-Prozesse pro Simulation zu starten sind. Der<br />

Klient benutzt das Framework über die beiden grundsätzlich verschiedenen<br />

Programmierschnittstellen:<br />

1. Aktives API: Der Klient instantiiert selber Objekte des Frameworks<br />

und ruft ihre Methoden auf. Alle als “public” definierten Klassen<br />

und Methoden sind vom Klienten benutzbar. Der Klient benutzt das<br />

Framework hier im Sinne einer Klassenbibliothek (vergl. Black-Box-<br />

Ansatz in Kapitel 2). Pro Klasse muss der Klient wissen, wofür ein<br />

Objekt verantwortlich ist, was die einzelnen Methoden tun und wie<br />

die Schnittstellen aussehen.<br />

Der Klient ist für die Instantiierung, den Programmablauf und die Interaktion<br />

zwischen solchen Objekten verantwortlich. Das Framework<br />

legt kein Default-Verhalten fest.<br />

2. Passives API: Dies sind die adaptierbaren Stellen F im Framework,<br />

die der Klient an seine Applikation anpasst. Der Klient überschreibt<br />

dabei Methoden an dafür vorgesehenen Stellen des Frameworks (vergl.<br />

White-Box-Ansatz in Kapitel 2). Der Klient braucht sich dabei weder<br />

um die Objektinstantiierung noch um den Programmablauf der adaptierten<br />

Methode und seines Objektes zu kümmern. Das Framework<br />

ruft diese Methoden in der richtigen Reihenfolge auf und liefert ein<br />

Default-Verhalten, falls der Klient keine Adaption vornimmt.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


78 KAPITEL 4. FRAMEWORK<br />

Kontext Passives API Aktives API<br />

aufrufendes Netz-Konstruktor<br />

Programm Netz::Calculate<br />

Netz::PrintVarsAndPars<br />

Konstruktor Konstruktor der Basisklasse: VNtor(name)<br />

InsertVariable, InsertParameter<br />

Ntor- Konstruktoren Variable und Parameter<br />

Adaption GetAElem<br />

GetbElem<br />

PrintVarsAndPars<br />

Limiter<br />

SwitchState Listen:append/pop und CheckLimits<br />

Konstruktor Konstruktor der Basisklasse:<br />

VSummengeber(name)<br />

Summengeber- Konstruktoren der Elementarsummen<br />

Adaption Elementarsumme hinzufügen<br />

PrintVarsAndPars Iterator über Elementarsummen<br />

Netz- Konstruktor Konstruktor Ntor und Summengeber<br />

Aufbau InsertNtor, InsertSummengeber,<br />

InsertAnschluss<br />

Tabelle 4.1: API’s des Frameworks<br />

Andererseits muss der Klient wissen, was die Methoden, die er hier<br />

überschreibt, im Framework leisten sollen. Er muss das Protokoll<br />

des adaptierten Dienstes kennen. Ferner muss er das aktive API im<br />

Kontext dieser Methoden kennen, um die vorgesehene Leistung programmieren<br />

zu können.<br />

Die Methoden “append” und “pop” gehören zu der generischen Klasse<br />

(LEDA) zur Verwaltung von Listen. Die Methode “append” fügt ein Objekt<br />

in eine Liste, “pop” holt ein Objekt aus einer Liste. Das Framework<br />

enthält insgesamt 14 Klassen mit insgesamt 64 unabhängigen Methoden.<br />

Davon müssen für den Klienten 20 Methoden des aktiven und 8 Methoden<br />

des passiven API’s dokumentiert werden.<br />

4.7 Implementation<br />

Im Kapitel 2 sind die objekt-orientierten Konzepte beschrieben, die bei der<br />

Implementation des Frameworks benutzt werden. Ferner wird aufgezeigt,<br />

welche externen Bibliotheken eingesetzt werden.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


4.7. IMPLEMENTATION 79<br />

4.7.1 C++<br />

Als Programmsprache des Frameworks wurde C++ verwendet [27, 28].<br />

Die Sprache C++ unterstützt die objekt-orientierte Programmierung. Ferner<br />

ist die Implementation der Adaptionsphase in der Domänen-Architektur<br />

zu berücksichtigen. Maple V kann C-Code erzeugen. Dieser ist problemlos<br />

in C++ einbaubar. Ferner gibt es sehr viele und öffentlich zugängliche<br />

Programm-Bibliotheken, die in C++ geschrieben sind. Die Kompilation<br />

erfolgt mit g++ von Free Software Foundation.<br />

Die hart-codierten Klassen des Frameworks können grundsätzlich in jeder<br />

Sprache formuliert werden, die folgende objekt-orientierten Konzepte<br />

unterstützt:<br />

1. einfache und mehrfache Vererbung<br />

2. Polymorphismus<br />

3. Kapselung<br />

Das Framework ist in einem defensiven Stil entwickelt, d.h. es sind keine<br />

Spezialitäten von C++ ausgenutzt. Die Polymorphie wird durch die<br />

Verwendung von abstrakten Basisklassen realisiert. Das Hineinmischen<br />

von Eigenschaften in eine Klasse geschieht durch Mehrfachvererbung. Die<br />

“Friend-Funktion” wird nicht benutzt. Damit kann grundsätzlich jede andere<br />

Sprache verwendet werden, die das OO-Paradigma unterstützt. Das<br />

Domänenmodell wird mittels der Objekt-Modellierungstechnik [20] in zwölf<br />

hart-codierte und zwei generische Klassen “VNtor” und “VSummengeber”<br />

übertragen.<br />

4.7.2 Bibliotheken<br />

DerSolverfür die Lösung von schwachbesetzten Gleichungssystemen stammt<br />

aus dem FORTRAN “UMF-package” [29]. Dieses Paket berechnet nach<br />

der Methode “unsymmetric-pattern multifrontal” ein Gleichungssystem der<br />

Form Ax = b. Das Paket baut auf dem Fortran BLAS Toolkit auf. Es wird<br />

mit der Genauigkeit des Datentyps DOUBLE PRECISION gerechnet. Die<br />

FORTRAN77-Prozeduren wurden in C übersetzt und in dieser Form innerhalb<br />

der C++-Klasse “LinSolver” gekapselt.<br />

Für gebundene Listen wurden Template-Klassen aus der C++-LEDA<br />

Bibliothek [30] verwendet.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


80 KAPITEL 4. FRAMEWORK<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Kapitel 5<br />

Domänen-Architektur<br />

Das NIST [15] definiert eine Domäne als “a distinct functional area that<br />

can be supported by a class of Software Systems with similar Requirements<br />

and capabilities. Domain may exist before there are Software Systems to<br />

support it”. Der Begriff Domänen-Architektur definiert die gleiche Stelle<br />

als “a generic, organizational structure or design for software systems in a<br />

domain”.<br />

5.1 Einleitung<br />

Als Ergebnis der Domänenanalyse ist ein Domänenmodell gefunden worden.<br />

Dieses Modell deckt die Anforderungen der Domäne ab. In einem<br />

weiteren Schritt ist daraus ein wiederverwendbares Stück Software in<br />

Form eines Frameworks abgeleitet worden. Ein Klient kann dieses Framework<br />

benutzen, sofern seine Aufgabenstellung diese Anforderung enthält.<br />

Nicht alle Anforderungen des Domänenmodells sind aber innerhalb des<br />

Frameworks erfüllbar. Es gibt darin keine symbolische Berechnung, um<br />

z.B. Jacobi- und Mismatchterme für eine Lastflussrechnung zu bilden. Der<br />

Klient hingegen will das veränderliche Verhalten seiner Bausteine auf hohem<br />

Abstraktionsniveau beschreiben und verändern. Daher gibt es eine<br />

Lücke zwischen der abstrakten Notation der Gleichungen und der Programmiersprache<br />

des Frameworks (C++). Diese Lücke soll geschlossen<br />

werden, um den Klienten von der fehlerträchtigen und mühsamen Arbeit<br />

zu befreien, Gleichungen in der Programmiersprache des Frameworks zu<br />

codieren. Der Klient ist daher auf eine konsistente Umsetzung auf die Implementationsebene<br />

angewiesen.<br />

Bei dieser Umsetzung sind etliche Teile involviert. Neben dem Framework<br />

sind einige andere Elemente beteiligt, welche die Anforderungen der<br />

81<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


82 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Domäne erbringen. Es ist daher sinnvoll, diese Komplexität herunterzubrechen<br />

und eine hilfreiche Struktur zu finden. Es soll Konformität der<br />

Elemente und ihrer Verbindungen angestrebt werden, um die Wahrscheinlichkeit<br />

für ihre Wiederverwendbarkeit in ähnlichen Aufgabenstellungen<br />

zu fördern. Daneben soll die Verständigung zwischen involvierten Entwicklern<br />

erleichtert werden. Dies kann einerseits unter Klienten als auch<br />

zwischen dem Klienten und dem Framework-Entwickler der Fall sein.<br />

Das hier notwendige Strukturierungsmittel ist eine Domänen-Architektur<br />

(DA) (vergl. Kapitel 2, S. 14).<br />

Unter den vielen verschiedenen Definitionen des Begriffs Architektur<br />

im Zusammenhang mit Software, scheint in der Literatur in folgenden<br />

Punkten Übereinstimmung zu herrschen, dass eine DA<br />

• die Struktur<br />

• die Elemente<br />

• den Kommunikations-Mechanismus zwischen Elementen<br />

• die Richtlinien für die Benutzung und Weiterentwicklung der Architektur<br />

innerhalb einer bestimmten Domäne festlegen sollte.<br />

Auf der Grundlage von Erfahrungen, die im Laufe der Framework-<br />

Entwicklung und der in Kapitel 6 beschriebenen Fallstudien gemacht wurden,<br />

ist eine Struktur von Elementen gefunden worden. Diese Struktur und<br />

die darin angesiedelte Elemente werden in diesem Kapitel beschrieben.<br />

Die wesentlichen Dienstleistungen, d.h. die Anforderungen der im Kapitel<br />

3 beschriebenen Domäne, werden in der DA durch verschiedene Dienste<br />

formuliert. In der vorliegenden Arbeit sind dies die Dienste Netzaufbau,<br />

Netzberechnung und Resultatausgabe. Die Dienste werden von der<br />

DA in Zusammenarbeit mit dem Framework erbracht. Die Aufgabenteilung<br />

zwischen diesen Teilen wird in diesem Kapitel im Einzelnen aufgezeigt.<br />

Dabei werden die Elemente der DA zunächst auf der konzeptionellen<br />

Ebene dargestellt. In einem weiteren Schritt wird aufgezeigt, wie die<br />

Elemente implementiert sind. Anhand konkreter Bausteine wird gezeigt,<br />

wie der Dienst Netzberechnung für die Lastflussrechnung spezifiziert und<br />

adaptiert wird. Ferner wird der Dienst Netzaufbau basierend auf dem Netzdatenformat<br />

[23] dargestellt. Das Kapitel schliesst mit einer Betrachtung<br />

der DA aus der Sicht des Klienten.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.2. SICHTEN 83<br />

5.2 Sichten<br />

Die DA lässt sich anhand der in der Arbeit ausgeführten Untersuchungen<br />

wie in Abbildung 5.1 darstellen. Die räumliche Anordnung der Elemente<br />

widerspiegelt die Struktur der DA. Jede räumliche Dimension verkörpert<br />

dabei eine Sicht.<br />

5.2.1 Architekturebenen<br />

Die DA ist in drei Ebenen aufgeteilt.<br />

In der ersten Ebene werden alle veränderlichen Teile der in der DA erbrachten<br />

Dienste (Netzaufbau, Netzberechnung, Resultatanzeige) erfasst.<br />

Dies bedeutet, dass die Variabilität und eine dafür geeignete Parametrierung<br />

festgelegt wird. Ferner gehört eine Verwaltung dazu, die konkrete<br />

Parameterwerte entgegennimmt und speichert, damit nachfolgende Operationen<br />

sie auffinden und weiterverarbeiten können.<br />

Die zweite Ebene enthält die gemeinsamen und daher konstanten Anteile<br />

der vom Framework erbrachten Dienste. Dies entspricht dem nichtgenerischen<br />

und konstanten Anteil des Domänenmodells. Das Framework<br />

bietet, wie in Abbildung 5.1 ersichtlich, für jeden Dienst passende Stellen,<br />

an denen die adaptierbaren Teile aufgesteckt werden, die das variable<br />

Verhalten eines Dienstes verkörpern.<br />

Innerhalb der dritten Ebene wird ein vom Klienten angepasstes Framework<br />

erzeugt und zusammengesetzt, das er in seiner Applikation oder im<br />

Default-Programm einsetzen kann.<br />

Das Default-Programm erzeugt eine Instanz des Frameworks, das so<br />

adaptiert ist, dass damit ein Lastfluss basierend auf Netzdaten im Format<br />

von [23] berechnet werden kann.<br />

5.2.2 Dienste<br />

Dies sind die Leistungen, die das aktuelle Framework erbringt. Es sind<br />

Teilaufgaben, die ein Klient in seiner Applikation wiederverwenden kann.<br />

Dies ist der Netzaufbau, die Netzberechnung und die Anzeige von Resultaten.<br />

Zu jedem Dienst gehört eine Methode der Framework-Klasse “Netz”,<br />

über die der Klient einen bestimmten Dienst aufruft.<br />

Ein Dienst wird innerhalb des Frameworks von der zugehörigen Methode<br />

in der Klasse “Netz” und unter Mitwirkung der Bausteine erbracht.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


84 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Anteil<br />

Bausteine<br />

Spezifikation<br />

Adaption<br />

Framework<br />

Anteil Netz<br />

S1<br />

Σ<br />

V V V<br />

1 2 3<br />

A 1<br />

F 1<br />

Berechnung<br />

S 2<br />

A 2<br />

F 2<br />

Dienste des Frameworks<br />

Σ<br />

Netzaufbau<br />

Variabilität<br />

pro Dienst<br />

Integration ins<br />

Quelltext des Laufzeitsystem<br />

adaptierten Frameworks<br />

Abbildung 5.1: Sichten der DA<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

S 3<br />

A 3<br />

F 3<br />

Resultate<br />

Σ<br />

Architekturebene<br />

Variabilität<br />

Gemeinsamkeit


5.2. SICHTEN 85<br />

~<br />

~<br />

Aufruf Dienst i<br />

=<br />

Objekt "Netz"<br />

Σ<br />

=<br />

Bausteine<br />

~<br />

=<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

=<br />

~<br />

Abbildung 5.2: Objekt-Beteiligung an Diensten<br />

Objekt-Methoden<br />

für den Dienst i<br />

Konstanter Anteil<br />

Variabler Anteil<br />

Ein Dienst kann grundsätzlich einen variablen und einen konstanten<br />

Anteil haben.<br />

Ein Beispiel dafür ist der Netzaufbau aus verschiedenen Tauschformaten.<br />

Die Unterschiede der Behandlung, die von den verschiedenen Formaten<br />

herrühren, entsprechen dem variablen Anteil. Wie aus Abbildung 5.2<br />

ersichtlich, wird ein Dienst durch Mitwirkung von Methoden der Objekte<br />

Netz und Bausteine erbracht. Die Methoden können ihrerseits einen konstanten<br />

und variablen Anteil aufweisen, sofern dies bei der Entwicklung<br />

des Frameworks vorgesehen wird.<br />

Es ist eine grundsätzliche Schwierigkeit bei der Entwicklung des Frameworks,<br />

für die variablen Anteile eines Dienstes geeignete, erweiterbare<br />

Stellen im Framework zu identifizieren. Dies trifft insbesondere für die<br />

Methoden in der Klasse “Netz” zu. Hier muss man zur Entwicklungszeit<br />

des Frameworks wissen, ob und an welcher Stelle eine adaptierbare Methode<br />

aufzurufen ist.<br />

Der Klient soll den variablen Anteil eines Dienstes spezifizieren und<br />

im Framework adaptieren können. Die DA ordnet daher jedem Dienst die<br />

Elemente Spezifikation, Adaption und passives API 1 des Frameworks zu.<br />

In konventionellen Systemen, die auf relationalen Datenbanken aufbauen,<br />

werden Dienste normalerweise in Subsystemen organisiert, z.B. eines<br />

für die Berechnung und eines für ein graphisches Benutzer-Interface. Im<br />

vorliegenden Ansatz werden solche Subsysteme am Objekt selber gebildet<br />

1 Application programming interface


86 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

und integriert. Es steht daher zur Programmlaufzeit nicht mehr eine Datenbank<br />

im Zentrum, sondern ein Baustein-Objekt, das verschiedene Dienste<br />

integriert, indem es Methoden und Attribute für die gewünschten Dienste<br />

bei sich vereinigt. In der DA sind Ntore und Summengeber in dieser Weise<br />

aufgebaut und erweiterbar.<br />

5.2.3 Variabilität innerhalb der Dienste<br />

Wie in Kapitel 5.2.2 bereits ausgeführt, werden Dienste unter Mitwirkung<br />

verschiedener Objekte des Frameworks realisiert. Dies sind einerseits die<br />

Bausteine. Jeder Baustein-Typ kann in unterschiedlicher Weise an Diensten<br />

mitwirken. So hat beispielsweise jeder Baustein-Typ beim Dienst Netzberechnung<br />

eine eigene Berechnung seiner Jacobi-Blockmatrix und des<br />

Mismatch-Vektors.<br />

Diese Typvielfalt der Bausteine ist die Dimension senkrecht zur Blattebene<br />

von Abbildung 5.1. Je mehr Typen der Klient definiert, desto umfangreicher<br />

wird der Stapel der Spezifikationsdaten und die daraus erzeugten<br />

Framework-Adaptionen. Der Umfang der Adaption wächst nicht zwingend<br />

mit der Typenvielfalt der Bausteine. Für die Netzberechnung bei der<br />

Lastfluss-Applikation ist es möglich, die Adaption durch zwei parametrierbare<br />

Codegeneratoren für Ntore und Summengeber zu realisieren.<br />

Anderseits liegt eine Quelle von Variabilität in Varianten eines Dienstes<br />

selber. Als Beispiel sei hier der Dienst Netzaufbau erwähnt. Hier sind<br />

einige Möglichkeiten vorhanden. Der Netzaufbau kann<br />

• aus sequentiellen Netzdaten eines bestimmten Tauschformats<br />

• aus einer Datenbank in einem bestimmten Format<br />

• aus Aktivierung/Passivierung des Netzbestandes innerhalb einer Anwendung<br />

erfolgen.<br />

5.3 Architektur-Elemente<br />

Hier folgt die Beschreibung der einzelnen Elemente der Architektur und<br />

ihrer Funktion. Die Elemente werden in diesem Kapitel unter verschiedenen<br />

Gesichtspunkten dargestellt. Daher werden zunächst alle Symbole<br />

definiert, die in diesem Kapitel verwendet werden. Die Symbole werden<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.3. ARCHITEKTUR-ELEMENTE 87<br />

benötigt, um den Zusammenhang zwischen verschiedenen Sichten und der<br />

Element-Beschreibung herzustellen. Die Art der Indizierung unterscheidet<br />

die Gesichtspunkte.<br />

Folgende Mengen definieren jeweils einen Anwendungsfall:<br />

NT Menge der Ntor-Typen, die der Klient definiert oder verwendet<br />

ST Menge der Summengeber-Typen, die der Klient definiert und<br />

verwendet<br />

D Menge der verwendeten und bestehenden Dienste des Frameworks<br />

mit variablem Anteil in einer Methode der Klasse<br />

“Netz”.<br />

VK Menge der Basisnamen von Variablen pro elektrischem Anschluss,<br />

die der Klient definiert oder verwendet.<br />

Spezifikation:<br />

Si Spezifikation, die mindestens die Variabilität des Dienstes i<br />

beschreibt. “Mindestens” deshalb, weil Si auch Variabilität<br />

beschreiben kann, die auch für einen anderen Dienst j, i = j<br />

SNi<br />

SN<br />

SΣi<br />

SΣ<br />

SNetzij<br />

benutzt werden kann.<br />

Spezifikation des variablen Anteils eines Ntor-Typs mindestens<br />

für eine Beteiligung am Dienst i, wobei i = 0 den Klassenkonstruktor<br />

bezeichnet.<br />

Spezifikation des variablen Anteils eines Ntor-Typs.<br />

Spezifikation des variablen Anteils eines Summengeber-Typs<br />

für mindestens eine Beteiligung am Dienst i, wobei i = 0den<br />

Klassenkonstruktor bezeichnet.<br />

Spezifikation des variablen Anteils eines Summengeber-Typs.<br />

Spezifikation j des variablen Anteils einer oder mehrerer Methoden<br />

der Klasse “Netz” für den Dienst i.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


88 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Spezifikationsdaten:<br />

Vi Spezifikationsdaten, die mindestens die Variabilität des<br />

Dienstes i parametrieren.<br />

Spezifikationdaten des variablen Anteils eines Ntor-Typs für<br />

VNi<br />

VN<br />

VΣi<br />

VΣ<br />

eine Beteiligung am Dienst i.<br />

Spezifikationdaten des variablen Anteils eines Ntor-Typs. Vereinheitlichter<br />

Datensatz (Menge von Variablen mit Namen und<br />

Datentyp), das alle in NT angegebenen Summengeber-Typen<br />

und alle in D angegebenen Dienste einschliesst.<br />

Spezifikationdaten des variablen Anteils eines Summengeber-<br />

Typs für eine Beteiligung am Dienst i.<br />

Spezifikationdaten des variablen Anteils eines Summengeber-<br />

-Typs. Vereinheitlichtes Datenformat, das alle in ST angegebenen<br />

Ntor-Typen und alle in D angegebenen Dienste einsch-<br />

liesst.<br />

VNetzij Spezifikationdaten j des variablen Anteils einer oder mehrerer<br />

Methoden der Klasse “Netz” für Dienst i.<br />

Adaption:<br />

Ai Adaption aller am Dienst i beteiligten, variablen Teile des Frameworks<br />

AN Adaption des variablen Anteils eines Ntor-Typs<br />

AΣ Adaption des variablen Anteils eines Summengeber-Typs<br />

Adaption des variablen Anteils k der Klasse “Netz” für<br />

ANetzik<br />

den Dienst i<br />

ANetzi Adaption aller variablen Anteile der Klasse “Netz” für<br />

den Dienst i<br />

Adaptierte Teile des Frameworks:<br />

Fi Adaptierte Teile des Frameworks für Dienst i<br />

FN Adaptierter Anteil eines Ntor-Typs<br />

FS Adaptierter Anteil eines Summengeber-Typs<br />

Adaptierte Methode k der Klasse “Netz” für Dienst i<br />

FNetzik<br />

5.3.1 Domänenmodell<br />

Das Domänenmodell ist ein integraler Bestandteil der DA, denn es verkörpert<br />

die gemeinsamen Anforderungen der Domäne.<br />

Ein Hauptmerkmal des Domänenmodells sind die beiden generischen<br />

Bausteine Ntor und Summengeber. Dies sind die Typen, die innerhalb der<br />

Domäne für einzelne Dienste parametrierbar sind. Die dadurch entstehen-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.3. ARCHITEKTUR-ELEMENTE 89<br />

de Variabilität muss von der DA bewältigt werden.<br />

Daher hat das Domänenmodell zentralen Einfluss auf die Struktur und<br />

die Elemente der DA. Änderungen des Modells haben Konsequenzen für<br />

die Architektur.<br />

5.3.2 Spezifikationselement<br />

In diesem Element formalisiert der Klient veränderliche Teile der Dienste.<br />

Das Spezifikationselement ist in der Lage, aktuelle Parameter entgegenzunehmen,<br />

abzuspeichern und der nachfolgenden Adaption zur Verfügung<br />

zu stellen. Veränderliche Teile lassen sich sowohl den Bausteintypen als<br />

auch den Diensten zuordnen. Der Ansatz unterstützt eine objekt-orientierte<br />

Struktur der Spezifikation. Ferner berücksichtigt er die Tatsache, dass es<br />

Spezifikationen gibt, die zu Diensten und nicht zu Bausteinen gehören.<br />

5.3.3 Spezifikationsdaten<br />

Die Spezifikation liefert aktuelle Parameter als Daten. Die Daten sollen die<br />

Adaption der variablen Teile des Frameworks steuern. Es muss prinzipiell<br />

möglich sein, dass eine Adaption Ai auf Spezifikationen S j,i = j anderer<br />

Dienste zugreifen kann. Es hat sich herausgestellt, dass beispielsweise<br />

der Netzaufbau ein Dienst ist, der zur Netzdaten-Interpretation neben den<br />

variablen Anteilen des Dienstes Netzaufbau einige variable Anteile des<br />

Dienstes Netzberechnung kennen muss (siehe S. 120).<br />

5.3.4 Adaption<br />

Ein weiteres Element Ai erzeugt aus Spezifikationsdaten S j den Code für<br />

die adaptierbaren Stellen Fi des Frameworks. Die Adaption erzeugt damit<br />

neuen Code innerhalb der Domäne. Der neue Code bildet eine konsistente<br />

Schnittstelle zwischen der gewählten Spezifikationssprache und der Sprache<br />

des Frameworks. Die Sprache des Frameworks ist durch sein API<br />

festgelegt. In der DA gibt es für jeden Dienst eine solche Schnittstelle.<br />

5.3.5 Framework<br />

Dieses Element ist das objekt-orientierte Kernstück der DA. Es ist im Kapitel<br />

4 beschrieben. Das Framework kapselt das gemeinsame Verhalten<br />

der Domäne und schirmt den Klienten von den Einzelheiten der inneren<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


90 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Beziehungen ab. Andererseits stellt es Adaptionsstellen (passives API)<br />

zur Verfügung, die das unterschiedliche Verhalten enthalten. Die Adaptionsstellen<br />

Fi in Abbildung 5.1 stellen diese Ankopplungsstellen für die<br />

variablen Teile der Dienste dar. Das Framework bietet für jeden Dienst i<br />

eine Adaptionsstelle Fi an.<br />

5.3.6 Zusammensetzung des Frameworks<br />

Dieses Element baut aus den adaptierten und konstanten Einzelteilen des<br />

Frameworks einen ausführbaren Quelltext zusammen. Dieser Prozess wird<br />

durch folgende Angaben des Klienten gesteuert:<br />

1. Menge der verwendeten Ntor-Typen NT<br />

2. Menge der verwendeten Summengeber-Typen ST<br />

3. Menge der benutzten Dienste D<br />

4. Menge von Basisnamen, die für jeden elektrischen Anschluss (automatisch)<br />

zu spezifizieren sind<br />

Der Aufbauprozess benötigt für jeden benutzten Dienst die verlangten<br />

Spezifikationen und Adaptionen. Der Klient liefert die für seinen Anwendungsfall<br />

geeignete Spezifikation und Adaption.<br />

Der Klient benutzt dann den zusammengebauten Quelltext, indem er<br />

ihn übersetzt, in seinen Kontext bindet und als Netz-Objekt instantiiert.<br />

Dieser Kontext kann das Default-Hauptprogramm oder sonst ein Quellprogramm<br />

des Klienten sein.<br />

5.4 Implementation<br />

In diesem Unterkapitel wird aufgezeigt, wie die Adaption des Frameworks<br />

und die einzelnen Elemente der DA implementiert sind. Als grundlegende<br />

Randbedingungen sind dabei folgende beiden Punkte von zentraler Bedeutung:<br />

1. Die symbolische Berechnung wird benötigt, damit der Klient Gleichungen<br />

auf hohem Abstraktionsniveau definieren und in der Adaptionsphase<br />

weiterverarbeiten kann. Maple V [31, 32] ist ein symbolisches<br />

Rechensystem, das folgende Eigenschaften besitzt:<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.4. IMPLEMENTATION 91<br />

• interpretierte Sprache<br />

• vereinfacht symbolische Ausdrücke<br />

• differenziert symbolische Ausdrücke<br />

• generiert C-Quelltext<br />

Neben der symbolischen Umformung von Funktionen und deren Ableitungen<br />

bietet es komfortable Möglichkeiten, Zeichenketten zu bilden<br />

und mathematische Ausdrücke in die Programmiersprache des<br />

Frameworks (C++) zu übersetzen. Dies sind Eigenschaften, die bei<br />

der Code-Generierung in den Adaptionselementen sehr nützlich sind.<br />

Maple erlaubt ferner, Prozeduren zu definieren, diese in Bibliotheken<br />

abzuspeichern, und in einfacher Weise wiederaufzufinden. Dank<br />

der Kombination all dieser Eigenschaften eignet sich Maple für das<br />

gesamte Preprocessing des Frameworks.<br />

2. Die laufzeitintensive Berechnung der Matrizen- und Vektorelemente<br />

erfolgt wenn immer möglich über private Variable der Baustein-Objekte.<br />

Dies ist bei den Ntoren immer der Fall, bei den Summengebern<br />

aber prinzipiell nicht. Summengeber greifen über die in Abbildung<br />

4.5 dargestellte, mehrstufige Adressierung auf die Variable in den<br />

Ntoren zu. Andererseits ist bei den Summengebern die Berechnung<br />

der Terme einfacher, da nur einfache Summen vorkommen.<br />

Die Berechnung ist beim Zugriff direkt über Symboladdressen effektiver.<br />

Die Symboladressen werden bereits zur Übersetzungszeit<br />

vom Kompiler berechnet. <strong>Eine</strong> wichtige Konsequenz des Ansatzes<br />

ist, dass konkrete Baustein-Typen, z.B. ein Transformator-Ntor oder<br />

ein Kirchhoff-Summengeber immer durch konkrete, zur Übersetzungszeit<br />

bekannte Klassen realisiert werden. Ein Klassenkonstruktor<br />

wird zur Programmlaufzeit generell nur ein einziges Mal aufgerufen,<br />

um ein Baustein-Objekt zu erzeugen. In diesem einzigen Aufruf<br />

müssen dann die über alle Dienste benötigten lokalen Variablen und<br />

Übergabeparameter vom Klienten im Baustein-Konstruktor akkumuliert<br />

werden, damit bei der Instantiierung alle benötigten lokalen Variablen<br />

vorhanden sind und initialisiert werden können.<br />

Die Elemente der DA und der Adaptionsprozess beeinflussen sich bei<br />

der Implementation der DA gegenseitig.<br />

Die Einzelteile lassen sich daher im Kontext des Adaptionsprozesses<br />

von Abbildung 5.3 besser verstehen. Die Symbolbeschreibung in Unter-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


92 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

kapitel 5.3 hilft ausserdem, den Zusammenhang mit der konzeptionellen<br />

Beschreibung der DA herzustellen.<br />

5.4.1 Spezifikationselement<br />

Die Spezifikationselemente werden generell mit Maple-Prozeduren realisiert.<br />

Der Klient überschreibt im Prozedurrumpf verschiedene globale Variable<br />

um den variablen Teil des Frameworks zu parametrieren. Diese globalen<br />

Variablen stellen die weiter unten beschriebenen Spezifikationsdaten<br />

dar. Die Prozeduren haben keine Rückgabe-Argumente. Dafür können<br />

Eingabe-Argumente vorkommen, um Daten für die Spezifikation zu liefern,<br />

die global pro Anwendungsfall gelten. Ein Beispiel ist die Menge<br />

VK der Basisnamen von Variablen, die an jedem elektrischen Anschluss<br />

zu spezifizieren ist.<br />

Bausteine<br />

Jeder Baustein des Typs T name wird innerhalb einer eigenen Prozedur spezifiziert.<br />

Dabei werden die variablen Anteile VN,S i sämtlicher i Dienste für<br />

einen Baustein-Typen parametriert. Dies geschieht durch Überschreiben<br />

von globalen Variablen, welche die Spezifikationsdaten VN (Ntore) bzw.<br />

VS (Summengeber) darstellen. Jede Prozedur realisiert in diesem Ansatz<br />

genau ein Spezifikationselement SN bzw. SV .<br />

Dieser Ansatz wurde gewählt, damit nur eine Prozedur zur Spezifikation<br />

eines Bausteins benötigt wird. Mit einem Prozedur-Aufruf sind alle<br />

Spezifikationen eines Bausteins aktualisiert. Damit lässt sich der Aufbauprozess,<br />

wie in Abbildung 5.3 dargestellt, in einfacher Weise formulieren.<br />

Ein weiterer Grund ist die Adaption des Konstruktors eines konkreten<br />

Bausteins. Der Konstruktor hat eine Sonderstellung, da er im Gegensatz<br />

zu anderen Methoden immer sämtliche Parameter zur Initialisierung aller<br />

Objekt-Variablen benötigt.<br />

<strong>Eine</strong> Folge dieses Ansatzes ist, dass alle Spezifikationsdaten im Prozedurrumpf<br />

zu überschreiben sind. Ein Nachteil ist, dass jede Änderung<br />

eines Dienstes Anpassungen der Spezifikationen und in gewissen Fällen<br />

auch der Adaptionen bedingt. Der damit verbundene Aufwand ist klein,<br />

falls nur weitere Spezifikationsdaten, d.h. Variable, dazukommen. Er ist<br />

grösser, falls bestehende Variable zu ändern sind. Dann sind bestehende<br />

Adaptionen, in denen die geänderte Variable vorkommt, anzupassen. <strong>Eine</strong><br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.4. IMPLEMENTATION 93<br />

konsequente Namensgebung der Variablen für die Spezifikationsdaten ist<br />

hilfreich.<br />

Die Prozeduren werden in Bibliotheken gesammelt. Die Namen der<br />

Bibliotheken sind innerhalb der DA festgelegt. Der Klient gibt jedem<br />

Baustein-Typen einen eindeutige Namen T name. Daraus werden die Namen<br />

der Prozeduren gemäss der Vorschrift<br />

De f + Tname → De f T name (5.1)<br />

gebildet. Damit lässt sich der Zugriff auf die Spezifikationsdaten des Bausteins<br />

über seinen Typnamen aufbauen:<br />

with(Ntor); #Zugriff auf Bibliothek<br />

Prozedur := ‘Def‘.‘Tname‘;<br />

Prozedur(...);<br />

Ferner wird durch die Namens-Vorschrift der Namenskonflikt zwischen<br />

Prozeduren vermindert.<br />

Methode der Klasse “Netz”<br />

Jeder Dienst i kann grundsätzlich eine Variabilität aufweisen, die nicht<br />

von den Bausteinen abhängt. Diese Variabilität wird Methoden der Klasse<br />

“Netz” zugeordnet, und kann in j Spezifikationen SNetzij definiert werden.<br />

Es hat sich als praktisch erwiesen, grössere Spezifikationsmengen in<br />

j kleinere, logisch zusammengehörige Spezifikationen zu packen, um die<br />

Lesbarkeit und Handhabung zu verbessern. Jedes Spezifikationselement<br />

SNetzij wird durch eine Prozedur realisiert. Im Rumpf dieser Prozeduren<br />

aktualisiert der Klient die zugehörigen Spezifikationsdaten VNetzij<br />

5.4.2 Spezifikationsdaten<br />

Die Spezifikationsdaten V werden mit Hilfe einer Menge von globalen Variablen<br />

von den Spezifikations- zu den Adaptionselementen übertragen. V<br />

ist eine heterogene Menge verschiedener Variablen-Typen, wie beispielsweise<br />

Vektoren oder Tabellen. Die Implementation über Variable ermöglicht<br />

die Datenübertragung zwischen beliebigen Spezifikationen und Adaptionen.<br />

Die Menge dieser Variablen ist innerhalb eines Anwendungsfalls grundsätzlich<br />

unter der Kontrolle des Klienten. Der Klient entscheidet, ob er<br />

von Spezifikationen und Adaptionen eines ähnlichen Falles ausgehen will<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


94 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

und damit eine bereits festgelegte Menge von Variablen wiederverwenden<br />

kann, oder ob er neue Variablen braucht, um die Variabilität seines Anwendungsfalles<br />

formulieren zu können.<br />

Für die Spezifikationsdaten der Bausteine benötigt die DA aus den auf<br />

Seite 92 genannten Gründen zwei vereinheitlichte Formate VN bzw. VS,<br />

die jeweils als Satz von Variablen realisiert werden. Ein solcher Satz ist<br />

die Vereinigungsmenge aller Spezifikationen VN,S über alle Dienste i, an<br />

i<br />

denen Bausteine beteiligt sind.<br />

Für die Spezifikationsdaten VNetzij , welche die variablen Anteile der<br />

Methoden der Klasse “Netz” parametrieren, gibt es innerhalb der DA keine<br />

Festlegungen. Der Klient organisiert für die Dienste i beliebig struktu-<br />

rierte Variable, die sich für den Datenaustausch zwischen dem Spezifikationselement<br />

SNetzij und einem Adaptionselement SNetzik eignen.<br />

5.4.3 Adaption<br />

Die Adaptionselemente Ai werden generell mit Maple-Prozeduren realisiert.<br />

Die Prozeduren heissen innerhalb der DA alle MakeX(args). X steht<br />

für eine Identifikation der Prozedur, siehe Tabelle 5.1<br />

Die optionalen Prozedur-Argumente args sind dafür vorgesehen, Daten<br />

X Adaption-Inhalt siehe Abbildung<br />

Ntor alle Dienste aller Ntor-Typen 5.4<br />

SumSetter alle Dienste aller Summengeber-Typen 5.4<br />

DienstName einen Dienst i an Klasse ”Netz” 5.5<br />

Tabelle 5.1: Namens-Konvention<br />

zu empfangen, die global pro Anwendungsfall gelten, beispielsweise die<br />

Menge der benutzten Ntor-Typen.<br />

Der Klient schreibt im Prozedurrumpf einen Code-Generator, den er mit<br />

Hilfe von Spezifikationsdaten V und Prozedur-Argumenten konfiguriert.<br />

Die Adaptionsprozeduren sind hierarchisch organisiert. Auf der obersten,<br />

für den Aufbau massgebenden Ebene, benötigt die DA eine Prozedur MakeNtor(),<br />

welche den variablen Anteil aller Dienste einer konkreten Ntor-<br />

Klasse generiert. Entsprechendes gilt für die Summengeber. Pro Dienst<br />

mit variablem Anteil in Methoden der Klasse “Netz” ist, wie in Tabelle 5.1<br />

angegeben, eine Prozedur mit dem Namen “DienstName” vorgesehen.<br />

Es ist dem Klienten überlassen, unter diesen Haupt-Prozeduren weitere<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.4. IMPLEMENTATION 95<br />

Prozeduren zu verwenden, um die Adaption, falls nötig, weiter zu strukturieren.<br />

Der von der Adaption zu erzeugende Code richtet sich nach der Sprache,<br />

in der das Framework implementiert ist. Dies ist in der vorliegenden<br />

Arbeit C++. Mit Maple V lassen sich Ausdrücke sehr einfach in die<br />

Sprache C übersetzen. Es ist ohne weiteres möglich, aus einem in C++<br />

geschriebenen Programmteil heraus in C codierte Funktionen oder Ausdrücke<br />

aufzurufen.<br />

Beispiel:<br />

Es soll die Funktion fun(e,f)= 1<br />

e 2 +f 2 nach der Variablen e abgeleitet werden.<br />

Die Maple V-Anweisungen<br />

readlib(C);<br />

fun := 1/(eˆ2 + fˆ2);<br />

C(diff(fun,e));<br />

erzeugen folgenden Quelltext in C:<br />

t0 = -2.0/pow(e*e+f*f,2.0)*e;<br />

∂ fun(e,f)<br />

In t0 speichert Maple V den Wert von ∂x .<br />

Codeteile, die in C geschrieben sind, können problemlos in C++ integriert<br />

werden. Der Output der Adaption sind Dateien, die den Quelltext<br />

der erzeugten Framework-Erweiterungen enthalten. Die Dateien haben die<br />

Namen out.C für den Deklarations- und out.h für den Definitionsteil des<br />

erzeugten Quelltextes. Der Name out ist aus den Spezifikationsdaten oder<br />

den Argumenten der Prozeduren abzuleiten. Diese Namen müssen innerhalb<br />

der DA konsistent sein, damit sich der Zusammenbau in generischer<br />

Weise formulieren lässt.<br />

Die Prozeduren der Adaption werden in einer Bibliothek gesammelt.<br />

Der Name der Bibliothek ist innerhalb der DA festgelegt.<br />

5.4.4 Zusammensetzung des Frameworks<br />

Der Zusammenbau des adaptierten Frameworks geschieht innerhalb von<br />

zwei verschachtelten Prozessen. Der äussere Prozess ist der Hauptprozess.<br />

Er ist mit dem Make-Werkzeug des UNIX-Betriebssystems realisiert. Dieser<br />

Prozess kennt einerseits die Abhängigkeiten zwischen Teilen, die für<br />

den Zusammenbau benötigt werden, und Regeln dafür, wie diese Teile aufzubauen<br />

sind.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


96 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Start<br />

alle<br />

Baustein-Typen NT,ST<br />

abgearbeitet ?<br />

nein<br />

Aktualisiere<br />

Spezifikationsdaten<br />

V N bzw. VΣ<br />

des Baustein-Typen<br />

Adaptiere Konstruktor<br />

des Baustein-Typen<br />

Alle Dienste<br />

ja<br />

D abgearbeitet<br />

?<br />

nein<br />

Adaptiere Klassenmethode(n)<br />

des aktuellen Dienstes<br />

des Baustein-Typen<br />

ja<br />

Alle Dienste<br />

D abgearbeitet<br />

?<br />

nein<br />

Aktualisiere<br />

Spezifikationsdaten<br />

der Methode(n)<br />

der Klasse "Netz"<br />

für den aktuellen Dienst<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Σj<br />

VNetz ij<br />

Adaptiere<br />

Methode(n)<br />

der Klasse "Netz"<br />

für den aktuellen Dienst<br />

Σ k<br />

F Netz ik<br />

Abbildung 5.3: Adaptionsprozess des Frameworks<br />

<strong>Eine</strong> der Regeln bildet den inneren Prozess, der hier genauer betrachtet<br />

wird. Wie im Flussdiagramm von Abbildung 5.3 dargestellt, erzeugt<br />

der innerhalb von Maple laufende Prozess den Quelltext der adaptierbaren<br />

Teile des Frameworks. Dies sind je eine konkrete C++-Klasse für jeden<br />

ja<br />

Ende<br />

verlangten Baustein-Typ FN bzw. FS und eine oder mehrere Methoden<br />

FNetzij der Klasse “Netz”. Die Abbildungen 5.4 und 5.5 zeigen typische<br />

Datenfluss-Graphen zwischen den Prozeduren der Spezifikation und Adaption.<br />

Man beachte, dass die aktuelle Form der Graphen von Vorgaben<br />

des Klienten abhängt.<br />

Der innere Prozess kann erst gestartet werden, nachdem der Klient alle<br />

Prozeduren zur Spezifikation und Adaption definiert hat. Danach kann der<br />

Prozess diese Definitionen mit Hilfe der Prozedur-Namen in Bibliotheken<br />

auffinden.<br />

Jede Spezifikationsprozedur überschreibt einen Satz von globalen Variablen<br />

V mit aktuellen Werten. Alle angegebenen globalen Variablen<br />

werden in der Prozedur typenspezifisch aktualisiert. Über diese Variable<br />

erfolgt der Austausch der Spezifikationsdaten. Der Aufbauprozess reicht


5.4. IMPLEMENTATION 97<br />

SB<br />

SB<br />

1<br />

SB2 SB 3<br />

}<br />

V B<br />

Pro Baustein-Typ<br />

A B<br />

M 1<br />

Netzberechnung<br />

Netzaufbau<br />

Resultatanzeige<br />

B = N(Ntor) oder S(Summengeber) M = adaptierte C++ - Methoden<br />

S<br />

S<br />

S<br />

Abbildung 5.4: Adaptions-Beispiel eines Bausteins<br />

Netz i1<br />

Netz i2<br />

Netz i3<br />

S<br />

N<br />

VNetz<br />

i2<br />

Pro Dienst i<br />

VNetz<br />

i1<br />

VNetz<br />

i3<br />

VN<br />

A<br />

A<br />

A<br />

Netz i1<br />

Netz i2<br />

Netzi<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

M 2<br />

M 3<br />

F Netz i1<br />

F Netz i2<br />

Abbildung 5.5: Adaptions-Beispiel einer Methode der Klasse “Netz”<br />

diese Daten an die Adaption weiter.<br />

Der konstante Teil des Frameworks benötigt an geeigneten Stellen festgelegte<br />

Namen um den Quelltext der adaptierten Teile ins gesamte Framework<br />

einzuschliessen. Dies geschieht über den in Abbildung 5.6 dargestellten<br />

Mechanismus. Mit Hilfe der Datei “InclControlFile” wird dem<br />

C++-Kompiler mitgeteilt, welche externen Dateien einzufügen und zu übersetzen<br />

sind. Die Datei “InclControlFile” ist ebenfalls ein autogenerierter<br />

Teil, der im inneren Prozess aus der Typmenge einer Applikation erzeugt<br />

wird.<br />

Jeder Baustein X hat eine Spezifikations-Prozedur mit Namen DefX.<br />

Diese Namenskonvention wird benutzt, um über die Menge aller verlangten<br />

Spezifikationen zu iterieren. Die Namen der aufzurufenden Prozeduren<br />

sind erst zur Laufzeit des inneren Prozesses bekannt. Dank der interpretierenden<br />

Ausführung von Maple ist es möglich, eine erst dann bekannte<br />

Menge von Prozeduren abzuarbeiten.<br />

Nachdem der innere Prozess abgeschlossen ist, übersetzt der Hauptpro-<br />

FB


98 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Framework Erweiterungen<br />

z.B. für NTore<br />

B2.C<br />

B1.h<br />

B1.C<br />

Quelltext Framework<br />

#include InclControlFile<br />

Spezifikation Baustein-Menge<br />

NT = [ ... , B1, B2, ... ]<br />

generiert<br />

Datei InclControlFile<br />

#include B1.C<br />

#include B1.h<br />

#include B2.C<br />

Abbildung 5.6: Zusammenbau mittels Steuerdatei<br />

zess den Quelltext und bindet alle für das Framework benutzten Bibliotheken.<br />

5.5 Adaption des Dienstes Netzberechnung<br />

Der Dienst Netzberechnung wird auf allen Architekturebenen anhand der<br />

typischen beiden Bausteine “PU-Generator” und “Kirchhoff-Knoten” für<br />

eine Lastflussrechnung aufgezeigt.<br />

5.5.1 Spezifikation<br />

Hier wird die Spezifikation zweier typischer Bausteine für eine Lastflussberechnung<br />

anhand der Spezifikations-Prozeduren dargestellt.<br />

Ntor-Typ PU-Generator<br />

Der Prozedurkopf deklariert den Namen der Spezifikations-Prozedur des<br />

Ntor-Typs “PU-Generator”. Der Typ-Name lautet PUGen. Als Parameter<br />

der Prozedur wird die Menge VarsProA übergeben. Damit wird netzweit<br />

angegeben, welche Basisnamen von Variablen pro elektrischem Anschluss<br />

gewünscht sind. Ferner wird die Anzahl der elektrischen Anschlüsse und<br />

der möglichen Zustände dieses Ntor-Typs definiert.<br />

NTor[DefPUGen] := proc(VarsProA)<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.5. ADAPTION DES DIENSTES NETZBERECHNUNG 99<br />

global Vars, Pars, Funs,<br />

AnzVars, AnzPars, AnzFuns,<br />

N, NTorType,<br />

Regelung, ParType, States,<br />

StateDefs, StateChanges;<br />

# NTor-Eigenschaften<br />

NTorType := ‘PUGen‘;<br />

N := 1;<br />

States := 2;<br />

Hier folgt die Spezifikation der Menge der Variablen V und Parameter<br />

P für den Initialzustand des Ntor-Typs. Die Funktion AlleAVars() füllt<br />

den Variablenvektor Vars mit N+1 indizierten Instanzen der in der Menge<br />

VarsProA definierten Basisnamen. Neben den N Anschlüssen, kommt<br />

noch ein weiterer Anschluss dazu, den dieses Ntor zur Spannungsregelung<br />

benötigt. Die Funktion ExpandVektor() verlängert Vektoren an ihrem<br />

Ende, d.h. es wird die Variable Q1 dem Vektor Vars hinzugefügt.<br />

# Variable<br />

Vars := ExpandVektor( AlleAVars( N+1, VarsProA),[Q1] );<br />

AnzVars := vectdim(Vars);<br />

# Parameter<br />

AnzPars := 9;<br />

Pars := vector(AnzPars,[P1,U,Umax,Umin,G,B,Qmax,Qmin,P2]);<br />

Nachfolgend sind die Fehlerfunktionen aufgeführt aus denen sich durch<br />

Nullsetzen die Menge der Gleichungen E des Grundzustandes ergibt. Die<br />

ersten beiden Funktionen beschreiben den Zusammenhang zwischen Strom<br />

und Spannung, je für den Real- und Imaginärteil. Die dritte Funktion<br />

drückt den Spannungsbetrag (Sollwert) durch einzelne Spannungskomponenten<br />

aus. Die beiden letzten Gleichungen formulieren die stromlose<br />

Messung der zu regelnden Spannung.<br />

# Regelung: {} keine, {RVC} : Remote Voltage Control<br />

Regelung := {RVC};<br />

# Functions of the NTor<br />

AnzFuns := 5;<br />

Funs := vector(AnzFuns);<br />

Funs[1] := ie1 - (e*P1 + f*Q1)/(eˆ2 + fˆ2)<br />

-evalc(Re((e1+I*f1)*(G+I*B)));<br />

Funs[2] := if1 - (-e*Q1 + f*P1)/(eˆ2 + fˆ2)<br />

-evalc(Im((e1+I*f1)*(G+I*B)));<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


100 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Funs[3] := Uˆ2 - e2ˆ2 - f2ˆ2;<br />

Funs[4] := ie2;<br />

Funs[5] := if2;<br />

Die folgenden Definitionen legen die Anzahl der möglichen Zustände dieses<br />

Ntor-Typs fest. Für beide Zustände s= PUMode(1) und<br />

PUQMode(2) muss je ein Verhalten BN s(Vs,Ps,E s,Ts) definiert werden.<br />

# Finite State Machine<br />

StateDefs := vector(States);<br />

StateDefs[1] := table([ State=‘PUMode‘,<br />

Vars=Vars,<br />

Pars=Pars,<br />

Funs=Funs<br />

]);<br />

StateDefs[2] := table([ State=‘PUQMode‘,<br />

Vars=AlleAVars(N+1, VarsProA),<br />

Pars=ExpandVektor(Pars, [Q1]),<br />

Funs=vector(4,[Funs[1],Funs[2],<br />

Funs[4],Funs[5]])<br />

]);<br />

Die folgenden Angaben legen die Zustands-Übergänge Ts fest.<br />

StateChanges[1] := table([ From=‘PUMode‘,<br />

To=‘PUQMode‘,<br />

LimVars={Q1},<br />

UpperLim={Qmax},<br />

LowerLim={Qmin},<br />

AddVars={}, DelVars={Q1},<br />

AddPars={Q1}, DelPars={}<br />

]);<br />

StateChanges[2] := table([ From=‘PUQMode‘,<br />

To=‘PUMode‘,<br />

LimVars={‘sqrt(pow(ue2,2.0)<br />

+pow(uf2,2.0))‘},<br />

UpperLim={Umax},<br />

LowerLim={Umin},<br />

AddVars={Q1}, DelVars={},<br />

AddPars={}, DelPars={Q1}<br />

]);<br />

end:<br />

Pro Zustandsübergang werden die Grenzen UpperLim und LowerLim einer<br />

Variablen LimVars definiert, bei deren Überschreitung in den Zustand<br />

To=... gewechselt wird. Die im neuen Zustand geltende Variablen- und<br />

Parametermenge Vs und Ps wird mit Hilfe der Operationen für das Hinzufügen<br />

(AddVars und AddPars) und das Entfernen von Variablen und<br />

Parameter (DelVars und DelPars) aktualisiert.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.5. ADAPTION DES DIENSTES NETZBERECHNUNG 101<br />

Summengeber-Typ Kirchhoff-Knoten<br />

Der Prozedurkopf deklariert den Namen der Spezifikations-Prozedur des<br />

Summengeber-Typen “Kirchhoff-Knoten”. Der Typ-Name lautet Knoten.<br />

Es gibt vier Fehlerfunktionen, aus denen sich durch Nullsetzen die Menge<br />

der Gleichungen E ergibt. Die ersten beiden Gleichungen formulieren<br />

Nullsummen für Real- und Imaginärteil des Stromes ie + j · i f . Die<br />

restlichen Gleichungen formulieren den Wertausgleich aller Spannungen<br />

e + j · f . Das Verhalten eines Summengeber-Typs wird durch eine beliebige<br />

Menge von Elementarsummen festgelegt. Im folgenden Code-<br />

Ausschnitt werden vier Elementarsummen parametriert. Die Parameter<br />

jeder Elementarsumme werden mit dem Datentyp table als Einheit zusammengefasst<br />

und komponentenweise im Vektor Funs gesammelt. Die<br />

einzelnen Felder des Datentyps table bezeichnen den Typ der Elementarsumme,<br />

einen gemeinsamen Basisnamen, der Name einer optionalen<br />

Variablen und der Name eines optionalen Parameters.<br />

SumSetter[DefKnoten] := proc()<br />

global Funs, AnzFuns, SumSetterType;<br />

SumSetterType := ‘Knoten‘;<br />

AnzFuns := 4;<br />

Funs := vector(AnzFuns);<br />

Funs[1]:= table([ElementarFunTyp=EinzeiligeSumme,<br />

ExternalVarName=‘ie‘,<br />

LocVarName=0,<br />

Parameter=0] );<br />

Funs[2]:= table([ElementarFunTyp=EinzeiligeSumme,<br />

ExternalVarName=‘if‘,<br />

LocVarName=0,<br />

Parameter=0] );<br />

Funs[3]:= table([ElementarFunTyp=MehrzeiligeSumme,<br />

ExternalVarName=‘e‘,<br />

LocVarName=0,<br />

Parameter=0] );<br />

Funs[4]:= table([ElementarFunTyp=MehrzeiligeSumme,<br />

ExternalVarName=‘f‘,<br />

LocVarName=0,<br />

Parameter=0] );<br />

end:<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


102 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

5.5.2 Spezifikationsdaten<br />

Variable Bedeutung (vergl. S. 51 ff.)<br />

Vars V0<br />

Pars P0<br />

Funs E alle<br />

AnzVars dim(V0)<br />

AnzPars dim(P0)<br />

AnzFuns dim(E alle)<br />

N Anzahl elektrischer Anschlüsse<br />

NTorType Typname Ntor<br />

States σmax<br />

StateDefs Name des i-ten Zustandes<br />

StateChanges<br />

Vi , Pi , E i ,i = 1...σmax<br />

Ti ,i ≤ σmax<br />

Funs E<br />

AnzFuns dim(E)<br />

SumSetterType Typname Summengeber<br />

Tabelle 5.2: Datenaustausch Spezifikation-Adaption<br />

Der Datenaustausch zwischen Spezifikation und Adaption erfolgt über die<br />

in Tabelle 5.2 dargestellten globalen Variablen.<br />

5.5.3 Adaption<br />

Die Adaptions-Prozeduren erzeugen die Framework-Adaptionen für die<br />

Lastflussberechnung.<br />

Die nachfolgenden Code-Beispiele zeigen die erzeugten C++-Methoden<br />

dem Prinzip nach auf. Gleichförmige Teile werden durch Punkte abgekürzt.<br />

Aus den Spezifikationen erzeugte Symbole sind eingerahmt.<br />

Der Konstruktor des PU-Generators instantiiert alle Variablen- und<br />

Parameterobjekte. Die Reihenfolge der Variablen ist eine wesentliche Information<br />

für die Handhabung des Gleichungssystems. Die Adaption des<br />

Konstruktors setzt die Reihenfolge der Variablen im Vektor Vars in Laufnummern<br />

um, die im Konstruktor der Variablen übergeben werden. Ferner<br />

sind für sämtliche Argumente des Konstruktors private Variable zu deklarieren<br />

und Anfangswerte zu überweisen.<br />

PUGen :: PUGen (char* name<br />

, double _ ie1<br />

...<br />

, double _ f2<br />

, double _ Q1<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.5. ADAPTION DES DIENSTES NETZBERECHNUNG 103<br />

...<br />

, double _ P2<br />

: VNtor(name )<br />

)<br />

{<br />

anz_vars = 9 ;<br />

anz_pars = 9 ;<br />

anz_funs = 5 ;<br />

state = PUMode ;<br />

InsertVariable(new Variable(" ie1 ",<br />

...<br />

0 , & ie1 ));<br />

InsertVariable(new Variable(" Q1 ", 8 , & Q1 ));<br />

InsertParameter(new Parameter(" P1 ", & P1 ));<br />

...<br />

InsertParameter(new Parameter(" P2 ", & P2 ;/<br />

ie1<br />

...<br />

= _ie1 ;<br />

f2 = _f2 ;<br />

Q1<br />

...<br />

= _ Q1 ;<br />

P2 = _ P2 ;<br />

}<br />

Der folgende Code zeigt die erzeugte Methode Limiter() des PU-Generators.<br />

Diese Methode testet beim Ntor, ob es im Zustand σ bleibt,<br />

oder ob es in den Nachfolgezustand σi wechselt. Die Spezifikationsdaten<br />

Q1, Qmax und Qmin werden als Parameter an die Methode CheckLimits()<br />

weitergereicht. Für jeden Zustand σ des Ntors werden aus Spezifikationsdaten<br />

der Variablen StateChanges Fallunterscheidungen mit Hilfe<br />

von Case-Anweisungen generiert.<br />

int<br />

{<br />

PUGen :: Limiter()<br />

double new_value;<br />

switch (state) {<br />

case PUMode :<br />

//Generierte, zu untersuchende Limiten<br />

limiteIstVerletzt = falsch;<br />

new_value = CheckLimits( Q1 , Qmax , Qmin );<br />

if (limiteIstVerletzt) SwitchState(new_value);<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


104 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

break;<br />

case PUQMode :<br />

...<br />

default:<br />

break;<br />

}<br />

return limiteIstVerletzt;<br />

}<br />

Der folgende Code ist die erzeugte Methode SwitchState() des PU-<br />

Generators. SwitchState() wird von der Methode Limiter() aufgerufen.<br />

SwitchState() bringt das Ntor von einem Zustand σ in seinen Nachfolge-<br />

zustand σi und installiert das neue Verhalten<br />

BN σi (Vσi ,Pσi ,E σi<br />

,Tσi ). Pro spezifiziertem Zustand σ des Ntors wird aus<br />

Spezifikationsdaten der Variablen StateChanges eine Fallunterscheidung<br />

generiert.<br />

void PUGen :: SwitchState(double new_value)<br />

{<br />

int i;<br />

Variable* rv;<br />

Variable* pop_rv;<br />

Parameter* rp;<br />

Parameter* pop_rp;<br />

switch (state) {<br />

case PUMode :<br />

// Entfernen von unbenutzten Variablen<br />

rv = GetVar(" Q1 ");<br />

for (i=0; i


5.5. ADAPTION DES DIENSTES NETZBERECHNUNG 105<br />

anz_vars = 8 ;<br />

anz_pars = 10 ;<br />

anz_funs = 4 ;<br />

state<br />

break;<br />

= PUQMode ;<br />

case<br />

...<br />

PUQMode :<br />

default:<br />

break;<br />

}<br />

}<br />

Die folgenden Zeilen zeigen die erzeugte Methode GetAElem() des<br />

PU-Generators. Diese zentrale Methode erzeugt für alle spezifizierten<br />

Zustände je einen Zugriff auf die schwach besetzte Jacobi-Matrix. Er<br />

wird durch geschachtelte Abfrage mittels case-Anweisungen implementiert.<br />

Der Default-Fall liefert den Wert 0 zurück. Für die Nichtnullen der<br />

Matrix setzt die Adaption das aus den Spezifikationen von Vars, Funs und<br />

StateDefs symbolisch berechnete Jacobi-Element ein.<br />

double PUGen :: GetAElem(int i, int j, int state)<br />

{<br />

double t0;<br />

switch(state) {<br />

case PUMode :<br />

switch(i) {<br />

case 1 :<br />

switch (j) {<br />

case 1 :<br />

t0 = 1.0 ;<br />

return t0;<br />

break;<br />

case 3 :<br />

t0= -P1/(e1*e1+f1*f1)<br />

+ 2.0*(e1*P1+f1*Q1)/<br />

pow(e1*e1+f1*f1,2.0)*e1-G ;<br />

return t0;<br />

break;<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


106 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

...<br />

default:<br />

return 0.0;<br />

break;<br />

} /* switch j */<br />

break;<br />

case 2 :<br />

...<br />

case 5 :<br />

default:<br />

return 0.0;<br />

break;<br />

} /* switch i */<br />

case PUQMode :<br />

...<br />

default:<br />

return 0.0;<br />

break;<br />

} /* switch state */<br />

}<br />

Die erzeugte Methode GetbElem() des PU-Generators ist nach dem<br />

gleichen Muster wie GetAElem() aufgebaut. Hier ist die Schachtelung der<br />

Case-Anweisung ein Ebene weniger tief, da nur ein Index und der aktuelle<br />

Zustand den Schlüssel auf einen Mismatch-Wert bilden.<br />

Die folgenden Code-Zeilen zeigen den Konstruktor des Kirchhoff-Knotens:<br />

Knoten<br />

{<br />

:: Knoten (char* name ) : VSummengeber(name )<br />

elementarFuns.append((NewtonRaphson*) new<br />

EinzeiligeSumme (&anschluesse, " ie " , 0.0 ));<br />

elementarFuns.append((NewtonRaphson*) new<br />

EinzeiligeSumme (&anschluesse, " if " , 0.0 ));<br />

elementarFuns.append((NewtonRaphson*) new<br />

MehrzeiligeSumme (&anschluesse, " e " , 0.0 ));<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.5. ADAPTION DES DIENSTES NETZBERECHNUNG 107<br />

}<br />

elementarFuns.append((NewtonRaphson*) new<br />

MehrzeiligeSumme (&anschluesse, " f " , 0.0 ));<br />

5.5.4 Aufbau eines Lastfluss-Programms<br />

Die Spezifikation der Applikation enthält die Namen der Bausteine und die<br />

Angabe der Variablen, die netzweit für elektrische Anschlüssen zu instantiieren<br />

sind. Der folgende Maple-Code zeigt, wie die zu adaptierenden Teile<br />

des Frameworks aus der Spezifikation der gesamten Applikation aufgebaut<br />

wird. Es wird über alle Bausteine und über alle Dienste iteriert.<br />

#Maple-Bibliotheken fur Spezifikations und<br />

#Adaptions-Prozeduren:<br />

with(Ntor):<br />

with(CodeGen):<br />

with(SumSetter):<br />

# Die Variablen, die netzweit zu<br />

# jedem elektrischen Anschluss gehoeren (VK):<br />

VarsProA := vector(4,[ ‘ie‘ ,‘if‘ , ‘e‘, ‘f‘ ]):<br />

# Alle applikationsspezifischen Ntor-Typen (NT) :<br />

NtorTypMenge := ... , PUGen, ...;<br />

# Alle applikationsspezifischen Summengeber-Typen (ST):<br />

SumSetterTypMenge := Knoten, ... ;<br />

# Erzeugen der Steuerfiles fuer Include<br />

# aller adaptierter Teile<br />

# Name dieses Files = InclControlFile<br />

MakeIncludeNtor( {NtorTypMenge}, {SumSetterTypMenge},<br />

‘InclControlFile‘ );<br />

# Erzeugen der verlangten Ntor-Klassen<br />

for i in NtorTypMenge do<br />

Prozedur := ‘Def‘.i;<br />

Prozedur(VarsProA);<br />

MakeNtorClass();<br />

od:<br />

# Erzeugen der verlangten Summengeber-Klassen<br />

for i in SumSetterTypMenge do<br />

Prozedur := ‘Def‘.i;<br />

Prozedur();<br />

MakeSumSetterClass();<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


108 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

od:<br />

...<br />

quit:<br />

NP1 Bus1<br />

SlackGen<br />

1<br />

Z<br />

NP2<br />

1 2<br />

Bus2<br />

2 1<br />

1 PVGen<br />

NP5<br />

Bus3 NP4<br />

1<br />

PQLoad<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Z<br />

NP3<br />

Abbildung 5.7: Netzbeispiel<br />

5.6 Adaption des Dienstes Netzaufbau<br />

Dieses Unterkapitel zeigt, wie der Dienst Netzaufbau innerhalb der DA<br />

zu adaptieren ist, damit aus dem IEEE Common Format [23] (relevanter<br />

Ausschnitt siehe Anhang B) ein Netzbestand für eine Lastflussrechnung<br />

aufgebaut werden kann.<br />

Bevor in der objekt-orientierten Welt simuliert werden kann, müssen<br />

Objekte im Speicher des Computers parametriert und aktiviert werden.<br />

Danach sind die Objekte miteinander zu verknüpfen, damit das Netzmodell<br />

für eine bestimmte Applikation entsteht.<br />

5.6.1 Einleitung<br />

Folgendes Beispiel zeigt, worum es geht. In Abbildung 5.7 ist ein kleines<br />

Netz gegeben. In diesem Netz soll eine Lastfluss-Rechnung ausgeführt<br />

werden. Ein Klient modelliert diese Applikation durch die Ntor-Typen<br />

“SlackGen”, “PQLoad”, “PVGen” und “Z”. Die Klasse “Netz” enthält<br />

in ihrem API alle Methoden, um ein Netzmodell aufzubauen. Die untenstehenden<br />

C++-Methoden-Aufrufe erzeugen die verlangten Objekte und<br />

verknüpfen sie so, wie es das Beispiel von Abbildung 5.7 vorgibt.<br />

// Ntor-Objekte erzeugen<br />

InsertNTor( new SlackGen("NP1", weitere Parameter ));


5.6. ADAPTION DES DIENSTES NETZAUFBAU 109<br />

InsertNTor( new Z("NP2", weitere Parameter ));<br />

InsertNTor( new Z("NP3", weitere Parameter ));<br />

InsertNTor( new PQLoad("NP4", weitere Parameter ));<br />

InsertNTor( new PVGen("NP5", weitere Parameter ));<br />

// Kirchhoff-Knoten-Objekte erzeugen<br />

InsertSumSetter( new Knoten("Bus1") );<br />

InsertSumSetter( new Knoten("Bus2") );<br />

InsertSumSetter( new Knoten("Bus3") );<br />

// Objekte verknuepfen<br />

InsertAnschluss("Bus1", "NP1", 1 );<br />

InsertAnschluss("Bus1", "NP2", 1 );<br />

InsertAnschluss("Bus2", "NP2", 2 );<br />

InsertAnschluss("Bus2", "NP3", 2 );<br />

InsertAnschluss("Bus2", "NP5", 1 );<br />

InsertAnschluss("Bus3", "NP3", 1 );<br />

InsertAnschluss("Bus3", "NP4", 1 );<br />

Die Objekterzeugung und -verknüpfung erfolgt im Konstruktor der Klasse<br />

“Netz”. Dazu werden die Konstruktoren der verlangten Typen aufgerufen<br />

und sämtliche notwendigen Parameter gesetzt. Diese Art der Objekterzeugung<br />

ist zu Testzwecken des Frameworks bei kleinen Netzen durchaus<br />

geeignet, da sie sehr einfach ist. Sie hat aber gravierende Nachteile:<br />

• Jede Netzänderung (Parameter und/oder Topologie) bedingt eine Neuübersetzung<br />

der Netz-Klasse und erneutes Binden des gesamten Programms.<br />

• Die Code-Länge des Programms wächst mit der Anzahl der Netz-<br />

Objekte und ihrer Verknüpfungen.<br />

Daher ist es wünschenswert, die Objekte zur Programmlaufzeit aufzubauen.<br />

Dies erreicht man durch Interpretation von Netzdaten, wie in den<br />

folgenden Zeilen skizziert:<br />

...<br />

if ( aktuelleNetzdaten.typ == BUS3 )<br />

InsertNTor( new SlackGen( aktuelleNetzdaten.name, ... ));<br />

...<br />

if ( aktuelleNetzdaten.typ == BRANCH0 )<br />

InsertNTor( new Z( aktuelleNetzdaten.name, ... ));<br />

...<br />

Die Fallunterscheidungen werden aufgrund von Netzdaten getroffen,<br />

die von einem interpretierenden Programm eingelesen werden.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


110 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

netz 44 2.345 66<br />

Bl aaa<br />

33<br />

445. 77.2 1.05<br />

Bl aaa<br />

44.4 77.01 445<br />

1.02<br />

0.87 22.5<br />

33.44 77.8<br />

1.07 1.06<br />

Netzdaten<br />

wählt Tauschformat<br />

Klient<br />

parametriert<br />

(baut)<br />

Netzaufbau<br />

Abbildung 5.8: Übersicht Netzaufbau<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Σ<br />

Σ<br />

Σ<br />

Objektbestand<br />

Netzdaten beschreiben elektrische Netze für bestimmte Applikationen.<br />

Netzdaten liefern einerseits die benötigten Daten der Betriebsmittel-Modelle<br />

und die topologische Beschreibung eines Netzes. Es gibt heute zahlreiche<br />

verschiedene Daten-Formate [23, 33]. Der applikations-orientierte<br />

Verwendungszweck bestimmt Form und Umfang der Netzdaten. In der<br />

Regel ist die topologische Beschreibung unter den Formaten recht ähnlich.<br />

Die Unterschiede liegen vorallem bei den Modellen der Betriebsmittel und<br />

ihren Parametern, sowie einigen Zusatzfunktionen, wie Regelung und Zugehörigkeiten<br />

zu Gebieten mit bestimmten Eigenschaften.<br />

Da die elektrische Energieübertragung naturgemäss ein vernetztes Gebilde<br />

darstellt, besteht zwischen den Beteiligten aus Planung, Betrieb und<br />

Forschung ein stetes Bedürfnis, netzbezogene Daten untereinander auszutauschen<br />

und bereits erfasste Datenbestände zu nutzen.<br />

Datenmodelle wurden ausgehandelt [23, 33] und passende Austauschformate<br />

definiert. Diese Formate beschreiben die Organisation der Daten<br />

typischerweise in Tabellenform.<br />

Definierte Formate sind die Voraussetzung für den Bau von Schnittstellen<br />

zwischen Computersystemen. Damit lassen sich einzelne Systeme und<br />

Datenmodelle entkoppeln, was zu kleineren, flexibleren und besser wartbaren<br />

Applikationen führt.<br />

5.6.2 Problembeschreibung<br />

In dieser Arbeit soll eine Schnittstelle zwischen einem typischen Vertreter<br />

tabellenförmiger Austauschformate und dem Framework implementiert<br />

werden. Abbildung 5.8 zeigt die Rolle des Klienten. Der Klient para-


5.6. ADAPTION DES DIENSTES NETZAUFBAU 111<br />

metriert für seine applikationsspezifische Netzberechnung eine geeignete<br />

Menge von Ntor- und Summengeber-Typen. Die eigentliche Aufgabe besteht<br />

nun darin, bestehende Netzdaten mit Hilfe der neuen, vom Klienten<br />

gewählten Ntor- und Summengeber-Typen zu interpretieren.<br />

Der Klient kennt das Tauschformat der Netzdaten und seine applikationsspezifischen<br />

Typen. Mit diesem Wissen parametriert er den Dienst<br />

Netzaufbau, welcher die Netzdaten in einen Objektbestand übersetzt, der<br />

auf Ntor- und Summengeber-Typen basiert. Auf diesem Objektbestand<br />

kann der Klient dann die Netzberechnung durchführen.<br />

Der Dienst Netzaufbau ist dadurch gekennzeichnet, dass es in ihm einen<br />

variablen und konstanten Teil gibt. Der variable Teil umfasst alles, was der<br />

Klient parametrieren muss:<br />

• Syntax des gewählten Tauschformats, um in den Netzdaten Muster zu<br />

erkennen, die für die Übersetzung benötigt werden<br />

• Übersetzungs-Semantik für die benutzten Muster<br />

Der konstante Teil betrifft die Framework-Seite der Übersetzung. Diese<br />

Seite ist konstant, weil<br />

• der Klient seine Applikation immer durch Spezialisierung der beiden<br />

Typen Ntor und Summengeber formuliert,<br />

• und der Verknüpfungsmechanismus im Framework unabhängig vom<br />

aktuellen Ntor- oder Summengebertyp ist.<br />

5.6.3 Analyse eines konkreten Tauschformates<br />

Die Analyse des Tauschformates ist ein notwendiger Schritt, um die Anforderungen<br />

des Netzaufbaus eindeutig zu erfassen, und so zu formalisieren,<br />

dass dieser Dienst implementiert werden kann. Es hat sich herausgestellt,<br />

dass die Implementation ziemlich komplex ist, und nur ein Vorgehen,<br />

das an konkreten Übersetzungs-Beispielen vollzogen wird, zum Ziel<br />

führt. Aus diesem Grund wurde zunächst ein konkretes Tauschformat [23]<br />

ausgewählt, um Netze daraus aufzubauen.<br />

Das Tauschformat [23] wurde ausgewählt, weil es gut dokumentiert ist<br />

und zahlreiche Netzdaten grösserer Testnetze vorliegen. Ferner steckt hinter<br />

dem Format ein Modell, das für die Lastfluss-Rechnung zugeschnitten<br />

ist. Die Datenvorgabe erfolgt anhand von Typen, die unter Kapitel 3.1.2<br />

beschrieben sind. Das Tauschformat [23] wurde in den Siebzigerjahren<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


112 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

entwickelt. Es ist ein typischer Vertreter tabellenförmig strukturierter Formate.<br />

Syntax<br />

Die Syntax definiert Regeln für die Anordnung von Zeichen, um korrekte<br />

Netzbeschreibungen zu liefern. Der Dienst Netzaufbau benötigt diese<br />

Information, um in den Netzdaten Zeichen zu finden, denen in der weiter<br />

unten beschriebenen semantischen Übersetzung gleichbedeutende Objekte<br />

des Domänenmodells zugeordnet werden.<br />

Die Daten eines Netzes sind in einer ASCII-Datei abgelegt, und wie<br />

in Abbildung 5.9 tabellenförmig strukturiert. Die Tabellenform entsteht<br />

10/30/96 Project NRA 1.0 1996 W IEEE 5 Bus Test Case<br />

BUS DATA FOLLOWS 4 ITEMS<br />

1 Bus 1 HV 2 1 3 1.000 0.0 0.0 0.0 232.4 -16.9 0.0 1.0 0.0 0.0 0.0 0.0 0<br />

1 Bus 1 HV 2 1 0 1.000 0.0 0.0 0.0 2.0 0.0 0.0 1.0 1.1 0.9 0.0 0.0 0<br />

3 Bus 3 HV 2 1 2 1.010 -12.72 0.0 0.0 5.0 0.0 0.0 1.0 40.0 -40.0 0.0 0.0 3<br />

4 Bus 4 HV 2 1 0 1.000 0.0 0.4 0.0 0.0 0.0 0.0 1.0 1.1 0.9 0.0 0.0 0<br />

5 Bus 5 HV 2 1 0 1.000 0.0 0.6 0.0 0.0 0.0 0.0 1.0 1.1 0.9 0.0 0.0 0<br />

-999<br />

BRANCH DATA FOLLOWS 4 ITEMS<br />

2 1 1 1 1 0 0.0 0.1 0.0 0 0 0 3 0 0.94 0.0 0.0 0.0 0.0 0.9 1.1<br />

2 3 1 1 1 0 0.0 0.1 0.0 0 0 0 2 0 0.95 0.0 0.9 1.0 0.0 0.5 1.5<br />

4 2 1 1 1 0 0.0 0.1 0.0 0 0 0 0 0 0.94 0.0 0.0 0.0 0.0 0.0 0.0<br />

3 5 1 1 1 0 0.0 0.1 0.0 0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0<br />

-999<br />

INTERCHANGE DATA FOLLOWS 1 ITEMS<br />

1 2 Bus 2 HV 1.5 1.00 1996 W IEEE 5 Bus Test Case<br />

-9<br />

TIE LINES FOLLOWS 0 ITEMS<br />

2 1 1 2 1<br />

4 2 2 1 1<br />

3 1 5 2 1<br />

-999<br />

Abbildung 5.9: Beispiel für Netzdaten<br />

dadurch, dass Daten jeweils nach maximal 128 Zeichen einer neuen Zeile<br />

zugeordnet werden. Es gibt kein anderes Zeichen, das ein Zeilenende<br />

markiert. Innerhalb der Zeilen sind Datenfelder angeordnet. Diese werden<br />

durch festgelegte Spaltenpositionen von einander abgegrenzt. Damit lassen<br />

sich zwar Datenzeichen einsparen. Es ist jedoch aufwendiger, einen<br />

Datenstrom ohne Trennzeichen in einzelne Symbole zu zerlegen 2 . <strong>Eine</strong><br />

Zeile entspricht jeweils einem Datensatz. Gleichartige Datensätze sind in<br />

Datenblöcken zusammengefasst. Datensätze sind gleichartig, wenn sie die<br />

gleiche Anzahl von Datenfeldern an den gleichen Spaltenpositionen aufweisen.<br />

Anfang und Ende der Datenblöcke lassen sich durch Datensätze<br />

mit einer blockspezifischen Start- bzw. Stopidentifikationen erkennen.<br />

Ein Datenfeld ist eine Zeichenkette in einem Datensatz. Ein Datenfeld<br />

lässt sich durch Angabe je einer Zahl für die Anfangs- und Endspalte im<br />

Datensatz lokalisieren.<br />

2 engl. to parse<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.6. ADAPTION DES DIENSTES NETZAUFBAU 113<br />

Übersetzer-Semantik<br />

Der Klient beschreibt, wie für seine Anwendung relevante Konstrukte des<br />

Tauschformates in gleichbedeutende Objekte seiner Applikation zu übersetzen<br />

sind. <strong>Eine</strong> solche Beschreibung wird hier anhand eines für die Lastfluss-Rechnung<br />

geeigneten Satzes von Ntor- und Summengeber-Typen als<br />

Beispiel angeführt. Dazu dienen die nachfolgenden Tabellen der Abbildungen<br />

5.10, 5.11 und 5.12. Sie zeigen, wie relevante Konstrukte (siehe<br />

Anhang B) in Objekte und Parameter des Frameworks zu übersetzen sind.<br />

Verschiedene Zweig- und Bustypen unterscheiden sich durch das Typfeld.<br />

Je nach Typ können gleich positionierte Datenfelder verschiedene<br />

Bedeutungen haben. Gemeinsam ist jedoch, dass sich ihre Typkennung<br />

aus dem Datenblock-Typ und dem Datensatztyp zusammensetzt und dass<br />

sie die Information für die Netztopologie enthalten. Die Netztopologie<br />

wird dadurch beschrieben, dass die Knoten 3 netzweit eindeutig nummeriert<br />

sind. Die Zweige haben für jede Anschlusseite je ein Datenfeld, das<br />

die Nummer des angeschlossenen Knotens enthält.<br />

Abbildung 5.10 zeigt die Übersetzung der Bus-Datensätze. Die einfachsten<br />

Typen erzeugen je einen Summengeber mit dem Verhalten eines<br />

Kirchhoff-Knotens (mit KH bezeichnet) und ein damit verbundenes Ntor.<br />

Das Ntor formuliert das Verhalten des Knotens. Der Datensatz Bus, Typ<br />

2 erlaubt es, einen anderen Bus auf eine Spannung Usoll zu regeln. Je<br />

nach Wert des Feldes RVC ist dies ein entfernt liegender oder der eigene<br />

Bus. Der korrespondierende Ntor-Typ weist zwei Tore auf. Das zweite Tor<br />

führt zu Variablen, mit denen die Gleichung für die Spannungsregelung<br />

formuliert wird. Die Einzelheiten zur Spannungsregelung sind in Kapitel<br />

6 beschrieben.<br />

Abbildung 5.11 zeigt die Übersetzung der Zweig-Datensätze. Die Reihenfolge<br />

der Bus1 und Bus2-Felder ist für Zweige wichtig, da damit die<br />

Einbaurichtung eines Betriebsmittels, wie z.B. eines Transformatoren festgelegt<br />

wird. Der Datensatz Zweig, Typ 2 ermöglicht die Festlegung einer<br />

Spannungsregelung eines weiteren “Bus”. Dies bietet beispielsweise ein<br />

Transformator mit variablem Übersetzungsverhältnis. Ferner wird ein typischer<br />

Fall einer Parameter-Auswahl aufgezeigt. Da das gewählte Tauschformat<br />

F auch Daten für die optimierenden Lastflussrechnungen liefert,<br />

sieht es für verschiedene Parameter Bereiche, wie Umax und Umin vor. Soll<br />

die Applikation wie hier ohne Optimierung arbeiten, muss der Bereich auf<br />

3 engl. bus<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


114 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Konstrukte Tauschformat F Framework - Objekte<br />

Bus, Typ 0,1,3<br />

Bus<br />

#1<br />

Bus, Typ2<br />

Bus<br />

#1<br />

Bus<br />

#1<br />

Usoll<br />

RVC<br />

Bus<br />

#2<br />

KH<br />

Σ<br />

Bus<br />

#<br />

RVC = 0 :<br />

KH<br />

Σ<br />

Bus<br />

#1<br />

RVC = 0 :<br />

KH<br />

Σ<br />

Bus<br />

#1<br />

U -> Usoll<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

1<br />

0 -> PQ-Load<br />

1 -> PQ-Gen<br />

3 -> Slack-Generator<br />

PU-Generator<br />

1<br />

2<br />

PU-Generator<br />

1 2<br />

Abbildung 5.10: Übersetzung der Bus-Datensätze<br />

Konstrukte Tauschformat F<br />

Zweig, Typ 0,1<br />

Bus<br />

#2<br />

Zweig, Typ2<br />

Bus Bus<br />

#1 #2<br />

Umin<br />

Umax<br />

RVC<br />

Bus<br />

#3<br />

KH<br />

Σ<br />

Bus<br />

#1<br />

Bus#3 = Bus#1<br />

KH<br />

Σ<br />

Bus<br />

#1<br />

U -> Usoll<br />

Bus#3 = Bus#2<br />

KH<br />

Σ<br />

Bus<br />

#1<br />

Framework - Objekte<br />

Leitung, Transformator<br />

1 2<br />

TransformatorII<br />

1 2<br />

3<br />

TransformatorII<br />

1 2<br />

3<br />

Abbildung 5.11: Übersetzung der Zweig-Datensätze<br />

KH<br />

Σ<br />

Bus<br />

#2<br />

U -> Usoll<br />

KH<br />

Σ<br />

Bus<br />

#2<br />

KH<br />

Σ<br />

Bus<br />

#2<br />

KH<br />

Σ<br />

Bus<br />

#2<br />

U -> Usoll


5.6. ADAPTION DES DIENSTES NETZAUFBAU 115<br />

Konstrukte Tauschformat F<br />

Austausch-Gebiet<br />

Slack<br />

Area<br />

#<br />

Psoll<br />

Bus<br />

#<br />

Verbindungsleitung<br />

Bus Bus<br />

#1 Area #2 Area<br />

#1 #2<br />

Bus Bus<br />

#1 #2<br />

Toleranz<br />

Zweig, Typ0<br />

Zweigparameter<br />

P-Summe<br />

Σ<br />

Area<br />

#<br />

-> Psoll<br />

P-Summe<br />

Σ<br />

Area<br />

#1<br />

KH<br />

Σ<br />

Bus<br />

#1<br />

Framework - Objekte<br />

P1 = ... P2 = ...<br />

1 2<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

1<br />

AreaSlack-Generator<br />

P1 = ...<br />

Leitung<br />

1 2<br />

bereits übersetzter Teil<br />

Abbildung 5.12: Übersetzung spezieller Datensätze<br />

1<br />

KH<br />

Σ<br />

Bus<br />

#<br />

P-Summe<br />

einen einzelnen Parameter abgebildet werden, z.B. Usoll = Umax+Umin<br />

2<br />

Abbildung 5.12 zeigt die Übersetzung der Datensätze für Austauschgebiete<br />

und Verbindungsleitungen. Diese speziellen Datensätze dienen dazu,<br />

Leistungsbilanzen zwischen Netzgebieten zu formulieren. Die Einzelheiten<br />

der Modellierung sind in Kapitel 6 angegeben. Spezielle Datensätze<br />

lassen sich nicht nach dem gleichen Schema wie Bus/Zweig-Datensätze<br />

übersetzen. Spezielle Datensätze enthalten entweder keine Netztopologie<br />

oder sie liefern Zusatzinformation zu anderen, bereits übersetzten Datensätzen.<br />

Im oberen Teil der Abbildung 5.12 ist die Übersetzung von Datensätzen<br />

für Austauschgebiete dargestellt. Innerhalb eines Gebiets Area#<br />

soll gesamthaft eine bestimmte Leistung Psoll ausgetauscht werden. Die<br />

Toleranz-Angabe wird nicht verwendet, da die Applikation nicht optimiert.<br />

Pro Austausch-Gebiet wird ein Ntor vom Typ “AreaSlack” instantiiert und<br />

durch Anschluss an einen Summengeber vom Typ P-Summe in die Leistungsbilanz-Summe<br />

einbezogen. Der “AreaSlack” muss noch mit einem<br />

Summengeber KH, zur Modellierung des elektrischen Anschlusses verbunden<br />

werden.<br />

Im unteren Teil von Abbildung 5.12 ist aufgezeigt, wie ein bereits instantiiertes<br />

Ntor im Zuge der weiteren Übersetzung zu behandeln ist. Bei<br />

Σ<br />

Area<br />

#2<br />

KH<br />

Σ<br />

Bus<br />

#2


116 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

der Übersetzung eines Datensatzes für Verbindungsleitungen wird zusätzliche<br />

Information für einen Zweigdatensatz eingebracht. Sie betrifft die<br />

Zugehörigkeit beider Zweiganschlüsse zu den Austausch-Gebieten. Die<br />

Übersetzung erfolgt dadurch, dass das bereits vorhandene Ntor zusätzlich<br />

an die verlangten Summengeber vom Typ P-Summe angeschlossen werden.<br />

5.6.4 Spezifikation<br />

Nachfolgend ist beschrieben, wie die parametrierbaren Teile des Dienstes<br />

Netzaufbau spezifiziert werden. Grob gesehen gibt es für alle relevanten<br />

Konstrukte des Tauschformates F (siehe Anhang B) eine Maple-Prozedur.<br />

Zum Parameter gehörende Information<br />

Zur Instantiierung von Ntor- und Summengeber-Typen sind für alle Parameter<br />

in der Schnittstelle des Konstruktors aktuelle Werte P1, P2, ...Pnzu<br />

übergeben:<br />

... new NTor("name", P1, P2, ..., Pn )<br />

Der Klient spezifiziert, wie die aktuellen Werte aus den Netzdaten zu bilden<br />

sind. Abbildung 5.13 zeigt, welche Angaben vom Klienten benötigt<br />

werden, um einen für die Ntor-Instantiierung benutzten Parameter Pi aus<br />

den Netzdaten zu filtrieren. Der Klient legt fest, welche Parameter er<br />

aus den Netzdaten für seine Applikation filtrieren will. Diese Parameter<br />

werden als O-Parameter bezeichnet. Jedem O-Parameter ist ein Deskriptor<br />

zugeordnet. Der Deskriptor beschreibt einen O-Parameter durch ein Symbol,<br />

einer Start- und Endposition im Datensatz sowie einem Datentyp, mit<br />

welchem die Zeichenkette der Netzdaten zu interpretieren ist. Grundsätzlich<br />

stehen die in Tabelle 5.3 angegebenen Datentypen zur Auswahl.<br />

Datentyp C-Datentyp Typ-Code<br />

reell float f<br />

ganzzahlig short d<br />

Zeichenkette char* s<br />

Tabelle 5.3: Datentypen für Deskriptor der O-Parameter<br />

Der Klient verwendet die in Spalte “Typ-Code” der Tabelle 5.3 aufgeführten<br />

Buchstaben, um im Deskriptor einen Datentypen zu deklarieren.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.6. ADAPTION DES DIENSTES NETZAUFBAU 117<br />

Datensatz<br />

O-Parameter<br />

Symbol<br />

Anfangsspalte<br />

Endspalte<br />

Datentyp<br />

n<br />

hat<br />

Konvertier-<br />

Funktion<br />

1<br />

hat<br />

Parameter<br />

im Konstruktor<br />

Zeichenkette<br />

Tauschformat F<br />

Abbildung 5.13: Spezifikation eines Parameterwertes<br />

Zu jedem Parameter definiert der Klient eine Konvertierungs-Funktion.<br />

Diese wird als Zeichenkette formuliert, welche standardmässige Mathematik-Funktionen<br />

und Symbole von O-Parametern in der Programmiersprache<br />

des Frameworks (C++) enthält.<br />

Beispiel: Der Klient formuliere die Gleichungen seiner Ntor-Typen in kartesischer<br />

Darstellung. Das Tauschformat F liefert die O-Parameter U und<br />

θ (in Grad) jedoch in polarer Form. esl sei ein kartesischer Parameter, der<br />

bei der Instantiierung eines Ntor-Objektes benötigt wird. Die Konvertierungsfunktion<br />

für esl lautet daher Ucos( πθ<br />

180 ) .<br />

Das folgende Maple-Codestück zeigt, wie der grundlegende Mechanismus<br />

eines Deskriptor mit Maple V formuliert ist. Stellvertretend zeigt es<br />

für den Ntor-Typ den Deskriptor:<br />

# Variable zum Speichern der Spezifikationsdaten:<br />

global ... Pars, ParKonvFuns, OParameter, OParType,<br />

OParStart, OParEnd, AnzOutPars, AnzPars;<br />

# D e s k r i p t o r<br />

# O-Parameter aus den Netzdaten im Tauschformat F:<br />

AnzOutPars := 4;<br />

OParameter := vector(AnzOutPars,[Theta,U,G,B]); #Auswahl der<br />

#O-Parameter<br />

OParType := vector(AnzOutPars,[f,f,f,f]); #Datentypen in C<br />

#f = FLOAT<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


118 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

OParStart := vector(AnzOutPars,[34,85,107,115]);#Start-Position<br />

#der O-Parameter<br />

OParEnd := vector(AnzOutPars,[40,90,114,122]);#End-Position<br />

#der O-Parameter<br />

# Parameter fuer die Objekt-Instanzierung:<br />

AnzPars := 4;<br />

Pars := vector(AnzPars,[esl,fsl,G,B]); #Parameter im Objekt<br />

...<br />

# Konvertierungsfunktion pro Parameter:# Objekt = f(Netzdaten)<br />

ParKonvFuns := vector(AnzPars); #<br />

ParKonvFuns[1] := U*cos(Pi*Theta/180); # esl = U*cos(Pi*Theta/180)<br />

ParKonvFuns[2] := U*sin(Pi*Theta/180); # fsl = U*sin(Pi*Theta/180)<br />

ParKonvFuns[3] := G;<br />

ParKonvFuns[4] := B;<br />

Die Konvertierungsfunktion spezifiziert stets einen C-Ausdruck, der anstelle<br />

des Parameters im Konstruktor eines Ntor-Objektes eingesetzt wird.<br />

Zur Programmlaufzeit wird der Ausdruck ausgewertet und als konkreter<br />

Parameterwert zur Instantiierung des Objektes benutzt.<br />

Netzweit geltende Parameter<br />

Die durch Angabe eines Deskriptors ausgewählten O-Parameter gelten global<br />

für das Netz. Ein typischer O-Parameter ist die Bezugsscheinleistung,<br />

die zur Skalierung für die Per-Unit-Rechnung benutzt wird.<br />

Bus/Zweig - Datensätze<br />

Die Übersetzung dieser Datensätze wird an drei prinzipiell verschiedenen<br />

Stellen spezifiziert. Dafür ist je eine Prozedur vorgesehen. Diese Partitionierung<br />

hat vorallem implementations-technische Gründe:<br />

1. Die Übersetzung richtet sich nach dem Typ des Bus- oder Zweigdatensatzes.<br />

<strong>Eine</strong> Korrespondenztabelle ordnet jedem Bus- oder<br />

Zweigdatensatz TFj einen Ntor-Typen TNj zu.<br />

Es wird der Typ des Datenblocks und des Datensatzes benötigt, um<br />

den Tabelleneintrag TFj zu bilden.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.6. ADAPTION DES DIENSTES NETZAUFBAU 119<br />

2. Die den Datenblöcken gemeinsamen Übersetzungsangaben werden<br />

in einer Prozedur zusammengefasst. Dies verringert die Spezifikationsmenge<br />

bei den einzelnen Ntor-Spezifikationen und ermöglicht<br />

ein blockbezogenes Vorgehen bei der Übersetzung der Bus- und Zweigdatensätze.<br />

Pro Block gibt es einen Deskriptor, der die folgende Angaben<br />

enthält:<br />

• Start- und Stopzeichen der Datenblöcke<br />

• Anzahl der elektrischen Anschlüsse N<br />

• Positionen und Längen der Zeichenketten, die sich auf elektrische<br />

Verbindungen beziehen<br />

• Position und Länge der Zeichenkette, die den Typidentifikator<br />

enthält<br />

• Position und Länge der Zeichenkette, die das Austausch-Gebiet<br />

enthält<br />

3. Alle Angaben der Übersetzung, die spezifisch für einen Ntor-Typ X<br />

gelten, werden in der zugehörigen Spezifikations-Prozedur mit dem<br />

Namen DefX hinzugefügt. Die Ntor-Spezifikation wird um folgende<br />

Daten ergänzt:<br />

• Deskriptor pro O-Parameter<br />

• Konvertierungsfunktion pro Parameter<br />

Spezielle Datensätze<br />

Für die beiden Datensätze Austauschgebiete und Verbindungsleitungen gibt<br />

es je eine Prozedur mit folgenden Angaben:<br />

• Deskriptor pro Parameter<br />

• Konvertierungsfunktion pro Parameter<br />

• Start- und Stopzeichen des Datenblocks<br />

5.6.5 Spezifikationsdaten<br />

Wie im Codebeispiel S. 117 ersichtlich, besteht ein Deskriptor aus einem<br />

Tupel der Variablen, die in Tabelle 5.4 beschrieben ist.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


120 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Variablename Bedeutung<br />

OParameter Name eines O-Parameters<br />

OParStart Start-Spaltennummer des Datenfeldes eines O-<br />

Parameters<br />

OParEnd End-Spaltennummer des Datenfeldes eines O-<br />

Parameters<br />

AnzOutPars Anzahl der O-Parameters eines Datensatz-Typs<br />

AnzPars Anzahl der Parameter, die der Dienst Netzberechnung<br />

verwendet<br />

Pars Namen der Parameter, die der Dienst Netzberechnung<br />

verwendet<br />

Tabelle 5.4: Spezifikationsdaten für einen Deskriptor<br />

Die optionalen Konvertierungsfunktionen werden mit Hilfe der Variablen<br />

ParKonvFuns vom Typ “Vektor” gespeichert. Die Dimension dieses<br />

Vektors wird durch die Variable AnzPars vorgegeben.<br />

Zur Spezifikation der verschiedenen Datensatztypen sind weitere Variable<br />

notwendig, um z.B. die Start- und Stopidentifikation eines Datenblocks<br />

zu speichern.<br />

5.6.6 Adaption<br />

In der Adaption wird aus den Spezifikationsdaten die adaptierbare Methode<br />

der Klasse “Netz”, F-Übersetzer genannt, erzeugt. Dies geschieht mit<br />

einem Codegenerator, der im Folgenden als F-Übersetzer-Generator bezeichnet<br />

wird.<br />

Seine Entwicklung ist ziemlich komplex, insbesondere dann, wenn eine<br />

möglichst allgemeine Verwendbarkeit angestrebt wird. Daneben gibt es für<br />

die Entwicklung folgende Randbedingungen:<br />

1. Tauschformat F (Syntax und Semantik): Die Implementation des F--<br />

Übersetzer-Generators hängt vom zu übersetzenden Format F ab. Die<br />

bei der Analyse gefundenen relevanten Konstrukte bestimmen zusammen<br />

mit der Syntax des Formates die Implementation des F-Übersetzer-Generators<br />

und der Spezifikation.<br />

2. Schnittstelle zum Framework (API): Das API des Frameworks muss<br />

vor der Entwicklung des F-Übersetzers bekannt sein. Der F-Übersetzer<br />

benötigt sowohl die Konstruktoren der applikationsspezifischen<br />

Ntor- und Summengeber-Typen als auch die Methoden zu ihrer Einfügung<br />

und Verknüpfung innerhalb des Frameworks.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.6. ADAPTION DES DIENSTES NETZAUFBAU 121<br />

Für alle<br />

Ntor-Typen<br />

der<br />

Applikation<br />

Start<br />

Blockweit gültige<br />

Übersetzung<br />

einrichten<br />

Typidentifikator<br />

TF<br />

bilden<br />

TF = TF ?<br />

1<br />

nein<br />

TF = TF ?<br />

2<br />

nein<br />

TF = TF ?<br />

n<br />

nein<br />

Ende<br />

Bus/Zweig Datensätze<br />

Fehler: fehlende Typ-Korrespondenz<br />

ja<br />

ja<br />

ja<br />

Ntor vom Typ TN instantiieren<br />

1<br />

Ntor vom Typ TN instantiieren<br />

2<br />

Ntor vom Typ TN instantiieren<br />

n<br />

Erzeugen<br />

Knoten<br />

alle<br />

Datensätze<br />

?<br />

ja<br />

alle<br />

Datenblöcke<br />

?<br />

Abbildung 5.14: Übersetzung von Bus/Zweig-Typ-Datenblöcken<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

ja<br />

nein<br />

nein


122 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

<strong>Eine</strong> wesentliche Erschwernis beim Bau des F-Übersetzer-Generators<br />

kommt daher, dass sowohl mehrere zeitliche Phasen, wie Spezifikations-,<br />

Übersetz- und Laufzeit als auch mehrere Gültigkeitsbereiche von Variablenzuberücksichtigen<br />

sind. Der F-Übersetzer-Generator lässt sich<br />

am einfachsten durch den Zielcode beschreiben, den er erzeugt. Dabei<br />

schreibt eine Programmzeile des Generators genau eine C++-Programmzeile<br />

des Zielcodes in eine Quelltext-Datei :<br />

writeto(Quelltext-Datei );<br />

...<br />

lprint(‘ eine Zielcode-Zeile ‘);<br />

Die Zielcode-Zeile stellt innerhalb des Generators eine Variable vom Typ<br />

Zeichenkette dar. Im einfachsten Fall wird diese Variable auf einen konstanten<br />

Wert gesetzt, um einen konstanten Codeteil, wie z.B. ein Sprachsymbol<br />

von C++ zu erzeugen. In komplexeren Fällen wird die Zeichenkette<br />

aus Teilen zusammengesetzt, die z.B. von den Spezifikationsdaten, den<br />

Aufrufparametern des F-Übersetzer-Generators oder von Variablen (z.B.<br />

Zählern) des Generators abhängen.<br />

<strong>Eine</strong> typische Programm-Struktur für die Interpretation des Tauschformates<br />

(vergl. Codebeispiel S. 109) ist im Flussdiagramm von Abbildung<br />

5.14 dargestellt. Dieses Flussdiagramm zeigt den Programmablauf bei der<br />

Übersetzung der Bus- und Zweigdatensätze. Die anderen Datensätze (siehe<br />

Anhang B) werden prinzipiell gleichbehandelt, wenn auch stark vereinfacht,<br />

da es z.B. keine unterschiedlichen Typen innerhalb eines Datenblocks<br />

gibt.<br />

Im Folgenden wird das Flussdiagramm von Abbildung 5.14 betrachtet.<br />

Da die Bus- und Zweigdatensätze nach der gleichen Syntax aufgebaut<br />

sind, lassen sie sich nach dem gleichen, blockweit gültigen Schema interpretieren.<br />

Es muss z.B. bei jedem Datenblock zunächst ein Blockanfang<br />

gefunden werden. Der Codegenerator erzeugt in diesem Fall ein Zielcodestück,<br />

das Netzdaten einliest, bis es auf ein bestimmtes Zeichen stösst.<br />

Dieses Zeichen ist abhängig von dem Spezifikationsdatum “Startzeichen<br />

des Datenblocks”. Der Codegenerator setzt dieses Zeichen in einen Zeichenkettenvergleich,<br />

wie z.B.:<br />

...strcmp(."‘.Startzeichen.‘" ...) == 0 ...<br />

<strong>Eine</strong> weitere, wichtige Gemeinsamkeit betrifft alle Bus- und Zweig-Da-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.6. ADAPTION DES DIENSTES NETZAUFBAU 123<br />

Netzdaten<br />

Format F<br />

liest ruft auf<br />

Framework<br />

Objekt-<br />

Netzbestand<br />

Prozess zur Programm-Laufzeit<br />

Hinweis: liest<br />

A B<br />

F-Übersetzer<br />

Σ<br />

Framework<br />

API<br />

instantiiert Objekte<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Σ<br />

Σ<br />

bedeutet: B liest A.<br />

Abbildung 5.15: F-Übersetzer zur Laufzeit<br />

tensätze. Es ist die Übersetzung des Datensatzes in einen Ntor-Typ, wie<br />

dies in der inneren Schleife von Abbildung 5.14 dargestellt ist. Für die<br />

Typabfrage und die Ntor-Instantiierung kann der Codegenerator für alle<br />

Ntor-Typen, die der Klient in der Applikation verwenden will, den gleichen<br />

Zielcode erzeugen, mit der Ausnahme weniger Stellen. An diesen<br />

Stellen setzt der Codegenerator Zeichen in den Zielcode ein, die aus den<br />

Spezifikationen (siehe Korrespondenztabelle S. 118) und aus der Menge<br />

der verwendeten Ntore (Parameter NT) ableitbar sind.<br />

Zur Laufzeit ruft der Konstruktor der Klasse “Netz” die F-Übersetzer-<br />

Methode auf. Wie in Abbildung 5.15 ersichtlich, liest dabei der F-Übersetzer<br />

die Netzdaten und erzeugt mit Hilfe des API’s den Objektbestand für<br />

die gewünschte Netzberechnung.<br />

5.6.7 Diskussion der Lösung<br />

Die Übersetzung eines bestimmtes Tauschformats F [23] ist innerhalb der<br />

Domänen-Architektur möglich. Dabei ist in der vorliegenden Arbeit genau<br />

ein Format pro Dienst “Netzaufbau” übersetzt worden. Dieses Ergebnis hat<br />

für den Klienten folgende Konsequenzen:<br />

1. Der F-Übersetzer für das Tauschformat F ist wiederverwendbar. Die<br />

Übersetzung auf neue applikationsspezifische Ntor- und Summengebertypen<br />

lässt sich innerhalb der Spezifikation einfach anpassen.


124 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

2. Weitere Bus- und Zweigdatensätze innerhalb des Tauschformates F<br />

lassen sich durch Anpassung der Spezifikation übersetzen.<br />

3. Andere tabellenförmige Tauschformate, bei denen die Datenfelder<br />

ebenfalls durch Spaltenpositionen definiert sind, bedingen eine neue<br />

Implementation der Übersetzung, die strukturell der aktuellen Lösung<br />

ähnlich ist.<br />

4. Falls der Klient ein neues Austauschformat mit genügend abweichender<br />

Syntax verwenden will, muss er den Dienst “Netzaufbau” neu<br />

implementieren. In diesem Fall lässt sich evtl. noch die Spezifikation<br />

der Parameter-Konversion und Teile ihrer Implementation wiederverwenden.<br />

Zusammenfassend lässt sich der vorgestellte Dienst Netzaufbau wie folgt<br />

charakterisieren:<br />

Vorteile: Die Übersetzung der wichtigen Bus-Zweig Datensätze wird lokal<br />

innerhalb einer Ntor-Spezifikationen SN parametriert. Dieser Ansatz<br />

folgt daher der objekt-orientierten Betrachtungsweise. Zum Objekt gehörige<br />

Information ist auch dort angesiedelt. Dies erleichtert das Verständnis.<br />

Nachteile: Es braucht pro Tauschformat einen Satz von Ntor-Spezifikationen.<br />

Ferner ist der vorliegende Dienst auf das Tauschformat F und solche<br />

beschränkt, die ebenfalls eine tabellenförmige Struktur mit zeilenweiser<br />

Zuordnung von Datensätzen und eine Definition einzelner Datenfelder<br />

durch Spaltennummern aufweisen.<br />

5.7 Richtlinien für die Benutzung<br />

5.7.1 Einleitung<br />

Generell entscheidend für eine einfache Benutzung ist eine verständliche<br />

Dokumentation. Diese beinhaltet eine klare Darstellung des Domänenmodells,<br />

der erbrachten Dienste und der Voraussetzungen für die Anwendung<br />

des Frameworks. Ferner gehören Einsatz-Beispiele dazu, möglicherweise<br />

in Form von Tutorien oder Fallstudien. In einem vernetzten Informationssystem<br />

sind heute die Angaben von häufig gestellten Fragen (FAQ’s),<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


5.7. RICHTLINIEN FÜR DIE BENUTZUNG 125<br />

Anwenderforen in Form von Diskussionsgruppen (usergroups) und Fehlerlisten<br />

mit Fehlerumgehungen üblich.<br />

Auf die DA übertragen, bedeutet dies, dass für eine Wiederverwendbarkeit<br />

ein Katalog der vorhandenen Dienste angelegt werden muss. Dazu<br />

sind die zugehörigen Spezifikationen, Spezifikationsdaten und Adaptionen<br />

zu dokumentieren.<br />

Die DA hilft dem Klienten, indem sie ein Vorgehen der Wiederverwendung<br />

und Anpassung innerhalb einer definierten Struktur vorgibt. Die Einzelteile<br />

dieser Struktur helfen mit, die Komplexität der Aufgabe zu reduzieren.<br />

Es werden einzelne Aufgabenschritte definiert.<br />

Der aufwendigste Schritt dabei ist die Entwicklung des Codegenerators<br />

im Adaptions-Element. Sie kann dann gelingen, wenn eine klare Vorstellung<br />

vom zu erzeugenden Code besteht und eine geeignete Parametrierung<br />

vorgenommen wird. Gerade wegen dieser Schwierigkeiten ist es sinnvoll,<br />

einen Rahmen für die Entwicklung festzulegen, der Konformität erzeugt,<br />

und dadurch Wiederverwendung und Erfahrungsaustausch zwischen Klienten<br />

und Framework-Entwickler fördert.<br />

5.7.2 Anpassung durch den Klienten<br />

In Abbildung 5.16 sind verschiedene Eingriffsstellen des Klienten auf Elemente<br />

der Architektur dargestellt. Je nach Umfang der Anpassung, nachfolgend<br />

Variation genannt, greift der Klienten an den Stellen (1,2,3) ein.<br />

Bei der Stelle (4) legt der Klient fest, wie sein Framework-Quelltext aufzubauen<br />

ist. Dazu dienen die Angaben NT, ST, D und VK. Der Klient bindet<br />

den zusammengebauten Quelltext entweder in das Default-Programm oder<br />

in sein eigenes Quellprogramm.<br />

Es gibt grundsätzlich die folgenden Fälle für die Wiederverwendung<br />

des Frameworks mit der DA, wobei die in Klammern angegebenen Zahlen<br />

die Eingriffstellen von Abbildung 5.16 bezeichnen:<br />

• Die Variation liegt im Spezifikationsbereich bestehender Dienste. Der<br />

Klient gibt in den Spezifikationsprozeduren neue Daten ein und/oder<br />

fügt neue Ntor- bzw. Summengeber-Typen hinzu (1).<br />

• Die Variation liegt in der Adaption eines bestehenden Dienstes. Der<br />

Klient muss dabei keine neuen Methoden und Attribute innerhalb des<br />

passiven API’s hinzufügen. Der Klient ändert dazu evtl. die Spezifikation<br />

S, die Daten V sowie die Adaption A. Beispiele: Neue, z.B.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


126 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Programm-Familie auf der Basis des Domänenmodells<br />

Variabilität<br />

Gemeinsamkeit<br />

(Haupt-)<br />

Programm<br />

Laufzeitsystem<br />

Spezifikation<br />

Adaption<br />

parametriert<br />

Framework<br />

ausführbares<br />

Programm<br />

erzeugt Teile von<br />

ist eingebunden in<br />

Abbildung 5.16: Benutzung der DA<br />

Klient<br />

effizientere Berechnung für die Jacobi-Matrix, bzw. den Mismatch-<br />

Vektor (1),(2).<br />

• Die Variation liegt in der Adaption eines bestehenden Dienstes. Der<br />

Klient muss dabei neue Methoden und Attribute innerhalb des passiven<br />

API’s hinzufügen. Der Klient erweitert dabei das aktive API<br />

im Kontext der adaptierbaren Klassen, indem er in der Adaption neue<br />

Klassen-Methoden erzeugt und evtl. neue Attribute hinzufügt. Hierbei<br />

muss der Klient beachten, dass er innerhalb einer Klasse, die er<br />

auf diese Weise erweitert, die Eindeutigkeit von Namen beachtet, damit<br />

keine Seiteneffekte auf vorhandene, private Variablen entstehen.<br />

Beispiel: Berechnung spezieller Zwischenresultate.<br />

• Die bestehenden Dienste sind nicht wiederverwendbar. Sie lassen<br />

sich nur durch Änderung der Klassenstruktur innerhalb des Frameworks<br />

realisieren(3). In diesem Fall liegt das Problem ausserhalb<br />

der Domänen-Anforderungen. Beispiele: Optimierung, numerische<br />

Lösung von Differentialgleichungen.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

1<br />

2<br />

3<br />

4


5.7. RICHTLINIEN FÜR DIE BENUTZUNG 127<br />

5.7.3 Vorgehen bei Änderung eines Dienstes<br />

Änderungen innerhalb des variablen Anteils eines Dienstes sind möglich,<br />

sofern geeignete Adaptionsstellen bei der Entwicklung des Frameworks<br />

eingeplant worden sind. Angenommen, dass diese Voraussetzungen erfüllt<br />

sind, sind folgende Schritte vom Klienten auszuführen:<br />

1. Anforderungen an adaptierten Framework-Code erfassen.<br />

2. Test, ob es bereits eine Adaption mit ähnlichen Anforderungen gibt.<br />

Falls es solche gibt, können diese evtl. nach geeigneten Modifikationen<br />

wiederverwendet werden.<br />

3. Zielcode mit Hilfe des aktiven API’s des aktuellen Kontextes erarbeiten.<br />

4. Zielcode testen.<br />

5. Variable Teile des Zielcodes identifizieren.<br />

6. Test, ob es bereits Spezifikationsdaten gibt, aus denen die variablen<br />

Teile des Zielcodes erzeugbar sind.<br />

7. Falls keine Spezifikationsdaten existieren, sind solche zu schaffen.<br />

Dabei ist zu unterscheiden, welcher Kategorie (Netz oder Bausteine)<br />

die Spezifikation zuzuordnen ist.<br />

5.7.4 Erweiterung des Frameworks<br />

Weitere Dienste lassen sich am Framework nur dann einfügen, wenn der<br />

Klient in dem bestehenden Framework neue Adaptionsstellen hinzufügt.<br />

Dazu muss er für den neuen Dienst:<br />

• eine zusätzliche Methode und evtl. Attribute in der Klasse “Netz”<br />

ergänzen. Falls diese Methode einen variablen Anteil hat, muss auch<br />

eine Adaptionsstelle ergänzt werden.<br />

• Virtuelle Methoden in einer gemeinsamen Oberklasse der Bausteine<br />

vereinbaren.<br />

• Adaptionsstellen für die Baustein-Beteiligung ergänzen.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


128 KAPITEL 5. DOMÄNEN-ARCHITEKTUR<br />

Im Architektur-Ansatz der vorliegenden Arbeit ist es der Framework-<br />

Entwickler, der neue Dienste hinzufügt und damit das Framework gemäss<br />

dem in Abbildung 2.7 dargestellten, durch Wiederverwendung gesteuerten<br />

Software-Entwicklungsprozess (RSP-Prozess) erweitert.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Kapitel 6<br />

Fallstudien<br />

Dieses Kapitel zeigt verschiedene Fälle aus dem Bereich der Netzberechnung.<br />

Das Augenmerk richtet sich vorallem auf eine vollständige Modellierung<br />

innerhalb der Domänen-Architektur. Dazu sind geeignete Ntorund<br />

Summengebertypen und ihr Verhalten gemäss Kapitel 3.2 festzulegen.<br />

Im Gegensatz zu den Beispielen der Kapitel 3, 4 und 5 wird der<br />

Aspekt des Netzaufbaus und der Parametrierung auf der Basis des Tauschformates<br />

[23] einbezogen. Neben dem Verhalten der Bausteine werden<br />

auch die Konvertierungsfunktionen spezifiziert, um anzugeben, wie man<br />

von den ausgewählten Datenfeldern des Tauschformates zu den Parametern<br />

der Ntor-Typen gelangt. Ferner werden die Code-Mengen angegeben,<br />

die auf den verschiedenen Ebenen der Domänen-Architektur (siehe Abbildung<br />

5.1) geschrieben bzw. erzeugt werden.<br />

Die ersten drei Fälle sind Lastfluss-Berechnungen. Es wird das fünfknotige<br />

Netz verwendet, das in Abbildung 6.1 dargestellt ist. Nichtumrandete<br />

Werte sind vorgegebene Parameterwerte, umrandete Grössen sind Resultate<br />

der ausgeführten Lastfluss-Simulation. Angaben ohne Masseinheit<br />

sind immer bezogene Grössen (p.u.-Werte). Die zugehörigen, computerlesbaren<br />

Netzdaten sind gemäss Tabelle 6.1 im Tauschformat [23] (siehe<br />

Anhang B) vorgegeben. Man beachte, dass bei jedem Fall eine individuelle<br />

Auswahl aus diesen Daten getroffen wird.<br />

Die Reihenfolge der Datensätze in der Tabelle 6.1 liefert die Instanzennamen<br />

OP... bzw. TP... von Ntoren in Abbildung 6.1. Die unter “BUS<br />

DATA” aufgeführten Datensätze werden mit dem Namen OP, diejenigen<br />

unter “BRANCH DATA” mit TP gekennzeichnet. Die unterste Zeile der<br />

Netzdaten von Tabelle 6.1 dient als Skala zur Lokalisierung der Zeichenketten.<br />

In den Tabellen 6.3, 6.4, 6.5, 6.8, 6.9 und 6.11 wird durch Angabe der<br />

129<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


130 KAPITEL 6. FALLSTUDIEN<br />

OP1<br />

SlackGen<br />

P=2 MW<br />

Q=-2.21MVar<br />

1<br />

PQ-Last<br />

P=2MW<br />

Q=0MVar<br />

OP2<br />

Bus1<br />

1<br />

1.00 0.00 0<br />

1<br />

Z<br />

TP6<br />

Bus2<br />

2<br />

0.88 27.2 0<br />

Z<br />

TP7<br />

1 2<br />

Z<br />

TP8<br />

1 2<br />

1.00 57.3<br />

Bus3<br />

0<br />

2 1<br />

OP3<br />

PVGen<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

1<br />

Z<br />

TP9<br />

P= 5MW<br />

Q=-2.46MVar<br />

Abbildung 6.1: Netzwerk zu Fallstudien<br />

1.00 53.9<br />

Bus5<br />

0<br />

0.87<br />

OP5<br />

1<br />

PQ-Last<br />

P=0.6 MW<br />

Q=0MVar<br />

Bus4 OP4<br />

1<br />

PQ-Last<br />

P=0.4 MW<br />

Q=0MVar<br />

03/26/96 -- -------- 1.0 1997 W ---- 5 Bus Test Case<br />

BUS DATA FOLLOWS 5 ITEMS<br />

1 Bus 1 HV 2 1 3 1.000 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0<br />

1 Bus 2 HV 2 1 0 1.000 0.0 2.0 0.0 0.0 0.0 0.0 1.0 1.1 0.9 0.0 0.0 0<br />

3 Bus 3 HV 2 1 2 1.000 0.0 0.0 0.0 5.0 0.0 0.0 1.0 10.0 -10.0 0.0 0.0 3<br />

4 Bus 4 HV 2 1 0 1.000 0.0 0.4 0.0 0.0 0.0 0.0 1.0 1.2 0.8 0.0 0.0 0<br />

5 Bus 5 HV 2 1 0 1.000 0.0 0.6 0.0 0.0 0.0 0.0 1.0 1.2 0.8 0.0 0.0 0<br />

-999<br />

BRANCH DATA FOLLOWS<br />

1 2 1 1 1 0 0.0 0.1 0.0 0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0<br />

2 3 1 1 1 0 0.0 0.1 0.0 0 0 0 0 0 0.0 0.0 0.0 1.0 0.0 0.0 0.0<br />

2 4 1 1 1 0 0.0 0.1 0.0 0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0<br />

5 3 1 1 1 0 0.0 0.1 0.0 0 0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0<br />

-999 4 ITEMS<br />

INTERCHANGE DATA FOLLOWS 1 ITEMS<br />

1 2 Bus 2 HV 2.0 1.00 ------ ---- 5 Bus Test Case<br />

-9<br />

TIE LINES FOLLOWS 3 ITEMS<br />

2 1 1 2 1<br />

4 2 2 1 1<br />

3 1 5 2 1<br />

-999<br />

0 1 2 3 4 5 6 7 8 9 0 1 2 3<br />

1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890<br />

Tabelle 6.1: Netzdaten<br />

Start- und End-Position festgelegt, welche Zeichen als Daten für die einzelnen<br />

Fälle zu interpretieren sind.<br />

In der Tabelle 6.2 wird angegeben, in welche Ntor-Typen die Typen<br />

“BUS” und “BRANCH” des Tauschformates zu übersetzen sind.<br />

Die Tabelle 6.3 spezifiziert die Gemeinsamkeiten unter den Bus- und<br />

Zweigdatensätzen. Dies bezieht sich auf die Zeilen 3 bis 7, bzw. 10 bis<br />

13 von Tabelle 6.1. Man beachte, dass die Spezifikation der Positionen<br />

einzelner Datenfelder durch die Domänen-Architektur nicht festgelegt ist.<br />

Dieser Freiheitsgrad lässt sich ausnutzen, um eine einfachere Spezifikation<br />

und/oder Implementation der Adaption zu erzielen. Im Gegensatz zu den<br />

übrigen Spezifikationen, die mit Start- und Endpositionen arbeiten, werden<br />

Datenfelder in Tabelle 6.3 mit Hilfe von Feldlängen und Abständen<br />

zwischen Datenfeldern lokalisiert.<br />

24.2<br />

0


Datensatzname Typidentifikation Typname des<br />

Ntors<br />

BUS 0 PQLast<br />

BUS 1 PQGen<br />

BUS 2 PVGen<br />

BUS 3 SlackGen<br />

BRANCH 0 Z<br />

Tabelle 6.2: Korrespondenz-Tabelle<br />

Bus-Datensatz Zweig-Datensatz<br />

Start-Zeichen BUS BRANCH<br />

Stop-Zeichen -999 -999<br />

Anz. el. Anschlüsse 1 2<br />

Feldlänge 3 3<br />

Knotenbezeichnung<br />

Abstand zwischen 2 2<br />

Knotenbezeichnungen<br />

End-Position der 4 9<br />

Knotenbezeichnung<br />

Feldlänge der 1 0<br />

Typidentifikation<br />

Start-Position 25 19<br />

Typidentifikation<br />

Feldlänge 1 1<br />

Austauschgebiet<br />

Start-Position 19 11<br />

Austauschgebiet<br />

Tabelle 6.3: Gemeinsame Übersetzungsangaben<br />

Die netzweit geltenden Parameter von Tabelle 6.1 werden mit Hilfe der<br />

Angaben von Tabelle 6.4 spezifiziert.<br />

In den ersten drei Fällen wird mit bezogenen Grössen gearbeitet. Die<br />

gemeinsame Bezugsgrösse ist die Scheinleistung in Megawatt. Sie lässt<br />

sich mit den Angaben der Tabelle 6.4 aus den Netzdaten lesen. Im Netz<br />

kommt nur eine Bezugsspannung vor. Sie wird als 1 kV angenommen.<br />

Parameter Datentyp Start-Position End-Position<br />

Bezugs-Scheinleistung f 32 37<br />

(SB)<br />

Tabelle 6.4: Netzweit geltende Parameter<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

131


132 KAPITEL 6. FALLSTUDIEN<br />

6.1 Lastfluss in kartesischen Koordinaten<br />

Als Basisfall wird ein stationärer Wechselstrom-Lastfluss betrachtet. Es<br />

wird angenommen, dass es sich um ein symmetrisches Übertragungsnetz<br />

handelt. Die Unbekannten lassen sich daher als komplexe Grössen darstellen.<br />

Dies geschieht mit Variablen e und f für die kartesischen Koordinaten<br />

der Spannung e + j · f und ie und if für den Strom ie + j · if.DieseVariablen<br />

gelten bei allen elektrischen Anschlüssen der elektrischen Entitäten<br />

”SlackGen”, “PVGen”, “PQLast”, und “Z”. Diese Entitäten werden als<br />

Ntor-Typen realisiert und unter 6.1.1 beschrieben.<br />

Die Spannungsregelung des “PVGen” wird über einen zweiten elektrischen<br />

Anschluss realisiert. Zur Laufzeit wird dieser Anschluss mit demjenigen<br />

Kirchhoff-Knoten verbunden, der von den Netzdaten vorgegeben<br />

wird. Das Ntor formuliert dazu eine Gleichung mit den Spannungskomponenten<br />

dieses Anschlusses. Da ein elektrischer Anschluss in diesem<br />

Fall jedoch zwei Stromkomponenten enthält, müssen auch diese mit je einer<br />

Gleichung im Ntor-Typ “PVGen” einbezogen werden. Der elektrische<br />

Anschluss wird in diesem Fall als Sollwert-Eingang einer stromlosen Messung<br />

aufgefasst. Beide Komponenten des Stromes sind daher Null.<br />

6.1.1 Spezifikation der Ntor-Typen<br />

SlackGen (Slack-Generator für das ganze Netz):<br />

V = { e1, f1,ie1,if1,P,Q },T ={},P ={esl, fsl }<br />

E ={ e1−esl = 0, f1 − fsl=0,<br />

P−esl · ie1 − fsl·if1 =0,<br />

Q+esl · if1− fsl·Ie1 = 0 }<br />

Die Gleichungen stellen die Lastflussgleichungen dar, die in Kapitel 3<br />

mit Hilfe der Gleichungen (3.8) und (3.12) hergeleitet und in Tabelle 3.5<br />

zusammengefasst sind.<br />

Die Netzdaten im betrachteten Tauschformat liefern die Spannungen<br />

in polarer Darstellung (siehe Tabelle 6.5). Der Spannungswinkel wird in<br />

Grad vorgegeben. Die Gleichungen sollen aber in kartesischer Darstellung<br />

formuliert werden. Daher ist eine Umrechnung, wie in Tabelle 6.6 ersichtlich,<br />

zu spezifizieren.<br />

PQLast:<br />

V = { e1, f1,ie1,if1 },T ={},P ={P,Q }<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


6.1. LASTFLUSS IN KARTESISCHEN KOORDINATEN 133<br />

Ntor-Typ O-Parameter Datentyp Start-Position End-Position<br />

Slack Θo f 34 40<br />

Uo f 85 90<br />

PQLast PLo f 41 49<br />

QLo f 50 59<br />

PVGen PGo f 60 67<br />

Uo f 85 90<br />

Qmaxo f 91 98<br />

Qmino f 99 106<br />

RVCo s 124 127<br />

Z Ro f 20 29<br />

Xo f 30 40<br />

Tabelle 6.5: Parameter für die Ntor-Typen<br />

Ntor-Typ Parameter Konvertierungs-Funktion<br />

f(O-Parameter)<br />

Slack esl esl = Uo · cos( Θo·π<br />

180 )<br />

fsl fsl =Uo·sin( Θo·π<br />

180 )<br />

PQLast P P = PLo/SB<br />

Q Q = QLo/SB<br />

PVGen P P = −PGo/SB<br />

U<br />

Qmax<br />

U = Uo<br />

Qmax = Qmaxo /SB<br />

Qmin Qmin = Qmino /SB<br />

Z R R = Ro<br />

X X = Xo<br />

Tabelle 6.6: Konvertierungsfunktionen für die Ntor-Typen<br />

E = { ie1 − e1·P+f1·Q<br />

e1 2 +f1 2 = 0,if1− −e1·Q+P·f1<br />

e1 2 +f1 2 =0 }<br />

Für die Spezifikation des Verhaltens des Ntors “PQLast” werden die Parameter<br />

“P” (Wirkleistung) und Q (Blindleistung) als bezogenene Grössen<br />

(p.u.-Werte) benötigt. In der Tabelle 6.5 werden die O-Parameter PLo bzw.<br />

QLo aus den Netzdaten festgelegt und mit Hilfe der in Tabelle 6.6 angegebenen<br />

Beziehungen in bezogene Darstellung umgerechnet.<br />

PVGen (PV-Generator):<br />

Der “PVGen” ändert sein Verhalten von einem PV- zu einem PQ-Typ,<br />

da der “PVGen” nur eine begrenzte Blindleistung Q<br />

(z.B. ±10MVar) erzeugen kann, um die Spannung “V” konstant zu halten.<br />

Es sind drei verschiedene Zustände notwendig, um die verschiedenen<br />

Verhalten zu realisieren. Im Zustand 1 verhält sich das Ntor wie ein “PV-<br />

Knoten”, der auf S. 30 beschrieben ist. Wird der Bereich der erzeugbaren<br />

Blindleistung über- bzw. unterschritten, ändert sich das Verhalten des<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


134 KAPITEL 6. FALLSTUDIEN<br />

Ntors in dasjenige eines “PQ-Knotens”. Beim Überschreiten der Grenze,<br />

d.h. bei Q ≥ Qmax, geht das Ntor in den Zustand 2 über. Beim Unterschreiten<br />

der Grenze, d.h. bei Qmin ≥ Q, geht das Ntor in den Zustand 3<br />

über. Die Indizes der folgenden Mengen zeigen an, in welchem Zustand<br />

das spezifizierte Verhalten gilt. Die leeren Mengen T2 und T3 bedeuten,<br />

dass das Ntor unabhängig von der Blindleistung in den Zuständen 2 und 3<br />

bleibt.<br />

V1 = { e1, f1,ie1,if1,Q }<br />

P1 ={ P,U,Qmin,Qmax }<br />

E 1 = { ie1 − e1·P+f1·Q<br />

e1 2 +f1 2 = 0,if1− −e1·Q+P·f1<br />

e1 2 +f1 2<br />

U 2 −e 2 1 − f2 1<br />

=0 }<br />

T1 ={ Q−Qmax ≥ 0, ⇒ 2<br />

Qmin − Q ≥ 0, ⇒ 3}<br />

V2 = { e1, f1,ie1,if1, },T2 ={}<br />

P2 ={ P,Qmax }<br />

E 2 = { ie1 − e1·P+f1·Qmax<br />

e1 2 +f1 2<br />

V3 = { e1, f1,ie1,if1, },T3 ={}<br />

P3 ={ P,Qmin }<br />

E 3 = { ie1 − e1 P+f1·Qmin<br />

e1 2 +f1 2<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

=0<br />

= 0,if1− −e1·Qmax+P·f1<br />

e1 2 +f1 2<br />

= 0,if1− −e1·Qmin+P·f1<br />

e1 2 +f1 2<br />

= 0}<br />

= 0}<br />

Für die Spezifikation des Verhaltens des Ntors “PVGen” werden die Parameter<br />

P (Wirkleistung), Qmin (minimale Blindleistung) und Qmax als bezogenene<br />

Grössen (p.u.-Werte) benötigt. In der Tabelle 6.5 werden die<br />

O-Parameter aus den Netzdaten ausgewählt und mit Hilfe der in Tabelle<br />

6.6 angegebenen Beziehungen in bezogene Darstellung umgerechnet.<br />

Z (Impedanz): Die folgenden Angaben spezifizieren eine Längsimpedanz<br />

mit Z = R + j · X. V = { e1, f1,ie1,if1,e2,f2,ie2,if2 }<br />

P ={ R,X },T ={}<br />

Mit Hilfe der Kirchhoffschen Gleichungen und der Bildung von Real- (ℜ)<br />

und Imaginärteil (ℑ) lassen sich die Fehlerfunktionen angeben:<br />

e1+ jf1<br />

E = { ie1 − ℜ R+jX −e2+jf2<br />

<br />

R+jX =0, ie2 + ie1 = 0,<br />

<br />

e1+jf1<br />

if1−ℑ R+jX ,−e2+jf2<br />

<br />

R+jX =0, if2+if1 =0 }<br />

Für die Spezifikation des Verhaltens des Ntors “Z” werden die ParameterR(Längswiderstand)<br />

und X (Längsreaktanz) benötigt. In der Tabelle<br />

6.5 werden die O-Parameter aus den Netzdaten festgelegt und gemäss Tabelle<br />

6.6 den Parametern R und X zugewiesen. Man beachte, dass die


6.2. LASTFLUSS IN POLAREN SPANNUNGSKOORDINATEN 135<br />

Zuweisung von O-Parametern auf die Parameter immer über eine Konvertierungsfunktion,<br />

im einfachsten Fall durch den Faktor 1 erfolgt.<br />

6.1.2 Spezifikation der Summengeber-Typen<br />

Bus1...Bus5 sind die elektrischen Verbindungsstellen des Netzes. Sie werden<br />

mit Hilfe von Summengebern modelliert.<br />

Elektrische Verbindungsstelle:<br />

S = { EinzeiligeSumme(Basisname = ie),<br />

EinzeiligeSumme(Basisname = if),<br />

MehrzeiligeSumme(Basisname = e),<br />

MehrzeiligeSumme(Basisname = f ) }<br />

6.2 Lastfluss in polaren Spannungskoordinaten<br />

In diesem Fall wird der gleiche Wechselstrom-Lastfluss wie unter Kapitel<br />

6.1, jedoch mit polaren Koordinaten gerechnet. Für jeden elektrischen<br />

Anschluss gibt es für die komplexe Spannung U = U · e j·Θ die Variablen<br />

U und Θ. Beim Strom, der wiederum in der kartesischen Form ie + j · if<br />

dargestellt wird, sind es die Variablen ie und if.<br />

Man beachte, dass die Summengeber die Stromsummen nicht in polarer<br />

Form behandeln können, da nur lineare Terme mit dem Faktor 1 summierbar<br />

sind.<br />

6.2.1 Spezifikation der Ntor-Typen<br />

SlackGen (Slack-Generator für das ganze Netz):<br />

V = { U1,Θ1,ie1,if1,P,Q },T ={},P ={Usl,Θsl }<br />

E = { U1 −Usl = 0,Θ1 − Θsl = 0,<br />

P −Usl · cos(Θsl) · ie1 −Usl · sin(Θsl) · if1 =0,<br />

Q+Usl · cos(Θsl) · if1−Usl · sin(Θsl) · ie1 = 0 }<br />

Es werden grundsätzlich die gleichen O-Parameter wie beim kartesischen<br />

Lastfluss verwendet (siehe Tabelle 6.5). Hingegen gibt es, wie in Tabelle<br />

6.7 aufgezeigt, einfachere Konvertierungsfunktionen für die Parameter<br />

Usl und Θsl da die O-Parameter bereits eine polare Form des Ntor-Typs<br />

“Slack” aufweisen.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


136 KAPITEL 6. FALLSTUDIEN<br />

PQLast:<br />

Ntor-Typ Parameter Konvertierungs-Funktion<br />

f(O-Parameter)<br />

Slack Usl Usl = Uo<br />

Θsl<br />

Θsl = Θo·π<br />

180<br />

Tabelle 6.7: Konvertierungsfunktionen für die Ntor-Typen<br />

V = { U1,Θ1,ie1,if1 },T ={};,P ={P,Q }<br />

E ={ ie1 ·U1 − cos(Θ1) · P −U1 · sin(Θ1) · Q = 0,<br />

if1·U1+cos(Θ1) · Q − P · sin(Θ1)=0 }<br />

PVGen (PV-Generator):<br />

V1 = { U1,Θ1,ie1,if1,Q }<br />

P1 ={ P,U,Qmin,Qmax }<br />

E 1 = { ie1 ·U1 − cos(Θ1) · P − sin(Θ1) · Q = 0,<br />

if1·U1+cos(Θ1) · Q − P· sin(Θ1)=0<br />

U−U1=0 }<br />

T1 ={ Q−Qmax ≥ 0, ⇒ 2<br />

Qmin − Q ≥ 0, ⇒ 3}<br />

V2 = { U1,Θ1,ie1,if1 },T2 ={}<br />

P2 ={ P,Qmax }<br />

E 2 = { ie1 ·U1 − cos(Θ1) · P − sin(Θ1) · Qmax = 0,<br />

if1·U1+cos(Θ1) · Qmax − P · sin(Θ1)=0}<br />

V3 ={ U1,Θ1,ie1,if1, },T3 ={}<br />

P3 ={ P,Qmin }<br />

E 3 = { ie1 ·U1 − cos(Θ1) · P − sin(Θ1) · Qmin = 0,<br />

if1·U1+cos(Θ1) · Qmin − P · sin(Θ1)=0}<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


6.3. WECHSELSTROM-LASTFLUSS MIT AUSTAUSCHGEBIET 137<br />

Z (Impedanz):<br />

V = { U1,Θ1,ie1,if1,U2,Θ2,ie2,if2 }<br />

P ={ R,X },T ={}<br />

E ={ ie1 − ℜ<br />

ie2 + ie1 = 0,<br />

if1−ℑ<br />

U1·cos(Θ1)+ j·U1·sin(Θ1)<br />

R+ j·X<br />

U1·cos(Θ1)+ j·U1·sin(Θ1)<br />

R+ j·X<br />

if2+if1 =0 }<br />

6.2.2 Spezifikation der Summengeber-Typen<br />

− U2·cos(Θ2)+<br />

<br />

j·U2·sin(Θ1)<br />

R+ j·X = 0,<br />

− U2·cos(Θ2)+<br />

<br />

j·U2·sin(Θ1)<br />

R+ j·X = 0,<br />

Die elektrischen Verbindungsstellen Bus1...Bus5 werden mit Hilfe von<br />

Summengebern modelliert: Elektrische Verbindungsstelle (Kirchhoff)<br />

:<br />

S = { EinzeiligeSumme(Basisname = ie),<br />

EinzeiligeSumme(Basisname = if),<br />

MehrzeiligeSumme(Basisname = U),<br />

MehrzeiligeSumme(Basisname = Θ) }<br />

6.3 Wechselstrom-Lastfluss mit Austauschgebiet<br />

Das unter Kapitel 6.1 beschriebene Lastfluss-Problem wird in diesem Fall<br />

erweitert. Als zusätzliche Bedingung kommt eine Bilanz von Wirkleistungen<br />

innerhalb eines bestimmten Netzbereiches hinzu. Ein solcher Netzbereich<br />

wird als Austauschgebiet bezeichnet. In Abbildung 6.2 ist ein<br />

Austauschgebiet eingezeichnet. Besondere Bedeutung haben darin Verbindungen,<br />

welche die Grenze des Austauschgebietes schneiden. Es sind<br />

die Verbindungen, über die Wirkleistung mit dem restlichen Netz ausgetauscht<br />

wird. Im Beispiel soll in das Austauschgebiet eine Wirkleistung<br />

von 2MW importiert werden. Dies lässt sich durch die Gleichung (6.1)<br />

ausdrücken:<br />

PTP61<br />

+PTP82 +PTP91 −2=0 (6.1)<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


138 KAPITEL 6. FALLSTUDIEN<br />

OP1<br />

SlackGen<br />

P=-5.0 MW<br />

Q=-0.46MVAr<br />

1<br />

PQLoad<br />

P=2MW<br />

Q=0MVar<br />

OP2<br />

Bus1<br />

1<br />

1.00 0.00 0<br />

Σ<br />

PTP6<br />

1<br />

3.0 MW<br />

Pk<br />

> 0:<br />

i<br />

Import in das<br />

Austauschgebiet<br />

1<br />

1.00 8.64<br />

Bus3<br />

0<br />

Austauschgebiet<br />

Bus2<br />

Z<br />

TP6<br />

1.00<br />

2<br />

-17<br />

PImport<br />

0<br />

Z<br />

TP7<br />

1 2<br />

Z<br />

TP8<br />

= 2 MW<br />

1 2<br />

OP10<br />

AreaSlackGen<br />

1<br />

P=7.0 MW<br />

Q=-1.5 MVAr<br />

2 1<br />

OP3<br />

PVGen<br />

1<br />

P= 5MW<br />

Q=-1.06MVAr<br />

0<br />

1.00 -19.8<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

Z<br />

TP9<br />

Abbildung 6.2: Netzwerk mit Austauschgebiet<br />

U<br />

Austauschgebiet c<br />

P<br />

Σ<br />

1.00 5.2 0<br />

P Bus5<br />

TP9 1<br />

OP5<br />

-0.6 MW<br />

1<br />

PQLoad<br />

P=0.6MW<br />

Q=0MVar<br />

Ntor an Gebiets-<br />

KH<br />

grenze k<br />

i<br />

KH<br />

Ik<br />

i<br />

P k i<br />

k<br />

i<br />

i<br />

Bus4 OP4<br />

P<br />

TP8 2<br />

-0.4 MW<br />

1<br />

PQLoad<br />

P=0.4MW<br />

Q=0MVar<br />

Abbildung 6.3: Vorzeichenfestlegung bei ausgetauschter Wirkleistungen<br />

Σ


6.3. WECHSELSTROM-LASTFLUSS MIT AUSTAUSCHGEBIET 139<br />

6.3.1 Modellierung eines Austauschgebietes<br />

Jedes Ntor k mit mindestens zwei elektrischen Anschlüssen benötigt für<br />

den an einer Grenze liegenden Ntor-Anschluss mit der Nummer i einen<br />

Anschluss auf die Wirkleistung Pki .<br />

Bei kartesischen Koordinaten ist die Wirkleistung:<br />

Pki = ℜ((eki + jfki )(ieki + j · ifki )∗ ) (6.2)<br />

Aus dem Netzbestand lässt sich die Nummer i des an der geographischen<br />

Grenze liegenden Anschlusses eines Ntors k herausfinden. Dies geschieht<br />

mit der Funktion A(k, c). Diese Funktion gibt die Nummer i des Anschlusses<br />

eines Ntors k zurück, das am inneren Rande eines Austauschgebietes c<br />

liegt.<br />

Für ein Austauschgebiet c mit n an der geographischen Grenze liegender<br />

Ntore ist die importierte Leistung:<br />

PImportec =<br />

n<br />

∑ PkA(k,c)<br />

k=1<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

(6.3)<br />

Diese zusätzliche Gleichung muss natürlich durch eine zusätzliche Variable<br />

ausgeglichen werden, damit die Anzahl von Gleichungen und Variablen<br />

im gesamten Gleichungssystem übereinstimmt. Die zusätzliche Variable<br />

wird einem Betriebsmittel, dem Ntor-Typ “SlackArea”, zugeordnet.<br />

Die Variable P des “SlackArea” stellt sich im Zuge der Rechnung so ein,<br />

dass die geforderte importierte Wirkleistung erbracht wird.<br />

6.3.2 Spezifikation der Ntor-Typen<br />

SlackArea (Slack-Generator für Austausch-Gebiet):<br />

V = { e1, f1,ie1,if1,P,Q },T ={}<br />

P ={ U }<br />

E ={ ie1 − e1 P+f1 Q<br />

e1 2 +f1 2 = 0,if1− −e1Q+Pf1<br />

e1 2 +f1 2<br />

U 2 −e 2 1 − f2 1<br />

=0 }<br />

=0,<br />

Der SlackArea-Generator benötigt keine Übersetzungs-Daten. Es wird<br />

angenommen, dass er stets einem Knoten innerhalb eines Austauschgebietes<br />

zugeordnet werden kann, z.B. dem grössten Wirkleistungsproduzenten.<br />

An den Grenzen des Austauschgebietes sind in Abbildung 6.2 Instanzen<br />

des Ntor-Typs “Z” eingesetzt. Damit dieser Ntor-Typ in der Wirkleistungsbilanz<br />

von Gleichung (6.1) beteiligt werden kann, muss er die Wirkleistungen<br />

P1 und P2 als Variable zur Verfügung stellen:


140 KAPITEL 6. FALLSTUDIEN<br />

Z (Impedanz):<br />

V = { e1, f1,ie1,if1,e2,f2,ie2,if2,P1,P2 }<br />

P ={ R,X },T ={}<br />

<br />

E ={ ie1 − ℜ<br />

if1−ℑ<br />

ie2 + ie1 = 0,<br />

if2+if1 =0,<br />

<br />

e1+ jf1<br />

R+jX −e2+jf2<br />

R+jX<br />

<br />

e1+jf1<br />

R+jX −e2+jf2<br />

R+jX<br />

=0,<br />

<br />

=0,<br />

P1−ℜ((e1 + jf1)(ie1 + jif1) ∗ )=0,<br />

P2−ℜ((e2 + jf2)(ie2 + jif2) ∗ )=0 }<br />

Die Zugehörigkeit zu Austauschgebieten fehlt in den “BRANCH”-Datensätzen<br />

des Austauschformates [23]. Die Angaben werden in den Datensätzen<br />

ergänzt, die in der Tabelle 6.1 mit “Tie-Lines” bezeichnet sind.<br />

Die Tabelle 6.8 spezifiziert aus den “Tie-Line”-Datensätze Parameter, aus<br />

denen der Dienst Netzaufbau alle n an der geographischen Grenze des Austauschgebietes<br />

liegenden Ntore und ihre Anschluss-Nummern i herausfindet.<br />

Der Eintrag 1 : 1 in den Tabellen 6.8 und 6.9 unter der Spalte “Konvertierungsfunktion”<br />

bedeutet, dass es pro O-Parameter genau ein zugehöriger<br />

Parameter mit dem gleichen Namen gibt. Der Wert wird unverändert vom<br />

O-Parameter auf den Parameter übertragen.<br />

O-Parameter Datentyp Start- End- Konvertierungs-<br />

Position Position Funktion<br />

Bus-Nummer am s 1 4 1:1<br />

“Meter”-Anschluss<br />

Nummer des d 7 8 1:1<br />

Austauschgebietes beim<br />

“Meter”-Anschluss<br />

Bus-Nummer am s 11 14 1:1<br />

“Non-Meter”-Anschluss<br />

Nummer des d 17 18 1:1<br />

Austauschgebietes beim<br />

“Non-Meter”-Anschluss<br />

Tabelle 6.8: Parameter für Grenzleitungen<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


6.4. LINEARE NETZBERECHNUNG 141<br />

6.3.3 Spezifikation der Summengeber-Typen<br />

Der Kirchhoff-Knoten ist wie in Kapitel 6.1 modelliert. Die Summengleichung<br />

(6.3) für das Austauschgebiet wird mit Hilfe eines Summengebers<br />

realisiert. Dieser wird als einzeilige Summe parametriert, wie dies in Gleichung<br />

(3.20) beschrieben ist. Da die Formen der Gleichungen (3.20) und<br />

(6.3) unterschiedlich sind, ist der Parameter par der einzeiligen Summe<br />

mit der negativen importierten Wirkleistung als PImport zu identifizieren.<br />

Die dazu notwendige Multiplikation mit -1 wird in der Konvertierungsfunktion<br />

von Tabelle 6.10 bewerkstelligt. Ferner geschieht hier der Übergang<br />

auf die bezogene Grösse, indem der Wert noch durch die Bezugsscheinleistung<br />

SB dividiert wird.<br />

Austauschgebiet für Wirkleistung:<br />

S = { EinzeiligeSumme( Basisname = P ,<br />

par = PImport) }<br />

Mit den Angaben von Tabelle 6.9 werden Netzdaten ausgefiltert, die<br />

zur Instantiierung des Summengebers benötigt werden. Dies ist PImport,<br />

die Nummer des Austauschgebietes c und die Nummer des Knotens, an<br />

welchem ein Ntor vom Typ “SlackArea” anzuschliessen ist.<br />

O-Parameter Datentyp Start- End- Konvertierungs-<br />

Position Position Funktion<br />

Nummer des d 1 2 1:1<br />

Austauschgebietes<br />

Bus-Nummer des d 4 7 1:1<br />

SlackArea<br />

PExport f 21 28 siehe Tabelle 6.10<br />

Tabelle 6.9: Parameter für das Austauschgebiet<br />

Parameter Konvertierungs-Funktion<br />

des Summengebers f(O-Parameter)<br />

PImport<br />

PImport = PExport<br />

SB<br />

Tabelle 6.10: Konvertierungsfunktionen für das Austauschgebiet<br />

6.4 Lineare Netzberechnung<br />

In diesem Fall wird eine Kurzschluss-Rechnung in einem dreiphasigen<br />

Übertragungsnetz mit den Phasen R,S und T skizziert. Da bei dieser<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


142 KAPITEL 6. FALLSTUDIEN<br />

OP1<br />

Quelle<br />

Last<br />

OP2<br />

Bus1<br />

1<br />

1<br />

1<br />

Z<br />

TP6<br />

Bus2<br />

2<br />

Z<br />

TP7<br />

1 2<br />

Z<br />

TP8<br />

1 2<br />

Bus3<br />

TP9 1 2<br />

Kurzschluss<br />

2 1<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

1<br />

Z<br />

OP3<br />

Quelle<br />

Abbildung 6.4: Netzwerk mit Kurzschluss<br />

Bus5<br />

Bus4 OP4<br />

1<br />

Last<br />

OP5<br />

1<br />

Last<br />

Kurzschluss-Rechnung keinerlei Leistungsvorgaben in den Ntoren auftreten,<br />

wird das gesamte Gleichungssystemg(x,p)=0 rein linear. Dies ist ein<br />

Spezialfall, den die Domänen-Architektur ebenfalls abdeckt. Es wird wieder<br />

vom Netz der Abbildung 6.1 ausgegangen. Dieses Netz muss jetzt so<br />

verallgemeinert verstanden werden, dass jede gezeichnete Verbindung drei<br />

gekoppelten Phasen R, S und T entspricht. Zwischen dem Ntor “TP9” und<br />

“Bus5” tritt jedoch, wie in Abbildung 6.4 eingezeichnet, ein Kurzschluss<br />

zwischen den Phasen S und T auf.<br />

Da sich dieser Fall nicht direkt aus Daten im Tauschformat [23] aufbauen<br />

lässt, werden in Abbildung 6.4 keine Zahlenwerte vorgegeben. Die<br />

folgende Modellierung beschränkt sich daher auf das Verhalten von charakteristischen<br />

Ntor-Typen.<br />

Bei dieser Simulation ist man an den stationären Strömen sowie dem<br />

Kurzschlussstrom ieKS + j ·ifKS (siehe Abbildung 6.6) im Netz interessiert.<br />

Die Unbekannten lassen sich daher als komplexe Grössen darstellen.<br />

Bei kartesischen Koordinaten ist die Menge der Variablen für jeden elek-<br />

trischen Anschluss i:<br />

Vi = {eRi ,eSi ,eTi , fRi , fSi , fTi ,ieRi ,ieSi ,ieTi ,ifRi ,ifSi ,ifTi }<br />

Diese Variablen gelten bei allen elektrischen Anschlüssen der elektrischen<br />

Entitäten Quelle, Last, Z und Kurzschluss.<br />

Z (3-phasige Leitung mit gekoppelten Phasen):<br />

In Abbildung 6.5 ist das Ersatzschaltbild mit allen Grössen der Phase R sowie<br />

die induktiven Kopplungen M der anderen Phasenströme eingetragen.<br />

Daraus lässt sich folgendes Ntor-Verhalten ableiten, wobei ω die Kreisfrequenz<br />

bezeichnet:<br />

V = { V1, V2 } , T = {}<br />

P ={ RR,RS,RT,XR,XS,XT,ω,MRS,MRT,MST }


6.4. LINEARE NETZBERECHNUNG 143<br />

R<br />

S<br />

T<br />

R<br />

S<br />

T<br />

e ie R R + j X<br />

R1 + j f R1 R1 + j ifR1 R ie R2 + j ifR2<br />

e R2 + j fR2<br />

1<br />

M<br />

2<br />

M<br />

RT<br />

RS<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

M ST<br />

Abbildung 6.5: Ersatzschaltung für Ntor-Typ “Z”<br />

e R1 + j f R1 ieR1 + j ifR1 ie R2 + j ifR2<br />

e R2 + j f R2<br />

1<br />

ieKS + j if KS<br />

Abbildung 6.6: Ersatzschaltung für Ntor-Typ “Kurzschluss zwischen Phasen R und T”<br />

E = { −eR1 +ieR1 · RR − ifR1 ·XR−<br />

ω·MRS · ifS1−ω·MRT · ifT1 +eR2 =0,<br />

−fR1 +ieR1 · XR + ifR1 ·RR+<br />

ω·MRS · ieS1 + ω · MRT · ifT1 + fR2 =0,<br />

ieR1 + ieR2 = 0, ifR1 +ifR2 =0,<br />

für die Phasen S und T entsprechend}<br />

Die Ntor-Typen “Quelle” und “Last” lassen sich in gleicher Art modellieren.<br />

Die Fehlerstelle wird ebenfalls als Ntor mit zwei Anschlüssen modelliert:<br />

Kurzschluss (Fehler zwischen Phasen S und T):<br />

In Abbildung 6.6 ist das Ersatzschaltbild der Fehlerstelle mit den Grössen<br />

der Phase R eingetragen. Die Phasen S und T sind analog bezeichnet. Man<br />

beachte, dass es sich um ein Ntor mit einem Kurzschluss-Element handelt,<br />

bei dem alle Impedanzen echt Null sind. Daher lässt sich folgendes Ntor-<br />

Verhalten ableiten:<br />

V = { V1, V2 ,ieKS ,ifKS } ,T = {}<br />

P ={ }<br />

2


144 KAPITEL 6. FALLSTUDIEN<br />

E = { ieR1 + ieR2 = 0,ifR1 +ifR2 =0,<br />

ieS1 + ieS2 + ieT1 + ieT2 = 0,ifS1 +ifS2 +ifT1 +ifT2 =0,<br />

ieS1 + ieS2 − ieKS = 0,ifS1 +ifS2−ifKS = 0,<br />

eR1−eR2 = 0,eS1 −eS2 = 0,eS1 −eT1 = 0,<br />

eT1 −eT2 = 0,<br />

fR1 − fR2 = 0, fS1 − fS2 = 0, fS1 − fT1 = 0,<br />

fT1 − fT2 = 0}<br />

Damit dieser Fall aus den Netzdaten des Tauschformates [23] aufgebaut<br />

werden könnte, müssten die Parametern des Mit- und Nullsystems der Elemente<br />

“Quelle”, “Last” und “Z” spezifiziert werden.<br />

6.5 DC-Lastfluss<br />

In zahlreichen Fällen ist man für erste Abschätzungen an Näherungslösungen<br />

des Lastflussproblems interessiert. Der DC-Lastfluss ist eine vereinfachte<br />

Modellierung bei der an allen Knoten i die Wirkleistungen Pi vorgegeben<br />

sind. Daraus werden die Spannungswinkel Θi näherungsweise berechnet.<br />

Dabei nützt man die physikalische Tatsache aus, dass Wirk- und<br />

Blindleistungsbeziehungen relativ schwach gekoppelt sind. Ferner werden<br />

folgende Annahmen getroffen:<br />

1. Die Spannungsbeträge Ui in den Knoten i werden netzweit vorgegeben.<br />

Ein typischer Wert ist der Spannungsbetrag des Slack-Knotens,<br />

d.h. 1 (p.u.).<br />

2. Die Leitungsimpedanzen sind rein imaginär, d.h. Z = j ·X. Ferner ist<br />

der Blindleistungsfluss am Leitungsanfang und -ende gleich gross.<br />

3. Netzelemente, bei denen der Blindleistungsfluss am Leitungsanfang<br />

und -ende nicht gleich gross ist, wie z.B. Kompensationsdrosseln etc.,<br />

werden weggelassen.<br />

Bei der Modellierung mit Ntoren kann daher jedem elektrischen Anschluss<br />

eine Variable mit der Bedeutung der Wirkleistung P, des Spannungswinkels<br />

Θ und des Spannungsbetrags U zugeordnet werden. Das<br />

IEEE Common Format sieht für den Längszweig keine Knotenspannungswerte<br />

vor. Das Modell des Längszweiges benötigt aber zwei Spannungswerte.<br />

In der hier aufgezeigten Lösung werden die Spannungswerte über<br />

die elektrischen Anschlüsse mit der Variablen U in die Längszweige übermittelt.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


6.5. DC-LASTFLUSS 145<br />

Die Verbindung zwischen den Ntoren wird in diesem Fall durch die<br />

Potentialvariablen Θ und U sowie durch die Flussvariable P ausgedrückt.<br />

6.5.1 Spezifikation der Ntor-Typen<br />

SlackGen (Slack-Generator für das ganze Netz):<br />

V = { U1,P1,Θ1 } , T = {},P ={Θsl,Usl }<br />

Ntor-Typ O-Parameter Datentyp Start-Position End-Position<br />

Slack Θo f 34 40<br />

Uo f 85 90<br />

PLast PLo f 41 49<br />

PGen PGo f 41 49<br />

Z Xo f 30 40<br />

Tabelle 6.11: Parameter für die Ntor-Typen<br />

Ntor-Typ Parameter Konvertierungs-Funktion<br />

f(O-Parameter)<br />

Slack Usl Usl = Uo<br />

Θsl<br />

Θsl = Θo·π<br />

180<br />

PLast P P = PLo/SB<br />

PGen P P = PGo/SB<br />

Z X X = Xo<br />

Tabelle 6.12: Konvertierungsfunktionen für die Ntor-Typen<br />

Der Slack-Generator ist das Nport, an dem der netzweit gültige Spannungswert<br />

über den Parameter Usl vorgegeben wird. Dieser Parameter<br />

wird aus dem O-Parameter Uo vom Tauschformat übertragen (siehe Tabelle.<br />

6.11 und 6.12).<br />

E = { Θ1 − Θsl = 0,U1 −Usl = 0 }<br />

PLast:<br />

V = { U1,P1,Θ1 } , T = {};,P ={P }<br />

E ={ P1−P=0 }<br />

PGen: Beim DC-Lastfluss ist der Spannungsbetrag netzweit an allen Knoten<br />

gleich gross. Daher sind alle Generatoren, ausser dem einen Slack-<br />

Generator, der den netzweit einheitlichen Spannungsbetrag vorgibt, P-Generatoren.<br />

Das Verhalten ist gleich wie bei der PLast, hingegen wird der O-Parameter<br />

PGo des Tauschformats verwendet.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


146 KAPITEL 6. FALLSTUDIEN<br />

Z (Impedanz):<br />

V = { U1,Θ1,U2,Θ2,P1,P2 },<br />

P = { X }, T = {}<br />

E ={ P1−U1·U2·sin(Θ1 − Θ2)/X = 0,<br />

P1 + P2 = 0, U1 −U2 = 0 }<br />

Die Modellierung lässt sich weiter vereinfachen, wenn man voraussetzt,<br />

dass Θ1 − Θ2 klein ist. Dann kann in einem approximativen DC-Lastfluss<br />

die Längsimpedanz durch die Gleichungsmenge<br />

E = { P1 −U1 ·U2 · (Θ1 − Θ2)/X = 0,<br />

P1 + P2 = 0, U1 −U2 = 0 }<br />

6.5.2 Spezifikation der Summengeber-Typen<br />

modelliert werden.<br />

Die elektrischen Verbindungspunkte Bus1...Bus5 werden mit Hilfe von<br />

Summengebern modelliert. Man beachte, dass anstelle der kirchhoffschen<br />

Strombilanz pro Verbindungspunkt i eine Leistungsbilanz<br />

∑<br />

m∈A<br />

Pim = 0 ( A : alle verbundenen Ntore) (6.4)<br />

formuliert wird.<br />

Elektrische Verbindungsstelle:<br />

S = { EinzeiligeSumme(Basisname = P),<br />

MehrzeiligeSumme(Basisname = U),<br />

MehrzeiligeSumme(Basisname = Θ) }<br />

6.6 Resultate<br />

Abschliessend werden einige Resultate aufgezeigt, die dokumentieren, dass<br />

der in dieser Arbeit vorgeschlagene Ansatz zu hoher Qualität und Produktivität<br />

sowie Erweiterbarkeit und Modularisierbarkeit beiträgt.<br />

6.6.1 Herstellung des Simulationsprogramms<br />

In Tabelle 6.13 wird dargestellt, wie sich der gesamte Code für die Simulation<br />

der einzelnen Fälle zusammensetzt. Davon ausgenommen ist<br />

jedoch der Code, der in den benutzten Bibliotheken (UMFPACK [29],<br />

HARWELL , LEDA [30] und Standard-Bibliotheken) verwendet wird. Die<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


6.6. RESULTATE 147<br />

Fall Maple V C++ Kompilations-<br />

Spezifikation Adaption Ntore Summengeber Netz zeit in Sek.<br />

6.1 245 1033 1100 39 345 17.4<br />

6.2 238 1033 1017 39 337 17.0<br />

6.3 322 1130 1371 74 437 18.2<br />

• 637 1130 4748 74 705 41.7<br />

6.5 216 1033 534 37 315 15.6<br />

Tabelle 6.13: Anzahl Codezeilen und Kompilationszeit<br />

Code-Mengen werden in Anzahl Zeilen angegeben, wobei Leer- und reine<br />

Kommentarzeilen nicht gezählt werden.<br />

Fallweise neu zu schreiben ist der Code unter der Spalte “Spezifikation”.<br />

Dies ist aber nur ein Bruchteil der erzeugten, und ohne diesen Ansatz<br />

von Hand zu erstellenden Code-Menge. Dank diesem Ansatz lässt sich<br />

Entwicklungszeit einsparen und damit die Produktivität fördern. Der Umfang<br />

des Codes unter der Spalte “Adaption” hängt davon ab, wieviele Datensätze<br />

des Tauschformates für die einzelnen Fälle zu interpretieren sind.<br />

Der Quelltext für das “Framework” umfasst bei allen Fällen 1370 Zeilen.<br />

Der innerhalb der Domänen-Architektur erzeugte Code steht in den<br />

Spalten “Ntore”, “Summengeber” und “Netz”. Unter “Netz” ist die erzeugte<br />

Methode der Klasse “Netz” gemeint, welche das Netz aus dem<br />

Tauschformat [23] aufbaut.<br />

Der in Tabelle 6.13 mit • bezeichnete Fall umfasst neben der Modellierung<br />

des Austauschgebietes weitere Ntor-Typen, wie Π-Leitungsmodell<br />

und mehrere Transformator-Typen, die zur Modellierung der grösseren<br />

Netze von Tabelle 6.15 benutzt werden.<br />

Die Kompilationszeit 1 ist die Zeitspanne, die das System 2 zur Erzeugung<br />

eines ablauffähigen Programmes benötigt. <strong>Eine</strong> kleine Kompilationszeit<br />

begünstigt die Produktivität beim Entwickeln neuer Applikationen.<br />

6.6.2 CPU-Zeiten und Speicherbedarf<br />

Die Ausführungszeiten und der Speicherbedarf 3 sind für den Endbenutzer<br />

der Simulationsprogramme ausschlaggebend und in den Tabellen 6.14 und<br />

6.15 dargestellt. Auffällig ist die etwa konstante Zunahme der Rechenzeit<br />

mit der Netzgrösse, die durch die Anzahl der Kirchhoff-Knoten angegeben<br />

1UNIX-Werkzeug “timex”, Angabe der user-Zeit<br />

2SUN Ultra1 SPARC, 64 MByte RAM, Solaris 2.5<br />

3UNIX-Werkzeug “top”, Size-Angabe: 1K entspricht dem 1024-fachen Speicherbedarf des C++-<br />

Datentyps “char”<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


148 KAPITEL 6. FALLSTUDIEN<br />

wird. Diese Zunahme liegt im Bereich von 2 bis 5 msec pro Variable. Rund<br />

ein Drittel der Rechenzeit wird dabei für die Speicherallokation während<br />

des Netzaufbaus verbraucht.<br />

Die Fälle unter 6.1 bis 6.3 konvergieren in 4 Iterationen innerhalb einer<br />

Schranke von einem Tausendstel. Der DC-Lastfluss konvergiert bei exakter<br />

Modellierung der Zweigflüsse (Wirkleistungen) in 2 Iterationen, bei<br />

approximierter Modellierung in einer Iteration.<br />

Fall max. End- Anzahl CPU-Zeit Speicherbedarf<br />

Mismatch Variable in Sek.<br />

6.1 6.52355 · 10 −6 59 0.15 1808K<br />

6.2 1.74644 · 10 −5 59 0.14 1808K<br />

6.3 8.99662 · 10 −4 73 0.16 1824K<br />

6.5 5.2 · 10 −4 39 0.11 1786K<br />

Tabelle 6.14: Merkmale des Lösungsprozesses bei gleichem Netz<br />

Netz- max. End- Anzahl Anzahl CPU-Zeit Speichergrösse<br />

Mismatch Variable Nichtnullen in Sek. bedarf<br />

5 8.99662 · 10 −4 73 209 0.16 1824K<br />

14 1.40633 · 10 −6 290 1002 0.4 2088K<br />

57 7.9301 · 10 −8 1060 3690 1.22 2640K<br />

118 3.96988 · 10 −7 2599 9287 3.04 3704K<br />

2550 6.85541 · 10 −6 45605 162814 235.28 33M<br />

Tabelle 6.15: Merkmale des Lösungsprozesses bei gleicher Modellierung<br />

In Tabelle 6.15 werden CPU-Zeiten und Speicherbedarf bei verschiedenen<br />

Netzen aber gleicher Modellierung (kartesisch) dargestellt, wobei<br />

die Kompilation (g++) ohne Optimierung ausgeführt ist. Mit Optimierung<br />

vermindert sich die Ausführungszeit beim 2550-Knoten Netz um 16<br />

%. Andererseits erhöht sich dadurch die Kompilationszeit um 18 %. Die<br />

Ausführungszeit ist jedoch, verglichen mit einem “konventionellem” Lastflussprogramm,<br />

bei welchem der Code mit dem Werkzeug ADIFOR 4 erstellt<br />

wird, wesentlich langsamer. Dieses benötigt für das gleiche 2550-<br />

Knoten Netz nur 23 Sekunden, bei einem Speicherbedarf von 27 M. Da<br />

dieses Programm eine Knoten-Zweig-basierte Modellierung benutzt, braucht<br />

es, wie in Kapitel 3.1.5 dargestellt, wesentlich weniger Variable (5626) für<br />

4Werkzeug zur automatischen Differenzierung von Fortran 77 Programmcode, Version 2.0, Christian<br />

Bischof<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


6.6. RESULTATE 149<br />

das gleiche Netz. Das Verhältnis zwischen der Rechenzeit und der Anzahl<br />

Variablen beträgt rund 4 msec pro Variable, und entspricht, wie in Tabelle<br />

6.15 ersichtlich, den beim Ntor-Prototypen gemessenen Zeiten.<br />

Ein Indiz für die Qualität des erzeugten Codes ist, dass die berechneten<br />

Werte trotz unterschiedlicher Modellierung (siehe Fälle 6.1 und 6.2)<br />

innerhalb der benutzten Kommastellen identisch sind. Diese Werte sind in<br />

Abbildung 6.1 eingerahmt eingetragen. Auch die im Fall 6.5 berechneten<br />

Näherungswerte der Spannungswinkel sind, wie in Tabelle 6.16 gezeigt,<br />

vergleichbar.<br />

Bus-Nr ΘDC−Last f luss ΘDC−Last f luss ΘAC−Last f luss<br />

exakt approx. kart./ polar<br />

1 0 0 0<br />

2 23.6 22.9 27.2<br />

3 49.7 48.1 57.3<br />

4 21.3 20.6 24.2<br />

5 46.2 44.7 53.9<br />

Tabelle 6.16: Vergleich Spannungswinkel<br />

6.6.3 Charakteristik der Software-Entwicklung<br />

Die Domänen-Architektur unterstützt die Modularisierbarkeit der Software-Entwicklung<br />

auf verschiedenen Stufen. Im Beispiel des DC-<br />

Lastflusses (siehe Kap. 6.5) geschieht dies auf der Stufe einzelner Ntor-<br />

Typen. Durch den Austausch einer Gleichung im Ntor-Typ “Z” werden<br />

die beiden Lastflussvarianten “DC-Exakt” und “DC-Approximativ”<br />

erzeugt. <strong>Eine</strong> weitere Stufe der Modularität bildet jeweils ein Satz von<br />

Summengeber- und Ntor-Typen. Die Bausteine eines Satzes zeichnen sich<br />

dadurch aus, dass sie die gleiche Schnittstelle haben. Diese wird durch eine<br />

netzweit spezifizierbare Menge von Variablen vorgegeben. In den Kapiteln<br />

6.1, 6.2 und 6.5 sind solche Sätze dargestellt, um die verschiedenen<br />

Lastflussvarianten “kartesisch”, “polar” und “DC” zu formulieren.<br />

Ein weiterer Qualitätsfaktor einer wiederverwendbaren Software ist<br />

gemäss Bertrand Meyer [18] deren einfache Erweiterbarkeit. In Kapitel 6.3<br />

wird der Lastfluss erweitert, um eine Wirkleistungsbilanz in Austauschgebieten<br />

hinzuzufügen. Die dazu notwendigen Änderungen beschränken<br />

sich auf die Spezifikations- und Adaptionsebene innerhalb der Domänen-<br />

Architektur.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


150 KAPITEL 6. FALLSTUDIEN<br />

In der Adaptionsebene ist dies, wie in Tabelle 6.13 ersichtlich, durch<br />

97 zusätzliche Codezeilen realisiert. Diese erweitern den Dienst Netzaufbau,<br />

damit die Datensätze für Austauschgebiete und Verbindungsleitungen<br />

(siehe Anhang B) interpretiert werden können. Die zugehörige Spezifikationserweiterung<br />

ist in den Tabellen 6.9 und 6.10 angegeben. In den Ntor-<br />

Spezifikationen werden lediglich die zu bilanzierenden Wirkleistungsvariablen<br />

hinzugefügt.<br />

Dank den Festlegungen der Domänen-Architektur werden die Erweiterungen<br />

in den Elementen “Spezifikation” und “Adaption” konzentriert und<br />

damit verhindert, dass eine Kettenreaktion von Änderungen im ganzen Simulationsprogramm<br />

zu bewältigen ist.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Kapitel 7<br />

Schlussbetrachtung<br />

7.1 Zusammenfassung<br />

Viele Applikationen im Bereich der elektrischen Energieübertragung führen<br />

auf ein System von simultanen, nichtlinearen Gleichungen<br />

g(x,p)=0(x: Unbekannte, p: Parameter), die nach den Unbekannten x<br />

aufzulösen sind. Diese Gleichungen beschreiben das nichtlineare Verhalten<br />

miteinander verbundener Entitäten.<br />

Dies ist kein neues Problem. Der Beitrag der vorliegenden Arbeit besteht<br />

jedoch darin, für diese Klasse von Problemen mit Mitteln des Software-<br />

Engineerings und neuen Erkenntnissen aus der Netzmodellierung eine wiederverwendbare<br />

Lösung zu beschreiben. Dazu sind verschiedene Ansätze<br />

in einem Prototypen neu kombiniert worden. Der Prototyp besteht aus<br />

einer Software-Komponente (ein objekt-orientiertes Framework) und einer<br />

dazu passenden Domänen-Architektur. Innerhalb dieser Domänen-<br />

Architektur erfolgt die Anpassung des Frameworks, das die grundlegenden<br />

Dienste erbringt, die in Netz-Simulationen vorkommen, wie Netzaufbau,<br />

Netzberechnung (d.h. das Lösen von nicht-linearen Gleichungen) und<br />

Darstellung von Resultaten. Das Framework basiert auf einem Domänenmodell,<br />

dass das Verhalten eines Netzes ausschliesslich durch Instanzen<br />

zweier generischer Baustein-Typen, Ntor und Summengeber, modelliert.<br />

Das Ntor ist die Entität, mit der physikalische Betriebsmittel und auch<br />

Fehlerbedingungen modelliert wird. Das Ntor stellt einen endlichen Automaten<br />

mit einem Verhalten BN σ(Vσ,Pσ,E σ,Tσ) für jeden Zustand σ dar.<br />

Die Menge E σ enthält alle Gleichungen, die mit Hilfe der Variablen Vσ<br />

und den Parametern Pσ gebildet werden. Die Menge Tσ spezifiziert den<br />

endlichen Automaten.<br />

Die Summengeber greifen auf Variable in den Ntoren zu, und for-<br />

151<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


152 KAPITEL 7. SCHLUSSBETRACHTUNG<br />

mulieren damit weitere Gleichungen auszudrücken. Summengeber sind<br />

Behälter für eine beliebige Anzahl von elementaren Summentypen. Dies<br />

können einzeilige und mehrzeilige Summen sein. Das Domänen-Modell<br />

ist als ein System von gekoppelten Klassen implementiert worden. Diese<br />

Klassen bilden zusammen das objekt-orientierte Framework. Das Framework<br />

enthält Klassen und Methoden, die im Design zwar angelegt, jedoch<br />

für einen bestimmen Anwendungsfall noch zu konkretisieren sind.<br />

Diese Adaption lässt sich nicht innerhalb des Frameworks ausführen.<br />

An dieser Stelle kommt ein symbolisches Rechenprogramm (Maple V)<br />

zum Einsatz, um aus einer anwendungsfreundlichen Hochsprachenspezifikation<br />

zuverlässig den korrekten Quelltext der zu konkretisierenden Klassen<br />

zu erzeugen.<br />

Alle diese Elemente, wie Framework, Spezifikation und Adaption der<br />

generischen Teile des Frameworks werden innerhalb der Domänen-Architektur<br />

koordiniert.<br />

Der Prototyp, der alle Teile der Domänen-Architektur umfasst und implementiert,<br />

wurde in verschiedenen Lastflussrechnungen eingesetzt. Ferner<br />

ist mit ihm auch der lineare Spezialfall der Kurzschlussrechnung modelliert<br />

worden. Der Prototyp wurde auch anhand grösserer Netze mit bis<br />

zu 2550 elektrischen Verbindungsstellen überprüft.<br />

Ein Klient kann mit diesem Prototypen Quelltext erzeugen, den er in<br />

seiner Simulations-Applikation einbinden kann. Dies geschieht in folgenden,<br />

durch die Domänen-Architektur festgelegten Schritten:<br />

1. Der Klient spezifiziert die variablen Teile der Dienste Netzaufbau,<br />

Netzberechnung und Resultatanzeige.<br />

2. Der Klient verwendet oder spezifiziert eine geeignete Adaption der<br />

generischen Teile des Frameworks, um die variablen Teile der Dienste<br />

in der Software-Komponente einzubauen.<br />

3. Der Klient erzeugt (automatisch) eine Instanz der Software-Komponente.<br />

Ohne diesen Prototypen hätte der Klient beim Aufbau seiner Applikation<br />

einige Entscheidungen selber zu treffen. Diese betreffen erstens die<br />

Modellierung des Netzes. Der verbreitete und bezüglich der Computer-<br />

Ressourcen effektive Knoten-Zweig Ansatz ist für viele typische Lastflussfälle<br />

geeignet. Er ist aber nicht allgemein genug, um das breite Gebiet<br />

von praktisch vorkommenden Betriebsmitteln zu modellieren. Der<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


7.2. ERGEBNISSE 153<br />

im Domänenmodell eingesetzte Ntor-Ansatz hingegen hat sich als sehr<br />

flexibel erwiesen. Zweitens müsste ein Klient z.B. bei Verwendung einer<br />

Bibliothek von allgemeinen Software-Funktionen (Prozeduren oder<br />

feinkörnige Klassen) erneut entscheiden, welche Bibliotheks-Komponenten<br />

er nehmen soll und wie er die Kommunikation zwischen ihnen zu organisieren<br />

hätte. Dank dem Einsatz des Frameworks kann der Klient jedoch<br />

bereits eingebaute und komplexe Beziehungen zwischen einer Menge von<br />

kooperierenden Objekten wiederverwenden, ohne die inneren Einzelheiten<br />

dieser Beziehungen kennen zu müssen. Drittens müsste der Klient<br />

selber einen Rahmen finden, um den Übergang von einer geeigneten und<br />

anwenderfreundlichen Spezifikation seines Problems zu einem effizienten<br />

Simulationsprogramm zu organisieren. Die Domänen-Architektur bietet<br />

einen solchen koordinierenden Rahmen an. Dieser Rahmen ist eine Voraussetzung<br />

für die Wiederverwendbarkeit der darin benutzten Elemente.<br />

In Übereinstimmung mit [34] lassen sich die Begrenzungen des in dieser<br />

Arbeit betrachteten Ansatzes wie folgt zusammenfassen: “Perhaps the<br />

key limiting factor in this approach is that the specification of the various<br />

grammars implies a certain closed-endedness of the space of possibilities.<br />

Even when the grammars are made extensible along some of the obvious<br />

dimensions (data types, control types, and so on), there remain integral<br />

features of the grammar that constrain what the system can do. In a sense,<br />

the approach’s ability to capture high-level semantics is a double-edged<br />

sword: It provides leverage but takes away choice.”<br />

7.2 Ergebnisse<br />

Der in der vorliegenden Arbeit dargestellte Ansatz interessiert direkt oder<br />

indirekt verschiedene Personengruppen. Aus deren Sicht lassen sich abschliessend<br />

folgende Punkte zusammenfassen:<br />

1. Klient:<br />

• Qualität: der Einsatz eines symbolischen Rechensystems innerhalb<br />

eines festgelegten Ablaufs sichert die Erzeugung korrekter<br />

Terme für den Simulationsalgorithmus.<br />

• Produktivität: Bei der Herstellung von Simulationsprogrammen<br />

ist nur ein Bruchteil der Codemenge neu zu schreiben. Damit<br />

lässt sich Entwicklungszeit einsparen und die Produktivität för-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


154 KAPITEL 7. SCHLUSSBETRACHTUNG<br />

dern. Die verhältnismässig kleine Kompilationszeit ermöglicht<br />

kurze Entwicklungszyklen.<br />

• Modularisierbarkeit: Die Domänen-Architektur unterstützt die<br />

Modularisierbarkeit der Software-Entwicklung auf verschiedenen<br />

Stufen.<br />

• Erweiterbarkeit: Dank den Festlegungen der Domänen-Architektur<br />

werden die Erweiterungen in den Elementen “Spezifikation”<br />

und “Adaption” konzentriert und damit verhindert, dass der Klient<br />

eine Kettenreaktion von Änderungen im ganzen Simulationsprogramm<br />

zu bewältigen hat.<br />

• Zuverlässigkeit: Anstelle fehlerträchtiger Handcodierung erzeugt<br />

ein symbolisches Rechenprogramm (Maple V) aus einer anwendungsfreundlichen<br />

Hochsprachen-Spezifikation den korrekten<br />

Quelltext für die zu konkretisierenden Teile des Frameworks.<br />

2. Für den Endbenutzer, der nicht gleichzeitig Klient sein muss, ergeben<br />

sich die folgenden Punkte:<br />

• Die Rechenzeit bei der Simulation grosser Netze ist verhältnismässig<br />

hoch verglichen mit traditionellem, funktionalem Handkodieren.<br />

• Die Wartezeit, bis Modelle erweitert oder neue Ntor-Typen verfügbar<br />

sind, ist tendenziell kleiner, da die Entwicklung dank dem<br />

vorgestellten Ansatz rascher vorangeht.<br />

• Die klaren Spezifikationsmöglichkeiten vereinfachen die Kommunikation<br />

zwischen den beteiligten Personengruppen.<br />

3. Framework-Entwickler: das Domänenmodell, die Domänen-Architektur<br />

sowie das Framework stellen eine Basis für das Domänen-Engineering<br />

dar. Es ist ein Ausgangspunkt für weitere Entwicklungen,<br />

wie z.B. die Optimierung oder die Simulation des transienten Verhaltens.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Anhang A<br />

Umformung der Ntor-Gleichungen<br />

Dieses Kapitel zeigt, wie sich die Ntor-Gleichungen (siehe Kapitel 3) in<br />

die Form des bekannten Knotenpotentialverfahrens abbilden lassen.<br />

A.1 Modellierung der Ntore<br />

Für die Betrachtungen dieses Kapitels wird die Charakteristik der Ntore<br />

gegenüber der Darstellung in Kapitel 3 wie folgt eingeschränkt:<br />

• g(x,p) ist linear,<br />

• alle N Anschlüsse sind elektrische Anschlüsse und<br />

• die Ntore haben keine weiteren, innere Variablen.<br />

Es wird eine stationäre Netzberechnung bei Wechselstrom betrachtet. Pro<br />

Anschluss gibt es daher je eine komplexe Spannungs- und Stromvariable.<br />

Das Gleichungssystemg [i] (x [i] ,p [i] )=0 eines Ntors i wird in diesem Kapitel<br />

in der Form<br />

MUiUNtori +MIiINtori = bi<br />

(A.1)<br />

dargestellt.<br />

Darin werden die Zusammenhänge zwischen den an allen Anschlüssen<br />

anliegenden Spannungen UNtori des Ntors i und den in diese Anschlüsse<br />

hineinfliessenden Ströme INtori in einer neuen Form dargestellt. Dazu werden<br />

die Variablen x [i] in die beiden Vektoren UNtori und INtori aufgeteilt,<br />

welche je die Dimension N haben. Die einzelnen Elemente der Vektoren<br />

und INtori stellen die Spannungen und die (in das N-Tor hineinge-<br />

UNtori<br />

richteten) Ströme der N Anschlüsse des Ntors i dar.<br />

Die Parameter p [i] jedes Ntor-Typs i werden in der neuen Form in den<br />

Matrizen MUi und MIi und den Elementen des Vektors bi angeordnet.<br />

155<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


156 ANHANG A. UMFORMUNG DER NTOR-GLEICHUNGEN<br />

Ntor Anschluss<br />

m<br />

U m<br />

Kirchhoff-<br />

Knoten k<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

I km<br />

Abbildung A.1: Kirchhoff-Knoten und Ntor<br />

MUi und MIi stellen daher numerisch gegebene, komplexe Matrizen der<br />

Dimension NxN dar.<br />

A.2 Kirchhoff-Knoten<br />

Für stationäre Vorgänge und Wechselstrom lassen sich am Kirchhoff-Knoten<br />

(siehe Abbildung A.1) bekanntlich folgende beiden Gesetze formulieren:<br />

1. Da die Kirchhoff-Knoten gemäss Modellierungsregel 7 auf S. 45 keine<br />

Verbindung gegen Erde aufweisen, muss die Summe aller (gerichteter)<br />

Ströme an jedem Kirchhoff-Knoten gleich Null sein. Formell<br />

bedeutet dies, bei Annahme, dass die Ströme immer aus den Kirchhoff-Knoten<br />

herauskommen:<br />

∑ Ikm = 0 (k: alle Kirchhoff-Knoten) (A.2)<br />

m∈k<br />

wobei sich in (A.2) und (A.3) der Index m auf alle zum Kirchhoff--<br />

Knoten k verbundenen Ntor-Anschlüsse m bezieht. Der Index m ist<br />

netzweit eindeutig. Er setzt sich daher gemäss Modellierungsregel<br />

4 auf S. 45 aus der Ntore-Identifikation i und der lokalen Anschlussnummer<br />

anr zusammen.<br />

2. Da die Kirchhoff-Knoten gemäss Modellierungsregel 7 auf S. 45 impedanzlos<br />

mit Ntor-Anschlüssen verbunden sind, entspricht die (komplexe)<br />

Knotenspannung jedes Kirchhoff-Knotens genau der komplexen<br />

Spannung aller Ntor-Anschlüsse, die mit diesem Kirchhoff-Knoten<br />

verbunden sind:<br />

U k = U m ∀m ∈ k(k: alle Kirchhoff-Knoten) (A.3)<br />

U k


A.3. DARSTELLUNG ALLER GLEICHUNGEN EINES NETZES 157<br />

Das Kirchhoff’sche Gesetz (A.3) kann matriziell wie folgt formuliert<br />

werden:<br />

C ·UKirchho f f −UNtor = 0 (A.4)<br />

wobei UNtor der Vektor der komplexen Spannungen der Anschlüsse aller<br />

Ntore darstellt. Der Vektor UKirchof f repräsentiert die komplexen Knotenspannungen<br />

aller Kirchhoff-Knoten.<br />

Die Matrix C ist eine Inzidenzmatrix, deren Elemente Ckm wie folgt ge-<br />

bildet werden:<br />

Ckm =<br />

⎧<br />

⎨<br />

⎩<br />

1:der m-te Ntor-Anschluss ist mit dem<br />

Kirchhoff-Knoten k verbunden<br />

0:sonst<br />

Die Matrix C hat die Dimension Anzahl Anschlüsse aller Ntore · Anzahl<br />

Kirchhoff-Knoten. Vertikal sind die Anschlussnummern m aller Ntore in<br />

der Reihenfolge R aufgezählt und horizontal die Nummern aller Kirchhoff-<br />

Knoten k.<br />

Konvention 1 Die Reihenfolge der Variablen in INtor und UNtor wird durch<br />

die Reihenfolge R der Anschlüsse in der C-Matrix festgelegt.<br />

Das Kirchhoff’sche Gesetz (A.2) kann mit derselben Matrix C formuliert<br />

werden:<br />

C T · INtor −IKirchho f f = 0 (A.5)<br />

Da aber IKirchho f f = 0 gilt, folgt noch einfacher:<br />

C T · INtor = 0 (A.6)<br />

A.3 Darstellung aller Gleichungen eines Netzes<br />

Folgend den Konvention (1) für INtor und UNtor können alle Ntor-Gleichungen<br />

zusammen in Matrixform geschrieben werden:<br />

diag(MUi )UNtor +diag(MIi )INtor = b (A.7)<br />

wobei diag(MUi ) die blockdiagonale Form aller einzelner NxN - Matrizen<br />

MUi , diag(MIi ) die blockdiagonale Form aller einzelner NxN - Matrizen<br />

MIi und der Vektor b die Blockvektorform aller einzelner Vektoren bi aller<br />

N-Tore darstellt.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


158 ANHANG A. UMFORMUNG DER NTOR-GLEICHUNGEN<br />

Man beachte, dass die Reihenfolge der Plazierung der Teilmatrizen MUi ,<br />

MIi und der Elemente bi nicht mehr frei ist, sobald die Elemente der Vektoren<br />

UNtor und INtor aufgesetzt sind. Dieser letzte Schritt wird durch das<br />

Aufstellen der Matrix C definiert.<br />

Es gilt (A.4), womit die Variablen UNtor immer eliminiert werden können.<br />

Es entsteht das Gleichungssystem:<br />

<br />

diag(MIi ) diag(MUi )·C<br />

CT 0<br />

<br />

·<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

INtor<br />

UKirchho f f<br />

<br />

=<br />

b<br />

0<br />

<br />

(A.8)<br />

Im allgemeinen können nun keine weiteren Eliminationsschritte von immer<br />

gleichartigen Blöcken von Variablen durchgeführt werden, da sowohl<br />

die Matrix diag(MUi ) wie auch diag(MIi ) singulär sein können.<br />

Unter der Annahme, dass diag(MIi ) nicht singulär ist, können die Variablen<br />

INtor aus (A.8) eliminiert werden: Es folgt aus (A.8):<br />

INtor = diag(MIi )−1 · b−diag(MUi )C·UKirchho<br />

<br />

f f (A.9)<br />

Dieser Ausdruck in die zweite Zeile von (A.8) eingesetzt ergibt:<br />

C T diag(MIi )−1 diag(MUi )C·UKirchho f f = C T diag(MIi )−1 b (A.10)<br />

Durch Setzen von<br />

und<br />

Y = C T diag(MIi )−1diag(MUi )C (A.11)<br />

I o = C T diag(MIi )−1 b (A.12)<br />

und<br />

U = UKirchho f f<br />

(A.13)<br />

ist die normalerweise in der Theorie verwendete Darstellung mit Hilfe der<br />

Knotenadmittanzmatrix<br />

Y ·U = I 0<br />

(A.14)<br />

hergeleitet worden. Y stellt die Knotenpunktsadmittanzmatrix dar, U den<br />

Vektor aller Knotenspannungen (genauer: Kirchhoff-Knotenspannungen)<br />

und I 0 den Vektor aller gegebener (Kirchhoff-) Knotenströme.


Anhang B<br />

IEEE Common Data Format<br />

Dieses Kapitel stellt einen Ausschnitt aus der Beschreibung des<br />

“IEEE Common Data Format for the Exchange of Solved Load Flow Data”[23]<br />

dar.<br />

Die Datenfelder sind wie folgt gekennzeichnet:<br />

Abkürzung Bedeutung<br />

A Alphanumerisch (ohne Sonderzeichen)<br />

I Integer (Ganzzahlig)<br />

• Obligatorisch<br />

F Gleitkomma<br />

Tabelle B.1: Abkürzungen<br />

Datensatz Spalte Beschreibung<br />

2- 9 Datum, im Format DD/MM/YY mit führenden<br />

Nullen. Falls kein Datum angegeben wird, muss<br />

0b/0b/0b eingetragen werden, wobei b ein Leerzeichen<br />

ist.<br />

netzweite 11-30 Name des Urhebers (A)<br />

Daten 32-37 Bezugsscheinleistung MVA (F•)<br />

39-42 Jahreszahl (I)<br />

44 Jahreszeit (S - Sommer, W - Winter)<br />

46-73 Identifikation des Falles(A)<br />

Tabelle B.2: Datenblock mit netzweitem Datensatz•<br />

159<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


160 ANHANG B. IEEE COMMON DATA FORMAT<br />

Datensatz Spalte Beschreibung<br />

Start 1-16 BUS DATA FOLLOWS •<br />

Bus 1- 4 Knotennummer (I) •<br />

6-17 Name, links bündig (A)<br />

19-20 Nummer des Austauschgebietes = 0 (I) •<br />

21-23 Nummer des Gebietes für Verlustbilanzierung (I)<br />

25-26 Knotentyp (I) •<br />

0 - Ungeregelt (Last, PQ)<br />

1 - PQ-Generator mit Spannungsgrenzen<br />

2 - PV-Generator mit Blindleistungsgrenzen<br />

3 - Slack-Generator, pro Netz einmal vorhanden<br />

28-33 resultierender Spannungsbetrag (p.u.) (F) •<br />

34-40 resultierender Spannungswinkel Grad (F) •<br />

41-49 Last (MW) (F) •<br />

50-59 Last (MVAR) (F) •<br />

60-67 Erzeugung (MW) (F) •<br />

68-75 Erzeugung (MVAR) (F) •<br />

77-83 Bezugsspannung KV (F)<br />

85-90 Spannungssollwert (p.u.) des geregelten Knotens<br />

(F)<br />

91-98 Maximale Blindleistung (MVAR) oder Spannungsgrenze<br />

(p.u.) (F)<br />

99-106 Minimale Blindleistung (MVAR) oder Spannungsgrenze<br />

(p.u.) (F)<br />

107-114 Shunt Leitwert G (p.u.) (F) •<br />

115-122 Shunt Suszeptanz B (p.u.) (F) •<br />

124-127 Nummer des geregelten Knotens<br />

Ende 1- 4 -999<br />

Tabelle B.3: Datenblock mit Bus-Datensätzen•<br />

Datensatz Spalte Beschreibung<br />

Start 1-16 BRANCHDATAFOLLOWS•<br />

Zweig 1- 4 Knotennummer auf der “Tap”-Seite. Gilt für<br />

Transformatoren und Phasenschieber (I) •<br />

6- 9 Knotennummer auf der “Z”-Seite. Gilt für Transformatoren<br />

und Phasenschieber (I) •<br />

11-12 Nummer des Austauschgebietes (I)<br />

Fortsetzung auf folgender Seite<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Fortsetzung<br />

Datensatz Spalte Beschreibung<br />

13-14 Gebietsnummer für Verlustbilanzierung (I)<br />

17 Nummer des Stromkreises (I) •<br />

19 Zweigtyp (I) •<br />

0-Übertragungsleitung<br />

1 - Transformator mit konstantem Übersetzungsverhältnis t<br />

2 - Transformator mit variablem Übersetzungsverhältnis t für<br />

Spannungsregelung<br />

3 - Transformator mit variablem Übersetzungsverhältnis t für<br />

Blindleistungsregelung<br />

4 - Phasenschieber mit variablem Phasenwinkel Φt für Wirklei-<br />

stungsregelung<br />

20-29 Zweigwiderstand R, p.u. (F) •<br />

30-40 Zweigreaktanz X, p.u. R + j · X = 0 (F) •<br />

41-50 Gesamter Querleitweit B p.u. (F) •<br />

69-72 Nummer des gesteuerten Knotens<br />

74 Anschlusseite des gesteuerten Knotens (I)<br />

0 - indifferent<br />

1 - gesteuerter Knoten auf der “Tap”-Seite<br />

2 - gesteuerter Knoten auf der “Z”-Seite<br />

77-82 maximales Übersetzungsverhältnis tmax eines<br />

Transformators (F)<br />

84-90 maximaler Phasenwinkel Φtmax<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

161<br />

eines Phasen-<br />

schiebers (F)<br />

91-97 Minimales Übersetungsverhältnis tmin oder minimaler<br />

Phasenwinkel Φtmin (F)<br />

98-104 Maximales Übersetungsverhältnis tmin oder maximaler<br />

Phasenwinkel Φtmin (F)<br />

113-119 Minimale Spannung (p.u.), Blind- (MVAR) oder<br />

Wirkleistung (MW)(F)<br />

120-126 Maximale Spannung (p.u.), Blind- (MVAR) oder<br />

Wirkleistung (MW)(F)<br />

Ende 1- 4 -999<br />

Tabelle B.4: Datenblock mit Zweig-Datensätzen•


162 ANHANG B. IEEE COMMON DATA FORMAT<br />

Datensatz Spalte Beschreibung<br />

Start 1-16 INTERCHANGE DATA FOLLOWS<br />

Austausch- 1- 2 Nummer des Austauschgebietes = 0 (I) •<br />

gebiet 4- 7 Nummer des Slack-Knotens des Austauschgebietes<br />

(I) •<br />

21-28 Exportierte Wirkleistung aus dem Austauschgebiet<br />

(MW) (F) •<br />

30-35 Toleranz der exportierten Blindleistung (MW) (F)<br />

•<br />

46-75 Name des Austauschgebietes (A)<br />

Ende 1- 2 -9<br />

Tabelle B.5: Datenblock mit Datensätzen für Austauschgebiete•<br />

Datensatz Spalte Beschreibung<br />

Start 1-16 TIE LINES FOLLOW<br />

Verbindungs- 1- 4 Knotennummer bei der “Meter”-Anschlussseite (I)<br />

leitung 7-8 Nummer des Austauschgebietes bei der “Meter”-<br />

Anschlussseite (I)<br />

11-14 Knotennummer bei der “Nonmeter”-Anschlussseite (I)<br />

17-18 Nummer des Austauschgebietes bei der “Nonmeter”-<br />

Anschlussseite (I)<br />

21 Nummer des Stromkreises<br />

Ende 1- 3 -999<br />

Tabelle B.6: Datenblock mit Datensätzen für Verbindungsleitungen<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Anhang C<br />

Stichwortverzeichnis<br />

Anschluss bildet die Verbindung zwischen Ntor und Summengeber. Jeder<br />

Anschluss steht dabei für eine gemeinsame Variable, die sowohl<br />

im Ntor als auch im verbundenen Summengeber in den Gleichungen<br />

auftritt. Pro gemeinsame Variable (immer reell) ist ein Anschluss zu<br />

instantiieren. Ein elektrischer Anschluss verknüpft immer Variable,<br />

die in Kirchhoff-Gleichungen verwendet werden, um die Topologie<br />

eines Netzes zu formulieren. Je nach Anwendungsfall sind dies unterschiedlich<br />

viele Anschlüsse.<br />

API Application Programming Interface. Hier ist die Programmierschnittstelle<br />

des Frameworks gemeint. Das Framework hat zwei API’s.<br />

Das passive API ist für die Adaption des Frameworks vorgesehen.<br />

Hier füllt ein Klient applikationsspezifischen (erzeugten) Code hinein.<br />

Dieser wird vom Framework aufgerufen. Das aktive API sind<br />

die Methoden des Frameworks, die der Klient (aktiv) aufrufen kann.<br />

Applikation <strong>Eine</strong> Applikation ist das Programm eines Klienten, das ein<br />

adaptiertes Framework verwendet. Der Code-Anteil des adaptierten<br />

Frameworks am Gesamtcode der Applikation kann sich dabei in weiten<br />

Grenzen bewegen. Wie in Abbildung C.1 ersichtlich, ist der Adaptionsbereich<br />

des Frameworks im allgemeinen nicht identisch mit<br />

dem übrigen Code-Anteil ausserhalb des Frameworks. Das in dieser<br />

Arbeit beschriebene Framework deckt eine Domäne ab und ist<br />

nicht als Applikations-Framework konzipiert. Diese Definition unterstreicht<br />

den evolutionären Charakter der Framework-Ausreifung.<br />

Tendenziell wird der Framework-Codeanteil ansteigen, nie aber alles<br />

ausmachen, da in jeder Applikation etwas Neues steckt, das vom<br />

Framework nicht vorwegnehmbar ist.<br />

163<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


164 ANHANG C. STICHWORTVERZEICHNIS<br />

Gesamter Applikation-Code<br />

Adaptiertes<br />

Framework<br />

Framework<br />

Abbildung C.1: Applikation und Framework<br />

Aktives API: Klient ruft auf<br />

Passives API: Framework ruft<br />

Code des Klienten auf<br />

Codemenge ausserhalb<br />

Framework<br />

Codemenge des Frameworks<br />

Σ Summengeber Ntor<br />

Abbildung C.2: Grundlegende Symbole dieser Arbeit<br />

Bausteine Sammelbegriff für alle vom Klienten definierbaren Ntore und<br />

Summengeber. Auf der Ebene des Frameworks ist jedem Baustein-<br />

Typ eine Klasse zugeordnet. Abbildung C.2 zeigt die beiden generischen<br />

Baustein-Symbole, die in dieser Arbeit festgelegt sind, um<br />

den Baustein-Bezug in verschiedenen Zusammenhängen zu verdeutlichen.<br />

Dienst Dies sind die verschiedenen Leistungen, welche das Framework<br />

in Zusammenarbeit mit der Domänen-Architektur erbringt. Dies<br />

sind Netzaufbau, Netzberechnung und Resultatanzeige. Der Dienst<br />

ist eine Sicht auf die Domänen-Architektur. Pro Dienst ordnet die<br />

Architektur je ein Element Spezifikation, Adaption und passives<br />

Framework-API zu.<br />

Domäne Das NIST [15] definiert es als “a distinct functional area that<br />

can be supported by a class of Software Systems with similar Requirements<br />

and capabilities. A Domain may exist before there are<br />

Software Systems to support it”.<br />

Domänenmodell Das Modell, das aus Anforderungen von typischen,<br />

nicht-optimierenden Lastfluss-Rechnungen gewonnen wurde.<br />

Elementarsumme Sammelbegriff für die beiden Summentypen Einzeilige-<br />

und Mehrzeilige-Summe.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Entität Sind hier die unterscheidbaren Einheiten des Domänen-Modells.<br />

Die Klassen sind ihre Implementation in der Welt des Frameworks.<br />

Framework <strong>Eine</strong> Menge von kooperierender Klassen, welche die abstrakte<br />

Gestalt von Lösungen innerhalb einer Familie von verwandten Problemen<br />

verkörpern. Gamma [10] sieht es als konzeptionelle Erweiterung<br />

der abstrakten Basisklasse. Es bedarf noch der Anpassung an<br />

die konkrete Aufgabenstellung. Dies geschieht durch Ableitung neuer<br />

Klassen. Dadurch gibt es keine Codeänderung am Grundverhalten<br />

des Frameworks. Applikationsspezifische Ergänzungen erfolgen<br />

durch Überschreiben von Methoden. Der globale Kontrollfluss ist bei<br />

einem Applikations-Framework bereits in den Framework-Klassen<br />

vorgegeben.<br />

Funktion Spezifizierbare Fehlerfunktiong(x,p)zwischen Variablenx und<br />

Parametern p, aus der durch Nullsetzen das nichtlineare Gleichungssystem<br />

g(x,p)=0 gebildet wird. Funktionen werden im betrachteten<br />

Domänenmodell ausschliesslich durch Bausteine ins Gesamtsystem<br />

eingebracht. <strong>Eine</strong> Funktion muss für eine Newton-Raphson-<br />

Berechnung einmal nach allen Variablen ableitbar sein.<br />

Kirchhoff-Knoten Ein spezieller Summengeber. Impedanzlose Zusammenschaltstelle<br />

zwischen Ntoren. Dieser Summengeber formuliert<br />

Summen im Sinne von Kirchhoffs Gesetzen. Der Kirchhoff-Knoten<br />

liefert die topologische Information ins Gleichungssystem (Inzidenzmatrix).<br />

Klient Der Klient ist ein Software-Entwickler, der für seine Applikation<br />

ein adaptiertes Framework verwendet. Das Framework kann er innerhalb<br />

der Domänen-Architektur adaptieren. In diesem Rahmen kann<br />

er Spezifikationen und Adaptionen ähnlicher Anforderungen wiederverwenden.<br />

Netz Als grundlegender Modellierungsansatz ist das Netz eine beliebige<br />

Menge von frei definierbaren Ntoren und Summengebern, die über<br />

gemeinsame Variable miteinander verbunden sind.<br />

Ntor Applikationsspezifischer Baustein mit Anschlüssen. Typischerweise<br />

identifiziert ein Klient aus der Welt der Elektrotechnik damit Betriebsmittel<br />

wie Generator, Leitung, Transformatoren usw. Vom Kli-<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E<br />

165


166 ANHANG C. STICHWORTVERZEICHNIS<br />

enten ist pro Ntor ein eindeutiger Typ-Name und ein Verhalten zu<br />

definieren.<br />

Parameter Dies sind die bekannten, innerhalb eines Newton-Raphson<br />

Prozesses konstanten Werte p. Parameter lassen sich den Bausteinen<br />

zuordnen. Namen und Anzahl sind frei wählbar. Die Namen müssen<br />

zusammen mit den Variablennamen innerhalb eines Bausteins eindeutig<br />

spezifiziert sein. Alle Parameter sind vom C++-Typ “Double”.<br />

Summengeber Summengeber formulieren und instantiieren Summenbeziehungen<br />

zwischen Basisnamen von Variablen. Der Klient spezifiziert<br />

Summengeber für seine Applikation. Dies geschieht auf der<br />

Basis der parametrierbaren Elementarsummen.<br />

Variable Dies sind die Unbekannten x, die innerhalb eines Newton-<br />

Raphson Prozesses berechnet werden. Alle Variablen sind vom gleichen<br />

Typ Double. Menge und Namen werden vom Klienten spezifiziert.<br />

Der Klient ist dafür verantwortlich, dass er die Variablen<br />

eindeutig indiziert, und die Funktionen entsprechend formuliert. Die<br />

Variablen lassen sich bei der Instantiierung des Ntors beliebig initialisieren.<br />

Verhalten Damit sind spezielle Spezifikationsdaten eines Bausteins gemeint.<br />

Aus diesen Daten lässt sich der adaptierbare Teil der Bausteine<br />

bilden, der zum Aufbau des gesamten Gleichungssystems beiträgt.<br />

Dies ist beim Baustein Ntor BN σ(Vσ,Pσ,E σ,Tσ) in jedem Zustand<br />

σ und BS(A ,E ) für den Baustein Summengeber.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Literaturverzeichnis<br />

[1] R. Rada. Software Reuse. Intellect Ltd., Oxford, England, 1995.<br />

[2] A. F. Neyer et. al. Object-oriented Programming For Flexible Software:<br />

Example Of A Load Flow. IEEE Transactions on Power Systems,<br />

5(3):689–695, August 1990.<br />

[3] M. Foley et al. An Object Based Graphical User Interface for Power<br />

Systems. IEEE Transactions on Power Systems, 8(1):97–104, February<br />

1993.<br />

[4] B. Hakavik und A. T. Holen. Power System Modelling And Sparse<br />

Matrix Operations Using Object-Oriented Programming. IEEE Transactions<br />

on Power Systems, 9(2):1045–1051, May 1994.<br />

[5] M. Foley und A. Bose. Object-Oriented On-Line Network Analysis.<br />

IEEE Transactions on Power Systems, 10(1):125–130, February<br />

1995.<br />

[6] E. Z. Zhou. Object-oriented Programming, C++ and Power System<br />

Simulation. IEEE Transactions on Power Systems, 11(1):206–215,<br />

February 1996.<br />

[7] F. L. Alvarado und Y. Liu. General Purpose Symbolic Simulation<br />

Tools for Electric Networks. IEEE Transactions on Power Systems,<br />

3(2):689–697, May 1988.<br />

[8] R. Bacher. Computer Aided Power Flow Software Engineering And<br />

Code Generation. IEEE Transactions on Power Systems, 11(1):490–<br />

496, Feb. 1996.<br />

[9] R. Bacher. Automatic Generation of Optimisation Code Based on<br />

Symbolic Non-Linear Domain Formulation. International Symposium<br />

on Symbolic and Algebraic Computation (ACM conference), Zurich,<br />

Switzerland, pages 283–291, July, 1996.<br />

167<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


168 LITERATURVERZEICHNIS<br />

[10] E. Gamma. Objektorientierte Software-Entwicklung am Beispiel von<br />

ET++. Springer-Verlag, Berlin Heidelberg, 1992.<br />

[11] C. W. Sanders. Object-Oriented Development of EMS Maintenance<br />

and Documentation Tools. IEEE Power Industry Computer Application<br />

Conference, pages 488–493, 1995.<br />

[12] R. R. Macala et al. Managing Domain-Specific, Product-Line Development.<br />

IEEE Software, pages 57–66, May 1996.<br />

[13] K. Kueffmann. Software-Wiederverwendung. Vieweg, Braunschweig/Wiesbaden,<br />

1994.<br />

[14] P. Bosshart und R. Bacher. A Domain Architecture For Solving<br />

Simultaneous Nonlinear Network Equations. IEEE Power Industry<br />

Computer Application Conference, pages 142–148, 1997.<br />

[15] S. Katz et al. Glossary of Software Reuse Terms. National Institute of<br />

Standards and Technology, Gaithersburg, 1994.<br />

[16] D. Tsichritzis et al. Beyond Objects: Objects. International Journal<br />

of Intelligent and Cooperative Information Systems (IJICIS), 1(1):43–<br />

60, March 1992.<br />

[17] Biggerstaff T. und Perlis A. Software Reusability, Volume 1. ACM<br />

Press, 1989.<br />

[18] B. Meyer. Object-Oriented Software Construction. Prentice Hall,<br />

Englewood-Cliffs,New Jersey, 1988.<br />

[19] J. M. Neighbors. Draco: A Method For Engineering Reusable Software<br />

Systems. In: Biggerstaff, T., Perlis, A. (Ed.): Software Reusability<br />

Volume I - Concepts and Models. ACM-Press, New York, 1989.<br />

[20] J. Rumbaugh, M. Blaha, W. Premerlani, F. Eddy, and W. Lorenson.<br />

Object-Oriented Modeling and Design. Prentice-Hall, Inc., New Jersey,<br />

1991.<br />

[21] R. E. Johnson und B. Foote. Designing Reusable Classes. The Journal<br />

of Object-Oriented Programming, 1(2):22–35, 1988.<br />

[22] S. Cotter und M. Potel. Inside Taligent Technology. Addison-Wesley,<br />

New York, 1995.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


LITERATURVERZEICHNIS 169<br />

[23] H. E. Pierce et. al. Common Format For Exchange Of Solved Load<br />

Flow Data. IEEE Transactions on Power Apparatus and Systems,<br />

pages 1916–1925, 1973.<br />

[24] K. Werlen. A Node-oriented Solution Strategy In Power System Analysis.<br />

PhD thesis, <strong>ETH</strong> 10181, 1993.<br />

[25] K. Imhof. Power System Modelling and Analysis Bases On Graph<br />

Theory. PhD thesis, <strong>ETH</strong> 7923, 1985.<br />

[26] K. Imhof et al. Modelling of Tap-Changer Transformators in an Energy<br />

Management System. IEEE Power Industry Computer Application<br />

Conference, pages 378–384, 1995.<br />

[27] B. Stroustrup. The C++ Programming Language, 2nd Edition.<br />

Addison-Wesley, New York, 1991.<br />

[28] Satir G. und Brown D. C++: The Core Language. O’Reilly Associates,<br />

Inc., 1995.<br />

[29] Timothy A. Davis und Iain S. Duff. Umfpack version 2.0:<br />

Unsymmetric-pattern multifrontal package. Sept 1995. Program<br />

package at: http://www.cis.ufl.edu/˜davis.<br />

[30] S. Naeher. The LEDA User Manual, Version 3.1. Max-Plank-Institute<br />

für Informatik, 66123 Saarbrücken, Germany, 1995.<br />

[31] B. Char et al. Maple V: Library Reference Manual. Springer-Verlag,<br />

1992.<br />

[32] M. B. Monagan et al. Maple V Programming Guide. Springer, New<br />

York, 1996.<br />

[33] W.H. Wellssow. Datenmodell für Planungsrechnungen. Forschungsgemeinschaft<br />

für Hochspannungs- und Hochstromtechnik<br />

FGH, 1995.<br />

[34] E. Wegscheider. Toward Code-Free Business Application Development.<br />

IEEE SW, pages 35–43, mar 1997.<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


170 LITERATURVERZEICHNIS<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E


Lebenslauf<br />

Peter Bosshart<br />

von Zürich und Wittenwil TG<br />

geboren am 15. Juli, 1955<br />

1962-1968 Primarschule in Zürich<br />

1968-1969 Lyceum Alpinum, Zuoz<br />

1969-1972 Sekundarschule in Zürich<br />

1972-1976 Mittelschule in Zürich<br />

Matura Typus B<br />

1977-1982 Studium an der <strong>ETH</strong> Zürich<br />

Abschluss als Dipl. El.-Ing. <strong>ETH</strong><br />

1983- 1992 Entwicklungsingenieur bei ABB Process Automation<br />

1992- 1997 Wissenschaftlicher Assistent am Institut für<br />

Hochspannungstechnik und<br />

Energieübertragung der <strong>ETH</strong> Zürich<br />

<strong>Diss</strong>ertation unter der Anleitung von<br />

Prof. Dr. R. Bacher<br />

1995- Studium höheres Lehramt für Elektrotechnik<br />

<strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-<strong>ETH</strong> <strong>12317</strong> <strong>Diss</strong>.-E

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!