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.

Npn1

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.

Der gesamte Quelltext

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

[Einklappen]

Download Projektdatei NPN

Wenn Sie nur an der Exe-Datei interessiert sind, befindet sich diese in dem Unterordner \bin\Debug.