3. 测试数据结构化组织
在自动生成测试报告之前,真正决定报告质量与归档效率的,往往不是报表模板,而是数据在 LabVIEW 内存中的组织方式。如果每个通道的电压、电流、温度都各自用一根独立连线传递,程序框图会迅速变成“蜘蛛网”,报告生成端也不得不针对每个参数写一套拼接逻辑。结构化组织的目标,是把“多通道 × 多参数 × 多时刻”的测试结果,收敛为少数几个语义清晰、可整体传递、可整体归档的数据类型。
一、四种数据容器的分工
LabVIEW 中承担结构化职责的核心是四类对象,它们并非互相替代,而是各管一层:
- 数组:管理“同一类参数的多个样本”。例如 8 个通道的电压值,用一维数值数组表示;若每个通道还要记录 1000 个采样点,则用二维数组,第一维为通道、第二维为采样点。
- 簇:管理“一次测试中不同类参数的集合”。例如一次采集结果包含时间戳、通道号、电压、电流、温度、状态码,这些类型不同、含义不同的量放进一个簇,就构成一条完整的“测试记录”。
- 波形数据类型:LabVIEW 内置的簇,固定包含 t0(起始时间)、dt(采样间隔)和 Y(采样值数组)。它天然携带时间轴信息,适合表达连续采集的时域信号,避免“只有数据没有时间”的归档缺陷。
- 自定义控件(.ctl):把上述结构固化为可复用类型。一旦定义为自定义控件,所有子 VI、报告生成模块、归档模块引用的是同一个类型定义,字段增删只需改一处。
二、推荐的层次化数据模型
面向多通道多参数测试,建议采用“三层嵌套”模型,自内向外依次为:
- 参数层:单个物理量用波形数据类型表示,如“电压波形”“温度波形”,保留 t0 与 dt。
- 通道层:一个通道的多个参数组成簇,例如“通道结果”簇包含通道名(字符串)、电压波形、电流波形、温度波形、通道状态(枚举)。
- 测试层:所有通道的“通道结果”簇组成一维数组,再与测试元信息(产品序列号、测试时间、操作员、工位号、总体判定)合并为顶层簇“测试记录”。
这样,整个测试结果在程序框图上只是一根线。报告生成模块接收这根线,遍历通道数组即可逐通道输出表格;归档模块接收同一根线,直接序列化写入 TDMS 或 JSON,无需再关心内部字段顺序。
三、自定义控件:把结构“冻结”为类型
上述三层结构如果只在某个 VI 里临时用“捆绑簇”函数拼出来,一旦字段调整,所有引用点都要手工修改。正确做法是逐层创建自定义控件:
- 新建“波形”类型控件,直接使用 LabVIEW 内置波形数据类型,无需自定义。
- 新建“通道结果.ctl”,内部放置通道名(字符串)、通道状态(枚举)、电压/电流/温度三个波形控件。
- 新建“测试记录.ctl”,内部放置序列号、时间、操作员、总体判定,以及一个“通道结果”数组,数组元素类型选择上一步的 .ctl。
此后,采集子 VI 的输出接线端、报告生成子 VI 的输入接线端、归档子 VI 的输入接线端,全部使用“测试记录.ctl”。字段变更时只需重新编辑 .ctl 并保存,LabVIEW 会自动更新所有引用实例,这是结构化组织相对于“散线传递”的最大工程收益。
四、示例:一次 4 通道测试的数据装配
假设某电源模块测试工位有 4 个输出通道,每通道采集电压、电流、温度三路信号,采样率 1 kHz,采集 0.5 s,即每路 500 个点。按上述模型装配过程如下:
采样参数:fs = 1000 Hz,dt = 0.001 s,N = 500 点
通道数:4(CH1 ~ CH4)
每通道参数:电压(V)、电流(A)、温度(℃)
对每个通道 i:
电压波形.Y = 采集到的 500 点电压数组
电压波形.t0 = 采集起始时间戳
电压波形.dt = 0.001
(电流、温度同理)
通道结果[i] = 捆绑(通道名, 通道状态, 电压波形, 电流波形, 温度波形)
测试记录 = 捆绑(序列号, 测试时间, 操作员, 总体判定, 通道结果数组)
装配完成后,报告生成端只需对“通道结果数组”做一次 For 循环,循环体内用“按名称解除捆绑”取出各参数波形,再取 Y 数组的均值、最大值、峰峰值写入表格行。由于波形自带 t0 与 dt,报告中的“采样时间”列可直接由 t0 + (N-1)×dt 计算,无需额外传递时间变量。
五、结构化带来的三个直接收益
- 报告生成解耦:报告模板只依赖“测试记录”这一种类型,通道数从 4 变为 8 时,报告代码零修改,仅数组长度变化。
- 归档自描述:TDMS 写入时,簇的字段名自动成为通道组名与通道名,归档文件本身携带结构信息,后续用 DIAdem 或 Python 读取时无需外部说明文档。
- 类型安全:若误把温度波形接到电压字段,LabVIEW 在编辑阶段即报错,而不是等到报告里出现“温度 3.3 V”这类荒谬数据才被发现。
需要特别注意的是,波形数据类型的 Y 数组默认是双精度浮点。若测试数据量极大(如 32 通道 × 100 kHz × 60 s),应在归档前评估内存占用,必要时改用“波形 + 抽取”或分块写入 TDMS,而不是把全部原始点长期驻留在顶层簇中。结构化不等于无限堆叠,合理的粒度控制同样是数据组织的一部分。