@TOC
使用python控制仪器【控制苏州联讯源表SMU】
搭建环境
1、安装python
- 下载python
链接: https://www.python.org/downloads/windows/ 安装python
选中自定义安装,勾选中“Add python3.7 to path”,可自动增加环境变量,不需要手动添加
之后一直点下一步就可以了。- 查看python是否安装成功
win+R 运行cmd,输入“python”
安装成功后可输入“print”测试,如果打印成功,代表安装成功了
- 查看python是否安装成功
2、安装PyCharm
- 下载PyCharm
网址:
打开网址,如图操作,点击Community即可自动下载:
https://www.jetbrains.com/zh-cn/pycharm/download/#section=win... 安装pycharm
双击安装文件
可选择自定义路径安装
全勾上
一直点击下一步,安装成功。3、使用PyCharm创建项目
新建项目
创建成功,右键单击点击项目,可选择创建你的第一个py文件,如图:
填写模块名称:
鼠标右键空白处,选择run,可调试运行文件:
运行成功、失败,下方可查看运行日志,如图:4、添加VISA资源
- 打开NI MAX,添加设备资源
添加一个网口设备
填入设备的ip地址
ip address:192.168.170.8
port:8807
添加成功
5、安装PyVisa
PyVisa是用来控制各种各样的测量仪器的Python包,适用诸如GPIB、RS232、USB、Ethernet等接口。
安装包有两种方法
方法1
打开终端,输入安装pyvisa库的指令,安装成功后,会有安装成功的提示。$ pip install -U pyvisa
- 方法2
打开python packages选项,搜索pyvisa,点击安装
连接设备
6、连接设备
输入下面的代码
# 导入库
import pyvisa
# 创建 VISA资源管理器的对象。
rm = pyvisa.ResourceManager()
# 打开指定资源名称的设备。一旦设备被打开,您就可以使用返回的设备对象进行与设备的通信和控制。
my_Instrument = rm.open_resource('TCPIP0::192.168.170.8::8807::SOCKET')
# 配置通讯超时时间
my_Instrument.timeout = 5000
# 配置截止符
my_Instrument.read_termination = '\n'
# 查询设备信息
instrumentMessage=my_Instrument.query('*IDN?')
# 打印设备信息
print(instrumentMessage)
运行代码
按 Shift+F10 执行或者点击绿色的运行按钮
运行结果,返回设备的基本信息
控制设备
7、一个更复杂的例程
下面的例程展示,如何用SCPI命令控制S3022F完成一个电压扫描,start为1V,stop为5V,扫描10个点,线性扫描,将测量电压数据打印出来。
import pyvisa
import time
rm = pyvisa.ResourceManager()
my_Instrument = rm.open_resource('TCPIP0::192.168.170.8::8807::SOCKET')
my_Instrument.timeout = 5000
my_Instrument.read_termination = '\n'
instrumentMessage=my_Instrument.query('*IDN?')
print(instrumentMessage)
#发送SCPI指令
my_Instrument.write(':SOUR:FUNC:MODE VOLT,(@101)')
my_Instrument.write(':SOUR:VOLT:MODE SWE,(@101)')
my_Instrument.write(':SOUR:FUNC:SHAP DC,(@101)')
my_Instrument.write(':SOUR:SWE:SPAC LIN,(@101)')
my_Instrument.write(':SOUR:VOLT:RANG 10,(@101)')
my_Instrument.write(':SOUR:CURR:RANG 0.01,(@101)')
my_Instrument.write(':SENS:CURR:PROT 0.01,(@101)')
my_Instrument.write(':SOUR:VOLT:STAR 1,(@101)')
my_Instrument.write(':SOUR:VOLT:STOP 5,(@101)')
my_Instrument.write(':TRIG:COUN 10,(@101)')
my_Instrument.write(':SOUR:SWE:POIN 10,(@101)')
my_Instrument.write(':SENS:VOLT:NPLC 1,(@101)')
my_Instrument.write(':OUTP 1,(@101)')
my_Instrument.write(':INIT (@101)')
#循环读取状态寄存器,读取到1024,扫描完成,跳出循环,读取电压值
while (1):
time.sleep(1)
end = my_Instrument.query(':STAT:OPER:COND? (@101)')
print(end)
if (end == '1024'):
break
# 获取扫描电压值
voltageList = my_Instrument.query_ascii_values(":FETC:VOLT?")
print(voltageList)
运行结果如下,运行成功后,可以打印出扫描测量出的电压值。
读写数据
8、将数据写入excel
测量的数据一般会通过文件保存,这里采用excel进行保存,使用最常用的读写excel的python库。
安装所需要的软件包xlwings,通道python packages安装或者通过指令安装
pip install xlwings
输入如下指令
import pyvisa
import time
import xlwings as xw
rm = pyvisa.ResourceManager()
my_Instrument = rm.open_resource('TCPIP0::192.168.170.8::8807::SOCKET')
my_Instrument.timeout = 5000
my_Instrument.read_termination = '\n'
instrumentMessage=my_Instrument.query('*IDN?')
print(instrumentMessage)
#发送SCPI指令
my_Instrument.write(':SOUR:FUNC:MODE VOLT,(@101)')
my_Instrument.write(':SOUR:VOLT:MODE SWE,(@101)')
my_Instrument.write(':SOUR:FUNC:SHAP DC,(@101)')
my_Instrument.write(':SOUR:SWE:SPAC LIN,(@101)')
my_Instrument.write(':SOUR:VOLT:RANG 10,(@101)')
my_Instrument.write(':SOUR:CURR:RANG 0.01,(@101)')
my_Instrument.write(':SENS:CURR:PROT 0.01,(@101)')
my_Instrument.write(':SOUR:VOLT:STAR 1,(@101)')
my_Instrument.write(':SOUR:VOLT:STOP 5,(@101)')
my_Instrument.write(':TRIG:COUN 10,(@101)')
my_Instrument.write(':SOUR:SWE:POIN 10,(@101)')
my_Instrument.write(':SENS:VOLT:NPLC 1,(@101)')
my_Instrument.write(':OUTP 1,(@101)')
my_Instrument.write(':INIT (@101)')
#循环读取状态寄存器,读取到1024,扫描完成,跳出循环,读取电压值
while (1):
time.sleep(1)
end = my_Instrument.query(':STAT:OPER:COND? (@101)')
print(end)
if (end == '1024'):
break
# 创建新文件
wb = xw.Book()
# 添加名为"voltage"的工作表
wb.sheets.add('voltage')
# 取消活动工作表选择
wb.sheets[0].select()
# 获取要写入的数据
voltageList = my_Instrument.query_ascii_values(":FETC:VOLT?")
# 将数据写入Excel文件
sheet = wb.sheets['voltage']
sheet.range('A1').value = '电压(V)'
for i in range(len(voltageList)):
sheet.range((i+2, 1)).value = voltageList[i]
# 修改保存路径和文件名
save_path = 'D:/test.xlsx'
# 保存并关闭文件
wb.save(save_path)
wb.close()
print(f"已成功创建名为 '{save_path}' 的Excel文件,并在其中添加了名为 'voltage' 的工作表,并将数据写入该工作表。")
运行成功后显示如下信息,也可以打开excel查看数据
9、显示扫描波形
通过将数据通过图形的方式显示出来可以更加直观。
需要安装Matplotlib库
Matplotlib是一个用于创建高质量图形的Python库。它提供了广泛的数据可视化功能,使用户能够以各种方式呈现数据。
pip install matplotlib
执行代码
import pyvisa
import time
import xlwings as xw
import matplotlib.pyplot as plt
rm = pyvisa.ResourceManager()
my_Instrument = rm.open_resource('TCPIP0::192.168.170.8::8807::SOCKET')
my_Instrument.timeout = 5000
my_Instrument.read_termination = '\n'
instrumentMessage=my_Instrument.query('*IDN?')
print(instrumentMessage)
#发送SCPI指令
my_Instrument.write(':SOUR:FUNC:MODE VOLT,(@101)')
my_Instrument.write(':SOUR:VOLT:MODE SWE,(@101)')
my_Instrument.write(':SOUR:FUNC:SHAP DC,(@101)')
my_Instrument.write(':SOUR:SWE:SPAC LIN,(@101)')
my_Instrument.write(':SOUR:VOLT:RANG 10,(@101)')
my_Instrument.write(':SOUR:CURR:RANG 0.01,(@101)')
my_Instrument.write(':SENS:CURR:PROT 0.01,(@101)')
my_Instrument.write(':SOUR:VOLT:STAR 1,(@101)')
my_Instrument.write(':SOUR:VOLT:STOP 5,(@101)')
my_Instrument.write(':TRIG:COUN 10,(@101)')
my_Instrument.write(':SOUR:SWE:POIN 10,(@101)')
my_Instrument.write(':SENS:VOLT:NPLC 1,(@101)')
my_Instrument.write(':OUTP 1,(@101)')
my_Instrument.write(':INIT (@101)')
#循环读取状态寄存器,读取到1024,扫描完成,跳出循环,读取电压值
while (1):
time.sleep(1)
end = my_Instrument.query(':STAT:OPER:COND? (@101)')
print(end)
if (end == '1024'):
break
# 创建新文件
wb = xw.Book()
# 添加名为"voltage"的工作表
wb.sheets.add('voltage')
# 取消活动工作表选择
wb.sheets[0].select()
# 获取要写入的数据
voltageList = my_Instrument.query_ascii_values(":FETC:VOLT?")
currentList = my_Instrument.query_ascii_values(":FETC:CURR?")
# 将数据写入Excel文件
sheet = wb.sheets['voltage']
sheet.range('A1').value = '电压(V)'
for i in range(len(voltageList)):
sheet.range((i+2, 1)).value = voltageList[i]
# 修改保存路径和文件名
save_path = 'D:/test.xlsx'
# 保存并关闭文件
wb.save(save_path)
wb.close()
print(f"已成功创建名为 '{save_path}' 的Excel文件,并在其中添加了名为 'voltage' 的工作表,并将数据写入该工作表。")
#*************************显示扫描波形***************************************************#
x = voltageList
y = currentList
# 创建图形并绘制数据,数据源是电压,纵坐标是电压值,横坐标是数据的索引
plt.plot(x, marker='o')
# 添加标题和标签
plt.title('Voltage Data')
plt.xlabel('index')
plt.ylabel('Voltage (V)')
plt.grid()
#创建图形并绘制数据,数据源是电压,横坐标是电压值,纵坐标是数据的索引
(fig, ax1) = plt.subplots()
ax1.plot(x, y, marker='o')
ax1.grid()
# 设置子图的横纵坐标轴标签
ax1.set_xlabel('Voltage')
ax1.set_ylabel('Current')
# 设置子图的标题
ax1.set_title('Voltage vs. Current')
# 显示图形窗口
plt.show()
---
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。