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