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 布尔判定,无测量值 Numeric Limit Test 数值 + 上下限判定 String Value Test 字符串 + 期望值比对 Action 仅执行副作用,不判定 Sequence Call 调用子序列,可传参 TestStand 执行引擎 读取步骤属性 执行代码模块 按判定规则置状态 写入 ResultList ResultList 记录 • 步骤名 / 状态 / 测量值 • 上下限 / 单位 / 时间戳 • 子序列结果嵌套展开 步骤状态(Status) Passed — 判定通过 Failed — 判定失败 Done — 动作完成(无判定) Error / Terminated — 异常终止 流程控制 Run Mode:Normal / Skip / Force Pass Failure Action:Goto / Terminate

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、Numeric Limit、String Value)负责“判”,Action 负责“做”,Sequence Call 负责“复用”。把初始化、配置、清理写成 Action 或子序列,把测量判定写成测试类步骤,序列结构会清晰很多。

执行语义对比与选择依据

步骤类型是否产生测量值是否判定典型状态典型用途
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 序列编写的主干。