3、开发环境准备:安装配置TestStand、Visual Studio、相关工具链,以及创建第一个简单的自定义UI项目
TestStand 本身是一个强大的测试序列执行引擎,但其默认的 Operator Interface(操作员界面)往往无法完全满足特定产线、特定工艺或特定客户的要求。自定义 UI 开发的核心,在于通过外部应用程序(通常基于 .NET 或 C/C++)调用 TestStand 的 API,将序列执行、数据采集、结果展示和用户交互深度整合。本章将系统讲解从零开始搭建开发环境的关键步骤,包括 TestStand 与 Visual Studio 的版本选型、安装顺序、工具链配置,以及如何创建并运行第一个能够加载序列并显示结果的简单自定义 UI 项目。这一环节是后续所有高级定制功能的基石,环境配置的正确性直接决定了开发效率和调试体验。
上图展示了自定义 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。
操作流程
- 确定系统架构:检查测试仪器(如 NI PXI 模块、是德科技万用表)的驱动位数。若驱动为 32 位,则 TestStand 和 UI 项目均需使用 32 位(x86)构建。
- 安装顺序:先安装 Visual Studio(勾选“.NET 桌面开发”和“C++ 桌面开发”工作负载),再安装 TestStand。切勿颠倒顺序,因为 TestStand 安装程序会检测 VS 版本并注册对应的加载项和模板。
- 安装 NI 驱动套件:若使用 NI 硬件,需安装 NI-DAQmx、NI-VISA 等驱动,并确保其版本与 TestStand 兼容。建议在 TestStand 安装完成后,再安装驱动,以便 TestStand 自动识别硬件模块。
- 配置环境变量:将 TestStand 的
bin目录(如C:\Program Files (x86)\National Instruments\TestStand 2021\Bin)添加到系统 PATH 中,便于命令行工具调用。
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 Studio | 2022 17.8+ | 安装“.NET 桌面开发”和“C++ 桌面开发” |
| TestStand | 2021 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;,若能正常编译,则引用成功。
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 需要显示每一步的名称和通过/失败状态。
- 设计界面:在窗体上放置一个
ListBox用于显示步骤,一个Button用于启动测试。 - 编写事件处理:在按钮点击事件中,创建引擎并加载序列。订阅
exec.OnStepStarted事件,在回调中获取当前步骤名并添加到 ListBox。 - 处理完成事件:订阅
exec.OnExecutionEnded,弹出消息框显示总体结果。 - 释放资源:在窗体关闭时,调用
engine.Shutdown()释放引擎。
运行后,界面会实时显示步骤名称,测试结束后显示结果。这个案例验证了环境配置的正确性,也展示了 API 的基本调用模式。
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 版本与开发机一致或更高(向下兼容)。