设置输入值后,我尝试使用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中自动分配为默认值)。
答案 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中添加了一些日志记录,但让它将其写入文件中
对我来说,这始终有效,无论LV是否打开。
VI重入时(属性->执行),例外... 。在这种情况下,VI始终从其控件读取0,并将0写入其指示器。即使写了其他东西,Python也会读回该指标的默认值(如果未更改,则为0)
此有点期望!当应执行可重入VI时,将在内存中创建该VI的新实例(副本),然后执行该实例。如果您的VI是可重入的,则python将其打开,并正确设置值,但是在执行时会创建并执行一个具有默认值的新实例。终止时,python从从未运行过的原始实例读取结果。
不幸的是,我不知道如何在这里解决这个问题。