分享一段文字,避免自己成为高知识低文化的工程师:
在这个可以通过AI制作一切的时代,还是坚持手打码字(代码也可以AI)。不知道该说自己是老古董,不会与时俱进?还是说有所坚持是对的。
自动化测试,说白了就是让仪器自己干活。 你想想看,一个产品要测几百个频点、几十种模式,手动按按钮能按到怀疑人生。我当年刚入行时,就干过这种傻事------拿着万用表一个一个点,结果测到第50个时手一抖,数据全乱了。从那以后,我铁了心要学自动化。 这一章,咱们就聊聊怎么用Python控制仪器。别怕,门槛不高,但学会了,效率能翻十倍。
Python基础回顾:够用就行
Python这东西,语法简单,上手快。做硬件测试,不需要你成为Python高手,但有几个基础点必须熟。
变量与数据类型
说白了,变量就是给数据起个名字。测试中常用的是字符串和数字。
python
# 字符串:仪器返回的原始数据
raw_data = "1.2345E+02"
# 浮点数:转换后的数值
voltage = float(raw_data)
print(f"电压值:{voltage} V")
嗯,这里要注意:仪器返回的往往是科学计数法字符串,记得转成float再计算。
列表与循环
批量测试时,列表和循环是绝配。比如你要测10个频点:
python
freq_list = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000] # 单位MHz
for freq in freq_list:
print(f"正在测试 {freq} MHz...")
# 这里调用仪器设置频率
# 读取数据
# 保存结果
我习惯用for循环,简单直观。while循环偶尔也用,比如等待仪器稳定时。
函数封装 别把所有代码堆在一起。把重复操作写成函数,清爽又易维护。
python
def set_frequency(freq_mhz):
"""设置信号源频率"""
command = f"FREQ {freq_mhz} MHz"
# 发送SCPI命令
instrument.write(command)
print(f"频率已设置为 {freq_mhz} MHz")
def read_power():
"""读取功率值"""
response = instrument.query("MEAS:POW?")
return float(response)
你看,这样写,主程序就几行调用,多舒服。
pyvisa库安装与使用
Python和仪器怎么通信?靠的就是VISA(Virtual Instrument Software Architecture)。pyvisa是Python版的VISA库,免费又好用。
安装步骤
先装NI-VISA驱动(这是底层驱动,仪器厂商一般会提供)。然后装pyvisa:
python
pip install pyvisa
如果你用的是安捷伦/是德科技的仪器,可能还需要装pyvisa-py:
python
pip install pyvisa-py
我个人建议:先装NI-VISA,兼容性最好。我遇到过用pyvisa-py连不上老款安捷伦仪器的坑,后来换NI-VISA就解决了。
连接仪器
连接前,先看看仪器用什么接口。常见的有USB、GPIB、LAN(TCP/IP)。
import pyvisa
# 创建资源管理器
rm = pyvisa.ResourceManager()
# 列出所有可用仪器
print(rm.list_resources())
# 输出示例:('USB0::0x2A8D::0x1701::MY12345678::0::INSTR',)
找到仪器地址后,连接它:
python
# 用USB连接
instrument = rm.open_resource('USB0::0x2A8D::0x1701::MY12345678::0::INSTR')
# 用LAN连接(IP地址)
# instrument = rm.open_resource('TCPIP0::192.168.1.100::inst0::INSTR')
# 设置超时时间(单位毫秒)
instrument.timeout = 5000
# 验证连接
print(instrument.query('*IDN?'))
# 输出:Keysight Technologies, N9320B, MY12345678, A.01.05
嗯,这里要注意:*IDN?是通用查询命令,所有仪器都支持。如果返回了仪器信息,说明连接成功。
常用操作
| 操作 | 方法 | 说明 |
|---|---|---|
| 写命令 | instrument.write("命令") |
只发送,不等待返回 |
| 查询命令 | instrument.query("命令") |
发送并等待返回结果 |
| 读取数据 | instrument.read() |
读取缓冲区数据 |
| 关闭连接 | instrument.close() |
测试结束记得关闭 |
我习惯用query,一步到位。但要注意,有些仪器执行命令需要时间,超时设置要合理。
仪器控制基础:SCPI命令
SCPI(Standard Commands for Programmable Instruments)是仪器控制的通用语言。说白了,就是一套标准化的指令集,不同厂家的仪器,命令格式基本一致。
SCPI命令结构
SCPI命令像文件路径一样,用冒号分层:
python
:SOURce:FREQuency 1000000
:MEASure:VOLTage:DC?
大写部分可以简写(通常写前4个字符):
python
:SOUR:FREQ 1000000
:MEAS:VOLT:DC?
问号表示查询,没有问号就是设置。
常用SCPI命令示例
以信号源和万用表为例
python
# 信号源设置
instrument.write(":SOUR:FREQ 1000000") # 设置频率1MHz
instrument.write(":SOUR:VOLT 0.5") # 设置幅度0.5V
instrument.write(":OUTP ON") # 打开输出
# 万用表测量
voltage = instrument.query(":MEAS:VOLT:DC?") # 测直流电压
resistance = instrument.query(":MEAS:RES?") # 测电阻
你可能会问:这些命令怎么记?其实不用记,仪器手册里都有。我一般把常用命令整理成表格,贴在工作台旁边。
避坑指南:常见问题
⚠️ 我曾经踩过的坑:
- 命令大小写:SCPI不区分大小写,但建议统一大写,清晰易读。
- 返回值带换行符 :仪器返回的字符串末尾通常有
\n,记得用.strip()去掉。 - 仪器忙 :发送命令太快,仪器可能没反应过来。加个
time.sleep(0.1)缓冲一下。 - 忘记关闭连接 :程序异常退出时,仪器可能还占着端口。用
try...finally确保关闭。
实战:自动测量电压并保存
光说不练假把式。咱们写个完整的小程序:控制万用表测10次电压,保存到CSV文件。
python
import pyvisa
import time
import csv
def main():
# 连接仪器
rm = pyvisa.ResourceManager()
dmm = rm.open_resource('USB0::0x2A8D::0x1701::MY12345678::0::INSTR')
dmm.timeout = 5000
# 准备数据文件
with open('voltage_data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['次数', '电压(V)'])
# 测量10次
for i in range(1, 11):
# 发送查询命令
raw = dmm.query(":MEAS:VOLT:DC?")
# 清洗数据
voltage = float(raw.strip())
# 写入文件
writer.writerow([i, voltage])
print(f"第{i}次测量:{voltage} V")
# 等一会儿再测
time.sleep(0.5)
# 关闭连接
dmm.close()
print("测量完成,数据已保存到 voltage_data.csv")
if __name__ == "__main__":
main()
💡 我的小技巧:
实际项目中,我习惯把仪器地址、测量次数、文件路径都写成配置参数。这样换仪器或改参数时,不用改代码,改配置文件就行。
小结
自动化测试入门,说白了就三步:
- Python基础:变量、循环、函数,够用就行。
- pyvisa库:装驱动、连仪器、发命令。
- SCPI命令 :记住
*IDN?查身份,:MEAS测数据。
你想想看,以前手动测一个点要10秒,现在自动化一秒测10个点。省下来的时间,喝杯咖啡不香吗?