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
4.2.2 基本操作流程
PyVISA的操作流程其实就四步:
- 导入库——import pyvisa
- 打开资源管理器——rm = pyvisa.ResourceManager()
- 连接仪器——inst = rm.open_resource('TCPIP0::192.168.1.100::inst0::INSTR')
- 发送指令/读取数据——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 | 关闭输出通道 |
4.3.2 SCPI语法规则
SCPI指令有几个基本规则,记住就行:
- 冒号分层——比如
MEASure:VOLTage:DC?,冒号表示层级关系 - 问号查询——指令末尾加问号,表示「我要读数据」
- 分号分隔——多条指令用分号隔开,比如
VOLT 5;CURR 1 - 大小写不敏感——
VOLT和volt一样,但建议统一大写
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'
4.5 本章知识体系
下面这张图,是我自己总结的测试脚本编写知识框架。你看一眼,心里就有数了:
说白了,这三块东西就是测试脚本的「三驾马车」。Python是骨架,PyVISA是手脚,SCPI是嘴巴。三者配合好了,你就能让仪器乖乖听话。
嗯,今天就先聊到这儿。记住:写脚本不是为了炫技,是为了让自己少加班。我当年要是早点学会这些,也不至于在实验室里熬那么多通宵了。
公众号:蓝海资料掘金营,微信deep3321