RLCRechner
Hier gibt es einen kleinen Widerstandsrechner für Zweipol-Netzwerke mit den Bauelementen R, L, C und auch G. Das Programm kann die (komplexe) Impedanz einer Schaltung mit Widerständen (bzw. Leitwerten), Induktivitäten und Kapazitäten zu einer bestimmten Frequenz berechnen.
Beispiel
Berechnen Sie die Impedanz folgender Schaltung bei einer Frequenz von 2 kHz.
Allgemein: ((C1 + G1) || (L + G1)) + R
Bedienung Programms
- Eingabe der Schaltung in den RLCRechner (mehrere Alternativen):
- (1nF + 2mS) || (5mH + 2mS) + 2k
- ((1nF + G1=2mS) || (5mH + G1)) + 2k
- (C1=1n + G1=2m) || (L=5m + G1) + R=2k
- (C1=1nF + G1=2mS) || (L=5mH + G1) + 2k
- Button "Eingabe" klicken.
- Rechts die Frequenz 2 kHz ohne Einheiten als Gleitkommazahl eingeben: 2000 oder 2e3
- Button "Berechnen" klicken (In der Liste links muss die richtige Schaltung ausgewählt sein!).
- Darunter das Ergebnis ablesen.
Die Eingabe der Schaltung erfolgt in der gebräuchlichen Schreibweise mit || für Parallelschaltungen und + für Reihenschaltungen, wie wir sie v.a. im ersten und zweiten Semester ständig verwendet haben. Wichtig ist, dass alle Zahlen mit einem Dezimalpunkt statt Komma eingegeben werden! Eine Besonderheit ist, dass man Bauelemente die mehrfach vorkommen (wie hier G1) beim ersten Vorkommen in der Formel definieren kann (G1=2mS) und bei weiteren Vorkommen einfach verwenden kann (auch mit Faktor davor, z.B. 2 R).
Screenshot
Download
Hier gibt es den RLCRechner zum Download. Die Anwendung ist in Java programmiert und liegt in einer JAR-Datei. Unter Windows kann das Programm ganz einfach mit der beiliegenden Batch-Datei gestartet werden, sobald beide Dateien entpackt sind.
Hier ist der Quellcode des Parsers. Die Definition der Zweipol-Klassenhierarchie findet man hier (Uebung 6).
Der RLCRechner
Features
- Elektrische Schaltung mit Widerständen, Spulen und Kondensatoren auf einfache Art eingeben.
- Frequenz eingeben und die (komplexe) Impedanz zur links ausgewählten Schaltung ausrechnen lassen.
- Die aktuelle Schaltung umwandeln in die PTE-Schaltungsbeschreibungssprache. Diese Beschreibungssprache wird weiter unten nochmal erwähnt und wird beim Praktikumsversuch 6 (Programmieren) verwendet.
- Symbolische Namen für Bauelemente mit bestimmten Werten festlegen, durch Eingabe von z.B.: Cp=1uF.
- Die Liste der benutzerdefinierten Bauelemente wieder löschen.
- Hilfe und Info zum Programm unter Hilfe.
Idee
Das (für mich) tolle an dem Programm ist eigentlich nur der Parser, der die Eingabe der Schaltung einliest und umsetzt in eine Composite-Struktur aus Instanzen der Klasse Zweipol.
Die Idee hatte ich schon im ersten oder zweiten Semester (Elektro-/Informationstechnik an der Hochschule München), aber daraus ist damals nichts geworden. Erst jetzt im vierten Semester bin ich wieder darauf gestoßen, als wir im Praktikum Programmieren, Versuch 6 bei Prof. Thomas eine Klassenhierarchie für Zweipole erstellen sollten. So ein Zweipol kann entweder ein konkretes Bauelement sein, oder eine Kombination (Reihen-/Parallelschaltung) aus zwei anderen Zweipolen. (Eine wunderbare Anwendung des Composite Patterns [GoF:163].) Überhaupt der ganze Versuch hat mir gut gefallen: Design Patterns, Wiederverwendung der Klasse Complex aus dem vorherigen Praktikumsversuch, und sehr praxisbezogen.
Der Parser, der die Schaltung einliest, war dabei vorgegeben. Es war extra eine "Schaltungsbeschreibungssprache" definiert, die ich mangels Name PTE-Schaltungsbeschreibung nenne. PTE hat etwas zu tun mit Praktikum Programmieren, Prof. Thomas und dem E, das die Wirkung einer Klammer zu ) hat und wohl für "End" steht. Diese Beschreibungssprache war durch eine Syntax in Backus-Naur-Form definiert. P eröffnet eine Parallel-, S eine Serienschaltung, E "schließt" die Schaltung wieder. Nach R kommt der Wert für einen Widerstand, C und L analog.
P S R 250 C 4.7e-9 E S R 1000 L 9.3e-3 E R 570 E E
entspricht damit
(250 + 4.7 nF) || (1k + 9.3mH) || 570
|| steht für Parallelschaltung, + für Reihenschaltung, bei Widerständen lasse ich die Einheit weg, ansonsten Farad, Henry oder Siemens, SI-Prefixe sind möglich.
Für diese zweite, viel übersichtlichere Form der Schaltungsbeschreibung habe ich jetzt eben einen Parser programmiert! Um auch etwas davon zu haben und den Parser einsetzen zu können, ist eben das Programm RLCRechner enstanden.
Der RLCParser
Der StandardParser implementiert mein Interface RLCParser, das im Wesentlichen nur die Methode parse deklariert. Der Rückgabewert dieser Funktion ist ein Zweipol. Die Eingabe wird als String übergeben. Damit das Geparse möglichst einfach wird gibt es noch eine Hilfsklasse RLCInputStream. Diese übernimmt aber aus praktischen Gründen die Funktionen peek und poll von Queue (in Java) und erweitert diese. Der RLCInputStream vereinfacht die Algorithmen stark, verglichen mit einem Parser der direkt einen String analysiert.
Syntax
Die Syntax der Eingabe muss die Folgende sein (Backus-Naur-Form):
reihe ::= paral { + paral }
paral ::= ausdruck { || ausdruck }
ausdruck ::= bauelement | ( reihe )
bauelement ::= widerstand | leitwert | induktivitaet | kapazitaet
widerstand ::= [ faktor ] R [ name ] | [ faktor ] R [ name ] = wert [ siprefix ] | wert [ siprefix ]
leitwert ::= [ faktor ] G [ name ] | [ faktor ] G [ name ] = wert [ siprefix ] [ masseinheit ] | wert [ siprefix ] masseinheit
induktivitaet ::= [ faktor ] L [ name ] | [ faktor ] L [ name ] = wert [ siprefix ] [ masseinheit ] | wert [ siprefix ] masseinheit
kapazitaet ::= [ faktor ] C [ name ] | [ faktor ] C [ name ] = wert [ siprefix ] [ masseinheit ] | wert [ siprefix ] masseinheit
faktor ::= Positive Gleitkommazahl (ohne Vorzeichen), nicht in Exponentialschreibweise!
name ::= literal { literal }
literal ::= buchstabe | ziffer | _
wert ::= Positive Gleitkommazahl
siprefix ::= f | p | n | u | µ | m | k | M | meg | G | T | P
masseinheit ::= Zur Größe passende Masseinheit ([R] = keine, [G] = S, [L] = H, [C] = F)
Zwischen Groß- und Kleinschreibung wird unterschieden! Klammern haben höchste Priorität, dann ||-Schaltungen und als letztes die Reihenschaltung.
Besonderheiten
Es gibt also Bauelemente ohne Namen, wenn nur der Wert angegeben wird, z.B. 2mH + 5uS. Sobald aber z.B. L = 5m oder C1=5nF vorkommt, ist L bzw. C1 der Name des Bauelements und das rechts vom = der Wert. Ab jetzt kann man den symbolischen Namen wie eine Konstante verwendet werden, z.B. R=1k || R + 2nF || R.
Zusätzlich gibt es jetzt auch noch Faktoren für symbolische Namen, ein paar Beispiele:
- G=1u || 2 G + 3G
- C1=1µF || 2k + 1.5 C1
- 2 R=5meg || 2R // eine kompliziertere Schaltung für "nur R": je 2 R (mit R = 5 Megaohm) parallel geschaltet
Wer es übersichtlicher will und auf diese implizite Zuweisungen verzichten möchte, kann (selbes Parser-Objekt vorrausgesetzt) zuerst die Zuweisungen eingeben und dann die symbolischen Namen verwenden. Die benutzerdefinierten Bauelemente werden nämlich bei jeder Parser-Instanz in einer Hashmap gespeichert (Zuordnung: symbolischer Name, Bauelementwert).
Known Bugs
Folgende Fehler sind mir bis jetzt im Parser aufgefallen:-
'G' ist doppeldeutig, was mit der Einführung von Faktoren einen Fehler nach sich zieht:
G ist das Formelzeichen für den elektrischen Leitwert in Siemens und
gleichzeitig das SI-Prefix für Giga. Als im Parser noch keine
Faktoren vor symbolischen Namen implementiert waren, war diese
Doppeldeutigkeit kein Problem. G als Formelzeichen stand immer am
Anfang eines Ausdrucks, G als SI-Prefix immer am Ende. Wenn jetzt
aber ein Leitwert G (als symbolischer Name) definiert ist, und in der
Eingabe
2 G
für "2 x der Leitwert G" steht, gibt es ein Problem, weil2 G
genauso gut für "2 Gigaohm" stehen kann! Folge ist dass man zurzeit keine Gigaohm-Widerstände auf diese Weise eingeben kann. Die einfachste Lösung wäre, das Feature mit den Faktoren wegzulassen, oder G nicht als SI-Prefix zu akzeptieren.