4. 限值表达式与动态限值
在 TestStand 中,限值并不一定是一个写死的常数。TestStand 允许把 Limit 字段写成表达式,在测试运行时根据产品型号、批次、温度、工位号、校准系数等变量动态求值。这样同一份测试序列可以服务多个产品变体,而不必为每个型号复制一套 Sequence 文件。理解动态限值的关键,是分清“限值从哪里来”“表达式在什么时机求值”“求值失败时如何处理”这三件事。
一、限值表达式的求值机制
TestStand 的 Limit 字段支持两种形态:常量与表达式。当 Limit 以等号开头(例如 =5.0)或包含变量引用时,TestStand 会在步骤执行前对该字段求值,把结果作为本次测量的上下限。求值发生在步骤的 Preconditions 之后、实际测量调用之前,因此表达式可以引用此时已经存在的变量,例如 FileGlobal、StationGlobal、Sequence 的 Locals、RunState 参数,以及前序步骤写入的值。
需要特别注意求值时机与作用域。若表达式引用的是 Locals,它只在当前 Sequence 内有效;若引用 StationGlobal,则在整个测试站范围内有效,适合放工位相关的补偿量;若引用 FileGlobal,则在同一 Sequence 文件内有效,适合放产品族参数。跨文件共享的配置通常放在 StationGlobal 或通过配置文件加载到 FileGlobal。
二、用变量承载产品与批次差异
动态限值最常见的用法,是把“随产品变化”的部分抽成变量。例如某电源模块有两个型号:A 型额定输出 5.0 V,B 型额定输出 5.5 V,两者都允许 ±3% 偏差。可以定义一个 FileGlobal 变量 NominalV,在测试开始前根据工单或扫码结果赋值,然后限值写成 =FileGlobal.NominalV * 0.97 与 =FileGlobal.NominalV * 1.03。这样切换型号只需改变量,不必改步骤。
批次差异则更适合放在 StationGlobal 或由配置文件加载。例如同一型号不同批次的材料批次会导致零点漂移,可在批次切换时把补偿量写入 StationGlobal.BatchOffset,限值写成 =BaseLow + StationGlobal.BatchOffset。这里 BaseLow 是基础下限,BatchOffset 是批次补偿,两者相加得到本次实际下限。
三、自定义条件与 IIf 分支
当限值需要按条件分叉时,TestStand 表达式支持 IIf(条件, 真值, 假值)。例如温度补偿场景:常温下允许 ±2%,高温下放宽到 ±3%。可以写成 =IIf(StationGlobal.Temp > 40, Nominal*0.97, Nominal*0.98)。注意 IIf 的两个分支都会参与类型检查,因此两个分支的返回类型应一致,避免一个返回数值、另一个返回字符串。
更复杂的条件可以用 And、Or、Not 组合。例如只有“产品为 A 型且工位为 3 号”时才使用更严的限值:=IIf(And(RunState.Model=="A", StationGlobal.StationID==3), 4.9, 4.8)。这类表达式可读性会下降,建议把条件判断提前写入一个 Locals 布尔变量,再在限值中引用该变量,便于调试。
四、实操示例:温度补偿动态限值
下面给出一个可直接参考的配置过程。假设某传感器输出电压额定 2.500 V,常温(≤30 ℃)允许 ±1.5%,高温(>30 ℃)允许 ±2.5%,同时工位 2 存在 +0.010 V 的系统偏置需要补偿。
// 1. 在 StationGlobals 中定义
StationGlobals.Temp = 25.0 // 当前环境温度,单位 ℃
StationGlobals.StationID = 2 // 工位号
StationGlobals.StationBias = 0.010 // 工位 2 的固定偏置,单位 V
// 2. 在 Sequence 的 Setup 中计算本次限值
Locals.Nominal = 2.500
Locals.TolPct = (StationGlobals.Temp > 30) ? 0.025 : 0.015
Locals.LowLim = Locals.Nominal * (1 - Locals.TolPct) + StationGlobals.StationBias
Locals.HighLim = Locals.Nominal * (1 + Locals.TolPct) + StationGlobals.StationBias
// 3. 在 Numeric Limit Test 步骤中引用
Low Limit = =Locals.LowLim
High Limit = =Locals.HighLim
按上述示例参数计算:常温下 TolPct=0.015,LowLim=2.500×0.985+0.010=2.4725 V,HighLim=2.500×1.015+0.010=2.5475 V;高温下 TolPct=0.025,LowLim=2.500×0.975+0.010=2.4475 V,HighLim=2.500×1.025+0.010=2.5725 V。若某次测量读数为 2.560 V,常温下判 Fail(超出 2.5475),高温下判 Pass(未超 2.5725)。这说明动态限值必须与温度采集同步,否则会出现误判。
五、常见问题与排查
- 限值不生效:检查 Limit 字段是否以等号开头。若写成
Locals.LowLim而没有等号,TestStand 会把它当作字符串常量,导致类型错误或恒定限值。 - 变量未定义:表达式引用的变量必须在求值前已存在。跨 Sequence 引用时,确认变量作用域是否覆盖当前步骤。
- 单位不一致:补偿量、额定值、限值的单位必须统一。例如偏置用 mV、额定用 V,直接相加会得到错误结果。
- 求值顺序:若限值依赖前序步骤的测量结果,必须确保前序步骤先执行,且结果已写入被引用的变量。
- 报告可追溯:动态限值下,报告应同时记录测量值、实际上下限和关键变量值,否则事后无法复现判定依据。
总结来说,动态限值的核心是把“限值”从常量变成“由变量和条件驱动的计算结果”。掌握变量作用域、求值时机和 IIf 分支这三件事,就能用同一套测试序列覆盖多产品、多批次和多环境场景,同时保持判定逻辑清晰可追溯。