在调用函数[VI.Call()]的同时如何给输入参数值?

时间:2019-05-17 06:45:47

标签: python labview

  1. 我正在尝试通过ActiveX使用python控制LabVIEW前面板 通讯。
  2. 我无法在LabVIEW中自动分配输入参数值。
  3. 如果我按照以下程序代码运行,则这两个代码均分配为“零” 输入(输入1,输入2)。
  4. 每当我尝试运行该程序时,控件均将其作为默认值。
  5. 在VI.Call()函数(调用和值分配应同时发生)的同时,是否有任何分配输入值的方法?
  6. 给出这个问题的结论。

设置输入值后,我尝试使用VI.Call()函数,并且LabVIEW VI将输入值设置为“零”(0)。

import win32com.client                                      # ActivX Client
LabVIEW = win32com.client.Dispatch("LabVIEW.Application")   # Connect LabVIEW
VI = LabVIEW.getVIReference(r'D:\New folder\LabVIEW.py')    # Get VI Reference
VI._FlagAsMethod('Call')                                    # Call the VI
VI.Call()
VI.setcontrolvalue('Input 1', '56')                         # Set Input Value
VI.setcontrolvalue('Input 2', '10')                         # Set Input Value
result = VI.getcontrolvalue('out')                          # Get Output Value
print(result)                                               # Print result on console

我期望输入值为56和53,但实际输入为0和0(在LabVIEW中自动分配为默认值)。

Simple Addition Pgm

1 个答案:

答案 0 :(得分:0)

call()已执行VI,因此在之后设置其控件为时已晚。首先设置它们,然后运行call()。

我也很确定调用方法会等待VI终止,因此设置控件的意义就更小了。

即使不等待,VI也可能已经开始处理控制值,然后再进行设置。在这种情况下,您可能还需要在vi将结果写入结果指示符之前读出结果指示符,即您必须以某种方式等待vi完成后才能读取结果。

更新:

我尝试了一下,并添加了一些调试功能。此python代码显示开始和停止时间,并将控件设置为随机值:

import win32com.client                                      # ActivX Client
from datetime import datetime
import random

a=random.randint(0,100)
b=random.randint(0,100)
c=a+b

LabVIEW = win32com.client.Dispatch("LabVIEW.Application")   # Connect LabVIEW
VI = LabVIEW.getVIReference(r'D:\lvTest.vi')                # Get VI Reference
print "Call: ",datetime.now().strftime("%H:%M:%S.%f")
VI._FlagAsMethod('Call')                                    # Call the VI

VI.setcontrolvalue('Input 1', a)                            # Set Input Value
VI.setcontrolvalue('Input 2', b)                            # Set Input Value

VI.Call()

result = VI.getcontrolvalue('out')                          # Get Output Value

print "Done: ",datetime.now().strftime("%H:%M:%S.%f")
print " %d + %d = %d.  LV result: %f   Equal: %s"%(a,b,c,result, result==c)

我还在VI中添加了一些日志记录,但让它将其写入文件中

enter image description here

对我来说,这始终有效,无论LV是否打开。

VI重入时(属性->执行),

例外... 。在这种情况下,VI始终从其控件读取0,并将0写入其指示器。即使写了其他东西,Python也会读回该指标的默认值(如果未更改,则为0)

有点期望!当应执行可重入VI时,将在内存中创建该VI的新实例(副本),然后执行该实例。如果您的VI是可重入的,则python将其打开,并正确设置值,但是在执行时会创建并执行一个具有默认值的新实例。终止时,python从从未运行过的原始实例读取结果。

不幸的是,我不知道如何在这里解决这个问题。