1. TestStand适配器架构总览

TestStand 本身并不直接执行 LabVIEW VI 或 C# 方法,它扮演的是测试执行引擎与序列调度器的角色:负责解析序列文件、管理步骤流程、记录结果、处理报表与并行测试。真正“干活”的代码——无论是 LabVIEW 的 VI、C# 的类库方法,还是 DLL、Python 脚本——都通过适配器(Adapter)这一中间层被调用。理解适配器架构,是掌握 LabVIEW 与 C# 混合集成开发的第一道门槛。

适配器在 TestStand 中的角色

可以把适配器理解为“翻译官 + 接线盒”。TestStand 的步骤(Step)在序列文件中只保存通用描述信息,例如步骤类型、模块路径、参数列表、调用配置等;而具体“如何加载目标代码、如何传参、如何取回返回值、如何报告错误”这些与语言相关的细节,全部由适配器实现。TestStand 引擎在运行到某个步骤时,会查询该步骤绑定的适配器,把控制权交给适配器,由适配器完成与外部代码的交互,再把执行状态(成功、失败、错误码、耗时)回传给引擎。

这种设计带来三个直接好处:其一,序列文件与具体编程语言解耦,同一套序列框架可以调用不同语言编写的模块;其二,新增语言支持只需开发新适配器,无需改动引擎;其三,参数传递、错误处理、资源释放等共性逻辑被适配器统一封装,测试开发者只需关注业务逻辑本身。

LabVIEW 与 C# 适配器的定位差异

TestStand 出厂自带多个适配器,其中最常用的两个正是本节关注的重点:LabVIEW 适配器与.NET 适配器(C# 代码通常编译为 .NET 程序集,因此走 .NET 适配器路径)。二者定位有明显区别:

  • LabVIEW 适配器:直接调用 VI。它理解 LabVIEW 的数据类型(数值、布尔、字符串、数组、簇、波形等),能够自动完成 TestStand 属性与 VI 前面板控件/指示器之间的映射。适合测量采集、信号处理、仪器驱动等图形化编程场景。
  • .NET 适配器:调用 .NET 程序集中的类与方法。它通过反射加载程序集,按方法签名匹配参数,支持静态方法与实例方法。适合复杂算法、数据库访问、业务逻辑封装、已有 C# 资产复用等场景。

两者并非互斥。实际项目中常见做法是:用 LabVIEW 完成硬件交互与实时采集,用 C# 完成数据处理与上层逻辑,再由 TestStand 序列把二者串联成完整测试流程。

序列调用外部代码的机制

无论使用哪种适配器,调用过程都遵循一条共同的信号链:序列步骤 → 适配器 → 目标代码 → 返回值/错误 → 引擎记录。以调用一个 LabVIEW VI 为例,TestStand 引擎执行到该步骤时,LabVIEW 适配器会:

  1. 根据步骤中记录的 VI 路径加载 VI(若已加载则复用);
  2. 读取步骤的参数字段,把 TestStand 变量按名称映射到 VI 的输入控件;
  3. 以配置的调用方式(如“按引用调用”)运行 VI;
  4. VI 执行完毕后,把输出指示器的值写回步骤的参数字段或局部变量;
  5. 根据 VI 的错误簇判断步骤状态,写入结果记录。

调用 C# 方法时机制类似,区别在于 .NET 适配器需要通过程序集路径 + 类名 + 方法名定位目标,并按方法参数类型做类型转换。若方法签名与步骤参数不匹配,适配器会在加载阶段报错,而不是等到运行时才失败——这一点对调试非常关键。

适配器报错通常发生在两个时机:加载期(路径错误、程序集缺失、方法签名不匹配)和运行期(参数类型转换失败、目标代码抛出异常)。区分这两个时机,能大幅缩短排障时间。

整体集成路线

从工程落地角度看,LabVIEW 与 C# 适配器集成通常遵循以下路线:先确定哪些功能用 LabVIEW 实现、哪些用 C# 实现;再分别准备好 VI 与 .NET 程序集,确保接口清晰、参数类型明确;然后在 TestStand 中创建序列,为每个步骤选择合适的适配器并配置模块路径与参数映射;最后通过单步调试验证每个模块的输入输出,再串联成完整测试序列。

下面这张图展示了 TestStand 引擎、两类适配器与外部代码之间的整体架构关系,以及序列步骤调用外部代码时的数据流向。

TestStand 引擎 序列调度 · 流程控制 · 结果记录 · 报表 序列文件 (.seq) 步骤 · 参数 · 适配器绑定 LabVIEW 适配器 VI 加载 · 控件映射 · 错误簇解析 .NET 适配器 程序集加载 · 反射调用 · 类型转换 LabVIEW VI 采集 · 信号处理 · 仪器驱动 C# 程序集 (.dll) 算法 · 数据库 · 业务逻辑 调度 绑定 调用 调用 返回 返回 结果 / 错误码回传引擎记录 引擎层 LabVIEW 路径 .NET 路径 序列与结果

从图中可以清楚看到两条并行的调用路径:左侧绿色序列文件通过适配器绑定,分别进入橙色 LabVIEW 路径和紫色 .NET 路径,最终到达各自的代码实体;执行完成后,返回值与错误信息沿虚线回传,由引擎统一记录。这种“引擎—适配器—代码”的三层结构,正是 TestStand 能够灵活集成多种语言的根本原因。

在实际配置时,需要特别关注几个关键点:LabVIEW 适配器要求 VI 的输入输出控件命名与步骤参数一致,否则映射会失败;.NET 适配器要求程序集路径、类名、方法名完全匹配,且方法参数类型需与步骤参数兼容。建议在集成初期先用最简单的“加法 VI”和“加法方法”做连通性验证,确认适配器配置无误后,再逐步替换为真实业务模块。这样可以把适配器层面的问题与业务逻辑问题分开定位,避免混在一起难以排查。