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节点。
\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?用于读取错误队列,是排查指令问题的关键命令。
三、电压电流设置与回读的完整示例
下面以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?可用于同步,确保前序命令执行完毕后再进行下一步,避免因异步执行导致的回读值滞后。
:SYST:ERR?纳入每次测试步骤的固定检查项。