4. 测试站资源建模
在并行测试中,真正决定节拍上限的往往不是测试序列本身,而是测试站里那些“同一时刻只能被一个工位占用”的物理对象:一台高精度数字万用表、一个矩阵开关的某组交叉点、一路可编程电源输出、一套气动夹具、一名需要人工上下料的操作员。如果 TestStand 只按“工位”粗粒度调度,很容易出现两个并行测试线程同时抢同一台仪器,或者夹具还没松开就尝试换料。资源建模的目的,就是把这些物理对象抽象成带容量、占用时长和释放条件的可复用资源,让并行执行引擎能够安全地共享它们。
一、资源抽象:从物理对象到可调度实体
资源建模的第一步是确定“什么算一个资源”。判断标准是:是否存在同一时刻不能被两个并行测试同时使用的约束。按这个标准,测试站中常见的资源可以归为五类:
- 仪器资源:DMM、示波器、频谱仪、信号源等,通常容量为 1,即独占。若仪器支持多通道独立测量,也可按通道拆成多个容量为 1 的子资源。
- 开关资源:矩阵开关、多路复用器。真正需要建模的粒度不是“整台开关”,而是“某一行/某一列”或“某组交叉点”。同一行上的两个交叉点不能同时闭合,因此行资源容量为 1,不同行可以并行。
- 电源资源:可编程电源的每一路输出是独立资源,容量为 1;但电源的通信接口(如 GPIB 总线)本身也可能是容量为 1 的共享资源。
- 夹具资源:气动夹具、探针台、屏蔽箱。容量通常为 1,占用时长覆盖“夹紧—测试—松开”全过程,释放条件是“夹具已完全松开且工件可取出”。
- 操作员资源:人工上下料、目视检查、手动插拔。容量等于可同时作业的人数,占用时长是人工动作时间,释放条件是“操作员完成动作并离开该工位”。
把资源抽象出来之后,每个资源至少需要四个属性:资源 ID、容量(Capacity)、占用时长(Hold Time)、释放条件(Release Condition)。容量决定能并行几个占用者;占用时长用于节拍估算和超时保护;释放条件用于判断资源何时真正可用,而不是仅仅“测试步骤执行完”。
二、容量、占用时长与释放条件的工程定义
容量是最直观的属性,但工程上容易出错的是“粒度”。以 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 本身没有内置的“资源池”对象,但可以通过 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 相反 |
资源建模完成后,每个工位的测试序列就不再直接操作仪器,而是先向资源管理器申请所需资源,获得授权后再执行测量,测量结束按释放条件归还资源。这样,并行度由容量决定,节拍由占用时长决定,安全性由释放条件保证,三者共同构成可预测、可优化的并行测试基础。