4. 测试站资源建模

在并行测试中,真正决定节拍上限的往往不是测试序列本身,而是测试站里那些“同一时刻只能被一个工位占用”的物理对象:一台高精度数字万用表、一个矩阵开关的某组交叉点、一路可编程电源输出、一套气动夹具、一名需要人工上下料的操作员。如果 TestStand 只按“工位”粗粒度调度,很容易出现两个并行测试线程同时抢同一台仪器,或者夹具还没松开就尝试换料。资源建模的目的,就是把这些物理对象抽象成带容量、占用时长和释放条件的可复用资源,让并行执行引擎能够安全地共享它们。

一、资源抽象:从物理对象到可调度实体

资源建模的第一步是确定“什么算一个资源”。判断标准是:是否存在同一时刻不能被两个并行测试同时使用的约束。按这个标准,测试站中常见的资源可以归为五类:

  • 仪器资源:DMM、示波器、频谱仪、信号源等,通常容量为 1,即独占。若仪器支持多通道独立测量,也可按通道拆成多个容量为 1 的子资源。
  • 开关资源:矩阵开关、多路复用器。真正需要建模的粒度不是“整台开关”,而是“某一行/某一列”或“某组交叉点”。同一行上的两个交叉点不能同时闭合,因此行资源容量为 1,不同行可以并行。
  • 电源资源:可编程电源的每一路输出是独立资源,容量为 1;但电源的通信接口(如 GPIB 总线)本身也可能是容量为 1 的共享资源。
  • 夹具资源:气动夹具、探针台、屏蔽箱。容量通常为 1,占用时长覆盖“夹紧—测试—松开”全过程,释放条件是“夹具已完全松开且工件可取出”。
  • 操作员资源:人工上下料、目视检查、手动插拔。容量等于可同时作业的人数,占用时长是人工动作时间,释放条件是“操作员完成动作并离开该工位”。

把资源抽象出来之后,每个资源至少需要四个属性:资源 ID、容量(Capacity)、占用时长(Hold Time)、释放条件(Release Condition)。容量决定能并行几个占用者;占用时长用于节拍估算和超时保护;释放条件用于判断资源何时真正可用,而不是仅仅“测试步骤执行完”。

测试站资源模型:容量 · 占用时长 · 释放条件 物理对象 数字万用表 DMM GPIB / LAN 矩阵开关 行/列交叉点 可编程电源 多路输出 气动夹具 夹紧/松开 操作员 上下料/目检 抽象 资源属性定义 资源 ID DMM_01 / SW_ROW3 / PSU_CH2 FIXTURE_A / OP_01 容量 Capacity 独占资源 = 1;操作员 = 人数 开关按行/列拆分,容量 = 1 占用时长 Hold Time DMM 测量 ≈ 120 ms 夹具夹紧 ≈ 800 ms 释放条件 Release DMM:测量完成并读取结果 夹具:松开到位信号 = TRUE 调度 并行占用视图 工位 1 DMM_01 占用中 FIXTURE_A 夹紧 工位 2 等待 DMM_01 阻塞 → 排队 工位 3 SW_ROW3 占用中 PSU_CH2 输出中 操作员 OP_01 容量 = 2 可同时服务 2 个工位 资源容量决定并行度;占用时长决定节拍;释放条件决定资源何时真正可被下一个工位获取

二、容量、占用时长与释放条件的工程定义

容量是最直观的属性,但工程上容易出错的是“粒度”。以 4×8 矩阵开关为例,如果把它整体建模为容量 1 的资源,那么任何两个工位都无法同时使用开关,并行度被严重压缩。正确做法是按行拆分:ROW1 到 ROW4 各是一个容量为 1 的资源,COL1 到 COL8 各是一个容量为 1 的资源。一个交叉点 (ROW2, COL5) 的闭合需要同时占用 ROW2 和 COL5 两个资源。这样,工位 1 使用 (ROW1, COL3)、工位 2 使用 (ROW2, COL5) 就可以真正并行。

占用时长不能简单取“测试步骤的标称时间”,而应取从资源被占用到释放条件满足之间的实际时间。例如 DMM 测量,标称测量时间 120 ms,但实际占用时长还包括量程切换、等待稳定、读取缓冲等,工程上建议按 150~200 ms 估算。夹具的占用时长则覆盖“夹紧到位 + 测试 + 松开到位”,典型值 800 ms~1.5 s。操作员上下料时间受工件重量、定位难度影响,通常按 3~8 s 估算。

释放条件是资源建模中最容易被忽略、却对并行安全最关键的部分。释放条件必须是可观测、可判断的布尔量,而不是“步骤执行完毕”这种流程状态。例如:

  • DMM 释放条件:测量完成标志置位,且结果已读入变量。
  • 电源释放条件:输出已关闭,且电压回读低于 0.5 V。
  • 夹具释放条件:松开到位传感器信号为 TRUE,且延时 100 ms 确认稳定。
  • 操作员释放条件:操作员按下“完成”按钮或离开安全光幕区域。
释放条件建议在 TestStand 中实现为“资源释放”子序列,由资源管理器统一调用,而不是散落在各个测试步骤里。这样即使测试步骤异常退出,也能通过清理逻辑保证资源被正确释放。

三、在 TestStand 中落地资源模型

TestStand 本身没有内置的“资源池”对象,但可以通过 Station Globals + 互斥锁(Lock)+ 队列(Queue) 组合实现。推荐的结构是:在 Station Globals 下建立 Resources 容器,每个资源一个子属性,包含 Capacity、InUse、OwnerStation、AcquireTime 四个字段。获取资源时调用 AcquireResource 子序列,释放时调用 ReleaseResource 子序列。

Station Globals
└── Resources
    ├── DMM_01
    │   ├── Capacity   = 1
    │   ├── InUse      = 0
    │   ├── Owner      = ""
    │   └── AcquireTime = 0
    ├── SW_ROW3
    │   ├── Capacity   = 1
    │   └── InUse      = 0
    ├── PSU_CH2
    │   ├── Capacity   = 1
    │   └── InUse      = 0
    ├── FIXTURE_A
    │   ├── Capacity   = 1
    │   └── InUse      = 0
    └── OP_01
        ├── Capacity   = 2
        └── InUse      = 0

获取资源的典型逻辑是:先加锁保护共享变量,检查 InUse < Capacity;若满足则 InUse + 1,记录占用工位和时间,解锁并返回成功;若不满足则解锁,等待一个轮询周期(如 50 ms)后重试,或进入队列等待。释放时反向操作:加锁、InUse - 1、清空占用者、解锁。整个过程必须保证“检查—占用”是原子的,否则两个工位可能同时通过检查、同时占用,导致容量被突破。

四、资源建模检查表

完成建模后,建议用下面这份检查表逐项核对,确保资源模型能够支撑并行调度:

检查项判断标准常见问题
资源粒度是否按最小可并行单元拆分开关整体建模,并行度被压缩
容量设置是否与物理约束一致操作员容量误设为 1
占用时长是否包含稳定、切换、确认时间只取标称测量时间,节拍估算偏乐观
释放条件是否为可观测布尔量用“步骤完成”代替“夹具松开到位”
异常释放测试失败或超时后是否仍释放异常路径未清理,资源永久占用
死锁风险多资源获取顺序是否一致工位 1 先占 DMM 再占开关,工位 2 相反
多资源获取必须约定全局一致的顺序,例如统一按“电源 → 开关 → 仪器 → 夹具 → 操作员”的顺序获取。否则两个工位各持有一个资源、互相等待对方释放,就会形成死锁,表现为并行测试长时间停滞且无报错。

资源建模完成后,每个工位的测试序列就不再直接操作仪器,而是先向资源管理器申请所需资源,获得授权后再执行测量,测量结束按释放条件归还资源。这样,并行度由容量决定,节拍由占用时长决定,安全性由释放条件保证,三者共同构成可预测、可优化的并行测试基础。