4. 自动化测试脚本开发基础
前三章我们已经把 Yokogawa WT 系列功率分析仪(如 WT1800E、WT5000)的测量对象、量程与接线方式梳理清楚。本章开始进入“让仪器自己干活”的阶段:用上位机脚本通过 TMCTL 或 VISA 接口远程控制功率分析仪,完成参数设置、数据读取与简单计算。目标不是写一个庞大的测试框架,而是先跑通一条最小可用的控制链路——连接 → 配置 → 读取 → 计算 → 判断,这条链路跑通之后,后续章节的批量测试、数据追溯才有落脚点。
一、先分清 TMCTL 与 VISA 的角色
Yokogawa 为 WT 系列提供了两套常用的上位机控制方式。TMCTL 是横河自家的通信库,封装了针对 WT 系列的专用命令,安装后通常以 DLL 形式提供,Python 可通过 ctypes 调用,LabVIEW 则通过调用库函数节点(CLN)加载。VISA 是通用仪器通信标准,NI-VISA 或 Keysight IO Libraries 都可用,Python 侧常用 pyvisa,LabVIEW 侧直接用 VISA Read/Write 函数。两者最终都落到同一条物理链路上:GP-IB、USB 或以太网。
选择上可以这样判断:如果只控制横河仪器、希望命令语义更贴近 WT 系列,用 TMCTL 更省事;如果实验室里混有示波器、电源、电子负载等多种品牌仪器,用 VISA 统一管理更合适。本章示例以 VISA + Python 为主线,因为它的跨平台性和可读性更好,TMCTL 的差异会在关键处点出。
二、连接与资源地址
用 VISA 的第一步是拿到正确的资源地址。以太网连接时,WT 系列通常使用 VXI-11 协议,地址形如 TCPIP0::192.168.1.50::inst0::INSTR;USB 连接时形如 USB0::0x0B21::0x0035::...::INSTR,其中 0x0B21 是横河的厂商 ID。GP-IB 则形如 GPIB0::1::INSTR,末尾数字是仪器地址。不确定时,可用 pyvisa.ResourceManager().list_resources() 列出当前可见资源,再逐一尝试。
连接建立后建议先发一条 *IDN? 确认通信正常,返回字符串中应包含 YOKOGAWA 与型号信息。如果超时,优先检查 IP 是否同网段、仪器端通信接口是否已启用、以及 VISA 后端是否与仪器协议匹配。
三、最小可用脚本:读取有功功率与功率因数
下面这段 Python 示例演示了完整链路。假设被测对象为单相交流负载,电压约 220 V、电流约 2 A,功率因数接近 0.9。脚本先配置测量功能,再读取数值并计算。
import pyvisa
rm = pyvisa.ResourceManager()
wt = rm.open_resource("TCPIP0::192.168.1.50::inst0::INSTR")
wt.timeout = 5000
print(wt.query("*IDN?")) # 确认仪器身份
# 选择测量模式:单相两线,读取 Urms/Irms/P/λ
wt.write(":INPut:WIRing P1W2")
wt.write(":NUMeric:NORMal:ITEM1 U,1")
wt.write(":NUMeric:NORMal:ITEM2 I,1")
wt.write(":NUMeric:NORMal:ITEM3 P,1")
wt.write(":NUMeric:NORMal:ITEM4 LAMBda,1")
wt.write(":NUMeric:NORMal:VALue?") # 触发一次数值读取
raw = wt.read()
vals = [float(x) for x in raw.split(",")]
u, i, p, lam = vals[0], vals[1], vals[2], vals[3]
print(f"U={u:.2f} V, I={i:.3f} A, P={p:.2f} W, λ={lam:.3f}")
print(f"视在功率 S={u*i:.2f} VA, 校验 P/(U*I)={p/(u*i):.3f}")
wt.close()
这段代码里有几个容易踩坑的地方。第一,:NUMeric:NORMal:ITEM 的顺序决定了返回值的顺序,ITEM1 到 ITEM4 必须与后续解析顺序一致,否则会把电流当成电压。第二,:NUMeric:NORMal:VALue? 返回的是一整行逗号分隔字符串,需要先 split(",") 再逐个转 float。第三,功率因数 λ 在横河命令中写作 LAMBda,不要写成 PF,否则会报错或无返回。
如果使用 TMCTL,命令语义类似,但调用方式变为 TMCTL.Initialize、TMCTL.Write、TMCTL.Read 等函数,参数中需要传入设备句柄。LabVIEW 侧则把上述 write/read 换成 VISA Write 与 VISA Read 两个函数节点,字符串常量直接写命令,读取结果用“从字符串还原数值”函数解析。
四、简单计算与结果判断
读取到 U、I、P、λ 之后,可以立即做两项校验。一是用 P/(U×I) 反算功率因数,与仪器返回的 λ 对比,两者应在 0.001 量级内一致;二是用 U×I 得到视在功率 S,与 P 比较可判断负载性质。若 P 为正且 λ 接近 1,说明负载以阻性为主;若 λ 明显小于 1,则存在感性或容性成分。
实际测试中,建议把判断阈值写成可配置参数,例如要求 λ 在 0.85~1.00 之间、P 在设定值的 ±5% 以内。这样脚本不仅能读数,还能直接给出 PASS/FAIL 结论,为后续批量测试和追溯记录提供结构化输出。
wt.query(":NUMeric:NORMal:VALue?") 直接打印原始字符串,确认字段顺序和数值格式,再写解析逻辑,能省去大量排查时间。五、从单次读取到可复用脚本
把上面的代码整理成函数,是走向自动化的第一步。建议至少拆成 connect()、configure()、read_measurements()、evaluate() 四个部分,连接与配置分离,读取与判断分离。这样后续增加多通道、多量程或循环测试时,只需扩展配置和读取部分,判断逻辑可以复用。同时,把资源地址、量程、阈值等写入配置文件或命令行参数,避免每次改代码。
本章的重点是跑通“控制—读取—计算”这条最小链路。只要 *IDN? 能返回、:NUMeric:NORMal:VALue? 能拿到数值、P 与 λ 能正确解析并校验,后续的批量测试、数据记录与追溯就有了可靠的基础。