使用Python进行仪器编程
本知识库文章介绍如何使用Python编程语言对Magna-Power可编程电源产品进行编程控制。Python是一种流行的编程语言,以其简洁性、代码可读性以及无需特殊编译而著称。Python易于使用且学习曲线平缓,是创建可编程仪器控制程序、进行测量甚至生成图表的优秀语言。此外,Magna-Power对可编程仪器标准命令(SCPI)的广泛支持,意味着公司的产品可以在Python中通过简单直观的命令轻松控制。
Magna-Power的产品支持多种不同的通信接口,包括:RS-232、TCP/IP以太网、USB、RS-485和IEEE-488 GPIB。尽管接口不同,但对于特定产品系列,SCPI命令是相同的。SCPI命令记录在相应产品系列的用户手册中。在创建Python程序时,不同接口之间的唯一区别在于设备连接的设置。
USB、串口或RS-485将使用pySerial创建与仪器的串行连接:
import serial
conn = serial.Serial(port='COM4', baudrate=115200)
The serial baud rate for MagnaLOAD products is 115200, while the serial baud rate for MagnaDC products is 19200. The port location is defined by your operating system. In Windows, this port can be found in the Device Manager.
Subsequent sending and receiving of commands over serial connection will be as follows:
conn.write('*IDN?\n'.encode())
print(conn.readline())
TCP/IP以太网连接设置如下:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.86', 50505))
后续通过TCP/IP以太网连接发送和接收命令的方式如下:
s.sendall('*IDN?\n'.encode())
print(s.recv(4096))
IEEE-488 GPIB连接需要PyVISA,连接方式如下:
import visa
rm = visa.ResourceManager()
inst = rm.open_resource('GPIB0::12::INSTR')
后续通过IEEE-488 GPIB连接发送和接收命令的方式如下:
print(inst.query("*IDN?"))
The following examples provide more in-depth example Python programs using a MagnaLOAD DC electronic load. Programming a MagnaDC programmable DC power supply in Python will be almost identical, with subtle changes to the SCPI commands as documented in the respective product series’ user manual.
The following basic example creates a TCP/IP Ethernet connection, sends some initialization commands, enables the DC input, raises the current level to 5 Adc, waits 20 seconds, then shuts down.
# Import time: Time access and conversions to allow for pausing
# Import socket: Low-level networking interface to allow for socket programming
import time, socket
# Create socket object s with (host, port)
# Define host as hostname in Internet domain
# Define socket type as stream, allowing a port number to be defined
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connect to product's IP address address at default 50505 socket
s.connect(('192.168.0.86', 50505))
# Send SCPI command requesting the product to identify itself
s.sendall('*IDN?\n'.encode())
# Receive the product's response and display it in the terminal
print(s.recv(4096))
# Send SCPI command to configure the MagnaDC for local control
s.sendall('CONF:SOUR 0\n'.encode())
# Send SCPI command to set the DC output current to 0 Adc before enabling DC input
s.sendall('CURR 0\n'.encode())
# Send SCPI command to enable the MagnaDC power supply output
s.sendall('OUTP:START\n'.encode())
# Send SCPI command to set the DC input current to 5 Adc
s.sendall('CURR 5\n'.encode())
# Wait 20 seconds
time.sleep(20)
# Send SCPI command to disable the DC output
s.sendall('OUTP:STOP\n'.encode())
# Close the communication channel to the product
s.close()
以下示例创建与产品的串行连接,识别产品型号,然后发送一系列电流命令,每个电流级别之间间隔20秒。此类程序可以扩展为循环设置电压、功率和电阻值。
# Import pySerial, which encapsulates the serial port access
# Import time: Time access and conversions to allow for pausing
import serial, time
# Create serial connection object with default baudrate for MagnaLOADs
conn = serial.Serial(port='COM4', baudrate=115200)
# Send SCPI command requesting the product to identify itself
conn.write('*IDN?\n'.encode())
# Receive the product's response and display it in the terminal
print conn.readline()
# Create array of current set points
currSetPoints = [50, 100, 150, 250]
# Send SCPI command to configure the MagnaDC power supply for local control
s.sendall('CONF:SOUR 0\n'.encode())
# Send SCPI command to enable the MagnaDC power supply
conn.write('OUTP:START\n'.encode())
# For each entry in currSetPoints array
# Print static text and current set point to the terminal
# Send the new set point to the MagnaDC power supply
# Wait 20 seconds
for currSetpoint in currSetPoints:
print 'Setting Current to %s A' % currSetpoint
conn.write('CURR {0}\n'.format(currSetpoint).encode())
time.sleep(20)
# Send SCPI command to disable the MagnaDC power supply output
conn.write('OUTP:STOP\n'.encode())
# Close the communication channel to the product
conn.close()
In the final in-depth example, a MagnaLOAD is programmed to discharge a battery using set points and times read from a comma-separate value (.csv) file, measure the DC input using the product’s high accuracy measurement commands, and then provide a plot of the measured data versus time. This program could be further expanded to generate a PDF test report, integrating the measured data, plots, as well as information from other instruments.
# Import plotting library Matplotlib
# Import .csv parser
# Import pySerial, which encapsulates the access for the serial port
# Import time: Time access and conversions to allow for pausing
# Import numpy for mathemetical manipulation of arrays
import matplotlib.pyplot as plt
import csv, serial, time
import numpy as np
# Create serial connection object with default baudrate for xGen products
conn = serial.Serial(port='COM8', baudrate=115200)
# Create an empty numpy data array 999 rows, 4 columns
outputSamples = np.empty([999, 3])
iSample = 0
# Send SCPI command to configure the MagnaDC for local control
s.sendall('CONF:SOUR 0\n'.encode())
# Send SCPI command to enable the MagnaDC power supply output
conn.write('OUTP:START\n'.encode())
# Open data stream to .csv file. .csv has two columns:
# Column 1: Current set point in amperes
# Column 2: Time in seconds
# The first row is headers
with open('example_profile.csv', 'r') as csvfile:
# Read the .csv file using comma (,) as the delimeter
dataset = csv.reader(csvfile, delimiter=',')
# Skip the header row
next(dataset)
# Split the dataset up to rows
rows = list(dataset)
# Create an empty array for measurements, the same length as .csv row numbers
inputSamples = np.empty([len(rows), 2], dtype=float)
# Record the time that the measurements began
testStartTime = time.time()
# Run for loop while there are still rows of data left
for idx, data in enumerate(rows):
# Store row data to array
inputSamples[idx] = [data[0], data[1]]
# Send SCPI command to MagnaDC power supply to current set point at present row
conn.write('CURR {0}\n'.format(data[0]).encode())
# Determine how long the MagnaDC power supply should stay at this current set point
stopTime = testStartTime + int(data[1])
# Run while loop while there is still time left
while time.time() < stopTime:
# Send SCPI command to MagnaDC Power supply to measure all DC output variables
conn.write('MEAS:ALL?\n')
# Get the MagnaDC power supply's response and split it up into its respective variables
[curr, volt, pwr] = (conn.readline()).split(',')
# Round measurements and store them to array, along with with time
outputSamples[iSample] = ([round(float(curr), 2), round(float(volt), 2), round(time.time() - testStartTime, 2)])
iSample += 1
time.sleep(0.5)
# Send SCPI command to disable Magna DC power supply output
conn.write('OUTP:STOP\n'.encode())
# Create a plot series of current vs. time
plt.subplot(2, 1, 1)
plt.plot(outputSamples[0:iSample, 2], outputSamples[0:iSample, 0], 'r--')
plt.ylabel('Output Current(A)')
plt.title('I-V Profile')
# Create a plot series of voltage vs. time
plt.subplot(2, 1, 2)
plt.plot(outputSamples[0:iSample, 2], outputSamples[0:iSample, 1], 'b--')
plt.xlabel('Time (s)')
plt.ylabel('Output Voltage(V)')
# Show the plot
plt.show()