3、开发环境准备:安装配置TestStand、Visual Studio、相关工具链,以及创建第一个简单的自定义UI项目

TestStand 本身是一个强大的测试序列执行引擎,但其默认的 Operator Interface(操作员界面)往往无法完全满足特定产线、特定工艺或特定客户的要求。自定义 UI 开发的核心,在于通过外部应用程序(通常基于 .NET 或 C/C++)调用 TestStand 的 API,将序列执行、数据采集、结果展示和用户交互深度整合。本章将系统讲解从零开始搭建开发环境的关键步骤,包括 TestStand 与 Visual Studio 的版本选型、安装顺序、工具链配置,以及如何创建并运行第一个能够加载序列并显示结果的简单自定义 UI 项目。这一环节是后续所有高级定制功能的基石,环境配置的正确性直接决定了开发效率和调试体验。

TestStand 自定义 UI 开发环境拓扑与数据流 开发机(Windows 10/11 x64) Visual Studio 2022 C# / VB.NET / C++ 工作负载 TestStand 2021/2023 序列编辑器 + 开发授权 工具链组件 .NET SDK / NI 驱动 / Git 环境变量 / 搜索路径 TestStand API DLL 引用 TestStand API 层 Engine / SequenceContext Result / Property 运行时目标(测试工位) 自定义 UI 可执行文件 WinForms / WPF 界面 TestStand 运行时引擎 部署授权 / 序列执行 测试仪器驱动 VISA / IVI / 串口 / GPIB 测试序列文件(.seq) 测试步骤 / 流程模型 进程内/跨进程调用 图 3-1 开发环境与运行时环境的逻辑关系及 API 调用路径

上图展示了自定义 UI 开发中开发机与运行时目标之间的逻辑关系。开发机上的 Visual Studio 通过引用 TestStand 提供的 .NET 程序集(如 NationalInstruments.TestStand.Interop.dll)来编译生成 UI 可执行文件。该文件在运行时与 TestStand 引擎交互,引擎负责加载序列文件、执行测试步骤并管理结果。理解这一数据流是配置环境的前提。

3.1 版本选型与安装顺序:避免“装完就崩”的坑

核心原理

TestStand 的版本兼容性矩阵非常严格。不同版本的 TestStand(如 2019、2021、2023)对应不同的 .NET Framework 版本要求,并且对 Visual Studio 的版本有官方支持范围。例如,TestStand 2021 官方支持 Visual Studio 2019 和 2022,但需要安装对应的 .NET 桌面开发工作负载。此外,TestStand 的 32 位与 64 位版本选择也至关重要——若测试仪器驱动仅提供 32 位 DLL,则 UI 项目必须编译为 x86 平台,否则运行时会出现 BadImageFormatException。

操作流程

  1. 确定系统架构:检查测试仪器(如 NI PXI 模块、是德科技万用表)的驱动位数。若驱动为 32 位,则 TestStand 和 UI 项目均需使用 32 位(x86)构建。
  2. 安装顺序:先安装 Visual Studio(勾选“.NET 桌面开发”和“C++ 桌面开发”工作负载),再安装 TestStand。切勿颠倒顺序,因为 TestStand 安装程序会检测 VS 版本并注册对应的加载项和模板。
  3. 安装 NI 驱动套件:若使用 NI 硬件,需安装 NI-DAQmx、NI-VISA 等驱动,并确保其版本与 TestStand 兼容。建议在 TestStand 安装完成后,再安装驱动,以便 TestStand 自动识别硬件模块。
  4. 配置环境变量:将 TestStand 的 bin 目录(如 C:\Program Files (x86)\National Instruments\TestStand 2021\Bin)添加到系统 PATH 中,便于命令行工具调用。
风险提示: 若在安装 TestStand 之后再安装 Visual Studio,TestStand 的“新建序列”右键菜单中的“创建自定义 UI 项目”模板可能无法注册。此时需手动修复:以管理员身份打开命令提示符,进入 TestStand 安装目录下的 Bin 文件夹,执行 TestStand.exe /RegServer 重新注册组件。

案例拆解:32/64 位不匹配导致启动崩溃

某产线工程师在开发自定义 UI 时,将 Visual Studio 项目平台设置为“Any CPU”,而 TestStand 引擎为 32 位。当 UI 尝试调用 Engine.NewExecution() 时,程序抛出 BadImageFormatException。分析日志发现,TestStand 的互操作程序集是 32 位的,而 Any CPU 模式在 64 位系统上默认以 64 位进程运行,导致加载失败。解决方案:在 VS 中打开项目属性 → 生成 → 平台目标,明确选择“x86”,并关闭“首选 32 位”选项。修改后程序正常运行。

组件推荐版本关键配置
操作系统Windows 10/11 企业版 x64关闭 UAC 虚拟化,使用管理员账户
Visual Studio2022 17.8+安装“.NET 桌面开发”和“C++ 桌面开发”
TestStand2021 SP1 或 2023选择“完整安装”,包含序列编辑器
.NET SDK.NET Framework 4.8 或 .NET 6/8根据 TestStand 版本选择,2021 支持 .NET 4.8
NI 驱动NI-DAQmx 2023 Q3+与 TestStand 同位数(x86/x64)

3.2 Visual Studio 中 TestStand API 的引用与配置

核心原理

TestStand 提供两种 .NET 互操作方式:Primary Interop Assembly (PIA) 和 .NET Core/.NET 5+ 支持。对于传统 WinForms/WPF 项目,推荐使用 PIA,即 NationalInstruments.TestStand.Interop.dll。该程序集位于 TestStand 安装目录的 Bin 文件夹下。正确引用此 DLL 是编写代码的前提,同时需要设置“嵌入互操作类型”为 False,以避免版本绑定问题。

操作流程

  • 创建项目:在 VS 中新建“Windows 窗体应用 (.NET Framework)”项目,目标框架选 .NET Framework 4.8。
  • 添加引用:右键“引用” → “添加引用” → “浏览”,定位到 Bin 目录,选择 NationalInstruments.TestStand.Interop.dll 和 NationalInstruments.TestStand.UI.dll(后者包含 UI 控件)。
  • 设置属性:在解决方案资源管理器中选中该引用,在属性窗口中设置“嵌入互操作类型”为 False,“复制本地”为 True(确保输出目录包含 DLL)。
  • 验证引用:在代码中输入 using NationalInstruments.TestStand.Interop;,若能正常编译,则引用成功。
经验提示: 若使用 .NET 6/8 开发跨平台 UI,需使用 TestStand 2023 及以上版本,并引用 NationalInstruments.TestStand.Interop.NetCore.dll。但 WinForms 在 .NET 6+ 上仅支持 Windows,因此建议仍以 .NET Framework 4.8 为主,兼容性最佳。

常见误区

很多初学者直接复制 TestStand 安装目录下的 DLL 到项目输出文件夹,而不通过 VS 引用管理器添加。这会导致 VS 无法识别类型,且无法自动复制依赖项。正确做法是始终通过“添加引用”对话框操作,并检查“本地复制”属性。

3.3 创建第一个自定义 UI:加载序列并执行

核心原理

自定义 UI 的本质是创建一个 TestStand 引擎对象(Engine),然后通过该对象加载序列文件(.seq),并创建执行(Execution)。UI 需要处理 Execution 的状态变化事件(如 OnExecutionStatusChanged),以更新界面显示。最简单的 UI 只需三个控件:一个“加载序列”按钮、一个“开始测试”按钮、一个显示当前步骤名称的文本框。

操作流程

// 初始化引擎
Engine engine = new Engine();
engine.Initialize();

// 加载序列文件
SequenceFile seqFile = engine.GetSequenceFile(@"C:\Test\Demo.seq", false, false);

// 创建执行
Execution exec = engine.NewExecution(seqFile, "MainSequence", null, false, ExecutionType.Sequential, null);

// 启动执行
exec.WaitForEnd(ExecutionResult.Complete, 10000); // 等待完成,超时10秒

// 获取结果
string status = exec.Result.Status.ToString();
MessageBox.Show("测试完成,状态:" + status);

上述代码展示了最小可运行逻辑。在实际项目中,应使用 Execution 的事件回调来异步更新 UI,避免阻塞界面线程。例如,订阅 exec.OnStepStarted 事件,在事件处理函数中通过 Invoke 更新文本框。

案例拆解:从空白窗体到可运行 UI

假设我们有一个简单的 Demo.seq,包含两个步骤:第一步是“数字万用表读取电压”,第二步是“判断电压范围”。我们的 UI 需要显示每一步的名称和通过/失败状态。

  1. 设计界面:在窗体上放置一个 ListBox 用于显示步骤,一个 Button 用于启动测试。
  2. 编写事件处理:在按钮点击事件中,创建引擎并加载序列。订阅 exec.OnStepStarted 事件,在回调中获取当前步骤名并添加到 ListBox。
  3. 处理完成事件:订阅 exec.OnExecutionEnded,弹出消息框显示总体结果。
  4. 释放资源:在窗体关闭时,调用 engine.Shutdown() 释放引擎。

运行后,界面会实时显示步骤名称,测试结束后显示结果。这个案例验证了环境配置的正确性,也展示了 API 的基本调用模式。

关键点复盘: 环境配置的核心是“三位一体”——TestStand 引擎位数、VS 项目平台目标、仪器驱动位数必须一致。任何一位不匹配,都会导致运行时异常。此外,务必在开发早期就建立“日志输出”机制,例如使用 Console.WriteLine 或写入文本文件,便于定位 API 调用错误。

3.4 工具链扩展:调试与部署准备

核心原理

除了 VS 和 TestStand,完整的工具链还应包括:源代码管理(如 Git)、自动化构建(如 MSBuild)、部署工具(如 InstallShield 或 MSI)。对于 TestStand 项目,序列文件(.seq)和 UI 可执行文件需要分开部署。UI 程序集应放在固定目录,并在代码中使用相对路径或注册表定位 TestStand 安装位置。

操作流程

  • 配置 Git 忽略文件:忽略 bin、obj 文件夹以及 *.user 文件,避免将编译产物和本地配置提交到仓库。
  • 使用 MSBuild 脚本:创建 build.proj 文件,定义编译、复制 DLL、打包序列文件的任务。示例命令:msbuild build.proj /p:Configuration=Release。
  • 部署检查清单:目标机器需安装 TestStand 运行时引擎(免费部署授权)、对应版本的 .NET Framework、仪器驱动。使用 TestStand 部署管理器 生成安装包,可自动检测依赖。
工具用途注意事项
Git版本控制使用 .gitignore 排除生成文件
MSBuild命令行编译需在 VS 开发者命令提示符中运行
TestStand 部署管理器生成安装包勾选“包含 TestStand 运行时”
Process Explorer调试 DLL 加载问题查看进程加载的模块路径

常见误区与总结

一个高频错误是:开发机可以运行 UI,但部署到测试工位后提示“无法加载 NationalInstruments.TestStand.Interop.dll”。原因通常是未将 TestStand 运行时引擎安装到目标机,或者 UI 程序集引用了开发机特有的路径。解决方法是使用部署管理器,并确保目标机的 TestStand 版本与开发机一致或更高(向下兼容)。