3. 步骤类型与内置步骤
在 TestStand 中,序列文件(.seq)本身只是容器,真正决定“测什么、怎么判、失败后怎么办”的是序列里的每一个步骤(Step)。TestStand 内置了数十种步骤类型,但工程中约八成测试逻辑由五类步骤承担:Pass/Fail Test、Numeric Limit Test、String Value Test、Action、Sequence Call。理解它们的执行语义差异,是写出可维护、可复用测试序列的前提。
这五类步骤可以按“是否产生测量结果”和“是否参与判定”两个维度区分。Pass/Fail、Numeric Limit、String Value 属于测试类步骤,它们会向结果记录(ResultList)写入一个带状态的测量值;Action 属于动作类步骤,只执行副作用(如初始化仪器、延时、写日志),不产生判定;Sequence Call 属于调用类步骤,用于把子序列当作一个步骤来执行,是模块化复用的核心。
Pass/Fail Test:最简布尔判定
Pass/Fail Test 不采集测量值,只根据一个布尔表达式决定通过或失败。典型用法是检查某个前置条件是否满足,例如“电源是否已上电”“DUT 是否已连接”。配置时在 Preconditions 或步骤的 Pass/Fail Expression 中写入表达式,例如 FileGlobals.PowerOn == True。执行时引擎求值该表达式:为真则状态置 Passed,为假则置 Failed。它不写入 Numeric 测量值,因此结果记录里只有状态,没有上下限。适合做“门禁式”检查,失败后通常配合 Failure Action 直接跳转到清理步骤。
Numeric Limit Test:数值测量的核心
Numeric Limit Test 是产线测试中使用频率最高的步骤。它执行一个代码模块(如 LabVIEW VI、C/C++ DLL、.NET 方法),把返回值作为测量值,再与配置的上下限比较。关键配置项包括:Measurement(测量值来源,通常是模块输出参数)、Limits(Low/High,可分别启用)、Comparison Type(GE/LE、GT/LT、EQ 等)、Units(单位字符串,仅用于记录)。
例如测试一个 3.3V 电源输出:模块返回 3.312,配置 Low=3.234、High=3.366(即 3.3V ±1%),Comparison 为 GE/LE。引擎比较 3.234 ≤ 3.312 ≤ 3.366,结果为 Passed,ResultList 中记录测量值 3.312、上下限和单位 V。若返回 3.40,则状态为 Failed,并触发该步骤的 Failure Action。需要注意:上下限比较使用浮点数,应避免用 EQ 做精确相等判断,工程上更常用带容差的区间比较。
String Value Test:字符串比对
String Value Test 用于比对字符串型测量值,例如读取仪器返回的版本号、序列号或状态字符串。配置项包括 Measurement(字符串来源)、Expected String(期望值)、Comparison Type(Case Sensitive / Case Insensitive / Regular Expression)。例如读取固件版本返回 "V2.3.1",期望值配置为 "V2.3.1",大小写敏感,则判定 Passed。若使用正则表达式,可写成 V\d+\.\d+\.\d+ 来匹配任意版本号格式。字符串比对失败时同样写入 Failed 状态,但结果记录中保存的是字符串而非数值。
Action:只做事,不判定
Action 步骤执行一个代码模块但不产生 Pass/Fail 判定,其状态固定为 Done。它常用于:初始化仪器、设置继电器矩阵、写入日志、延时等待、调用清理函数。配置时只需指定模块路径和参数,不需要配置 Limits。虽然 Action 不判定,但它可能返回错误(Error),此时状态变为 Error 并可能终止序列。因此 Action 步骤的 Error 处理同样需要关注,通常配合 On Error 设置决定是否继续。
Sequence Call:模块化的关键
Sequence Call 步骤调用另一个序列(子序列),把子序列当作一个步骤执行。它是 TestStand 实现模块化复用的核心机制。配置项包括:Sequence File(目标 .seq 文件)、Sequence(目标序列名)、Parameters(参数映射,把调用方的变量传给子序列的形参)。执行时引擎加载目标序列,按参数映射传值,运行子序列,再把子序列的最终状态作为本步骤的状态返回。若子序列中任一步骤 Failed,Sequence Call 步骤通常也返回 Failed(取决于子序列的聚合规则)。
例如主序列中有一个 Sequence Call 调用 PowerSupply.seq 的 Test3V3Rail 序列,参数映射 Locals.DUT_ID → Parameters.DutId。子序列内部包含 Numeric Limit Test 测量 3.3V 并判定。执行后主序列的该步骤状态即反映子序列整体结果,ResultList 中会嵌套展开子序列的每一步结果,便于定位失败点。
执行语义对比与选择依据
| 步骤类型 | 是否产生测量值 | 是否判定 | 典型状态 | 典型用途 |
|---|---|---|---|---|
| Pass/Fail Test | 否 | 是(布尔) | Passed / Failed | 前置条件检查 |
| Numeric Limit Test | 是(数值) | 是(区间) | Passed / Failed | 电压、电流、频率测量 |
| String Value Test | 是(字符串) | 是(比对) | Passed / Failed | 版本号、序列号比对 |
| Action | 否 | 否 | Done / Error | 初始化、延时、日志 |
| Sequence Call | 取决于子序列 | 取决于子序列 | 继承子序列结果 | 模块复用、分层组织 |
选择步骤类型时,先问两个问题:这一步要不要“判”?如果要判,测量值是数值还是字符串?要判且是数值,用 Numeric Limit Test;要判且是字符串,用 String Value Test;要判但只有布尔条件,用 Pass/Fail Test;不判只做事,用 Action;要把已有序列当步骤复用,用 Sequence Call。掌握这五类步骤的配置项与执行语义,就掌握了 TestStand 序列编写的主干。