Как задать значение входных параметров при вызове функции [VI.Call ()]? - PullRequest
0 голосов
/ 17 мая 2019
  1. Я пытаюсь управлять передней панелью LabVIEW в python, используя ActiveX коммуникации.
  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 по умолчанию).

Простое дополнение Pgm

1 Ответ

0 голосов
/ 02 июня 2019

Вызов () уже выполняет ВП, поэтому установка его элементов управления после слишком поздняя. Сначала установите их, затем запустите call ().

Я также почти уверен, что метод 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 или нет.

Кроме ... , когда ВП повторно входит (Свойства -> Выполнение). В этом случае ВП всегда читает 0 из своих элементов управления и записывает 0 в свой индикатор. Даже если он пишет что-то еще, Python считывает значение по умолчанию этого индикатора (0, если не изменено)

Это несколько ожидаемо ! Когда должен быть выполнен входящий ВП, в памяти создается его новый экземпляр (копия), который затем выполняется. Если ваш ВП является повторно входящим, Python открывает его, правильно устанавливает значения, но когда он выполняется, создается и выполняется новый экземпляр со значениями по умолчанию. Когда он завершается, python читает результат из исходного экземпляра, который никогда не запускался.

К сожалению, я не знаю, как решить эту проблему здесь.

...