4. 自动化测试系统架构

功率测试自动化系统并不是“把仪器连起来、写个脚本跑一遍”这么简单。当测试通道从 1 路扩展到 8 路、16 路,当测试项从稳态效率扩展到动态响应、温升、保护阈值扫描时,系统的复杂度会迅速上升。此时决定项目成败的往往不是某个算法,而是分层架构是否清晰。分层设计的核心价值在于:让“人机交互”“实时控制”“设备通信”“测试逻辑”“数据管理”各自独立演化,任何一层的改动不会牵动全局。

一、六层架构的核心原理

典型的功率测试自动化系统可划分为六个层次,自上而下依次为:上位机层、下位机层、通信总线层、驱动层、测试执行层与数据层。它们并非严格的单向调用链,而是存在双向数据流与控制流。

上位机层负责人机交互:测试用例编辑、参数配置、实时曲线显示、报告生成与人工干预。它追求的是灵活性与可视化,通常基于 PC 或工控机,使用 Python、C# 或 LabVIEW 开发。

下位机层负责实时性任务:PWM 输出、ADC 采样、保护逻辑、时序触发。它通常由 MCU、DSP 或 FPGA 承担,运行周期在微秒到毫秒级,不能被人机界面的卡顿影响。

通信总线层是上下位机之间的“血管”,常见选择包括以太网(TCP/UDP)、CAN/CAN-FD、RS-485、USB 以及工业现场的 EtherCAT。选择依据是带宽、实时性、节点数与抗干扰能力。

驱动层把不同厂商、不同协议的仪器(电源、电子负载、功率分析仪、示波器、温箱)抽象为统一接口,例如 set_voltage()、read_power(),屏蔽 SCPI、Modbus、CANopen 等差异。

测试执行层是“大脑”,负责测试序列调度、条件判断、循环扫描、异常处理与结果判定。它调用驱动层完成动作,并把结果交给数据层。

数据层负责采集数据的存储、索引、查询与导出,包括原始波形、稳态点、事件日志与测试报告模板。

功率测试自动化系统六层架构 上位机层 测试用例编辑 · 参数配置 · 实时曲线 · 报告生成 · 人工干预 PC / 工控机 下位机层 PWM 输出 · ADC 采样 · 保护逻辑 · 时序触发 · 闭环控制 MCU / DSP / FPGA 通信总线层 以太网 TCP/UDP · CAN-FD · RS-485 · USB · EtherCAT 带宽 / 实时性 / 节点数 驱动层 SCPI · Modbus · CANopen 抽象 → set_voltage() / read_power() 电源 / 负载 / 功率计 / 示波器 测试执行层 序列调度 · 条件判断 · 循环扫描 · 异常处理 · 结果判定 测试引擎 数据层 原始波形 · 稳态点 · 事件日志 · 报告模板 · 数据库索引 SQLite / InfluxDB / CSV 控制流(下发) 数据流(上传)

二、分层设计的方法与流程

落地分层架构时,建议按以下顺序推进,避免“先写脚本、后补架构”的返工:

  1. 明确实时性边界:把周期小于 1 ms 的任务划给下位机,把秒级以上的任务留给上位机。边界一旦确定,通信协议的数据量与时序要求就随之确定。
  2. 定义驱动接口契约:先写接口,再写实现。例如统一规定所有仪器驱动必须实现 connect()、configure()、read()、close() 四个方法。
  3. 设计测试执行层的 DSL:用结构化描述表达测试步骤,而不是把逻辑硬编码在脚本里。
  4. 确定数据模型:先定义“一次测试 = 一个 Run,一个 Run 包含多个 Step,一个 Step 产生多个 Sample”,再选存储方案。
  5. 联调与回归:用模拟驱动替换真实仪器,验证执行层与数据层逻辑,最后接入真实设备。
关键原则:上层依赖下层的抽象接口,而不是具体实现。上位机不应直接拼接 SCPI 字符串,测试执行层不应关心仪器是哪个品牌。

三、典型场景:16 通道 DC-DC 效率扫描

以 16 通道 DC-DC 模块效率扫描为例,各层分工如下:上位机配置输入电压 9~36 V、负载电流 0.5~5 A 的扫描矩阵;测试执行层生成 16×8×10 共 1280 个测试点并调度执行;驱动层控制可编程电源与电子负载;下位机以 100 μs 周期采集输入输出电压电流;数据层把每个点的效率、纹波、温度写入数据库并生成趋势图。

# 测试执行层伪代码(分层调用示意)
for vin in [9, 12, 18, 24, 36]:
    for iout in [0.5, 1, 2, 3, 5]:
        psu.set_voltage(vin)          # 驱动层
        eload.set_current(iout)       # 驱动层
        mcu.trigger_sample()          # 下位机
        data = psu.read_all()         # 驱动层
        eff = data["pout"] / data["pin"]
        db.insert(run_id, vin, iout, eff)   # 数据层
        if eff < 0.85:
            log.warning(f"效率偏低: {vin}V/{iout}A = {eff:.3f}")

四、常见误区与复盘

误区 表现 后果 改进方向
上位机直接控制仪器 脚本里大量 SCPI 字符串 换仪器即重写,无法复用 引入驱动层抽象接口
实时任务放在 PC 端 用 sleep 做微秒级时序 抖动大,保护失效 下移到 MCU/FPGA
数据层后置设计 先跑通再想存哪 数据格式混乱,无法追溯 先定数据模型再开发
总线选型只看带宽 忽略实时性与抗干扰 现场丢包、误触发 综合评估后选型
复盘建议:每完成一个测试项目,回看一次“哪一层改动最多”。如果驱动层频繁改动,说明接口抽象不足;如果执行层频繁改动,说明测试逻辑与业务耦合过深。分层架构的健康度,可以用“改动局部化程度”来衡量。
注意:分层不等于层数越多越好。对于单通道、低频次的简单测试,过度分层反而增加开发成本。分层的粒度应与测试规模、复用需求和团队规模匹配。

综上,上位机、下位机、通信总线、驱动层、测试执行层与数据层共同构成功率测试自动化的骨架。清晰的分层让系统在通道扩展、仪器更换、测试项增加时保持稳定,也让测试结果具备可追溯性与可复现性。理解每一层的职责边界,是设计高质量自动化测试系统的第一步。