在LabVIEW中,是否可以从VI中判断输出端是否连接到调用VI中?显然,这将取决于调用 VI,但也许有一些方法可以找到当前调用 VI 的答案。
在 C 语言中,这就像定义一个函数,该函数接受参数,这些参数是指向存储输出参数的位置的指针,但NULL
如果调用者对该参数不感兴趣,则会接受。
在LabVIEW中,是否可以从VI中判断输出端是否连接到调用VI中?显然,这将取决于调用 VI,但也许有一些方法可以找到当前调用 VI 的答案。
在 C 语言中,这就像定义一个函数,该函数接受参数,这些参数是指向存储输出参数的位置的指针,但NULL
如果调用者对该参数不感兴趣,则会接受。
据说您不能以自然的方式执行此操作,但有一种使用数据值引用的解决方法(需要 LV 2009)。将 NULL 指针提供给输出参数的想法相同。结果作为数据值引用(即指针)在输入中给出,并由子VI检查“不是引用”。如果它为空,则什么也不做。
这是子VI(情况为真当然什么都不做):
这是调用VI:
图像是 VI 片段,因此您可以拖放到图表上以获取代码。
我建议你以错误的方式解决这个问题。如果编译器不够聪明,无法自行避免计算,请制作此 VI 的两个版本。一种进行昂贵的计算,一种不进行。然后制作一个多态VI,允许您在它们之间切换。您在设计时已经知道您想要哪个版本(因为您要么连接输出终端),所以只需使用正确版本的多态 VI。
或者,传入一个变量,为计算的昂贵部分打开或关闭 Case 语句。
一般来说,没有。
可以使用“脚本”功能对代码进行静态分析。这将需要拉调用层次结构,并跟踪线路引用。
综上所述,试一试,还是有一些困难的。同一张图上的多个相同的 sub-vi 很难区分。此外,终端引用似乎主要通过名称访问,这可能导致与其他 vi 的同名终端发生一些冲突。
NI 在这个问题的变体上做了一些工作;看看这个。
正如 Underflow 所说,基本答案是否定的。
您可以在这里查看可能是 NI 提供的最官方和最详细的答案。
扩展您的类比,您可以在 LV 中执行此操作,但 LV 没有 C 所具有的 null 概念。你可以在这里看到一个例子。
请注意,提供的链接 Underflow 中的代码在可执行文件中不起作用,因为在构建 EXE 时默认情况下会剥离图表,并且 RTE 不支持其中使用的某些属性和方法。
对不起,我明白我误解了这个问题。我以为您在询问输入,所以我建议的想法不适用。不过,我指出的限制确实适用。
你为什么要这样做?可能还有另一种解决方案。
通常,LV 编译器会优化机器代码,使得未使用的代码甚至不会内置到可执行文件中。
这不适用于子 VI(因为无法知道您不会尝试以某种方式使用指标的值,尽管如果 LV 在构建可执行文件时删除 FP 可以做到这一点,并且可能会这样做),但是有是将其应用于子VI的一种方法-内联子VI,这应该允许编译器查看未使用的输出。您还可以将其优先级设置为子例程,这也可能会这样做,但我不建议这样做。
正式地,内联仅在 LV 2010 中可用,但在旧版本中有访问私有 VI 属性的方法。不过,我不会推荐它,而且 2010 很可能在这方面有一些旧版本没有的优化。
PS 一般来说,编译过程的细节不会公开,并且随着 NI 调整编译器而在 LV 版本之间有所不同。整个过程应该在 LV 2010 中进行了重大升级,并且应该在 NI 的网站上进行网络广播,其中包含一些细节。