4、测试脚本编写基础:Python与PyVISA库入门、SCPI指令基础、建立与仪器的通信

说实话,很多硬件工程师一听到「写脚本」就头大。我当年也是这样。

记得刚入行那会儿,测一台电源的整机效率,手动记录数据记了整整三天。后来老工程师丢给我一句:「你为什么不写个脚本让它自己跑?」

嗯,从那以后我就明白了——测试脚本不是锦上添花,是救命稻草。

4.1 为什么选Python?

你可能会问:那么多语言,为什么偏偏是Python?

我个人习惯用Python做测试脚本,原因有三:

  • 上手快——语法简单,没写过代码的人两周也能跑起来
  • 生态好——PyVISA、NumPy、Matplotlib,要啥有啥
  • 调试方便——交互式环境,写一行测一行,不用编译

我在项目中遇到过一位同事,用C#写仪器控制,光配置环境就花了两天。我用Python,半小时搞定。你想想看,时间花在哪更值?

4.2 PyVISA库入门

PyVISA是什么?说白了,它就是Python和仪器之间的「翻译官」。

你的仪器说SCPI,Python说代码。PyVISA在中间搭个桥,两边就能聊天了。

4.2.1 安装PyVISA

安装很简单,一行命令搞定:

pip install pyvisa

如果你用的是NI-VISA或者Keysight VISA,还需要装对应的后端:

pip install pyvisa-py
我的小建议: 新手先用NI-VISA后端,兼容性最好。我踩过pyvisa-py的坑,有些老仪器不认。

4.2.2 基本操作流程

PyVISA的操作流程其实就四步:

  1. 导入库——import pyvisa
  2. 打开资源管理器——rm = pyvisa.ResourceManager()
  3. 连接仪器——inst = rm.open_resource('TCPIP0::192.168.1.100::inst0::INSTR')
  4. 发送指令/读取数据——inst.write() / inst.query()

看,是不是很简单?

4.3 SCPI指令基础

SCPI(Standard Commands for Programmable Instruments)是仪器听得懂的语言。

它有一套标准语法,但每家厂商都会加点私货。嗯,这里要注意:同一功能在不同品牌仪器上,指令可能不一样

4.3.1 常见SCPI指令

功能 SCPI指令 说明
复位仪器 *RST 恢复出厂设置
清除状态 *CLS 清空错误队列
设置电压 VOLT 5.0 设置输出电压为5V
读取电压 MEAS:VOLT? 问号表示查询
设置电流 CURR 1.0 设置输出电流为1A
读取电流 MEAS:CURR? 返回当前电流值
打开输出 OUTP ON 使能输出通道
关闭输出 OUTP OFF 关闭输出通道
我曾经踩过的坑: 有一次用*RST复位一台老电源,结果它把校准参数也清了。从那以后,我复位前一定会先保存当前配置。

4.3.2 SCPI语法规则

SCPI指令有几个基本规则,记住就行:

  • 冒号分层——比如 MEASure:VOLTage:DC?,冒号表示层级关系
  • 问号查询——指令末尾加问号,表示「我要读数据」
  • 分号分隔——多条指令用分号隔开,比如 VOLT 5;CURR 1
  • 大小写不敏感——VOLTvolt 一样,但建议统一大写

4.4 建立与仪器的通信

理论说完了,咱们来点实战。

4.4.1 查找仪器地址

第一步,你得知道仪器在哪。用这个脚本扫一下:

import pyvisa

rm = pyvisa.ResourceManager()
resources = rm.list_resources()
print("找到的仪器:")
for res in resources:
    print(res)

输出大概长这样:

找到的仪器:
TCPIP0::192.168.1.100::inst0::INSTR
USB0::0x2A8D::0x1E01::MY59001234::INSTR
GPIB0::5::INSTR

看到没?TCPIP是网口,USB是USB口,GPIB是老式并口。根据你的连接方式选一个。

4.4.2 完整通信示例

下面是一个完整的例子,控制一台直流电源输出5V/1A,然后读取实际值:

import pyvisa
import time

# 1. 连接仪器
rm = pyvisa.ResourceManager()
psu = rm.open_resource('TCPIP0::192.168.1.100::inst0::INSTR')

# 2. 设置超时(很重要!)
psu.timeout = 5000  # 5秒

# 3. 复位仪器
psu.write('*RST')
time.sleep(1)

# 4. 设置电压和电流
psu.write('VOLT 5.0')
psu.write('CURR 1.0')

# 5. 打开输出
psu.write('OUTP ON')
time.sleep(0.5)

# 6. 读取实际值
actual_voltage = psu.query('MEAS:VOLT?')
actual_current = psu.query('MEAS:CURR?')

print(f"设定值:5V / 1A")
print(f"实际值:{actual_voltage.strip()}V / {actual_current.strip()}A")

# 7. 关闭输出
psu.write('OUTP OFF')

# 8. 断开连接
psu.close()
关键点: 每次写指令后加个 time.sleep(),给仪器一点反应时间。我见过太多人因为没加延时,读回来的数据全是空的。

4.4.3 常见问题与避坑

  • 连接超时——检查IP地址对不对,ping一下试试
  • 读不到数据——大概率是没加问号,或者仪器还没准备好
  • 指令报错——查手册!不同厂商的SCPI指令有差异
  • 乱码——编码问题,试试 inst.read_termination = '\n'
我的调试习惯: 先用NI MAX或者Keysight Connection Expert手动发一条指令,确认仪器能正常响应。然后再写Python脚本。这样能快速定位问题是出在硬件还是软件。

4.5 本章知识体系

下面这张图,是我自己总结的测试脚本编写知识框架。你看一眼,心里就有数了:

测试脚本编写知识体系 Python基础 PyVISA库 SCPI指令 语法基础 数据类型 文件操作 安装配置 资源管理 读写操作 标准指令 厂商扩展 查询语法 仪器通信与自动化测试 整机功率曲线测试数据

说白了,这三块东西就是测试脚本的「三驾马车」。Python是骨架,PyVISA是手脚,SCPI是嘴巴。三者配合好了,你就能让仪器乖乖听话。

嗯,今天就先聊到这儿。记住:写脚本不是为了炫技,是为了让自己少加班。我当年要是早点学会这些,也不至于在实验室里熬那么多通宵了。


公众号:蓝海资料掘金营,微信deep3321