Knowledge Base

Instrumentenprogrammierung mit VB.NET

Dieser Wissensdatenbank-Artikel führt in die Programmierung eines programmierbaren Stromversorgungsprodukts von Magna-Power mit der Programmiersprache VB.NET ein. VB.NET ist eine vielseitige Sprache, die in das Microsoft .NET Framework integriert ist und für ihre Einfachheit und Benutzerfreundlichkeit bei der Entwicklung von Windows-Anwendungen bekannt ist. Ihre leistungsstarken Funktionen machen sie zu einer ausgezeichneten Wahl für die Erstellung von Programmen zur Steuerung, Messung und sogar zur Erstellung von Diagrammen für programmierbare Instrumente. Darüber hinaus bedeutet die umfassende Unterstützung von Magna-Power für Standard Commands for Programmable Instrumentation (SCPI), dass die Produkte des Unternehmens in VB.NET mit einfachen, intuitiven Befehlen leicht gesteuert werden können.

Die Produkte von Magna-Power unterstützen eine Vielzahl von Kommunikationsschnittstellen, darunter RS-232, TCP/IP Ethernet, USB, RS-485 und IEEE-488 GPIB. Trotz dieser unterschiedlichen Schnittstellen sind die SCPI-Befehle für eine bestimmte Produktserie identisch. Die SCPI-Befehle sind im jeweiligen Benutzerhandbuch der Produktserie dokumentiert. Beim Erstellen eines VB.NET-Programms besteht der einzige Unterschied zwischen den Schnittstellen in den Einstellungen für die Geräteverbindung.

Kommunikationsschnittstellen

USB-, serielle oder RS-485-Verbindung

Für USB-, serielle oder RS-485-Verbindungen verwendet VB.NET die Klasse System.IO.Ports.SerialPort, um eine serielle Verbindung zum Instrument herzustellen:

Dim conn As New IO.Ports.SerialPort("COM4", 115200)
conn.Open()

Die serielle Baudrate für xGen-Produkte beträgt 115200, während die serielle Baudrate für Nicht-xGen-Produkte 19200 beträgt. Der Portname wird von Ihrem Betriebssystem festgelegt. Unter Windows kann dieser Port im Geräte-Manager gefunden werden.

Das anschließende Senden und Empfangen von Befehlen über die serielle Verbindung erfolgt wie folgt:

conn.WriteLine("*IDN?")
Dim response As String = conn.ReadLine()
Console.WriteLine(response)

TCP/IP-Ethernet-Verbindung

Für TCP/IP-Ethernet-Verbindungen verwendet VB.NET die Klasse System.Net.Sockets.TcpClient:

Dim client As New Net.Sockets.TcpClient("192.168.0.86", 50505)
Dim stream As Net.Sockets.NetworkStream = client.GetStream()
Dim writer As New IO.StreamWriter(stream)
Dim reader As New IO.StreamReader(stream)
writer.AutoFlush = True

Das anschließende Senden und Empfangen von Befehlen über die TCP/IP-Ethernet-Verbindung erfolgt wie folgt:

writer.WriteLine("*IDN?")
Dim response As String = reader.ReadLine()
Console.WriteLine(response)

IEEE-488 GPIB-Verbindung

Für IEEE-488 GPIB-Verbindungen können Sie Bibliotheken verwenden, die von Ihrem GPIB-Hardwarehersteller bereitgestellt werden, wie z. B. NI-488.2 von National Instruments oder die IO Libraries Suite von Keysight. In VB.NET können Sie die VISA.NET-Bibliothek verwenden, um mit GPIB-Instrumenten zu kommunizieren.

Beispiel mit VISA.NET:

Stellen Sie zunächst sicher, dass die VISA.NET-Bibliothek installiert ist, und fügen Sie in Ihrem Projekt einen Verweis auf Ivi.Visa hinzu.

Imports Ivi.Visa

Dim rm As IResourceManager = GlobalResourceManager.Instance
Dim session As IMessageBasedSession = CType(rm.Open("GPIB0::12::INSTR"), IMessageBasedSession)

' Subsequent sending and receiving of commands over IEEE-488 GPIB connection:
session.FormattedIO.WriteLine("*IDN?")
Dim response As String = session.FormattedIO.ReadLine()
Console.WriteLine(response)

Ausführliche Beispiele

Die folgenden Beispiele zeigen detailliertere VB.NET-Programme unter Verwendung eines xGen MagnaDC-Netzgeräts. Die Programmierung eines Nicht-xGen MagnaDC programmierbaren DC-Netzgeräts in VB.NET ist nahezu identisch, mit geringfügigen Änderungen an den SCPI-Befehlen, wie im jeweiligen Benutzerhandbuch der Produktserie dokumentiert.

Beispiel 1: Grundlegende TCP/IP-Ethernet-Steuerung

Dieses einfache Beispiel erstellt eine TCP/IP-Ethernet-Verbindung, sendet einige Initialisierungsbefehle, aktiviert den DC-Ausgang, erhöht den Strompegel auf 5 A, wartet 20 Sekunden und fährt dann herunter.

Imports System.Net.Sockets
Imports System.IO
Imports System.Threading

Module Program
    Sub Main()
        ' Create a TCP/IP client and connect to the instrument
        Dim client As New TcpClient("192.168.0.86", 50505)
        Dim stream As NetworkStream = client.GetStream()
        Dim writer As New StreamWriter(stream)
        Dim reader As New StreamReader(stream)
        writer.AutoFlush = True

        ' Send SCPI command requesting the product to identify itself
        writer.WriteLine("*IDN?")
        ' Receive the product's response and display it in the console
        Dim response As String = reader.ReadLine()
        Console.WriteLine(response)

        ' Configure the MagnaDC for local control
        writer.WriteLine("CONF:SOUR 0")
        ' Set the DC output current to 0 A before enabling DC output
        writer.WriteLine("CURR 0")
        ' Enable the MagnaDC power supply output
        writer.WriteLine("OUTP:START")
        ' Set the DC output current to 5 A
        writer.WriteLine("CURR 5")

        ' Wait 20 seconds
        Thread.Sleep(20000)

        ' Disable the DC output
        writer.WriteLine("OUTP:STOP")

        ' Close the communication channel to the product
        writer.Close()
        reader.Close()
        client.Close()
    End Sub
End Module

Beispiel 2: Serielle Verbindung mit Strom-Sollwerten

Dieses Beispiel erstellt eine serielle Verbindung zum Produkt, ermittelt, um welches Produkt es sich handelt, und sendet dann eine Folge von Strombefehlen mit jeweils 20 Sekunden zwischen den einzelnen Stromstufen. Diese Art von Programm kann erweitert werden, um auch Spannungs-, Leistungs- und Widerstandswerte zu durchlaufen.

Imports System.IO.Ports
Imports System.Threading

Module Program
    Sub Main()
        ' Create a serial connection object with default baud rate for MagnaLOADs
        Dim conn As New SerialPort("COM4", 115200)
        conn.Open()

        ' Send SCPI command requesting the product to identify itself
        conn.WriteLine("*IDN?")
        ' Receive the product's response and display it in the console
        Dim response As String = conn.ReadLine()
        Console.WriteLine(response)

        ' Create an array of current set points
        Dim currSetPoints() As Integer = {50, 100, 150, 250}

        ' Configure the MagnaDC power supply for local control
        conn.WriteLine("CONF:SOUR 0")
        ' Enable the MagnaDC power supply output
        conn.WriteLine("OUTP:START")

        ' Loop through each current set point
        For Each currSetpoint In currSetPoints
            Console.WriteLine($"Setting Current to {currSetpoint} A")
            conn.WriteLine($"CURR {currSetpoint}")
            Thread.Sleep(20000) ' Wait 20 seconds
        Next

        ' Disable the MagnaDC power supply output
        conn.WriteLine("OUTP:STOP")
        ' Close the communication channel to the product
        conn.Close()
    End Sub
End Module

Beispiel 3: Entladen einer Batterie und Darstellung der Daten

In diesem Beispiel wird ein xGen MagnaDC Netzteil programmiert, um eine Batterie mit Sollwerten und Zeiten aus einer kommaseparierten Datei (.csv) zu entladen, den DC-Eingang mit den hochpräzisen Messbefehlen des Produkts zu messen und anschließend eine grafische Darstellung der Messdaten über die Zeit zu erstellen. Dieses Programm könnte weiter ausgebaut werden, um einen PDF-Testbericht zu generieren, der die Messdaten, Diagramme sowie Informationen von anderen Instrumenten integriert.

Für die Verarbeitung von CSV-Dateien und die Diagrammerstellung in VB.NET können Sie integrierte Klassen und den Namespace System.Windows.Forms.DataVisualization.Charting für die Diagrammerstellung verwenden.

Schritte:

  1. Erstellen Sie eine Windows Forms-Anwendung.
  2. Fügen Sie Ihrem Formular ein Chart-Steuerelement aus der Toolbox hinzu.
  3. Verwenden Sie den folgenden Code im Code-Behind Ihres Formulars.
Imports System.IO.Ports
Imports System.Threading
Imports System.IO
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1
    Private conn As SerialPort
    Private outputSamples As New List(Of OutputSample)()

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Initialize the serial connection with the default baud rate for xGen products
        conn = New SerialPort("COM8", 115200)
        conn.Open()

        ' Configure the MagnaDC for local control
        conn.WriteLine("CONF:SOUR 0")
        ' Enable the MagnaDC power supply output
        conn.WriteLine("OUTP:START")

        ' Read the CSV file containing current set points and durations
        Dim inputSamples As List(Of InputSample) = ReadCsvFile("example_profile.csv")

        ' Record the start time
        Dim testStartTime As DateTime = DateTime.Now

        ' Loop through each input sample
        For Each sample In inputSamples
            ' Set the current set point
            conn.WriteLine($"CURR {sample.CurrentSetPoint}")
            ' Calculate the stop time
            Dim stopTime As DateTime = DateTime.Now.AddSeconds(sample.Duration)

            ' Collect measurements until the stop time
            While DateTime.Now < stopTime
                ' Request measurements from the device
                conn.WriteLine("MEAS:ALL?")
                ' Read the response
                Dim response As String = conn.ReadLine()
                Dim measurements() As String = response.Split(","c)

                ' Parse and store the measurements
                If measurements.Length >= 3 Then
                    Dim curr As Double = Double.Parse(measurements(0))
                    Dim volt As Double = Double.Parse(measurements(1))
                    Dim timeElapsed As Double = (DateTime.Now - testStartTime).TotalSeconds
                    outputSamples.Add(New OutputSample With {
                        .Current = curr,
                        .Voltage = volt,
                        .Time = timeElapsed
                    })
                End If
                Thread.Sleep(500) ' Wait for 0.5 seconds
            End While
        Next

        ' Disable the MagnaDC power supply output
        conn.WriteLine("OUTP:STOP")
        ' Close the communication channel to the product
        conn.Close()

        ' Plot the data
        PlotData()
    End Sub

    Private Function ReadCsvFile(filePath As String) As List(Of InputSample)
        Dim samples As New List(Of InputSample)()
        Using reader As New StreamReader(filePath)
            ' Skip the header line
            reader.ReadLine()
            While Not reader.EndOfStream
                Dim line As String = reader.ReadLine()
                Dim values() As String = line.Split(","c)
                If values.Length >= 2 Then
                    samples.Add(New InputSample With {
                        .CurrentSetPoint = Double.Parse(values(0)),
                        .Duration = Double.Parse(values(1))
                    })
                End If
            End While
        End Using
        Return samples
    End Function

    Private Sub PlotData()
        ' Configure the chart control
        Chart1.Series.Clear()
        Chart1.ChartAreas.Clear()
        Chart1.ChartAreas.Add(New ChartArea("MainArea"))

        ' Create series for current and voltage
        Dim currentSeries As New Series("Current")
        currentSeries.ChartType = SeriesChartType.Line
        currentSeries.XValueType = ChartValueType.Double
        currentSeries.YValueType = ChartValueType.Double

        Dim voltageSeries As New Series("Voltage")
        voltageSeries.ChartType = SeriesChartType.Line
        voltageSeries.XValueType = ChartValueType.Double
        voltageSeries.YValueType = ChartValueType.Double

        ' Add data points to the series
        For Each sample In outputSamples
            currentSeries.Points.AddXY(sample.Time, sample.Current)
            voltageSeries.Points.AddXY(sample.Time, sample.Voltage)
        Next

        ' Add series to the chart
        Chart1.Series.Add(currentSeries)
        Chart1.Series.Add(voltageSeries)

        ' Set chart titles and labels
        Chart1.ChartAreas("MainArea").AxisX.Title = "Time (s)"
        Chart1.ChartAreas("MainArea").AxisY.Title = "Current (A)"
        Chart1.ChartAreas("MainArea").AxisY2.Title = "Voltage (V)"
        Chart1.ChartAreas("MainArea").AxisY2.Enabled = AxisEnabled.True

        ' Associate voltage series with secondary Y-axis
        voltageSeries.YAxisType = AxisType.Secondary
    End Sub

    ' Classes to hold input and output samples
    Private Class InputSample
        Public Property CurrentSetPoint As Double
        Public Property Duration As Double
    End Class

    Private Class OutputSample
        Public Property Current As Double
        Public Property Voltage As Double
        Public Property Time As Double
    End Class
End Class

Hinweise:

  • Ersetzen Sie "COM8" durch den entsprechenden seriellen Anschluss auf Ihrem System.
  • Stellen Sie sicher, dass die CSV-Datei example_profile.csv korrekt formatiert ist und sich im Verzeichnis der Anwendung befindet.
  • Die CSV-Datei sollte zwei Spalten enthalten: CurrentSetPoint und Duration, mit einer Kopfzeile.

Beispiel example_profile.csv:

CurrentSetPoint,Duration
50,10
100,15
150,20
200,25

Fazit

VB.NET bietet eine leistungsstarke und benutzerfreundliche Umgebung zur Steuerung programmierbarer Stromversorgungsprodukte von Magna-Power. Mit integrierten Klassen für serielle und TCP/IP-Kommunikation sowie Unterstützung für GPIB über Herstellerbibliotheken vereinfacht VB.NET den Prozess der Testautomatisierung, Datenerfassung und Ergebnisvisualisierung. Durch die Nutzung von SCPI-Befehlen und den Funktionen von VB.NET können Benutzer anspruchsvolle Steuerprogramme entwickeln, die auf ihre spezifischen Anwendungen zugeschnitten sind.

Für detaillierte SCPI-Befehlssätze und weitere Anpassungsmöglichkeiten konsultieren Sie das Benutzerhandbuch der jeweiligen Magna-Power Produktserie, die Sie verwenden.

Originally published Oktober 29, 2024

Stay connected and informed.

Subscribe to receive emails—no more than once per month—with new technical articles, product releases and factory updates from Magna-Power.

Have any questions or feedback?
We'd love to hear from you.
Contact us