3. 序列文件与步骤类型核心机制

在 TestStand 中,序列文件(Sequence File)是测试逻辑的物理载体,而步骤(Step)是执行的最小单元。理解这两者的结构关系,是开发可维护测试程序的基础。一个典型的序列文件包含四个核心组成部分:序列(Sequence)、步骤(Step)、变量(Variable)和回调(Callback)。它们共同构成了测试流程的骨架、肌肉、记忆和反射机制。

序列是步骤的容器,每个序列文件可以包含多个序列,例如主测试序列、初始化序列、清理序列等。步骤则是序列中的具体动作,按顺序执行。变量用于存储测试数据、配置参数和中间结果,分为局部变量、序列文件全局变量和站全局变量等作用域。回调则是 TestStand 在特定事件发生时自动调用的序列,例如序列开始前、步骤失败后等,用于实现自定义的日志记录、错误处理或资源管理。

Sequence File 结构关系图 Sequence File (.seq) Sequence(序列) 步骤的容器,按顺序执行 Step 1: Numeric Limit Test Step 2: String Value Test Step 3: Pass/Fail Test Variables(变量) Locals / FileGlobals / StationGlobals 存储测试数据、配置参数、中间结果 Callbacks(回调) PreStep / PostStep / SequenceFileLoad TestStand 在特定事件自动调用 用于日志、错误处理、资源管理 常用步骤类型与执行逻辑 Pass/Fail Test Numeric Limit String Value Action Seq Call 布尔判断 数值范围 字符串匹配 执行动作 调用子序列 步骤类型决定测试逻辑与结果判定方式

序列文件的结构层次

打开一个 .seq 文件,在 TestStand 序列编辑器中可以看到左侧的序列列表和右侧的步骤列表。序列文件本身是一个容器,内部可以定义多个序列。每个序列有独立的步骤列表、局部变量和参数。序列之间可以通过 Sequence Call 步骤相互调用,形成层次化的测试结构。

变量在序列文件中有三种主要作用域:局部变量(Locals)仅在当前序列内有效,适合存放临时计算结果;文件全局变量(FileGlobals)在整个序列文件内有效,适合存放该测试文件共用的配置;站全局变量(StationGlobals)在整个测试站内有效,适合存放跨文件共享的资源句柄或全局配置。合理选择变量作用域,可以避免数据污染和命名冲突。

回调是 TestStand 提供的一种事件驱动机制。例如,PreStep 回调在每个步骤执行前被调用,PostStep 在每个步骤执行后被调用,SequenceFileLoad 在序列文件加载时被调用。开发者可以在回调中插入自定义步骤,实现统一的日志记录、错误捕获或资源初始化。回调不是必须使用的,但在构建健壮的测试系统时非常关键。

常用步骤类型的配置与执行逻辑

TestStand 提供了丰富的步骤类型,本节重点介绍五种最常用的类型及其配置要点。

Pass/Fail Test(通过/失败测试)是最简单的判定步骤。它接收一个布尔值输入,如果为 True 则步骤通过,为 False 则失败。配置时需要在步骤属性的 Limits 选项卡中指定数据源,通常绑定到一个局部变量或文件全局变量。例如,将 Locals.bResult 作为输入,当该变量为 True 时步骤通过。执行逻辑是:读取输入值 → 与预期布尔值比较 → 更新步骤状态为 Passed 或 Failed。

Numeric Limit Test(数值极限测试)用于判断一个数值是否落在允许范围内。配置时需要设置三个关键参数:Data Source(被测数值来源)、Low Limit(下限)和 High Limit(上限)。例如,测量一个 5V 电源输出,期望范围为 4.75V 至 5.25V,则 Low Limit 设为 4.75,High Limit 设为 5.25。执行逻辑是:读取数值 → 判断是否在 [Low, High] 区间内 → 在区间内则 Passed,否则 Failed。TestStand 还支持在极限值上附加单位、格式和比较模式(如大于、小于、区间等)。

String Value Test(字符串值测试)用于比较字符串是否匹配预期值。配置时需要设置 Data Source(实际字符串)和 Expected String(期望字符串),还可以选择比较模式:精确匹配、忽略大小写、包含子串等。例如,读取设备返回的版本号字符串,期望为 "V2.1.0",则设置 Expected String 为 "V2.1.0",比较模式为精确匹配。执行逻辑是:读取字符串 → 按比较模式与期望值比较 → 匹配则 Passed,否则 Failed。

Action(动作步骤)不产生 Pass/Fail 判定,而是执行一个操作,例如调用 DLL、设置变量、发送命令等。配置时需要在步骤属性的 Action 选项卡中选择动作类型,如 Set Variable Value、Call DLL、Run VI 等。例如,使用 Action 步骤将 FileGlobals.TestCounter 加 1,或者调用一个 DLL 函数初始化硬件。执行逻辑是:执行指定动作 → 不更新 Pass/Fail 状态(除非动作本身出错)。Action 步骤常用于测试前的准备和测试后的清理。

Sequence Call(序列调用)用于在当前序列中调用另一个序列。配置时需要指定 Sequence Name(被调用的序列名)和 Parameters(传递的参数)。例如,主测试序列调用 Initialize 序列进行设备初始化,传递 FileGlobals.ResourceHandle 作为参数。执行逻辑是:暂停当前序列 → 执行被调用序列 → 返回后继续执行后续步骤。Sequence Call 支持递归调用和条件调用,是实现模块化测试的关键。

配置提示:在配置 Numeric Limit Test 时,建议将 Low Limit 和 High Limit 绑定到 FileGlobals 变量,而不是硬编码数值。这样在更换测试规格时只需修改变量值,无需逐个修改步骤。

步骤执行顺序与结果传递

TestStand 默认按步骤在序列中的排列顺序依次执行。每个步骤执行后,会更新自己的状态(Passed、Failed、Skipped、Error 等),并可能将结果写入变量或报告。步骤之间可以通过变量传递数据:前一个步骤将测量结果写入 Locals.Measurement,后一个步骤读取该变量进行判定。

当某个步骤失败时,TestStand 的默认行为是继续执行后续步骤,但可以通过步骤属性中的 Run Mode 设置为 Skip on Failure 或 Goto Cleanup 来改变流程。例如,将关键测试步骤的 Run Mode 设为 Goto Cleanup,一旦失败就跳转到清理序列,避免后续无效测试。

理解序列文件的结构和步骤类型的执行逻辑,是编写可靠测试程序的前提。在实际开发中,建议先规划好序列的层次和变量作用域,再逐步添加步骤并配置参数,最后通过回调完善异常处理和日志记录。这样构建的测试程序不仅功能正确,而且易于维护和扩展。