3. 自动化测试平台总体架构设计

Coherent 精密光电系统自动化测试平台的核心挑战,在于它同时要处理光、电、射频三类物理量的激励与测量,还要让软件层能够以统一的方式调度这些异构资源。如果直接把仪器命令写进测试脚本,系统很快会陷入“换一台仪器就要改一遍代码”的困境。因此,平台采用五层分层架构:仪器层、切换层、控制层、数据层、应用层。分层的本质是把“物理连接关系”和“测试逻辑关系”解耦——上层只关心“我要测什么”,下层负责“怎么把信号接到该去的地方”。

五层架构的职责边界

仪器层是物理资源的集合,包括可调谐激光源、光功率计、光谱仪、示波器、误码仪、矢量网络分析仪、任意波形发生器、直流电源等。每台仪器通过 GPIB、USB-TMC、LAN/VXI-11 或串口接入,在平台中注册为带唯一资源地址的逻辑设备,例如 TCPIP0::192.168.1.31::inst0::INSTR。仪器层只暴露“能力”,不暴露“接线方式”。

切换层是光电测试平台区别于纯电测试平台的关键。它由光开关矩阵、射频开关矩阵、电继电器矩阵和衰减器组构成,负责把仪器端口按测试需求路由到被测件(DUT)的对应端口。切换层向上提供的是“通道语义”,例如 OPT_IN1 → DUT_OPT_A、RF_OUT2 → DUT_RF_B,而不是具体的开关编号。这样应用层描述测试路径时,不必关心底层是机械光开关还是 MEMS 光开关。

控制层是平台的调度中枢,通常由测试执行引擎、仪器驱动库、资源锁管理器和时序控制器组成。它接收应用层下发的测试序列,解析为“设置—等待稳定—采集—判定”的原子动作,再通过驱动库翻译成具体仪器的 SCPI 命令或寄存器操作。控制层还必须处理光功率稳定时间、射频开关切换时间、激光波长调谐时间等物理约束,避免在信号未稳定时就采集数据。

数据层负责测试数据的采集、缓存、存储与追溯。原始数据(如光功率随时间序列、眼图采样点、S 参数曲线)与元数据(仪器型号、量程、平均次数、环境温度、时间戳)一并入库。数据层通常采用“原始数据 + 结构化结果”双写策略:原始数据保留完整波形供离线复现,结构化结果供报表和判定使用。

应用层面向测试工程师,提供测试用例编辑、序列编排、结果可视化、报表导出和异常告警。应用层不直接调用仪器驱动,而是通过控制层提供的统一 API 提交测试任务。

应用层 Application 测试用例编辑 · 序列编排 · 结果可视化 · 报表导出 · 异常告警 统一 API 提交任务,不直接调用仪器驱动 控制层 Control 测试执行引擎 · 仪器驱动库 · 资源锁管理 · 时序控制器 解析“设置—等待稳定—采集—判定”原子动作,翻译为 SCPI / 寄存器操作 处理光功率稳定、射频开关切换、激光调谐等物理时序约束 切换层 Switching 光开关矩阵 · 射频开关矩阵 · 电继电器矩阵 · 可调衰减器组 向上提供通道语义:OPT_IN1 → DUT_OPT_A,RF_OUT2 → DUT_RF_B 屏蔽机械光开关 / MEMS 光开关的底层差异 仪器层 Instrument 可调谐激光源 · 光功率计 · 光谱仪 · 示波器 · 误码仪 · 矢量网络分析仪 · AWG · 直流电源 GPIB / USB-TMC / LAN-VXI11 / 串口接入,注册为唯一资源地址逻辑设备 示例:TCPIP0::192.168.1.31::inst0::INSTR 数据层 Data 原始数据 波形采样点 S 参数曲线 眼图数据 元数据 仪器型号/量程 平均次数/温度 时间戳 结构化结果 判定/报表 逻辑抽象 物理资源 光 / 电 / 射频 / 软件协同原则 光路:先确认光功率稳定再采集,避免波长调谐瞬态影响;射频:开关切换后等待驻波稳定; 电路:继电器矩阵动作前先断开激励,防止热插拔损伤 DUT;软件:资源锁保证同一仪器不被并发抢占。

光、电、射频、软件协同的设计原则

分层之后,真正决定平台可用性的是跨层协同。光路方面,可调谐激光源改变波长后,光功率计读数需要等待数十毫秒到数百毫秒才能稳定,控制层必须在“设置波长”和“采集功率”之间插入可配置的稳定等待,而不是固定延时。射频方面,开关矩阵切换后,矢量网络分析仪需要重新校准参考面,否则 S 参数会因路径损耗变化而偏移。电路方面,继电器矩阵在切换前应先断开激励源,避免带电插拔导致 DUT 端口损伤。软件方面,资源锁管理器要保证同一台光功率计不会被两个并行测试用例同时占用,否则读数会互相污染。

这些原则落到接口设计上,就形成了一份接口清单。接口清单不是简单的端口列表,而是每一层之间“约定什么、不约定什么”的契约。以下是一份可参考的接口清单示例,字段可根据实际平台裁剪。

接口编号 所在层间 接口名称 方向 关键参数 / 语义 约束与备注
IF-01 应用层 → 控制层 submit_test_sequence 下行 sequence_id, steps[], timeout_ms 异步提交,返回 task_handle
IF-02 控制层 → 切换层 set_route 下行 channel_semantic, settle_ms 通道语义而非开关编号
IF-03 控制层 → 仪器层 scpi_write / scpi_query 双向 resource_addr, command, timeout 驱动库封装,禁止裸 SCPI 穿透到应用层
IF-04 仪器层 → 数据层 push_raw_sample 上行 timestamp, value, unit, instrument_id 原始数据与元数据同批写入
IF-05 数据层 → 应用层 query_result 上行 sequence_id, metric, pass_fail 结构化结果,供报表与告警
IF-06 控制层内部 acquire_resource_lock 内部 resource_addr, owner_task, ttl_ms 防止并发抢占同一仪器

平台架构草图的落地要点

画架构草图时,建议先画“物理连接图”,再画“逻辑分层图”,最后把两者叠在一起检查。物理连接图要标清每台仪器的端口类型(光口 FC/APC、射频 SMA、电 DB9 等)和切换矩阵的输入输出编号;逻辑分层图则只保留层名和接口编号。叠图检查时重点看三件事:第一,是否存在应用层直接连到仪器层的“越层线”,如果有,说明抽象泄漏;第二,切换层的通道语义是否覆盖了所有测试路径,有没有需要临时手动跳线的场景;第三,数据层的元数据字段是否足以复现一次测试,如果缺少仪器量程或平均次数,离线复现就会失败。

实操建议:先用一张 A3 纸画出仪器端口与 DUT 端口的物理连接,再用不同颜色标注光路(蓝)、射频(橙)、电路(绿)。切换矩阵的每个输入输出都用“仪器名+端口号”命名,例如 LASER1_OPT_OUT、PWM1_OPT_IN。完成物理图后,再在另一张纸上画五层逻辑框图,把物理图中的每条连接映射为切换层的一条通道语义。两张图对照,接口清单自然就出来了。

需要强调的是,分层不是目的,而是手段。如果某个测试场景确实需要应用层直接读取一台光谱仪的原始 trace 做实时反馈,强行绕三层反而会增加延迟。此时可以在控制层开放一个受控的“直通通道”,但必须在接口清单中明确标注其适用范围、超时限制和资源锁要求,避免它成为绕过所有约束的后门。架构设计的成熟度,恰恰体现在这些例外路径是否被显式管理,而不是假装它们不存在。