1. TestStand序列架构总览

在开始编写任何一条测试步骤之前,必须先建立对 TestStand 序列架构的整体认知。TestStand 的核心价值在于把“测试任务”拆解为可复用、可维护、可追溯的层次结构,而这一结构由四个基本对象逐级构成:序列文件(Sequence File)、序列(Sequence)、步骤(Step)以及步骤类型(Step Type)。理解它们之间的包含关系与调用关系,是后续模块化开发、序列复用和批量测试调度的基础。

四个基本对象的层次关系

序列文件是磁盘上的物理容器,扩展名通常为 .seq,它保存了一组相关的序列、变量、类型定义和配置信息。一个序列文件可以包含多个序列,例如一个产品测试项目里,MainSequence 负责整体流程调度,PowerOnTest、CalibrationTest、FinalCheck 分别负责不同测试阶段。序列是逻辑执行单元,它由若干步骤按顺序排列组成,并拥有自己的局部变量、参数和前后置操作。步骤是序列中最小的可执行单元,每一步完成一个具体动作,例如调用 LabVIEW VI、设置继电器、读取万用表、判断测量值是否在限值内。步骤类型则决定了这一步“做什么类别的事”,它规定了步骤的配置界面、可访问的属性和运行时行为。

这四者的关系可以概括为:序列文件包含序列,序列包含步骤,步骤由步骤类型定义其行为。理解这一层包含关系,就能明白为什么修改一个步骤类型会影响所有使用该类型的步骤,也能明白为什么序列文件可以整体迁移到另一台机器而保持行为一致。

TestStand 序列架构层次与调用关系 序列文件 .seq 物理容器 · 磁盘存储 变量 / 类型 / 配置 例:ProductTest.seq 序列 Sequence 逻辑执行单元 局部变量 / 参数 / 前后置 例:MainSequence 步骤 Step 最小可执行单元 动作 / 判断 / 调用 例:ReadVoltage 包含 包含 步骤类型 Step Type 定义行为类别与配置界面 NumericLimitTest / SequenceCall / Action 由类型定义 序列调用关系:MainSequence 调度子序列 MainSequence 流程调度 PowerOnTest 上电测试 CalibrationTest 校准测试 FinalCheck 终检 SequenceCall SequenceCall SequenceCall

步骤类型:决定“这一步能做什么”

TestStand 内置了多种步骤类型,常用的包括:NumericLimitTest(数值限值测试,读取一个测量值并与上下限比较)、StringValueTest(字符串值测试)、PassFailTest(通过/失败判断)、SequenceCall(调用另一个序列)、Action(执行任意动作,如调用代码模块)、MessagePopup(弹出提示)、Goto(跳转)、Label(标签)等。每种步骤类型在编辑器中呈现不同的配置选项卡,例如 NumericLimitTest 需要填写测量值来源、下限、上限和单位,而 SequenceCall 需要指定目标序列文件、目标序列名和参数传递方式。

选择步骤类型的依据是“这一步要完成什么类别的动作”。如果只是读取一个电压并判断是否在 4.95V 到 5.05V 之间,应使用 NumericLimitTest;如果这一步需要调用一个已经封装好的 LabVIEW VI 来执行自定义测量逻辑,则使用 Action 或 NumericLimitTest 并在其中指定代码模块。步骤类型不是随意选择的,它直接决定了运行时 TestStand 引擎如何解释和执行该步骤。

从测试任务到可执行序列的映射方法

假设我们要为一个 5V 电源模块设计测试流程,测试任务包括:上电检查、空载电压测量、满载电压测量、过流保护验证、最终判定。映射到 TestStand 序列架构时,可以按以下方式组织:

  • 序列文件:PowerModuleTest.seq,包含所有相关序列和共享变量。
  • 主序列:MainSequence,按顺序调用各子序列,并汇总最终结果。
  • 子序列:PowerOnCheck、NoLoadVoltage、FullLoadVoltage、OverCurrentProtect。
  • 步骤示例:在 NoLoadVoltage 中,第一步为 Action 步骤调用继电器控制 VI 接通电源,第二步为 NumericLimitTest 读取万用表电压并判断 4.95V~5.05V,第三步为 Action 步骤断开电源。

这种映射的关键在于:先识别测试任务中的独立阶段,再把每个阶段封装为一个序列,最后在序列内部用步骤类型匹配具体动作。这样做的直接好处是,当某个测量方法需要修改时,只需改动对应子序列,主序列和其他子序列不受影响。

序列调用关系与参数传递

序列之间的调用通过 SequenceCall 步骤实现。调用时可以把当前序列的变量、步骤结果或固定值作为参数传递给被调用序列。被调用序列通过“参数”面板定义输入和输出,输入参数在序列开始时接收值,输出参数在序列结束时回传结果。例如 NoLoadVoltage 可以定义一个输出参数 MeasuredVoltage,主序列在调用后读取该参数并决定是否继续后续测试。

建议在项目初期就规划好序列的粒度:一个序列只负责一个明确的测试阶段或一个可复用的功能单元。序列过大难以维护,过小则调用层次过深。通常以“能否独立描述一个测试目的”作为划分依据。

建立架构认知的实践意义

理解序列架构之后,在实际开发中就能有意识地避免几种常见问题:把所有步骤堆在一个序列里导致无法复用;随意选择步骤类型导致配置混乱;不定义参数接口导致序列之间靠全局变量耦合。正确的做法是,先画出测试任务的阶段划分,再为每个阶段建立序列,最后在序列内部按动作类别选择步骤类型。这样形成的序列文件结构清晰,后续增加新测试项时只需新增子序列并在主序列中插入一个 SequenceCall 步骤即可。

下一阶段的学习将围绕序列文件的具体创建、序列属性的配置以及步骤类型的详细使用展开。在此之前,请确保能够准确回答:一个 .seq 文件中可以包含多少个序列?SequenceCall 步骤属于哪一类步骤类型?序列参数与序列局部变量在作用范围上有什么区别?这些问题的答案直接决定后续模块化开发的质量。