4. SCPI指令与电源程控

在Keysight电源自动测试平台中,上位机与电源之间的“语言”就是SCPI(Standard Commands for Programmable Instruments)。理解SCPI的语法规则,是后续编写自动测试脚本、实现电压电流设置与回读、以及处理指令错误的基础。本节从语法结构入手,逐步展开到Keysight电源常用指令集,并给出可执行的程控示例与错误处理思路。

一、SCPI语法规则:树状命令与参数格式

SCPI采用树状层次结构组织命令,每一层用冒号“:”分隔。例如:SOURce:VOLTage:LEVel:IMMediate:AMPLitude表示从根节点SOURce出发,逐级定位到电压幅值设置。实际编程中可使用缩写形式,SCPI规定大写字母为必需部分,小写字母可省略,因此上述命令可简写为:SOUR:VOLT。缩写必须严格按规范,不能随意截断,例如:SOUR:VOLT:LEV合法,而:SO:VOL不合法。

命令分为设置命令与查询命令。设置命令不带问号,用于改变仪器状态,如:VOLT 5;查询命令以问号结尾,用于读取仪器状态或数据,如:VOLT?。参数类型包括数值、布尔、离散和字符串。数值可带单位后缀,如5V、0.1A、1E-3;布尔参数用ON|OFF或1|0;离散参数从固定集合中选取,如:VOLT:RANG 20中的量程值。多个命令可用分号连接,如:VOLT 5;:CURR 1,但需注意分号后的命令若省略公共前缀,会继承上一级路径,例如:SOUR:VOLT 5;:CURR 1中:CURR仍属于:SOUR节点。

SCPI命令不区分大小写,但为可读性,通常设置命令用大写、查询命令用问号结尾。发送命令时建议以换行符\n结束,多数Keysight电源默认以LF作为消息终止符。

二、Keysight电源常用指令集

以Keysight N6700系列、E36300系列等常见可编程电源为例,常用指令可归纳为以下几类。第一类是输出控制::OUTPut ON|OFF用于开启或关闭输出,:OUTPut:STATe?查询当前输出状态。第二类是电压设置与回读::VOLTage 5设置电压,:VOLTage?回读设定值,:MEASure:VOLTage?读取实际输出电压。第三类是电流设置与回读::CURRent 1设置电流限值,:CURRent?回读设定值,:MEASure:CURRent?读取实际输出电流。第四类是保护与量程::VOLTage:PROTection 6设置过压保护,:CURRent:PROTection 1.5设置过流保护,:VOLTage:RANGe 20选择电压量程。

需要区分“设定值回读”与“测量值回读”。:VOLT?返回的是仪器内部设定的目标值,而:MEAS:VOLT?返回的是输出端实际测量值。在自动测试中,通常先设置再回读设定值确认命令生效,最后读取测量值判断负载实际状态。此外,:SYSTem:ERRor?用于读取错误队列,是排查指令问题的关键命令。

Keysight电源SCPI程控与回读数据流 上位机 / 测试脚本 VISA Write / Read TCPIP / USB / GPIB 设置命令 :VOLT 5\n:CURR 1\n:OUTP ON Keysight 可编程电源 命令解析 → 参数校验 → 执行 输出级 / 测量单元 错误队列 :SYST:ERR? 查询响应 :MEAS:VOLT?\n:MEAS:CURR? 被测负载 / DUT 实际电压 Vout 实际电流 Iout 功率输出 设定值回读(命令生效确认) :VOLT? → 返回 "5.000000" :CURR? → 返回 "1.000000" :OUTP:STAT? → 返回 "1" 测量值回读(负载实际状态) :MEAS:VOLT? → 返回 "4.987200" :MEAS:CURR? → 返回 "0.512300" :MEAS:POW? → 返回 "2.554" 指令错误处理路径 ① 发送命令后立即查询 :SYST:ERR? → ② 返回 "0,No error" 表示正常 ③ 若返回非零错误码,如 "-113,Undefined header" 或 "-222,Data out of range",需修正命令或参数后重发

三、电压电流设置与回读的完整示例

下面以Python配合PyVISA为例,给出一个完整的设置与回读流程。假设电源地址为TCPIP0::192.168.1.100::inst0::INSTR,目标为设置5V、1A限流,开启输出,然后回读设定值与测量值。

import pyvisa

rm = pyvisa.ResourceManager()
psu = rm.open_resource("TCPIP0::192.168.1.100::inst0::INSTR")
psu.timeout = 5000
psu.write_termination = "\n"
psu.read_termination = "\n"

# 1. 复位并清空状态
psu.write("*RST")
psu.write("*CLS")

# 2. 设置电压、电流与过压保护
psu.write(":VOLT 5")
psu.write(":CURR 1")
psu.write(":VOLT:PROT 6")

# 3. 开启输出
psu.write(":OUTP ON")

# 4. 回读设定值
v_set = float(psu.query(":VOLT?"))
i_set = float(psu.query(":CURR?"))
out_state = psu.query(":OUTP:STAT?").strip()

# 5. 回读测量值
v_meas = float(psu.query(":MEAS:VOLT?"))
i_meas = float(psu.query(":MEAS:CURR?"))

print(f"设定: {v_set} V, {i_set} A, 输出: {out_state}")
print(f"测量: {v_meas} V, {i_meas} A")

# 6. 检查错误队列
err = psu.query(":SYST:ERR?")
print("错误队列:", err)

psu.close()

执行后,若设定值回读为5.000000和1.000000,输出状态为1,说明设置命令已生效。测量值则取决于负载:若负载为10Ω,理论电流约0.5A,测量电压应接近5V;若负载为2Ω,电流将触及1A限流,电压被拉低至约2V,此时:MEAS:VOLT?会明显低于设定值,这是判断电源是否进入恒流模式的依据。

四、指令错误处理与常见问题

SCPI错误队列是排查问题的第一入口。每次发送关键命令后,建议查询:SYST:ERR?,返回格式为“错误码,错误描述”。常见错误包括:-113 Undefined header表示命令拼写错误或缩写不合法;-222 Data out of range表示参数超出允许范围,如设置电压超过额定值;-410 Query INTERRUPTED表示查询被中断,通常因读写顺序不当;-350 Queue overflow表示错误队列溢出,说明长期未读取错误。

处理策略上,建议在脚本中封装一个check_error()函数,每次写入或查询后调用,发现非零错误码时记录日志并抛出异常。对于-222类错误,应在设置前根据电源量程做参数校验;对于-113类错误,应核对SCPI命令树,优先使用官方编程手册中的完整命令。此外,*OPC?可用于同步,确保前序命令执行完毕后再进行下一步,避免因异步执行导致的回读值滞后。

不要忽略错误队列。在自动测试中,未处理的SCPI错误可能导致后续测量数据全部无效,且难以定位。建议将:SYST:ERR?纳入每次测试步骤的固定检查项。