NPN-Transistor – VB.Net Beispiel
Bei diesem Programm geht es darum, eine einfache NPN-Transistor-Schaltung zu simulieren. Mit verschiedenen Schiebern kann man einen veränderlichen Widerstand und damit die Eingangsspannung verstellen. Interessante Größen werden dann berechnet und an entsprechenden Labels ausgegeben.
Hauptsächlich können Sie an diesem Beispiel sehen, wie man eine Sub aufruft und wie man kleinere Rechnungen ausführt.
Die visuelle Oberfläche ist größtenteils durch ein vorgegebenes Hintergrundbild definiert. Somit spart man sich das komplizierte Zeichnen im Desingeditor. Anschließend sind an den passenden Stellen Label und Schieber hinzugefügt worden.
Damit das Hintergrundbild nicht verrutscht, habe ich dafür gesorgt, dass man das Programmfenster nicht vergrößern oder verkleinern kann. Das kann man erreichen, indem man die Eigenschaften minimale und die maximale Größe (MaxmiumSize, MinimumSize) auf die aktuelle Größe (Size) des Fensters einstellt. Damit man den Benutzer nicht verwirrt, kann man den Maximieren-Button im Eigenschaftsfenster des Design-Mangers auf unsichtbar stellen (MaximizeBox: False).
Ein weiteres Problem dieses Projekts war, dass die Schieber subjektiv wahrgenommen umgekehrt waren. Das heißt, der Wert wird größer, wenn man den Schieber nach unten bewegt. Intuitiver ist es aber anders herum. Leider gibt es dafür keine Eigenschaft. Deswegen muss man sich mit ein bisschen Code behelfen. In diesem Beispiel heißt der Schieber sbR. Die Formel die den Schieber allgemein umdreht lautet: sbR.Maximum – sbR.Value.Wenn man nun aber auch einen Minimum Wert hat, muss man diesen noch dazu addieren:sbR.Maximum – sbR.Value + sbR.Minimum. Jetzt muss man nur noch die Voreinstellung des Schiebers neu berechnen und fertig.
Quelltextauszug 1:
Public Class frmMain
Dim V, Ui, Ube, Ib, Ic, Uce
Dieser Teil des Quelltextes ist der unwichtigere Teil, aber er muss gemacht werden. Zu Beginn steht wie üblich die Klasse, die wie das Hauptformular heißt, in diesem Fall also frmMain (frm ist meine Bezeichnung für Formular). Anschließend werden ein paar Variablen mit dim dimensioniert. Ich habe die Variablentypen nicht angegeben, was nicht gerade ein sauberer Stil ist, aber VB.Net lässt dies zu.
Da die Variablen an dieser Stelle dimensioniert wurden, und nicht z.B. am Anfang einer Prozedur, gelten sie innerhalb der Klasse als global, d.h. alle Prozeduren innerhalb dieser Klasse dürfen darauf zugreifen. Wenn eine Variable innerhalb einer Prozedur dimensioniert würde, könnte nur diese Prozedur auf die Variable zugreifen. Der Vorteil läge aber darin, dass man in einer anderen Prozedur denselben Variablennamen benutzen dürfte, ohne auf einen Konflikt zu stoßen.
Private Sub sbR_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sbR.Scroll
berechnen()
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
berechnen()
End Sub
Als nächstes sehen wir zwei Prozeduren, die bei einem bestimmten Event ausgeführt werden. Das eine Event ist frmMain_Load, was bei Programmstart ausgeführt wird, das andere ist sbR_Scroll und tritt in Kraft, wenn der Schieber sbR benutzt wird. Beide Prozeduren rufen die Sub berechnen auf, den wichtigsten Teil des Programms.
Quelltextauszug 2: Berechnen
Dieser Teil des Quelltextes ist der spannendste, denn er beinhaltet die komplette Berechnung und die Ausgabe.
Private Sub berechnen()
V = 180
Hier beginnt die Prozedur. Wir sehen den Namen und dass keine Parameter benötigt werden, die sonst zwischen den Klammern stehen würden. Außerdem wird der Variable V (für Verstärkung) ein Startwert zugewiesen.
Ui = (sbR.Maximum – sbR.Value + sbR.Minimum) / 100 * 5
Ube = 0.43
Ib = 0
If Ui > Ube Then Ib = (Ui – Ube) / 100
An dieser Stelle werden ebenfalls einigen Variablen Werte zugewiesen, und zwar Ube (Spannung Basis-Emiter), Ib (Basis-Strom) und Ui (Eingangsspannung), welcher einstellbar ist. Ui wird zusätzlich noch umgerechnet in Volt.
For n = 1 To 4
If Ib > 0 Then Ube = 0.6 + Math.Log(Ib / 0.1) * 0.02886
If Ui > Ube Then Ib = (Ui – Ube) / 100
Next n
Einige werden sich sicher wundern, warum hier in einer For-Schleife dieselbe Rechnung vier Mal ausgeführt wird. Das liegt daran, dass sich die Schaltung durch Wechselwirkungen erst langsam auf einen Endwert einpendelt. Ein veränderter Strom führt zu einer neuen Basisspannung, die wiederum zu einem neuen Strom führt. Das macht die direkte Berechnung des Endwertes kompliziert, weswegen hier an dieser Stelle der Einpendelvorgang simuliert wird.
Außerdem kann man sehen wie man mathematische Unterfunktionen aufruft, hier nämlich mit Math.Log. Wollen Sie mit der konstanten Pi Rechnen, können Sie das mit Math.Pi tun.
If Ib = 0 Then Ube = Ui
Ube = Int(Ube * 100) / 100
Ib = Int(Ib * 1000) / 1000
Ic = Ib * V
If Ic > 4.85 Then Ic = (Ic – 4.85) / 100 + 4.85
Uce = 5 – 1 * Ic
Uce = Int(Uce * 100) / 100
Ic = Int(Ic * 100) / 100
Hier findet die weitere Berechnung der einzelnen Werte statt. Genaueres zu den physikalischen Grundlagen finden Sie weiter unten. An manchen Stellen steht Int(…) vor einer Berechnung. Da ich die Variablen zu Beginn des Programms nicht richtig deklariert habe, muss ich dem Programm nun mitteilen, dass es sich hier um ein Integer handelt.
lbIb.Text = „Ib=“ + Str$(Ib) + “ mA“
lbUbe.Text = „Ube=“ + Str$(Ube) + “ V“
lbIc.Text = „Ic=“ + Str$(Ic) + “ mA“
lbUce.Text = „Uce=“ + Str$(Uce) + “ V“
End Sub
Die Ausgabe darf natürlich nicht vergessen werden. An dieser Stelle werden deswegen den passenden Labels Werte zugewiesen. Dabei ist der Text aufgeteilt. Die Beschriftungen werden in Anführungszeichen geschrieben. Damit das Programm weiß, dass der Wert nun als String behandelt werden soll, muss man Str(…) davor schreiben. Insgesamt werden die Teile mit + oder & zu einem Gesamttext zusammengeführt und am Label ausgegeben. End Sub definiert das Ende der Routine.
Public Class frmMain
Dim V, Ui, Ube, Ib, Ic, Uce
Private Sub sbR_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs)Handles sbR.Scroll
berechnen()
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
berechnen()
End Sub
Private Sub berechnen()
V = 180
Ui = (sbR.Maximum – sbR.Value + sbR.Minimum) / 100 * 5
Ube = 0.43
Ib = 0
If Ui > Ube Then Ib = (Ui – Ube) / 100
For n = 1 To 4
If Ib > 0 Then Ube = 0.6 + Math.Log(Ib / 0.1) * 0.02886
If Ui > Ube Then Ib = (Ui – Ube) / 100
Next n
If Ib = 0 Then Ube = Ui
Ube = Int(Ube * 100) / 100
Ib = Int(Ib * 1000) / 1000
Ic = Ib * V
If Ic > 4.85 Then Ic = (Ic – 4.85) / 100 + 4.85
Uce = 5 – 1 * Ic
Uce = Int(Uce * 100) / 100
Ic = Int(Ic * 100) / 100
lbIb.Text = „Ib=“ + Str$(Ib) + “ mA“
lbUbe.Text = „Ube=“ + Str$(Ube) + “ V“
lbIc.Text = „Ic=“ + Str$(Ic) + “ mA“
lbUce.Text = „Uce=“ + Str$(Uce) + “ V“
End Sub
End Class