ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TestStand入门指南:序列、LabVIEW集成与数据库落库

TestStand入门指南:序列、LabVIEW集成与数据库落库 简介面向首次接触TestStand的测试工程师、LabVIEW开发者及自动化测试入门者的初级课程资料旨在帮助读者快速掌握序列编辑、测试站配置、参数与变量设定、结果数据处理等核心操作并能与LabVIEW的VI模块协同搭建可复用的自动化测试流程。压缩包共含20个文件整体约17MB以12份PDF讲义为核心覆盖环境介绍、序列创建、代码模块外部集成、数据库交互、用户管理及发布配置等主题另含2张PNG示意图和1份docx界面定制文档以及配置与数据库辅助文件便于练习。已有1982人学习浏览。课程除基础功能外还侧重TestStand与LabVIEW的集成方法例如将VI作为测试步骤调用、利用决策步骤依据结果选择执行路径并延伸到错误处理、结果报告生成、模块封装与脚本接口定制化开发能帮助读者从零建立测试自动化思路为后续独立设计测试项目打基础。1. TestStand 入门资源拆解先弄懂它在测试流程里扮演什么角色这套 TestStand 入门课程包不是带你背菜单的。它把 TestStand 从“打开软件”到“序列跑起来、结果进数据库”的完整闭环拆开讲透而且直接配了 Lesson_1 到 Lesson_12 的官方风格 PDF外加 hands-on 练习包和 UI 定制文档。很多人第一次接触 TestStand 会误以为它是和 LabVIEW 一样的编程工具实际上它是个执行管理器——负责调度测试步骤、管理数据、生成报告、连接数据库真正的测量代码还是由 LabVIEW 这类外部环境提供。这个包适合两类人一是刚转测试岗、需要在产线快速搭出可用序列的工程师二是已经会用 LabVIEW 写 VI、想把散落的测试程序组织成标准化流程的人。从环境认知一路覆盖到数据库交互和分发部署学完确实能直接上手。2. TestStand 执行模型序列、步骤与引擎的三层关系这套初级资料的前三课恰好覆盖了一条最短路径认识环境Lesson_1、搞清界面与配置文件Lesson_2、创建并运行第一个序列Lesson_3。先把“引擎—序列—步骤”这三层关系理清后面所有操作都不会跑偏。TestStand 本身不执行测量它只负责调度一个测试项是一个步骤一组步骤按顺序组成序列序列被引擎创建为 Execution执行实例去运行。这个模型和 LabVIEW 里 VI 之间互相调用的思路同源但 TestStand 把调度逻辑单独拎了出来测试代码本身仍然由 LabVIEW 编译成 VI 提供。2.1 序列文件里到底有什么从 Step 到 Sequence 的层次结构一个 .seq 或 .seqx 文件里包含多个 Sequence每个 Sequence 由若干 Step 组成。Step 不只是“一条命令”它自带 Precondition前置条件满足才执行、Postcondition后置条件、加载选项以及一组可绑定的数据属性。引擎运行时不直接碰你的 VI而是通过 Step Type步骤类型把属性数据传给外部代码模块。这就是为什么同一个 VI 可以被多个步骤复用——只要参数映射不同数据入口就不同。下面是一个文本序列文件的结构示意帮助你建立对 .seq 内部组织的直观印象!-- 文本格式序列文件的简化骨架 (.seqx) -- SequenceFile NameDemoProject Sequence NameMainSequence Step Name初始化仪器 TypeMessagePopup/Type PreconditionLocals.InitDone False/Precondition LoadOptionRuntime/LoadOption /Step Step Name调用测试VI TypeLabVIEW/Type PreconditionTrue/Precondition Module NameMeasure.vi AdapterLabVIEW / Parameters Param NameVoltage SourceLocals.InputVoltage / /Parameters /Step /Sequence /SequenceFile这段结构的逻辑很直白每个 Step 的 Type 决定由哪个执行插件处理Precondition 是一个布尔表达式只有返回 True 才会执行该步骤Module 指向外部 VI 或 DLL 的路径Adapter 标明使用哪种调用环境Parameters 里的 Source 属性写的是表达式引擎在运行时会实时计算并把值传给代码模块。把 Precondition 改成Locals.InitDone False的效果是第一次执行会弹窗第二次执行时因为变量被置位条件为假整个步骤被跳过。这是做初始化保护最常见的写法。2.2 从环境布局到第一个序列插入面板与步骤属性的操作路径学习材料里 Lesson_1 到 Lesson_3 的分工很清晰我整理成了一张对应表方便做笔记时定位课程文件覆盖能力上手后你能做的事Lesson_1 Introduction to TestStand软件定位、界面总览、序列演示说出 TestStand 和 LabVIEW 的职责边界Lesson_2 TestStand Environment工具栏、插入面板、配置对话框、.td/.cfg 文件看懂环境配置文件知道运行环境从哪加载Lesson_3 Creating Sequences新建序列、添加步骤、执行与终止从零建一个 Demo 序列并跑起来按这张表走一遍操作路径就够了打开 TestStand 后新建一个序列文件从右侧 Insertion Palette插入面板里拖一个 Message Popup 步骤到序列窗口然后在 Step 属性面板里把 Name 改成“初始化仪器”Precondition 里写Locals.InitDone False再添加一个 Sequence Call 步骤让它跳转到子序列保存为 .seq 文件按 CtrlF5 运行。这里你会在界面上同时看到 Execution 窗口和序列执行进度这正是理解引擎调度的活教材。2.3 别被 .td 和 .cfg 吓到它们不是源码是环境快照Lesson_2 的文件清单里有.td和.cfg后缀很多初学者第一次看到会以为这是某种源码或工程文件。实际上 .td 是 TestStand Deployment部署配置的缩写.cfg 是运行时环境配置文件。它们记录的是“运行这个序列文件需要加载哪些步骤类型、搜索路径指向哪里、用哪个引擎版本”。换句话说如果 .seq 是测试流程本身.td/.cfg 就是流程跑起来所需要的环境快照。这也是为什么后边 Lesson_12 专门讲 Distribution——序列文件拷到另一台电脑上能不能跑往往就取决于这份环境配置跟没跟过去。现阶段你只需要知道这两个后缀的用途不必深究内部格式。3. 参数、变量与表达式让数据在序列和设备之间流动TestStand 里数据流的设计和 LabVIEW 有本质区别。LabVIEW 靠连线把数据从一个节点送到另一个节点而 TestStand 靠的是属性对象和表达式。表层看这是一套新语法底层看它是一个运行时的属性树——Sequence、Step、Execution、Station 都挂在这棵树上。要学会 TestStand必须先把这棵树的枝干摸清。3.1 数据放在哪Locals、Parameters、FileGlobal、StationGlobal 的取舍Lesson_4 里花了大量篇幅讲 Parameters、Variables 和 Expressions核心其实是四个存放位置。初学者最常见的困惑是“变量到底该建在哪一层”我一般按这个原则划分单个步骤内部临时算的数据用 Step 属性一个序列文件内共享的用 Locals整个测试站所有序列文件共享的用 StationGlobal需要跨序列传递参数时用 Parameters。存储位置作用域典型用途生命周期Step 属性单个步骤内部暂存当前测量结果、临时标志步骤结束时仍保留但一般不跨步骤传递Locals单个序列内所有步骤循环计数、累计结果、当前 UUT 信息序列执行期间存活Parameters序列之间传递调用子序列时传入产品型号、测试项名称随序列调用栈管理FileGlobal / StationGlobal文件级 / 整站级仪器句柄、全局配置、跨序列共享的计数器StationGlobal 在 TestStand 引擎生命周期内一直存活这里有一个工程习惯可以参考凡是和具体被测产品相关的数据序列号、型号、批次号统一放在 Locals 或 Parameters 里凡是和测试环境相关的数据仪器地址、通信参数、操作员 ID放 StationGlobal。如果混着放后期做数据库记录和报告定制时会非常痛苦因为你永远不知道某个值是从哪一层取出来的。3.2 表达式是 TestStand 的“胶水语言”工具属性栏里到处是它TestStand 表达式不是图形化语言而是一种接近 Pascal 风格的文本语法。它出现在 Precondition、参数映射、Result 字段赋值、数据库字段绑定等各种地方。下面是一段典型表达式覆盖了计数、布尔组合和动态创建执行// TestStand 表达式语法示例注意属性名大小写敏感 Locals.PassCount 1 Locals.Result (MeasureVoltage 1.8) (MeasureVoltage 2.2) RunState.Root.Engine.NewExecution(MainSequence, )第一行是累加计数比 LabVIEW 里做移位寄存器再 1 直观得多第二行把电压判断结果存成布尔值等下可以直接拿给数据库字段用第三行是动态创建一个新执行实例典型的并发场景才用得着。注意 TestStand 表达式里用表示“与”用||表示“或”和 C 语言一致但字符串拼接用的是这一点和 LabVIEW 的字符串连接节点思路相同。参数值来源是表达式时引擎会在步骤执行的瞬间完成计算所以你在界面里直接写Locals.InputVoltage字符串它会被解析成变量引用而不是字面文本如果你真的想要字面量就得加引号。3.3 接入 LabVIEW VIAdapter 与参数映射的细节TestStand 调用外部代码模块靠的是 AdapterLabVIEW Adapter 是最常用的一种。配置 LabVIEW VI 步骤时有三个地方必须对齐否则就会出现“VI 能打开但参数不识别”的玄学问题。第一步在序列里插入一个 LabVIEW 类型的步骤然后在 Module 配置对话框里选择你的 .vi 文件。第二步是参数映射LabVIEW 里 VI 前面板控件的“名称”必须和 TestStand 侧参数的名称一致。比如 LabVIEW VI 里有一个输入控件叫 VoltageTestStand 侧的 Param Name 也要写成 Voltage大小写最好完全一致。第三步是设置调用方式默认用 Synchronous同步调用VI 返回后步骤才结束如果你需要并行测量可以选 Asynchronous。一个容易忽略的细节是返回值约定。LabVIEW VI 的error out集群会自动被 TestStand 识别为错误输出而布尔型Pass/Fail是否生效取决于你在 VI 里有没有连线到前面板。我习惯的做法是任何测试 VI 都保留两个前面板输出——Numeric Out存实测值Boolean Out存判定结果然后 TestStand 步骤的 Result 里把这两个值映射到自定义字段这样报告和数据库直接就能读到数据。假如你的 VI 本来就是用 LabVIEW 串口通信读仪表的程序多包一层输入输出参数就能立刻被 TestStand 复用不用改内部逻辑。3.4 配置与属性导入导出把环境固化下来Lesson_6 的 Importing and Exporting Properties 和 Lesson_7 的 Configuring TestStand 讲的是同一件事配置也是一等公民。TestStand 允许你把 Station 配置、属性值、搜索路径导出成文件再导入到另一台机器。实际项目中我一般会在每台测试站上先手动配好 Station 配置然后导出一份基准配置放进版本库后续机器直接导入避免人工配错。注意导出属性时默认可能只导出当前序列文件里的内容你要勾选包含 Station 全局配置否则换一台电脑后仪器地址全丢。4. 数据库交互与日志从 DSN 配置到自定义 SchemaTestStand 默认生成的报告是 XML 或 HTML够看但没法做批量追溯。Lesson_10 的 Database Interaction 和 Lesson_11 的 Custom Database Logging 正好补上这块前者讲 TestStand 自带的数据库日志机制后者讲如何按你自己的表结构写入数据。这是整个初级课程里离工程最近的一课因为产线几乎都会要求测试结果入库。4.1 为什么测试结果必须进数据库而不是只在报告里单台仪器调试时报告文件足够一旦到了多工位产线你面对的是每天几千条测试记录靠报告文件做批次追溯根本不可能。TestStand 的做法是每跑完一个 TestUUT测试一个被测产品引擎就把结果推给 Result Processing 模块这个模块里可以挂数据库日志器把指定字段写进数据库表。理解这个机制后你会发现 TestStand 其实是把“采集结果”和“存储结果”拆开了你不需要在 LabVIEW 里单独做数据库写入逻辑。4.2 默认记录器与自定义 Schema两条路线的取舍Lesson_10 和 Lesson_11 分别演示了两种做法。默认记录器适合快速落地表结构由 TestStand 自动创建自定义 Schema 适合已经有 MES 系统或已有测试数据库的工厂。对比项默认数据库记录器Lesson_10自定义数据库日志Lesson_11表结构引擎自动创建字段固定自己建表字段完全可控适用场景原型验证、无历史包袱的项目已有产线数据库、需要和 MES 对接配置成本低只要配 DSN高需要写字段映射灵活性只能记引擎预定义字段可用表达式任意取属性值如果你的现场本来就用 LabVIEW 连接 MySQL 写日志那在 TestStand 里思路要反过来数据库写入交给 TestStand 的日志器统一做LabVIEW 只要把测量值通过参数返回给 TestStand 就行不要两头都写否则会出现同一批次数据一半在库里、一半在文件里的尴尬。4.3 落地步骤先建表再配 DSN最后映射字段我把完整落库流程拆成四步每一步都是你在电脑上可以直接操作的。第一步在数据库里建一张与测试结果对应的表。下面是常见的字段设计CREATE TABLE [dbo].[TestResults] ( [ResultId] INT IDENTITY(1,1) PRIMARY KEY, [SerialNumber] NVARCHAR(64), -- 被测产品序列号 [ModelName] NVARCHAR(64), -- 产品型号 [StepName] NVARCHAR(128), -- 测试步骤名 [Passed] BIT, -- 判定结果 [MeasureValue] FLOAT, -- 实测值 [TestTime] DATETIME DEFAULT GETDATE() -- 服务器时间 );这里有几个选型细节值得说Passed 用 BIT 正好对应 TestStand 的布尔值MeasureValue 用 FLOAT 而不用字符串是为了后续做统计查询TestTime 让数据库来写而不是客户端传避免各工位电脑时钟不同步导致排序混乱。如果你连的是 Access 而不是 SQL Server字段类型需相应调整但设计原则不变。第二步配置 ODBC 数据源。打开 Windows 的 ODBC 管理器新建一个系统 DSN指向目标数据库。注意 32 位和 64 位的 DSN 不是同一个TestStand 是 32 位程序就得用 32 位 ODBC 管理器否则后边日志器连不上库。第三步在 TestStand 的 Configure 菜单里找到 Result Processing启用 Database Logging选择刚才配置的 DSN。这一段的对话框会自动列出你建的表的字段等你做映射。第四步也是最关键的一步字段映射。TestStand 用%属性路径%这种替换语法把运行时的值写入字段示意如下数据库字段TestStand 属性表达式说明SerialNumber%Locals.UUT_SerialNumber%产品序列号通常启动时从扫码枪读入ModelName%Parameters.ModelName%经参数传入的型号StepName%Step.Name%当前步骤名Passed%Step.Result.Status%布尔状态映射到 BIT 字段MeasureValue%Step.Result.MeasureValue%自定义的实测值字段这条映射关系写好后每次 TestUUT 结束引擎会逐行求值这些表达式然后写库。写表达式时最常犯的错是把变量名拼错运行时不会立刻报错但入库字段会变成空字符串排查起来很隐蔽。4.4 练习包定位hands-on 文件与课程文档的配合压缩包里那个ate_hands-on_2008.zip就是配合 Lesson_10/11 使用的练习工程里面预设了序列文件和示例配置照着 PDF 一步步改就能看到数据落库。我自己的习惯是先把 Lesson_10 默认记录器跑通再对照 Lesson_11 把字段映射改成自己的表——同一个数据库连接基础先用默认流程建立信心再进入自定义阶段比直接挑战自定义 Schema 少踩很多坑。5. 避坑指南TestStand 入门复现中最常见的五个坑下面五条都是从实际授课和产线交付里反复出现的踩坑记录按“现象 → 原因 → 解决”列出。新手大概率会遇到其中至少两条建议直接收藏作为检查清单。5.1 部署与执行环境相关的坑坑一把序列文件拷到别的电脑后打开报“Step Type not found”或直接红屏。现象是序列文件在原电脑上跑得好好的一换电脑就挂。原因是部署时只拷贝了 .seq 文件没有把自定义 Step Type如某些 NI 或第三方插件一起带过去或者目标机的 Search Path 没有指向步骤类型所在目录。解决方法是回到原电脑用 Deployment Utility 完整打包把 Step Types、运行时引擎和序列文件放在同一个相对目录结构下再在目标机 Station 配置里把 Search Path 加进去。Lesson_2 里的 .td/.cfg 文件在这一步就是关键——它们记录了当初这个环境是怎么拼起来的。坑二TestStand 调 LabVIEW VI 报“VI not found in memory”或加载失败。现象是 VI 路径明明对单独打开 VI 也能跑但 TestStand 就是加载不起来。最常见原因是位数不一致TestStand 是 32 位VI 却编译成了 64 位或者反过来。其次是 VI 被打了包路径改成了相对路径TestStand 没找到。解决方法是统一位数并且把 VI 放在序列文件的相对子目录下用相对路径引用不要硬编码绝对路径。你在 LabVIEW 程序打包时一定被 runtime engine 折腾过这里完全是同一种思维模式。5.2 数据、界面与配置相关的坑坑三数据库日志器显示连接成功但表里永远没有新数据。现象是测试正常跑数据库里零星几条记录或直接空白。原因通常是 ODBC DSN 位数不匹配或者字段映射里写错了属性路径导致引擎插入时报错但被你忽略了。解决方法是先从 ODBC 管理器确认 DSN 是 32 位还是 64 位再打开 Result Processing 对话框看错误日志如果表里个别字段是空的重点检查映射表达式里%变量名%的大小写TestStand 属性名是区分大小写的%Locals.uut%和%Locals.UUT%是两个变量。坑四UI Messages 发了消息但界面不刷新或者整个界面卡死。现象是用自定义 UI 面板时从序列里 Post 一条消息到界面界面没反应再过一会儿 TestStand 无响应。原因是线程模型用错了序列在执行线程里同步等待 UI 线程处理消息而 UI 线程又被某个阻塞操作占住形成互相等待。解决方法是把消息发送改成异步方式PostUIMessage不要在 UI 消息回调函数里做耗时操作界面收到消息后只更新显示数据读取放到序列侧完成。Lesson_11 那个自定义日志 UI 是典型场景界面上的进度条如果不刷新先怀疑是消息发送方式而不是怀疑界面代码本身。坑五属性导入导出后表达式变成了静态值返回结果全部异常。现象是本来配置好的表达式型参数导入到另一台电脑后变成了一串固定文本测试结果全取到同一个数。原因是导出属性时默认只导出了属性值没有导出属性的表达式源DataSource。解决方法是导出时在选项里选择导出所有属性、包含表达式源而不是只导出当前值导入前也在原电脑上检查一遍各参数是“静态值”还是“表达式”确认后再执行导入。6. 进阶技巧从入门到能交付工程的三个习惯入门资料学完后判断你是否真的入了门不是看你会不会点按钮而是看你能不能把序列写得别人能接手。这里分享三个我自己一直在用的习惯都是从这套课程基础上长出来的。第一个习惯先建 TestStand Types再写序列。Lesson_9 专门讲 Types但很多人学完就忘了。我的做法是每接到一个新项目先把 UUT 信息容器建好用自定义类型把序列号、型号、批次、上下限全部定义成结构化属性再开始搭序列。这样一来 Locals 里不会散落几十个无关联的变量后续写数据库字段映射时表达式路径也短得多。第二个习惯让报告能直接当追溯依据而不是原始日志。每次给步骤写 Result 字段时多做一步把实测值、上限、下限、判定依据全部写进自定义结论字段。这样做的好处是报告发出去别人不需要打开序列文件就能知道这个结果是怎么判出来的。我自己被这个习惯救过不止一次——客户验收时拿着一份报告问你“这个值怎么判的”直接看报告里的判据字段就能回答。第三个习惯交付前强制走一遍部署检查清单。Lesson_12 讲 Distribution但课堂练习往往只做打包那一步。我后来把部署检查固定成五件事运行时引擎是否已安装、Step Types 是否打进了包、搜索路径是否指向正确位置、数据库 DSN 在目标机是否重新配置过、LabVIEW Adapter 位数与 VI 是否一致。有一次我把序列文件直接拷到产线机器现场红了一片排查半天才发现是漏了 Step Types——从那以后我每次交付测试站都强制自己走一遍这个清单再急也不跳过。这套入门课程帮你把 TestStand 跑通但能不能在产线上稳定运行靠的是这些交付前的小习惯希望帮到你。本文还有配套的精品资源点击获取
返回列表