Knowledge Base

Programación de instrumentación con VB.NET

Este artículo de base de conocimiento presenta la programación de un producto de potencia programable de Magna-Power utilizando el lenguaje de programación VB.NET. VB.NET es un lenguaje versátil integrado en el Microsoft .NET Framework, conocido por su simplicidad y facilidad de uso en el desarrollo de aplicaciones Windows. Sus robustas características lo convierten en una excelente opción para crear programas que controlen, realicen mediciones e incluso generen gráficos para instrumentación programable. Además, el amplio soporte de Magna-Power para los Comandos Estándar para Instrumentación Programable (SCPI) significa que los productos de la empresa pueden controlarse fácilmente en VB.NET con comandos simples e intuitivos.

Los productos de Magna-Power soportan una variedad de interfaces de comunicación, incluyendo RS-232, TCP/IP Ethernet, USB, RS-485 e IEEE-488 GPIB. A pesar de estas diferentes interfaces, los comandos SCPI son idénticos para una serie de productos en particular. Los comandos SCPI están documentados en el manual de usuario de la serie de productos correspondiente. Al crear un programa en VB.NET, la única diferencia entre interfaces será la configuración de la conexión del dispositivo.

Interfaces de comunicación

Conexión USB, serial o RS-485

Para conexiones USB, serial o RS-485, VB.NET utiliza la clase System.IO.Ports.SerialPort para crear una conexión serial con el instrumento:

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

La velocidad de baudios serial para productos xGen es 115200, mientras que la velocidad de baudios serial para productos no xGen es 19200. El nombre del puerto es definido por su sistema operativo. En Windows, este puerto se puede encontrar en el Administrador de dispositivos.

El envío y recepción posterior de comandos a través de la conexión serial será de la siguiente manera:

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

Conexión TCP/IP Ethernet

Para conexiones TCP/IP Ethernet, VB.NET utiliza la clase 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

El envío y recepción posterior de comandos a través de la conexión TCP/IP Ethernet será de la siguiente manera:

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

Conexión IEEE-488 GPIB

Para conexiones IEEE-488 GPIB, puede utilizar bibliotecas proporcionadas por el fabricante de su hardware GPIB, como NI-488.2 de National Instruments o IO Libraries Suite de Keysight. En VB.NET, puede utilizar la biblioteca VISA.NET para interactuar con instrumentos GPIB.

Ejemplo usando VISA.NET:

Primero, asegúrese de tener instalada la biblioteca VISA.NET y agregue una referencia a Ivi.Visa en su proyecto.

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)

Ejemplos detallados

Los siguientes ejemplos proporcionan programas VB.NET más detallados utilizando una fuente de alimentación xGen MagnaDC. La programación de una fuente de alimentación DC programable MagnaDC no xGen en VB.NET será casi idéntica, con cambios sutiles en los comandos SCPI según lo documentado en el manual de usuario de la serie de productos correspondiente.

Ejemplo 1: Control básico por TCP/IP Ethernet

Este ejemplo básico crea una conexión TCP/IP Ethernet, envía algunos comandos de inicialización, habilita la salida DC, eleva el nivel de corriente a 5 A, espera 20 segundos y luego se apaga.

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

Ejemplo 2: Conexión serial con puntos de ajuste de corriente

Este ejemplo crea una conexión serial con el producto, determina qué producto es, y luego envía una secuencia de comandos de corriente con 20 segundos entre cada nivel de corriente. Este tipo de programa puede expandirse para recorrer valores de voltaje, potencia y resistencia también.

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

Ejemplo 3: Descarga de una batería y representación gráfica de datos

En este ejemplo, una fuente de alimentación DC xGen MagnaDC se programa para descargar una batería utilizando puntos de ajuste y tiempos leídos desde un archivo de valores separados por comas (.csv), medir la entrada DC utilizando los comandos de medición de alta precisión del producto y luego proporcionar una gráfica de los datos medidos en función del tiempo. Este programa podría ampliarse para generar un informe de prueba en PDF, integrando los datos medidos, las gráficas, así como información de otros instrumentos.

Para manejar archivos CSV y gráficas en VB.NET, puede utilizar las clases integradas y el espacio de nombres System.Windows.Forms.DataVisualization.Charting para la creación de gráficos.

Pasos:

  1. Cree una aplicación de Windows Forms.
  2. Agregue un control Chart a su formulario desde la caja de herramientas.
  3. Utilice el siguiente código en el código subyacente de su formulario.
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

Notas:

  • Reemplace "COM8" con el puerto serial apropiado en su sistema.
  • Asegúrese de que el archivo CSV example_profile.csv tenga el formato correcto y se encuentre en el directorio de la aplicación.
  • El archivo CSV debe tener dos columnas: CurrentSetPoint y Duration, con una fila de encabezado.

Ejemplo de example_profile.csv:

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

Conclusión

VB.NET proporciona un entorno potente y fácil de usar para controlar los productos de alimentación programables de Magna-Power. Con clases integradas para comunicación serial y TCP/IP, así como soporte para GPIB a través de bibliotecas del fabricante, VB.NET simplifica el proceso de automatización de pruebas, recopilación de datos y visualización de resultados. Al aprovechar los comandos SCPI y las funcionalidades de VB.NET, los usuarios pueden desarrollar programas de control sofisticados adaptados a sus aplicaciones específicas.

Para obtener conjuntos detallados de comandos SCPI y mayor personalización, consulte el manual de usuario de la serie específica de productos Magna-Power que esté utilizando.

Originally published octubre 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