Knowledge Base

Programmazione della strumentazione con VB.NET

Questo articolo della knowledge base introduce la programmazione di un prodotto programmabile Magna-Power utilizzando il linguaggio di programmazione VB.NET. VB.NET è un linguaggio versatile integrato nel Microsoft .NET Framework, noto per la sua semplicità e facilità d'uso nello sviluppo di applicazioni Windows. Le sue funzionalità avanzate lo rendono una scelta eccellente per creare programmi per controllare, effettuare misurazioni e persino creare grafici per la strumentazione programmabile. Inoltre, l'ampio supporto di Magna-Power per i comandi standard per la strumentazione programmabile (SCPI) significa che i prodotti dell'azienda possono essere facilmente controllati in VB.NET con comandi semplici e intuitivi.

I prodotti Magna-Power supportano una varietà di interfacce di comunicazione, tra cui RS-232, TCP/IP Ethernet, USB, RS-485 e IEEE-488 GPIB. Nonostante queste diverse interfacce, i comandi SCPI sono identici per una particolare serie di prodotti. I comandi SCPI sono documentati nel manuale utente della rispettiva serie di prodotti. Quando si crea un programma VB.NET, l'unica differenza tra le interfacce sarà rappresentata dalle impostazioni per la connessione del dispositivo.

Interfacce di comunicazione

Connessione USB, seriale o RS-485

Per le connessioni USB, seriali o RS-485, VB.NET utilizza la classe System.IO.Ports.SerialPort per creare una connessione seriale allo strumento:

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

La velocità di trasmissione seriale (baud rate) per i prodotti xGen è 115200, mentre la velocità di trasmissione seriale per i prodotti non xGen è 19200. Il nome della porta è definito dal sistema operativo. In Windows, questa porta può essere trovata nella Gestione dispositivi.

L'invio e la ricezione successivi dei comandi tramite la connessione seriale avverranno come segue:

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

Connessione TCP/IP Ethernet

Per le connessioni TCP/IP Ethernet, VB.NET utilizza la classe 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

L'invio e la ricezione successivi dei comandi tramite la connessione TCP/IP Ethernet avverranno come segue:

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

Connessione IEEE-488 GPIB

Per le connessioni IEEE-488 GPIB, è possibile utilizzare le librerie fornite dal produttore dell'hardware GPIB, come NI-488.2 di National Instruments o IO Libraries Suite di Keysight. In VB.NET, è possibile utilizzare la libreria VISA.NET per interfacciarsi con gli strumenti GPIB.

Esempio con VISA.NET:

Innanzitutto, assicurarsi di avere la libreria VISA.NET installata e aggiungere un riferimento a Ivi.Visa nel progetto.

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)

Esempi approfonditi

I seguenti esempi forniscono programmi VB.NET più dettagliati utilizzando un alimentatore xGen MagnaDC. La programmazione di un alimentatore programmabile DC MagnaDC non xGen in VB.NET sarà pressoché identica, con lievi modifiche ai comandi SCPI come documentato nel manuale utente della rispettiva serie di prodotti.

Esempio 1: Controllo base tramite TCP/IP Ethernet

Questo esempio base crea una connessione TCP/IP Ethernet, invia alcuni comandi di inizializzazione, abilita l'uscita DC, aumenta il livello di corrente a 5 A, attende 20 secondi, quindi effettua lo spegnimento.

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

Esempio 2: Connessione seriale con valori di corrente impostati

Questo esempio crea una connessione seriale al prodotto, identifica il tipo di prodotto e quindi invia una sequenza di comandi di corrente con 20 secondi di intervallo tra ciascun livello di corrente. Questo tipo di programma può essere ampliato per ciclare anche attraverso valori di tensione, potenza e resistenza.

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

Esempio 3: Scarica di una batteria e rappresentazione grafica dei dati

In questo esempio, un alimentatore xGen MagnaDC viene programmato per scaricare una batteria utilizzando set point e tempi letti da un file a valori separati da virgola (.csv), misurare l'ingresso DC tramite i comandi di misura ad alta precisione del prodotto e quindi fornire un grafico dei dati misurati in funzione del tempo. Questo programma potrebbe essere ulteriormente ampliato per generare un report di test in PDF, integrando i dati misurati, i grafici e le informazioni provenienti da altri strumenti.

Per gestire file CSV e grafici in VB.NET, è possibile utilizzare le classi integrate e il namespace System.Windows.Forms.DataVisualization.Charting per la creazione di grafici.

Passaggi:

  1. Creare un'applicazione Windows Forms.
  2. Aggiungere un controllo Chart al modulo dalla Casella degli strumenti.
  3. Utilizzare il seguente codice nel code-behind del modulo.
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

Note:

  • Sostituire "COM8" con la porta seriale appropriata del proprio sistema.
  • Assicurarsi che il file CSV example_profile.csv sia formattato correttamente e posizionato nella directory dell'applicazione.
  • Il file CSV deve avere due colonne: CurrentSetPoint e Duration, con una riga di intestazione.

Esempio di example_profile.csv:

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

Conclusione

VB.NET offre un ambiente potente e intuitivo per il controllo dei prodotti di alimentazione programmabili Magna-Power. Grazie alle classi integrate per la comunicazione seriale e TCP/IP, nonché al supporto GPIB tramite le librerie del produttore, VB.NET semplifica il processo di automazione dei test, raccolta dati e visualizzazione dei risultati. Sfruttando i comandi SCPI e le funzionalità di VB.NET, gli utenti possono sviluppare programmi di controllo sofisticati su misura per le proprie applicazioni specifiche.

Per set di comandi SCPI dettagliati e ulteriori personalizzazioni, consultare il manuale utente della serie specifica di prodotti Magna-Power in uso.

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